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 /* fault-proof memcpy */
453 TEXT peek(SB), 1, $-4
458 TEXT _peekinst(SB), $0
464 TEXT invlpg(SB), 1, $-4
468 TEXT wbinvd(SB), 1, $-4
475 TEXT lfence(SB), 1, $-4
479 TEXT mfence(SB), 1, $-4
483 TEXT sfence(SB), 1, $-4
488 * Note: CLI and STI are not serialising instructions.
489 * Is that assumed anywhere?
491 TEXT splhi(SB), 1, $-4
495 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
496 JZ _alreadyhi /* use CMOVLEQ etc. here? */
499 MOVQ BX, 8(RMACH) /* save PC in m->splpc */
505 TEXT spllo(SB), 1, $-4
509 TESTQ $0x200, AX /* 0x200 - Interrupt Flag */
510 JNZ _alreadylo /* use CMOVLEQ etc. here? */
512 MOVQ $0, 8(RMACH) /* clear m->splpc */
518 TEXT splx(SB), 1, $-4
519 TESTQ $0x200, RARG /* 0x200 - Interrupt Flag */
523 TEXT spldone(SB), 1, $-4
526 TEXT islo(SB), 1, $-4
529 ANDQ $0x200, AX /* 0x200 - Interrupt Flag */
536 TEXT _tas(SB), 1, $-4
538 XCHGL AX, (RARG) /* */
541 TEXT cmpswap486(SB), 1, $-4
545 LOCK; CMPXCHGL BX, (RARG)
546 MOVL $1, AX /* use CMOVLEQ etc. here? */
555 * Label consists of a stack pointer and a programme counter
557 TEXT gotolabel(SB), 1, $-4
558 MOVQ 0(RARG), SP /* restore SP */
559 MOVQ 8(RARG), AX /* put return PC on the stack */
561 MOVL $1, AX /* return 1 */
564 TEXT setlabel(SB), 1, $-4
565 MOVQ SP, 0(RARG) /* store SP */
566 MOVQ 0(SP), BX /* store return PC */
568 MOVL $0, AX /* return 0 */
571 TEXT halt(SB), 1, $-4
582 TEXT mwait(SB), 1, $-4
588 BYTE $0x0f; BYTE $0x01; BYTE $0xc8 /* MONITOR */
593 BYTE $0x0f; BYTE $0x01; BYTE $0xc9 /* MWAIT */
598 * SIMD Floating Point.
599 * Note: for x87 instructions which have both a 'wait' and 'nowait' version,
600 * 8a only knows the 'wait' mnemonic but does NOT insertthe WAIT prefix byte
601 * (i.e. they act like their FNxxx variations) so WAIT instructions must be
602 * explicitly placed in the code if necessary.
604 TEXT _clts(SB), 1, $-4
608 TEXT _fldcw(SB), 1, $-4 /* Load x87 FPU Control Word */
613 TEXT _fnclex(SB), 1, $-4
617 TEXT _fninit(SB), 1, $-4
621 TEXT _fxrstor(SB), 1, $-4
625 TEXT _fxsave(SB), 1, $-4
629 TEXT _fwait(SB), 1, $-4
633 TEXT _ldmxcsr(SB), 1, $-4 /* Load MXCSR */
634 MOVQ RARG, mxcsr+0(FP)
638 TEXT _stts(SB), 1, $-4
644 TEXT mul64fract(SB), 1, $-4
646 MULQ b+16(FP) /* a*b */
651 #define RDRANDAX BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
652 #define RDRAND64AX BYTE $0x48; BYTE $0x0f; BYTE $0xc7; BYTE $0xf0
654 TEXT rdrand32(SB), $-4
660 TEXT rdrand64(SB), $-4
666 TEXT rdrandbuf(SB), $0
669 MOVLQZX cnt+8(FP), CX
681 MOVLQZX cnt+8(FP), CX
694 MOVLQZX cnt+8(FP), CX
708 /* debug register access */
710 TEXT putdr(SB), 1, $-4
714 TEXT putdr01236(SB), 1, $-4
727 TEXT getdr6(SB), 1, $-4
731 TEXT putdr6(SB), 1, $-4
735 TEXT putdr7(SB), 1, $-4
739 /* VMX instructions */
740 TEXT vmxon(SB), 1, $-4
743 BYTE $0xf3; BYTE $0x0f; BYTE $0xc7; BYTE $0x74; BYTE $0x24; BYTE $0x08
746 TEXT vmxoff(SB), 1, $-4
747 BYTE $0x0f; BYTE $0x01; BYTE $0xc4
750 TEXT vmclear(SB), 1, $-4
753 BYTE $0x66; BYTE $0x0f; BYTE $0xc7; BYTE $0x74; BYTE $0x24; BYTE $0x08
756 TEXT vmlaunch(SB), 1, $-4
759 BYTE $0x0f; BYTE $0x79; BYTE $0xfa /* VMWRITE DX, DI */
762 MOVQ $vmrestore(SB), DX
763 BYTE $0x0f; BYTE $0x79; BYTE $0xfa /* VMWRITE DX, DI */
767 MOVL resume+8(FP), AX
785 BYTE $0x0f; BYTE $0x01; BYTE $0xc2 /* VMLAUNCH */
788 BYTE $0x0f; BYTE $0x01; BYTE $0xc3 /* VMRESUME */
791 TEXT vmrestore(SB), 1, $-4
810 BYTE $0x65; MOVQ 0, RMACH /* MOVQ GS:(0), RMACH */
811 MOVQ 16(RMACH), RUSER
815 TEXT vmptrld(SB), 1, $-4
818 BYTE $0x0f; BYTE $0xc7; BYTE $0x74; BYTE $0x24; BYTE $0x08
821 TEXT vmwrite(SB), 1, $-4
824 BYTE $0x0f; BYTE $0x79; BYTE $0xea
827 TEXT vmread(SB), 1, $-4
829 /* VMREAD BP, (DI) */
830 BYTE $0x0f; BYTE $0x78; BYTE $0x2f
833 TEXT invept(SB), 1, $-4
834 /* INVEPT BP, 16(SP) */
835 BYTE $0x66; BYTE $0x0f; BYTE $0x38; BYTE $0x80; BYTE $0x6c; BYTE $0x24; BYTE $0x10
838 TEXT invvpid(SB), 1, $-4
839 /* INVVPID BP, 16(SP) */
840 BYTE $0x66; BYTE $0x0f; BYTE $0x38; BYTE $0x81; BYTE $0x6c; BYTE $0x24; BYTE $0x10
857 TEXT touser(SB), 1, $-4
864 MOVQ $(UTZERO+0x28), CX /* ip */
865 MOVL $0x200, R11 /* flags */
866 MOVQ RARG, SP /* sp */
868 BYTE $0x48; SYSRET /* SYSRETQ */
872 TEXT syscallentry(SB), 1, $-4
874 BYTE $0x65; MOVQ 0, AX /* m-> (MOVQ GS:0x0, AX) */
875 MOVQ 16(AX), BX /* m->proc */
877 MOVQ 16(BX), SP /* m->proc->kstack */
880 PUSHQ $UDSEL /* old stack segment */
881 PUSHQ R13 /* old sp */
882 PUSHQ R11 /* old flags */
883 PUSHQ $UESEL /* old code segment */
884 PUSHQ CX /* old ip */
885 PUSHQ $0 /* error code */
886 PUSHQ $64 /* trap number (VectorSYSCALL) */
888 SUBQ $(8 + 23*8-7*8), SP /* arg + sizeof(Ureg)-pushed */
890 MOVQ RMACH, (15*8)(SP) /* old r15 */
891 MOVQ RUSER, (14*8)(SP) /* old r14 */
893 MOVQ RARG, (7*8)(SP) /* system call number */
895 MOVQ AX, RMACH /* m */
896 MOVQ BX, RUSER /* up */
898 LEAQ 8(SP), RARG /* Ureg* arg */
902 TEXT forkret(SB), 1, $-4
906 MOVQ 8(SP), AX /* return value */
908 MOVQ (15*8)(SP), RMACH /* r15 */
909 MOVQ (14*8)(SP), RUSER /* r14 */
911 MOVQ (19*8)(SP), CX /* ip */
912 MOVQ (21*8)(SP), R11 /* flags */
913 MOVQ (22*8)(SP), SP /* sp */
915 BYTE $0x48; SYSRET /* SYSRETQ */
918 * Interrupt/exception handling.
921 TEXT _strayintr(SB), 1, $-4 /* no error code pushed */
922 PUSHQ AX /* save AX */
923 MOVQ 8(SP), AX /* vectortable(SB) PC */
926 TEXT _strayintrx(SB), 1, $-4 /* error code pushed */
932 SUBQ $24, SP /* R1[45], [DEFG]S */
933 CMPW 48(SP), $KESEL /* old CS */
940 BYTE $0x65; MOVQ 0, RMACH /* m-> (MOVQ GS:0x0, R15) */
941 MOVQ 16(RMACH), RUSER /* up */
962 TEXT _intrr(SB), 1, $-4
992 TEXT noteret(SB), 1, $-4
996 TEXT vectortable(SB), $0
997 CALL _strayintr(SB); BYTE $0x00 /* divide error */
998 CALL _strayintr(SB); BYTE $0x01 /* debug exception */
999 CALL _strayintr(SB); BYTE $0x02 /* NMI interrupt */
1000 CALL _strayintr(SB); BYTE $0x03 /* breakpoint */
1001 CALL _strayintr(SB); BYTE $0x04 /* overflow */
1002 CALL _strayintr(SB); BYTE $0x05 /* bound */
1003 CALL _strayintr(SB); BYTE $0x06 /* invalid opcode */
1004 CALL _strayintr(SB); BYTE $0x07 /* no coprocessor available */
1005 CALL _strayintrx(SB); BYTE $0x08 /* double fault */
1006 CALL _strayintr(SB); BYTE $0x09 /* coprocessor segment overflow */
1007 CALL _strayintrx(SB); BYTE $0x0A /* invalid TSS */
1008 CALL _strayintrx(SB); BYTE $0x0B /* segment not available */
1009 CALL _strayintrx(SB); BYTE $0x0C /* stack exception */
1010 CALL _strayintrx(SB); BYTE $0x0D /* general protection error */
1011 CALL _strayintrx(SB); BYTE $0x0E /* page fault */
1012 CALL _strayintr(SB); BYTE $0x0F /* */
1013 CALL _strayintr(SB); BYTE $0x10 /* coprocessor error */
1014 CALL _strayintrx(SB); BYTE $0x11 /* alignment check */
1015 CALL _strayintr(SB); BYTE $0x12 /* machine check */
1016 CALL _strayintr(SB); BYTE $0x13 /* simd error */
1017 CALL _strayintr(SB); BYTE $0x14
1018 CALL _strayintr(SB); BYTE $0x15
1019 CALL _strayintr(SB); BYTE $0x16
1020 CALL _strayintr(SB); BYTE $0x17
1021 CALL _strayintr(SB); BYTE $0x18
1022 CALL _strayintr(SB); BYTE $0x19
1023 CALL _strayintr(SB); BYTE $0x1A
1024 CALL _strayintr(SB); BYTE $0x1B
1025 CALL _strayintr(SB); BYTE $0x1C
1026 CALL _strayintr(SB); BYTE $0x1D
1027 CALL _strayintr(SB); BYTE $0x1E
1028 CALL _strayintr(SB); BYTE $0x1F
1029 CALL _strayintr(SB); BYTE $0x20 /* VectorLAPIC */
1030 CALL _strayintr(SB); BYTE $0x21
1031 CALL _strayintr(SB); BYTE $0x22
1032 CALL _strayintr(SB); BYTE $0x23
1033 CALL _strayintr(SB); BYTE $0x24
1034 CALL _strayintr(SB); BYTE $0x25
1035 CALL _strayintr(SB); BYTE $0x26
1036 CALL _strayintr(SB); BYTE $0x27
1037 CALL _strayintr(SB); BYTE $0x28
1038 CALL _strayintr(SB); BYTE $0x29
1039 CALL _strayintr(SB); BYTE $0x2A
1040 CALL _strayintr(SB); BYTE $0x2B
1041 CALL _strayintr(SB); BYTE $0x2C
1042 CALL _strayintr(SB); BYTE $0x2D
1043 CALL _strayintr(SB); BYTE $0x2E
1044 CALL _strayintr(SB); BYTE $0x2F
1045 CALL _strayintr(SB); BYTE $0x30
1046 CALL _strayintr(SB); BYTE $0x31
1047 CALL _strayintr(SB); BYTE $0x32
1048 CALL _strayintr(SB); BYTE $0x33
1049 CALL _strayintr(SB); BYTE $0x34
1050 CALL _strayintr(SB); BYTE $0x35
1051 CALL _strayintr(SB); BYTE $0x36
1052 CALL _strayintr(SB); BYTE $0x37
1053 CALL _strayintr(SB); BYTE $0x38
1054 CALL _strayintr(SB); BYTE $0x39
1055 CALL _strayintr(SB); BYTE $0x3A
1056 CALL _strayintr(SB); BYTE $0x3B
1057 CALL _strayintr(SB); BYTE $0x3C
1058 CALL _strayintr(SB); BYTE $0x3D
1059 CALL _strayintr(SB); BYTE $0x3E
1060 CALL _strayintr(SB); BYTE $0x3F
1061 CALL _strayintr(SB); BYTE $0x40 /* was VectorSYSCALL */
1062 CALL _strayintr(SB); BYTE $0x41
1063 CALL _strayintr(SB); BYTE $0x42
1064 CALL _strayintr(SB); BYTE $0x43
1065 CALL _strayintr(SB); BYTE $0x44
1066 CALL _strayintr(SB); BYTE $0x45
1067 CALL _strayintr(SB); BYTE $0x46
1068 CALL _strayintr(SB); BYTE $0x47
1069 CALL _strayintr(SB); BYTE $0x48
1070 CALL _strayintr(SB); BYTE $0x49
1071 CALL _strayintr(SB); BYTE $0x4A
1072 CALL _strayintr(SB); BYTE $0x4B
1073 CALL _strayintr(SB); BYTE $0x4C
1074 CALL _strayintr(SB); BYTE $0x4D
1075 CALL _strayintr(SB); BYTE $0x4E
1076 CALL _strayintr(SB); BYTE $0x4F
1077 CALL _strayintr(SB); BYTE $0x50
1078 CALL _strayintr(SB); BYTE $0x51
1079 CALL _strayintr(SB); BYTE $0x52
1080 CALL _strayintr(SB); BYTE $0x53
1081 CALL _strayintr(SB); BYTE $0x54
1082 CALL _strayintr(SB); BYTE $0x55
1083 CALL _strayintr(SB); BYTE $0x56
1084 CALL _strayintr(SB); BYTE $0x57
1085 CALL _strayintr(SB); BYTE $0x58
1086 CALL _strayintr(SB); BYTE $0x59
1087 CALL _strayintr(SB); BYTE $0x5A
1088 CALL _strayintr(SB); BYTE $0x5B
1089 CALL _strayintr(SB); BYTE $0x5C
1090 CALL _strayintr(SB); BYTE $0x5D
1091 CALL _strayintr(SB); BYTE $0x5E
1092 CALL _strayintr(SB); BYTE $0x5F
1093 CALL _strayintr(SB); BYTE $0x60
1094 CALL _strayintr(SB); BYTE $0x61
1095 CALL _strayintr(SB); BYTE $0x62
1096 CALL _strayintr(SB); BYTE $0x63
1097 CALL _strayintr(SB); BYTE $0x64
1098 CALL _strayintr(SB); BYTE $0x65
1099 CALL _strayintr(SB); BYTE $0x66
1100 CALL _strayintr(SB); BYTE $0x67
1101 CALL _strayintr(SB); BYTE $0x68
1102 CALL _strayintr(SB); BYTE $0x69
1103 CALL _strayintr(SB); BYTE $0x6A
1104 CALL _strayintr(SB); BYTE $0x6B
1105 CALL _strayintr(SB); BYTE $0x6C
1106 CALL _strayintr(SB); BYTE $0x6D
1107 CALL _strayintr(SB); BYTE $0x6E
1108 CALL _strayintr(SB); BYTE $0x6F
1109 CALL _strayintr(SB); BYTE $0x70
1110 CALL _strayintr(SB); BYTE $0x71
1111 CALL _strayintr(SB); BYTE $0x72
1112 CALL _strayintr(SB); BYTE $0x73
1113 CALL _strayintr(SB); BYTE $0x74
1114 CALL _strayintr(SB); BYTE $0x75
1115 CALL _strayintr(SB); BYTE $0x76
1116 CALL _strayintr(SB); BYTE $0x77
1117 CALL _strayintr(SB); BYTE $0x78
1118 CALL _strayintr(SB); BYTE $0x79
1119 CALL _strayintr(SB); BYTE $0x7A
1120 CALL _strayintr(SB); BYTE $0x7B
1121 CALL _strayintr(SB); BYTE $0x7C
1122 CALL _strayintr(SB); BYTE $0x7D
1123 CALL _strayintr(SB); BYTE $0x7E
1124 CALL _strayintr(SB); BYTE $0x7F
1125 CALL _strayintr(SB); BYTE $0x80 /* Vector[A]PIC */
1126 CALL _strayintr(SB); BYTE $0x81
1127 CALL _strayintr(SB); BYTE $0x82
1128 CALL _strayintr(SB); BYTE $0x83
1129 CALL _strayintr(SB); BYTE $0x84
1130 CALL _strayintr(SB); BYTE $0x85
1131 CALL _strayintr(SB); BYTE $0x86
1132 CALL _strayintr(SB); BYTE $0x87
1133 CALL _strayintr(SB); BYTE $0x88
1134 CALL _strayintr(SB); BYTE $0x89
1135 CALL _strayintr(SB); BYTE $0x8A
1136 CALL _strayintr(SB); BYTE $0x8B
1137 CALL _strayintr(SB); BYTE $0x8C
1138 CALL _strayintr(SB); BYTE $0x8D
1139 CALL _strayintr(SB); BYTE $0x8E
1140 CALL _strayintr(SB); BYTE $0x8F
1141 CALL _strayintr(SB); BYTE $0x90
1142 CALL _strayintr(SB); BYTE $0x91
1143 CALL _strayintr(SB); BYTE $0x92
1144 CALL _strayintr(SB); BYTE $0x93
1145 CALL _strayintr(SB); BYTE $0x94
1146 CALL _strayintr(SB); BYTE $0x95
1147 CALL _strayintr(SB); BYTE $0x96
1148 CALL _strayintr(SB); BYTE $0x97
1149 CALL _strayintr(SB); BYTE $0x98
1150 CALL _strayintr(SB); BYTE $0x99
1151 CALL _strayintr(SB); BYTE $0x9A
1152 CALL _strayintr(SB); BYTE $0x9B
1153 CALL _strayintr(SB); BYTE $0x9C
1154 CALL _strayintr(SB); BYTE $0x9D
1155 CALL _strayintr(SB); BYTE $0x9E
1156 CALL _strayintr(SB); BYTE $0x9F
1157 CALL _strayintr(SB); BYTE $0xA0
1158 CALL _strayintr(SB); BYTE $0xA1
1159 CALL _strayintr(SB); BYTE $0xA2
1160 CALL _strayintr(SB); BYTE $0xA3
1161 CALL _strayintr(SB); BYTE $0xA4
1162 CALL _strayintr(SB); BYTE $0xA5
1163 CALL _strayintr(SB); BYTE $0xA6
1164 CALL _strayintr(SB); BYTE $0xA7
1165 CALL _strayintr(SB); BYTE $0xA8
1166 CALL _strayintr(SB); BYTE $0xA9
1167 CALL _strayintr(SB); BYTE $0xAA
1168 CALL _strayintr(SB); BYTE $0xAB
1169 CALL _strayintr(SB); BYTE $0xAC
1170 CALL _strayintr(SB); BYTE $0xAD
1171 CALL _strayintr(SB); BYTE $0xAE
1172 CALL _strayintr(SB); BYTE $0xAF
1173 CALL _strayintr(SB); BYTE $0xB0
1174 CALL _strayintr(SB); BYTE $0xB1
1175 CALL _strayintr(SB); BYTE $0xB2
1176 CALL _strayintr(SB); BYTE $0xB3
1177 CALL _strayintr(SB); BYTE $0xB4
1178 CALL _strayintr(SB); BYTE $0xB5
1179 CALL _strayintr(SB); BYTE $0xB6
1180 CALL _strayintr(SB); BYTE $0xB7
1181 CALL _strayintr(SB); BYTE $0xB8
1182 CALL _strayintr(SB); BYTE $0xB9
1183 CALL _strayintr(SB); BYTE $0xBA
1184 CALL _strayintr(SB); BYTE $0xBB
1185 CALL _strayintr(SB); BYTE $0xBC
1186 CALL _strayintr(SB); BYTE $0xBD
1187 CALL _strayintr(SB); BYTE $0xBE
1188 CALL _strayintr(SB); BYTE $0xBF
1189 CALL _strayintr(SB); BYTE $0xC0
1190 CALL _strayintr(SB); BYTE $0xC1
1191 CALL _strayintr(SB); BYTE $0xC2
1192 CALL _strayintr(SB); BYTE $0xC3
1193 CALL _strayintr(SB); BYTE $0xC4
1194 CALL _strayintr(SB); BYTE $0xC5
1195 CALL _strayintr(SB); BYTE $0xC6
1196 CALL _strayintr(SB); BYTE $0xC7
1197 CALL _strayintr(SB); BYTE $0xC8
1198 CALL _strayintr(SB); BYTE $0xC9
1199 CALL _strayintr(SB); BYTE $0xCA
1200 CALL _strayintr(SB); BYTE $0xCB
1201 CALL _strayintr(SB); BYTE $0xCC
1202 CALL _strayintr(SB); BYTE $0xCD
1203 CALL _strayintr(SB); BYTE $0xCE
1204 CALL _strayintr(SB); BYTE $0xCF
1205 CALL _strayintr(SB); BYTE $0xD0
1206 CALL _strayintr(SB); BYTE $0xD1
1207 CALL _strayintr(SB); BYTE $0xD2
1208 CALL _strayintr(SB); BYTE $0xD3
1209 CALL _strayintr(SB); BYTE $0xD4
1210 CALL _strayintr(SB); BYTE $0xD5
1211 CALL _strayintr(SB); BYTE $0xD6
1212 CALL _strayintr(SB); BYTE $0xD7
1213 CALL _strayintr(SB); BYTE $0xD8
1214 CALL _strayintr(SB); BYTE $0xD9
1215 CALL _strayintr(SB); BYTE $0xDA
1216 CALL _strayintr(SB); BYTE $0xDB
1217 CALL _strayintr(SB); BYTE $0xDC
1218 CALL _strayintr(SB); BYTE $0xDD
1219 CALL _strayintr(SB); BYTE $0xDE
1220 CALL _strayintr(SB); BYTE $0xDF
1221 CALL _strayintr(SB); BYTE $0xE0
1222 CALL _strayintr(SB); BYTE $0xE1
1223 CALL _strayintr(SB); BYTE $0xE2
1224 CALL _strayintr(SB); BYTE $0xE3
1225 CALL _strayintr(SB); BYTE $0xE4
1226 CALL _strayintr(SB); BYTE $0xE5
1227 CALL _strayintr(SB); BYTE $0xE6
1228 CALL _strayintr(SB); BYTE $0xE7
1229 CALL _strayintr(SB); BYTE $0xE8
1230 CALL _strayintr(SB); BYTE $0xE9
1231 CALL _strayintr(SB); BYTE $0xEA
1232 CALL _strayintr(SB); BYTE $0xEB
1233 CALL _strayintr(SB); BYTE $0xEC
1234 CALL _strayintr(SB); BYTE $0xED
1235 CALL _strayintr(SB); BYTE $0xEE
1236 CALL _strayintr(SB); BYTE $0xEF
1237 CALL _strayintr(SB); BYTE $0xF0
1238 CALL _strayintr(SB); BYTE $0xF1
1239 CALL _strayintr(SB); BYTE $0xF2
1240 CALL _strayintr(SB); BYTE $0xF3
1241 CALL _strayintr(SB); BYTE $0xF4
1242 CALL _strayintr(SB); BYTE $0xF5
1243 CALL _strayintr(SB); BYTE $0xF6
1244 CALL _strayintr(SB); BYTE $0xF7
1245 CALL _strayintr(SB); BYTE $0xF8
1246 CALL _strayintr(SB); BYTE $0xF9
1247 CALL _strayintr(SB); BYTE $0xFA
1248 CALL _strayintr(SB); BYTE $0xFB
1249 CALL _strayintr(SB); BYTE $0xFC
1250 CALL _strayintr(SB); BYTE $0xFD
1251 CALL _strayintr(SB); BYTE $0xFE
1252 CALL _strayintr(SB); BYTE $0xFF