Annotation of 43BSD/contrib/X/libvs100/packet.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.