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 $0x00010003 /* flags */
41 LONG $-(0x1BADB002 + 0x00010003) /* 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 * The CPUID instruction is always supported on the amd64.
241 MOVL RARG, AX /* function in AX */
255 MOVL RARG, DX /* MOVL port+0(FP), DX */
260 TEXT insb(SB), 1, $-4
261 MOVL RARG, DX /* MOVL port+0(FP), DX */
262 MOVQ address+8(FP), DI
263 MOVL count+16(FP), CX
269 MOVL RARG, DX /* MOVL port+0(FP), DX */
274 TEXT inss(SB), 1, $-4
275 MOVL RARG, DX /* MOVL port+0(FP), DX */
276 MOVQ address+8(FP), DI
277 MOVL count+16(FP), CX
283 MOVL RARG, DX /* MOVL port+0(FP), DX */
287 TEXT insl(SB), 1, $-4
288 MOVL RARG, DX /* MOVL port+0(FP), DX */
289 MOVQ address+8(FP), DI
290 MOVL count+16(FP), CX
295 TEXT outb(SB), 1, $-1
296 MOVL RARG, DX /* MOVL port+0(FP), DX */
301 TEXT outsb(SB), 1, $-4
302 MOVL RARG, DX /* MOVL port+0(FP), DX */
303 MOVQ address+8(FP), SI
304 MOVL count+16(FP), CX
309 TEXT outs(SB), 1, $-4
310 MOVL RARG, DX /* MOVL port+0(FP), DX */
315 TEXT outss(SB), 1, $-4
316 MOVL RARG, DX /* MOVL port+0(FP), DX */
317 MOVQ address+8(FP), SI
318 MOVL count+16(FP), CX
323 TEXT outl(SB), 1, $-4
324 MOVL RARG, DX /* MOVL port+0(FP), DX */
329 TEXT outsl(SB), 1, $-4
330 MOVL RARG, DX /* MOVL port+0(FP), DX */
331 MOVQ address+8(FP), SI
332 MOVL count+16(FP), CX
337 TEXT getgdt(SB), 1, $-4
339 MOVL GDTR, (AX) /* Note: 10 bytes returned */
342 TEXT lgdt(SB), $0 /* GDTR - global descriptor table */
347 TEXT lidt(SB), $0 /* IDTR - interrupt descriptor table */
358 * Read/write various system registers.
360 TEXT getcr0(SB), 1, $-4 /* Processor Control */
364 TEXT putcr0(SB), 1, $-4
368 TEXT getcr2(SB), 1, $-4 /* #PF Linear Address */
372 TEXT getcr3(SB), 1, $-4 /* PML4 Base */
376 TEXT putcr3(SB), 1, $-4
380 TEXT getcr4(SB), 1, $-4 /* Extensions */
384 TEXT putcr4(SB), 1, $-4
388 TEXT mb386(SB), 1, $-4 /* hack */
389 TEXT mb586(SB), 1, $-4
395 * Park a processor. Should never fall through a return from main to here,
396 * should only be called by application processors when shutting down.
398 TEXT idle(SB), 1, $-4
407 TEXT bios32call(SB), 1, $-4
413 * Basic timing loop to determine CPU frequency.
415 TEXT aamloop(SB), 1, $-4
421 TEXT _cycles(SB), 1, $-4 /* time stamp counter */
423 MOVL AX, 0(RARG) /* lo */
424 MOVL DX, 4(RARG) /* hi */
427 TEXT rdmsr(SB), 1, $-4 /* Model-Specific Register */
430 TEXT _rdmsrinst(SB), $0
432 MOVQ vlong+8(FP), CX /* &vlong */
433 MOVL AX, 0(CX) /* lo */
434 MOVL DX, 4(CX) /* hi */
435 MOVQ BP, AX /* BP set to -1 if traped */
438 TEXT wrmsr(SB), 1, $-4
443 TEXT _wrmsrinst(SB), $0
445 MOVQ BP, AX /* BP set to -1 if traped */
448 TEXT invlpg(SB), 1, $-4 /* INVLPG va+0(FP) */
455 TEXT wbinvd(SB), 1, $-4
462 TEXT lfence(SB), 1, $-4
466 TEXT mfence(SB), 1, $-4
470 TEXT sfence(SB), 1, $-4
475 * Note: CLI and STI are not serialising instructions.
476 * Is that assumed anywhere?
478 TEXT splhi(SB), 1, $-4
482 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
483 JZ _alreadyhi /* use CMOVLEQ etc. here? */
486 MOVQ BX, 8(RMACH) /* save PC in m->splpc */
492 TEXT spllo(SB), 1, $-4
496 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
497 JNZ _alreadylo /* use CMOVLEQ etc. here? */
499 MOVQ $0, 8(RMACH) /* clear m->splpc */
505 TEXT splx(SB), 1, $-4
506 TESTQ $0x200, RARG /* 0x200 - Interrupt Flag */
510 TEXT spldone(SB), 1, $-4
513 TEXT islo(SB), 1, $-4
516 ANDQ $0x200, AX /* 0x200 - Interrupt Flag */
524 XCHGL AX, (RARG) /* */
527 TEXT cmpswap486(SB), 1, $-4
531 LOCK; CMPXCHGL BX, (RARG)
532 MOVL $1, AX /* use CMOVLEQ etc. here? */
541 * Label consists of a stack pointer and a programme counter
543 TEXT gotolabel(SB), 1, $-4
544 MOVQ 0(RARG), SP /* restore SP */
545 MOVQ 8(RARG), AX /* put return PC on the stack */
547 MOVL $1, AX /* return 1 */
550 TEXT setlabel(SB), 1, $-4
551 MOVQ SP, 0(RARG) /* store SP */
552 MOVQ 0(SP), BX /* store return PC */
554 MOVL $0, AX /* return 0 */
557 TEXT halt(SB), 1, $-4
568 TEXT mwait(SB), 1, $-4
574 BYTE $0x0f; BYTE $0x01; BYTE $0xc8 /* MONITOR */
579 BYTE $0x0f; BYTE $0x01; BYTE $0xc9 /* MWAIT */
584 * SIMD Floating Point.
585 * Note: for x87 instructions which have both a 'wait' and 'nowait' version,
586 * 8a only knows the 'wait' mnemonic but does NOT insertthe WAIT prefix byte
587 * (i.e. they act like their FNxxx variations) so WAIT instructions must be
588 * explicitly placed in the code if necessary.
590 TEXT _clts(SB), 1, $-4
594 TEXT _fldcw(SB), 1, $-4 /* Load x87 FPU Control Word */
599 TEXT _fnclex(SB), 1, $-4
603 TEXT _fninit(SB), 1, $-4
607 TEXT _fxrstor(SB), 1, $-4
611 TEXT _fxsave(SB), 1, $-4
615 TEXT _fwait(SB), 1, $-4
619 TEXT _ldmxcsr(SB), 1, $-4 /* Load MXCSR */
620 MOVQ RARG, mxcsr+0(FP)
624 TEXT _stts(SB), 1, $-4
630 TEXT mul64fract(SB), 1, $-4
632 MULQ b+16(FP) /* a*b */
637 #define RDRANDAX BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
638 #define RDRAND64AX BYTE $0x48; BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
640 TEXT rdrand32(SB), $-4
646 TEXT rdrand64(SB), $-4
652 TEXT rdrandbuf(SB), $0
655 MOVLQZX cnt+8(FP), CX
667 MOVLQZX cnt+8(FP), CX
680 MOVLQZX cnt+8(FP), CX
696 TEXT touser(SB), 1, $-4
703 MOVQ $(UTZERO+0x28), CX /* ip */
704 MOVL $0x200, R11 /* flags */
705 MOVQ RARG, SP /* sp */
707 BYTE $0x48; SYSRET /* SYSRETQ */
711 TEXT syscallentry(SB), 1, $-4
713 BYTE $0x65; MOVQ 0, AX /* m-> (MOVQ GS:0x0, AX) */
714 MOVQ 16(AX), BX /* m->proc */
716 MOVQ 16(BX), SP /* m->proc->kstack */
719 PUSHQ $UDSEL /* old stack segment */
720 PUSHQ R13 /* old sp */
721 PUSHQ R11 /* old flags */
722 PUSHQ $UESEL /* old code segment */
723 PUSHQ CX /* old ip */
725 SUBQ $(8 + 23*8-5*8), SP /* arg + sizeof(Ureg)-pushed */
727 MOVQ RMACH, (15*8)(SP) /* old r15 */
728 MOVQ RUSER, (14*8)(SP) /* old r14 */
730 MOVQ RARG, (7*8)(SP) /* system call number */
732 MOVQ AX, RMACH /* m */
733 MOVQ BX, RUSER /* up */
735 LEAQ 8(SP), RARG /* Ureg* arg */
739 TEXT forkret(SB), 1, $-4
743 MOVQ 8(SP), AX /* return value */
745 MOVQ (15*8)(SP), RMACH /* r15 */
746 MOVQ (14*8)(SP), RUSER /* r14 */
748 MOVQ (19*8)(SP), CX /* ip */
749 MOVQ (21*8)(SP), R11 /* flags */
750 MOVQ (22*8)(SP), SP /* sp */
752 BYTE $0x48; SYSRET /* SYSRETQ */
754 TEXT noteret(SB), 1, $-4
759 * Interrupt/exception handling.
762 TEXT _strayintr(SB), 1, $-4 /* no error code pushed */
763 PUSHQ AX /* save AX */
764 MOVQ 8(SP), AX /* vectortable(SB) PC */
767 TEXT _strayintrx(SB), 1, $-4 /* error code pushed */
773 SUBQ $24, SP /* R1[45], [DEFG]S */
774 CMPW 48(SP), $KESEL /* old CS */
781 BYTE $0x65; MOVQ 0, RMACH /* m-> (MOVQ GS:0x0, R15) */
782 MOVQ 16(RMACH), RUSER /* up */
832 TEXT vectortable(SB), $0
833 CALL _strayintr(SB); BYTE $0x00 /* divide error */
834 CALL _strayintr(SB); BYTE $0x01 /* debug exception */
835 CALL _strayintr(SB); BYTE $0x02 /* NMI interrupt */
836 CALL _strayintr(SB); BYTE $0x03 /* breakpoint */
837 CALL _strayintr(SB); BYTE $0x04 /* overflow */
838 CALL _strayintr(SB); BYTE $0x05 /* bound */
839 CALL _strayintr(SB); BYTE $0x06 /* invalid opcode */
840 CALL _strayintr(SB); BYTE $0x07 /* no coprocessor available */
841 CALL _strayintrx(SB); BYTE $0x08 /* double fault */
842 CALL _strayintr(SB); BYTE $0x09 /* coprocessor segment overflow */
843 CALL _strayintrx(SB); BYTE $0x0A /* invalid TSS */
844 CALL _strayintrx(SB); BYTE $0x0B /* segment not available */
845 CALL _strayintrx(SB); BYTE $0x0C /* stack exception */
846 CALL _strayintrx(SB); BYTE $0x0D /* general protection error */
847 CALL _strayintrx(SB); BYTE $0x0E /* page fault */
848 CALL _strayintr(SB); BYTE $0x0F /* */
849 CALL _strayintr(SB); BYTE $0x10 /* coprocessor error */
850 CALL _strayintrx(SB); BYTE $0x11 /* alignment check */
851 CALL _strayintr(SB); BYTE $0x12 /* machine check */
852 CALL _strayintr(SB); BYTE $0x13 /* simd error */
853 CALL _strayintr(SB); BYTE $0x14
854 CALL _strayintr(SB); BYTE $0x15
855 CALL _strayintr(SB); BYTE $0x16
856 CALL _strayintr(SB); BYTE $0x17
857 CALL _strayintr(SB); BYTE $0x18
858 CALL _strayintr(SB); BYTE $0x19
859 CALL _strayintr(SB); BYTE $0x1A
860 CALL _strayintr(SB); BYTE $0x1B
861 CALL _strayintr(SB); BYTE $0x1C
862 CALL _strayintr(SB); BYTE $0x1D
863 CALL _strayintr(SB); BYTE $0x1E
864 CALL _strayintr(SB); BYTE $0x1F
865 CALL _strayintr(SB); BYTE $0x20 /* VectorLAPIC */
866 CALL _strayintr(SB); BYTE $0x21
867 CALL _strayintr(SB); BYTE $0x22
868 CALL _strayintr(SB); BYTE $0x23
869 CALL _strayintr(SB); BYTE $0x24
870 CALL _strayintr(SB); BYTE $0x25
871 CALL _strayintr(SB); BYTE $0x26
872 CALL _strayintr(SB); BYTE $0x27
873 CALL _strayintr(SB); BYTE $0x28
874 CALL _strayintr(SB); BYTE $0x29
875 CALL _strayintr(SB); BYTE $0x2A
876 CALL _strayintr(SB); BYTE $0x2B
877 CALL _strayintr(SB); BYTE $0x2C
878 CALL _strayintr(SB); BYTE $0x2D
879 CALL _strayintr(SB); BYTE $0x2E
880 CALL _strayintr(SB); BYTE $0x2F
881 CALL _strayintr(SB); BYTE $0x30
882 CALL _strayintr(SB); BYTE $0x31
883 CALL _strayintr(SB); BYTE $0x32
884 CALL _strayintr(SB); BYTE $0x33
885 CALL _strayintr(SB); BYTE $0x34
886 CALL _strayintr(SB); BYTE $0x35
887 CALL _strayintr(SB); BYTE $0x36
888 CALL _strayintr(SB); BYTE $0x37
889 CALL _strayintr(SB); BYTE $0x38
890 CALL _strayintr(SB); BYTE $0x39
891 CALL _strayintr(SB); BYTE $0x3A
892 CALL _strayintr(SB); BYTE $0x3B
893 CALL _strayintr(SB); BYTE $0x3C
894 CALL _strayintr(SB); BYTE $0x3D
895 CALL _strayintr(SB); BYTE $0x3E
896 CALL _strayintr(SB); BYTE $0x3F
897 CALL _strayintr(SB); BYTE $0x40 /* was VectorSYSCALL */
898 CALL _strayintr(SB); BYTE $0x41
899 CALL _strayintr(SB); BYTE $0x42
900 CALL _strayintr(SB); BYTE $0x43
901 CALL _strayintr(SB); BYTE $0x44
902 CALL _strayintr(SB); BYTE $0x45
903 CALL _strayintr(SB); BYTE $0x46
904 CALL _strayintr(SB); BYTE $0x47
905 CALL _strayintr(SB); BYTE $0x48
906 CALL _strayintr(SB); BYTE $0x49
907 CALL _strayintr(SB); BYTE $0x4A
908 CALL _strayintr(SB); BYTE $0x4B
909 CALL _strayintr(SB); BYTE $0x4C
910 CALL _strayintr(SB); BYTE $0x4D
911 CALL _strayintr(SB); BYTE $0x4E
912 CALL _strayintr(SB); BYTE $0x4F
913 CALL _strayintr(SB); BYTE $0x50
914 CALL _strayintr(SB); BYTE $0x51
915 CALL _strayintr(SB); BYTE $0x52
916 CALL _strayintr(SB); BYTE $0x53
917 CALL _strayintr(SB); BYTE $0x54
918 CALL _strayintr(SB); BYTE $0x55
919 CALL _strayintr(SB); BYTE $0x56
920 CALL _strayintr(SB); BYTE $0x57
921 CALL _strayintr(SB); BYTE $0x58
922 CALL _strayintr(SB); BYTE $0x59
923 CALL _strayintr(SB); BYTE $0x5A
924 CALL _strayintr(SB); BYTE $0x5B
925 CALL _strayintr(SB); BYTE $0x5C
926 CALL _strayintr(SB); BYTE $0x5D
927 CALL _strayintr(SB); BYTE $0x5E
928 CALL _strayintr(SB); BYTE $0x5F
929 CALL _strayintr(SB); BYTE $0x60
930 CALL _strayintr(SB); BYTE $0x61
931 CALL _strayintr(SB); BYTE $0x62
932 CALL _strayintr(SB); BYTE $0x63
933 CALL _strayintr(SB); BYTE $0x64
934 CALL _strayintr(SB); BYTE $0x65
935 CALL _strayintr(SB); BYTE $0x66
936 CALL _strayintr(SB); BYTE $0x67
937 CALL _strayintr(SB); BYTE $0x68
938 CALL _strayintr(SB); BYTE $0x69
939 CALL _strayintr(SB); BYTE $0x6A
940 CALL _strayintr(SB); BYTE $0x6B
941 CALL _strayintr(SB); BYTE $0x6C
942 CALL _strayintr(SB); BYTE $0x6D
943 CALL _strayintr(SB); BYTE $0x6E
944 CALL _strayintr(SB); BYTE $0x6F
945 CALL _strayintr(SB); BYTE $0x70
946 CALL _strayintr(SB); BYTE $0x71
947 CALL _strayintr(SB); BYTE $0x72
948 CALL _strayintr(SB); BYTE $0x73
949 CALL _strayintr(SB); BYTE $0x74
950 CALL _strayintr(SB); BYTE $0x75
951 CALL _strayintr(SB); BYTE $0x76
952 CALL _strayintr(SB); BYTE $0x77
953 CALL _strayintr(SB); BYTE $0x78
954 CALL _strayintr(SB); BYTE $0x79
955 CALL _strayintr(SB); BYTE $0x7A
956 CALL _strayintr(SB); BYTE $0x7B
957 CALL _strayintr(SB); BYTE $0x7C
958 CALL _strayintr(SB); BYTE $0x7D
959 CALL _strayintr(SB); BYTE $0x7E
960 CALL _strayintr(SB); BYTE $0x7F
961 CALL _strayintr(SB); BYTE $0x80 /* Vector[A]PIC */
962 CALL _strayintr(SB); BYTE $0x81
963 CALL _strayintr(SB); BYTE $0x82
964 CALL _strayintr(SB); BYTE $0x83
965 CALL _strayintr(SB); BYTE $0x84
966 CALL _strayintr(SB); BYTE $0x85
967 CALL _strayintr(SB); BYTE $0x86
968 CALL _strayintr(SB); BYTE $0x87
969 CALL _strayintr(SB); BYTE $0x88
970 CALL _strayintr(SB); BYTE $0x89
971 CALL _strayintr(SB); BYTE $0x8A
972 CALL _strayintr(SB); BYTE $0x8B
973 CALL _strayintr(SB); BYTE $0x8C
974 CALL _strayintr(SB); BYTE $0x8D
975 CALL _strayintr(SB); BYTE $0x8E
976 CALL _strayintr(SB); BYTE $0x8F
977 CALL _strayintr(SB); BYTE $0x90
978 CALL _strayintr(SB); BYTE $0x91
979 CALL _strayintr(SB); BYTE $0x92
980 CALL _strayintr(SB); BYTE $0x93
981 CALL _strayintr(SB); BYTE $0x94
982 CALL _strayintr(SB); BYTE $0x95
983 CALL _strayintr(SB); BYTE $0x96
984 CALL _strayintr(SB); BYTE $0x97
985 CALL _strayintr(SB); BYTE $0x98
986 CALL _strayintr(SB); BYTE $0x99
987 CALL _strayintr(SB); BYTE $0x9A
988 CALL _strayintr(SB); BYTE $0x9B
989 CALL _strayintr(SB); BYTE $0x9C
990 CALL _strayintr(SB); BYTE $0x9D
991 CALL _strayintr(SB); BYTE $0x9E
992 CALL _strayintr(SB); BYTE $0x9F
993 CALL _strayintr(SB); BYTE $0xA0
994 CALL _strayintr(SB); BYTE $0xA1
995 CALL _strayintr(SB); BYTE $0xA2
996 CALL _strayintr(SB); BYTE $0xA3
997 CALL _strayintr(SB); BYTE $0xA4
998 CALL _strayintr(SB); BYTE $0xA5
999 CALL _strayintr(SB); BYTE $0xA6
1000 CALL _strayintr(SB); BYTE $0xA7
1001 CALL _strayintr(SB); BYTE $0xA8
1002 CALL _strayintr(SB); BYTE $0xA9
1003 CALL _strayintr(SB); BYTE $0xAA
1004 CALL _strayintr(SB); BYTE $0xAB
1005 CALL _strayintr(SB); BYTE $0xAC
1006 CALL _strayintr(SB); BYTE $0xAD
1007 CALL _strayintr(SB); BYTE $0xAE
1008 CALL _strayintr(SB); BYTE $0xAF
1009 CALL _strayintr(SB); BYTE $0xB0
1010 CALL _strayintr(SB); BYTE $0xB1
1011 CALL _strayintr(SB); BYTE $0xB2
1012 CALL _strayintr(SB); BYTE $0xB3
1013 CALL _strayintr(SB); BYTE $0xB4
1014 CALL _strayintr(SB); BYTE $0xB5
1015 CALL _strayintr(SB); BYTE $0xB6
1016 CALL _strayintr(SB); BYTE $0xB7
1017 CALL _strayintr(SB); BYTE $0xB8
1018 CALL _strayintr(SB); BYTE $0xB9
1019 CALL _strayintr(SB); BYTE $0xBA
1020 CALL _strayintr(SB); BYTE $0xBB
1021 CALL _strayintr(SB); BYTE $0xBC
1022 CALL _strayintr(SB); BYTE $0xBD
1023 CALL _strayintr(SB); BYTE $0xBE
1024 CALL _strayintr(SB); BYTE $0xBF
1025 CALL _strayintr(SB); BYTE $0xC0
1026 CALL _strayintr(SB); BYTE $0xC1
1027 CALL _strayintr(SB); BYTE $0xC2
1028 CALL _strayintr(SB); BYTE $0xC3
1029 CALL _strayintr(SB); BYTE $0xC4
1030 CALL _strayintr(SB); BYTE $0xC5
1031 CALL _strayintr(SB); BYTE $0xC6
1032 CALL _strayintr(SB); BYTE $0xC7
1033 CALL _strayintr(SB); BYTE $0xC8
1034 CALL _strayintr(SB); BYTE $0xC9
1035 CALL _strayintr(SB); BYTE $0xCA
1036 CALL _strayintr(SB); BYTE $0xCB
1037 CALL _strayintr(SB); BYTE $0xCC
1038 CALL _strayintr(SB); BYTE $0xCD
1039 CALL _strayintr(SB); BYTE $0xCE
1040 CALL _strayintr(SB); BYTE $0xCF
1041 CALL _strayintr(SB); BYTE $0xD0
1042 CALL _strayintr(SB); BYTE $0xD1
1043 CALL _strayintr(SB); BYTE $0xD2
1044 CALL _strayintr(SB); BYTE $0xD3
1045 CALL _strayintr(SB); BYTE $0xD4
1046 CALL _strayintr(SB); BYTE $0xD5
1047 CALL _strayintr(SB); BYTE $0xD6
1048 CALL _strayintr(SB); BYTE $0xD7
1049 CALL _strayintr(SB); BYTE $0xD8
1050 CALL _strayintr(SB); BYTE $0xD9
1051 CALL _strayintr(SB); BYTE $0xDA
1052 CALL _strayintr(SB); BYTE $0xDB
1053 CALL _strayintr(SB); BYTE $0xDC
1054 CALL _strayintr(SB); BYTE $0xDD
1055 CALL _strayintr(SB); BYTE $0xDE
1056 CALL _strayintr(SB); BYTE $0xDF
1057 CALL _strayintr(SB); BYTE $0xE0
1058 CALL _strayintr(SB); BYTE $0xE1
1059 CALL _strayintr(SB); BYTE $0xE2
1060 CALL _strayintr(SB); BYTE $0xE3
1061 CALL _strayintr(SB); BYTE $0xE4
1062 CALL _strayintr(SB); BYTE $0xE5
1063 CALL _strayintr(SB); BYTE $0xE6
1064 CALL _strayintr(SB); BYTE $0xE7
1065 CALL _strayintr(SB); BYTE $0xE8
1066 CALL _strayintr(SB); BYTE $0xE9
1067 CALL _strayintr(SB); BYTE $0xEA
1068 CALL _strayintr(SB); BYTE $0xEB
1069 CALL _strayintr(SB); BYTE $0xEC
1070 CALL _strayintr(SB); BYTE $0xED
1071 CALL _strayintr(SB); BYTE $0xEE
1072 CALL _strayintr(SB); BYTE $0xEF
1073 CALL _strayintr(SB); BYTE $0xF0
1074 CALL _strayintr(SB); BYTE $0xF1
1075 CALL _strayintr(SB); BYTE $0xF2
1076 CALL _strayintr(SB); BYTE $0xF3
1077 CALL _strayintr(SB); BYTE $0xF4
1078 CALL _strayintr(SB); BYTE $0xF5
1079 CALL _strayintr(SB); BYTE $0xF6
1080 CALL _strayintr(SB); BYTE $0xF7
1081 CALL _strayintr(SB); BYTE $0xF8
1082 CALL _strayintr(SB); BYTE $0xF9
1083 CALL _strayintr(SB); BYTE $0xFA
1084 CALL _strayintr(SB); BYTE $0xFB
1085 CALL _strayintr(SB); BYTE $0xFC
1086 CALL _strayintr(SB); BYTE $0xFD
1087 CALL _strayintr(SB); BYTE $0xFE
1088 CALL _strayintr(SB); BYTE $0xFF