|
|
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: asm(".set DC_OFF,2");
13: asm(".set DC_ON,1");
14: asm(".set MME,9");
15: asm(".set DCR,27");
16: asm(".set PDCS,28");
17: asm(".set CTL_SW,0x41b"); /* Addr of switches to turn on Cache, MME, Fault */
18: long tmp_lw;
19:
20:
21: #define CPBUFLEN 200 /* Output buffer length */
22: struct cphdr
23: {
24: char cp_unit; /* Done bit & unit # */
25: char cp_comm; /* Command */
26: short cp_count; /* Counter (when relevant) */
27: };
28:
29: struct cpdcb_o /* Output structure */
30: {
31: struct cphdr cp_hdr;
32: char cp_buf[CPBUFLEN]; /* Buffer for output or 'stty' */
33: };
34:
35: struct cpdcb_i /* Structure for input */
36: {
37: struct cphdr cp_hdr;
38: char cpi_buf[4]; /* Buffer for input */
39: };
40:
41: #define CPDONE 0x80 /* 'Done' bit in cp_unit */
42: #define CPTAKE 0x40 /* CP 'ack' to this cpdcb */
43:
44: /* Values for 'unit' */
45: #define CPUNIT 0 /* The CP itself */
46: #define CPCONS 1 /* Console line */
47: #define CPREMOT 2 /* Remote line */
48:
49: /* Values for 'command' */
50: #define CPRESET 0
51: #define CPWRITE 1
52: #define CPREAD 2
53: #define CPSTTY 3
54: #define CPBOOT 4
55:
56:
57: /* Put a char to CPU2 console */
58:
59: #define NCHAR 1
60:
61: long cpbuf_sz = 1; /* Buffer size */
62: long charcnt = 0;
63:
64: asm(".set HISR,0x410");
65:
66: putstr(str)
67: char *str;
68: { long c_cnt;
69: struct cpdcb_o cpout; /* DCB for output */
70:
71: cpout.cp_hdr.cp_unit = CPCONS; /* Reset done bit */
72: cpout.cp_hdr.cp_comm = CPWRITE; /* Set command */
73: for(c_cnt=0;;c_cnt++) {
74: cpout.cp_buf[c_cnt] = *str++;
75: if (cpout.cp_buf[c_cnt]=='\n') {
76: c_cnt++;
77: cpout.cp_buf[c_cnt]='\r';
78: }
79: if (cpout.cp_buf[c_cnt]=='\0') break;
80: }
81: if (c_cnt) {
82: cpout.cp_hdr.cp_count = c_cnt;
83: cp_poll(&cpout,'\0');
84: /* cp_poll('\0'); */ }
85: }
86:
87: putchar(c)
88: {
89: struct cpdcb_o cpout; /* DCB for output */
90:
91: cpout.cp_hdr.cp_unit = CPCONS; /* Reset done bit */
92: cpout.cp_hdr.cp_comm = CPWRITE; /* Set command */
93: cpout.cp_buf[charcnt] = c;
94: cpout.cp_hdr.cp_count = 1;
95: cp_poll(&cpout,c);
96: /* cp_poll(c); */
97: }
98:
99: cp_poll(cpout,c)
100: struct cpdcb_o *cpout;
101: char c;
102: { register long time, r11, r10;
103:
104: time = 0x1ff0000;
105: r10 = (long)cpout;
106: r10 &= 0xffffff;
107: asm("mtpr r10,$CPMDCB");
108: tmp_lw = (long)(&cpout->cp_hdr.cp_unit);
109:
110: r11 = (long)(&cpout->cp_hdr.cp_unit);
111: while (time-- && !(cpout->cp_hdr.cp_unit & CPDONE)) {
112: asm("mtpr r11,$0x1c"); /* mtpr r11,$PDCS */
113: }
114: if (!(cpout->cp_hdr.cp_unit & CPDONE)) cp_hlt(); /* Time out */
115: if (c== '\n') putchar('\r');
116: }
117:
118: cp_hlt()
119: {
120: asm("movl $0xeeeeeeee,r0");
121: asm("movl $0xeeeeeeee,r1");
122: asm("movl $0xeeeeeeee,r2");
123: asm("halt");
124: }
125:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.