1 struct dz_regs { 2 unsigned short csr; /* csr(r/w) */ 3 unsigned short unused1, unused2, unused3; 4 unsigned short lpr; /* rbuf(r)/lpr(w) */ 5 unsigned short unused4, unused5, unused6; 6 unsigned short tcr; /* tcr(r/w) */ 7 unsigned short unused7, unused8, unused9; 8 unsigned short tdr; /* msr(r)/tdr(w) */ 9 }; 10 11 #define DECSERIAL_ADDR 0xbfe00000 12 13 volatile struct dz_regs *dz = (struct dz_regs *)DECSERIAL_ADDR; 14 dzinit(void)15void dzinit(void) 16 { 17 dz->csr = 0x20 | (3<<8); 18 dz->tcr = 1<<3; 19 } 20 dzputc(int ch)21void dzputc(int ch) 22 { 23 int timeout = 1 << 17; 24 unsigned short tcr; 25 26 while ((dz->csr & 0x8000) == 0) 27 if (--timeout < 0) 28 break; 29 30 dz->tdr = ch; 31 32 while ((dz->csr & 0x8000) == 0) 33 if (--timeout < 0) 34 break; 35 } 36 dzputs(const char * s)37void dzputs(const char *s) 38 { 39 while (*s != '\0') { 40 dzputc(*s++); 41 } 42 dzputc('\n'); 43 } 44 entry(void)45void entry(void) 46 { 47 dzinit(); 48 dzputs("Hello, DEC serial device"); 49 } 50 51