1: /* $Header: packet.c,v 10.3 86/02/01 15:47:08 tony Rel $ */
2: /* packet.c Routines to allocate, free, and use packets
3: *
4: * OpenDisplay Open it
5: * InitDisplay Download it
6: * DisplayDead Check if dead
7: * PacketInit Set things up
8: * WritePacket Buffers a packet for writing
9: * SynchWrites Wait for completion of all pending writes
10: * AllocateSpace Allocate some temporary storage
11: * AllocateCopy Copy data to temporary storage
12: * DeallocateSpace Flush space of unsent packet
13: *
14: */
15:
16: /****************************************************************************
17: * *
18: * Copyright (c) 1983, 1984 by *
19: * DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts. *
20: * All rights reserved. *
21: * *
22: * This software is furnished on an as-is basis and may be used and copied *
23: * only with inclusion of the above copyright notice. This software or any *
24: * other copies thereof may be provided or otherwise made available to *
25: * others only for non-commercial purposes. No title to or ownership of *
26: * the software is hereby transferred. *
27: * *
28: * The information in this software is subject to change without notice *
29: * and should not be construed as a commitment by DIGITAL EQUIPMENT *
30: * CORPORATION. *
31: * *
32: * DIGITAL assumes no responsibility for the use or reliability of its *
33: * software on equipment which is not supplied by DIGITAL. *
34: * *
35: * *
36: ****************************************************************************/
37:
38: #include "vs100.h"
39: #include <fcntl.h>
40: #include <errno.h>
41: #include <sys/ioctl.h>
42: #include "vsioctl.h"
43: #include <vaxuba/vsreg.h>
44: #include "reason.h"
45:
46: extern int errno;
47: extern BitMap screen;
48:
49: char *ErrorString(), *strcpy(), *strcat();
50:
51: int vsdev;
52:
53: int VSReloc;
54:
55: vsIoAddr *VSAddr;
56: caddr_t VSBuf;
57: int VSBuflen;
58: caddr_t VSBufLim;
59: short *IOReg;
60: short *VSResponse;
61:
62: int active;
63: int upper;
64: caddr_t limptr, curptr;
65:
66: /* Open the display */
67:
68: OpenDisplay (vsNumber)
69: char *vsNumber;
70: {
71: char vsname[10];
72: strcpy (vsname, "/dev/vs");
73: strcat (vsname, vsNumber);
74:
75: return (vsdev = open (vsname, O_RDWR|O_NDELAY));
76: }
77:
78: /* Do vs100 specific initialization */
79:
80: InitDisplay (info)
81: register DEVICE *info;
82: {
83: if (DownLoad ())
84: return (-1);
85: info->id = XDEV_VS100;
86: info->width = screen.bm_width;
87: info->height = screen.bm_height;
88: info->planes = 1;
89: info->entries = 0;
90: info->mouse = &VSAddr->mouse;
91: info->mbox = &VSAddr->mbox;
92: info->queue = (vsEventQueue *) &VSAddr->ibuff;
93: return (0);
94: }
95:
96: /* Check if display is dead */
97:
98: DisplayDead ()
99: {
100: int ver;
101:
102: return(ioctl(vsdev, (int) VSIOGETVER, (caddr_t) &ver));
103: }
104:
105: PacketInit()
106: {
107: if (ioctl (vsdev, (int) VSIOGETIOA, (caddr_t) &VSAddr) ||
108: ioctl (vsdev, (int) VSIOINIT, (caddr_t) NULL))
109: return (-1);
110: VSBuf = VSAddr->obuff;
111: VSBuflen = VSAddr->obufflen;
112: VSBufLim = VSBuf + VSBuflen;
113: IOReg = (short *) VSAddr->ioreg;
114: VSReloc = VSAddr->reloc - (int) VSBuf;
115: VSResponse = (short *) &VSAddr->status;
116: *VSResponse = 0;
117: IOReg[0] &= ~VS_FCN;
118: active = 0;
119: curptr = VSBufLim;
120: limptr = VSBuf;
121: upper = 1;
122: return (0);
123: }
124:
125: WritePacket (pkt)
126: caddr_t pkt;
127: {
128: register int ret;
129: register short *ioreg;
130:
131: pkt += VSReloc;
132: limptr = curptr;
133: if (upper) {
134: curptr = VSBuf;
135: upper = 0;
136: } else {
137: curptr = VSBufLim;
138: upper = 1;
139: }
140: if (ret = active) {
141: if (!(*VSResponse)) {
142: if (ret = ioctl(vsdev, (int) VSIOWAITGO, (caddr_t) &pkt))
143: VSError ();
144: return (ret);
145: }
146: if ((ret = *VSResponse) & VS_ERROR) {
147: errno = ret & VS_REASON + INT_ERR;
148: VSError ();
149: ret = -1;
150: } else
151: ret = 0;
152: }
153: ioreg = IOReg; /* C sucks */
154: ioreg[3] = ((short *)&pkt)[0];
155: ioreg[4] = ((short *)&pkt)[1];
156: ioreg[0] &= ~VS_FCN;
157: *VSResponse = 0;
158: ioreg[0] |= VS_IE | (VS_SEND << VS_FCSHIFT) | VS_GO;
159: active = 1;
160: return (ret);
161: }
162:
163: SynchWrites ()
164: {
165: register int ret;
166:
167: if (!active) return (0);
168: if (!(*VSResponse) && ioctl(vsdev, (int) VSIOUSERWAIT, (caddr_t) NULL))
169: VSError ();
170: if ((ret = *VSResponse) & VS_ERROR) {
171: errno = ret & VS_REASON + INT_ERR;
172: VSError ();
173: ret = -1;
174: } else
175: ret = 0;
176: *VSResponse = 0;
177: active = 0;
178: if (upper)
179: limptr = VSBuf;
180: else
181: limptr = VSBufLim;
182: return (ret);
183: }
184:
185: caddr_t AllocateSpace (size)
186: register int size;
187: {
188: register caddr_t ptr;
189:
190: if (size & 1) size++;
191:
192: if (upper) {
193: if ((curptr -= size) >= limptr)
194: return (curptr);
195: SynchWrites ();
196: if (curptr >= limptr)
197: return (curptr);
198: curptr = VSBufLim;
199: } else {
200: ptr = curptr;
201: if ((curptr += size) <= limptr)
202: return (ptr);
203: SynchWrites ();
204: if (curptr <= limptr)
205: return (ptr);
206: curptr = VSBuf;
207: }
208: errno = ENOMEM;
209: VSError ();
210: return (NULL);
211: }
212:
213: caddr_t AllocateCopy (buf, size)
214: caddr_t buf;
215: register int size;
216: {
217: register caddr_t ptr;
218:
219: if (size & 1) size++;
220:
221: if (upper) {
222: if ((curptr -= size) < limptr) {
223: SynchWrites ();
224: if (curptr < limptr) {
225: curptr = VSBufLim;
226: errno = ENOMEM;
227: return (NULL);
228: }
229: }
230: ptr = curptr;
231: } else {
232: ptr = curptr;
233: if ((curptr += size) > limptr) {
234: SynchWrites ();
235: if (curptr > limptr) {
236: curptr = VSBuf;
237: errno = ENOMEM;
238: VSError ();
239: return (NULL);
240: }
241: }
242: }
243: bcopy (buf, ptr, size);
244: return (ptr);
245: }
246:
247: DeallocateSpace ()
248: {
249: if (upper)
250: curptr = VSBufLim;
251: else
252: curptr = VSBuf;
253: }
254:
255: VSError ()
256: {
257: DeviceError (ErrorString (errno));
258: }
Defined functions
AllocateSpace
defined in line
185; used 43 times
- in /usr/src/new/X/libvs100/bitpix.c line
44,
226,
282
- in /usr/src/new/X/libvs100/copy.c line
36,
49
- in /usr/src/new/X/libvs100/cursor.c line
42,
96,
149,
162,
181,
204
- in /usr/src/new/X/libvs100/dl.c line
57,
128,
139
- in /usr/src/new/X/libvs100/draw.c line
36,
60
- in /usr/src/new/X/libvs100/fill.c line
36,
56
- in /usr/src/new/X/libvs100/font.c line
37,
101
- in /usr/src/new/X/libvs100/move.c line
41,
70,
91,
110,
139
- in /usr/src/new/X/libvs100/put.c line
39,
60,
180
- in /usr/src/new/X/libvs100/report.c line
32,
56
- in /usr/src/new/X/libvs100/text.c line
41,
65,
137,
198
- in /usr/src/new/X/libvs100/tile.c line
37,
60-62(2),
164-166(2)
- in /usr/src/new/X/libvs100/util.c line
44,
182,
196,
232
WritePacket
defined in line
125; used 20 times
- in /usr/src/new/X/libvs100/bitpix.c line
251,
307
- in /usr/src/new/X/libvs100/copy.c line
85
- in /usr/src/new/X/libvs100/cursor.c line
136,
159,
172,
193,
215
- in /usr/src/new/X/libvs100/draw.c line
108
- in /usr/src/new/X/libvs100/fill.c line
93
- in /usr/src/new/X/libvs100/move.c line
128,
157
- in /usr/src/new/X/libvs100/put.c line
105,
220
- in /usr/src/new/X/libvs100/report.c line
67
- in /usr/src/new/X/libvs100/text.c line
106,
176,
229
- in /usr/src/new/X/libvs100/tile.c line
122,
219
Defined variables
IOReg
defined in line
59; used 3 times
VSReloc
defined in line
53; used 24 times
- in line 114,
131
- in /usr/src/new/X/libvs100/bitpix.c line
301
- in /usr/src/new/X/libvs100/copy.c line
81
- in /usr/src/new/X/libvs100/draw.c line
101-105(2)
- in /usr/src/new/X/libvs100/fill.c line
89
- in /usr/src/new/X/libvs100/move.c line
51,
58,
73,
92,
153
- in /usr/src/new/X/libvs100/put.c line
101,
189,
216
- in /usr/src/new/X/libvs100/text.c line
94-98(2),
164-168(2),
221
- in /usr/src/new/X/libvs100/tile.c line
80,
118,
189,
216
upper
defined in line
63; used 8 times
vsdev
defined in line
51; used 9 times