2 |
- |
1 |
/*
|
|
|
2 |
* non-startup assembly-language assist
|
|
|
3 |
*/
|
|
|
4 |
|
|
|
5 |
#include "mem.h"
|
|
|
6 |
#include "/sys/src/boot/pc/x16.h"
|
|
|
7 |
#undef DELAY
|
|
|
8 |
|
|
|
9 |
#define PADDR(a) ((a) & ~KZERO)
|
|
|
10 |
#define KADDR(a) (KZERO|(a))
|
|
|
11 |
|
|
|
12 |
/*
|
|
|
13 |
* Some machine instructions not handled by 8[al].
|
|
|
14 |
*/
|
|
|
15 |
#define OP16 BYTE $0x66
|
|
|
16 |
#define DELAY BYTE $0xEB; BYTE $0x00 /* JMP .+2 */
|
|
|
17 |
#define CPUID BYTE $0x0F; BYTE $0xA2 /* CPUID, argument in AX */
|
|
|
18 |
#define WRMSR BYTE $0x0F; BYTE $0x30 /* WRMSR, argument in AX/DX (lo/hi) */
|
|
|
19 |
#define RDTSC BYTE $0x0F; BYTE $0x31 /* RDTSC, result in AX/DX (lo/hi) */
|
|
|
20 |
#define RDMSR BYTE $0x0F; BYTE $0x32 /* RDMSR, result in AX/DX (lo/hi) */
|
|
|
21 |
#define HLT BYTE $0xF4
|
|
|
22 |
#define INVLPG BYTE $0x0F; BYTE $0x01; BYTE $0x39 /* INVLPG (%ecx) */
|
|
|
23 |
#define WBINVD BYTE $0x0F; BYTE $0x09
|
|
|
24 |
|
|
|
25 |
/*
|
|
|
26 |
* Macros for calculating offsets within the page directory base
|
|
|
27 |
* and page tables. Note that these are assembler-specific hence
|
|
|
28 |
* the '<<2'.
|
|
|
29 |
*/
|
|
|
30 |
#define PDO(a) (((((a))>>22) & 0x03FF)<<2)
|
|
|
31 |
#define PTO(a) (((((a))>>12) & 0x03FF)<<2)
|
|
|
32 |
|
|
|
33 |
TEXT pagingoff(SB), $0
|
|
|
34 |
DELAY /* JMP .+2 */
|
|
|
35 |
|
|
|
36 |
/*
|
|
|
37 |
* use a jump to an absolute location to get the PC out of
|
|
|
38 |
* KZERO. first establishes double mapping of first few MB.
|
|
|
39 |
*/
|
|
|
40 |
MOVL CR3, CX /* load address of PDB */
|
|
|
41 |
ADDL $KZERO, CX
|
|
|
42 |
MOVL PDO(KZERO)(CX), DX /* double-map KZERO at 0 */
|
|
|
43 |
MOVL DX, PDO(0)(CX)
|
|
|
44 |
|
|
|
45 |
MOVL CR3, CX
|
|
|
46 |
MOVL CX, CR3 /* load and flush the mmu */
|
|
|
47 |
|
|
|
48 |
MOVL entry+0(FP), DX
|
|
|
49 |
|
|
|
50 |
LEAL _nopaging-KZERO(SB),AX
|
|
|
51 |
JMP* AX /* jump to identity-map */
|
|
|
52 |
|
|
|
53 |
TEXT _nopaging(SB), $0
|
|
|
54 |
DELAY /* JMP .+2 */
|
|
|
55 |
|
|
|
56 |
/* switch to low stack */
|
|
|
57 |
MOVL SP, AX
|
|
|
58 |
MOVL $RMSTACK, SP
|
|
|
59 |
// PUSHL AX
|
|
|
60 |
|
|
|
61 |
/* change gdt to physical pointer */
|
|
|
62 |
MOVL _gdtptr16r-KZERO(SB), GDTR
|
|
|
63 |
|
|
|
64 |
/*
|
|
|
65 |
* turn off paging
|
|
|
66 |
*/
|
|
|
67 |
MOVL CR0,AX
|
|
|
68 |
ANDL $~PG, AX
|
|
|
69 |
MOVL AX,CR0
|
|
|
70 |
DELAY /* JMP .+2 */
|
|
|
71 |
|
|
|
72 |
MOVL $_stop32pg-KZERO(SB), AX
|
|
|
73 |
JMP* AX /* forward into the past */
|
|
|
74 |
|
|
|
75 |
TEXT _stop32pg(SB), $0
|
|
|
76 |
MOVL multibootheader-KZERO(SB), BX /* multiboot data pointer */
|
|
|
77 |
MOVL $0x2badb002, AX /* multiboot magic */
|
|
|
78 |
|
|
|
79 |
JMP* DX /* into the loaded kernel */
|
|
|
80 |
|
|
|
81 |
_idle:
|
|
|
82 |
HLT
|
|
|
83 |
JMP _idle
|
|
|
84 |
|
|
|
85 |
/*
|
|
|
86 |
* BIOS32.
|
|
|
87 |
*/
|
|
|
88 |
TEXT bios32call(SB), $0
|
|
|
89 |
MOVL ci+0(FP), BP
|
|
|
90 |
MOVL 0(BP), AX
|
|
|
91 |
MOVL 4(BP), BX
|
|
|
92 |
MOVL 8(BP), CX
|
|
|
93 |
MOVL 12(BP), DX
|
|
|
94 |
MOVL 16(BP), SI
|
|
|
95 |
MOVL 20(BP), DI
|
|
|
96 |
PUSHL BP
|
|
|
97 |
|
|
|
98 |
MOVL 12(SP), BP /* ptr */
|
|
|
99 |
BYTE $0xFF; BYTE $0x5D; BYTE $0x00 /* CALL FAR 0(BP) */
|
|
|
100 |
|
|
|
101 |
POPL BP
|
|
|
102 |
MOVL DI, 20(BP)
|
|
|
103 |
MOVL SI, 16(BP)
|
|
|
104 |
MOVL DX, 12(BP)
|
|
|
105 |
MOVL CX, 8(BP)
|
|
|
106 |
MOVL BX, 4(BP)
|
|
|
107 |
MOVL AX, 0(BP)
|
|
|
108 |
|
|
|
109 |
XORL AX, AX
|
|
|
110 |
JCC _bios32xxret
|
|
|
111 |
INCL AX
|
|
|
112 |
|
|
|
113 |
_bios32xxret:
|
|
|
114 |
RET
|
|
|
115 |
|
|
|
116 |
TEXT cgapost2(SB), 0, $16
|
|
|
117 |
MOVL $0xb8000,CX
|
|
|
118 |
MOVL CX,(SP)
|
|
|
119 |
CALL ,kaddr+0(SB)
|
|
|
120 |
MOVL code+0(FP),BP
|
|
|
121 |
MOVL AX,BX
|
|
|
122 |
MOVL BP,CX
|
|
|
123 |
SARL $4,CX
|
|
|
124 |
ANDL $15,CX
|
|
|
125 |
MOVBLZX hex(SB)(CX*1),AX
|
|
|
126 |
MOVB AX,3996(BX)
|
|
|
127 |
MOVB $7,3997(BX)
|
|
|
128 |
MOVL BP,DX
|
|
|
129 |
ANDL $15,DX
|
|
|
130 |
MOVBLZX hex(SB)(DX*1),CX
|
|
|
131 |
MOVB CX,3998(BX)
|
|
|
132 |
MOVB $7,3999(BX)
|
|
|
133 |
RET
|
|
|
134 |
|
|
|
135 |
/*
|
|
|
136 |
* Read/write various system registers.
|
|
|
137 |
* CR4 and the 'model specific registers' should only be read/written
|
|
|
138 |
* after it has been determined the processor supports them
|
|
|
139 |
*/
|
|
|
140 |
TEXT ltr(SB), $0 /* TR - task register */
|
|
|
141 |
MOVL tptr+0(FP), AX
|
|
|
142 |
MOVW AX, TASK
|
|
|
143 |
RET
|
|
|
144 |
|
|
|
145 |
TEXT invlpg(SB), $0
|
|
|
146 |
/* 486+ only */
|
|
|
147 |
MOVL va+0(FP), CX
|
|
|
148 |
INVLPG
|
|
|
149 |
RET
|
|
|
150 |
|
|
|
151 |
TEXT wbinvd(SB), $0
|
|
|
152 |
WBINVD
|
|
|
153 |
RET
|
|
|
154 |
|
|
|
155 |
/*
|
|
|
156 |
* stub for:
|
|
|
157 |
* time stamp counter; low-order 32 bits of 64-bit cycle counter
|
|
|
158 |
* Runs at fasthz/4 cycles per second (m->clkin>>3)
|
|
|
159 |
*/
|
|
|
160 |
TEXT lcycles(SB),1,$0
|
|
|
161 |
RDTSC
|
|
|
162 |
RET
|
|
|
163 |
|
|
|
164 |
/*
|
|
|
165 |
* Try to determine the CPU type which requires fiddling with EFLAGS.
|
|
|
166 |
* If the Id bit can be toggled then the CPUID instruction can be used
|
|
|
167 |
* to determine CPU identity and features. First have to check if it's
|
|
|
168 |
* a 386 (Ac bit can't be set). If it's not a 386 and the Id bit can't be
|
|
|
169 |
* toggled then it's an older 486 of some kind.
|
|
|
170 |
*
|
|
|
171 |
* cpuid(fun, regs[4]);
|
|
|
172 |
*/
|
|
|
173 |
TEXT cpuid(SB), $0
|
|
|
174 |
MOVL $0x240000, AX
|
|
|
175 |
PUSHL AX
|
|
|
176 |
POPFL /* set Id|Ac */
|
|
|
177 |
PUSHFL
|
|
|
178 |
POPL BX /* retrieve value */
|
|
|
179 |
MOVL $0, AX
|
|
|
180 |
PUSHL AX
|
|
|
181 |
POPFL /* clear Id|Ac, EFLAGS initialised */
|
|
|
182 |
PUSHFL
|
|
|
183 |
POPL AX /* retrieve value */
|
|
|
184 |
XORL BX, AX
|
|
|
185 |
TESTL $0x040000, AX /* Ac */
|
|
|
186 |
JZ _cpu386 /* can't set this bit on 386 */
|
|
|
187 |
TESTL $0x200000, AX /* Id */
|
|
|
188 |
JZ _cpu486 /* can't toggle this bit on some 486 */
|
|
|
189 |
MOVL fn+0(FP), AX
|
|
|
190 |
CPUID
|
|
|
191 |
JMP _cpuid
|
|
|
192 |
_cpu486:
|
|
|
193 |
MOVL $0x400, AX
|
|
|
194 |
JMP _maybezapax
|
|
|
195 |
_cpu386:
|
|
|
196 |
MOVL $0x300, AX
|
|
|
197 |
_maybezapax:
|
|
|
198 |
CMPL fn+0(FP), $1
|
|
|
199 |
JE _zaprest
|
|
|
200 |
XORL AX, AX
|
|
|
201 |
_zaprest:
|
|
|
202 |
XORL BX, BX
|
|
|
203 |
XORL CX, CX
|
|
|
204 |
XORL DX, DX
|
|
|
205 |
_cpuid:
|
|
|
206 |
MOVL regs+4(FP), BP
|
|
|
207 |
MOVL AX, 0(BP)
|
|
|
208 |
MOVL BX, 4(BP)
|
|
|
209 |
MOVL CX, 8(BP)
|
|
|
210 |
MOVL DX, 12(BP)
|
|
|
211 |
RET
|
|
|
212 |
|
|
|
213 |
/*
|
|
|
214 |
* Floating point.
|
|
|
215 |
* Note: the encodings for the FCLEX, FINIT, FSAVE, FSTCW, FSENV and FSTSW
|
|
|
216 |
* instructions do NOT have the WAIT prefix byte (i.e. they act like their
|
|
|
217 |
* FNxxx variations) so WAIT instructions must be explicitly placed in the
|
|
|
218 |
* code as necessary.
|
|
|
219 |
*/
|
|
|
220 |
#define FPOFF(l) ;\
|
|
|
221 |
MOVL CR0, AX ;\
|
|
|
222 |
ANDL $0xC, AX /* EM, TS */ ;\
|
|
|
223 |
CMPL AX, $0x8 ;\
|
|
|
224 |
JEQ l ;\
|
|
|
225 |
WAIT ;\
|
|
|
226 |
l: ;\
|
|
|
227 |
MOVL CR0, AX ;\
|
|
|
228 |
ANDL $~0x4, AX /* EM=0 */ ;\
|
|
|
229 |
ORL $0x28, AX /* NE=1, TS=1 */ ;\
|
|
|
230 |
MOVL AX, CR0
|
|
|
231 |
|
|
|
232 |
#define FPON ;\
|
|
|
233 |
MOVL CR0, AX ;\
|
|
|
234 |
ANDL $~0xC, AX /* EM=0, TS=0 */ ;\
|
|
|
235 |
MOVL AX, CR0
|
|
|
236 |
|
|
|
237 |
TEXT fpoff(SB), $0 /* disable */
|
|
|
238 |
FPOFF(l1)
|
|
|
239 |
RET
|
|
|
240 |
|
|
|
241 |
TEXT fpinit(SB), $0 /* enable and init */
|
|
|
242 |
FPON
|
|
|
243 |
FINIT
|
|
|
244 |
WAIT
|
|
|
245 |
/* setfcr(FPPDBL|FPRNR|FPINVAL|FPZDIV|FPOVFL) */
|
|
|
246 |
/* note that low 6 bits are masks, not enables, on this chip */
|
|
|
247 |
PUSHW $0x0232
|
|
|
248 |
FLDCW 0(SP)
|
|
|
249 |
POPW AX
|
|
|
250 |
WAIT
|
|
|
251 |
RET
|
|
|
252 |
|
|
|
253 |
/*
|
|
|
254 |
* Test-And-Set
|
|
|
255 |
*/
|
|
|
256 |
TEXT tas(SB), $0
|
|
|
257 |
MOVL $0xDEADDEAD, AX
|
|
|
258 |
MOVL lock+0(FP), BX
|
|
|
259 |
XCHGL AX, (BX) /* lock->key */
|
|
|
260 |
RET
|
|
|
261 |
|
|
|
262 |
TEXT _xinc(SB), $0 /* void _xinc(long*); */
|
|
|
263 |
MOVL l+0(FP), AX
|
|
|
264 |
LOCK; INCL 0(AX)
|
|
|
265 |
RET
|
|
|
266 |
|
|
|
267 |
TEXT _xdec(SB), $0 /* long _xdec(long*); */
|
|
|
268 |
MOVL l+0(FP), BX
|
|
|
269 |
XORL AX, AX
|
|
|
270 |
LOCK; DECL 0(BX)
|
|
|
271 |
JLT _xdeclt
|
|
|
272 |
JGT _xdecgt
|
|
|
273 |
RET
|
|
|
274 |
_xdecgt:
|
|
|
275 |
INCL AX
|
|
|
276 |
RET
|
|
|
277 |
_xdeclt:
|
|
|
278 |
DECL AX
|
|
|
279 |
RET
|
|
|
280 |
|
|
|
281 |
TEXT xchgw(SB), $0
|
|
|
282 |
MOVL v+4(FP), AX
|
|
|
283 |
MOVL p+0(FP), BX
|
|
|
284 |
XCHGW AX, (BX)
|
|
|
285 |
RET
|
|
|
286 |
|
|
|
287 |
TEXT cmpswap486(SB), $0
|
|
|
288 |
MOVL addr+0(FP), BX
|
|
|
289 |
MOVL old+4(FP), AX
|
|
|
290 |
MOVL new+8(FP), CX
|
|
|
291 |
LOCK
|
|
|
292 |
BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */
|
|
|
293 |
JNZ didnt
|
|
|
294 |
MOVL $1, AX
|
|
|
295 |
RET
|
|
|
296 |
didnt:
|
|
|
297 |
XORL AX,AX
|
|
|
298 |
RET
|
|
|
299 |
|
|
|
300 |
TEXT mul64fract(SB), $0
|
|
|
301 |
/*
|
|
|
302 |
* Multiply two 64-bit number s and keep the middle 64 bits from the 128-bit result
|
|
|
303 |
* See ../port/tod.c for motivation.
|
|
|
304 |
*/
|
|
|
305 |
MOVL r+0(FP), CX
|
|
|
306 |
XORL BX, BX /* BX = 0 */
|
|
|
307 |
|
|
|
308 |
MOVL a+8(FP), AX
|
|
|
309 |
MULL b+16(FP) /* a1*b1 */
|
|
|
310 |
MOVL AX, 4(CX) /* r2 = lo(a1*b1) */
|
|
|
311 |
|
|
|
312 |
MOVL a+8(FP), AX
|
|
|
313 |
MULL b+12(FP) /* a1*b0 */
|
|
|
314 |
MOVL AX, 0(CX) /* r1 = lo(a1*b0) */
|
|
|
315 |
ADDL DX, 4(CX) /* r2 += hi(a1*b0) */
|
|
|
316 |
|
|
|
317 |
MOVL a+4(FP), AX
|
|
|
318 |
MULL b+16(FP) /* a0*b1 */
|
|
|
319 |
ADDL AX, 0(CX) /* r1 += lo(a0*b1) */
|
|
|
320 |
ADCL DX, 4(CX) /* r2 += hi(a0*b1) + carry */
|
|
|
321 |
|
|
|
322 |
MOVL a+4(FP), AX
|
|
|
323 |
MULL b+12(FP) /* a0*b0 */
|
|
|
324 |
ADDL DX, 0(CX) /* r1 += hi(a0*b0) */
|
|
|
325 |
ADCL BX, 4(CX) /* r2 += carry */
|
|
|
326 |
RET
|
|
|
327 |
|
|
|
328 |
/*
|
|
|
329 |
* label consists of a stack pointer and a PC
|
|
|
330 |
*/
|
|
|
331 |
TEXT gotolabel(SB), $0
|
|
|
332 |
MOVL label+0(FP), AX
|
|
|
333 |
MOVL 0(AX), SP /* restore sp */
|
|
|
334 |
MOVL 4(AX), AX /* put return pc on the stack */
|
|
|
335 |
MOVL AX, 0(SP)
|
|
|
336 |
MOVL $1, AX /* return 1 */
|
|
|
337 |
RET
|
|
|
338 |
|
|
|
339 |
TEXT setlabel(SB), $0
|
|
|
340 |
MOVL label+0(FP), AX
|
|
|
341 |
MOVL SP, 0(AX) /* store sp */
|
|
|
342 |
MOVL 0(SP), BX /* store return pc */
|
|
|
343 |
MOVL BX, 4(AX)
|
|
|
344 |
MOVL $0, AX /* return 0 */
|
|
|
345 |
RET
|
|
|
346 |
|
|
|
347 |
/*
|
|
|
348 |
* Attempt at power saving. -rsc
|
|
|
349 |
*/
|
|
|
350 |
TEXT halt(SB), $0
|
|
|
351 |
CLI /* interrupts off */
|
|
|
352 |
CMPL nrdy(SB), $0
|
|
|
353 |
JEQ _nothingready
|
|
|
354 |
STI /* interrupts on */
|
|
|
355 |
RET
|
|
|
356 |
|
|
|
357 |
_nothingready:
|
|
|
358 |
STI /* interrupts on: service before rescheduling */
|
|
|
359 |
HLT
|
|
|
360 |
RET
|
|
|
361 |
|
|
|
362 |
/*
|
|
|
363 |
* Interrupt/exception handling.
|
|
|
364 |
* Each entry in the vector table calls either _strayintr or _strayintrx depending
|
|
|
365 |
* on whether an error code has been automatically pushed onto the stack
|
|
|
366 |
* (_strayintrx) or not, in which case a dummy entry must be pushed before retrieving
|
|
|
367 |
* the trap type from the vector table entry and placing it on the stack as part
|
|
|
368 |
* of the Ureg structure.
|
|
|
369 |
* The size of each entry in the vector table (6 bytes) is known in trapinit().
|
|
|
370 |
*/
|
|
|
371 |
TEXT _strayintr(SB), $0
|
|
|
372 |
PUSHL AX /* save AX */
|
|
|
373 |
MOVL 4(SP), AX /* return PC from vectortable(SB) */
|
|
|
374 |
JMP intrcommon
|
|
|
375 |
|
|
|
376 |
TEXT _strayintrx(SB), $0
|
|
|
377 |
XCHGL AX, (SP) /* swap AX with vectortable CALL PC */
|
|
|
378 |
intrcommon:
|
|
|
379 |
PUSHL DS /* save DS */
|
|
|
380 |
PUSHL $(KDSEL)
|
|
|
381 |
POPL DS /* fix up DS */
|
|
|
382 |
MOVBLZX (AX), AX /* trap type -> AX */
|
|
|
383 |
XCHGL AX, 4(SP) /* exchange trap type with saved AX */
|
|
|
384 |
|
|
|
385 |
PUSHL ES /* save ES */
|
|
|
386 |
PUSHL $(KDSEL)
|
|
|
387 |
POPL ES /* fix up ES */
|
|
|
388 |
|
|
|
389 |
PUSHL FS /* save the rest of the Ureg struct */
|
|
|
390 |
PUSHL GS
|
|
|
391 |
PUSHAL
|
|
|
392 |
|
|
|
393 |
PUSHL SP /* Ureg* argument to trap */
|
|
|
394 |
CALL trap(SB)
|
|
|
395 |
|
|
|
396 |
TEXT forkret(SB), $0
|
|
|
397 |
POPL AX
|
|
|
398 |
POPAL
|
|
|
399 |
POPL GS
|
|
|
400 |
POPL FS
|
|
|
401 |
POPL ES
|
|
|
402 |
POPL DS
|
|
|
403 |
ADDL $8, SP /* pop error code and trap type */
|
|
|
404 |
IRETL
|
|
|
405 |
|
|
|
406 |
TEXT vectortable(SB), $0
|
|
|
407 |
CALL _strayintr(SB); BYTE $0x00 /* divide error */
|
|
|
408 |
CALL _strayintr(SB); BYTE $0x01 /* debug exception */
|
|
|
409 |
CALL _strayintr(SB); BYTE $0x02 /* NMI interrupt */
|
|
|
410 |
CALL _strayintr(SB); BYTE $0x03 /* breakpoint */
|
|
|
411 |
CALL _strayintr(SB); BYTE $0x04 /* overflow */
|
|
|
412 |
CALL _strayintr(SB); BYTE $0x05 /* bound */
|
|
|
413 |
CALL _strayintr(SB); BYTE $0x06 /* invalid opcode */
|
|
|
414 |
CALL _strayintr(SB); BYTE $0x07 /* no coprocessor available */
|
|
|
415 |
CALL _strayintrx(SB); BYTE $0x08 /* double fault */
|
|
|
416 |
CALL _strayintr(SB); BYTE $0x09 /* coprocessor segment overflow */
|
|
|
417 |
CALL _strayintrx(SB); BYTE $0x0A /* invalid TSS */
|
|
|
418 |
CALL _strayintrx(SB); BYTE $0x0B /* segment not available */
|
|
|
419 |
CALL _strayintrx(SB); BYTE $0x0C /* stack exception */
|
|
|
420 |
CALL _strayintrx(SB); BYTE $0x0D /* general protection error */
|
|
|
421 |
CALL _strayintrx(SB); BYTE $0x0E /* page fault */
|
|
|
422 |
CALL _strayintr(SB); BYTE $0x0F /* */
|
|
|
423 |
CALL _strayintr(SB); BYTE $0x10 /* coprocessor error */
|
|
|
424 |
CALL _strayintrx(SB); BYTE $0x11 /* alignment check */
|
|
|
425 |
CALL _strayintr(SB); BYTE $0x12 /* machine check */
|
|
|
426 |
CALL _strayintr(SB); BYTE $0x13
|
|
|
427 |
CALL _strayintr(SB); BYTE $0x14
|
|
|
428 |
CALL _strayintr(SB); BYTE $0x15
|
|
|
429 |
CALL _strayintr(SB); BYTE $0x16
|
|
|
430 |
CALL _strayintr(SB); BYTE $0x17
|
|
|
431 |
CALL _strayintr(SB); BYTE $0x18
|
|
|
432 |
CALL _strayintr(SB); BYTE $0x19
|
|
|
433 |
CALL _strayintr(SB); BYTE $0x1A
|
|
|
434 |
CALL _strayintr(SB); BYTE $0x1B
|
|
|
435 |
CALL _strayintr(SB); BYTE $0x1C
|
|
|
436 |
CALL _strayintr(SB); BYTE $0x1D
|
|
|
437 |
CALL _strayintr(SB); BYTE $0x1E
|
|
|
438 |
CALL _strayintr(SB); BYTE $0x1F
|
|
|
439 |
CALL _strayintr(SB); BYTE $0x20 /* VectorLAPIC */
|
|
|
440 |
CALL _strayintr(SB); BYTE $0x21
|
|
|
441 |
CALL _strayintr(SB); BYTE $0x22
|
|
|
442 |
CALL _strayintr(SB); BYTE $0x23
|
|
|
443 |
CALL _strayintr(SB); BYTE $0x24
|
|
|
444 |
CALL _strayintr(SB); BYTE $0x25
|
|
|
445 |
CALL _strayintr(SB); BYTE $0x26
|
|
|
446 |
CALL _strayintr(SB); BYTE $0x27
|
|
|
447 |
CALL _strayintr(SB); BYTE $0x28
|
|
|
448 |
CALL _strayintr(SB); BYTE $0x29
|
|
|
449 |
CALL _strayintr(SB); BYTE $0x2A
|
|
|
450 |
CALL _strayintr(SB); BYTE $0x2B
|
|
|
451 |
CALL _strayintr(SB); BYTE $0x2C
|
|
|
452 |
CALL _strayintr(SB); BYTE $0x2D
|
|
|
453 |
CALL _strayintr(SB); BYTE $0x2E
|
|
|
454 |
CALL _strayintr(SB); BYTE $0x2F
|
|
|
455 |
CALL _strayintr(SB); BYTE $0x30
|
|
|
456 |
CALL _strayintr(SB); BYTE $0x31
|
|
|
457 |
CALL _strayintr(SB); BYTE $0x32
|
|
|
458 |
CALL _strayintr(SB); BYTE $0x33
|
|
|
459 |
CALL _strayintr(SB); BYTE $0x34
|
|
|
460 |
CALL _strayintr(SB); BYTE $0x35
|
|
|
461 |
CALL _strayintr(SB); BYTE $0x36
|
|
|
462 |
CALL _strayintr(SB); BYTE $0x37
|
|
|
463 |
CALL _strayintr(SB); BYTE $0x38
|
|
|
464 |
CALL _strayintr(SB); BYTE $0x39
|
|
|
465 |
CALL _strayintr(SB); BYTE $0x3A
|
|
|
466 |
CALL _strayintr(SB); BYTE $0x3B
|
|
|
467 |
CALL _strayintr(SB); BYTE $0x3C
|
|
|
468 |
CALL _strayintr(SB); BYTE $0x3D
|
|
|
469 |
CALL _strayintr(SB); BYTE $0x3E
|
|
|
470 |
CALL _strayintr(SB); BYTE $0x3F
|
|
|
471 |
// CALL _syscallintr(SB); BYTE $0x40 /* VectorSYSCALL */
|
|
|
472 |
CALL _strayintr(SB); BYTE $0x40
|
|
|
473 |
CALL _strayintr(SB); BYTE $0x41
|
|
|
474 |
CALL _strayintr(SB); BYTE $0x42
|
|
|
475 |
CALL _strayintr(SB); BYTE $0x43
|
|
|
476 |
CALL _strayintr(SB); BYTE $0x44
|
|
|
477 |
CALL _strayintr(SB); BYTE $0x45
|
|
|
478 |
CALL _strayintr(SB); BYTE $0x46
|
|
|
479 |
CALL _strayintr(SB); BYTE $0x47
|
|
|
480 |
CALL _strayintr(SB); BYTE $0x48
|
|
|
481 |
CALL _strayintr(SB); BYTE $0x49
|
|
|
482 |
CALL _strayintr(SB); BYTE $0x4A
|
|
|
483 |
CALL _strayintr(SB); BYTE $0x4B
|
|
|
484 |
CALL _strayintr(SB); BYTE $0x4C
|
|
|
485 |
CALL _strayintr(SB); BYTE $0x4D
|
|
|
486 |
CALL _strayintr(SB); BYTE $0x4E
|
|
|
487 |
CALL _strayintr(SB); BYTE $0x4F
|
|
|
488 |
CALL _strayintr(SB); BYTE $0x50
|
|
|
489 |
CALL _strayintr(SB); BYTE $0x51
|
|
|
490 |
CALL _strayintr(SB); BYTE $0x52
|
|
|
491 |
CALL _strayintr(SB); BYTE $0x53
|
|
|
492 |
CALL _strayintr(SB); BYTE $0x54
|
|
|
493 |
CALL _strayintr(SB); BYTE $0x55
|
|
|
494 |
CALL _strayintr(SB); BYTE $0x56
|
|
|
495 |
CALL _strayintr(SB); BYTE $0x57
|
|
|
496 |
CALL _strayintr(SB); BYTE $0x58
|
|
|
497 |
CALL _strayintr(SB); BYTE $0x59
|
|
|
498 |
CALL _strayintr(SB); BYTE $0x5A
|
|
|
499 |
CALL _strayintr(SB); BYTE $0x5B
|
|
|
500 |
CALL _strayintr(SB); BYTE $0x5C
|
|
|
501 |
CALL _strayintr(SB); BYTE $0x5D
|
|
|
502 |
CALL _strayintr(SB); BYTE $0x5E
|
|
|
503 |
CALL _strayintr(SB); BYTE $0x5F
|
|
|
504 |
CALL _strayintr(SB); BYTE $0x60
|
|
|
505 |
CALL _strayintr(SB); BYTE $0x61
|
|
|
506 |
CALL _strayintr(SB); BYTE $0x62
|
|
|
507 |
CALL _strayintr(SB); BYTE $0x63
|
|
|
508 |
CALL _strayintr(SB); BYTE $0x64
|
|
|
509 |
CALL _strayintr(SB); BYTE $0x65
|
|
|
510 |
CALL _strayintr(SB); BYTE $0x66
|
|
|
511 |
CALL _strayintr(SB); BYTE $0x67
|
|
|
512 |
CALL _strayintr(SB); BYTE $0x68
|
|
|
513 |
CALL _strayintr(SB); BYTE $0x69
|
|
|
514 |
CALL _strayintr(SB); BYTE $0x6A
|
|
|
515 |
CALL _strayintr(SB); BYTE $0x6B
|
|
|
516 |
CALL _strayintr(SB); BYTE $0x6C
|
|
|
517 |
CALL _strayintr(SB); BYTE $0x6D
|
|
|
518 |
CALL _strayintr(SB); BYTE $0x6E
|
|
|
519 |
CALL _strayintr(SB); BYTE $0x6F
|
|
|
520 |
CALL _strayintr(SB); BYTE $0x70
|
|
|
521 |
CALL _strayintr(SB); BYTE $0x71
|
|
|
522 |
CALL _strayintr(SB); BYTE $0x72
|
|
|
523 |
CALL _strayintr(SB); BYTE $0x73
|
|
|
524 |
CALL _strayintr(SB); BYTE $0x74
|
|
|
525 |
CALL _strayintr(SB); BYTE $0x75
|
|
|
526 |
CALL _strayintr(SB); BYTE $0x76
|
|
|
527 |
CALL _strayintr(SB); BYTE $0x77
|
|
|
528 |
CALL _strayintr(SB); BYTE $0x78
|
|
|
529 |
CALL _strayintr(SB); BYTE $0x79
|
|
|
530 |
CALL _strayintr(SB); BYTE $0x7A
|
|
|
531 |
CALL _strayintr(SB); BYTE $0x7B
|
|
|
532 |
CALL _strayintr(SB); BYTE $0x7C
|
|
|
533 |
CALL _strayintr(SB); BYTE $0x7D
|
|
|
534 |
CALL _strayintr(SB); BYTE $0x7E
|
|
|
535 |
CALL _strayintr(SB); BYTE $0x7F
|
|
|
536 |
CALL _strayintr(SB); BYTE $0x80 /* Vector[A]PIC */
|
|
|
537 |
CALL _strayintr(SB); BYTE $0x81
|
|
|
538 |
CALL _strayintr(SB); BYTE $0x82
|
|
|
539 |
CALL _strayintr(SB); BYTE $0x83
|
|
|
540 |
CALL _strayintr(SB); BYTE $0x84
|
|
|
541 |
CALL _strayintr(SB); BYTE $0x85
|
|
|
542 |
CALL _strayintr(SB); BYTE $0x86
|
|
|
543 |
CALL _strayintr(SB); BYTE $0x87
|
|
|
544 |
CALL _strayintr(SB); BYTE $0x88
|
|
|
545 |
CALL _strayintr(SB); BYTE $0x89
|
|
|
546 |
CALL _strayintr(SB); BYTE $0x8A
|
|
|
547 |
CALL _strayintr(SB); BYTE $0x8B
|
|
|
548 |
CALL _strayintr(SB); BYTE $0x8C
|
|
|
549 |
CALL _strayintr(SB); BYTE $0x8D
|
|
|
550 |
CALL _strayintr(SB); BYTE $0x8E
|
|
|
551 |
CALL _strayintr(SB); BYTE $0x8F
|
|
|
552 |
CALL _strayintr(SB); BYTE $0x90
|
|
|
553 |
CALL _strayintr(SB); BYTE $0x91
|
|
|
554 |
CALL _strayintr(SB); BYTE $0x92
|
|
|
555 |
CALL _strayintr(SB); BYTE $0x93
|
|
|
556 |
CALL _strayintr(SB); BYTE $0x94
|
|
|
557 |
CALL _strayintr(SB); BYTE $0x95
|
|
|
558 |
CALL _strayintr(SB); BYTE $0x96
|
|
|
559 |
CALL _strayintr(SB); BYTE $0x97
|
|
|
560 |
CALL _strayintr(SB); BYTE $0x98
|
|
|
561 |
CALL _strayintr(SB); BYTE $0x99
|
|
|
562 |
CALL _strayintr(SB); BYTE $0x9A
|
|
|
563 |
CALL _strayintr(SB); BYTE $0x9B
|
|
|
564 |
CALL _strayintr(SB); BYTE $0x9C
|
|
|
565 |
CALL _strayintr(SB); BYTE $0x9D
|
|
|
566 |
CALL _strayintr(SB); BYTE $0x9E
|
|
|
567 |
CALL _strayintr(SB); BYTE $0x9F
|
|
|
568 |
CALL _strayintr(SB); BYTE $0xA0
|
|
|
569 |
CALL _strayintr(SB); BYTE $0xA1
|
|
|
570 |
CALL _strayintr(SB); BYTE $0xA2
|
|
|
571 |
CALL _strayintr(SB); BYTE $0xA3
|
|
|
572 |
CALL _strayintr(SB); BYTE $0xA4
|
|
|
573 |
CALL _strayintr(SB); BYTE $0xA5
|
|
|
574 |
CALL _strayintr(SB); BYTE $0xA6
|
|
|
575 |
CALL _strayintr(SB); BYTE $0xA7
|
|
|
576 |
CALL _strayintr(SB); BYTE $0xA8
|
|
|
577 |
CALL _strayintr(SB); BYTE $0xA9
|
|
|
578 |
CALL _strayintr(SB); BYTE $0xAA
|
|
|
579 |
CALL _strayintr(SB); BYTE $0xAB
|
|
|
580 |
CALL _strayintr(SB); BYTE $0xAC
|
|
|
581 |
CALL _strayintr(SB); BYTE $0xAD
|
|
|
582 |
CALL _strayintr(SB); BYTE $0xAE
|
|
|
583 |
CALL _strayintr(SB); BYTE $0xAF
|
|
|
584 |
CALL _strayintr(SB); BYTE $0xB0
|
|
|
585 |
CALL _strayintr(SB); BYTE $0xB1
|
|
|
586 |
CALL _strayintr(SB); BYTE $0xB2
|
|
|
587 |
CALL _strayintr(SB); BYTE $0xB3
|
|
|
588 |
CALL _strayintr(SB); BYTE $0xB4
|
|
|
589 |
CALL _strayintr(SB); BYTE $0xB5
|
|
|
590 |
CALL _strayintr(SB); BYTE $0xB6
|
|
|
591 |
CALL _strayintr(SB); BYTE $0xB7
|
|
|
592 |
CALL _strayintr(SB); BYTE $0xB8
|
|
|
593 |
CALL _strayintr(SB); BYTE $0xB9
|
|
|
594 |
CALL _strayintr(SB); BYTE $0xBA
|
|
|
595 |
CALL _strayintr(SB); BYTE $0xBB
|
|
|
596 |
CALL _strayintr(SB); BYTE $0xBC
|
|
|
597 |
CALL _strayintr(SB); BYTE $0xBD
|
|
|
598 |
CALL _strayintr(SB); BYTE $0xBE
|
|
|
599 |
CALL _strayintr(SB); BYTE $0xBF
|
|
|
600 |
CALL _strayintr(SB); BYTE $0xC0
|
|
|
601 |
CALL _strayintr(SB); BYTE $0xC1
|
|
|
602 |
CALL _strayintr(SB); BYTE $0xC2
|
|
|
603 |
CALL _strayintr(SB); BYTE $0xC3
|
|
|
604 |
CALL _strayintr(SB); BYTE $0xC4
|
|
|
605 |
CALL _strayintr(SB); BYTE $0xC5
|
|
|
606 |
CALL _strayintr(SB); BYTE $0xC6
|
|
|
607 |
CALL _strayintr(SB); BYTE $0xC7
|
|
|
608 |
CALL _strayintr(SB); BYTE $0xC8
|
|
|
609 |
CALL _strayintr(SB); BYTE $0xC9
|
|
|
610 |
CALL _strayintr(SB); BYTE $0xCA
|
|
|
611 |
CALL _strayintr(SB); BYTE $0xCB
|
|
|
612 |
CALL _strayintr(SB); BYTE $0xCC
|
|
|
613 |
CALL _strayintr(SB); BYTE $0xCD
|
|
|
614 |
CALL _strayintr(SB); BYTE $0xCE
|
|
|
615 |
CALL _strayintr(SB); BYTE $0xCF
|
|
|
616 |
CALL _strayintr(SB); BYTE $0xD0
|
|
|
617 |
CALL _strayintr(SB); BYTE $0xD1
|
|
|
618 |
CALL _strayintr(SB); BYTE $0xD2
|
|
|
619 |
CALL _strayintr(SB); BYTE $0xD3
|
|
|
620 |
CALL _strayintr(SB); BYTE $0xD4
|
|
|
621 |
CALL _strayintr(SB); BYTE $0xD5
|
|
|
622 |
CALL _strayintr(SB); BYTE $0xD6
|
|
|
623 |
CALL _strayintr(SB); BYTE $0xD7
|
|
|
624 |
CALL _strayintr(SB); BYTE $0xD8
|
|
|
625 |
CALL _strayintr(SB); BYTE $0xD9
|
|
|
626 |
CALL _strayintr(SB); BYTE $0xDA
|
|
|
627 |
CALL _strayintr(SB); BYTE $0xDB
|
|
|
628 |
CALL _strayintr(SB); BYTE $0xDC
|
|
|
629 |
CALL _strayintr(SB); BYTE $0xDD
|
|
|
630 |
CALL _strayintr(SB); BYTE $0xDE
|
|
|
631 |
CALL _strayintr(SB); BYTE $0xDF
|
|
|
632 |
CALL _strayintr(SB); BYTE $0xE0
|
|
|
633 |
CALL _strayintr(SB); BYTE $0xE1
|
|
|
634 |
CALL _strayintr(SB); BYTE $0xE2
|
|
|
635 |
CALL _strayintr(SB); BYTE $0xE3
|
|
|
636 |
CALL _strayintr(SB); BYTE $0xE4
|
|
|
637 |
CALL _strayintr(SB); BYTE $0xE5
|
|
|
638 |
CALL _strayintr(SB); BYTE $0xE6
|
|
|
639 |
CALL _strayintr(SB); BYTE $0xE7
|
|
|
640 |
CALL _strayintr(SB); BYTE $0xE8
|
|
|
641 |
CALL _strayintr(SB); BYTE $0xE9
|
|
|
642 |
CALL _strayintr(SB); BYTE $0xEA
|
|
|
643 |
CALL _strayintr(SB); BYTE $0xEB
|
|
|
644 |
CALL _strayintr(SB); BYTE $0xEC
|
|
|
645 |
CALL _strayintr(SB); BYTE $0xED
|
|
|
646 |
CALL _strayintr(SB); BYTE $0xEE
|
|
|
647 |
CALL _strayintr(SB); BYTE $0xEF
|
|
|
648 |
CALL _strayintr(SB); BYTE $0xF0
|
|
|
649 |
CALL _strayintr(SB); BYTE $0xF1
|
|
|
650 |
CALL _strayintr(SB); BYTE $0xF2
|
|
|
651 |
CALL _strayintr(SB); BYTE $0xF3
|
|
|
652 |
CALL _strayintr(SB); BYTE $0xF4
|
|
|
653 |
CALL _strayintr(SB); BYTE $0xF5
|
|
|
654 |
CALL _strayintr(SB); BYTE $0xF6
|
|
|
655 |
CALL _strayintr(SB); BYTE $0xF7
|
|
|
656 |
CALL _strayintr(SB); BYTE $0xF8
|
|
|
657 |
CALL _strayintr(SB); BYTE $0xF9
|
|
|
658 |
CALL _strayintr(SB); BYTE $0xFA
|
|
|
659 |
CALL _strayintr(SB); BYTE $0xFB
|
|
|
660 |
CALL _strayintr(SB); BYTE $0xFC
|
|
|
661 |
CALL _strayintr(SB); BYTE $0xFD
|
|
|
662 |
CALL _strayintr(SB); BYTE $0xFE
|
|
|
663 |
CALL _strayintr(SB); BYTE $0xFF
|