|
|
1.1 root 1:
2: /* privileged registers constants (addresses) */
3:
4:
5:
6: .set SBR,0 /*system base register */
7: .set SLR,1 /*system length reg */
8: .set P0BR,2 /*p0 base reg */
9: .set P0LR,3 /*p0 length reg */
10: .set P1BR,4 /*p1 base reg */
11: .set P1LR,5 /*p1 length reg */
12: .set P2BR,6 /*p2 base reg */
13: .set P2LR,7 /*p2 length reg */
14: .set IPL,8 /*int priority level reg */
15: .set MME,9 /*memory mgmt enable reg */
16: .set TBIA,10 /*trans buf invalidate all */
17: /*entries */
18: .set TBIS,11 /*trans buf invalidate single */
19: /*entry */
20: .set DCK,12 /*data cache key */
21: .set CCK,13 /*code cache key */
22: .set PCBB,14 /*process control block base */
23: .set ISP,15 /*interrupt stack pointer */
24: .set SIRR,16 /*software int request reg */
25: .set SISR,17 /*software int summary reg */
26: .set SCBB,18 /*system control block base reg */
27: .set KSP,19 /*kernel stack pointer reg */
28: .set USP,20 /*user stack pointer */
29: .set P1CC,21 /*purge (invalidate) one page */
30: /*of code cache */
31: .set PACC,23 /*purge (invalidate) all pages */
32: /*of process in code cache */
33: .set P1DC,24 /*purge one page of data cache */
34: .set PADC,25 /*purge all the pages of */
35: /*process in data cache */
36: .set HISR,26 /* Hardware interrupt summary reg */
37:
38:
39:
40: .set PSL_C,0x00000001 /* carry bit */
41: .set PSL_V,0x00000002 /* overflow bit */
42: .set PSL_Z,0x00000004 /* zero bit */
43: .set Z,0x00000004
44: .set PSL_N,0x00000008 /* negative bit */
45: .set PSL_T,0x00000010 /* trace enable bit */
46: .set PSL_I,0x00000020 /* integer overflow enable bit */
47: .set PSL_IPL,0x001f0000 /* interrupt priority level */
48: .set PSL_MOD,0x01000000 /* mode = 1 means user*/
49: .set PSL_IS,0x04000000 /* interrupt stack */
50: .set PSL_TP,0x40000000 /* trace pending */
51:
52: .set PG_V,0x80000000
53: .set PG_PROT,0x78000000
54: .set PG_M,0x04000000
55: .set PG_USED,0x02000000
56: .set PG_NC,0x01000000
57: .set PG_PFNUM,0x003fffff
58:
59: .set PG_NOACC,0
60: .set PG_KR,0x40000000
61: .set PG_KW,0x60000000
62: .set PG_URKR,0x50000000
63: .set PG_URKW,0x70000000
64: .set PG_UW,0x78000000
65:
66: /* PCB offsets & diagnostic extension to pcb */
67:
68:
69: .set PCB_KSP, 0
70: .set PCB_USP, 4
71: .set PCB_R0, 8
72: .set PCB_R1, 12
73: .set PCB_R2, 16
74: .set PCB_R3, 20
75: .set PCB_R4, 24
76: .set PCB_R5, 28
77: .set PCB_R6, 32
78: .set PCB_R7, 36
79: .set PCB_R8, 40
80: .set PCB_R9, 44
81: .set PCB_R10, 48
82: .set PCB_R11, 52
83: .set PCB_R12, 56
84: .set PCB_R13, 60
85: .set PCB_PC, 64
86: .set PCB_PSL, 68
87: .set PCB_P0BR, 72
88: .set PCB_P0LR, 76
89: .set PCB_P1BR, 80
90: .set PCB_P1LR, 84
91: .set PCB_P2BR, 88
92: .set PCB_P2LR, 92
93: .set PCB_STAT, 96 /*process status,statistics,id,etc*/
94:
95:
96:
97: /* fundamental constants */
98:
99:
100: .set NBPG,1024
101: .set PGOFSET,(NBPG-1) /* byte offset into page */
102: .set PGSHIFT,10 /* LOG2(NBPG) */
103: .set HIGH,0x1f
104: .set PAGE,1024
105:
106:
107: /* SCB offsets */
108:
109: .set PFVEC,4 /*power fail */
110: .set CLOCKVEC,28 /*hard clock vector */
111: .set CRVEC,40 /*console receive */
112: .set CXVEC,44 /*console transmit */
113: .set SIVEC1,120 /*software int vec #1 */
114: /*for 2,3,..15, sub 4,8,.. 56 */
115: /*from SIVEC1 */
116: .set BEVEC,128 /*bus error */
117: .set SYSVEC,172 /*system call (kcall) */
118: .set PINSTVEC,176 /*privileged instruction fault */
119: .set ROVEC,180 /*reserved operand fault */
120: .set RAVEC,184 /*reserved addressing fault */
121: .set PROTVEC,188 /*access control violation */
122: .set TRANSVEC,192 /*translation fault vector */
123: .set KSPVEC,196 /*kernel stack not valid vector */
124: .set TRACEVEC,200 /*trace vector */
125: .set BPTVEC,204 /*break point fault */
126: .set ARITHVEC,208 /*arithmetic trap */
127: .set ALIGNVEC,212 /*alignment vector */
128: .set IO14VEC,256 /*io vector, ipl #14 */
129: .set IO15VEC,320 /*io vector, ipl #15 */
130: .set IO16VEC,384 /*io vector, ipl #16 */
131: .set IO17VEC,448 /*io vector, ipl #17 */
132:
133: /* SPT (system page table) offsets */
134:
135: .set SCBPTE,8 /*system control block pte offset*/
136: .set BUFPTE,12 /*buffer pte offset */
137: .set ISPTE,16 /*interrupt stack page 0 */
138: .set IS1PTE,20 /*interrupt stack page 1 */
139: .set SPTPTE,20 /*system page table page 1 */
140: .set SPT1PTE,20 /*system page table page 2 */
141: .set IOMAPPTE,24 /*io map */
142: .set PCBPTE,28 /*process control blocks pte */
143: .set U0P0PTE,32 /*U0 p0pt pte */
144: .set U0P1PTE,36 /*U0 p1pt pte */
145: .set U0P2PTE,40 /*U0 p2pt pte */
146: .set U1P0PTE,44
147: .set U1P1PTE,48
148: .set U1P2PTE,52
149: .set U2P0PTE,56
150: .set U2P1PTE,60
151: .set U2P2PTE,64
152: .set U3P0PTE,68
153: .set U3P1PTE,72
154: .set U3P2PTE,76
155: .set U4P0PTE,80
156: .set U4P1PTE,84
157: .set U4P2PTE,88
158: .set U5P0PTE,92
159: .set U5P1PTE,96
160: .set U5P2PTE,100
161: .set U6P0PTE,104
162: .set U6P1PTE,108
163: .set U6P2PTE,112
164: .set U7P0PTE,116 /*U7 p0pt pte */
165: .set U7P1PTE,120 /*U7 p1pt pte */
166: .set U7P2PTE,124 /*U7 p2pt pte */
167: .set IOB0PTE,128 /*io buffer 0 pte */
168: .set IOB1PTE,132
169: .set IOB2PTE,136
170: .set IOB3PTE,140
171: .set IOB4PTE,144
172: .set IOB5PTE,148
173: .set IOB6PTE,152
174: .set IOB7PTE,156 /*io buffer 7 pte */
175:
176:
177: /* trap.h 4.6 81/03/03 */
178:
179:
180: .set RESADFLT,0 /* reserved addressing fault */
181: .set PRIVINFLT,1 /* privileged instruction fault */
182: .set RESOPFLT,2 /* reserved operand fault */
183: .set BPTFLT,3 /* bpt instruction fault */
184: .set ALIGNFLT,4 /* alignment fault */
185: .set SYSCALL,5 /* kcall instruction (syscall trap) */
186: .set ARITHTRAP,6 /* arithmetic trap */
187: .set PROTFLT,7 /* protection fault */
188: .set TRCTRAP,8 /* trace trap */
189: .set TRANSFLT,9 /* translation not valid fault */
190: .set DONE,255
191: .set CPMDCB,21
192: .set PDCS,28
193: .set ISTK,0x10000
194: .globl _ioboth
195: .set SYSP,0x20000
196: .set SSP,0x30000
197: .set CPCONS,0x01
198: .set CPWRITE,0x01
199: .set CLOCKVEC,28 /*hard clock vector */
200: .set RRVEC,48 /*remote receive */
201: .set RXVEC,52 /*remote transmit */
202: .set CPRMTE,0x02
203: .set CPWRITE,0x01
204: .set CPREAD,0x02
205: .set RDONE,0x4000
206: .set TIME,0x0fffffff
207: .set BFSZ,0x01
208: .set A,0x41
209: .set a,0x61
210: .set Z,0x5a
211: .set z,0x7a
212:
213:
214: /* Local and Remote console output test */
215:
216:
217: _ioboth:movl $0x00,r1
218: movab bitbl,r0
219: lvec: movl r0,_scb [r1]
220: addl2 $4,r0
221: addl2 $1,r1
222: cmpl $0xff,r1
223: jneq lvec
224: movb $A,ucase /* load starting value of upper case */
225: movb $a,lcase /* load starting value of lower case */
226: mtpr $_scb,$SCBB /* initialize SCBB */
227: movl $SSP,sp /* initialize system stack pointer */
228: movab liint,_scb + CRVEC /* addr rx interrupt routine */
229: movab loint,_scb + CXVEC /* addr tx interrupt routine */
230: movab riint,_scb + RRVEC /* addr rrx interrupt routine */
231: movab roint,_scb + RXVEC /* addr rtx interrupt routine */
232: movab clkint,_scb + CLOCKVEC
233:
234: movab LIDCB,r7
235: movb $CPCONS,0(r7) /* set up CPDCB for console */
236: movb $CPREAD,1(r7)
237: movw $BFSZ,2(r7)
238: movb $0,4(r7)
239: mtpr r7,$CPMDCB /* send read interrupt to cp */
240: ili: mtpr r7,$PDCS
241: movw 0(r7),r8 /* read CP command word */
242: andw2 $RDONE,r8 /* check buffer read is done */
243: jeql ili /* not done check again */
244: movab RIDCB,r7
245: movb $CPRMTE,0(r7) /* set up CPDCB for remote */
246: movb $CPREAD,1(r7)
247: movw $BFSZ,2(r7)
248: movb $0,4(r7)
249: mtpr r7,$CPMDCB /* send read interrupt to cp */
250: iri: mtpr r7,$PDCS
251: movw 0(r7),r8 /* read CP command word */
252: andw2 $RDONE,r8 /* check buffer read is done */
253: jeql iri /* not done check again */
254: movab LODCB,r7
255: movb $CPCONS,0(r7) /* set up CPDCB for console */
256: movb $CPWRITE,1(r7)
257: movw $BFSZ,2(r7)
258: movb ucase,4(r7) /* load upper case character to xmit */
259: mtpr r7,$CPMDCB /* send xmit interrupt to cp */
260: ilo: mtpr r7,$PDCS
261: movw 0(r7),r8 /* read CP command word */
262: andw2 $RDONE,r8 /* check buffer read is done */
263: jeql ilo /* not done check again */
264: movab RODCB,r7
265: movb $CPRMTE,0(r7) /* set up CPDCB for remote */
266: movb $CPWRITE,1(r7)
267: movw $BFSZ,2(r7)
268: movb lcase,4(r7) /* load lower case character to xmit */
269: mtpr r7,$CPMDCB /* send xmit interrupt to cp */
270: iro: mtpr r7,$PDCS
271: movw 0(r7),r8 /* read CP command word */
272: andw2 $RDONE,r8 /* check buffer read is done */
273: jeql iro /* not done check again */
274:
275: clrl r6
276: loop: tstl r6
277: jneq loopc
278: movl $0x1f,r6
279: loopc: mtpr r6,$IPL /* lower ipl to allow all interrupts */
280: decl r6
281: jmp loop /* jump self to transmit characters */
282: tdone: movl $0xCAFEBABE,r0 /* good test */
283: halt
284:
285: liint: mfpr $CPMDCB,r5
286: mtpr r5,$PDCS
287: movw (r5),r4 /* read CP command word */
288: andw2 $RDONE,r4 /* check buffer read is done */
289: jeql liint /* not done check again */
290: movab LIDCB,r5
291: movb $CPCONS,(r5) /* set up CPDCB for console */
292: movb $CPREAD,1(r5)
293: movab 4(r5),r4
294: mtpr r4,$PDCS
295: movb 4(r5),ucase
296: movb $0,4(r5)
297: movb ucase,r4 /* get character read */
298: andl2 $127,r4 /* mask parity */
299: cmpl $4,r4 /* check for control d */
300: jeql tdone /* yes--all done */
301: mtpr r5,$CPMDCB /* send read interrupt to cp */
302: liret: rei
303:
304: loint: mfpr $CPMDCB,r5
305: mtpr r5,$PDCS
306: movw (r5),r4 /* read CP command word */
307: andw2 $RDONE,r4 /* check buffer read is done */
308: jeql loint /* not done check again */
309: movab LODCB,r5
310: movb $CPCONS,(r5) /* set up dcb for console */
311: movb ucase,4(r5) /* load character to xmit */
312: mtpr r5,$CPMDCB /* issue " go " command */
313: loret: rei
314:
315: riint: mfpr $CPMDCB,r5
316: mtpr r5,$PDCS
317: movw (r5),r4 /* read CP command word */
318: andw2 $RDONE,r4 /* check buffer read is done */
319: jeql riint /* not done check again */
320: movab RIDCB,r5
321: movb $CPRMTE,(r5) /* set up CPDCB for remote */
322: movb $CPREAD,1(r5)
323: movab 4(r5),r4
324: mtpr r4,$PDCS
325: movb 4(r5),lcase
326: movb $0,4(r5)
327: mtpr r5,$CPMDCB /* send read interrupt to cp */
328: movl lcase,r4 /* get character read */
329: andl2 $127,r4 /* mask parity */
330: cmpl $4,r4 /* check for control d */
331: jeql tdone /* yes--all done */
332: riret: rei
333:
334: roint: mfpr $CPMDCB,r5
335: mtpr r5,$PDCS
336: movw (r5),r4 /* read CP command word */
337: andw2 $RDONE,r4 /* check buffer read is done */
338: jeql roint /* not done check again */
339: movab RODCB,r5
340: movb $CPRMTE,(r5) /* set up dcb for console */
341: movb lcase,4(r5) /* load character to xmit */
342: mtpr r5,$CPMDCB /* issue " go " command */
343: roret: rei
344:
345: clkint: rei /* dummy routine to handle clock int */
346: .data
347: _scb:
348: .space 1024
349:
350: bitbl:
351: .space 1024
352:
353: .align 2
354: LIDCB:
355: .space 20
356:
357: .align 2
358: LODCB:
359: .space 20
360:
361: .align 2
362: RIDCB:
363: .space 20
364:
365: .align 2
366: RODCB:
367: .space 20
368:
369: .align 2
370:
371: ucase: .space 4
372:
373: lcase: .space 4
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.