5 #define DELAY BYTE $0xEB; BYTE $0x00 /* JMP .+2 */
7 #define pFARJMP32(s, o) BYTE $0xea; /* far jump to ptr32:16 */\
11 * Enter here in 32-bit protected mode. Welcome to 1982.
12 * Make sure the GDT is set as it should be:
14 * load the GDT with the table in _gdt32p;
15 * load all the data segments
16 * load the code segment via a far jump.
18 TEXT _protected<>(SB), 1, $-4
21 MOVL $_gdtptr32p<>-KZERO(SB), AX
24 MOVL $SELECTOR(2, SELGDT, 0), AX
31 pFARJMP32(SELECTOR(3, SELGDT, 0), _warp64<>-KZERO(SB))
33 BYTE $0x90 /* align */
36 * Must be 4-byte aligned.
38 TEXT _multibootheader<>(SB), 1, $-4
39 LONG $0x1BADB002 /* magic */
40 LONG $0x00010007 /* flags */
41 LONG $-(0x1BADB002 + 0x00010007) /* checksum */
42 LONG $_multibootheader<>-KZERO(SB) /* header_addr */
43 LONG $_protected<>-KZERO(SB) /* load_addr */
44 LONG $edata-KZERO(SB) /* load_end_addr */
45 LONG $end-KZERO(SB) /* bss_end_addr */
46 LONG $_multibootentry<>-KZERO(SB) /* entry_addr */
47 LONG $0 /* mode_type */
53 * the kernel expects the data segment to be page-aligned
54 * multiboot bootloaders put the data segment right behind text
56 TEXT _multibootentry<>(SB), 1, $-4
57 MOVL $etext-KZERO(SB), SI
61 MOVL $edata-KZERO(SB), CX
65 INCL CX /* one more for post decrement */
68 MOVL BX, multibootptr-KZERO(SB)
69 MOVL $_protected<>-KZERO(SB), AX
72 /* multiboot structure pointer (physical address) */
73 TEXT multibootptr(SB), 1, $-4
76 TEXT _gdt<>(SB), 1, $-4
81 /* (KESEG) 64 bit long mode exec segment */
83 LONG $(SEGL|SEGG|SEGP|(0xF<<16)|SEGPL(0)|SEGEXEC|SEGR)
85 /* 32 bit data segment descriptor for 4 gigabytes (PL 0) */
87 LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
89 /* 32 bit exec segment descriptor for 4 gigabytes (PL 0) */
91 LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
94 TEXT _gdtptr32p<>(SB), 1, $-4
96 LONG $_gdt<>-KZERO(SB)
98 TEXT _gdtptr64p<>(SB), 1, $-4
100 QUAD $_gdt<>-KZERO(SB)
102 TEXT _gdtptr64v<>(SB), 1, $-4
107 * Macros for accessing page table entries; change the
108 * C-style array-index macros into a page table byte offset
110 #define PML4O(v) ((PTLX((v), 3))<<3)
111 #define PDPO(v) ((PTLX((v), 2))<<3)
112 #define PDO(v) ((PTLX((v), 1))<<3)
113 #define PTO(v) ((PTLX((v), 0))<<3)
115 TEXT _warp64<>(SB), 1, $-4
117 /* clear mach and page tables */
118 MOVL $((CPU0END-CPU0PML4)>>2), CX
119 MOVL $(CPU0PML4-KZERO), SI
125 MOVL SI, AX /* PML4 */
127 ADDL $(PTSZ|PTEWRITE|PTEVALID), DX /* PDP at PML4 + PTSZ */
128 MOVL DX, PML4O(0)(AX) /* PML4E for double-map */
129 MOVL DX, PML4O(KZERO)(AX) /* PML4E for KZERO */
131 ADDL $PTSZ, AX /* PDP at PML4 + PTSZ */
132 ADDL $PTSZ, DX /* PD0 at PML4 + 2*PTSZ */
133 MOVL DX, PDPO(0)(AX) /* PDPE for double-map */
134 MOVL DX, PDPO(KZERO)(AX) /* PDPE for KZERO */
137 * add PDPE for KZERO+1GB early as Vmware
138 * hangs when modifying kernel PDP
140 ADDL $PTSZ, DX /* PD1 */
141 MOVL DX, PDPO(KZERO+GiB)(AX)
143 ADDL $PTSZ, AX /* PD0 at PML4 + 2*PTSZ */
144 MOVL $(PTESIZE|PTEGLOBAL|PTEWRITE|PTEVALID), DX
145 MOVL DX, PDO(0)(AX) /* PDE for double-map */
148 * map from KZERO to end using 2MB pages
151 MOVL $end-KZERO(SB), CX
153 ADDL $(16*1024), CX /* qemu puts multiboot data after the kernel */
155 ADDL $(PGLSZ(1)-1), CX
156 ANDL $~(PGLSZ(1)-1), CX
157 MOVL CX, MemMin-KZERO(SB) /* see memory.c */
158 SHRL $(1*PTSHIFT+PGSHIFT), CX
166 * Enable and activate Long Mode. From the manual:
167 * make sure Page Size Extentions are off, and Page Global
168 * Extensions and Physical Address Extensions are on in CR4;
169 * set Long Mode Enable in the Extended Feature Enable MSR;
170 * set Paging Enable in CR0;
171 * make an inter-segment jump to the Long Mode code.
172 * It's all in 32-bit mode until the jump is made.
174 TEXT _lme<>(SB), 1, $-4
175 MOVL SI, CR3 /* load the mmu */
179 ANDL $~0x00000010, AX /* Page Size */
180 ORL $0x000000A0, AX /* Page Global, Phys. Address */
183 MOVL $0xc0000080, CX /* Extended Feature Enable */
185 ORL $0x00000100, AX /* Long Mode Enable */
189 ANDL $~0x6000000a, DX
190 ORL $0x80010000, DX /* Paging Enable, Write Protect */
193 pFARJMP32(SELECTOR(KESEG, SELGDT, 0), _identity<>-KZERO(SB))
196 * Long mode. Welcome to 2003.
197 * Jump out of the identity map space;
198 * load a proper long mode GDT.
202 TEXT _identity<>(SB), 1, $-4
203 MOVQ $_start64v<>(SB), AX
206 TEXT _start64v<>(SB), 1, $-4
207 MOVQ $_gdtptr64v<>(SB), AX
211 MOVW AX, DS /* not used in long mode */
212 MOVW AX, ES /* not used in long mode */
215 MOVW AX, SS /* not used in long mode */
219 MOVQ $(CPU0MACH+MACHSIZE), SP
220 MOVQ $(CPU0MACH), RMACH
221 MOVQ AX, RUSER /* up = 0; */
226 SUBQ DI, CX /* end-edata bytes */
227 SHRQ $2, CX /* end-edata doublewords */
230 REP; STOSL /* clear BSS */
232 PUSHQ AX /* clear flags */
238 * Park a processor. Should never fall through a return from main to here,
239 * should only be called by application processors when shutting down.
241 TEXT idle(SB), 1, $-4
248 * The CPUID instruction is always supported on the amd64.
251 MOVL RARG, AX /* function in AX */
265 MOVL RARG, DX /* MOVL port+0(FP), DX */
270 TEXT insb(SB), 1, $-4
271 MOVL RARG, DX /* MOVL port+0(FP), DX */
272 MOVQ address+8(FP), DI
273 MOVL count+16(FP), CX
279 MOVL RARG, DX /* MOVL port+0(FP), DX */
284 TEXT inss(SB), 1, $-4
285 MOVL RARG, DX /* MOVL port+0(FP), DX */
286 MOVQ address+8(FP), DI
287 MOVL count+16(FP), CX
293 MOVL RARG, DX /* MOVL port+0(FP), DX */
297 TEXT insl(SB), 1, $-4
298 MOVL RARG, DX /* MOVL port+0(FP), DX */
299 MOVQ address+8(FP), DI
300 MOVL count+16(FP), CX
305 TEXT outb(SB), 1, $-1
306 MOVL RARG, DX /* MOVL port+0(FP), DX */
311 TEXT outsb(SB), 1, $-4
312 MOVL RARG, DX /* MOVL port+0(FP), DX */
313 MOVQ address+8(FP), SI
314 MOVL count+16(FP), CX
319 TEXT outs(SB), 1, $-4
320 MOVL RARG, DX /* MOVL port+0(FP), DX */
325 TEXT outss(SB), 1, $-4
326 MOVL RARG, DX /* MOVL port+0(FP), DX */
327 MOVQ address+8(FP), SI
328 MOVL count+16(FP), CX
333 TEXT outl(SB), 1, $-4
334 MOVL RARG, DX /* MOVL port+0(FP), DX */
339 TEXT outsl(SB), 1, $-4
340 MOVL RARG, DX /* MOVL port+0(FP), DX */
341 MOVQ address+8(FP), SI
342 MOVL count+16(FP), CX
347 TEXT getgdt(SB), 1, $-4
349 MOVL GDTR, (AX) /* Note: 10 bytes returned */
352 TEXT lgdt(SB), $0 /* GDTR - global descriptor table */
357 TEXT lidt(SB), $0 /* IDTR - interrupt descriptor table */
368 * Read/write various system registers.
370 TEXT getcr0(SB), 1, $-4 /* Processor Control */
374 TEXT putcr0(SB), 1, $-4
378 TEXT getcr2(SB), 1, $-4 /* #PF Linear Address */
382 TEXT putcr2(SB), 1, $-4
386 TEXT getcr3(SB), 1, $-4 /* PML4 Base */
390 TEXT putcr3(SB), 1, $-4
394 TEXT getcr4(SB), 1, $-4 /* Extensions */
398 TEXT putcr4(SB), 1, $-4
402 TEXT mb386(SB), 1, $-4 /* hack */
403 TEXT mb586(SB), 1, $-4
411 TEXT bios32call(SB), 1, $-4
417 * Basic timing loop to determine CPU frequency.
419 TEXT aamloop(SB), 1, $-4
425 TEXT _cycles(SB), 1, $-4 /* time stamp counter */
427 MOVL AX, 0(RARG) /* lo */
428 MOVL DX, 4(RARG) /* hi */
431 TEXT rdmsr(SB), 1, $-4 /* Model-Specific Register */
434 TEXT _rdmsrinst(SB), $0
436 MOVQ vlong+8(FP), CX /* &vlong */
437 MOVL AX, 0(CX) /* lo */
438 MOVL DX, 4(CX) /* hi */
439 MOVQ BP, AX /* BP set to -1 if traped */
442 TEXT wrmsr(SB), 1, $-4
447 TEXT _wrmsrinst(SB), $0
449 MOVQ BP, AX /* BP set to -1 if traped */
452 TEXT invlpg(SB), 1, $-4 /* INVLPG va+0(FP) */
459 TEXT wbinvd(SB), 1, $-4
466 TEXT lfence(SB), 1, $-4
470 TEXT mfence(SB), 1, $-4
474 TEXT sfence(SB), 1, $-4
479 * Note: CLI and STI are not serialising instructions.
480 * Is that assumed anywhere?
482 TEXT splhi(SB), 1, $-4
486 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
487 JZ _alreadyhi /* use CMOVLEQ etc. here? */
490 MOVQ BX, 8(RMACH) /* save PC in m->splpc */
496 TEXT spllo(SB), 1, $-4
500 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
501 JNZ _alreadylo /* use CMOVLEQ etc. here? */
503 MOVQ $0, 8(RMACH) /* clear m->splpc */
509 TEXT splx(SB), 1, $-4
510 TESTQ $0x200, RARG /* 0x200 - Interrupt Flag */
514 TEXT spldone(SB), 1, $-4
517 TEXT islo(SB), 1, $-4
520 ANDQ $0x200, AX /* 0x200 - Interrupt Flag */
527 TEXT _tas(SB), 1, $-4
529 XCHGL AX, (RARG) /* */
532 TEXT cmpswap486(SB), 1, $-4
536 LOCK; CMPXCHGL BX, (RARG)
537 MOVL $1, AX /* use CMOVLEQ etc. here? */
546 * Label consists of a stack pointer and a programme counter
548 TEXT gotolabel(SB), 1, $-4
549 MOVQ 0(RARG), SP /* restore SP */
550 MOVQ 8(RARG), AX /* put return PC on the stack */
552 MOVL $1, AX /* return 1 */
555 TEXT setlabel(SB), 1, $-4
556 MOVQ SP, 0(RARG) /* store SP */
557 MOVQ 0(SP), BX /* store return PC */
559 MOVL $0, AX /* return 0 */
562 TEXT halt(SB), 1, $-4
573 TEXT mwait(SB), 1, $-4
579 BYTE $0x0f; BYTE $0x01; BYTE $0xc8 /* MONITOR */
584 BYTE $0x0f; BYTE $0x01; BYTE $0xc9 /* MWAIT */
589 * SIMD Floating Point.
590 * Note: for x87 instructions which have both a 'wait' and 'nowait' version,
591 * 8a only knows the 'wait' mnemonic but does NOT insertthe WAIT prefix byte
592 * (i.e. they act like their FNxxx variations) so WAIT instructions must be
593 * explicitly placed in the code if necessary.
595 TEXT _clts(SB), 1, $-4
599 TEXT _fldcw(SB), 1, $-4 /* Load x87 FPU Control Word */
604 TEXT _fnclex(SB), 1, $-4
608 TEXT _fninit(SB), 1, $-4
612 TEXT _fxrstor(SB), 1, $-4
616 TEXT _fxsave(SB), 1, $-4
620 TEXT _fwait(SB), 1, $-4
624 TEXT _ldmxcsr(SB), 1, $-4 /* Load MXCSR */
625 MOVQ RARG, mxcsr+0(FP)
629 TEXT _stts(SB), 1, $-4
635 TEXT mul64fract(SB), 1, $-4
637 MULQ b+16(FP) /* a*b */
642 #define RDRANDAX BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
643 #define RDRAND64AX BYTE $0x48; BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
645 TEXT rdrand32(SB), $-4
651 TEXT rdrand64(SB), $-4
657 TEXT rdrandbuf(SB), $0
660 MOVLQZX cnt+8(FP), CX
672 MOVLQZX cnt+8(FP), CX
685 MOVLQZX cnt+8(FP), CX
699 /* debug register access */
701 TEXT putdr(SB), 1, $-4
705 TEXT putdr01236(SB), 1, $-4
718 TEXT getdr6(SB), 1, $-4
722 TEXT putdr6(SB), 1, $-4
726 TEXT putdr7(SB), 1, $-4
730 /* VMX instructions */
731 TEXT vmxon(SB), 1, $-4
734 BYTE $0xf3; BYTE $0x0f; BYTE $0xc7; BYTE $0x74; BYTE $0x24; BYTE $0x08
737 TEXT vmxoff(SB), 1, $-4
738 BYTE $0x0f; BYTE $0x01; BYTE $0xc4
741 TEXT vmclear(SB), 1, $-4
744 BYTE $0x66; BYTE $0x0f; BYTE $0xc7; BYTE $0x74; BYTE $0x24; BYTE $0x08
747 TEXT vmlaunch(SB), 1, $-4
750 BYTE $0x0f; BYTE $0x79; BYTE $0xfa /* VMWRITE DX, DI */
753 MOVQ $vmrestore(SB), DX
754 BYTE $0x0f; BYTE $0x79; BYTE $0xfa /* VMWRITE DX, DI */
758 MOVL resume+8(FP), AX
776 BYTE $0x0f; BYTE $0x01; BYTE $0xc2 /* VMLAUNCH */
779 BYTE $0x0f; BYTE $0x01; BYTE $0xc3 /* VMRESUME */
782 TEXT vmrestore(SB), 1, $-4
801 BYTE $0x65; MOVQ 0, RMACH /* MOVQ GS:(0), RMACH */
802 MOVQ 16(RMACH), RUSER
806 TEXT vmptrld(SB), 1, $-4
809 BYTE $0x0f; BYTE $0xc7; BYTE $0x74; BYTE $0x24; BYTE $0x08
812 TEXT vmwrite(SB), 1, $-4
815 BYTE $0x0f; BYTE $0x79; BYTE $0xea
818 TEXT vmread(SB), 1, $-4
820 /* VMREAD BP, (DI) */
821 BYTE $0x0f; BYTE $0x78; BYTE $0x2f
824 TEXT invept(SB), 1, $-4
825 /* INVEPT BP, 16(SP) */
826 BYTE $0x66; BYTE $0x0f; BYTE $0x38; BYTE $0x80; BYTE $0x6c; BYTE $0x24; BYTE $0x10
829 TEXT invvpid(SB), 1, $-4
830 /* INVVPID BP, 16(SP) */
831 BYTE $0x66; BYTE $0x0f; BYTE $0x38; BYTE $0x81; BYTE $0x6c; BYTE $0x24; BYTE $0x10
848 TEXT touser(SB), 1, $-4
855 MOVQ $(UTZERO+0x28), CX /* ip */
856 MOVL $0x200, R11 /* flags */
857 MOVQ RARG, SP /* sp */
859 BYTE $0x48; SYSRET /* SYSRETQ */
863 TEXT syscallentry(SB), 1, $-4
865 BYTE $0x65; MOVQ 0, AX /* m-> (MOVQ GS:0x0, AX) */
866 MOVQ 16(AX), BX /* m->proc */
868 MOVQ 16(BX), SP /* m->proc->kstack */
871 PUSHQ $UDSEL /* old stack segment */
872 PUSHQ R13 /* old sp */
873 PUSHQ R11 /* old flags */
874 PUSHQ $UESEL /* old code segment */
875 PUSHQ CX /* old ip */
876 PUSHQ $0 /* error code */
877 PUSHQ $64 /* trap number (VectorSYSCALL) */
879 SUBQ $(8 + 23*8-7*8), SP /* arg + sizeof(Ureg)-pushed */
881 MOVQ RMACH, (15*8)(SP) /* old r15 */
882 MOVQ RUSER, (14*8)(SP) /* old r14 */
884 MOVQ RARG, (7*8)(SP) /* system call number */
886 MOVQ AX, RMACH /* m */
887 MOVQ BX, RUSER /* up */
889 LEAQ 8(SP), RARG /* Ureg* arg */
893 TEXT forkret(SB), 1, $-4
897 MOVQ 8(SP), AX /* return value */
899 MOVQ (15*8)(SP), RMACH /* r15 */
900 MOVQ (14*8)(SP), RUSER /* r14 */
902 MOVQ (19*8)(SP), CX /* ip */
903 MOVQ (21*8)(SP), R11 /* flags */
904 MOVQ (22*8)(SP), SP /* sp */
906 BYTE $0x48; SYSRET /* SYSRETQ */
908 TEXT noteret(SB), 1, $-4
913 * Interrupt/exception handling.
916 TEXT _strayintr(SB), 1, $-4 /* no error code pushed */
917 PUSHQ AX /* save AX */
918 MOVQ 8(SP), AX /* vectortable(SB) PC */
921 TEXT _strayintrx(SB), 1, $-4 /* error code pushed */
927 SUBQ $24, SP /* R1[45], [DEFG]S */
928 CMPW 48(SP), $KESEL /* old CS */
935 BYTE $0x65; MOVQ 0, RMACH /* m-> (MOVQ GS:0x0, R15) */
936 MOVQ 16(RMACH), RUSER /* up */
986 TEXT vectortable(SB), $0
987 CALL _strayintr(SB); BYTE $0x00 /* divide error */
988 CALL _strayintr(SB); BYTE $0x01 /* debug exception */
989 CALL _strayintr(SB); BYTE $0x02 /* NMI interrupt */
990 CALL _strayintr(SB); BYTE $0x03 /* breakpoint */
991 CALL _strayintr(SB); BYTE $0x04 /* overflow */
992 CALL _strayintr(SB); BYTE $0x05 /* bound */
993 CALL _strayintr(SB); BYTE $0x06 /* invalid opcode */
994 CALL _strayintr(SB); BYTE $0x07 /* no coprocessor available */
995 CALL _strayintrx(SB); BYTE $0x08 /* double fault */
996 CALL _strayintr(SB); BYTE $0x09 /* coprocessor segment overflow */
997 CALL _strayintrx(SB); BYTE $0x0A /* invalid TSS */
998 CALL _strayintrx(SB); BYTE $0x0B /* segment not available */
999 CALL _strayintrx(SB); BYTE $0x0C /* stack exception */
1000 CALL _strayintrx(SB); BYTE $0x0D /* general protection error */
1001 CALL _strayintrx(SB); BYTE $0x0E /* page fault */
1002 CALL _strayintr(SB); BYTE $0x0F /* */
1003 CALL _strayintr(SB); BYTE $0x10 /* coprocessor error */
1004 CALL _strayintrx(SB); BYTE $0x11 /* alignment check */
1005 CALL _strayintr(SB); BYTE $0x12 /* machine check */
1006 CALL _strayintr(SB); BYTE $0x13 /* simd error */
1007 CALL _strayintr(SB); BYTE $0x14
1008 CALL _strayintr(SB); BYTE $0x15
1009 CALL _strayintr(SB); BYTE $0x16
1010 CALL _strayintr(SB); BYTE $0x17
1011 CALL _strayintr(SB); BYTE $0x18
1012 CALL _strayintr(SB); BYTE $0x19
1013 CALL _strayintr(SB); BYTE $0x1A
1014 CALL _strayintr(SB); BYTE $0x1B
1015 CALL _strayintr(SB); BYTE $0x1C
1016 CALL _strayintr(SB); BYTE $0x1D
1017 CALL _strayintr(SB); BYTE $0x1E
1018 CALL _strayintr(SB); BYTE $0x1F
1019 CALL _strayintr(SB); BYTE $0x20 /* VectorLAPIC */
1020 CALL _strayintr(SB); BYTE $0x21
1021 CALL _strayintr(SB); BYTE $0x22
1022 CALL _strayintr(SB); BYTE $0x23
1023 CALL _strayintr(SB); BYTE $0x24
1024 CALL _strayintr(SB); BYTE $0x25
1025 CALL _strayintr(SB); BYTE $0x26
1026 CALL _strayintr(SB); BYTE $0x27
1027 CALL _strayintr(SB); BYTE $0x28
1028 CALL _strayintr(SB); BYTE $0x29
1029 CALL _strayintr(SB); BYTE $0x2A
1030 CALL _strayintr(SB); BYTE $0x2B
1031 CALL _strayintr(SB); BYTE $0x2C
1032 CALL _strayintr(SB); BYTE $0x2D
1033 CALL _strayintr(SB); BYTE $0x2E
1034 CALL _strayintr(SB); BYTE $0x2F
1035 CALL _strayintr(SB); BYTE $0x30
1036 CALL _strayintr(SB); BYTE $0x31
1037 CALL _strayintr(SB); BYTE $0x32
1038 CALL _strayintr(SB); BYTE $0x33
1039 CALL _strayintr(SB); BYTE $0x34
1040 CALL _strayintr(SB); BYTE $0x35
1041 CALL _strayintr(SB); BYTE $0x36
1042 CALL _strayintr(SB); BYTE $0x37
1043 CALL _strayintr(SB); BYTE $0x38
1044 CALL _strayintr(SB); BYTE $0x39
1045 CALL _strayintr(SB); BYTE $0x3A
1046 CALL _strayintr(SB); BYTE $0x3B
1047 CALL _strayintr(SB); BYTE $0x3C
1048 CALL _strayintr(SB); BYTE $0x3D
1049 CALL _strayintr(SB); BYTE $0x3E
1050 CALL _strayintr(SB); BYTE $0x3F
1051 CALL _strayintr(SB); BYTE $0x40 /* was VectorSYSCALL */
1052 CALL _strayintr(SB); BYTE $0x41
1053 CALL _strayintr(SB); BYTE $0x42
1054 CALL _strayintr(SB); BYTE $0x43
1055 CALL _strayintr(SB); BYTE $0x44
1056 CALL _strayintr(SB); BYTE $0x45
1057 CALL _strayintr(SB); BYTE $0x46
1058 CALL _strayintr(SB); BYTE $0x47
1059 CALL _strayintr(SB); BYTE $0x48
1060 CALL _strayintr(SB); BYTE $0x49
1061 CALL _strayintr(SB); BYTE $0x4A
1062 CALL _strayintr(SB); BYTE $0x4B
1063 CALL _strayintr(SB); BYTE $0x4C
1064 CALL _strayintr(SB); BYTE $0x4D
1065 CALL _strayintr(SB); BYTE $0x4E
1066 CALL _strayintr(SB); BYTE $0x4F
1067 CALL _strayintr(SB); BYTE $0x50
1068 CALL _strayintr(SB); BYTE $0x51
1069 CALL _strayintr(SB); BYTE $0x52
1070 CALL _strayintr(SB); BYTE $0x53
1071 CALL _strayintr(SB); BYTE $0x54
1072 CALL _strayintr(SB); BYTE $0x55
1073 CALL _strayintr(SB); BYTE $0x56
1074 CALL _strayintr(SB); BYTE $0x57
1075 CALL _strayintr(SB); BYTE $0x58
1076 CALL _strayintr(SB); BYTE $0x59
1077 CALL _strayintr(SB); BYTE $0x5A
1078 CALL _strayintr(SB); BYTE $0x5B
1079 CALL _strayintr(SB); BYTE $0x5C
1080 CALL _strayintr(SB); BYTE $0x5D
1081 CALL _strayintr(SB); BYTE $0x5E
1082 CALL _strayintr(SB); BYTE $0x5F
1083 CALL _strayintr(SB); BYTE $0x60
1084 CALL _strayintr(SB); BYTE $0x61
1085 CALL _strayintr(SB); BYTE $0x62
1086 CALL _strayintr(SB); BYTE $0x63
1087 CALL _strayintr(SB); BYTE $0x64
1088 CALL _strayintr(SB); BYTE $0x65
1089 CALL _strayintr(SB); BYTE $0x66
1090 CALL _strayintr(SB); BYTE $0x67
1091 CALL _strayintr(SB); BYTE $0x68
1092 CALL _strayintr(SB); BYTE $0x69
1093 CALL _strayintr(SB); BYTE $0x6A
1094 CALL _strayintr(SB); BYTE $0x6B
1095 CALL _strayintr(SB); BYTE $0x6C
1096 CALL _strayintr(SB); BYTE $0x6D
1097 CALL _strayintr(SB); BYTE $0x6E
1098 CALL _strayintr(SB); BYTE $0x6F
1099 CALL _strayintr(SB); BYTE $0x70
1100 CALL _strayintr(SB); BYTE $0x71
1101 CALL _strayintr(SB); BYTE $0x72
1102 CALL _strayintr(SB); BYTE $0x73
1103 CALL _strayintr(SB); BYTE $0x74
1104 CALL _strayintr(SB); BYTE $0x75
1105 CALL _strayintr(SB); BYTE $0x76
1106 CALL _strayintr(SB); BYTE $0x77
1107 CALL _strayintr(SB); BYTE $0x78
1108 CALL _strayintr(SB); BYTE $0x79
1109 CALL _strayintr(SB); BYTE $0x7A
1110 CALL _strayintr(SB); BYTE $0x7B
1111 CALL _strayintr(SB); BYTE $0x7C
1112 CALL _strayintr(SB); BYTE $0x7D
1113 CALL _strayintr(SB); BYTE $0x7E
1114 CALL _strayintr(SB); BYTE $0x7F
1115 CALL _strayintr(SB); BYTE $0x80 /* Vector[A]PIC */
1116 CALL _strayintr(SB); BYTE $0x81
1117 CALL _strayintr(SB); BYTE $0x82
1118 CALL _strayintr(SB); BYTE $0x83
1119 CALL _strayintr(SB); BYTE $0x84
1120 CALL _strayintr(SB); BYTE $0x85
1121 CALL _strayintr(SB); BYTE $0x86
1122 CALL _strayintr(SB); BYTE $0x87
1123 CALL _strayintr(SB); BYTE $0x88
1124 CALL _strayintr(SB); BYTE $0x89
1125 CALL _strayintr(SB); BYTE $0x8A
1126 CALL _strayintr(SB); BYTE $0x8B
1127 CALL _strayintr(SB); BYTE $0x8C
1128 CALL _strayintr(SB); BYTE $0x8D
1129 CALL _strayintr(SB); BYTE $0x8E
1130 CALL _strayintr(SB); BYTE $0x8F
1131 CALL _strayintr(SB); BYTE $0x90
1132 CALL _strayintr(SB); BYTE $0x91
1133 CALL _strayintr(SB); BYTE $0x92
1134 CALL _strayintr(SB); BYTE $0x93
1135 CALL _strayintr(SB); BYTE $0x94
1136 CALL _strayintr(SB); BYTE $0x95
1137 CALL _strayintr(SB); BYTE $0x96
1138 CALL _strayintr(SB); BYTE $0x97
1139 CALL _strayintr(SB); BYTE $0x98
1140 CALL _strayintr(SB); BYTE $0x99
1141 CALL _strayintr(SB); BYTE $0x9A
1142 CALL _strayintr(SB); BYTE $0x9B
1143 CALL _strayintr(SB); BYTE $0x9C
1144 CALL _strayintr(SB); BYTE $0x9D
1145 CALL _strayintr(SB); BYTE $0x9E
1146 CALL _strayintr(SB); BYTE $0x9F
1147 CALL _strayintr(SB); BYTE $0xA0
1148 CALL _strayintr(SB); BYTE $0xA1
1149 CALL _strayintr(SB); BYTE $0xA2
1150 CALL _strayintr(SB); BYTE $0xA3
1151 CALL _strayintr(SB); BYTE $0xA4
1152 CALL _strayintr(SB); BYTE $0xA5
1153 CALL _strayintr(SB); BYTE $0xA6
1154 CALL _strayintr(SB); BYTE $0xA7
1155 CALL _strayintr(SB); BYTE $0xA8
1156 CALL _strayintr(SB); BYTE $0xA9
1157 CALL _strayintr(SB); BYTE $0xAA
1158 CALL _strayintr(SB); BYTE $0xAB
1159 CALL _strayintr(SB); BYTE $0xAC
1160 CALL _strayintr(SB); BYTE $0xAD
1161 CALL _strayintr(SB); BYTE $0xAE
1162 CALL _strayintr(SB); BYTE $0xAF
1163 CALL _strayintr(SB); BYTE $0xB0
1164 CALL _strayintr(SB); BYTE $0xB1
1165 CALL _strayintr(SB); BYTE $0xB2
1166 CALL _strayintr(SB); BYTE $0xB3
1167 CALL _strayintr(SB); BYTE $0xB4
1168 CALL _strayintr(SB); BYTE $0xB5
1169 CALL _strayintr(SB); BYTE $0xB6
1170 CALL _strayintr(SB); BYTE $0xB7
1171 CALL _strayintr(SB); BYTE $0xB8
1172 CALL _strayintr(SB); BYTE $0xB9
1173 CALL _strayintr(SB); BYTE $0xBA
1174 CALL _strayintr(SB); BYTE $0xBB
1175 CALL _strayintr(SB); BYTE $0xBC
1176 CALL _strayintr(SB); BYTE $0xBD
1177 CALL _strayintr(SB); BYTE $0xBE
1178 CALL _strayintr(SB); BYTE $0xBF
1179 CALL _strayintr(SB); BYTE $0xC0
1180 CALL _strayintr(SB); BYTE $0xC1
1181 CALL _strayintr(SB); BYTE $0xC2
1182 CALL _strayintr(SB); BYTE $0xC3
1183 CALL _strayintr(SB); BYTE $0xC4
1184 CALL _strayintr(SB); BYTE $0xC5
1185 CALL _strayintr(SB); BYTE $0xC6
1186 CALL _strayintr(SB); BYTE $0xC7
1187 CALL _strayintr(SB); BYTE $0xC8
1188 CALL _strayintr(SB); BYTE $0xC9
1189 CALL _strayintr(SB); BYTE $0xCA
1190 CALL _strayintr(SB); BYTE $0xCB
1191 CALL _strayintr(SB); BYTE $0xCC
1192 CALL _strayintr(SB); BYTE $0xCD
1193 CALL _strayintr(SB); BYTE $0xCE
1194 CALL _strayintr(SB); BYTE $0xCF
1195 CALL _strayintr(SB); BYTE $0xD0
1196 CALL _strayintr(SB); BYTE $0xD1
1197 CALL _strayintr(SB); BYTE $0xD2
1198 CALL _strayintr(SB); BYTE $0xD3
1199 CALL _strayintr(SB); BYTE $0xD4
1200 CALL _strayintr(SB); BYTE $0xD5
1201 CALL _strayintr(SB); BYTE $0xD6
1202 CALL _strayintr(SB); BYTE $0xD7
1203 CALL _strayintr(SB); BYTE $0xD8
1204 CALL _strayintr(SB); BYTE $0xD9
1205 CALL _strayintr(SB); BYTE $0xDA
1206 CALL _strayintr(SB); BYTE $0xDB
1207 CALL _strayintr(SB); BYTE $0xDC
1208 CALL _strayintr(SB); BYTE $0xDD
1209 CALL _strayintr(SB); BYTE $0xDE
1210 CALL _strayintr(SB); BYTE $0xDF
1211 CALL _strayintr(SB); BYTE $0xE0
1212 CALL _strayintr(SB); BYTE $0xE1
1213 CALL _strayintr(SB); BYTE $0xE2
1214 CALL _strayintr(SB); BYTE $0xE3
1215 CALL _strayintr(SB); BYTE $0xE4
1216 CALL _strayintr(SB); BYTE $0xE5
1217 CALL _strayintr(SB); BYTE $0xE6
1218 CALL _strayintr(SB); BYTE $0xE7
1219 CALL _strayintr(SB); BYTE $0xE8
1220 CALL _strayintr(SB); BYTE $0xE9
1221 CALL _strayintr(SB); BYTE $0xEA
1222 CALL _strayintr(SB); BYTE $0xEB
1223 CALL _strayintr(SB); BYTE $0xEC
1224 CALL _strayintr(SB); BYTE $0xED
1225 CALL _strayintr(SB); BYTE $0xEE
1226 CALL _strayintr(SB); BYTE $0xEF
1227 CALL _strayintr(SB); BYTE $0xF0
1228 CALL _strayintr(SB); BYTE $0xF1
1229 CALL _strayintr(SB); BYTE $0xF2
1230 CALL _strayintr(SB); BYTE $0xF3
1231 CALL _strayintr(SB); BYTE $0xF4
1232 CALL _strayintr(SB); BYTE $0xF5
1233 CALL _strayintr(SB); BYTE $0xF6
1234 CALL _strayintr(SB); BYTE $0xF7
1235 CALL _strayintr(SB); BYTE $0xF8
1236 CALL _strayintr(SB); BYTE $0xF9
1237 CALL _strayintr(SB); BYTE $0xFA
1238 CALL _strayintr(SB); BYTE $0xFB
1239 CALL _strayintr(SB); BYTE $0xFC
1240 CALL _strayintr(SB); BYTE $0xFD
1241 CALL _strayintr(SB); BYTE $0xFE
1242 CALL _strayintr(SB); BYTE $0xFF