|
|
1.1 root 1: /* Console Processor Interface */
2: /* Tahoe version, Nov. 1982 */
3:
4: /****************************************/
5: /* */
6: /* Reduced DCB layout for byte */
7: /* communication. */
8: /* */
9: /****************************************/
10:
11: asm(".set CPMDCB,21");
12:
13: #define CPBUFLEN 200 /* Output buffer length */
14: struct cphdr
15: {
16: char cp_unit; /* Done bit & unit # */
17: char cp_comm; /* Command */
18: short cp_count; /* Counter (when relevant) */
19: };
20:
21: struct cpdcb_o /* Output structure */
22: {
23: struct cphdr cp_hdr;
24: char cp_buf[CPBUFLEN]; /* Buffer for output or 'stty' */
25: };
26:
27: struct cpdcb_i /* Structure for input */
28: {
29: struct cphdr cp_hdr;
30: char cpi_buf[4]; /* Buffer for input */
31: };
32:
33: #define CPDONE 0x80 /* 'Done' bit in cp_unit */
34: #define CPTAKE 0x40 /* CP 'ack' to this cpdcb */
35:
36: /* Values for 'unit' */
37: #define CPUNIT 0 /* The CP itself */
38: #define CPCONS 1 /* Console line */
39: #define CPREMOT 2 /* Remote line */
40:
41: /* Values for 'command' */
42: #define CPRESET 0
43: #define CPWRITE 1
44: #define CPREAD 2
45: #define CPSTTY 3
46: #define CPBOOT 4
47: #define NCHAR 1
48:
49: struct cpdcb_o cpout; /* DCB for output */
50: struct cpdcb_i cpin; /* DCB for input */
51:
52: putstr(str)
53: char *str;
54: { long c_cnt;
55:
56: cpout.cp_hdr.cp_unit = CPCONS; /* Reset done bit */
57: cpout.cp_hdr.cp_comm = CPWRITE; /* Set command */
58: for(c_cnt=0;;c_cnt++) {
59: cpout.cp_buf[c_cnt] = *str++;
60: if (cpout.cp_buf[c_cnt]=='\n') {
61: c_cnt++;
62: cpout.cp_buf[c_cnt]='\r';
63: }
64: if (cpout.cp_buf[c_cnt]=='\0') break;
65: }
66: if (c_cnt) {
67: cpout.cp_hdr.cp_count = c_cnt;
68: cp_poll('\0'); }
69: }
70:
71: /* Put a char to CPU2 console */
72: putchar(c)
73: {
74: cpout.cp_hdr.cp_unit = CPCONS; /* Reset done bit */
75: cpout.cp_hdr.cp_comm = CPWRITE; /* Set command */
76: cpout.cp_buf[0] = c;
77: cpout.cp_hdr.cp_count = 1;
78: cp_poll(c);
79: }
80:
81:
82: char rdchar()
83: {
84: register long r12;
85: cpin.cp_hdr.cp_unit = CPCONS; /* Reset done bit */
86: cpin.cp_hdr.cp_comm = CPREAD; /* Set command */
87: cpin.cp_hdr.cp_count = 1;
88: cp_pollr();
89: r12 = (long)(&cpin.cpi_buf[0]);
90: asm("mtpr r12,$0x1c"); /* mtpr r11,$PDCS */
91: return(cpin.cpi_buf[0] & 0x7f);
92: }
93:
94:
95: /* Poll CP on read
96: */
97: cp_pollr()
98: { register long r12, r11, time;
99:
100: time = 0xff0000;
101: r12 = ((long)&cpin) & 0xffffff;
102: asm("mtpr r12,$CPMDCB");
103:
104: r11 = (long)(&cpin.cp_hdr.cp_unit);
105: while (time-- && !(cpin.cp_hdr.cp_unit & CPDONE)) {
106: asm("mtpr r11,$0x1c"); /* mtpr r11,$PDCS */
107: }
108: if (!(cpin.cp_hdr.cp_unit & CPDONE)) cp_hlt(); /* Time out */
109: }
110:
111:
112: /* Poll CP on write
113: */
114: cp_poll(c)
115: char c;
116: { register long r12, r11, time;
117:
118: time = 200000;
119: r12 = ((long)&cpout) & 0xffffff;
120: asm("mtpr r12,$CPMDCB");
121: asm("mtpr r12,$CPMDCB");
122:
123: r11 = (long)(&cpout.cp_hdr.cp_unit);
124: while (time-- && !(cpout.cp_hdr.cp_unit & CPDONE)) {
125: asm("mtpr r11,$0x1c"); /* mtpr r11,$PDCS */
126: }
127: if (!(cpout.cp_hdr.cp_unit & CPDONE)) cp_hlt(); /* Time out */
128: if (c== '\n') putchar('\r');
129: }
130:
131: cp_hlt()
132: {
133: asm("movl $0xeeeeeeee,r0");
134: asm("movl $0xeeeeeeee,r1");
135: asm("movl $0xeeeeeeee,r2");
136: asm("halt");
137: }
138:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.