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 33TEXT 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 53TEXT _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 75TEXT _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 */ 88TEXT 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 116TEXT 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 */ 140TEXT ltr(SB), $0 /* TR - task register */ 141 MOVL tptr+0(FP), AX 142 MOVW AX, TASK 143 RET 144 145TEXT invlpg(SB), $0 146 /* 486+ only */ 147 MOVL va+0(FP), CX 148 INVLPG 149 RET 150 151TEXT 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 */ 160TEXT 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 */ 173TEXT 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 ;\ 226l: ;\ 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 237TEXT fpoff(SB), $0 /* disable */ 238 FPOFF(l1) 239 RET 240 241TEXT 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 */ 256TEXT tas(SB), $0 257 MOVL $0xDEADDEAD, AX 258 MOVL lock+0(FP), BX 259 XCHGL AX, (BX) /* lock->key */ 260 RET 261 262TEXT _xinc(SB), $0 /* void _xinc(long*); */ 263 MOVL l+0(FP), AX 264 LOCK; INCL 0(AX) 265 RET 266 267TEXT _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 281TEXT xchgw(SB), $0 282 MOVL v+4(FP), AX 283 MOVL p+0(FP), BX 284 XCHGW AX, (BX) 285 RET 286 287TEXT 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 296didnt: 297 XORL AX,AX 298 RET 299 300TEXT 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 */ 331TEXT 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 339TEXT 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 */ 350TEXT 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 */ 371TEXT _strayintr(SB), $0 372 PUSHL AX /* save AX */ 373 MOVL 4(SP), AX /* return PC from vectortable(SB) */ 374 JMP intrcommon 375 376TEXT _strayintrx(SB), $0 377 XCHGL AX, (SP) /* swap AX with vectortable CALL PC */ 378intrcommon: 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 396TEXT 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 406TEXT 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 664