/* * Dual systems sio4 * * s4open() * getchar() * putchar() */ #define until(a) while(!(a)) #define IOADDR 0xff0000 #define SIOBASE (IOADDR + 0x20) /* * rcon bits */ #define RENABLE (1 << 1) /* receiver enable */ #define RDISABLE 0 /* * fifo status bits. */ #define FREADY (1 << 6) /* * sstatus bits. */ #define INREADY (1 << 1) #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 = {0}; #define REG1 0x27 #define REG2 0x6e #define REG3 0x7d /* * initialize channel 0 */ s4open () { s4 = (struct sio *) SIOBASE; s4->select = 0; s4->scommand = REG1; s4->smode = REG2; s4->smode = REG3; s4->rcon = RDISABLE; } /* * read a character in * low byte * * Status in high byte. */ getchar () { until(s4->sstatus & INREADY) ; return s4->sdata; } /* * Write character c to port p */ putchar (c) { s4->select = 0; until(s4->sstatus & OUTREADY) ; s4->sdata = c; }