#define until(a) while(!(a)) #define IOADDR 0xff0000 #define SIOBASE (IOADDR + 0x20) /* * rcon bits */ #define RENABLE (1 << 1) /* receiver enable */ /* * fifo status bits. */ #define FREADY (1 << 6) /* * sstatus bits. */ #define OUTREADY (1 << 0) struct sio { char addr0, /* low byte dma address */ addr1, /* high byte dma address */ addr2, /* extended byte of dma address */ rcon, /* receiver control port */ count0, /* low byte of dma count */ count1, /* high byte of dma count */ enable, /* start / stop enable */ dmacon, /* dma control and status */ sdata, /* uart data port */ sstatus, /* uart status port */ smode, /* uart mode register */ scommand, /* uart command register */ fstatus, /* fifo status */ fdata, /* fifo data */ dmaglob, /* global dma status */ select; /* tty select port */ }; static struct sio *s4; #define REG1 0x27 #define REG2 0x6e #define REG3 0x7d /* 9600 */ #define REG3_1200 0x78 /* 1200 */ #define REG3_300 0x76 /* 300 */ /* * initialize the device */ sopen (a, b) { s4 = (struct sio *) SIOBASE; s4->select = a; s4->scommand = REG1; s4->smode = REG2; if (b == 1200) s4->smode = REG3_1200; else if (b == 300) s4->smode = REG3_300; else s4->smode = REG3; s4->rcon = RENABLE; } /* * turn off the device */ sclose (a) { s4->select = a; s4->rcon = 0; /* disable receiver */ } /* * read a character in * low byte * * Status in high byte. */ sread () { int a; until(s4->fstatus & FREADY) ; a = s4->fstatus << 8; return a | s4->fdata; } /* * Write character c to port p */ swrite (c, p) { s4->select = p; until(s4->sstatus & OUTREADY) ; s4->sdata = c; }