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 TEXT _gdt<>(SB), 1, $-4
38 /* (KESEG) 64 bit long mode exec segment */
40 LONG $(SEGL|SEGG|SEGP|(0xF<<16)|SEGPL(0)|SEGEXEC|SEGR)
42 /* 32 bit data segment descriptor for 4 gigabytes (PL 0) */
44 LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
46 /* 32 bit exec segment descriptor for 4 gigabytes (PL 0) */
48 LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
51 TEXT _gdtptr32p<>(SB), 1, $-4
53 LONG $_gdt<>-KZERO(SB)
55 TEXT _gdtptr64p<>(SB), 1, $-4
57 QUAD $_gdt<>-KZERO(SB)
59 TEXT _gdtptr64v<>(SB), 1, $-4
64 * Macros for accessing page table entries; change the
65 * C-style array-index macros into a page table byte offset
67 #define PML4O(v) ((PTLX((v), 3))<<3)
68 #define PDPO(v) ((PTLX((v), 2))<<3)
69 #define PDO(v) ((PTLX((v), 1))<<3)
70 #define PTO(v) ((PTLX((v), 0))<<3)
72 TEXT _warp64<>(SB), 1, $-4
74 /* clear mach and page tables */
75 MOVL $((CPU0END-CPU0PML4)>>2), CX
76 MOVL $(CPU0PML4-KZERO), SI
82 MOVL SI, AX /* PML4 */
84 ADDL $(PTSZ|PTEWRITE|PTEVALID), DX /* PDP at PML4 + PTSZ */
85 MOVL DX, PML4O(0)(AX) /* PML4E for double-map */
86 MOVL DX, PML4O(KZERO)(AX) /* PML4E for KZERO */
88 ADDL $PTSZ, AX /* PDP at PML4 + PTSZ */
89 ADDL $PTSZ, DX /* PD at PML4 + 2*PTSZ */
90 MOVL DX, PDPO(0)(AX) /* PDPE for double-map */
91 MOVL DX, PDPO(KZERO)(AX) /* PDPE for KZERO */
93 ADDL $PTSZ, AX /* PD at PML4 + 2*PTSZ */
94 MOVL $(PTESIZE|PTEGLOBAL|PTEWRITE|PTEVALID), DX
95 MOVL DX, PDO(0)(AX) /* PDE for double-map */
106 * Enable and activate Long Mode. From the manual:
107 * make sure Page Size Extentions are off, and Page Global
108 * Extensions and Physical Address Extensions are on in CR4;
109 * set Long Mode Enable in the Extended Feature Enable MSR;
110 * set Paging Enable in CR0;
111 * make an inter-segment jump to the Long Mode code.
112 * It's all in 32-bit mode until the jump is made.
114 TEXT _lme<>(SB), 1, $-4
115 MOVL SI, CR3 /* load the mmu */
119 ANDL $~0x00000010, AX /* Page Size */
120 ORL $0x000000A0, AX /* Page Global, Phys. Address */
123 MOVL $0xc0000080, CX /* Extended Feature Enable */
125 ORL $0x00000100, AX /* Long Mode Enable */
129 ANDL $~0x6000000a, DX
130 ORL $0x80010000, DX /* Paging Enable, Write Protect */
133 pFARJMP32(SELECTOR(KESEG, SELGDT, 0), _identity<>-KZERO(SB))
136 * Long mode. Welcome to 2003.
137 * Jump out of the identity map space;
138 * load a proper long mode GDT.
142 TEXT _identity<>(SB), 1, $-4
143 MOVQ $_start64v<>(SB), AX
146 TEXT _start64v<>(SB), 1, $-4
147 MOVQ $_gdtptr64v<>(SB), AX
151 MOVW AX, DS /* not used in long mode */
152 MOVW AX, ES /* not used in long mode */
155 MOVW AX, SS /* not used in long mode */
159 MOVQ $(CPU0MACH+MACHSIZE), SP
160 MOVQ $(CPU0MACH), RMACH
161 MOVQ AX, RUSER /* up = 0; */
166 SUBQ DI, CX /* end-edata bytes */
167 SHRQ $2, CX /* end-edata doublewords */
170 REP; STOSL /* clear BSS */
172 PUSHQ AX /* clear flags */
178 * The CPUID instruction is always supported on the amd64.
181 MOVL RARG, AX /* function in AX */
195 MOVL RARG, DX /* MOVL port+0(FP), DX */
200 TEXT insb(SB), 1, $-4
201 MOVL RARG, DX /* MOVL port+0(FP), DX */
202 MOVQ address+8(FP), DI
203 MOVL count+16(FP), CX
209 MOVL RARG, DX /* MOVL port+0(FP), DX */
214 TEXT inss(SB), 1, $-4
215 MOVL RARG, DX /* MOVL port+0(FP), DX */
216 MOVQ address+8(FP), DI
217 MOVL count+16(FP), CX
223 MOVL RARG, DX /* MOVL port+0(FP), DX */
227 TEXT insl(SB), 1, $-4
228 MOVL RARG, DX /* MOVL port+0(FP), DX */
229 MOVQ address+8(FP), DI
230 MOVL count+16(FP), CX
235 TEXT outb(SB), 1, $-1
236 MOVL RARG, DX /* MOVL port+0(FP), DX */
241 TEXT outsb(SB), 1, $-4
242 MOVL RARG, DX /* MOVL port+0(FP), DX */
243 MOVQ address+8(FP), SI
244 MOVL count+16(FP), CX
249 TEXT outs(SB), 1, $-4
250 MOVL RARG, DX /* MOVL port+0(FP), DX */
255 TEXT outss(SB), 1, $-4
256 MOVL RARG, DX /* MOVL port+0(FP), DX */
257 MOVQ address+8(FP), SI
258 MOVL count+16(FP), CX
263 TEXT outl(SB), 1, $-4
264 MOVL RARG, DX /* MOVL port+0(FP), DX */
269 TEXT outsl(SB), 1, $-4
270 MOVL RARG, DX /* MOVL port+0(FP), DX */
271 MOVQ address+8(FP), SI
272 MOVL count+16(FP), CX
277 TEXT getgdt(SB), 1, $-4
279 MOVL GDTR, (AX) /* Note: 10 bytes returned */
282 TEXT lgdt(SB), $0 /* GDTR - global descriptor table */
287 TEXT lidt(SB), $0 /* IDTR - interrupt descriptor table */
298 * Read/write various system registers.
300 TEXT getcr0(SB), 1, $-4 /* Processor Control */
304 TEXT putcr0(SB), 1, $-4
308 TEXT getcr2(SB), 1, $-4 /* #PF Linear Address */
312 TEXT getcr3(SB), 1, $-4 /* PML4 Base */
316 TEXT putcr3(SB), 1, $-4
320 TEXT getcr4(SB), 1, $-4 /* Extensions */
324 TEXT putcr4(SB), 1, $-4
328 TEXT mb386(SB), 1, $-4 /* hack */
329 TEXT mb586(SB), 1, $-4
335 * Park a processor. Should never fall through a return from main to here,
336 * should only be called by application processors when shutting down.
338 TEXT idle(SB), 1, $-4
347 TEXT bios32call(SB), 1, $-4
353 * Basic timing loop to determine CPU frequency.
355 TEXT aamloop(SB), 1, $-4
361 TEXT _cycles(SB), 1, $-4 /* time stamp counter */
363 MOVL AX, 0(RARG) /* lo */
364 MOVL DX, 4(RARG) /* hi */
367 TEXT rdmsr(SB), 1, $-4 /* Model-Specific Register */
370 TEXT _rdmsrinst(SB), $0
372 MOVQ vlong+8(FP), CX /* &vlong */
373 MOVL AX, 0(CX) /* lo */
374 MOVL DX, 4(CX) /* hi */
375 MOVQ BP, AX /* BP set to -1 if traped */
378 TEXT wrmsr(SB), 1, $-4
383 TEXT _wrmsrinst(SB), $0
385 MOVQ BP, AX /* BP set to -1 if traped */
388 TEXT invlpg(SB), 1, $-4 /* INVLPG va+0(FP) */
395 TEXT wbinvd(SB), 1, $-4
402 TEXT lfence(SB), 1, $-4
406 TEXT mfence(SB), 1, $-4
410 TEXT sfence(SB), 1, $-4
415 * Note: CLI and STI are not serialising instructions.
416 * Is that assumed anywhere?
418 TEXT splhi(SB), 1, $-4
422 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
423 JZ _alreadyhi /* use CMOVLEQ etc. here? */
426 MOVQ BX, 8(RMACH) /* save PC in m->splpc */
432 TEXT spllo(SB), 1, $-4
436 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
437 JNZ _alreadylo /* use CMOVLEQ etc. here? */
439 MOVQ $0, 8(RMACH) /* clear m->splpc */
445 TEXT splx(SB), 1, $-4
446 TESTQ $0x200, RARG /* 0x200 - Interrupt Flag */
450 TEXT spldone(SB), 1, $-4
453 TEXT islo(SB), 1, $-4
456 ANDQ $0x200, AX /* 0x200 - Interrupt Flag */
462 TEXT ainc8(SB), 1, $-4
465 LOCK; XADDB AX, (RARG)
469 TEXT _xinc(SB), 1, $-4 /* int _inc(long*); */
471 LOCK; XADDL AX, (RARG)
472 ADDL $1, AX /* overflow if -ve or 0 */
476 MOVQ (BX), BX /* over under sideways down */
480 TEXT _xdec(SB), 1, $-4 /* int _dec(long*); */
482 LOCK; XADDL AX, (RARG)
483 SUBL $1, AX /* underflow if -ve */
489 XCHGL AX, (RARG) /* */
492 TEXT fas64(SB), 1, $-4
494 LOCK; XCHGQ AX, (RARG) /* */
497 TEXT cmpswap486(SB), 1, $-4
501 LOCK; CMPXCHGL BX, (RARG)
502 MOVL $1, AX /* use CMOVLEQ etc. here? */
510 TEXT cas64(SB), 1, $-4
513 LOCK; CMPXCHGQ BX, (RARG)
514 MOVL $1, AX /* use CMOVLEQ etc. here? */
523 * Label consists of a stack pointer and a programme counter
525 TEXT gotolabel(SB), 1, $-4
526 MOVQ 0(RARG), SP /* restore SP */
527 MOVQ 8(RARG), AX /* put return PC on the stack */
529 MOVL $1, AX /* return 1 */
532 TEXT setlabel(SB), 1, $-4
533 MOVQ SP, 0(RARG) /* store SP */
534 MOVQ 0(SP), BX /* store return PC */
536 MOVL $0, AX /* return 0 */
539 TEXT halt(SB), 1, $-4
550 TEXT mwait(SB), 1, $-4
556 BYTE $0x0f; BYTE $0x01; BYTE $0xc8 /* MONITOR */
561 BYTE $0x0f; BYTE $0x01; BYTE $0xc9 /* MWAIT */
566 * SIMD Floating Point.
567 * Note: for x87 instructions which have both a 'wait' and 'nowait' version,
568 * 8a only knows the 'wait' mnemonic but does NOT insertthe WAIT prefix byte
569 * (i.e. they act like their FNxxx variations) so WAIT instructions must be
570 * explicitly placed in the code if necessary.
572 TEXT _clts(SB), 1, $-4
576 TEXT _fldcw(SB), 1, $-4 /* Load x87 FPU Control Word */
581 TEXT _fnclex(SB), 1, $-4
585 TEXT _fninit(SB), 1, $-4
589 TEXT _fxrstor(SB), 1, $-4
593 TEXT _fxsave(SB), 1, $-4
597 TEXT _fwait(SB), 1, $-4
601 TEXT _ldmxcsr(SB), 1, $-4 /* Load MXCSR */
602 MOVQ RARG, mxcsr+0(FP)
606 TEXT _stts(SB), 1, $-4
612 TEXT mul64fract(SB), 1, $-4
614 MULQ b+16(FP) /* a*b */
619 #define RDRANDAX BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
620 #define RDRAND64AX BYTE $0x48; BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
622 TEXT rdrand32(SB), $-4
628 TEXT rdrand64(SB), $-4
634 TEXT rdrandbuf(SB), $0
637 MOVLQZX cnt+8(FP), CX
649 MOVLQZX cnt+8(FP), CX
662 MOVLQZX cnt+8(FP), CX
678 TEXT touser(SB), 1, $-4
687 MOVQ $(UTZERO+0x28), CX /* ip */
688 MOVQ $0x200, R11 /* flags */
690 MOVQ RARG, SP /* sp */
692 BYTE $0x48; SYSRET /* SYSRETQ */
696 TEXT syscallentry(SB), 1, $-4
698 BYTE $0x65; MOVQ 0, RMACH /* m-> (MOVQ GS:0x0, R15) */
699 MOVQ 16(RMACH), RUSER /* m->proc */
701 MOVQ 16(RUSER), SP /* m->proc->kstack */
703 PUSHQ $UDSEL /* old stack segment */
704 PUSHQ R13 /* old sp */
705 PUSHQ R11 /* old flags */
706 PUSHQ $UESEL /* old code segment */
707 PUSHQ CX /* old ip */
709 SUBQ $(17*8), SP /* unsaved registers */
710 PUSHQ RARG /* system call number */
712 MOVW $UDSEL, (15*8+0)(SP)
713 MOVW ES, (15*8+2)(SP)
714 MOVW FS, (15*8+4)(SP)
715 MOVW GS, (15*8+6)(SP)
721 TEXT forkret(SB), 1, $-4
722 MOVQ 8(SP), AX /* Ureg.ax */
723 MOVQ (8+6*8)(SP), BP /* Ureg.bp */
724 ADDQ $(16*8), SP /* registers + arguments */
733 MOVQ 24(SP), CX /* ip */
734 MOVQ 40(SP), R11 /* flags */
736 MOVQ 48(SP), SP /* sp */
738 BYTE $0x48; SYSRET /* SYSRETQ */
740 TEXT noteret(SB), 1, $-4
745 * Interrupt/exception handling.
748 TEXT _strayintr(SB), 1, $-4 /* no error code pushed */
749 PUSHQ AX /* save AX */
750 MOVQ 8(SP), AX /* vectortable(SB) PC */
753 TEXT _strayintrx(SB), 1, $-4 /* error code pushed */
759 SUBQ $24, SP /* R1[45], [DEFG]S */
760 CMPW 48(SP), $KESEL /* old CS */
771 BYTE $0x65; MOVQ 0, RMACH /* m-> (MOVQ GS:0x0, R15) */
772 MOVQ 16(RMACH), RUSER /* up */
825 TEXT vectortable(SB), $0
826 CALL _strayintr(SB); BYTE $0x00 /* divide error */
827 CALL _strayintr(SB); BYTE $0x01 /* debug exception */
828 CALL _strayintr(SB); BYTE $0x02 /* NMI interrupt */
829 CALL _strayintr(SB); BYTE $0x03 /* breakpoint */
830 CALL _strayintr(SB); BYTE $0x04 /* overflow */
831 CALL _strayintr(SB); BYTE $0x05 /* bound */
832 CALL _strayintr(SB); BYTE $0x06 /* invalid opcode */
833 CALL _strayintr(SB); BYTE $0x07 /* no coprocessor available */
834 CALL _strayintrx(SB); BYTE $0x08 /* double fault */
835 CALL _strayintr(SB); BYTE $0x09 /* coprocessor segment overflow */
836 CALL _strayintrx(SB); BYTE $0x0A /* invalid TSS */
837 CALL _strayintrx(SB); BYTE $0x0B /* segment not available */
838 CALL _strayintrx(SB); BYTE $0x0C /* stack exception */
839 CALL _strayintrx(SB); BYTE $0x0D /* general protection error */
840 CALL _strayintrx(SB); BYTE $0x0E /* page fault */
841 CALL _strayintr(SB); BYTE $0x0F /* */
842 CALL _strayintr(SB); BYTE $0x10 /* coprocessor error */
843 CALL _strayintrx(SB); BYTE $0x11 /* alignment check */
844 CALL _strayintr(SB); BYTE $0x12 /* machine check */
845 CALL _strayintr(SB); BYTE $0x13
846 CALL _strayintr(SB); BYTE $0x14
847 CALL _strayintr(SB); BYTE $0x15
848 CALL _strayintr(SB); BYTE $0x16
849 CALL _strayintr(SB); BYTE $0x17
850 CALL _strayintr(SB); BYTE $0x18
851 CALL _strayintr(SB); BYTE $0x19
852 CALL _strayintr(SB); BYTE $0x1A
853 CALL _strayintr(SB); BYTE $0x1B
854 CALL _strayintr(SB); BYTE $0x1C
855 CALL _strayintr(SB); BYTE $0x1D
856 CALL _strayintr(SB); BYTE $0x1E
857 CALL _strayintr(SB); BYTE $0x1F
858 CALL _strayintr(SB); BYTE $0x20 /* VectorLAPIC */
859 CALL _strayintr(SB); BYTE $0x21
860 CALL _strayintr(SB); BYTE $0x22
861 CALL _strayintr(SB); BYTE $0x23
862 CALL _strayintr(SB); BYTE $0x24
863 CALL _strayintr(SB); BYTE $0x25
864 CALL _strayintr(SB); BYTE $0x26
865 CALL _strayintr(SB); BYTE $0x27
866 CALL _strayintr(SB); BYTE $0x28
867 CALL _strayintr(SB); BYTE $0x29
868 CALL _strayintr(SB); BYTE $0x2A
869 CALL _strayintr(SB); BYTE $0x2B
870 CALL _strayintr(SB); BYTE $0x2C
871 CALL _strayintr(SB); BYTE $0x2D
872 CALL _strayintr(SB); BYTE $0x2E
873 CALL _strayintr(SB); BYTE $0x2F
874 CALL _strayintr(SB); BYTE $0x30
875 CALL _strayintr(SB); BYTE $0x31
876 CALL _strayintr(SB); BYTE $0x32
877 CALL _strayintr(SB); BYTE $0x33
878 CALL _strayintr(SB); BYTE $0x34
879 CALL _strayintr(SB); BYTE $0x35
880 CALL _strayintr(SB); BYTE $0x36
881 CALL _strayintr(SB); BYTE $0x37
882 CALL _strayintr(SB); BYTE $0x38
883 CALL _strayintr(SB); BYTE $0x39
884 CALL _strayintr(SB); BYTE $0x3A
885 CALL _strayintr(SB); BYTE $0x3B
886 CALL _strayintr(SB); BYTE $0x3C
887 CALL _strayintr(SB); BYTE $0x3D
888 CALL _strayintr(SB); BYTE $0x3E
889 CALL _strayintr(SB); BYTE $0x3F
890 CALL _strayintr(SB); BYTE $0x40 /* was VectorSYSCALL */
891 CALL _strayintr(SB); BYTE $0x41
892 CALL _strayintr(SB); BYTE $0x42
893 CALL _strayintr(SB); BYTE $0x43
894 CALL _strayintr(SB); BYTE $0x44
895 CALL _strayintr(SB); BYTE $0x45
896 CALL _strayintr(SB); BYTE $0x46
897 CALL _strayintr(SB); BYTE $0x47
898 CALL _strayintr(SB); BYTE $0x48
899 CALL _strayintr(SB); BYTE $0x49
900 CALL _strayintr(SB); BYTE $0x4A
901 CALL _strayintr(SB); BYTE $0x4B
902 CALL _strayintr(SB); BYTE $0x4C
903 CALL _strayintr(SB); BYTE $0x4D
904 CALL _strayintr(SB); BYTE $0x4E
905 CALL _strayintr(SB); BYTE $0x4F
906 CALL _strayintr(SB); BYTE $0x50
907 CALL _strayintr(SB); BYTE $0x51
908 CALL _strayintr(SB); BYTE $0x52
909 CALL _strayintr(SB); BYTE $0x53
910 CALL _strayintr(SB); BYTE $0x54
911 CALL _strayintr(SB); BYTE $0x55
912 CALL _strayintr(SB); BYTE $0x56
913 CALL _strayintr(SB); BYTE $0x57
914 CALL _strayintr(SB); BYTE $0x58
915 CALL _strayintr(SB); BYTE $0x59
916 CALL _strayintr(SB); BYTE $0x5A
917 CALL _strayintr(SB); BYTE $0x5B
918 CALL _strayintr(SB); BYTE $0x5C
919 CALL _strayintr(SB); BYTE $0x5D
920 CALL _strayintr(SB); BYTE $0x5E
921 CALL _strayintr(SB); BYTE $0x5F
922 CALL _strayintr(SB); BYTE $0x60
923 CALL _strayintr(SB); BYTE $0x61
924 CALL _strayintr(SB); BYTE $0x62
925 CALL _strayintr(SB); BYTE $0x63
926 CALL _strayintr(SB); BYTE $0x64
927 CALL _strayintr(SB); BYTE $0x65
928 CALL _strayintr(SB); BYTE $0x66
929 CALL _strayintr(SB); BYTE $0x67
930 CALL _strayintr(SB); BYTE $0x68
931 CALL _strayintr(SB); BYTE $0x69
932 CALL _strayintr(SB); BYTE $0x6A
933 CALL _strayintr(SB); BYTE $0x6B
934 CALL _strayintr(SB); BYTE $0x6C
935 CALL _strayintr(SB); BYTE $0x6D
936 CALL _strayintr(SB); BYTE $0x6E
937 CALL _strayintr(SB); BYTE $0x6F
938 CALL _strayintr(SB); BYTE $0x70
939 CALL _strayintr(SB); BYTE $0x71
940 CALL _strayintr(SB); BYTE $0x72
941 CALL _strayintr(SB); BYTE $0x73
942 CALL _strayintr(SB); BYTE $0x74
943 CALL _strayintr(SB); BYTE $0x75
944 CALL _strayintr(SB); BYTE $0x76
945 CALL _strayintr(SB); BYTE $0x77
946 CALL _strayintr(SB); BYTE $0x78
947 CALL _strayintr(SB); BYTE $0x79
948 CALL _strayintr(SB); BYTE $0x7A
949 CALL _strayintr(SB); BYTE $0x7B
950 CALL _strayintr(SB); BYTE $0x7C
951 CALL _strayintr(SB); BYTE $0x7D
952 CALL _strayintr(SB); BYTE $0x7E
953 CALL _strayintr(SB); BYTE $0x7F
954 CALL _strayintr(SB); BYTE $0x80 /* Vector[A]PIC */
955 CALL _strayintr(SB); BYTE $0x81
956 CALL _strayintr(SB); BYTE $0x82
957 CALL _strayintr(SB); BYTE $0x83
958 CALL _strayintr(SB); BYTE $0x84
959 CALL _strayintr(SB); BYTE $0x85
960 CALL _strayintr(SB); BYTE $0x86
961 CALL _strayintr(SB); BYTE $0x87
962 CALL _strayintr(SB); BYTE $0x88
963 CALL _strayintr(SB); BYTE $0x89
964 CALL _strayintr(SB); BYTE $0x8A
965 CALL _strayintr(SB); BYTE $0x8B
966 CALL _strayintr(SB); BYTE $0x8C
967 CALL _strayintr(SB); BYTE $0x8D
968 CALL _strayintr(SB); BYTE $0x8E
969 CALL _strayintr(SB); BYTE $0x8F
970 CALL _strayintr(SB); BYTE $0x90
971 CALL _strayintr(SB); BYTE $0x91
972 CALL _strayintr(SB); BYTE $0x92
973 CALL _strayintr(SB); BYTE $0x93
974 CALL _strayintr(SB); BYTE $0x94
975 CALL _strayintr(SB); BYTE $0x95
976 CALL _strayintr(SB); BYTE $0x96
977 CALL _strayintr(SB); BYTE $0x97
978 CALL _strayintr(SB); BYTE $0x98
979 CALL _strayintr(SB); BYTE $0x99
980 CALL _strayintr(SB); BYTE $0x9A
981 CALL _strayintr(SB); BYTE $0x9B
982 CALL _strayintr(SB); BYTE $0x9C
983 CALL _strayintr(SB); BYTE $0x9D
984 CALL _strayintr(SB); BYTE $0x9E
985 CALL _strayintr(SB); BYTE $0x9F
986 CALL _strayintr(SB); BYTE $0xA0
987 CALL _strayintr(SB); BYTE $0xA1
988 CALL _strayintr(SB); BYTE $0xA2
989 CALL _strayintr(SB); BYTE $0xA3
990 CALL _strayintr(SB); BYTE $0xA4
991 CALL _strayintr(SB); BYTE $0xA5
992 CALL _strayintr(SB); BYTE $0xA6
993 CALL _strayintr(SB); BYTE $0xA7
994 CALL _strayintr(SB); BYTE $0xA8
995 CALL _strayintr(SB); BYTE $0xA9
996 CALL _strayintr(SB); BYTE $0xAA
997 CALL _strayintr(SB); BYTE $0xAB
998 CALL _strayintr(SB); BYTE $0xAC
999 CALL _strayintr(SB); BYTE $0xAD
1000 CALL _strayintr(SB); BYTE $0xAE
1001 CALL _strayintr(SB); BYTE $0xAF
1002 CALL _strayintr(SB); BYTE $0xB0
1003 CALL _strayintr(SB); BYTE $0xB1
1004 CALL _strayintr(SB); BYTE $0xB2
1005 CALL _strayintr(SB); BYTE $0xB3
1006 CALL _strayintr(SB); BYTE $0xB4
1007 CALL _strayintr(SB); BYTE $0xB5
1008 CALL _strayintr(SB); BYTE $0xB6
1009 CALL _strayintr(SB); BYTE $0xB7
1010 CALL _strayintr(SB); BYTE $0xB8
1011 CALL _strayintr(SB); BYTE $0xB9
1012 CALL _strayintr(SB); BYTE $0xBA
1013 CALL _strayintr(SB); BYTE $0xBB
1014 CALL _strayintr(SB); BYTE $0xBC
1015 CALL _strayintr(SB); BYTE $0xBD
1016 CALL _strayintr(SB); BYTE $0xBE
1017 CALL _strayintr(SB); BYTE $0xBF
1018 CALL _strayintr(SB); BYTE $0xC0
1019 CALL _strayintr(SB); BYTE $0xC1
1020 CALL _strayintr(SB); BYTE $0xC2
1021 CALL _strayintr(SB); BYTE $0xC3
1022 CALL _strayintr(SB); BYTE $0xC4
1023 CALL _strayintr(SB); BYTE $0xC5
1024 CALL _strayintr(SB); BYTE $0xC6
1025 CALL _strayintr(SB); BYTE $0xC7
1026 CALL _strayintr(SB); BYTE $0xC8
1027 CALL _strayintr(SB); BYTE $0xC9
1028 CALL _strayintr(SB); BYTE $0xCA
1029 CALL _strayintr(SB); BYTE $0xCB
1030 CALL _strayintr(SB); BYTE $0xCC
1031 CALL _strayintr(SB); BYTE $0xCD
1032 CALL _strayintr(SB); BYTE $0xCE
1033 CALL _strayintr(SB); BYTE $0xCF
1034 CALL _strayintr(SB); BYTE $0xD0
1035 CALL _strayintr(SB); BYTE $0xD1
1036 CALL _strayintr(SB); BYTE $0xD2
1037 CALL _strayintr(SB); BYTE $0xD3
1038 CALL _strayintr(SB); BYTE $0xD4
1039 CALL _strayintr(SB); BYTE $0xD5
1040 CALL _strayintr(SB); BYTE $0xD6
1041 CALL _strayintr(SB); BYTE $0xD7
1042 CALL _strayintr(SB); BYTE $0xD8
1043 CALL _strayintr(SB); BYTE $0xD9
1044 CALL _strayintr(SB); BYTE $0xDA
1045 CALL _strayintr(SB); BYTE $0xDB
1046 CALL _strayintr(SB); BYTE $0xDC
1047 CALL _strayintr(SB); BYTE $0xDD
1048 CALL _strayintr(SB); BYTE $0xDE
1049 CALL _strayintr(SB); BYTE $0xDF
1050 CALL _strayintr(SB); BYTE $0xE0
1051 CALL _strayintr(SB); BYTE $0xE1
1052 CALL _strayintr(SB); BYTE $0xE2
1053 CALL _strayintr(SB); BYTE $0xE3
1054 CALL _strayintr(SB); BYTE $0xE4
1055 CALL _strayintr(SB); BYTE $0xE5
1056 CALL _strayintr(SB); BYTE $0xE6
1057 CALL _strayintr(SB); BYTE $0xE7
1058 CALL _strayintr(SB); BYTE $0xE8
1059 CALL _strayintr(SB); BYTE $0xE9
1060 CALL _strayintr(SB); BYTE $0xEA
1061 CALL _strayintr(SB); BYTE $0xEB
1062 CALL _strayintr(SB); BYTE $0xEC
1063 CALL _strayintr(SB); BYTE $0xED
1064 CALL _strayintr(SB); BYTE $0xEE
1065 CALL _strayintr(SB); BYTE $0xEF
1066 CALL _strayintr(SB); BYTE $0xF0
1067 CALL _strayintr(SB); BYTE $0xF1
1068 CALL _strayintr(SB); BYTE $0xF2
1069 CALL _strayintr(SB); BYTE $0xF3
1070 CALL _strayintr(SB); BYTE $0xF4
1071 CALL _strayintr(SB); BYTE $0xF5
1072 CALL _strayintr(SB); BYTE $0xF6
1073 CALL _strayintr(SB); BYTE $0xF7
1074 CALL _strayintr(SB); BYTE $0xF8
1075 CALL _strayintr(SB); BYTE $0xF9
1076 CALL _strayintr(SB); BYTE $0xFA
1077 CALL _strayintr(SB); BYTE $0xFB
1078 CALL _strayintr(SB); BYTE $0xFC
1079 CALL _strayintr(SB); BYTE $0xFD
1080 CALL _strayintr(SB); BYTE $0xFE
1081 CALL _strayintr(SB); BYTE $0xFF