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)15 void dzinit(void)
16 {
17     dz->csr = 0x20 | (3<<8);
18     dz->tcr = 1<<3;
19 }
20 
dzputc(int ch)21 void 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)37 void dzputs(const char *s)
38 {
39     while (*s != '\0') {
40 	dzputc(*s++);
41     }
42     dzputc('\n');
43 }
44 
entry(void)45 void entry(void)
46 {
47     dzinit();
48     dzputs("Hello, DEC serial device");
49 }
50 
51