|
|
1.1 root 1: LL0:
2: .data
3: .set CPMDCB,21
4: .set DC_OFF,2
5: .set DC_ON,1
6: .set MME,9
7: .set DCR,27
8: .set PDCS,28
9: .set CTL_SW,0x41b
10: .comm _tmp_lw,4
11: .align 2
12: .globl _cpbuf_sz
13: _cpbuf_sz:
14: .long 1
15: .align 2
16: .globl _charcnt
17: _charcnt:
18: .long 0
19: .comm _cpout,204
20: .set HISR,0x410
21: .text
22: .align 1
23: .globl _putstr
24: _putstr:
25: .word L16
26: # /* Console Processor Interface */
27: # /* Tahoe version, Nov. 1982 */
28: #
29: # /****************************************/
30: # /* */
31: # /* Reduced DCB layout for byte */
32: # /* communication. */
33: # /* */
34: # /****************************************/
35: #
36: # asm(".set CPMDCB,21");
37: # asm(".set DC_OFF,2");
38: # asm(".set DC_ON,1");
39: # asm(".set MME,9");
40: # asm(".set DCR,27");
41: # asm(".set PDCS,28");
42: # asm(".set CTL_SW,0x41b"); /* Addr of switches to turn on Cache, MME, Fault */
43: # long tmp_lw;
44: #
45: #
46: # #define CPBUFLEN 200 /* Output buffer length */
47: # struct cphdr
48: # {
49: # char cp_unit; /* Done bit & unit # */
50: # char cp_comm; /* Command */
51: # short cp_count; /* Counter (when relevant) */
52: # };
53: #
54: # struct cpdcb_o /* Output structure */
55: # {
56: # struct cphdr cp_hdr;
57: # char cp_buf[CPBUFLEN]; /* Buffer for output or 'stty' */
58: # };
59: #
60: # struct cpdcb_i /* Structure for input */
61: # {
62: # struct cphdr cp_hdr;
63: # char cpi_buf[4]; /* Buffer for input */
64: # };
65: #
66: # #define CPDONE 0x80 /* 'Done' bit in cp_unit */
67: # #define CPTAKE 0x40 /* CP 'ack' to this cpdcb */
68: #
69: # /* Values for 'unit' */
70: # #define CPUNIT 0 /* The CP itself */
71: # #define CPCONS 1 /* Console line */
72: # #define CPREMOT 2 /* Remote line */
73: #
74: # /* Values for 'command' */
75: # #define CPRESET 0
76: # #define CPWRITE 1
77: # #define CPREAD 2
78: # #define CPSTTY 3
79: # #define CPBOOT 4
80: #
81: #
82: # /* Put a char to CPU2 console */
83: #
84: # #define NCHAR 1
85: #
86: # long cpbuf_sz = 1; /* Buffer size */
87: # long charcnt = 0;
88: # struct cpdcb_o cpout; /* DCB for output */
89: #
90: # asm(".set HISR,0x410");
91: #
92: # putstr(str)
93: # char *str;
94: # { long c_cnt;
95: jbr L18
96: L19:
97: #
98: # cpout.cp_hdr.cp_unit = CPCONS; /* Reset done bit */
99: cvtlb $1,_cpout
100: # cpout.cp_hdr.cp_comm = CPWRITE; /* Set command */
101: cvtlb $1,_cpout+1
102: # for(c_cnt=0;;c_cnt++) {
103: clrl -56(fp)
104: L22:
105: # cpout.cp_buf[c_cnt] = *str++;
106: movl $_cpout+4,r0
107: movl -56(fp),r1
108: movb *4(fp),(r0)[r1]
109: incl 4(fp)
110: # if (cpout.cp_buf[c_cnt]=='\n') {
111: movl $_cpout+4,r0
112: movl -56(fp),r1
113: cmpb (r0)[r1],$10
114: jneq L23
115: # c_cnt++;
116: incl -56(fp)
117: # cpout.cp_buf[c_cnt]='\r';
118: movl $_cpout+4,r0
119: movl -56(fp),r1
120: cvtlb $13,(r0)[r1]
121: # }
122: # if (cpout.cp_buf[c_cnt]=='\0') break;
123: L23:
124: movl $_cpout+4,r0
125: movl -56(fp),r1
126: tstb (r0)[r1]
127: jneq L24
128: jbr L21
129: # }
130: L24:
131: L20:
132: incl -56(fp)
133: jbr L22
134: L21:
135: # if (c_cnt) {
136: tstl -56(fp)
137: jeql L25
138: # cpout.cp_hdr.cp_count = c_cnt;
139: cvtlw -56(fp),_cpout+2
140: # cp_poll('\0'); }
141: pushl $0
142: callf $8,_cp_poll
143: # }
144: L25:
145: ret
146: .set L16,0x0
147: L18:
148: subl3 $56,fp,sp
149: jbr L19
150: .data
151: .text
152: .align 1
153: .globl _putchar
154: _putchar:
155: .word L28
156: #
157: # putchar(c)
158: # {
159: jbr L30
160: L31:
161: # cpout.cp_hdr.cp_unit = CPCONS; /* Reset done bit */
162: cvtlb $1,_cpout
163: # cpout.cp_hdr.cp_comm = CPWRITE; /* Set command */
164: cvtlb $1,_cpout+1
165: # cpout.cp_buf[charcnt] = c;
166: movl $_cpout+4,r0
167: movl _charcnt,r1
168: cvtlb 4(fp),(r0)[r1]
169: # cpout.cp_hdr.cp_count = 1;
170: cvtlw $1,_cpout+2
171: # cp_poll(c);
172: pushl 4(fp)
173: callf $8,_cp_poll
174: # }
175: ret
176: .set L28,0x0
177: L30:
178: jbr L31
179: .data
180: .text
181: .align 1
182: .globl _cp_poll
183: _cp_poll:
184: .word L32
185: #
186: # cp_poll(c)
187: # char c;
188: # { register long time, r11;
189: jbr L34
190: L35:
191: #
192: # time = 900000;
193: movl $900000,r12
194: # asm("movab _cpout,r10");
195: movab _cpout,r10
196: # asm("andl2 $0xffffff,r10");
197: andl2 $0xffffff,r10
198: # asm("mtpr r10,$CPMDCB");
199: mtpr r10,$CPMDCB
200: # tmp_lw = (long)(&cpout.cp_hdr.cp_unit);
201: movl $_cpout,_tmp_lw
202: #
203: # r11 = (long)(&cpout.cp_hdr.cp_unit);
204: movl $_cpout,r11
205: # while (time-- && !(cpout.cp_hdr.cp_unit & CPDONE)) {
206: L36:
207: movl r12,r0
208: decl r12
209: tstl r0
210: jeql L37
211: cvtbl _cpout,r0
212: bitl $128,r0
213: jneq L37
214: # asm("mtpr r11,$0x1c"); /* mtpr r11,$PDCS */
215: mtpr r11,$0x1c
216: # }
217: jbr L36
218: L37:
219: # if (!(cpout.cp_hdr.cp_unit & CPDONE)) cp_hlt(); /* Time out */
220: cvtbl _cpout,r0
221: bitl $128,r0
222: jneq L38
223: callf $4,_cp_hlt
224: # if (c== '\n') putchar('\r');
225: L38:
226: cmpb 7(fp),$10
227: jneq L40
228: pushl $13
229: callf $8,_putchar
230: # }
231: L40:
232: ret
233: .set L32,0x1800
234: L34:
235: jbr L35
236: .data
237: .text
238: .align 1
239: .globl _cp_hlt
240: _cp_hlt:
241: .word L41
242: #
243: # cp_hlt()
244: # {
245: jbr L43
246: L44:
247: # asm("movl $0xeeeeeeee,r0");
248: movl $0xeeeeeeee,r0
249: # asm("movl $0xeeeeeeee,r1");
250: movl $0xeeeeeeee,r1
251: # asm("movl $0xeeeeeeee,r2");
252: movl $0xeeeeeeee,r2
253: # asm("halt");
254: halt
255: # }
256: ret
257: .set L41,0x0
258: L43:
259: jbr L44
260: .data
261: #
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.