|
|
1.1 ! root 1: ;----------------------------------------------------------------------------; ! 2: ; RAZE-x86 Z80 emulator. ! 3: ; version 1.06 ! 4: ; ! 5: ; Copyright (c) 1999 Richard Mitton ! 6: ; ! 7: ; This may only be distributed as part of the complete RAZE package. ! 8: ; See RAZE.TXT for license information. ! 9: ;----------------------------------------------------------------------------; ! 10: ! 11: ! 12: ; You are not expected to understand this. ! 13: ! 14: ! 15: ;----------------------------------------------------------------------------; ! 16: ; Comment these in/out for faster speed (less accurate): ! 17: %define EMULATE_UNDOC_FLAGS ; a couple of undocumented flags ! 18: %define EMULATE_BITS_3_5 ; bits 3/5 of the flags (undocumented) ! 19: %define EMULATE_WEIRD_STUFF ; misc *very obscure* undocumented behaviour ! 20: %define EMULATE_R_REGISTER ; precise R register (not usually needed) ! 21: ;;;;%define USE_FETCH_CALLBACK ; call a callback for every fetch (slow!) ! 22: ;----------------------------------------------------------------------------; ! 23: ! 24: ; Registers: ! 25: ; AF = ax (flags in AH) ! 26: ; HL = bx ! 27: ; BC = cx ! 28: ; PC = si ! 29: ; R = ebp ! 30: ; ! 31: ; GCC wants EBX, ESI, EDI, ESP, and EBP to be preserved at all times ! 32: ; DH should always be clear between macros ! 33: ; The high 16-bits of all registers should be clear at all times (except EBP) ! 34: ; This assumes LAHF will set bit 1 of AH. (supposed to be undefined...) ! 35: ! 36: BITS 32 ! 37: SECTION .bss USE32 ! 38: ! 39: ; Maximum number of memory handlers ! 40: %define MAX_MEM_HANDLERS 64 ! 41: ! 42: ; The current context ! 43: align 16 ! 44: context_start: ! 45: z80_AF resd 1 ! 46: z80_BC resd 1 ! 47: z80_DE resd 1 ! 48: z80_HL resd 1 ! 49: z80_IX resd 1 ! 50: z80_IY resd 1 ! 51: z80_PC resd 1 ! 52: z80_SP resd 1 ! 53: z80_AF2 resd 1 ! 54: z80_BC2 resd 1 ! 55: z80_DE2 resd 1 ! 56: z80_HL2 resd 1 ! 57: z80_IFF1 resb 1 ! 58: z80_IFF2 resb 1 ! 59: z80_R resd 1 ! 60: z80_R2 resd 1 ! 61: z80_I resb 1 ! 62: z80_flag35 resb 1 ! 63: z80_IM resb 1 ! 64: z80_IRQVector resb 1 ! 65: z80_IRQLine resb 1 ! 66: z80_halted resb 1 ! 67: z80_Extra_Cycles resd 1 ! 68: registers_end: ! 69: ! 70: z80_Fetch resd 256 ! 71: z80_Read resd (256*2) ! 72: z80_Write resd (256*2) ! 73: z80_In resd 1 ! 74: z80_Out resd 1 ! 75: z80_RetI resd 1 ! 76: z80_Fetch_Callback resd 1 ! 77: _read_handlers resd 4*MAX_MEM_HANDLERS ! 78: _write_handlers resd 4*MAX_MEM_HANDLERS ! 79: context_end: ! 80: resd 1 ; safety gap, so z80_reset can use 32-bit transfers ! 81: ! 82: ; Variables ! 83: z80_ICount resd 1 ! 84: z80_Initial_ICount resd 1 ! 85: z80_TempICount resd 1 ! 86: z80_afterEI resb 1 ! 87: ! 88: SECTION .text USE32 ! 89: ;----------------------------------------------------------------------------; ! 90: ; Prepare to call a GCC function ! 91: %macro CALLGCC_START 0 ! 92: mov [z80_AF], ezAF ; eax ! 93: mov [z80_BC], ezBC ; ecx ! 94: mov [z80_PC], ezPC ; esi ! 95: mov [z80_R], zR ; ebp ! 96: %endmacro ! 97: ! 98: ; Return from a GCC function ! 99: %macro CALLGCC_END 0 ! 100: mov ezAF, [z80_AF] ; eax ! 101: mov ezBC, [z80_BC] ; ecx ! 102: mov ezPC, [z80_PC] ; esi ! 103: mov zR, [z80_R] ; ebp ! 104: %endmacro ! 105: ! 106: ; Read a byte from the PC, into DL ! 107: ; GETBYTE ! 108: %macro GETBYTE 0 ! 109: %ifdef USE_FETCH_CALLBACK ! 110: CALLGCC_START ! 111: push ezPC ! 112: call [z80_Fetch_Callback] ! 113: add esp, 4 ! 114: CALLGCC_END ! 115: %endif ! 116: mov edx, ezPC ! 117: shr edx, 8 ! 118: mov edi, [z80_Fetch+edx*4] ! 119: ! 120: mov dl, [edi+ezPC] ! 121: inc zPC ! 122: xor edi, edi ! 123: %endmacro ! 124: ! 125: ; Read a byte from the PC, sign-extended into DI ! 126: ; GETDISP ! 127: %macro GETDISP 0 ! 128: %ifdef USE_FETCH_CALLBACK ! 129: CALLGCC_START ! 130: push ezPC ! 131: call [z80_Fetch_Callback] ! 132: add esp, 4 ! 133: CALLGCC_END ! 134: %endif ! 135: mov edx, ezPC ! 136: shr edx, 8 ! 137: mov edx, [z80_Fetch+edx*4] ! 138: ! 139: movsx di, [edx+ezPC] ! 140: inc zPC ! 141: xor edx, edx ! 142: %endmacro ! 143: ! 144: ; Read a word from the PC, into DI ! 145: ; GETWORD ! 146: %macro GETWORD 0 ! 147: %ifdef USE_FETCH_CALLBACK ! 148: CALLGCC_START ! 149: push ezPC ! 150: call [z80_Fetch_Callback] ! 151: add esp, 4 ! 152: CALLGCC_END ! 153: %endif ! 154: mov [z80_BC], ezBC ! 155: mov edx, ezPC ; low byte ! 156: shr edx, 8 ! 157: mov edi, [z80_Fetch+edx*4] ! 158: ! 159: mov dl, [edi+ezPC] ! 160: inc zPC ! 161: ! 162: %ifdef USE_FETCH_CALLBACK ! 163: push edx ! 164: CALLGCC_START ! 165: push ezPC ! 166: call [z80_Fetch_Callback] ! 167: add esp, 4 ! 168: CALLGCC_END ! 169: pop edx ! 170: %endif ! 171: mov ecx, ezPC ; high byte ! 172: shr ecx, 8 ! 173: mov edi, [z80_Fetch+ecx*4] ! 174: ! 175: mov dh, [edi+ezPC] ! 176: inc zPC ! 177: mov edi, edx ! 178: mov ezBC, [z80_BC] ! 179: xor edx, edx ! 180: %endmacro ! 181: ! 182: ; Read a byte from memory (DI) into DL ! 183: ; MEMREAD ! 184: %macro MEMREAD 0 ! 185: CALLGCC_START ! 186: mov edx, edi ! 187: shr edx, 8 ! 188: mov ecx, [z80_Read+edx*8] ! 189: ! 190: test ecx, ecx ; if handler exists, call it ! 191: jnz %%handler ! 192: ; no handler, so go direct ! 193: mov ecx, [z80_Read+edx*8+4] ! 194: mov dl, [ecx+edi] ! 195: jmp %%finish ! 196: ! 197: %%handler: ! 198: push edi ! 199: call ecx ! 200: xor edx, edx ! 201: add esp, 4 ! 202: mov dl, al ! 203: %%finish: ! 204: CALLGCC_END ! 205: %endmacro ! 206: ! 207: ; Write a byte in DL to memory (DI) ! 208: %macro MEMWRITE 0 ! 209: CALLGCC_START ! 210: xor eax, eax ! 211: mov al, dl ! 212: ! 213: mov edx, edi ! 214: shr edx, 8 ! 215: mov ecx, [z80_Write+edx*8] ! 216: ! 217: test ecx, ecx ; if handler exists, call it ! 218: jnz %%handler ! 219: ; no handler, so go direct ! 220: mov ecx, [z80_Write+edx*8+4] ! 221: mov [ecx+edi], al ! 222: jmp %%finish ! 223: ! 224: %%handler: ! 225: push eax ! 226: push edi ! 227: call ecx ! 228: add esp, 8 ! 229: %%finish: ! 230: CALLGCC_END ! 231: xor edx, edx ! 232: %endmacro ! 233: ! 234: ; Read a byte from port (DI) into DL ! 235: ; IOREAD ! 236: %macro IOREAD 0 ! 237: push edi ! 238: CALLGCC_START ! 239: call [z80_In] ! 240: xor edx, edx ! 241: add esp, 4 ! 242: mov dl, al ! 243: CALLGCC_END ! 244: %endmacro ! 245: ! 246: ; Write a byte in DL to port (DI) ! 247: %macro IOWRITE 0 ! 248: CALLGCC_START ! 249: xor dh, dh ! 250: push edx ! 251: push edi ! 252: call [z80_Out] ! 253: add esp, 8 ! 254: CALLGCC_END ! 255: xor edx, edx ! 256: %endmacro ! 257: ! 258: ; Align code to the default boundary ! 259: %macro ALIGN 0 ! 260: align 4 ! 261: %endmacro ! 262: ! 263: ; Define an instruction ! 264: ; DEF prefix, opcode, std_cycles, extra_cycles ! 265: %macro DEF 4 ! 266: ALIGN ! 267: %define std_cycles %3 ! 268: %define extra_cycles %4 ! 269: %{1}_%2: ! 270: %endmacro ! 271: ! 272: ; Subtract the clock cycles for this instruction from the ICount ! 273: %macro DO_CYCLES 0 ! 274: sub dword [z80_ICount], std_cycles ! 275: jbe near z80_finish ! 276: %endmacro ! 277: ! 278: ; Subtract the extra clock cycles for this instruction from the ICount ! 279: %macro DO_EXTRA_CYCLES 0 ! 280: sub dword [z80_ICount], extra_cycles ! 281: jbe near z80_finish ! 282: %endmacro ! 283: ! 284: ; Finish straight away ! 285: %macro EXIT 0 ! 286: jmp z80_finish ! 287: %endmacro ! 288: ! 289: ; Jump to the next instruction ! 290: %macro NEXT 0 ! 291: %ifdef EMULATE_R_REGISTER ! 292: inc zR ! 293: %endif ! 294: GETBYTE ! 295: jmp [OpTable+edx*4] ! 296: %endmacro ! 297: ! 298: ; Check the IRQ line, cause an interrupt if needed ! 299: %macro CHECK_IRQ 0 ! 300: cmp [z80_IRQLine], byte 0 ; check the IRQ line ! 301: je near %%finish ! 302: cmp [z80_IFF1], byte 0 ; check ints are enabled ! 303: je near %%finish ! 304: ! 305: ; disable interrupts ! 306: mov [z80_IFF1], byte 0 ! 307: mov [z80_IFF2], byte 0 ! 308: %ifdef EMULATE_R_REGISTER ! 309: inc zR ! 310: %endif ! 311: ! 312: mov [z80_halted], byte 0 ; Un-HALT the Z80 ! 313: ! 314: mov edx, ezPC ; write the PC ! 315: dec zSP ! 316: ! 317: xchg dl, dh ! 318: mov edi, ezSP ! 319: MEMWRITE ! 320: dec zSP ! 321: mov edx, ezPC ! 322: mov edi, ezSP ! 323: MEMWRITE ! 324: ! 325: cmp [z80_IM], byte 0 ! 326: jne %%not_im0 ! 327: ; IM 0, 13 T-states ! 328: add [z80_Extra_Cycles], dword 13 ! 329: mov dl, [z80_IRQVector] ! 330: sub dl, 0c7h ! 331: movzx ezPC, dl ! 332: jmp %%finish ! 333: ! 334: %%not_im0: ! 335: cmp [z80_IM], byte 1 ! 336: jne %%not_im1 ! 337: ; IM 1, 13 T-states ! 338: add [z80_Extra_Cycles], dword 13 ! 339: mov ezPC, 38h ! 340: jmp %%finish ! 341: ! 342: %%not_im1: ! 343: ; IM 2, 19 T-states ! 344: add [z80_Extra_Cycles], dword 19 ! 345: mov dl, [z80_IRQVector] ! 346: mov dh, zI ! 347: mov edi, edx ! 348: MEMREAD ! 349: inc di ! 350: mov ezPC, edx ! 351: MEMREAD ! 352: xchg dl, dh ! 353: or ezPC, edx ! 354: xor dh, dh ! 355: %%finish: ! 356: %endmacro ! 357: ! 358: ;----------------------------------------------------------------------------; ! 359: ; Helper functions ! 360: ! 361: ; Add A, %1 ! 362: %macro DO_ADD 1 ! 363: add zA, %1 ! 364: %ifdef EMULATE_BITS_3_5 ! 365: mov [z80_flag35], zA ! 366: %endif ! 367: lahf ! 368: jo %%set_overflow ! 369: ! 370: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C ! 371: jmp %%finish ! 372: ! 373: %%set_overflow: ! 374: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C ! 375: or zF, FLAG_P ! 376: %%finish: ! 377: %endmacro ! 378: ! 379: ; Sub A, %1 ! 380: %macro DO_SUB 1 ! 381: sub zA, %1 ! 382: %ifdef EMULATE_BITS_3_5 ! 383: mov [z80_flag35], zA ! 384: %endif ! 385: lahf ! 386: jo %%set_overflow ! 387: ! 388: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C|FLAG_N ! 389: jmp %%finish ! 390: ! 391: %%set_overflow: ! 392: or zF, FLAG_P ! 393: %%finish: ! 394: %endmacro ! 395: ! 396: ; Adc A, %1 ! 397: %macro DO_ADC 1 ! 398: ror zF, 1 ! 399: adc zA, %1 ! 400: %ifdef EMULATE_BITS_3_5 ! 401: mov [z80_flag35], zA ! 402: %endif ! 403: lahf ! 404: jo %%set_overflow ! 405: ! 406: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C ! 407: jmp %%finish ! 408: ! 409: %%set_overflow: ! 410: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C ! 411: or zF, FLAG_P ! 412: %%finish: ! 413: %endmacro ! 414: ! 415: ; Sbc A, %1 ! 416: %macro DO_SBC 1 ! 417: ror zF, 1 ! 418: sbb zA, %1 ! 419: %ifdef EMULATE_BITS_3_5 ! 420: mov [z80_flag35], zA ! 421: %endif ! 422: lahf ! 423: jo %%set_overflow ! 424: ! 425: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_C|FLAG_N ! 426: jmp %%finish ! 427: ! 428: %%set_overflow: ! 429: or zF, FLAG_P ! 430: %%finish: ! 431: %endmacro ! 432: ! 433: ; And A, %1 ! 434: %macro DO_AND 1 ! 435: and zA, %1 ! 436: %ifdef EMULATE_BITS_3_5 ! 437: mov [z80_flag35], zA ! 438: %endif ! 439: lahf ! 440: and zF, ~(FLAG_N|FLAG_C) ; clear N and carry ! 441: or zF, FLAG_H ; set half-carry ! 442: %endmacro ! 443: ! 444: ; Or A, %1 ! 445: %macro DO_OR 1 ! 446: or zA, %1 ! 447: %ifdef EMULATE_BITS_3_5 ! 448: mov [z80_flag35], zA ! 449: %endif ! 450: lahf ! 451: and zF, ~(FLAG_N|FLAG_C|FLAG_H) ; clear N, carry and half-carry ! 452: %endmacro ! 453: ! 454: ; Xor A, %1 ! 455: %macro DO_XOR 1 ! 456: xor zA, %1 ! 457: %ifdef EMULATE_BITS_3_5 ! 458: mov [z80_flag35], zA ! 459: %endif ! 460: lahf ! 461: and zF, ~(FLAG_N|FLAG_C|FLAG_H) ; clear N, carry and half-carry ! 462: %endmacro ! 463: ! 464: ; Cp A, %1 ! 465: %macro DO_CP 1 ! 466: %ifdef EMULATE_BITS_3_5 ! 467: mov ah, %1 ! 468: mov [z80_flag35], ah ! 469: %endif ! 470: cmp zA, %1 ! 471: lahf ! 472: jo %%overflow ! 473: ! 474: and zF, ~FLAG_P ; clear the overflow ! 475: or zF, FLAG_N ; set the N flag ! 476: jmp %%finish ! 477: ! 478: %%overflow: ! 479: or zF, FLAG_P|FLAG_N ; set the overflow and N flag ! 480: %%finish: ! 481: %endmacro ! 482: ! 483: ; Inc %1 ! 484: %macro DO_INC 1 ! 485: and zF, FLAG_C ; leave carry alone ! 486: %ifnidn %1, dl ! 487: mov dl, %1 ! 488: %endif ! 489: or zF, [INC_Table+edx] ! 490: inc %1 ! 491: %ifdef EMULATE_BITS_3_5 ! 492: %ifnidn %1, dl ! 493: inc dl ! 494: %endif ! 495: mov [z80_flag35], dl ! 496: %endif ! 497: %endmacro ! 498: ! 499: ; Dec %1 ! 500: %macro DO_DEC 1 ! 501: and zF, FLAG_C ; leave carry alone ! 502: %ifnidn %1, dl ! 503: mov dl, %1 ! 504: %endif ! 505: or zF, [DEC_Table+edx] ! 506: dec %1 ! 507: %ifdef EMULATE_BITS_3_5 ! 508: %ifnidn %1, dl ! 509: dec dl ! 510: %endif ! 511: mov [z80_flag35], dl ! 512: %endif ! 513: %endmacro ! 514: ! 515: ; Add16 %1, %2 ! 516: %macro DO_ADD16 2 ! 517: %ifidn %2, dx ! 518: %error "DX used as parameter for DO_ADD16!" ! 519: %endif ! 520: mov edi, e%2 ! 521: %ifdef EMULATE_UNDOC_FLAGS ! 522: mov edx, e%1 ! 523: %endif ! 524: and zF, FLAG_S|FLAG_Z|FLAG_P ! 525: ! 526: add %1, di ; do it ! 527: adc zF, 0 ; merge the new carry in ! 528: ! 529: %ifdef EMULATE_UNDOC_FLAGS ! 530: xor edx, e%1 ; work out our new half-carry ! 531: xor edx, edi ! 532: and dh, FLAG_H ! 533: or zF, dh ! 534: %endif ! 535: ! 536: %ifdef EMULATE_BITS_3_5 ! 537: mov dl, h%1 ! 538: mov [z80_flag35], dl ! 539: %endif ! 540: %ifdef EMULATE_UNDOC_FLAGS ! 541: xor dh, dh ! 542: %endif ! 543: %endmacro ! 544: ! 545: ; Adc16 %1, %2 ! 546: %macro DO_ADC16 2 ! 547: %ifidn %2, dx ! 548: %error "DX used as parameter for DO_ADC16!" ! 549: %endif ! 550: mov edi, e%2 ! 551: %ifdef EMULATE_UNDOC_FLAGS ! 552: mov edx, e%1 ! 553: %endif ! 554: ror zF, 1 ; load the carry ! 555: adc %1, %2 ! 556: lahf ! 557: jo %%overflow ! 558: ! 559: and zF, ~(FLAG_N|FLAG_H|FLAG_P) ; clear N,H and overflow ! 560: jmp %%finish ! 561: ! 562: %%overflow: ! 563: and zF, ~(FLAG_N|FLAG_H) ; clear N and H ! 564: or zF, FLAG_P ; set overflow ! 565: %%finish: ! 566: ! 567: %ifdef EMULATE_UNDOC_FLAGS ! 568: xor edx, e%1 ; work out our new half-carry ! 569: xor edx, edi ! 570: and dh, FLAG_H ! 571: or zF, dh ! 572: %endif ! 573: ! 574: %ifdef EMULATE_BITS_3_5 ! 575: mov dl, h%1 ! 576: mov [z80_flag35], dl ! 577: %endif ! 578: %ifdef EMULATE_UNDOC_FLAGS ! 579: xor dh, dh ! 580: %endif ! 581: %endmacro ! 582: ! 583: ; Sbc16 %1, %2 ! 584: %macro DO_SBC16 2 ! 585: %ifidn %2, dx ! 586: %error "DX used as parameter for DO_SBC16!" ! 587: %endif ! 588: %ifdef EMULATE_UNDOC_FLAGS ! 589: mov edi, e%2 ! 590: %endif ! 591: mov edx, e%1 ! 592: ror zF, 1 ; load the carry ! 593: sbb %1, %2 ! 594: lahf ! 595: jo %%overflow ! 596: ! 597: and zF, ~(FLAG_P|FLAG_H) ; clear H and overflow ! 598: or zF, FLAG_N ; set N ! 599: jmp %%finish ! 600: ! 601: %%overflow: ! 602: or zF, FLAG_N|FLAG_P ; set overflow and N ! 603: and zF, ~FLAG_H ; clear H ! 604: %%finish: ! 605: ! 606: %ifdef EMULATE_UNDOC_FLAGS ! 607: xor edx, e%1 ; work out our new half-carry ! 608: xor edx, edi ! 609: and dh, FLAG_H ! 610: or zF, dh ! 611: %endif ! 612: ! 613: %ifdef EMULATE_BITS_3_5 ! 614: mov dl, h%1 ! 615: mov [z80_flag35], dl ! 616: %endif ! 617: %ifdef EMULATE_UNDOC_FLAGS ! 618: xor dh, dh ! 619: %endif ! 620: %endmacro ! 621: ! 622: ; Rotate method, reg8 ! 623: %macro DO_ROT 2 ! 624: %ifidn %1, RLA ! 625: mov dl, zF ! 626: and dl, FLAG_S|FLAG_Z|FLAG_P ! 627: sahf ! 628: rcl zA, 1 ! 629: adc dl, 0 ! 630: %ifdef EMULATE_BITS_3_5 ! 631: mov [z80_flag35], zA ! 632: %endif ! 633: mov zF, dl ! 634: %elifidn %1, RRA ! 635: mov dl, zF ! 636: and dl, FLAG_S|FLAG_Z|FLAG_P ! 637: sahf ! 638: rcr zA, 1 ! 639: adc dl, 0 ! 640: %ifdef EMULATE_BITS_3_5 ! 641: mov [z80_flag35], zA ! 642: %endif ! 643: mov zF, dl ! 644: %elifidn %1, RLCA ! 645: and zF, FLAG_S|FLAG_Z|FLAG_P ! 646: rol zA, 1 ! 647: adc zF, 0 ! 648: %ifdef EMULATE_BITS_3_5 ! 649: mov [z80_flag35], zA ! 650: %endif ! 651: %elifidn %1, RRCA ! 652: and zF, FLAG_S|FLAG_Z|FLAG_P ! 653: ror zA, 1 ! 654: adc zF, 0 ! 655: %ifdef EMULATE_BITS_3_5 ! 656: mov [z80_flag35], zA ! 657: %endif ! 658: %else ! 659: %ifnidn %2, dl ! 660: mov dl, %2 ! 661: %endif ! 662: ! 663: %ifidn %1, RLC ! 664: rol dl, 1 ! 665: %elifidn %1, RRC ! 666: ror dl, 1 ! 667: %elifidn %1, RL ! 668: sahf ! 669: rcl dl, 1 ! 670: %elifidn %1, RR ! 671: sahf ! 672: rcr dl, 1 ! 673: %endif ! 674: ! 675: adc dh, dh ! 676: test dl, dl ! 677: lahf ! 678: and zF, FLAG_S|FLAG_Z|FLAG_P ! 679: or zF, dh ! 680: %ifdef EMULATE_BITS_3_5 ! 681: mov [z80_flag35], dl ! 682: %endif ! 683: %ifnidn %2, dl ! 684: mov %2, dl ! 685: %endif ! 686: xor dh, dh ! 687: %endif ! 688: %endmacro ! 689: ! 690: ; Shift method, reg8 ! 691: %macro DO_SHF 2 ! 692: %ifnidn %2, dl ! 693: mov dl, %2 ! 694: %endif ! 695: ! 696: %ifidn %1, SLA ! 697: add dl, dl ! 698: adc dh, dh ! 699: %elifidn %1, SLL ! 700: add dl, dl ! 701: adc dh, dh ! 702: inc dl ! 703: %elifidn %1, SRA ! 704: sar dl, 1 ! 705: adc dh, dh ! 706: %elifidn %1, SRL ! 707: shr dl, 1 ! 708: adc dh, dh ! 709: %endif ! 710: ! 711: test dl, dl ! 712: lahf ! 713: and zF, FLAG_S|FLAG_Z|FLAG_P ! 714: or zF, dh ! 715: %ifdef EMULATE_BITS_3_5 ! 716: mov [z80_flag35], dl ! 717: %endif ! 718: %ifnidn %2, dl ! 719: mov %2, dl ! 720: %endif ! 721: xor dh, dh ! 722: %endmacro ! 723: ! 724: ; BIT r,n n = bit (0-7) ! 725: ; r = 8-bit register ! 726: %macro DO_BIT 2 ! 727: and zF, FLAG_C ! 728: test %1, (1 << %2) ! 729: %ifdef EMULATE_BITS_3_5 ! 730: ; bit 3 and 5 are set from the register ! 731: ; (actually they are bizarrely set, but ! 732: ; there's no point emulating that, it's just ! 733: ; plain silly...) ! 734: %ifnidn %1, dl ! 735: mov dl, %1 ; put in DL if not there already ! 736: %endif ! 737: mov [z80_flag35], dl ! 738: %endif ! 739: ! 740: jz %%bit_is_clear ! 741: %ifidn %2, 7 ! 742: or zF, FLAG_H|FLAG_S ; set sign bit, if testing bit 7 ! 743: %else ! 744: or zF, FLAG_H ; set half-carry, and parity ! 745: %endif ! 746: jmp %%finish ! 747: ! 748: %%bit_is_clear: ! 749: or zF, FLAG_H|FLAG_Z|FLAG_P ; set half-carry, parity, and zero ! 750: %%finish: ! 751: %endmacro ! 752: ! 753: ; SET r,n n = bit (0-7) ! 754: ; r = 8-bit register ! 755: %macro DO_SET 2 ! 756: or %1, (1 << %2) ! 757: %endmacro ! 758: ! 759: ; RES r,n n = bit (0-7) ! 760: ; r = 8-bit register ! 761: %macro DO_RES 2 ! 762: and %1, ~(1 << %2) ! 763: %endmacro ! 764: ! 765: ;----------------------------------------------------------------------------; ! 766: ; Here are the interface functions: ! 767: ! 768: ; Move a register to another ! 769: ; LD_R_R d8, s8 s8 = src reg, d8 = dest reg ! 770: %macro LD_R_R 2 ! 771: %ifnidn %1, %2 ! 772: %ifidn %2, D ! 773: mov dl, zD ! 774: mov z%1, dl ! 775: %elifidn %2, E ! 776: mov dl, zE ! 777: mov z%1, dl ! 778: %else ! 779: mov z%1, z%2 ! 780: %endif ! 781: %endif ! 782: DO_CYCLES ! 783: NEXT ! 784: %endmacro ! 785: ! 786: ; Move a register to another (IXh/IXl) ! 787: ; LD_XYr_XYr d8, s8 s8 = src reg, d8 = dest reg ! 788: %macro LD_XYr_XYr 2 ! 789: %ifnidn %1, %2 ! 790: mov dl, z%2 ! 791: mov z%1, dl ! 792: %endif ! 793: DO_CYCLES ! 794: NEXT ! 795: %endmacro ! 796: ! 797: ; Move an immediate byte into a register ! 798: ; LD_R_N d8 d8 = dest reg ! 799: %macro LD_R_N 1 ! 800: GETBYTE ! 801: mov z%1, dl ! 802: DO_CYCLES ! 803: NEXT ! 804: %endmacro ! 805: ! 806: ; Move from (RR) into a register ! 807: ; LD_R_mRR d8, s16 d8 = dest reg, s16 = src reg ! 808: %macro LD_R_mRR 2 ! 809: mov edi, ez%2 ! 810: MEMREAD ! 811: mov z%1, dl ! 812: DO_CYCLES ! 813: NEXT ! 814: %endmacro ! 815: ! 816: ; Move from (XY+dd) into a register ! 817: ; LD_R_mXY d8, s16 d8 = dest reg, s16 = src reg ! 818: %macro LD_R_mXY 2 ! 819: GETDISP ! 820: add di, z%2 ! 821: MEMREAD ! 822: mov z%1, dl ! 823: DO_CYCLES ! 824: NEXT ! 825: %endmacro ! 826: ! 827: ; Move from a register into (RR) ! 828: ; LD_mRR_R d16, s8 d16 = destreg, s8 = src reg ! 829: %macro LD_mRR_R 2 ! 830: mov edi, ez%1 ! 831: mov dl, z%2 ! 832: MEMWRITE ! 833: DO_CYCLES ! 834: NEXT ! 835: %endmacro ! 836: ! 837: ; Move from a register into (XY+dd) ! 838: ; LD_mXY_R d16, s8 d16 = dest reg, s8 = src reg ! 839: %macro LD_mXY_R 2 ! 840: GETDISP ! 841: add di, z%1 ! 842: mov dl, z%2 ! 843: MEMWRITE ! 844: DO_CYCLES ! 845: NEXT ! 846: %endmacro ! 847: ! 848: ; Move an immediate into (RR) ! 849: ; LD_mRR_N d16 d16 = dest reg ! 850: %macro LD_mRR_N 1 ! 851: GETBYTE ! 852: mov edi, ez%1 ! 853: MEMWRITE ! 854: DO_CYCLES ! 855: NEXT ! 856: %endmacro ! 857: ! 858: ; Move an immediate into (XY+dd) ! 859: ; LD_mXY_N d16 d16 = dest reg ! 860: %macro LD_mXY_N 1 ! 861: GETDISP ! 862: add di, z%1 ! 863: push edi ! 864: GETBYTE ! 865: pop edi ! 866: MEMWRITE ! 867: DO_CYCLES ! 868: NEXT ! 869: %endmacro ! 870: ! 871: ; Move from (NN) into a register ! 872: ; LD_R_mNN d8 d8 = dest reg ! 873: %macro LD_R_mNN 1 ! 874: GETWORD ! 875: MEMREAD ! 876: mov z%1, dl ! 877: DO_CYCLES ! 878: NEXT ! 879: %endmacro ! 880: ! 881: ; Move from a register into (NN) ! 882: ; LD_mNN_R s8 s8 = src reg ! 883: %macro LD_mNN_R 1 ! 884: GETWORD ! 885: mov dl, z%1 ! 886: MEMWRITE ! 887: DO_CYCLES ! 888: NEXT ! 889: %endmacro ! 890: ! 891: ; Move the Interrupt register into a register ! 892: ; LD_R_I d8 d8 = dest reg ! 893: %macro LD_R_I 1 ! 894: mov z%1, zI ! 895: and zF, FLAG_C ; keep old carry ! 896: mov dl, zF ! 897: ! 898: test z%1, z%1 ! 899: lahf ! 900: and zF, FLAG_S|FLAG_Z ; set S/Z from the I register ! 901: or zF, dl ! 902: or zF, [z80_IFF2] ! 903: %ifdef EMULATE_BITS_3_5 ! 904: mov [z80_flag35], z%1 ! 905: %endif ! 906: DO_CYCLES ! 907: NEXT ! 908: %endmacro ! 909: ! 910: ; Move a register into the Interrupt register ! 911: ; LD_I_R s8 s8 = src reg ! 912: %macro LD_I_R 1 ! 913: mov zI, z%1 ! 914: DO_CYCLES ! 915: NEXT ! 916: %endmacro ! 917: ! 918: ; Move the Refresh register into a register ! 919: ; LD_R_Rf d8 d8 = dest reg ! 920: %macro LD_R_Rf 1 ! 921: mov edx, [z80_R2] ! 922: and edx, 80h ; take bits 0-6 from R, bit 7 from R2 ! 923: ! 924: %ifndef EMULATE_R_REGISTER ! 925: ; attempt to fake the R-register ! 926: ; take the ICount, invert it, divide by 4 ! 927: ; this produces an increasing counter, roughly proportional to ! 928: ; the number of instructions done ! 929: mov zR, [z80_ICount] ! 930: not zR ! 931: shr zR, 2 ! 932: %endif ! 933: ! 934: and zR, 7fh ! 935: or edx, zR ! 936: mov z%1, dl ! 937: ! 938: mov dl, zF ! 939: and dl, FLAG_C ; keep the old carry ! 940: ! 941: test z%1, z%1 ! 942: lahf ! 943: and zF, FLAG_S|FLAG_Z ! 944: or zF, dl ! 945: or zF, [z80_IFF2] ! 946: %ifdef EMULATE_BITS_3_5 ! 947: mov [z80_flag35], z%1 ! 948: %endif ! 949: DO_CYCLES ! 950: NEXT ! 951: %endmacro ! 952: ! 953: ; Move a register into the Refresh register ! 954: ; LD_Rf_R s8 s8 = src reg ! 955: %macro LD_Rf_R 1 ! 956: mov dl, z%1 ! 957: mov zR, edx ! 958: mov [z80_R2], edx ! 959: DO_CYCLES ! 960: NEXT ! 961: %endmacro ! 962: ! 963: ; Move a 16-bit immediate into a register ! 964: ; LD_RR_NN d16 d16 = dest reg ! 965: %macro LD_RR_NN 1 ! 966: GETWORD ! 967: mov ez%1, edi ! 968: DO_CYCLES ! 969: NEXT ! 970: %endmacro ! 971: ! 972: ; Move from (NN) into a 16-bit register ! 973: ; LD_RR_mNN d16 d16 = dest reg ! 974: %macro LD_RR_mNN 1 ! 975: GETWORD ! 976: MEMREAD ! 977: mov lz%1, dl ! 978: inc di ! 979: MEMREAD ! 980: mov hz%1, dl ! 981: DO_CYCLES ! 982: NEXT ! 983: %endmacro ! 984: ! 985: ; Move from a 16-bit register into (NN) ! 986: ; LD_mNN_RR s16 s16 = src reg ! 987: %macro LD_mNN_RR 1 ! 988: GETWORD ! 989: mov dl, lz%1 ! 990: MEMWRITE ! 991: inc di ! 992: mov dl, hz%1 ! 993: MEMWRITE ! 994: DO_CYCLES ! 995: NEXT ! 996: %endmacro ! 997: ! 998: ; Move from a 16-bit register into another ! 999: ; LD_RR_RR d16, s16 s16 = src reg, d16 = dest reg ! 1000: %macro LD_RR_RR 2 ! 1001: mov ez%1, ez%2 ! 1002: DO_CYCLES ! 1003: NEXT ! 1004: %endmacro ! 1005: ! 1006: ; Move from a 16-bit register into another ! 1007: ; LD_RR_XY d16, s16 s16 = src reg, d16 = dest reg ! 1008: %macro LD_RR_XY 2 ! 1009: mov edi, ez%2 ! 1010: mov ez%1, edi ! 1011: DO_CYCLES ! 1012: NEXT ! 1013: %endmacro ! 1014: ! 1015: ; Push a word on the stack ! 1016: ; PUSH_RR s16 s16 = src reg ! 1017: %macro PUSH_RR 1 ! 1018: mov dl, hz%1 ! 1019: dec zSP ! 1020: mov edi, ezSP ! 1021: MEMWRITE ! 1022: dec zSP ! 1023: mov edi, ezSP ! 1024: %ifidn %1, AF ! 1025: ; merge bits 3 and 5 in ! 1026: and zF, ~(FLAG_3|FLAG_5) ! 1027: mov dl, [z80_flag35] ! 1028: and dl, FLAG_3|FLAG_5 ! 1029: or zF, dl ! 1030: %endif ! 1031: mov dl, lz%1 ! 1032: MEMWRITE ! 1033: DO_CYCLES ! 1034: NEXT ! 1035: %endmacro ! 1036: ! 1037: ; Pop a word from the stack ! 1038: ; POP_RR s16 s16 = src reg ! 1039: %macro POP_RR 1 ! 1040: mov edi, ezSP ! 1041: MEMREAD ! 1042: %ifidn %1, AF ! 1043: mov [z80_flag35], dl ; take out bits 3/5 ! 1044: %endif ! 1045: mov lz%1, dl ! 1046: inc zSP ! 1047: mov edi, ezSP ! 1048: MEMREAD ! 1049: mov hz%1, dl ! 1050: inc zSP ! 1051: DO_CYCLES ! 1052: NEXT ! 1053: %endmacro ! 1054: ! 1055: ; Exchange 2 16-bit registers ! 1056: ; EX_RR_RR s16, d16 s16 = src reg, d16 = dest reg ! 1057: %macro EX_RR_RR 2 ! 1058: xchg ez%1, ez%2 ! 1059: DO_CYCLES ! 1060: NEXT ! 1061: %endmacro ! 1062: ! 1063: ; Exchange AF with AF' ! 1064: ; EX_AF_AF2 ! 1065: %macro EX_AF_AF2 0 ! 1066: ; Merge bits 3+5 of the flags in first ! 1067: and zF, ~(FLAG_3|FLAG_5) ! 1068: mov dl, [z80_flag35] ! 1069: and dl, FLAG_3|FLAG_5 ! 1070: or zF, dl ! 1071: xchg ezAF, ezAF2 ! 1072: ! 1073: ; Un-merge the flags again ! 1074: mov [z80_flag35], zF ! 1075: DO_CYCLES ! 1076: NEXT ! 1077: %endmacro ! 1078: ! 1079: ; Exchange the 16-bit registers with their primes ! 1080: ; EXX ! 1081: %macro EXX 0 ! 1082: mov edi, ezDE ! 1083: xchg ezBC, ezBC2 ! 1084: xchg ezHL, ezHL2 ! 1085: xchg edi, ezDE2 ! 1086: mov ezDE, edi ! 1087: DO_CYCLES ! 1088: NEXT ! 1089: %endmacro ! 1090: ! 1091: ; Exchange a 16-bit register with (RR) ! 1092: ; EX_RR_mRR d16, m16 d16 = dest reg, m16 = memory reg ! 1093: %macro EX_RR_mRR 2 ! 1094: mov edi, ez%2 ; swap low byte ! 1095: MEMREAD ! 1096: xchg dl, lz%1 ! 1097: MEMWRITE ! 1098: ! 1099: inc di ; swap high byte ! 1100: MEMREAD ! 1101: xchg dl, hz%1 ! 1102: MEMWRITE ! 1103: ! 1104: DO_CYCLES ! 1105: NEXT ! 1106: %endmacro ! 1107: ! 1108: ; Move from (HL) to (DE), post-increment ! 1109: ; LDI ! 1110: %macro LDI 0 ! 1111: mov edi, ezHL ! 1112: MEMREAD ! 1113: %ifdef EMULATE_BITS_3_5 ! 1114: push edx ! 1115: %endif ! 1116: mov edi, ezDE ! 1117: MEMWRITE ! 1118: ! 1119: %ifdef EMULATE_BITS_3_5 ! 1120: pop edx ! 1121: add dl, zA ! 1122: mov dh, dl ! 1123: shl dl, 4 ! 1124: and edx, FLAG_5 | (FLAG_3 << 8) ! 1125: or dl, dh ! 1126: mov [z80_flag35], dl ! 1127: xor dh, dh ! 1128: %endif ! 1129: ! 1130: and zF, FLAG_S|FLAG_Z|FLAG_C ! 1131: inc zHL ! 1132: inc zDE ! 1133: dec zBC ! 1134: jz %%ldi_zero ! 1135: or zF, FLAG_P ! 1136: %%ldi_zero: ! 1137: DO_CYCLES ! 1138: NEXT ! 1139: %endmacro ! 1140: ! 1141: ; Move from (HL) to (DE), post-decrement ! 1142: ; LDD ! 1143: %macro LDD 0 ! 1144: mov edi, ezHL ! 1145: MEMREAD ! 1146: %ifdef EMULATE_BITS_3_5 ! 1147: push edx ! 1148: %endif ! 1149: mov edi, ezDE ! 1150: MEMWRITE ! 1151: ! 1152: %ifdef EMULATE_BITS_3_5 ! 1153: pop edx ! 1154: add dl, zA ! 1155: mov dh, dl ! 1156: shl dl, 4 ! 1157: and edx, FLAG_5 | (FLAG_3 << 8) ! 1158: or dl, dh ! 1159: mov [z80_flag35], dl ! 1160: xor dh, dh ! 1161: %endif ! 1162: ! 1163: and zF, FLAG_S|FLAG_Z|FLAG_C ! 1164: dec zHL ! 1165: dec zDE ! 1166: dec zBC ! 1167: jz %%ldd_zero ! 1168: or zF, FLAG_P ! 1169: %%ldd_zero: ! 1170: DO_CYCLES ! 1171: NEXT ! 1172: %endmacro ! 1173: ! 1174: ; Move from (HL) to (DE), post-increment, repeat ! 1175: ; LDIR ! 1176: %macro LDIR 0 ! 1177: %ifdef EMULATE_WEIRD_STUFF ! 1178: ; Code marked with CG is from Charles Gallagher, to fix the ! 1179: ; Spectrum game 'Quazatron' ! 1180: push ezPC ; CG ! 1181: sub zPC, 2 ; CG ! 1182: mov edi, ezPC ; CG ! 1183: shr edi, 8 ; CG ! 1184: add ezPC, [z80_Fetch+edi*4] ; CG ! 1185: %endif ! 1186: ! 1187: %%ldir_loop: ! 1188: %ifdef EMULATE_WEIRD_STUFF ! 1189: cmp [ezPC], word 0b0edh ; CG - check for self modifiying code! ! 1190: jne near %%ldir_modified ! 1191: %endif ! 1192: ! 1193: mov edi, ezHL ! 1194: MEMREAD ! 1195: %ifdef EMULATE_BITS_3_5 ! 1196: push edx ! 1197: %endif ! 1198: mov edi, ezDE ! 1199: MEMWRITE ! 1200: %ifdef EMULATE_BITS_3_5 ! 1201: pop edx ! 1202: %endif ! 1203: ! 1204: inc zHL ! 1205: inc zDE ! 1206: dec zBC ! 1207: jz %%ldir_zero ! 1208: ! 1209: %ifdef EMULATE_R_REGISTER ! 1210: inc zR ! 1211: %endif ! 1212: sub [z80_ICount], dword extra_cycles ! 1213: ja near %%ldir_loop ! 1214: ! 1215: %ifdef EMULATE_WEIRD_STUFF ! 1216: pop ezPC ; CG ! 1217: %endif ! 1218: ! 1219: and zF, FLAG_S|FLAG_Z|FLAG_C ! 1220: %ifdef EMULATE_BITS_3_5 ! 1221: add dl, zA ! 1222: mov dh, dl ! 1223: shl dl, 4 ! 1224: and edx, FLAG_5 | (FLAG_3 << 8) ! 1225: or dl, dh ! 1226: mov [z80_flag35], dl ! 1227: xor dh, dh ! 1228: %endif ! 1229: or zF, FLAG_P ! 1230: sub zPC, 2 ; rewind to instruction start ! 1231: EXIT ! 1232: ! 1233: %ifdef EMULATE_WEIRD_STUFF ! 1234: %%ldir_modified: ! 1235: sub [esp], word 2 ; CG ! 1236: %endif ! 1237: ! 1238: %%ldir_zero: ! 1239: %ifdef EMULATE_WEIRD_STUFF ! 1240: pop ezPC ; CG ! 1241: %endif ! 1242: and zF, FLAG_S|FLAG_Z|FLAG_C ! 1243: %ifdef EMULATE_BITS_3_5 ! 1244: add dl, zA ! 1245: mov dh, dl ! 1246: shl dl, 4 ! 1247: and edx, FLAG_5 | (FLAG_3 << 8) ! 1248: or dl, dh ! 1249: mov [z80_flag35], dl ! 1250: xor dh, dh ! 1251: %endif ! 1252: DO_CYCLES ! 1253: NEXT ! 1254: %endmacro ! 1255: ! 1256: ; Move from (HL) to (DE), post-decrement, repeat ! 1257: ; LDDR ! 1258: %macro LDDR 0 ! 1259: %%lddr_loop: ! 1260: mov edi, ezHL ! 1261: MEMREAD ! 1262: %ifdef EMULATE_BITS_3_5 ! 1263: push edx ! 1264: %endif ! 1265: mov edi, ezDE ! 1266: MEMWRITE ! 1267: %ifdef EMULATE_BITS_3_5 ! 1268: pop edx ! 1269: %endif ! 1270: ! 1271: dec zHL ! 1272: dec zDE ! 1273: dec zBC ! 1274: jz %%lddr_zero ! 1275: ! 1276: %ifdef EMULATE_R_REGISTER ! 1277: inc zR ! 1278: %endif ! 1279: sub [z80_ICount], dword extra_cycles ! 1280: ja near %%lddr_loop ! 1281: ! 1282: and zF, FLAG_S|FLAG_Z|FLAG_C ! 1283: %ifdef EMULATE_BITS_3_5 ! 1284: add dl, zA ! 1285: mov dh, dl ! 1286: shl dl, 4 ! 1287: and edx, FLAG_5 | (FLAG_3 << 8) ! 1288: or dl, dh ! 1289: mov [z80_flag35], dl ! 1290: xor dh, dh ! 1291: %endif ! 1292: or zF, FLAG_P ! 1293: sub zPC, 2 ; rewind to instruction start ! 1294: EXIT ! 1295: ! 1296: %%lddr_zero: ! 1297: and zF, FLAG_S|FLAG_Z|FLAG_C ! 1298: %ifdef EMULATE_BITS_3_5 ! 1299: add dl, zA ! 1300: mov dh, dl ! 1301: shl dl, 4 ! 1302: and edx, FLAG_5 | (FLAG_3 << 8) ! 1303: or dl, dh ! 1304: mov [z80_flag35], dl ! 1305: xor dh, dh ! 1306: %endif ! 1307: DO_CYCLES ! 1308: NEXT ! 1309: %endmacro ! 1310: ! 1311: ; Compare A against (HL), post-increment ! 1312: ; CPI ! 1313: %macro CPI 0 ! 1314: mov edi, ezHL ! 1315: MEMREAD ! 1316: ! 1317: and zF, FLAG_C ; keep the old carry ! 1318: mov dh, zF ! 1319: cmp zA, dl ! 1320: lahf ! 1321: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N ! 1322: or zF, dh ; SZHN from compare, C unchanged, rest are zero ! 1323: ! 1324: inc zHL ! 1325: dec zBC ! 1326: jz %%cpi_zero ! 1327: or zF, FLAG_P ; set P if BC != 0 ! 1328: %%cpi_zero: ! 1329: ! 1330: %ifdef EMULATE_BITS_3_5 ! 1331: mov dh, zA ! 1332: sub dh, dl ! 1333: test zF, FLAG_H ! 1334: jz %%cpi_hzero ! 1335: dec dh ! 1336: %%cpi_hzero: ! 1337: ! 1338: mov dl, dh ! 1339: shl dl, 4 ! 1340: and edx, FLAG_5 | (FLAG_3 << 8) ! 1341: or dl, dh ! 1342: mov [z80_flag35], dl ! 1343: %endif ! 1344: xor dh, dh ! 1345: ! 1346: DO_CYCLES ! 1347: NEXT ! 1348: %endmacro ! 1349: ! 1350: ; Compare A against (HL), post-decrement ! 1351: ; CPD ! 1352: %macro CPD 0 ! 1353: mov edi, ezHL ! 1354: MEMREAD ! 1355: ! 1356: and zF, FLAG_C ; keep the old carry ! 1357: mov dh, zF ! 1358: cmp zA, dl ! 1359: lahf ! 1360: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N ! 1361: or zF, dh ; SZHN from compare, C unchanged, rest are zero ! 1362: ! 1363: dec zHL ! 1364: dec zBC ! 1365: jz %%cpd_zero ! 1366: or zF, FLAG_P ; set P if BC != 0 ! 1367: %%cpd_zero: ! 1368: ! 1369: %ifdef EMULATE_BITS_3_5 ! 1370: mov dh, zA ! 1371: sub dh, dl ! 1372: test zF, FLAG_H ! 1373: jz %%cpd_hzero ! 1374: dec dh ! 1375: %%cpd_hzero: ! 1376: ! 1377: mov dl, dh ! 1378: shl dl, 4 ! 1379: and edx, FLAG_5 | (FLAG_3 << 8) ! 1380: or dl, dh ! 1381: mov [z80_flag35], dl ! 1382: %endif ! 1383: xor dh, dh ! 1384: ! 1385: DO_CYCLES ! 1386: NEXT ! 1387: %endmacro ! 1388: ! 1389: ; Compare A against (HL), post-increment, repeat ! 1390: ; CPIR ! 1391: %macro CPIR 0 ! 1392: and zF, FLAG_C ; keep the old carry ! 1393: %%cpir_loop: ! 1394: mov edi, ezHL ! 1395: MEMREAD ! 1396: ! 1397: inc zHL ! 1398: dec zBC ! 1399: jz %%cpir_end_bc ; end due to BC=0 ! 1400: ! 1401: %ifdef EMULATE_R_REGISTER ! 1402: inc zR ! 1403: %endif ! 1404: cmp zA, dl ! 1405: je %%cpir_end_equal ; end due to A=(HL) ! 1406: ! 1407: sub [z80_ICount], dword extra_cycles ! 1408: ja %%cpir_loop ! 1409: ! 1410: ; out of cycles, but not finished ! 1411: mov dh, zF ! 1412: cmp zA, dl ! 1413: lahf ! 1414: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N ! 1415: or zF, dh ; SZHN from compare, C unchanged, rest are zero ! 1416: ! 1417: %ifdef EMULATE_BITS_3_5 ! 1418: mov dh, zA ! 1419: sub dh, dl ! 1420: test zF, FLAG_H ! 1421: jz %%cpir_hzero ! 1422: dec dh ! 1423: %%cpir_hzero: ! 1424: ! 1425: mov dl, dh ! 1426: shl dl, 4 ! 1427: and edx, FLAG_5 | (FLAG_3 << 8) ! 1428: or dl, dh ! 1429: mov [z80_flag35], dl ! 1430: %endif ! 1431: or zF, FLAG_P ; set P to indicate not finished ! 1432: sub zPC, 2 ; rewind to instruction start ! 1433: xor dh, dh ! 1434: EXIT ! 1435: ! 1436: %%cpir_end_equal: ! 1437: or zF, FLAG_P ; set P to indicate not finished ! 1438: %%cpir_end_bc: ! 1439: mov dh, zF ! 1440: cmp zA, dl ! 1441: lahf ! 1442: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N ! 1443: or zF, dh ; SZHN from compare, C unchanged, rest are zero ! 1444: ! 1445: %ifdef EMULATE_BITS_3_5 ! 1446: mov dh, zA ! 1447: sub dh, dl ! 1448: test zF, FLAG_H ! 1449: jz %%cpir_hzero2 ! 1450: dec dh ! 1451: %%cpir_hzero2: ! 1452: ! 1453: mov dl, dh ! 1454: shl dl, 4 ! 1455: and edx, FLAG_5 | (FLAG_3 << 8) ! 1456: or dl, dh ! 1457: mov [z80_flag35], dl ! 1458: %endif ! 1459: xor dh, dh ! 1460: DO_CYCLES ! 1461: NEXT ! 1462: %endmacro ! 1463: ! 1464: ; Compare A against (HL), post-decrement, repeat ! 1465: ; CPDR ! 1466: %macro CPDR 0 ! 1467: and zF, FLAG_C ; keep the old carry ! 1468: %%cpdr_loop: ! 1469: mov edi, ezHL ! 1470: MEMREAD ! 1471: ! 1472: dec zHL ! 1473: dec zBC ! 1474: jz %%cpdr_end_bc ; end due to BC=0 ! 1475: ! 1476: %ifdef EMULATE_R_REGISTER ! 1477: inc zR ! 1478: %endif ! 1479: cmp zA, dl ! 1480: je %%cpdr_end_equal ; end due to A=(HL) ! 1481: ! 1482: sub [z80_ICount], dword extra_cycles ! 1483: ja %%cpdr_loop ! 1484: ! 1485: ; out of cycles, but not finished ! 1486: mov dh, zF ! 1487: cmp zA, dl ! 1488: lahf ! 1489: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N ! 1490: or zF, dh ; SZHN from compare, C unchanged, rest are zero ! 1491: ! 1492: %ifdef EMULATE_BITS_3_5 ! 1493: mov dh, zA ! 1494: sub dh, dl ! 1495: test zF, FLAG_H ! 1496: jz %%cpdr_hzero ! 1497: dec dh ! 1498: %%cpdr_hzero: ! 1499: ! 1500: mov dl, dh ! 1501: shl dl, 4 ! 1502: and edx, FLAG_5 | (FLAG_3 << 8) ! 1503: or dl, dh ! 1504: mov [z80_flag35], dl ! 1505: %endif ! 1506: or zF, FLAG_P ; set P to indicate not finished ! 1507: sub zPC, 2 ; rewind to instruction start ! 1508: xor dh, dh ! 1509: EXIT ! 1510: ! 1511: %%cpdr_end_equal: ! 1512: or zF, FLAG_P ; set P to indicate not finished ! 1513: %%cpdr_end_bc: ! 1514: mov dh, zF ! 1515: cmp zA, dl ! 1516: lahf ! 1517: and zF, FLAG_S|FLAG_Z|FLAG_H|FLAG_N ! 1518: or zF, dh ; SZHN from compare, C unchanged, rest are zero ! 1519: ! 1520: %ifdef EMULATE_BITS_3_5 ! 1521: mov dh, zA ! 1522: sub dh, dl ! 1523: test zF, FLAG_H ! 1524: jz %%cpdr_hzero2 ! 1525: dec dh ! 1526: %%cpdr_hzero2: ! 1527: ! 1528: mov dl, dh ! 1529: shl dl, 4 ! 1530: and edx, FLAG_5 | (FLAG_3 << 8) ! 1531: or dl, dh ! 1532: mov [z80_flag35], dl ! 1533: %endif ! 1534: xor dh, dh ! 1535: DO_CYCLES ! 1536: NEXT ! 1537: %endmacro ! 1538: ! 1539: ; Perform arithmetic on the A register ! 1540: ; ART_R method, src8 ! 1541: %macro ART_R 2 ! 1542: %ifidn %1, ADD ! 1543: DO_ADD z%2 ! 1544: %elifidn %1, ADC ! 1545: DO_ADC z%2 ! 1546: %elifidn %1, SUB ! 1547: DO_SUB z%2 ! 1548: %elifidn %1, SBC ! 1549: DO_SBC z%2 ! 1550: %endif ! 1551: ! 1552: DO_CYCLES ! 1553: NEXT ! 1554: %endmacro ! 1555: ! 1556: ; Perform arithmetic on the A register (using an immediate) ! 1557: ; ART_N method ! 1558: %macro ART_N 1 ! 1559: GETBYTE ! 1560: %ifidn %1, ADD ! 1561: DO_ADD dl ! 1562: %elifidn %1, ADC ! 1563: DO_ADC dl ! 1564: %elifidn %1, SUB ! 1565: DO_SUB dl ! 1566: %elifidn %1, SBC ! 1567: DO_SBC dl ! 1568: %endif ! 1569: ! 1570: DO_CYCLES ! 1571: NEXT ! 1572: %endmacro ! 1573: ! 1574: ; Perform arithmetic on the A register, using (XY) ! 1575: ; ART_mXY method, src16 ! 1576: %macro ART_mXY 2 ! 1577: GETDISP ! 1578: add di, z%2 ! 1579: MEMREAD ! 1580: %ifidn %1, ADD ! 1581: DO_ADD dl ! 1582: %elifidn %1, ADC ! 1583: DO_ADC dl ! 1584: %elifidn %1, SUB ! 1585: DO_SUB dl ! 1586: %elifidn %1, SBC ! 1587: DO_SBC dl ! 1588: %endif ! 1589: ! 1590: DO_CYCLES ! 1591: NEXT ! 1592: %endmacro ! 1593: ! 1594: ; Perform arithmetic on the A register using (RR) ! 1595: ; ART_mRR method, src16 ! 1596: %macro ART_mRR 2 ! 1597: mov edi, ez%2 ! 1598: MEMREAD ! 1599: %ifidn %1, ADD ! 1600: DO_ADD dl ! 1601: %elifidn %1, ADC ! 1602: DO_ADC dl ! 1603: %elifidn %1, SUB ! 1604: DO_SUB dl ! 1605: %elifidn %1, SBC ! 1606: DO_SBC dl ! 1607: %endif ! 1608: ! 1609: DO_CYCLES ! 1610: NEXT ! 1611: %endmacro ! 1612: ! 1613: ; Perform logic on the A register ! 1614: ; LOG_R method, src8 ! 1615: %macro LOG_R 2 ! 1616: %ifidn %1, AND ! 1617: DO_AND z%2 ! 1618: %elifidn %1, OR ! 1619: DO_OR z%2 ! 1620: %elifidn %1, XOR ! 1621: DO_XOR z%2 ! 1622: %endif ! 1623: ! 1624: DO_CYCLES ! 1625: NEXT ! 1626: %endmacro ! 1627: ! 1628: ; Perform logic on the A register (using an immediate) ! 1629: ; LOG_N method ! 1630: %macro LOG_N 1 ! 1631: GETBYTE ! 1632: %ifidn %1, AND ! 1633: DO_AND dl ! 1634: %elifidn %1, OR ! 1635: DO_OR dl ! 1636: %elifidn %1, XOR ! 1637: DO_XOR dl ! 1638: %endif ! 1639: ! 1640: DO_CYCLES ! 1641: NEXT ! 1642: %endmacro ! 1643: ! 1644: ; Perform logic on the A register, using (RR) ! 1645: ; LOG_mRR method, src16 ! 1646: %macro LOG_mRR 2 ! 1647: mov edi, ez%2 ! 1648: MEMREAD ! 1649: %ifidn %1, AND ! 1650: DO_AND dl ! 1651: %elifidn %1, OR ! 1652: DO_OR dl ! 1653: %elifidn %1, XOR ! 1654: DO_XOR dl ! 1655: %endif ! 1656: ! 1657: DO_CYCLES ! 1658: NEXT ! 1659: %endmacro ! 1660: ! 1661: ; Perform logic on the A register, using (XY+dd) ! 1662: ; LOG_mXY method, src16 ! 1663: %macro LOG_mXY 2 ! 1664: GETDISP ! 1665: add di, z%2 ! 1666: MEMREAD ! 1667: %ifidn %1, AND ! 1668: DO_AND dl ! 1669: %elifidn %1, OR ! 1670: DO_OR dl ! 1671: %elifidn %1, XOR ! 1672: DO_XOR dl ! 1673: %endif ! 1674: ! 1675: DO_CYCLES ! 1676: NEXT ! 1677: %endmacro ! 1678: ! 1679: ; Compare against the A register ! 1680: ; CP_R src8 ! 1681: %macro CP_R 1 ! 1682: DO_CP z%1 ! 1683: ! 1684: DO_CYCLES ! 1685: NEXT ! 1686: %endmacro ! 1687: ! 1688: ; Compare against the A register, using an immediate ! 1689: ; CP_N ! 1690: %macro CP_N 0 ! 1691: GETBYTE ! 1692: DO_CP dl ! 1693: ! 1694: DO_CYCLES ! 1695: NEXT ! 1696: %endmacro ! 1697: ! 1698: ; Compare against the A register, using (RR) ! 1699: ; CP_mRR src16 ! 1700: %macro CP_mRR 1 ! 1701: mov edi, ez%1 ! 1702: MEMREAD ! 1703: DO_CP dl ! 1704: ! 1705: DO_CYCLES ! 1706: NEXT ! 1707: %endmacro ! 1708: ! 1709: ; Compare against the A register, using (XY+dd) ! 1710: ; CP_mXY src16 ! 1711: %macro CP_mXY 1 ! 1712: GETDISP ! 1713: add di, z%1 ! 1714: MEMREAD ! 1715: DO_CP dl ! 1716: ! 1717: DO_CYCLES ! 1718: NEXT ! 1719: %endmacro ! 1720: ! 1721: ; Inc/dec a register ! 1722: ; DECINC_R method, reg8 ! 1723: %macro DECINC_R 2 ! 1724: %ifidn %1, INC ! 1725: DO_INC z%2 ! 1726: %elifidn %1, DEC ! 1727: DO_DEC z%2 ! 1728: %endif ! 1729: ! 1730: DO_CYCLES ! 1731: NEXT ! 1732: %endmacro ! 1733: ! 1734: ; Inc/dec (RR) ! 1735: ; DECINC_mRR method ! 1736: %macro DECINC_mRR 2 ! 1737: mov edi, ez%2 ! 1738: MEMREAD ! 1739: %ifidn %1, INC ! 1740: DO_INC dl ! 1741: %elifidn %1, DEC ! 1742: DO_DEC dl ! 1743: %endif ! 1744: MEMWRITE ! 1745: ! 1746: DO_CYCLES ! 1747: NEXT ! 1748: %endmacro ! 1749: ! 1750: ; Inc/dec (XY+dd) ! 1751: ; DECINC_mXY method ! 1752: %macro DECINC_mXY 2 ! 1753: GETDISP ! 1754: add di, z%2 ! 1755: MEMREAD ! 1756: %ifidn %1, INC ! 1757: DO_INC dl ! 1758: %elifidn %1, DEC ! 1759: DO_DEC dl ! 1760: %endif ! 1761: MEMWRITE ! 1762: ! 1763: DO_CYCLES ! 1764: NEXT ! 1765: %endmacro ! 1766: ! 1767: ; Add two 16-bit registers ! 1768: ; ADD_RR_RR dest16, src16 ! 1769: %macro ADD_RR_RR 2 ! 1770: DO_ADD16 z%1, z%2 ! 1771: ! 1772: DO_CYCLES ! 1773: NEXT ! 1774: %endmacro ! 1775: ! 1776: ; Add two 16-bit registers, with carry ! 1777: ; ADC_RR_RR dest16, src16 ! 1778: %macro ADC_RR_RR 2 ! 1779: DO_ADC16 z%1, z%2 ! 1780: ! 1781: DO_CYCLES ! 1782: NEXT ! 1783: %endmacro ! 1784: ! 1785: ; Subtract two 16-bit registers, with carry ! 1786: ; SBC_RR_RR dest16, src16 ! 1787: %macro SBC_RR_RR 2 ! 1788: DO_SBC16 z%1, z%2 ! 1789: ! 1790: DO_CYCLES ! 1791: NEXT ! 1792: %endmacro ! 1793: ! 1794: ; Inc/dec a 16-bit register ! 1795: ; DECINC_RR method, reg16 ! 1796: %macro DECINC_RR 2 ! 1797: %ifidn %1, INC ! 1798: inc z%2 ! 1799: %elifidn %1, DEC ! 1800: dec z%2 ! 1801: %endif ! 1802: ! 1803: DO_CYCLES ! 1804: NEXT ! 1805: %endmacro ! 1806: ! 1807: ; Rotate a register ! 1808: ; ROT_R method, reg8 ! 1809: %macro ROT_R 2 ! 1810: DO_ROT %1, z%2 ! 1811: ! 1812: DO_CYCLES ! 1813: NEXT ! 1814: %endmacro ! 1815: ! 1816: ; Rotate (RR) ! 1817: ; ROT_mRR method, src16 ! 1818: %macro ROT_mRR 2 ! 1819: mov edi, ez%2 ! 1820: MEMREAD ! 1821: DO_ROT %1, dl ! 1822: MEMWRITE ! 1823: ! 1824: DO_CYCLES ! 1825: NEXT ! 1826: %endmacro ! 1827: ! 1828: ; Rotate (XY+dd) ! 1829: ; ROT_mXY method ! 1830: %macro ROT_mXY 1 ! 1831: MEMREAD ! 1832: DO_ROT %1, dl ! 1833: MEMWRITE ! 1834: ! 1835: DO_CYCLES ! 1836: NEXT ! 1837: %endmacro ! 1838: ! 1839: ; Rotate (XY+dd), and store into a register ! 1840: ; ROT_mXY_R method, dest8 ! 1841: %macro ROT_mXY_R 2 ! 1842: MEMREAD ! 1843: DO_ROT %1, dl ! 1844: mov z%2, dl ! 1845: MEMWRITE ! 1846: ! 1847: DO_CYCLES ! 1848: NEXT ! 1849: %endmacro ! 1850: ! 1851: ; Shift a register ! 1852: ; SHF_R method, reg8 ! 1853: %macro SHF_R 2 ! 1854: DO_SHF %1, z%2 ! 1855: ! 1856: DO_CYCLES ! 1857: NEXT ! 1858: %endmacro ! 1859: ! 1860: ; Shift (RR) ! 1861: ; SHF_mRR method, src16 ! 1862: %macro SHF_mRR 2 ! 1863: mov edi, ez%2 ! 1864: MEMREAD ! 1865: DO_SHF %1, dl ! 1866: MEMWRITE ! 1867: ! 1868: DO_CYCLES ! 1869: NEXT ! 1870: %endmacro ! 1871: ! 1872: ; Shift (XY+dd) ! 1873: ; SHF_mXY method ! 1874: %macro SHF_mXY 1 ! 1875: MEMREAD ! 1876: DO_SHF %1, dl ! 1877: MEMWRITE ! 1878: ! 1879: DO_CYCLES ! 1880: NEXT ! 1881: %endmacro ! 1882: ! 1883: ; Shift (XY+dd), and store into a register ! 1884: ; SHF_mXY_R method, dest8 ! 1885: %macro SHF_mXY_R 2 ! 1886: MEMREAD ! 1887: DO_SHF %1, dl ! 1888: mov z%2, dl ! 1889: MEMWRITE ! 1890: ! 1891: DO_CYCLES ! 1892: NEXT ! 1893: %endmacro ! 1894: ! 1895: ; Rotate A/(HL) left, via nibbles ! 1896: ; RLD ! 1897: %macro RLD 0 ! 1898: mov edi, ezHL ! 1899: MEMREAD ! 1900: mov dh, zA ! 1901: and zF, FLAG_C ! 1902: shl dh, 4 ! 1903: rol dx, 4 ! 1904: and zA, 0f0h ! 1905: or zA, dh ! 1906: mov dh, zF ! 1907: lahf ! 1908: and zF, FLAG_S|FLAG_Z|FLAG_P ! 1909: or zF, dh ! 1910: %ifdef EMULATE_BITS_3_5 ! 1911: mov [z80_flag35], zA ! 1912: %endif ! 1913: MEMWRITE ! 1914: ! 1915: DO_CYCLES ! 1916: NEXT ! 1917: %endmacro ! 1918: ! 1919: ; Rotate A/(HL) right, via nibbles ! 1920: ; RRD ! 1921: %macro RRD 0 ! 1922: mov edi, ezHL ! 1923: MEMREAD ! 1924: mov dh, zA ! 1925: and zF, FLAG_C ! 1926: ror dx, 4 ! 1927: shr dh, 4 ! 1928: and zA, 0f0h ! 1929: or zA, dh ! 1930: mov dh, zF ! 1931: lahf ! 1932: and zF, FLAG_S|FLAG_Z|FLAG_P ! 1933: or zF, dh ! 1934: %ifdef EMULATE_BITS_3_5 ! 1935: mov [z80_flag35], zA ! 1936: %endif ! 1937: MEMWRITE ! 1938: ! 1939: DO_CYCLES ! 1940: NEXT ! 1941: %endmacro ! 1942: ! 1943: ; Bit-test a register ! 1944: ; BIT_R src8, bit ! 1945: %macro BIT_R_b 2 ! 1946: DO_BIT z%1, %2 ! 1947: ! 1948: DO_CYCLES ! 1949: NEXT ! 1950: %endmacro ! 1951: ! 1952: ; Bit-test (RR) ! 1953: ; BIT_mRR_b src16, bit ! 1954: %macro BIT_mRR_b 2 ! 1955: and zF, FLAG_C ! 1956: mov edi, ez%1 ! 1957: MEMREAD ! 1958: ! 1959: test dl, (1 << %2) ! 1960: ! 1961: ; bit 3 and 5 are always cleared ! 1962: ; (actually they are bizarrely set, but ! 1963: ; there's no point emulating that, it's just ! 1964: ; plain silly...) ! 1965: ! 1966: jz %%bit_is_clear ! 1967: %ifidn %2, 7 ! 1968: or zF, FLAG_H|FLAG_S ; set sign bit, if testing bit 7 ! 1969: %else ! 1970: or zF, FLAG_H ; set half-carry, and parity ! 1971: %endif ! 1972: jmp %%finish ! 1973: ! 1974: %%bit_is_clear: ! 1975: or zF, FLAG_H|FLAG_Z|FLAG_P ; set half-carry, parity, and zero ! 1976: %%finish: ! 1977: ! 1978: DO_CYCLES ! 1979: NEXT ! 1980: %endmacro ! 1981: ! 1982: ; Bit-test (XY+dd) ! 1983: ; BIT_mXY_b bit ! 1984: %macro BIT_mXY_b 1 ! 1985: %ifdef EMULATE_BITS_3_5 ! 1986: mov edx, edi ! 1987: mov [z80_flag35], dh ! 1988: %endif ! 1989: ! 1990: MEMREAD ! 1991: and zF, FLAG_C ! 1992: test dl, (1 << %1) ! 1993: ! 1994: jz %%bit_is_clear ! 1995: %ifidn %1, 7 ! 1996: or zF, FLAG_H|FLAG_S ; set sign bit, if testing bit 7 ! 1997: %else ! 1998: or zF, FLAG_H ; set half-carry, and parity ! 1999: %endif ! 2000: jmp %%finish ! 2001: ! 2002: %%bit_is_clear: ! 2003: or zF, FLAG_H|FLAG_Z|FLAG_P ; set half-carry, parity, and zero ! 2004: %%finish: ! 2005: ! 2006: DO_CYCLES ! 2007: NEXT ! 2008: %endmacro ! 2009: ! 2010: ; Bit-clear a register ! 2011: ; RES_R_b src8, bit ! 2012: %macro RES_R_b 2 ! 2013: DO_RES z%1, %2 ! 2014: ! 2015: DO_CYCLES ! 2016: NEXT ! 2017: %endmacro ! 2018: ! 2019: ; Bit-clear (RR) ! 2020: ; RES_mRR_b src16, bit ! 2021: %macro RES_mRR_b 2 ! 2022: mov edi, ez%1 ! 2023: MEMREAD ! 2024: DO_RES dl, %2 ! 2025: MEMWRITE ! 2026: ! 2027: DO_CYCLES ! 2028: NEXT ! 2029: %endmacro ! 2030: ! 2031: ; Bit-clear (XY+dd) ! 2032: ; RES_mXY_b bit ! 2033: %macro RES_mXY_b 1 ! 2034: MEMREAD ! 2035: DO_RES dl, %1 ! 2036: MEMWRITE ! 2037: ! 2038: DO_CYCLES ! 2039: NEXT ! 2040: %endmacro ! 2041: ! 2042: ; Bit-clear (XY+dd), with extra store ! 2043: ; RES_mXY_b_R bit, dest8 ! 2044: %macro RES_mXY_b_R 2 ! 2045: MEMREAD ! 2046: DO_RES dl, %1 ! 2047: mov z%2, dl ! 2048: MEMWRITE ! 2049: ! 2050: DO_CYCLES ! 2051: NEXT ! 2052: %endmacro ! 2053: ! 2054: ; Bit-set a register ! 2055: ; SET_R_b src8, bit ! 2056: %macro SET_R_b 2 ! 2057: DO_SET z%1, %2 ! 2058: ! 2059: DO_CYCLES ! 2060: NEXT ! 2061: %endmacro ! 2062: ! 2063: ; Bit-set (RR) ! 2064: ; SET_mRR_b src16, bit ! 2065: %macro SET_mRR_b 2 ! 2066: mov edi, ez%1 ! 2067: MEMREAD ! 2068: DO_SET dl, %2 ! 2069: MEMWRITE ! 2070: ! 2071: DO_CYCLES ! 2072: NEXT ! 2073: %endmacro ! 2074: ! 2075: ; Bit-set (XY+dd) ! 2076: ; SET_mXY_b bit ! 2077: %macro SET_mXY_b 1 ! 2078: MEMREAD ! 2079: DO_SET dl, %1 ! 2080: MEMWRITE ! 2081: ! 2082: DO_CYCLES ! 2083: NEXT ! 2084: %endmacro ! 2085: ! 2086: ; Bit-set (XY+dd), with extra store ! 2087: ; SET_mXY_b_R bit, dest8 ! 2088: %macro SET_mXY_b_R 2 ! 2089: MEMREAD ! 2090: DO_SET dl, %1 ! 2091: mov z%2, dl ! 2092: MEMWRITE ! 2093: ! 2094: DO_CYCLES ! 2095: NEXT ! 2096: %endmacro ! 2097: ! 2098: ; Jump to an absolute address ! 2099: ; JP_NN ! 2100: %macro JP_NN 0 ! 2101: GETWORD ! 2102: mov ezPC, edi ! 2103: DO_CYCLES ! 2104: NEXT ! 2105: %endmacro ! 2106: ! 2107: ; Jump to an absolute address, conditionally ! 2108: ; JP_cc_NN nz,cc ! 2109: %macro JP_cc_NN 2 ! 2110: test zF, FLAG_%2 ! 2111: j%1 near %%dont_take_jump ! 2112: GETWORD ! 2113: mov ezPC, edi ! 2114: DO_CYCLES ! 2115: NEXT ! 2116: ! 2117: ALIGN ! 2118: %%dont_take_jump: ! 2119: add zPC, 2 ; skip address ! 2120: DO_CYCLES ! 2121: NEXT ! 2122: %endmacro ! 2123: ! 2124: ; Jump to an relative address ! 2125: ; JR_N ! 2126: %macro JR_N 0 ! 2127: GETDISP ! 2128: add zPC, di ! 2129: DO_CYCLES ! 2130: NEXT ! 2131: %endmacro ! 2132: ! 2133: ; Jump to an relative address, conditionally ! 2134: ; JR_cc_N nz,cc ! 2135: %macro JR_cc_N 2 ! 2136: test zF, FLAG_%2 ! 2137: j%1 near %%dont_take_jump ! 2138: GETDISP ! 2139: add zPC, di ! 2140: DO_EXTRA_CYCLES ! 2141: NEXT ! 2142: ! 2143: ALIGN ! 2144: %%dont_take_jump: ! 2145: inc zPC ; skip over the displacement ! 2146: DO_CYCLES ! 2147: NEXT ! 2148: %endmacro ! 2149: ! 2150: ; Jump to an absolute address (in a register) ! 2151: ; JP_RR addr16 ! 2152: %macro JP_RR 1 ! 2153: mov ezPC, ez%1 ! 2154: DO_CYCLES ! 2155: NEXT ! 2156: %endmacro ! 2157: ! 2158: ; Decrease B, if non-zero, jump to a relative address ! 2159: ; DJNZ_N ! 2160: %macro DJNZ_N 0 ! 2161: dec zB ! 2162: jz near %%dont_take_jump ! 2163: GETDISP ! 2164: add zPC, di ! 2165: DO_EXTRA_CYCLES ! 2166: NEXT ! 2167: ! 2168: ALIGN ! 2169: %%dont_take_jump: ! 2170: inc zPC ; skip over the displacement ! 2171: DO_CYCLES ! 2172: NEXT ! 2173: %endmacro ! 2174: ! 2175: ; Call an absolute address ! 2176: ; CALL_NN ! 2177: %macro CALL_NN 0 ! 2178: GETWORD ! 2179: mov edx, ezPC ; write the PC ! 2180: dec zSP ! 2181: push edi ! 2182: ! 2183: xchg dl, dh ! 2184: mov edi, ezSP ! 2185: MEMWRITE ! 2186: dec zSP ! 2187: mov edx, ezPC ! 2188: mov edi, ezSP ! 2189: MEMWRITE ! 2190: ! 2191: pop ezPC ; get the new PC ! 2192: DO_CYCLES ! 2193: NEXT ! 2194: %endmacro ! 2195: ! 2196: ; Call an absolute address, conditionally ! 2197: ; CALL_cc_NN ! 2198: %macro CALL_cc_NN 2 ! 2199: test zF, FLAG_%2 ! 2200: j%1 near %%dont_take_jump ! 2201: GETWORD ! 2202: mov edx, ezPC ; write the PC ! 2203: push edi ! 2204: ! 2205: dec zSP ! 2206: xchg dl, dh ! 2207: mov edi, ezSP ! 2208: MEMWRITE ! 2209: dec zSP ! 2210: mov edx, ezPC ! 2211: mov edi, ezSP ! 2212: MEMWRITE ! 2213: ! 2214: pop ezPC ; get the new PC ! 2215: DO_CYCLES ! 2216: NEXT ! 2217: ! 2218: ALIGN ! 2219: %%dont_take_jump: ! 2220: add zPC, 2 ; skip address ! 2221: DO_CYCLES ! 2222: NEXT ! 2223: %endmacro ! 2224: ! 2225: ; Pop the PC ! 2226: ; RET ! 2227: %macro RET 0 ! 2228: mov edi, ezSP ! 2229: MEMREAD ! 2230: inc zSP ! 2231: mov ezPC, edx ! 2232: mov edi, ezSP ! 2233: MEMREAD ! 2234: xchg dl, dh ! 2235: or ezPC, edx ! 2236: inc zSP ! 2237: ! 2238: xor dh, dh ! 2239: DO_CYCLES ! 2240: NEXT ! 2241: %endmacro ! 2242: ! 2243: ; Pop the PC, conditionally ! 2244: ; RET_cc ! 2245: %macro RET_cc 2 ! 2246: test zF, FLAG_%2 ! 2247: j%1 near %%dont_take_jump ! 2248: mov edi, ezSP ! 2249: MEMREAD ! 2250: inc zSP ! 2251: mov ezPC, edx ! 2252: mov edi, ezSP ! 2253: MEMREAD ! 2254: xchg dl, dh ! 2255: or ezPC, edx ! 2256: inc zSP ! 2257: ! 2258: xor dh, dh ! 2259: DO_CYCLES ! 2260: NEXT ! 2261: ! 2262: ALIGN ! 2263: %%dont_take_jump: ! 2264: DO_CYCLES ! 2265: NEXT ! 2266: %endmacro ! 2267: ! 2268: ; Pop the PC, restore IFF1, signal the BUS ! 2269: ; RETI ! 2270: %macro RETI 0 ! 2271: mov edi, ezSP ! 2272: MEMREAD ! 2273: mov ezPC, edx ! 2274: inc zSP ! 2275: mov edi, ezSP ! 2276: MEMREAD ! 2277: xchg dl, dh ! 2278: or ezPC, edx ! 2279: inc zSP ! 2280: ! 2281: mov dl, [z80_IFF2] ! 2282: mov [z80_IFF1], dl ! 2283: call [z80_RetI] ; signal the user handler ! 2284: ! 2285: DO_CYCLES ! 2286: NEXT ! 2287: %endmacro ! 2288: ! 2289: ; Pop the PC, restore IFF1 ! 2290: ; RETN ! 2291: %macro RETN 0 ! 2292: mov edi, ezSP ! 2293: MEMREAD ! 2294: mov ezPC, edx ! 2295: inc zSP ! 2296: mov edi, ezSP ! 2297: MEMREAD ! 2298: xchg dl, dh ! 2299: or ezPC, edx ! 2300: inc zSP ! 2301: ! 2302: mov dl, [z80_IFF2] ! 2303: mov [z80_IFF1], dl ! 2304: DO_CYCLES ! 2305: NEXT ! 2306: %endmacro ! 2307: ! 2308: ; Call an absolute address ! 2309: ; RST addr8 ! 2310: %macro RST 1 ! 2311: dec zSP ! 2312: mov edx, ezPC ; write the PC ! 2313: xchg dl, dh ! 2314: mov edi, ezSP ! 2315: MEMWRITE ! 2316: dec zSP ! 2317: mov edx, ezPC ! 2318: mov edi, ezSP ! 2319: MEMWRITE ! 2320: ! 2321: mov ezPC, %1 ; get the new PC ! 2322: DO_CYCLES ! 2323: NEXT ! 2324: %endmacro ! 2325: ! 2326: ; Out R to R*256+N ! 2327: ; OUT_N_R src8 ! 2328: %macro OUT_N_R 1 ! 2329: GETBYTE ! 2330: mov dh, z%1 ! 2331: mov edi, edx ! 2332: mov dl, z%1 ! 2333: IOWRITE ! 2334: DO_CYCLES ! 2335: NEXT ! 2336: %endmacro ! 2337: ! 2338: ; In from R*256+N, into R ! 2339: ; IN_R_N dest8 ! 2340: %macro IN_R_N 1 ! 2341: GETBYTE ! 2342: mov dh, z%1 ! 2343: mov edi, edx ! 2344: IOREAD ! 2345: mov z%1, dl ! 2346: DO_CYCLES ! 2347: NEXT ! 2348: %endmacro ! 2349: ! 2350: ; In from BC ! 2351: ; IN_R dest8 ! 2352: %macro IN_R 1 ! 2353: mov edi, ezBC ! 2354: IOREAD ! 2355: mov dh, zF ! 2356: and dh, FLAG_C ; keep the old carry ! 2357: mov z%1, dl ! 2358: test dl, dl ; other flags come from the result ! 2359: lahf ! 2360: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2361: or zF, dh ! 2362: %ifdef EMULATE_BITS_3_5 ! 2363: mov [z80_flag35], dl ! 2364: %endif ! 2365: xor dh, dh ! 2366: ! 2367: DO_CYCLES ! 2368: NEXT ! 2369: %endmacro ! 2370: ! 2371: ; In from BC, ignore result ! 2372: ; IN_F ! 2373: %macro IN_F 0 ! 2374: mov edi, ezBC ! 2375: IOREAD ! 2376: mov dh, zF ! 2377: and dh, FLAG_C ; keep the old carry ! 2378: test dl, dl ; other flags come from the result ! 2379: lahf ! 2380: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2381: or zF, dh ! 2382: %ifdef EMULATE_BITS_3_5 ! 2383: mov [z80_flag35], dl ! 2384: %endif ! 2385: xor dh, dh ! 2386: ! 2387: DO_CYCLES ! 2388: NEXT ! 2389: %endmacro ! 2390: ! 2391: ; Out to BC ! 2392: ; OUT_R src8 ! 2393: %macro OUT_R 1 ! 2394: mov edi, ezBC ! 2395: mov dl, z%1 ! 2396: IOWRITE ! 2397: DO_CYCLES ! 2398: NEXT ! 2399: %endmacro ! 2400: ! 2401: ; Out zero to BC ! 2402: ; OUT_0 ! 2403: %macro OUT_0 0 ! 2404: mov edi, ezBC ! 2405: xor dl, dl ! 2406: IOWRITE ! 2407: DO_CYCLES ! 2408: NEXT ! 2409: %endmacro ! 2410: ! 2411: ; In from BC into (HL), increase HL, decrease B ! 2412: %macro INI 0 ! 2413: ; FIXME - Parity flag is not emulated ! 2414: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2415: ! 2416: IOREAD ; read from the port ! 2417: mov edi, ezHL ! 2418: %ifdef EMULATE_WEIRD_STUFF ! 2419: push edx ; preserve the value ! 2420: %endif ! 2421: MEMWRITE ; write to (HL) ! 2422: %ifdef EMULATE_WEIRD_STUFF ! 2423: pop edx ! 2424: %endif ! 2425: ! 2426: inc zHL ; increase HL ! 2427: dec zB ; decrease B ! 2428: %ifdef EMULATE_BITS_3_5 ! 2429: mov [z80_flag35], zB ! 2430: %endif ! 2431: ! 2432: lahf ! 2433: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2434: ! 2435: ; This is a prime example of the weirdness of the Z80... ! 2436: %ifdef EMULATE_WEIRD_STUFF ! 2437: mov dh, zC ! 2438: inc dh ! 2439: add dh, dl ! 2440: jnc %%no_carry ! 2441: or zF, FLAG_H|FLAG_C ! 2442: %%no_carry: ! 2443: shr dl, 6 ! 2444: and edx, FLAG_N ! 2445: or zF, dl ! 2446: %endif ! 2447: DO_CYCLES ! 2448: NEXT ! 2449: %endmacro ! 2450: ! 2451: ; In from BC into (HL), decrease HL, decrease B ! 2452: %macro IND 0 ! 2453: ; FIXME - Parity flag is not emulated ! 2454: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2455: ! 2456: IOREAD ; read from the port ! 2457: mov edi, ezHL ! 2458: %ifdef EMULATE_WEIRD_STUFF ! 2459: push edx ; preserve the value ! 2460: %endif ! 2461: MEMWRITE ; write to (HL) ! 2462: %ifdef EMULATE_WEIRD_STUFF ! 2463: pop edx ! 2464: %endif ! 2465: ! 2466: dec zHL ; increase HL ! 2467: dec zB ; decrease B ! 2468: %ifdef EMULATE_BITS_3_5 ! 2469: mov [z80_flag35], zB ! 2470: %endif ! 2471: ! 2472: lahf ! 2473: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2474: ! 2475: ; This is a prime example of the weirdness of the Z80... ! 2476: %ifdef EMULATE_WEIRD_STUFF ! 2477: mov dh, zC ! 2478: dec dh ! 2479: add dh, dl ! 2480: jnc %%no_carry ! 2481: or zF, FLAG_H|FLAG_C ! 2482: %%no_carry: ! 2483: shr dl, 6 ! 2484: and edx, FLAG_N ! 2485: or zF, dl ! 2486: %endif ! 2487: DO_CYCLES ! 2488: NEXT ! 2489: %endmacro ! 2490: ! 2491: ; In from BC into (HL), increase HL, decrease B, repeat ! 2492: %macro INIR 0 ! 2493: ; FIXME - Parity flag is not emulated ! 2494: %%inir_loop: ! 2495: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2496: ! 2497: IOREAD ; read from the port ! 2498: mov edi, ezHL ! 2499: %ifdef EMULATE_WEIRD_STUFF ! 2500: push edx ; preserve the value ! 2501: %endif ! 2502: MEMWRITE ; write to (HL) ! 2503: %ifdef EMULATE_WEIRD_STUFF ! 2504: pop edx ! 2505: %endif ! 2506: ! 2507: inc zHL ; increase HL ! 2508: dec zB ; decrease B ! 2509: jz %%inir_zero ! 2510: ! 2511: sub [z80_ICount], dword extra_cycles ! 2512: ja near %%inir_loop ; repeat while cycles left and B>0 ! 2513: ! 2514: ; out of cycles, but operation not finished ! 2515: %ifdef EMULATE_BITS_3_5 ! 2516: mov [z80_flag35], zB ! 2517: %endif ! 2518: ! 2519: mov zF, zB ! 2520: and zF, FLAG_S ! 2521: ! 2522: ; This is a prime example of the weirdness of the Z80... ! 2523: %ifdef EMULATE_WEIRD_STUFF ! 2524: mov dh, zC ! 2525: inc dh ! 2526: add dh, dl ! 2527: jnc %%no_carry ! 2528: or zF, FLAG_H|FLAG_C ! 2529: %%no_carry: ! 2530: shr dl, 6 ! 2531: and edx, FLAG_N ! 2532: or zF, dl ! 2533: %endif ! 2534: sub zPC, 2 ; rewind to instruction start ! 2535: EXIT ! 2536: ! 2537: ; B=0 ! 2538: %%inir_zero: ! 2539: mov zF, FLAG_Z|FLAG_P ! 2540: %ifdef EMULATE_BITS_3_5 ! 2541: mov [z80_flag35], zF ! 2542: %endif ! 2543: ! 2544: ; This is a prime example of the weirdness of the Z80... ! 2545: %ifdef EMULATE_WEIRD_STUFF ! 2546: mov dh, zC ! 2547: inc dh ! 2548: add dh, dl ! 2549: jnc %%no_carry2 ! 2550: or zF, FLAG_H|FLAG_C ! 2551: %%no_carry2: ! 2552: shr dl, 6 ! 2553: and edx, FLAG_N ! 2554: or zF, dl ! 2555: %endif ! 2556: DO_CYCLES ! 2557: NEXT ! 2558: %endmacro ! 2559: ! 2560: ; In from BC into (HL), decrease HL, decrease B, repeat ! 2561: %macro INDR 0 ! 2562: ; FIXME - Parity flag is not emulated ! 2563: %%indr_loop: ! 2564: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2565: ! 2566: IOREAD ; read from the port ! 2567: mov edi, ezHL ! 2568: %ifdef EMULATE_WEIRD_STUFF ! 2569: push edx ; preserve the value ! 2570: %endif ! 2571: MEMWRITE ; write to (HL) ! 2572: %ifdef EMULATE_WEIRD_STUFF ! 2573: pop edx ! 2574: %endif ! 2575: ! 2576: dec zHL ; decrease HL ! 2577: dec zB ; decrease B ! 2578: jz %%indr_zero ! 2579: ! 2580: sub [z80_ICount], dword extra_cycles ! 2581: ja near %%indr_loop ; repeat while cycles left and B>0 ! 2582: ! 2583: ; out of cycles, but operation not finished ! 2584: %ifdef EMULATE_BITS_3_5 ! 2585: mov [z80_flag35], zB ! 2586: %endif ! 2587: ! 2588: mov zF, zB ! 2589: and zF, FLAG_S ! 2590: ! 2591: ; This is a prime example of the weirdness of the Z80... ! 2592: %ifdef EMULATE_WEIRD_STUFF ! 2593: mov dh, zC ! 2594: inc dh ! 2595: add dh, dl ! 2596: jnc %%no_carry ! 2597: or zF, FLAG_H|FLAG_C ! 2598: %%no_carry: ! 2599: shr dl, 6 ! 2600: and edx, FLAG_N ! 2601: or zF, dl ! 2602: %endif ! 2603: sub zPC, 2 ; rewind to instruction start ! 2604: EXIT ! 2605: ! 2606: ; B=0 ! 2607: %%indr_zero: ! 2608: mov zF, FLAG_Z|FLAG_P ! 2609: %ifdef EMULATE_BITS_3_5 ! 2610: mov [z80_flag35], zF ! 2611: %endif ! 2612: ! 2613: ; This is a prime example of the weirdness of the Z80... ! 2614: %ifdef EMULATE_WEIRD_STUFF ! 2615: mov dh, zC ! 2616: inc dh ! 2617: add dh, dl ! 2618: jnc %%no_carry2 ! 2619: or zF, FLAG_H|FLAG_C ! 2620: %%no_carry2: ! 2621: shr dl, 6 ! 2622: and edx, FLAG_N ! 2623: or zF, dl ! 2624: %endif ! 2625: DO_CYCLES ! 2626: NEXT ! 2627: %endmacro ! 2628: ! 2629: ; Out from (HL) into BC, increase HL, decrease B ! 2630: %macro OUTI 0 ! 2631: ; FIXME - Parity flag is not emulated ! 2632: mov edi, ezHL ! 2633: ! 2634: MEMREAD ; read from (HL) ! 2635: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2636: %ifdef EMULATE_WEIRD_STUFF ! 2637: push edx ; preserve the value ! 2638: %endif ! 2639: IOWRITE ; write to the port ! 2640: %ifdef EMULATE_WEIRD_STUFF ! 2641: pop edx ! 2642: %endif ! 2643: ! 2644: inc zHL ; increase HL ! 2645: dec zB ; decrease B ! 2646: %ifdef EMULATE_BITS_3_5 ! 2647: mov [z80_flag35], zB ! 2648: %endif ! 2649: ! 2650: lahf ! 2651: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2652: ! 2653: ; This is a prime example of the weirdness of the Z80... ! 2654: %ifdef EMULATE_WEIRD_STUFF ! 2655: mov dh, zC ! 2656: inc dh ! 2657: add dh, dl ! 2658: jnc %%no_carry ! 2659: or zF, FLAG_H|FLAG_C ! 2660: %%no_carry: ! 2661: shr dl, 6 ! 2662: and edx, FLAG_N ! 2663: or zF, dl ! 2664: %endif ! 2665: DO_CYCLES ! 2666: NEXT ! 2667: %endmacro ! 2668: ! 2669: ; Out from (HL) into BC, decrease HL, decrease B ! 2670: %macro OUTD 0 ! 2671: ; FIXME - Parity flag is not emulated ! 2672: mov edi, ezHL ! 2673: ! 2674: MEMREAD ; read from (HL) ! 2675: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2676: %ifdef EMULATE_WEIRD_STUFF ! 2677: push edx ; preserve the value ! 2678: %endif ! 2679: IOWRITE ; write to the port ! 2680: %ifdef EMULATE_WEIRD_STUFF ! 2681: pop edx ! 2682: %endif ! 2683: ! 2684: dec zHL ; decrease HL ! 2685: dec zB ; decrease B ! 2686: %ifdef EMULATE_BITS_3_5 ! 2687: mov [z80_flag35], zB ! 2688: %endif ! 2689: ! 2690: lahf ! 2691: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2692: ! 2693: ; This is a prime example of the weirdness of the Z80... ! 2694: %ifdef EMULATE_WEIRD_STUFF ! 2695: mov dh, zC ! 2696: inc dh ! 2697: add dh, dl ! 2698: jnc %%no_carry ! 2699: or zF, FLAG_H|FLAG_C ! 2700: %%no_carry: ! 2701: shr dl, 6 ! 2702: and edx, FLAG_N ! 2703: or zF, dl ! 2704: %endif ! 2705: DO_CYCLES ! 2706: NEXT ! 2707: %endmacro ! 2708: ! 2709: ; Out from (HL) into BC, increase HL, decrease B, repeat ! 2710: %macro OTIR 0 ! 2711: %%otir_loop: ! 2712: mov edi, ezHL ! 2713: MEMREAD ! 2714: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2715: %ifdef EMULATE_WEIRD_STUFF ! 2716: push edx ; preserve the value ! 2717: %endif ! 2718: IOWRITE ! 2719: %ifdef EMULATE_WEIRD_STUFF ! 2720: pop edx ! 2721: %endif ! 2722: ! 2723: inc zHL ! 2724: dec zB ! 2725: jz %%otir_zero ! 2726: ! 2727: %ifdef EMULATE_R_REGISTER ! 2728: inc zR ! 2729: %endif ! 2730: sub [z80_ICount], dword extra_cycles ! 2731: ja near %%otir_loop ! 2732: ! 2733: ; out of cycles, but not finished ! 2734: %ifdef EMULATE_BITS_3_5 ! 2735: mov [z80_flag35], zB ! 2736: %endif ! 2737: ! 2738: mov zF, zB ! 2739: and zF, FLAG_S ! 2740: ! 2741: %ifdef EMULATE_WEIRD_STUFF ! 2742: mov dh, zC ! 2743: inc dh ! 2744: add dh, dl ! 2745: jnc %%otir_nocarry ! 2746: or zF, FLAG_H|FLAG_C ! 2747: %%otir_nocarry: ! 2748: shr dl, 6 ! 2749: and edx, FLAG_N ! 2750: or zF, dl ! 2751: %endif ! 2752: sub zPC, 2 ; rewind to instruction start ! 2753: EXIT ! 2754: ! 2755: %%otir_zero: ! 2756: mov zF, FLAG_Z|FLAG_P ! 2757: %ifdef EMULATE_BITS_3_5 ! 2758: mov [z80_flag35], zF ! 2759: %endif ! 2760: %ifdef EMULATE_WEIRD_STUFF ! 2761: mov dh, zC ! 2762: inc dh ! 2763: add dh, dl ! 2764: jnc %%otir_nocarry2 ! 2765: or zF, FLAG_H|FLAG_C ! 2766: %%otir_nocarry2: ! 2767: shr dl, 6 ! 2768: and edx, FLAG_N ! 2769: or zF, dl ! 2770: %endif ! 2771: DO_CYCLES ! 2772: NEXT ! 2773: %endmacro ! 2774: ! 2775: ; Out from (HL) into BC, decrease HL, decrease B, repeat ! 2776: %macro OTDR 0 ! 2777: %%otdr_loop: ! 2778: mov edi, ezHL ! 2779: MEMREAD ! 2780: movzx edi, zC ; high byte clear? (documentation is fuzzy) ! 2781: %ifdef EMULATE_WEIRD_STUFF ! 2782: push edx ; preserve the value ! 2783: %endif ! 2784: IOWRITE ! 2785: %ifdef EMULATE_WEIRD_STUFF ! 2786: pop edx ! 2787: %endif ! 2788: ! 2789: dec zHL ! 2790: dec zB ! 2791: jz %%otdr_zero ! 2792: ! 2793: %ifdef EMULATE_R_REGISTER ! 2794: inc zR ! 2795: %endif ! 2796: sub [z80_ICount], dword extra_cycles ! 2797: ja near %%otdr_loop ! 2798: ! 2799: ; out of cycles, but not finished ! 2800: %ifdef EMULATE_BITS_3_5 ! 2801: mov [z80_flag35], zB ! 2802: %endif ! 2803: ! 2804: mov zF, zB ! 2805: and zF, FLAG_S ! 2806: ! 2807: %ifdef EMULATE_WEIRD_STUFF ! 2808: mov dh, zC ! 2809: inc dh ! 2810: add dh, dl ! 2811: jnc %%otdr_nocarry ! 2812: or zF, FLAG_H|FLAG_C ! 2813: %%otdr_nocarry: ! 2814: shr dl, 6 ! 2815: and edx, FLAG_N ! 2816: or zF, dl ! 2817: %endif ! 2818: sub zPC, 2 ; rewind to instruction start ! 2819: EXIT ! 2820: ! 2821: %%otdr_zero: ! 2822: mov zF, FLAG_Z|FLAG_P ! 2823: %ifdef EMULATE_BITS_3_5 ! 2824: mov [z80_flag35], zF ! 2825: %endif ! 2826: %ifdef EMULATE_WEIRD_STUFF ! 2827: mov dh, zC ! 2828: inc dh ! 2829: add dh, dl ! 2830: jnc %%otdr_nocarry2 ! 2831: or zF, FLAG_H|FLAG_C ! 2832: %%otdr_nocarry2: ! 2833: shr dl, 6 ! 2834: and edx, FLAG_N ! 2835: or zF, dl ! 2836: %endif ! 2837: DO_CYCLES ! 2838: NEXT ! 2839: %endmacro ! 2840: ! 2841: ; BCD adjust ! 2842: %macro DAA 0 ! 2843: test zF, FLAG_H ! 2844: jnz %%daa_h_set ! 2845: and eax, 03ffh ! 2846: mov ax, [DAA_Table + eax*2] ! 2847: %ifdef EMULATE_BITS_3_5 ! 2848: mov [z80_flag35], zF ! 2849: %endif ! 2850: DO_CYCLES ! 2851: NEXT ! 2852: ! 2853: %%daa_h_set: ! 2854: and eax, 03ffh ! 2855: mov ax, [DAA_Table + eax*2 + 4*512] ! 2856: %ifdef EMULATE_BITS_3_5 ! 2857: mov [z80_flag35], zF ! 2858: %endif ! 2859: DO_CYCLES ! 2860: NEXT ! 2861: %endmacro ! 2862: ! 2863: ; Complement A ! 2864: %macro CPL 0 ! 2865: not zA ! 2866: or zF, FLAG_H|FLAG_N ! 2867: %ifdef EMULATE_BITS_3_5 ! 2868: mov [z80_flag35], zA ! 2869: %endif ! 2870: DO_CYCLES ! 2871: NEXT ! 2872: %endmacro ! 2873: ! 2874: ; Negate A ! 2875: %macro NEG 0 ! 2876: neg zA ! 2877: lahf ! 2878: %ifdef EMULATE_BITS_3_5 ! 2879: mov [z80_flag35], zA ! 2880: %endif ! 2881: jo %%neg_overflow ! 2882: and zF, ~FLAG_P ! 2883: DO_CYCLES ! 2884: NEXT ! 2885: ! 2886: %%neg_overflow: ! 2887: or zF, FLAG_P ! 2888: DO_CYCLES ! 2889: NEXT ! 2890: %endmacro ! 2891: ! 2892: ; Set carry flag ! 2893: %macro SCF 0 ! 2894: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2895: or zF, FLAG_C ! 2896: %ifdef EMULATE_BITS_3_5 ! 2897: mov [z80_flag35], zA ! 2898: %endif ! 2899: DO_CYCLES ! 2900: NEXT ! 2901: %endmacro ! 2902: ! 2903: ; Complement carry flag ! 2904: %macro CCF 0 ! 2905: test zF, FLAG_C ! 2906: jz %%set_carry ! 2907: and zF, FLAG_S|FLAG_Z|FLAG_P ! 2908: or zF, FLAG_H ! 2909: %ifdef EMULATE_BITS_3_5 ! 2910: mov [z80_flag35], zA ! 2911: %endif ! 2912: DO_CYCLES ! 2913: NEXT ! 2914: ! 2915: %%set_carry: ! 2916: SCF ! 2917: %endmacro ! 2918: ! 2919: ; No operation ! 2920: %macro NOP 0 ! 2921: DO_CYCLES ! 2922: NEXT ! 2923: %endmacro ! 2924: ! 2925: ; Halt the processor ! 2926: %macro HALT 0 ! 2927: and [z80_ICount], dword 3 ! 2928: sub [z80_ICount], dword 4 ! 2929: mov [z80_halted], byte 1 ! 2930: EXIT ! 2931: %endmacro ! 2932: ! 2933: ; Enable interrupts ! 2934: %macro EI 0 ! 2935: mov dl, FLAG_P ; set the P/V bit, for use in "LD I,A" etc ! 2936: mov [z80_IFF1], dl ! 2937: mov [z80_IFF2], dl ! 2938: ! 2939: ; force the next instruction to be executed, regardless of ICount ! 2940: ; then force an IRQ check after it. ! 2941: mov [z80_afterEI], byte 1 ! 2942: push eax ! 2943: mov eax, [z80_ICount] ; set ICount to zero, so it will terminate ! 2944: mov [z80_TempICount], eax ; after the next instruction. ! 2945: mov [z80_ICount], dword 1 ; we can then pick it up again and carry on. ! 2946: pop eax ! 2947: NEXT ! 2948: %endmacro ! 2949: ! 2950: ; Disable interrupts ! 2951: %macro DI 0 ! 2952: xor edx, edx ! 2953: mov [z80_IFF1], dl ! 2954: mov [z80_IFF2], dl ! 2955: DO_CYCLES ! 2956: NEXT ! 2957: %endmacro ! 2958: ! 2959: ; Set interrupt mode ! 2960: %macro IM 1 ! 2961: mov [z80_IM], byte %1 ! 2962: DO_CYCLES ! 2963: NEXT ! 2964: %endmacro ! 2965: ! 2966: ;----------------------------------------------------------------------------; ! 2967: ; Bring in the opcodes... ! 2968: %include 'raze.inc' ! 2969: ;----------------------------------------------------------------------------; ! 2970: ! 2971: ;----------------------------------------------------------------------------; ! 2972: ; Support functions: ! 2973: ! 2974: DEF op, cb, 0, 0 ! 2975: %ifdef EMULATE_R_REGISTER ! 2976: inc zR ! 2977: %endif ! 2978: GETBYTE ! 2979: jmp [CBTable+edx*4] ! 2980: ! 2981: DEF op, ed, 0, 0 ! 2982: %ifdef EMULATE_R_REGISTER ! 2983: inc zR ! 2984: %endif ! 2985: GETBYTE ! 2986: jmp [EDTable+edx*4] ! 2987: ! 2988: DEF op, dd, 0, 0 ! 2989: %ifdef EMULATE_R_REGISTER ! 2990: inc zR ! 2991: %endif ! 2992: GETBYTE ! 2993: jmp [DDTable+edx*4] ! 2994: ! 2995: DEF op, fd, 0, 0 ! 2996: %ifdef EMULATE_R_REGISTER ! 2997: inc zR ! 2998: %endif ! 2999: GETBYTE ! 3000: jmp [FDTable+edx*4] ! 3001: ! 3002: DEF dd, cb, 0, 0 ! 3003: %ifdef EMULATE_R_REGISTER ! 3004: inc zR ! 3005: %endif ! 3006: GETDISP ! 3007: add di, zIX ! 3008: push edi ! 3009: GETBYTE ! 3010: pop edi ! 3011: jmp [DDCBTable+edx*4] ! 3012: ! 3013: DEF fd, cb, 0, 0 ! 3014: %ifdef EMULATE_R_REGISTER ! 3015: inc zR ! 3016: %endif ! 3017: GETDISP ! 3018: add di, zIY ! 3019: push edi ! 3020: GETBYTE ! 3021: pop edi ! 3022: jmp [DDCBTable+edx*4] ! 3023: ! 3024: DEF ed, xx, 8, 0 ! 3025: %ifdef EMULATE_R_REGISTER ! 3026: inc zR ! 3027: %endif ! 3028: DO_CYCLES ! 3029: NEXT ! 3030: ! 3031: DEF dd, xx, 4, 0 ! 3032: dec zPC ! 3033: DO_CYCLES ! 3034: NEXT ! 3035: ! 3036: DEF fd, xx, 0, 0 ! 3037: dec zPC ! 3038: DO_CYCLES ! 3039: NEXT ! 3040: ! 3041: ; called when out-of-cycles ! 3042: z80_finish: ! 3043: cmp [z80_afterEI], byte 1 ; test for the post-EI behaviour ! 3044: jne near really_finish ! 3045: push eax ! 3046: mov eax, [z80_TempICount] ! 3047: mov [z80_ICount], eax ! 3048: mov [z80_afterEI], byte 0 ! 3049: pop eax ! 3050: CHECK_IRQ ! 3051: sub dword [z80_ICount], 4 ; subtract EI's cycles ! 3052: jbe near z80_finish ! 3053: NEXT ! 3054: ! 3055: really_finish: ! 3056: ; merge bits 3 and 5 of the flags into the regs ! 3057: and zF, ~(FLAG_3|FLAG_5) ! 3058: mov dl, [z80_flag35] ! 3059: and dl, FLAG_3|FLAG_5 ! 3060: or zF, dl ! 3061: ! 3062: mov [z80_AF], ezAF ! 3063: mov [z80_HL], ezHL ! 3064: mov [z80_BC], ezBC ! 3065: mov [z80_PC], ezPC ! 3066: mov [z80_R], zR ! 3067: pop ebp ! 3068: pop edi ! 3069: pop esi ! 3070: pop ebx ! 3071: mov eax, [z80_Initial_ICount] ! 3072: sub eax, [z80_ICount] ! 3073: ret ! 3074: ! 3075: z80_default_in: ! 3076: z80_default_read: ! 3077: mov eax, 0ffh ! 3078: ret ! 3079: ! 3080: z80_default_out: ! 3081: z80_default_write: ! 3082: z80_default_reti: ! 3083: z80_default_fetch_callback: ! 3084: ret ! 3085: ! 3086: ; called to look up a read handler ! 3087: ; address is on the stack ! 3088: read_dispatcher: ! 3089: mov eax, [esp+4] ! 3090: mov edx, _read_handlers ! 3091: rd_find: ! 3092: add edx, 16 ! 3093: cmp [edx-16], eax ! 3094: ja rd_find ! 3095: cmp [edx-12], eax ! 3096: jb rd_find ! 3097: ! 3098: cmp [edx-8], dword 1 ! 3099: je rd_handler ! 3100: ! 3101: add eax, [edx-4] ! 3102: movzx eax, byte [eax] ! 3103: ret ! 3104: ! 3105: rd_handler: ! 3106: jmp [edx-4] ; call the GCC function ! 3107: ! 3108: ; called to look up a write handler ! 3109: ; address+value are on the stack ! 3110: write_dispatcher: ! 3111: mov eax, [esp+4] ! 3112: mov edx, _write_handlers ! 3113: wd_find: ! 3114: add edx, 16 ! 3115: cmp [edx-16], eax ! 3116: ja wd_find ! 3117: cmp [edx-12], eax ! 3118: jb wd_find ! 3119: ! 3120: cmp [edx-8], dword 1 ! 3121: je wd_handler ! 3122: ! 3123: add eax, [edx-4] ! 3124: mov ecx, [esp+8] ! 3125: mov [eax], cl ! 3126: ret ! 3127: ! 3128: wd_handler: ! 3129: jmp [edx-4] ; call the GCC function ! 3130: ! 3131: ; int z80_emulate(int cycles) ! 3132: ; Emulate for 'cycles' T-states, ! 3133: ; Returns the number of cycles actually emulated. ! 3134: global z80_emulate ! 3135: z80_emulate: ! 3136: mov eax, [esp+4] ! 3137: push ebx ! 3138: push esi ! 3139: push edi ! 3140: push ebp ! 3141: ! 3142: add eax, [z80_Extra_Cycles] ! 3143: mov [z80_ICount], eax ! 3144: mov [z80_Initial_ICount], eax ! 3145: xor edx, edx ! 3146: xor edi, edi ! 3147: mov [z80_Extra_Cycles], edx ! 3148: mov [z80_afterEI], dl ! 3149: mov ezAF, [z80_AF] ! 3150: mov ezHL, [z80_HL] ! 3151: mov ezBC, [z80_BC] ! 3152: mov ezPC, [z80_PC] ! 3153: mov zR, [z80_R] ! 3154: mov [z80_flag35], zF ; take out bits 3/5 ! 3155: cmp [z80_halted], byte 0 ! 3156: je not_halted ! 3157: and [z80_ICount], dword 3 ; If we're halted, just skip it all. ! 3158: sub [z80_ICount], dword 4 ! 3159: EXIT ! 3160: not_halted: ! 3161: NEXT ! 3162: ! 3163: ; void z80_reset(void) ! 3164: ; Resets the Z80. ! 3165: global z80_reset ! 3166: z80_reset: ! 3167: push edi ! 3168: xor eax, eax ; just zero it all ! 3169: mov edi, context_start ! 3170: mov ecx, (registers_end - context_start) ! 3171: rep stosb ! 3172: pop edi ! 3173: mov [z80_IX], word 0ffffh ! 3174: mov [z80_IY], word 0ffffh ! 3175: mov [z80_AF], word 04000h ! 3176: ret ! 3177: ! 3178: ; void z80_raise_IRQ(UBYTE vector) ! 3179: ; Causes an interrupt with the given vector. ! 3180: ; In IM 0, the vector has to be an RST opcode. ! 3181: ; If interrupts are disabled, the interrupt will still happen as long as ! 3182: ; the IRQ line stays raised. ! 3183: global z80_raise_IRQ ! 3184: z80_raise_IRQ: ! 3185: mov [z80_IRQLine], byte 1 ! 3186: mov eax, [esp+4] ! 3187: mov [z80_IRQVector], al ! 3188: ! 3189: xor edx, edx ! 3190: push ebx ! 3191: push esi ! 3192: push edi ! 3193: push ebp ! 3194: CALLGCC_END ; grab our Z80 regs ! 3195: ! 3196: CHECK_IRQ ! 3197: ! 3198: CALLGCC_START ! 3199: pop ebp ! 3200: pop edi ! 3201: pop esi ! 3202: pop ebx ! 3203: ret ! 3204: ! 3205: ; void z80_lower_IRQ(void) ! 3206: ; Lowers the IRQ line. ! 3207: global z80_lower_IRQ ! 3208: z80_lower_IRQ: ! 3209: mov [z80_IRQLine], byte 0 ! 3210: ret ! 3211: ! 3212: ; void z80_cause_NMI(void) ! 3213: ; Causes a non-maskable interrupt. ! 3214: ; This will always be accepted. ! 3215: ; There is no raise/lower functions, as the NMI is edge-triggered. ! 3216: global z80_cause_NMI ! 3217: z80_cause_NMI: ! 3218: xor edx, edx ! 3219: push ebx ! 3220: push esi ! 3221: push edi ! 3222: push ebp ! 3223: CALLGCC_END ; grab our Z80 regs ! 3224: ! 3225: ; disable interrupts ! 3226: mov [z80_IFF1], byte 0 ! 3227: ! 3228: ; take up 11 T-states ! 3229: add [z80_Extra_Cycles], dword 11 ! 3230: %ifdef EMULATE_R_REGISTER ! 3231: inc zR ! 3232: %endif ! 3233: ! 3234: mov [z80_halted], byte 0 ; Un-HALT us. ! 3235: ! 3236: mov edx, ezPC ; write the PC ! 3237: dec zSP ! 3238: ! 3239: xchg dl, dh ! 3240: mov edi, ezSP ! 3241: MEMWRITE ! 3242: dec zSP ! 3243: mov edx, ezPC ! 3244: mov edi, ezSP ! 3245: MEMWRITE ! 3246: ! 3247: mov ezPC, 66h ; set the new PC ! 3248: ! 3249: CALLGCC_START ! 3250: pop ebp ! 3251: pop edi ! 3252: pop esi ! 3253: pop ebx ! 3254: ret ! 3255: ! 3256: ; int z80_get_context_size(void) ! 3257: ; Returns the size of the context, in bytes ! 3258: global z80_get_context_size ! 3259: z80_get_context_size: ! 3260: mov eax, (context_end - context_start) + 4 ; +4 for a safety buffer ! 3261: ret ! 3262: ! 3263: ! 3264: ; void z80_set_context(void *context) ! 3265: ; Copy the given context to the current Z80. ! 3266: global z80_set_context ! 3267: z80_set_context: ! 3268: push esi ! 3269: push edi ! 3270: mov ecx, (context_end - context_start) / 4 ! 3271: mov esi, [esp+12] ! 3272: mov edi, context_start ! 3273: rep movsd ! 3274: pop edi ! 3275: pop esi ! 3276: ret ! 3277: ! 3278: ; void z80_get_context(void *context) ! 3279: ; Copy the current Z80 to the given context. ! 3280: global z80_get_context ! 3281: z80_get_context: ! 3282: push esi ! 3283: push edi ! 3284: mov ecx, (context_end - context_start) / 4 ! 3285: mov edi, [esp+12] ! 3286: mov esi, context_start ! 3287: rep movsd ! 3288: pop edi ! 3289: pop esi ! 3290: ret ! 3291: ! 3292: ; int z80_get_cycles_elapsed(void) ! 3293: ; Returns the number of cycles emulated since z80_emulate was called. ! 3294: global z80_get_cycles_elapsed ! 3295: z80_get_cycles_elapsed: ! 3296: mov eax, [z80_Initial_ICount] ! 3297: sub eax, [z80_ICount] ! 3298: cmp [z80_afterEI], byte 0 ! 3299: je z80_gcd_fin ! 3300: sub eax, [z80_TempICount] ! 3301: z80_gcd_fin: ! 3302: ret ! 3303: ! 3304: ; void z80_stop_emulating(void) ! 3305: ; Stops the emulation dead. (waits for the current instruction to finish ! 3306: ; first though). ! 3307: ; The return value from z80_execute will obviously be lower than expected. ! 3308: global z80_stop_emulating ! 3309: z80_stop_emulating: ! 3310: mov eax, [z80_ICount] ! 3311: sub [z80_Initial_ICount], eax ! 3312: cmp [z80_afterEI], byte 0 ! 3313: je z80_se_fin ! 3314: mov ecx, [z80_TempICount] ! 3315: sub [z80_Initial_ICount], ecx ! 3316: z80_se_fin: ! 3317: mov [z80_ICount], dword 0 ! 3318: mov [z80_TempICount], dword 0 ! 3319: ret ! 3320: ! 3321: ; void z80_skip_idle(void) ! 3322: ; Stops the emulation dead. (waits for the current instruction to finish ! 3323: ; first though). ! 3324: ; The return value from z80_execute will appear as though it had executed ! 3325: ; all the instructions like normal. ! 3326: global z80_skip_idle ! 3327: z80_skip_idle: ! 3328: mov [z80_ICount], dword 0 ! 3329: mov [z80_TempICount], dword 0 ! 3330: ret ! 3331: ! 3332: ; void z80_do_wait_states(int n) ! 3333: ; Halts the CPU temporarily, to execute 'n' memory wait states. ! 3334: global z80_do_wait_states ! 3335: z80_do_wait_states: ! 3336: add [z80_Initial_ICount], eax ! 3337: ret ! 3338: ! 3339: ; UWORD z80_get_reg(z80_register reg) ! 3340: ; Return the value of the specified register. ! 3341: global z80_get_reg ! 3342: z80_get_reg: ! 3343: mov ecx, [esp+4] ! 3344: cmp ecx, Z80_REG_HL2 ! 3345: mov eax, [context_start + ecx*4] ! 3346: jbe getreg_simple ! 3347: ! 3348: cmp ecx, Z80_REG_IFF1 ! 3349: mov al, [z80_IFF1] ! 3350: je getreg_boolean ! 3351: ! 3352: cmp ecx, Z80_REG_IFF2 ! 3353: mov al, [z80_IFF2] ! 3354: je getreg_boolean ! 3355: ! 3356: cmp ecx, Z80_REG_IRQLine ! 3357: mov al, [z80_IRQLine] ! 3358: je getreg_boolean ! 3359: ! 3360: cmp ecx, Z80_REG_Halted ! 3361: mov al, [z80_halted] ! 3362: je getreg_boolean ! 3363: ! 3364: cmp ecx, Z80_REG_IM ! 3365: movzx eax, byte [z80_IM] ! 3366: je getreg_finish ! 3367: ! 3368: cmp ecx, Z80_REG_IRQVector ! 3369: movzx eax, byte [z80_IRQVector] ! 3370: je getreg_finish ! 3371: ! 3372: ; construct IR ! 3373: mov eax, [z80_R] ! 3374: and eax, 7fh ! 3375: mov edx, [z80_R2] ! 3376: and edx, 80h ! 3377: or eax, edx ! 3378: mov ah, byte [z80_I] ! 3379: ret ! 3380: ! 3381: getreg_simple: ! 3382: cmp ecx, Z80_REG_AF ! 3383: je getreg_swap ! 3384: cmp ecx, Z80_REG_AF2 ! 3385: je getreg_swap ! 3386: getreg_finish: ! 3387: ret ! 3388: getreg_swap: ! 3389: xchg al, ah ; swap A and F ! 3390: ret ! 3391: ! 3392: getreg_boolean: ! 3393: and eax, 0ffh ! 3394: jz getreg_finish ! 3395: mov al, 1 ! 3396: ret ! 3397: ! 3398: ; void z80_set_reg(z80_register reg, UWORD value) ! 3399: ; Set the specified register to a new value. ! 3400: global z80_set_reg ! 3401: z80_set_reg: ! 3402: mov ecx, [esp+4] ! 3403: mov eax, [esp+8] ! 3404: and eax, 0ffffh ! 3405: cmp ecx, Z80_REG_HL2 ! 3406: jbe setreg_simple ! 3407: ! 3408: cmp ecx, Z80_REG_IFF1 ! 3409: lea edx, [z80_IFF1] ! 3410: jbe setreg_boolean ! 3411: ! 3412: cmp ecx, Z80_REG_IFF2 ! 3413: lea edx, [z80_IFF2] ! 3414: jbe setreg_boolean ! 3415: ! 3416: cmp ecx, Z80_REG_IRQLine ! 3417: lea edx, [z80_IRQLine] ! 3418: je setreg_boolean ! 3419: ! 3420: cmp ecx, Z80_REG_Halted ! 3421: lea edx, [z80_halted] ! 3422: je setreg_boolean ! 3423: ! 3424: cmp ecx, Z80_REG_IM ! 3425: lea edx, [z80_IM] ! 3426: je setreg_value ! 3427: ! 3428: cmp ecx, Z80_REG_IRQVector ! 3429: lea edx, [z80_IRQVector] ! 3430: je setreg_value ! 3431: ! 3432: ; deconstruct IR ! 3433: mov [z80_I], ah ! 3434: mov [z80_R2], eax ! 3435: mov [z80_R], eax ! 3436: ret ! 3437: ! 3438: setreg_simple: ! 3439: cmp ecx, Z80_REG_AF ! 3440: je setreg_swap ! 3441: cmp ecx, Z80_REG_AF2 ! 3442: je setreg_swap ! 3443: setreg_finish: ! 3444: mov [context_start + ecx*4], eax ! 3445: ret ! 3446: setreg_swap: ! 3447: xchg al, ah ; swap A and F ! 3448: mov [context_start + ecx*4], eax ! 3449: ret ! 3450: ! 3451: setreg_boolean: ! 3452: test eax, eax ! 3453: jz setreg_value ! 3454: mov al, FLAG_P ! 3455: ! 3456: setreg_value: ! 3457: mov [edx], al ! 3458: ret ! 3459: ! 3460: ; void z80_init_memmap(void) ! 3461: ; Reset the current memory map ! 3462: global z80_init_memmap ! 3463: z80_init_memmap: ! 3464: mov [z80_In], dword z80_default_in ! 3465: mov [z80_Out], dword z80_default_out ! 3466: mov [z80_RetI], dword z80_default_reti ! 3467: mov [z80_Fetch_Callback], dword z80_default_fetch_callback ! 3468: ! 3469: push edi ; clear the memory handlers ! 3470: mov eax, -1 ! 3471: mov ecx, MAX_MEM_HANDLERS*4 ! 3472: mov edi, _read_handlers ! 3473: rep stosd ! 3474: mov ecx, MAX_MEM_HANDLERS*4 ! 3475: mov edi, _write_handlers ! 3476: rep stosd ! 3477: ! 3478: ; reset the read table ! 3479: mov edi, z80_Read ! 3480: mov ecx, 100h ! 3481: clear_read: ! 3482: mov [edi], dword z80_default_read ! 3483: add edi, 8 ! 3484: loop clear_read ! 3485: ! 3486: ; reset the write table ! 3487: mov edi, z80_Write ! 3488: mov ecx, 100h ! 3489: clear_write: ! 3490: mov [edi], dword z80_default_write ! 3491: add edi, 8 ! 3492: loop clear_write ! 3493: ! 3494: pop edi ! 3495: ret ! 3496: ! 3497: ; void z80_end_memmap(void) ! 3498: ; Finishes the current memory map ! 3499: global z80_end_memmap ! 3500: z80_end_memmap: ! 3501: ; put the entry at the end of the read table ! 3502: mov edx, _read_handlers ! 3503: er_find: ! 3504: add edx, 16 ! 3505: cmp [edx-16], dword (-1) ! 3506: jne er_find ! 3507: sub edx, 16 ! 3508: ! 3509: ; put it in there ! 3510: mov [edx], dword 0 ! 3511: mov [edx+4], dword 0ffffh ! 3512: mov [edx+8], dword 0 ! 3513: mov [edx+12], dword z80_default_read ! 3514: ! 3515: ; put the entry at the end of the write table ! 3516: mov edx, _write_handlers ! 3517: ew_find: ! 3518: add edx, 16 ! 3519: cmp [edx-16], dword (-1) ! 3520: jne ew_find ! 3521: sub edx, 16 ! 3522: ! 3523: ; put it in there ! 3524: mov [edx], dword 0 ! 3525: mov [edx+4], dword 0ffffh ! 3526: mov [edx+8], dword 0 ! 3527: mov [edx+12], dword z80_default_write ! 3528: ret ! 3529: ! 3530: ; void z80_map_fetch(UWORD start, UWORD end, UBYTE *memory) ! 3531: ; Set the given area for op-code fetching ! 3532: ; start/end = the area it covers ! 3533: ; memory = the ROM/RAM to read from ! 3534: global z80_map_fetch ! 3535: z80_map_fetch: ! 3536: push ebx ! 3537: mov eax, [esp+8] ! 3538: mov ebx, [esp+12] ! 3539: mov ecx, [esp+16] ! 3540: and eax, 0ffffh ! 3541: and ebx, 0ffffh ! 3542: sub ecx, eax ! 3543: ! 3544: mf_loop: ! 3545: ; if there's no area left inbetween, stop now. ! 3546: mov edx, eax ! 3547: shr edx, 8 ! 3548: ! 3549: cmp eax, ebx ! 3550: ja mf_finish ! 3551: ! 3552: mov [z80_Fetch+edx*4], ecx ! 3553: add eax, 0100h ! 3554: jmp mf_loop ! 3555: ! 3556: mf_finish: ! 3557: pop ebx ! 3558: ret ! 3559: ! 3560: ; void z80_map_read(UWORD start, UWORD end, UBYTE *memory) ! 3561: ; Moves a Z80_MAP_MAPPED area to use a different region of memory ! 3562: ; start/end = the area it covers (must be page-aligned) ! 3563: ; memory = the ROM/RAM to read from ! 3564: global z80_map_read ! 3565: z80_map_read: ! 3566: push ebx ! 3567: mov eax, [esp+8] ! 3568: mov ebx, [esp+12] ! 3569: mov ecx, [esp+16] ! 3570: and eax, 0ffffh ! 3571: and ebx, 0ffffh ! 3572: sub ecx, eax ! 3573: ! 3574: mr_loop: ! 3575: ; if there's no area left inbetween, stop now. ! 3576: mov edx, eax ! 3577: shr edx, 8 ! 3578: ! 3579: cmp eax, ebx ! 3580: ja mr_finish ! 3581: ! 3582: mov [z80_Read+edx*8], dword 0 ! 3583: mov [z80_Read+edx*8+4], ecx ! 3584: add eax, 0100h ! 3585: jmp mr_loop ! 3586: ! 3587: mr_finish: ! 3588: pop ebx ! 3589: ret ! 3590: ! 3591: ; void z80_map_write(UWORD start, UWORD end, UBYTE *memory) ! 3592: ; Moves a Z80_MAP_MAPPED area to use a different region of memory ! 3593: ; start/end = the area it covers (must be page-aligned) ! 3594: ; memory = the ROM/RAM to read from ! 3595: global z80_map_write ! 3596: z80_map_write: ! 3597: push ebx ! 3598: mov eax, [esp+8] ! 3599: mov ebx, [esp+12] ! 3600: mov ecx, [esp+16] ! 3601: and eax, 0ffffh ! 3602: and ebx, 0ffffh ! 3603: sub ecx, eax ! 3604: ! 3605: mw_loop: ! 3606: ; if there's no area left inbetween, stop now. ! 3607: mov edx, eax ! 3608: shr edx, 8 ! 3609: ! 3610: cmp eax, ebx ! 3611: ja mw_finish ! 3612: ! 3613: mov [z80_Write+edx*8], dword 0 ! 3614: mov [z80_Write+edx*8+4], ecx ! 3615: add eax, 0100h ! 3616: jmp mw_loop ! 3617: ! 3618: mw_finish: ! 3619: pop ebx ! 3620: ret ! 3621: ! 3622: ; void z80_add_read(UWORD start, UWORD end, int method, void *data) ! 3623: ; Add a READ memory handler to the memory map ! 3624: ; start/end = the area it covers ! 3625: ; method = 0 for direct, 1 for handled ! 3626: ; data = RAM for direct, handler for handled ! 3627: global z80_add_read ! 3628: z80_add_read: ! 3629: push ebx ! 3630: mov eax, [esp+8] ! 3631: mov ebx, [esp+12] ! 3632: mov ecx, [esp+20] ! 3633: and eax, 0ffffh ! 3634: and ebx, 0ffffh ! 3635: ! 3636: ; put the entry in the read table first ! 3637: mov edx, _read_handlers ! 3638: ar_find: ! 3639: add edx, 16 ! 3640: cmp [edx-16], dword (-1) ! 3641: jne ar_find ! 3642: sub edx, 16 ! 3643: ! 3644: ; put it in there ! 3645: mov [edx], eax ! 3646: mov [edx+4], ebx ! 3647: mov eax, [esp+16] ! 3648: mov [edx+8], eax ! 3649: ! 3650: mov eax, ecx ; if direct, subtract the start from the memory area ! 3651: push ebx ! 3652: mov ebx, [esp+12] ! 3653: and ebx, 0ffffh ! 3654: cmp [esp+20], dword 1 ! 3655: je ar_dont_adjust ! 3656: sub eax, ebx ! 3657: ar_dont_adjust: ! 3658: mov [edx+12], eax ! 3659: ! 3660: mov eax, ebx ! 3661: pop ebx ! 3662: ! 3663: ; process the start, so it's page aligned ! 3664: test al, al ! 3665: jz ar_start_done ! 3666: ! 3667: ; put the start handler to go to the dispatcher ! 3668: mov edx, eax ! 3669: shr edx, 8 ! 3670: mov [z80_Read+edx*8], dword read_dispatcher ! 3671: xor al, al ! 3672: add eax, 0100h ! 3673: ! 3674: ar_start_done: ! 3675: ; process the end, so it's page aligned ! 3676: cmp bl, 0ffh ! 3677: je ar_end_done ! 3678: ! 3679: ; put the end handler to go to the dispatcher ! 3680: mov edx, ebx ! 3681: shr edx, 8 ! 3682: mov [z80_Read+edx*8], dword read_dispatcher ! 3683: mov bl, 0ffh ! 3684: sub ebx, 0100h ! 3685: ! 3686: ar_end_done: ! 3687: ! 3688: sub ecx, eax ! 3689: ar_loop: ! 3690: ; if there's no area left inbetween, stop now. ! 3691: mov edx, eax ! 3692: shr edx, 8 ! 3693: ! 3694: cmp eax, ebx ! 3695: jg ar_finish ! 3696: ! 3697: cmp [esp+16], dword 0 ! 3698: je ar_put_direct ! 3699: ! 3700: push ecx ! 3701: mov ecx, [esp+24] ! 3702: mov [z80_Read+edx*8], ecx ! 3703: pop ecx ! 3704: add eax, 0100h ! 3705: jmp ar_loop ! 3706: ! 3707: ar_put_direct: ! 3708: mov [z80_Read+edx*8], dword 0 ! 3709: mov [z80_Read+edx*8+4], ecx ! 3710: add eax, 0100h ! 3711: jmp ar_loop ! 3712: ! 3713: ar_finish: ! 3714: pop ebx ! 3715: ret ! 3716: ! 3717: ; void z80_add_write(UWORD start, UWORD end, int method, void *data) ! 3718: ; Add a WRITE memory handler to the memory map ! 3719: ; start/end = the area it covers ! 3720: ; method = 0 for direct, 1 for handled ! 3721: ; data = RAM for direct, handler for handled ! 3722: global z80_add_write ! 3723: z80_add_write: ! 3724: push ebx ! 3725: mov eax, [esp+8] ! 3726: mov ebx, [esp+12] ! 3727: mov ecx, [esp+20] ! 3728: and eax, 0ffffh ! 3729: and ebx, 0ffffh ! 3730: ! 3731: ; put the entry in the read table first ! 3732: mov edx, _write_handlers ! 3733: aw_find: ! 3734: add edx, 16 ! 3735: cmp [edx-16], dword (-1) ! 3736: jne aw_find ! 3737: sub edx, 16 ! 3738: ! 3739: ; put it in there ! 3740: mov [edx], eax ! 3741: mov [edx+4], ebx ! 3742: mov eax, [esp+16] ! 3743: mov [edx+8], eax ! 3744: ! 3745: mov eax, ecx ; if direct, subtract the start from the memory area ! 3746: push ebx ! 3747: mov ebx, [esp+12] ! 3748: and ebx, 0ffffh ! 3749: cmp [esp+20], dword 1 ! 3750: je aw_dont_adjust ! 3751: sub eax, ebx ! 3752: aw_dont_adjust: ! 3753: mov [edx+12], eax ! 3754: ! 3755: mov eax, ebx ! 3756: pop ebx ! 3757: ! 3758: ; process the start, so it's page aligned ! 3759: test al, al ! 3760: jz aw_start_done ! 3761: ! 3762: ; put the start handler to go to the dispatcher ! 3763: mov edx, eax ! 3764: shr edx, 8 ! 3765: mov [z80_Write+edx*8], dword write_dispatcher ! 3766: xor al, al ! 3767: add eax, 0100h ! 3768: ! 3769: aw_start_done: ! 3770: ; process the end, so it's page aligned ! 3771: cmp bl, 0ffh ! 3772: je aw_end_done ! 3773: ! 3774: ; put the end handler to go to the dispatcher ! 3775: mov edx, ebx ! 3776: shr edx, 8 ! 3777: mov [z80_Write+edx*8], dword write_dispatcher ! 3778: mov bl, 0ffh ! 3779: sub ebx, 0100h ! 3780: ! 3781: aw_end_done: ! 3782: ! 3783: sub ecx, eax ! 3784: aw_loop: ! 3785: ; if there's no area left inbetween, stop now. ! 3786: mov edx, eax ! 3787: shr edx, 8 ! 3788: ! 3789: cmp eax, ebx ! 3790: jg aw_finish ! 3791: ! 3792: cmp [esp+16], dword 0 ! 3793: je aw_put_direct ! 3794: ! 3795: push ecx ! 3796: mov ecx, [esp+24] ! 3797: mov [z80_Write+edx*8], ecx ! 3798: pop ecx ! 3799: add eax, 0100h ! 3800: jmp aw_loop ! 3801: ! 3802: aw_put_direct: ! 3803: mov [z80_Write+edx*8], dword 0 ! 3804: mov [z80_Write+edx*8+4], ecx ! 3805: add eax, 0100h ! 3806: jmp aw_loop ! 3807: ! 3808: aw_finish: ! 3809: pop ebx ! 3810: ret ! 3811: ! 3812: ; void z80_set_in(UBYTE (*handler)(UWORD port)) ! 3813: ; Set the IN port handler to the given function ! 3814: global z80_set_in ! 3815: z80_set_in: ! 3816: mov eax, [esp+4] ! 3817: mov [z80_In], eax ! 3818: ret ! 3819: ! 3820: ; void z80_set_out(void (*handler)(UWORD port, UBYTE value)) ! 3821: ; Set the OUT port handler to the given function ! 3822: global z80_set_out ! 3823: z80_set_out: ! 3824: mov eax, [esp+4] ! 3825: mov [z80_Out], eax ! 3826: ret ! 3827: ! 3828: ; void z80_set_reti(void (*handler)(void)) ! 3829: ; Set the RETI handler to the given function ! 3830: global z80_set_reti ! 3831: z80_set_reti: ! 3832: mov eax, [esp+4] ! 3833: mov [z80_RetI], eax ! 3834: ret ! 3835: ! 3836: ; void z80_set_fetch_callback(void (*handler)(UWORD pc)) ! 3837: ; Set the fetch callback to the given function ! 3838: global z80_set_fetch_callback ! 3839: z80_set_fetch_callback: ! 3840: mov eax, [esp+4] ! 3841: mov [z80_Fetch_Callback], eax ! 3842: ret ! 3843: ! 3844: ;----------------------------------------------------------------------------; ! 3845: ; the jump tables ! 3846: OpTable: ! 3847: dd op_00, op_01, op_02, op_03, op_04, op_05, op_06, op_07 ! 3848: dd op_08, op_09, op_0a, op_0b, op_0c, op_0d, op_0e, op_0f ! 3849: dd op_10, op_11, op_12, op_13, op_14, op_15, op_16, op_17 ! 3850: dd op_18, op_19, op_1a, op_1b, op_1c, op_1d, op_1e, op_1f ! 3851: dd op_20, op_21, op_22, op_23, op_24, op_25, op_26, op_27 ! 3852: dd op_28, op_29, op_2a, op_2b, op_2c, op_2d, op_2e, op_2f ! 3853: dd op_30, op_31, op_32, op_33, op_34, op_35, op_36, op_37 ! 3854: dd op_38, op_39, op_3a, op_3b, op_3c, op_3d, op_3e, op_3f ! 3855: dd op_40, op_41, op_42, op_43, op_44, op_45, op_46, op_47 ! 3856: dd op_48, op_49, op_4a, op_4b, op_4c, op_4d, op_4e, op_4f ! 3857: dd op_50, op_51, op_52, op_53, op_54, op_55, op_56, op_57 ! 3858: dd op_58, op_59, op_5a, op_5b, op_5c, op_5d, op_5e, op_5f ! 3859: dd op_60, op_61, op_62, op_63, op_64, op_65, op_66, op_67 ! 3860: dd op_68, op_69, op_6a, op_6b, op_6c, op_6d, op_6e, op_6f ! 3861: dd op_70, op_71, op_72, op_73, op_74, op_75, op_76, op_77 ! 3862: dd op_78, op_79, op_7a, op_7b, op_7c, op_7d, op_7e, op_7f ! 3863: dd op_80, op_81, op_82, op_83, op_84, op_85, op_86, op_87 ! 3864: dd op_88, op_89, op_8a, op_8b, op_8c, op_8d, op_8e, op_8f ! 3865: dd op_90, op_91, op_92, op_93, op_94, op_95, op_96, op_97 ! 3866: dd op_98, op_99, op_9a, op_9b, op_9c, op_9d, op_9e, op_9f ! 3867: dd op_a0, op_a1, op_a2, op_a3, op_a4, op_a5, op_a6, op_a7 ! 3868: dd op_a8, op_a9, op_aa, op_ab, op_ac, op_ad, op_ae, op_af ! 3869: dd op_b0, op_b1, op_b2, op_b3, op_b4, op_b5, op_b6, op_b7 ! 3870: dd op_b8, op_b9, op_ba, op_bb, op_bc, op_bd, op_be, op_bf ! 3871: dd op_c0, op_c1, op_c2, op_c3, op_c4, op_c5, op_c6, op_c7 ! 3872: dd op_c8, op_c9, op_ca, op_cb, op_cc, op_cd, op_ce, op_cf ! 3873: dd op_d0, op_d1, op_d2, op_d3, op_d4, op_d5, op_d6, op_d7 ! 3874: dd op_d8, op_d9, op_da, op_db, op_dc, op_dd, op_de, op_df ! 3875: dd op_e0, op_e1, op_e2, op_e3, op_e4, op_e5, op_e6, op_e7 ! 3876: dd op_e8, op_e9, op_ea, op_eb, op_ec, op_ed, op_ee, op_ef ! 3877: dd op_f0, op_f1, op_f2, op_f3, op_f4, op_f5, op_f6, op_f7 ! 3878: dd op_f8, op_f9, op_fa, op_fb, op_fc, op_fd, op_fe, op_ff ! 3879: ! 3880: CBTable: ! 3881: dd cb_00, cb_01, cb_02, cb_03, cb_04, cb_05, cb_06, cb_07 ! 3882: dd cb_08, cb_09, cb_0a, cb_0b, cb_0c, cb_0d, cb_0e, cb_0f ! 3883: dd cb_10, cb_11, cb_12, cb_13, cb_14, cb_15, cb_16, cb_17 ! 3884: dd cb_18, cb_19, cb_1a, cb_1b, cb_1c, cb_1d, cb_1e, cb_1f ! 3885: dd cb_20, cb_21, cb_22, cb_23, cb_24, cb_25, cb_26, cb_27 ! 3886: dd cb_28, cb_29, cb_2a, cb_2b, cb_2c, cb_2d, cb_2e, cb_2f ! 3887: dd cb_30, cb_31, cb_32, cb_33, cb_34, cb_35, cb_36, cb_37 ! 3888: dd cb_38, cb_39, cb_3a, cb_3b, cb_3c, cb_3d, cb_3e, cb_3f ! 3889: dd cb_40, cb_41, cb_42, cb_43, cb_44, cb_45, cb_46, cb_47 ! 3890: dd cb_48, cb_49, cb_4a, cb_4b, cb_4c, cb_4d, cb_4e, cb_4f ! 3891: dd cb_50, cb_51, cb_52, cb_53, cb_54, cb_55, cb_56, cb_57 ! 3892: dd cb_58, cb_59, cb_5a, cb_5b, cb_5c, cb_5d, cb_5e, cb_5f ! 3893: dd cb_60, cb_61, cb_62, cb_63, cb_64, cb_65, cb_66, cb_67 ! 3894: dd cb_68, cb_69, cb_6a, cb_6b, cb_6c, cb_6d, cb_6e, cb_6f ! 3895: dd cb_70, cb_71, cb_72, cb_73, cb_74, cb_75, cb_76, cb_77 ! 3896: dd cb_78, cb_79, cb_7a, cb_7b, cb_7c, cb_7d, cb_7e, cb_7f ! 3897: dd cb_80, cb_81, cb_82, cb_83, cb_84, cb_85, cb_86, cb_87 ! 3898: dd cb_88, cb_89, cb_8a, cb_8b, cb_8c, cb_8d, cb_8e, cb_8f ! 3899: dd cb_90, cb_91, cb_92, cb_93, cb_94, cb_95, cb_96, cb_97 ! 3900: dd cb_98, cb_99, cb_9a, cb_9b, cb_9c, cb_9d, cb_9e, cb_9f ! 3901: dd cb_a0, cb_a1, cb_a2, cb_a3, cb_a4, cb_a5, cb_a6, cb_a7 ! 3902: dd cb_a8, cb_a9, cb_aa, cb_ab, cb_ac, cb_ad, cb_ae, cb_af ! 3903: dd cb_b0, cb_b1, cb_b2, cb_b3, cb_b4, cb_b5, cb_b6, cb_b7 ! 3904: dd cb_b8, cb_b9, cb_ba, cb_bb, cb_bc, cb_bd, cb_be, cb_bf ! 3905: dd cb_c0, cb_c1, cb_c2, cb_c3, cb_c4, cb_c5, cb_c6, cb_c7 ! 3906: dd cb_c8, cb_c9, cb_ca, cb_cb, cb_cc, cb_cd, cb_ce, cb_cf ! 3907: dd cb_d0, cb_d1, cb_d2, cb_d3, cb_d4, cb_d5, cb_d6, cb_d7 ! 3908: dd cb_d8, cb_d9, cb_da, cb_db, cb_dc, cb_dd, cb_de, cb_df ! 3909: dd cb_e0, cb_e1, cb_e2, cb_e3, cb_e4, cb_e5, cb_e6, cb_e7 ! 3910: dd cb_e8, cb_e9, cb_ea, cb_eb, cb_ec, cb_ed, cb_ee, cb_ef ! 3911: dd cb_f0, cb_f1, cb_f2, cb_f3, cb_f4, cb_f5, cb_f6, cb_f7 ! 3912: dd cb_f8, cb_f9, cb_fa, cb_fb, cb_fc, cb_fd, cb_fe, cb_ff ! 3913: ! 3914: EDTable: ! 3915: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3916: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3917: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3918: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3919: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3920: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3921: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3922: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3923: dd ed_40, ed_41, ed_42, ed_43, ed_44, ed_45, ed_46, ed_47 ! 3924: dd ed_48, ed_49, ed_4a, ed_4b, ed_4c, ed_4d, ed_4e, ed_4f ! 3925: dd ed_50, ed_51, ed_52, ed_53, ed_54, ed_55, ed_56, ed_57 ! 3926: dd ed_58, ed_59, ed_5a, ed_5b, ed_5c, ed_5d, ed_5e, ed_5f ! 3927: dd ed_60, ed_61, ed_62, ed_63, ed_64, ed_65, ed_66, ed_67 ! 3928: dd ed_68, ed_69, ed_6a, ed_6b, ed_6c, ed_6d, ed_6e, ed_6f ! 3929: dd ed_70, ed_71, ed_72, ed_73, ed_74, ed_75, ed_76, ed_xx ! 3930: dd ed_78, ed_79, ed_7a, ed_7b, ed_7c, ed_7d, ed_7e, ed_xx ! 3931: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3932: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3933: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3934: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3935: dd ed_a0, ed_a1, ed_a2, ed_a3, ed_xx, ed_xx, ed_xx, ed_xx ! 3936: dd ed_a8, ed_a9, ed_aa, ed_ab, ed_xx, ed_xx, ed_xx, ed_xx ! 3937: dd ed_b0, ed_b1, ed_b2, ed_b3, ed_xx, ed_xx, ed_xx, ed_xx ! 3938: dd ed_b8, ed_b9, ed_ba, ed_bb, ed_xx, ed_xx, ed_xx, ed_xx ! 3939: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3940: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3941: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3942: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3943: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3944: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3945: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3946: dd ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx, ed_xx ! 3947: ! 3948: DDTable: ! 3949: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3950: dd dd_xx, dd_09, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3951: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3952: dd dd_xx, dd_19, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3953: dd dd_xx, dd_21, dd_22, dd_23, dd_24, dd_25, dd_26, dd_xx ! 3954: dd dd_xx, dd_29, dd_2a, dd_2b, dd_2c, dd_2d, dd_2e, dd_xx ! 3955: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_34, dd_35, dd_36, dd_xx ! 3956: dd dd_xx, dd_39, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3957: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_44, dd_45, dd_46, dd_xx ! 3958: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_4c, dd_4d, dd_4e, dd_xx ! 3959: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_54, dd_55, dd_56, dd_xx ! 3960: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_5c, dd_5d, dd_5e, dd_xx ! 3961: dd dd_60, dd_61, dd_62, dd_63, dd_xx, dd_65, dd_66, dd_67 ! 3962: dd dd_68, dd_69, dd_6a, dd_6b, dd_6c, dd_xx, dd_6e, dd_6f ! 3963: dd dd_70, dd_71, dd_72, dd_73, dd_74, dd_75, dd_xx, dd_77 ! 3964: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_7c, dd_7d, dd_7e, dd_xx ! 3965: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_84, dd_85, dd_86, dd_xx ! 3966: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_8c, dd_8d, dd_8e, dd_xx ! 3967: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_94, dd_95, dd_96, dd_xx ! 3968: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_9c, dd_9d, dd_9e, dd_xx ! 3969: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_a4, dd_a5, dd_a6, dd_xx ! 3970: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_ac, dd_ad, dd_ae, dd_xx ! 3971: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_b4, dd_b5, dd_b6, dd_xx ! 3972: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_bc, dd_bd, dd_be, dd_xx ! 3973: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3974: dd dd_xx, dd_xx, dd_xx, dd_cb, dd_xx, dd_xx, dd_xx, dd_xx ! 3975: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3976: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3977: dd dd_xx, dd_e1, dd_xx, dd_e3, dd_xx, dd_e5, dd_xx, dd_xx ! 3978: dd dd_xx, dd_e9, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3979: dd dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3980: dd dd_xx, dd_f9, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx, dd_xx ! 3981: ! 3982: FDTable: ! 3983: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 3984: dd fd_xx, fd_09, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 3985: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 3986: dd fd_xx, fd_19, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 3987: dd fd_xx, fd_21, fd_22, fd_23, fd_24, fd_25, fd_26, fd_xx ! 3988: dd fd_xx, fd_29, fd_2a, fd_2b, fd_2c, fd_2d, fd_2e, fd_xx ! 3989: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_34, fd_35, fd_36, fd_xx ! 3990: dd fd_xx, fd_39, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 3991: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_44, fd_45, fd_46, fd_xx ! 3992: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_4c, fd_4d, fd_4e, fd_xx ! 3993: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_54, fd_55, fd_56, fd_xx ! 3994: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_5c, fd_5d, fd_5e, fd_xx ! 3995: dd fd_60, fd_61, fd_62, fd_63, fd_xx, fd_65, fd_66, fd_67 ! 3996: dd fd_68, fd_69, fd_6a, fd_6b, fd_6c, fd_xx, fd_6e, fd_6f ! 3997: dd fd_70, fd_71, fd_72, fd_73, fd_74, fd_75, fd_xx, fd_77 ! 3998: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_7c, fd_7d, fd_7e, fd_xx ! 3999: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_84, fd_85, fd_86, fd_xx ! 4000: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_8c, fd_8d, fd_8e, fd_xx ! 4001: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_94, fd_95, fd_96, fd_xx ! 4002: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_9c, fd_9d, fd_9e, fd_xx ! 4003: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_a4, fd_a5, fd_a6, fd_xx ! 4004: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_ac, fd_ad, fd_ae, fd_xx ! 4005: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_b4, fd_b5, fd_b6, fd_xx ! 4006: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_bc, fd_bd, fd_be, fd_xx ! 4007: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 4008: dd fd_xx, fd_xx, fd_xx, fd_cb, fd_xx, fd_xx, fd_xx, fd_xx ! 4009: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 4010: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 4011: dd fd_xx, fd_e1, fd_xx, fd_e3, fd_xx, fd_e5, fd_xx, fd_xx ! 4012: dd fd_xx, fd_e9, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 4013: dd fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 4014: dd fd_xx, fd_f9, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx, fd_xx ! 4015: ! 4016: DDCBTable: ! 4017: dd ddcb_00, ddcb_01, ddcb_02, ddcb_03, ddcb_04, ddcb_05, ddcb_06, ddcb_07 ! 4018: dd ddcb_08, ddcb_09, ddcb_0a, ddcb_0b, ddcb_0c, ddcb_0d, ddcb_0e, ddcb_0f ! 4019: dd ddcb_10, ddcb_11, ddcb_12, ddcb_13, ddcb_14, ddcb_15, ddcb_16, ddcb_17 ! 4020: dd ddcb_18, ddcb_19, ddcb_1a, ddcb_1b, ddcb_1c, ddcb_1d, ddcb_1e, ddcb_1f ! 4021: dd ddcb_20, ddcb_21, ddcb_22, ddcb_23, ddcb_24, ddcb_25, ddcb_26, ddcb_27 ! 4022: dd ddcb_28, ddcb_29, ddcb_2a, ddcb_2b, ddcb_2c, ddcb_2d, ddcb_2e, ddcb_2f ! 4023: dd ddcb_30, ddcb_31, ddcb_32, ddcb_33, ddcb_34, ddcb_35, ddcb_36, ddcb_37 ! 4024: dd ddcb_38, ddcb_39, ddcb_3a, ddcb_3b, ddcb_3c, ddcb_3d, ddcb_3e, ddcb_3f ! 4025: dd ddcb_40, ddcb_41, ddcb_42, ddcb_43, ddcb_44, ddcb_45, ddcb_46, ddcb_47 ! 4026: dd ddcb_48, ddcb_49, ddcb_4a, ddcb_4b, ddcb_4c, ddcb_4d, ddcb_4e, ddcb_4f ! 4027: dd ddcb_50, ddcb_51, ddcb_52, ddcb_53, ddcb_54, ddcb_55, ddcb_56, ddcb_57 ! 4028: dd ddcb_58, ddcb_59, ddcb_5a, ddcb_5b, ddcb_5c, ddcb_5d, ddcb_5e, ddcb_5f ! 4029: dd ddcb_60, ddcb_61, ddcb_62, ddcb_63, ddcb_64, ddcb_65, ddcb_66, ddcb_67 ! 4030: dd ddcb_68, ddcb_69, ddcb_6a, ddcb_6b, ddcb_6c, ddcb_6d, ddcb_6e, ddcb_6f ! 4031: dd ddcb_70, ddcb_71, ddcb_72, ddcb_73, ddcb_74, ddcb_75, ddcb_76, ddcb_77 ! 4032: dd ddcb_78, ddcb_79, ddcb_7a, ddcb_7b, ddcb_7c, ddcb_7d, ddcb_7e, ddcb_7f ! 4033: dd ddcb_80, ddcb_81, ddcb_82, ddcb_83, ddcb_84, ddcb_85, ddcb_86, ddcb_87 ! 4034: dd ddcb_88, ddcb_89, ddcb_8a, ddcb_8b, ddcb_8c, ddcb_8d, ddcb_8e, ddcb_8f ! 4035: dd ddcb_90, ddcb_91, ddcb_92, ddcb_93, ddcb_94, ddcb_95, ddcb_96, ddcb_97 ! 4036: dd ddcb_98, ddcb_99, ddcb_9a, ddcb_9b, ddcb_9c, ddcb_9d, ddcb_9e, ddcb_9f ! 4037: dd ddcb_a0, ddcb_a1, ddcb_a2, ddcb_a3, ddcb_a4, ddcb_a5, ddcb_a6, ddcb_a7 ! 4038: dd ddcb_a8, ddcb_a9, ddcb_aa, ddcb_ab, ddcb_ac, ddcb_ad, ddcb_ae, ddcb_af ! 4039: dd ddcb_b0, ddcb_b1, ddcb_b2, ddcb_b3, ddcb_b4, ddcb_b5, ddcb_b6, ddcb_b7 ! 4040: dd ddcb_b8, ddcb_b9, ddcb_ba, ddcb_bb, ddcb_bc, ddcb_bd, ddcb_be, ddcb_bf ! 4041: dd ddcb_c0, ddcb_c1, ddcb_c2, ddcb_c3, ddcb_c4, ddcb_c5, ddcb_c6, ddcb_c7 ! 4042: dd ddcb_c8, ddcb_c9, ddcb_ca, ddcb_cb, ddcb_cc, ddcb_cd, ddcb_ce, ddcb_cf ! 4043: dd ddcb_d0, ddcb_d1, ddcb_d2, ddcb_d3, ddcb_d4, ddcb_d5, ddcb_d6, ddcb_d7 ! 4044: dd ddcb_d8, ddcb_d9, ddcb_da, ddcb_db, ddcb_dc, ddcb_dd, ddcb_de, ddcb_df ! 4045: dd ddcb_e0, ddcb_e1, ddcb_e2, ddcb_e3, ddcb_e4, ddcb_e5, ddcb_e6, ddcb_e7 ! 4046: dd ddcb_e8, ddcb_e9, ddcb_ea, ddcb_eb, ddcb_ec, ddcb_ed, ddcb_ee, ddcb_ef ! 4047: dd ddcb_f0, ddcb_f1, ddcb_f2, ddcb_f3, ddcb_f4, ddcb_f5, ddcb_f6, ddcb_f7 ! 4048: dd ddcb_f8, ddcb_f9, ddcb_fa, ddcb_fb, ddcb_fc, ddcb_fd, ddcb_fe, ddcb_ff ! 4049: ! 4050: ! 4051: ;----------------------------------------------------------------------------; ! 4052: ; flag tables ('borrowed' from MAZE, by Ishmair) ! 4053: INC_Table: ! 4054: DB 0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,16,0,0,0,0 ! 4055: DB 0,0,0,8,8,8,8,8,8,8,8,48,32,32,32,32,32,32,32,40 ! 4056: DB 40,40,40,40,40,40,40,48,32,32,32,32,32,32,32,40,40,40,40,40 ! 4057: DB 40,40,40,16,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,16 ! 4058: DB 0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,48,32,32,32,32 ! 4059: DB 32,32,32,40,40,40,40,40,40,40,40,48,32,32,32,32,32,32,32,40 ! 4060: DB 40,40,40,40,40,40,40,148,128,128,128,128,128,128,128,136,136,136,136,136 ! 4061: DB 136,136,136,144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,176 ! 4062: DB 160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,176,160,160,160,160 ! 4063: DB 160,160,160,168,168,168,168,168,168,168,168,144,128,128,128,128,128,128,128,136 ! 4064: DB 136,136,136,136,136,136,136,144,128,128,128,128,128,128,128,136,136,136,136,136 ! 4065: DB 136,136,136,176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,176 ! 4066: DB 160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,80 ! 4067: ! 4068: DEC_Table: ! 4069: DB 186,66,2,2,2,2,2,2,2,10,10,10,10,10,10,10,26,2,2,2 ! 4070: DB 2,2,2,2,2,10,10,10,10,10,10,10,26,34,34,34,34,34,34,34 ! 4071: DB 34,42,42,42,42,42,42,42,58,34,34,34,34,34,34,34,34,42,42,42 ! 4072: DB 42,42,42,42,58,2,2,2,2,2,2,2,2,10,10,10,10,10,10,10 ! 4073: DB 26,2,2,2,2,2,2,2,2,10,10,10,10,10,10,10,26,34,34,34 ! 4074: DB 34,34,34,34,34,42,42,42,42,42,42,42,58,34,34,34,34,34,34,34 ! 4075: DB 34,42,42,42,42,42,42,42,62,130,130,130,130,130,130,130,130,138,138,138 ! 4076: DB 138,138,138,138,154,130,130,130,130,130,130,130,130,138,138,138,138,138,138,138 ! 4077: DB 154,162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,162,162,162 ! 4078: DB 162,162,162,162,162,170,170,170,170,170,170,170,186,130,130,130,130,130,130,130 ! 4079: DB 130,138,138,138,138,138,138,138,154,130,130,130,130,130,130,130,130,138,138,138 ! 4080: DB 138,138,138,138,154,162,162,162,162,162,162,162,162,170,170,170,170,170,170,170 ! 4081: DB 186,162,162,162,162,162,162,162,162,170,170,170,170,170,170,170 ! 4082: ! 4083: ; DAA table ('borrowed' from Z80Emul, by unknown) ! 4084: DAA_Table: ! 4085: DW 04400h, 00001h, 00002h, 00403h, 00004h, 00405h, 00406h, 00007h ! 4086: DW 00808h, 00C09h, 01010h, 01411h, 01412h, 01013h, 01414h, 01015h ! 4087: DW 00010h, 00411h, 00412h, 00013h, 00414h, 00015h, 00016h, 00417h ! 4088: DW 00C18h, 00819h, 03020h, 03421h, 03422h, 03023h, 03424h, 03025h ! 4089: DW 02020h, 02421h, 02422h, 02023h, 02424h, 02025h, 02026h, 02427h ! 4090: DW 02C28h, 02829h, 03430h, 03031h, 03032h, 03433h, 03034h, 03435h ! 4091: DW 02430h, 02031h, 02032h, 02433h, 02034h, 02435h, 02436h, 02037h ! 4092: DW 02838h, 02C39h, 01040h, 01441h, 01442h, 01043h, 01444h, 01045h ! 4093: DW 00040h, 00441h, 00442h, 00043h, 00444h, 00045h, 00046h, 00447h ! 4094: DW 00C48h, 00849h, 01450h, 01051h, 01052h, 01453h, 01054h, 01455h ! 4095: DW 00450h, 00051h, 00052h, 00453h, 00054h, 00455h, 00456h, 00057h ! 4096: DW 00858h, 00C59h, 03460h, 03061h, 03062h, 03463h, 03064h, 03465h ! 4097: DW 02460h, 02061h, 02062h, 02463h, 02064h, 02465h, 02466h, 02067h ! 4098: DW 02868h, 02C69h, 03070h, 03471h, 03472h, 03073h, 03474h, 03075h ! 4099: DW 02070h, 02471h, 02472h, 02073h, 02474h, 02075h, 02076h, 02477h ! 4100: DW 02C78h, 02879h, 09080h, 09481h, 09482h, 09083h, 09484h, 09085h ! 4101: DW 08080h, 08481h, 08482h, 08083h, 08484h, 08085h, 08086h, 08487h ! 4102: DW 08C88h, 08889h, 09490h, 09091h, 09092h, 09493h, 09094h, 09495h ! 4103: DW 08490h, 08091h, 08092h, 08493h, 08094h, 08495h, 08496h, 08097h ! 4104: DW 08898h, 08C99h, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h ! 4105: DW 04500h, 00101h, 00102h, 00503h, 00104h, 00505h, 00506h, 00107h ! 4106: DW 00908h, 00D09h, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h ! 4107: DW 00110h, 00511h, 00512h, 00113h, 00514h, 00115h, 00116h, 00517h ! 4108: DW 00D18h, 00919h, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h ! 4109: DW 02120h, 02521h, 02522h, 02123h, 02524h, 02125h, 02126h, 02527h ! 4110: DW 02D28h, 02929h, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h ! 4111: DW 02530h, 02131h, 02132h, 02533h, 02134h, 02535h, 02536h, 02137h ! 4112: DW 02938h, 02D39h, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h ! 4113: DW 00140h, 00541h, 00542h, 00143h, 00544h, 00145h, 00146h, 00547h ! 4114: DW 00D48h, 00949h, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h ! 4115: DW 00550h, 00151h, 00152h, 00553h, 00154h, 00555h, 00556h, 00157h ! 4116: DW 00958h, 00D59h, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h ! 4117: DW 02560h, 02161h, 02162h, 02563h, 02164h, 02565h, 02566h, 02167h ! 4118: DW 02968h, 02D69h, 03170h, 03571h, 03572h, 03173h, 03574h, 03175h ! 4119: DW 02170h, 02571h, 02572h, 02173h, 02574h, 02175h, 02176h, 02577h ! 4120: DW 02D78h, 02979h, 09180h, 09581h, 09582h, 09183h, 09584h, 09185h ! 4121: DW 08180h, 08581h, 08582h, 08183h, 08584h, 08185h, 08186h, 08587h ! 4122: DW 08D88h, 08989h, 09590h, 09191h, 09192h, 09593h, 09194h, 09595h ! 4123: DW 08590h, 08191h, 08192h, 08593h, 08194h, 08595h, 08596h, 08197h ! 4124: DW 08998h, 08D99h, 0B5A0h, 0B1A1h, 0B1A2h, 0B5A3h, 0B1A4h, 0B5A5h ! 4125: DW 0A5A0h, 0A1A1h, 0A1A2h, 0A5A3h, 0A1A4h, 0A5A5h, 0A5A6h, 0A1A7h ! 4126: DW 0A9A8h, 0ADA9h, 0B1B0h, 0B5B1h, 0B5B2h, 0B1B3h, 0B5B4h, 0B1B5h ! 4127: DW 0A1B0h, 0A5B1h, 0A5B2h, 0A1B3h, 0A5B4h, 0A1B5h, 0A1B6h, 0A5B7h ! 4128: DW 0ADB8h, 0A9B9h, 095C0h, 091C1h, 091C2h, 095C3h, 091C4h, 095C5h ! 4129: DW 085C0h, 081C1h, 081C2h, 085C3h, 081C4h, 085C5h, 085C6h, 081C7h ! 4130: DW 089C8h, 08DC9h, 091D0h, 095D1h, 095D2h, 091D3h, 095D4h, 091D5h ! 4131: DW 081D0h, 085D1h, 085D2h, 081D3h, 085D4h, 081D5h, 081D6h, 085D7h ! 4132: DW 08DD8h, 089D9h, 0B1E0h, 0B5E1h, 0B5E2h, 0B1E3h, 0B5E4h, 0B1E5h ! 4133: DW 0A1E0h, 0A5E1h, 0A5E2h, 0A1E3h, 0A5E4h, 0A1E5h, 0A1E6h, 0A5E7h ! 4134: DW 0ADE8h, 0A9E9h, 0B5F0h, 0B1F1h, 0B1F2h, 0B5F3h, 0B1F4h, 0B5F5h ! 4135: DW 0A5F0h, 0A1F1h, 0A1F2h, 0A5F3h, 0A1F4h, 0A5F5h, 0A5F6h, 0A1F7h ! 4136: DW 0A9F8h, 0ADF9h, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h ! 4137: DW 04500h, 00101h, 00102h, 00503h, 00104h, 00505h, 00506h, 00107h ! 4138: DW 00908h, 00D09h, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h ! 4139: DW 00110h, 00511h, 00512h, 00113h, 00514h, 00115h, 00116h, 00517h ! 4140: DW 00D18h, 00919h, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h ! 4141: DW 02120h, 02521h, 02522h, 02123h, 02524h, 02125h, 02126h, 02527h ! 4142: DW 02D28h, 02929h, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h ! 4143: DW 02530h, 02131h, 02132h, 02533h, 02134h, 02535h, 02536h, 02137h ! 4144: DW 02938h, 02D39h, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h ! 4145: DW 00140h, 00541h, 00542h, 00143h, 00544h, 00145h, 00146h, 00547h ! 4146: DW 00D48h, 00949h, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h ! 4147: DW 00550h, 00151h, 00152h, 00553h, 00154h, 00555h, 00556h, 00157h ! 4148: DW 00958h, 00D59h, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h ! 4149: DW 04600h, 00201h, 00202h, 00603h, 00204h, 00605h, 00606h, 00207h ! 4150: DW 00A08h, 00E09h, 00204h, 00605h, 00606h, 00207h, 00A08h, 00E09h ! 4151: DW 00210h, 00611h, 00612h, 00213h, 00614h, 00215h, 00216h, 00617h ! 4152: DW 00E18h, 00A19h, 00614h, 00215h, 00216h, 00617h, 00E18h, 00A19h ! 4153: DW 02220h, 02621h, 02622h, 02223h, 02624h, 02225h, 02226h, 02627h ! 4154: DW 02E28h, 02A29h, 02624h, 02225h, 02226h, 02627h, 02E28h, 02A29h ! 4155: DW 02630h, 02231h, 02232h, 02633h, 02234h, 02635h, 02636h, 02237h ! 4156: DW 02A38h, 02E39h, 02234h, 02635h, 02636h, 02237h, 02A38h, 02E39h ! 4157: DW 00240h, 00641h, 00642h, 00243h, 00644h, 00245h, 00246h, 00647h ! 4158: DW 00E48h, 00A49h, 00644h, 00245h, 00246h, 00647h, 00E48h, 00A49h ! 4159: DW 00650h, 00251h, 00252h, 00653h, 00254h, 00655h, 00656h, 00257h ! 4160: DW 00A58h, 00E59h, 00254h, 00655h, 00656h, 00257h, 00A58h, 00E59h ! 4161: DW 02660h, 02261h, 02262h, 02663h, 02264h, 02665h, 02666h, 02267h ! 4162: DW 02A68h, 02E69h, 02264h, 02665h, 02666h, 02267h, 02A68h, 02E69h ! 4163: DW 02270h, 02671h, 02672h, 02273h, 02674h, 02275h, 02276h, 02677h ! 4164: DW 02E78h, 02A79h, 02674h, 02275h, 02276h, 02677h, 02E78h, 02A79h ! 4165: DW 08280h, 08681h, 08682h, 08283h, 08684h, 08285h, 08286h, 08687h ! 4166: DW 08E88h, 08A89h, 08684h, 08285h, 08286h, 08687h, 08E88h, 08A89h ! 4167: DW 08690h, 08291h, 08292h, 08693h, 08294h, 08695h, 08696h, 08297h ! 4168: DW 08A98h, 08E99h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h ! 4169: DW 00340h, 00741h, 00742h, 00343h, 00744h, 00345h, 00346h, 00747h ! 4170: DW 00F48h, 00B49h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h ! 4171: DW 00750h, 00351h, 00352h, 00753h, 00354h, 00755h, 00756h, 00357h ! 4172: DW 00B58h, 00F59h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h ! 4173: DW 02760h, 02361h, 02362h, 02763h, 02364h, 02765h, 02766h, 02367h ! 4174: DW 02B68h, 02F69h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h ! 4175: DW 02370h, 02771h, 02772h, 02373h, 02774h, 02375h, 02376h, 02777h ! 4176: DW 02F78h, 02B79h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h ! 4177: DW 08380h, 08781h, 08782h, 08383h, 08784h, 08385h, 08386h, 08787h ! 4178: DW 08F88h, 08B89h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h ! 4179: DW 08790h, 08391h, 08392h, 08793h, 08394h, 08795h, 08796h, 08397h ! 4180: DW 08B98h, 08F99h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h ! 4181: DW 0A7A0h, 0A3A1h, 0A3A2h, 0A7A3h, 0A3A4h, 0A7A5h, 0A7A6h, 0A3A7h ! 4182: DW 0ABA8h, 0AFA9h, 0A3A4h, 0A7A5h, 0A7A6h, 0A3A7h, 0ABA8h, 0AFA9h ! 4183: DW 0A3B0h, 0A7B1h, 0A7B2h, 0A3B3h, 0A7B4h, 0A3B5h, 0A3B6h, 0A7B7h ! 4184: DW 0AFB8h, 0ABB9h, 0A7B4h, 0A3B5h, 0A3B6h, 0A7B7h, 0AFB8h, 0ABB9h ! 4185: DW 087C0h, 083C1h, 083C2h, 087C3h, 083C4h, 087C5h, 087C6h, 083C7h ! 4186: DW 08BC8h, 08FC9h, 083C4h, 087C5h, 087C6h, 083C7h, 08BC8h, 08FC9h ! 4187: DW 083D0h, 087D1h, 087D2h, 083D3h, 087D4h, 083D5h, 083D6h, 087D7h ! 4188: DW 08FD8h, 08BD9h, 087D4h, 083D5h, 083D6h, 087D7h, 08FD8h, 08BD9h ! 4189: DW 0A3E0h, 0A7E1h, 0A7E2h, 0A3E3h, 0A7E4h, 0A3E5h, 0A3E6h, 0A7E7h ! 4190: DW 0AFE8h, 0ABE9h, 0A7E4h, 0A3E5h, 0A3E6h, 0A7E7h, 0AFE8h, 0ABE9h ! 4191: DW 0A7F0h, 0A3F1h, 0A3F2h, 0A7F3h, 0A3F4h, 0A7F5h, 0A7F6h, 0A3F7h ! 4192: DW 0ABF8h, 0AFF9h, 0A3F4h, 0A7F5h, 0A7F6h, 0A3F7h, 0ABF8h, 0AFF9h ! 4193: DW 04700h, 00301h, 00302h, 00703h, 00304h, 00705h, 00706h, 00307h ! 4194: DW 00B08h, 00F09h, 00304h, 00705h, 00706h, 00307h, 00B08h, 00F09h ! 4195: DW 00310h, 00711h, 00712h, 00313h, 00714h, 00315h, 00316h, 00717h ! 4196: DW 00F18h, 00B19h, 00714h, 00315h, 00316h, 00717h, 00F18h, 00B19h ! 4197: DW 02320h, 02721h, 02722h, 02323h, 02724h, 02325h, 02326h, 02727h ! 4198: DW 02F28h, 02B29h, 02724h, 02325h, 02326h, 02727h, 02F28h, 02B29h ! 4199: DW 02730h, 02331h, 02332h, 02733h, 02334h, 02735h, 02736h, 02337h ! 4200: DW 02B38h, 02F39h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h ! 4201: DW 00340h, 00741h, 00742h, 00343h, 00744h, 00345h, 00346h, 00747h ! 4202: DW 00F48h, 00B49h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h ! 4203: DW 00750h, 00351h, 00352h, 00753h, 00354h, 00755h, 00756h, 00357h ! 4204: DW 00B58h, 00F59h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h ! 4205: DW 02760h, 02361h, 02362h, 02763h, 02364h, 02765h, 02766h, 02367h ! 4206: DW 02B68h, 02F69h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h ! 4207: DW 02370h, 02771h, 02772h, 02373h, 02774h, 02375h, 02376h, 02777h ! 4208: DW 02F78h, 02B79h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h ! 4209: DW 08380h, 08781h, 08782h, 08383h, 08784h, 08385h, 08386h, 08787h ! 4210: DW 08F88h, 08B89h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h ! 4211: DW 08790h, 08391h, 08392h, 08793h, 08394h, 08795h, 08796h, 08397h ! 4212: DW 08B98h, 08F99h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h ! 4213: DW 00406h, 00007h, 00808h, 00C09h, 00C0Ah, 0080Bh, 00C0Ch, 0080Dh ! 4214: DW 0080Eh, 00C0Fh, 01010h, 01411h, 01412h, 01013h, 01414h, 01015h ! 4215: DW 00016h, 00417h, 00C18h, 00819h, 0081Ah, 00C1Bh, 0081Ch, 00C1Dh ! 4216: DW 00C1Eh, 0081Fh, 03020h, 03421h, 03422h, 03023h, 03424h, 03025h ! 4217: DW 02026h, 02427h, 02C28h, 02829h, 0282Ah, 02C2Bh, 0282Ch, 02C2Dh ! 4218: DW 02C2Eh, 0282Fh, 03430h, 03031h, 03032h, 03433h, 03034h, 03435h ! 4219: DW 02436h, 02037h, 02838h, 02C39h, 02C3Ah, 0283Bh, 02C3Ch, 0283Dh ! 4220: DW 0283Eh, 02C3Fh, 01040h, 01441h, 01442h, 01043h, 01444h, 01045h ! 4221: DW 00046h, 00447h, 00C48h, 00849h, 0084Ah, 00C4Bh, 0084Ch, 00C4Dh ! 4222: DW 00C4Eh, 0084Fh, 01450h, 01051h, 01052h, 01453h, 01054h, 01455h ! 4223: DW 00456h, 00057h, 00858h, 00C59h, 00C5Ah, 0085Bh, 00C5Ch, 0085Dh ! 4224: DW 0085Eh, 00C5Fh, 03460h, 03061h, 03062h, 03463h, 03064h, 03465h ! 4225: DW 02466h, 02067h, 02868h, 02C69h, 02C6Ah, 0286Bh, 02C6Ch, 0286Dh ! 4226: DW 0286Eh, 02C6Fh, 03070h, 03471h, 03472h, 03073h, 03474h, 03075h ! 4227: DW 02076h, 02477h, 02C78h, 02879h, 0287Ah, 02C7Bh, 0287Ch, 02C7Dh ! 4228: DW 02C7Eh, 0287Fh, 09080h, 09481h, 09482h, 09083h, 09484h, 09085h ! 4229: DW 08086h, 08487h, 08C88h, 08889h, 0888Ah, 08C8Bh, 0888Ch, 08C8Dh ! 4230: DW 08C8Eh, 0888Fh, 09490h, 09091h, 09092h, 09493h, 09094h, 09495h ! 4231: DW 08496h, 08097h, 08898h, 08C99h, 08C9Ah, 0889Bh, 08C9Ch, 0889Dh ! 4232: DW 0889Eh, 08C9Fh, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h ! 4233: DW 00506h, 00107h, 00908h, 00D09h, 00D0Ah, 0090Bh, 00D0Ch, 0090Dh ! 4234: DW 0090Eh, 00D0Fh, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h ! 4235: DW 00116h, 00517h, 00D18h, 00919h, 0091Ah, 00D1Bh, 0091Ch, 00D1Dh ! 4236: DW 00D1Eh, 0091Fh, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h ! 4237: DW 02126h, 02527h, 02D28h, 02929h, 0292Ah, 02D2Bh, 0292Ch, 02D2Dh ! 4238: DW 02D2Eh, 0292Fh, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h ! 4239: DW 02536h, 02137h, 02938h, 02D39h, 02D3Ah, 0293Bh, 02D3Ch, 0293Dh ! 4240: DW 0293Eh, 02D3Fh, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h ! 4241: DW 00146h, 00547h, 00D48h, 00949h, 0094Ah, 00D4Bh, 0094Ch, 00D4Dh ! 4242: DW 00D4Eh, 0094Fh, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h ! 4243: DW 00556h, 00157h, 00958h, 00D59h, 00D5Ah, 0095Bh, 00D5Ch, 0095Dh ! 4244: DW 0095Eh, 00D5Fh, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h ! 4245: DW 02566h, 02167h, 02968h, 02D69h, 02D6Ah, 0296Bh, 02D6Ch, 0296Dh ! 4246: DW 0296Eh, 02D6Fh, 03170h, 03571h, 03572h, 03173h, 03574h, 03175h ! 4247: DW 02176h, 02577h, 02D78h, 02979h, 0297Ah, 02D7Bh, 0297Ch, 02D7Dh ! 4248: DW 02D7Eh, 0297Fh, 09180h, 09581h, 09582h, 09183h, 09584h, 09185h ! 4249: DW 08186h, 08587h, 08D88h, 08989h, 0898Ah, 08D8Bh, 0898Ch, 08D8Dh ! 4250: DW 08D8Eh, 0898Fh, 09590h, 09191h, 09192h, 09593h, 09194h, 09595h ! 4251: DW 08596h, 08197h, 08998h, 08D99h, 08D9Ah, 0899Bh, 08D9Ch, 0899Dh ! 4252: DW 0899Eh, 08D9Fh, 0B5A0h, 0B1A1h, 0B1A2h, 0B5A3h, 0B1A4h, 0B5A5h ! 4253: DW 0A5A6h, 0A1A7h, 0A9A8h, 0ADA9h, 0ADAAh, 0A9ABh, 0ADACh, 0A9ADh ! 4254: DW 0A9AEh, 0ADAFh, 0B1B0h, 0B5B1h, 0B5B2h, 0B1B3h, 0B5B4h, 0B1B5h ! 4255: DW 0A1B6h, 0A5B7h, 0ADB8h, 0A9B9h, 0A9BAh, 0ADBBh, 0A9BCh, 0ADBDh ! 4256: DW 0ADBEh, 0A9BFh, 095C0h, 091C1h, 091C2h, 095C3h, 091C4h, 095C5h ! 4257: DW 085C6h, 081C7h, 089C8h, 08DC9h, 08DCAh, 089CBh, 08DCCh, 089CDh ! 4258: DW 089CEh, 08DCFh, 091D0h, 095D1h, 095D2h, 091D3h, 095D4h, 091D5h ! 4259: DW 081D6h, 085D7h, 08DD8h, 089D9h, 089DAh, 08DDBh, 089DCh, 08DDDh ! 4260: DW 08DDEh, 089DFh, 0B1E0h, 0B5E1h, 0B5E2h, 0B1E3h, 0B5E4h, 0B1E5h ! 4261: DW 0A1E6h, 0A5E7h, 0ADE8h, 0A9E9h, 0A9EAh, 0ADEBh, 0A9ECh, 0ADEDh ! 4262: DW 0ADEEh, 0A9EFh, 0B5F0h, 0B1F1h, 0B1F2h, 0B5F3h, 0B1F4h, 0B5F5h ! 4263: DW 0A5F6h, 0A1F7h, 0A9F8h, 0ADF9h, 0ADFAh, 0A9FBh, 0ADFCh, 0A9FDh ! 4264: DW 0A9FEh, 0ADFFh, 05500h, 01101h, 01102h, 01503h, 01104h, 01505h ! 4265: DW 00506h, 00107h, 00908h, 00D09h, 00D0Ah, 0090Bh, 00D0Ch, 0090Dh ! 4266: DW 0090Eh, 00D0Fh, 01110h, 01511h, 01512h, 01113h, 01514h, 01115h ! 4267: DW 00116h, 00517h, 00D18h, 00919h, 0091Ah, 00D1Bh, 0091Ch, 00D1Dh ! 4268: DW 00D1Eh, 0091Fh, 03120h, 03521h, 03522h, 03123h, 03524h, 03125h ! 4269: DW 02126h, 02527h, 02D28h, 02929h, 0292Ah, 02D2Bh, 0292Ch, 02D2Dh ! 4270: DW 02D2Eh, 0292Fh, 03530h, 03131h, 03132h, 03533h, 03134h, 03535h ! 4271: DW 02536h, 02137h, 02938h, 02D39h, 02D3Ah, 0293Bh, 02D3Ch, 0293Dh ! 4272: DW 0293Eh, 02D3Fh, 01140h, 01541h, 01542h, 01143h, 01544h, 01145h ! 4273: DW 00146h, 00547h, 00D48h, 00949h, 0094Ah, 00D4Bh, 0094Ch, 00D4Dh ! 4274: DW 00D4Eh, 0094Fh, 01550h, 01151h, 01152h, 01553h, 01154h, 01555h ! 4275: DW 00556h, 00157h, 00958h, 00D59h, 00D5Ah, 0095Bh, 00D5Ch, 0095Dh ! 4276: DW 0095Eh, 00D5Fh, 03560h, 03161h, 03162h, 03563h, 03164h, 03565h ! 4277: DW 0BEFAh, 0BAFBh, 0BEFCh, 0BAFDh, 0BAFEh, 0BEFFh, 04600h, 00201h ! 4278: DW 00202h, 00603h, 00204h, 00605h, 00606h, 00207h, 00A08h, 00E09h ! 4279: DW 01E0Ah, 01A0Bh, 01E0Ch, 01A0Dh, 01A0Eh, 01E0Fh, 00210h, 00611h ! 4280: DW 00612h, 00213h, 00614h, 00215h, 00216h, 00617h, 00E18h, 00A19h ! 4281: DW 01A1Ah, 01E1Bh, 01A1Ch, 01E1Dh, 01E1Eh, 01A1Fh, 02220h, 02621h ! 4282: DW 02622h, 02223h, 02624h, 02225h, 02226h, 02627h, 02E28h, 02A29h ! 4283: DW 03A2Ah, 03E2Bh, 03A2Ch, 03E2Dh, 03E2Eh, 03A2Fh, 02630h, 02231h ! 4284: DW 02232h, 02633h, 02234h, 02635h, 02636h, 02237h, 02A38h, 02E39h ! 4285: DW 03E3Ah, 03A3Bh, 03E3Ch, 03A3Dh, 03A3Eh, 03E3Fh, 00240h, 00641h ! 4286: DW 00642h, 00243h, 00644h, 00245h, 00246h, 00647h, 00E48h, 00A49h ! 4287: DW 01A4Ah, 01E4Bh, 01A4Ch, 01E4Dh, 01E4Eh, 01A4Fh, 00650h, 00251h ! 4288: DW 00252h, 00653h, 00254h, 00655h, 00656h, 00257h, 00A58h, 00E59h ! 4289: DW 01E5Ah, 01A5Bh, 01E5Ch, 01A5Dh, 01A5Eh, 01E5Fh, 02660h, 02261h ! 4290: DW 02262h, 02663h, 02264h, 02665h, 02666h, 02267h, 02A68h, 02E69h ! 4291: DW 03E6Ah, 03A6Bh, 03E6Ch, 03A6Dh, 03A6Eh, 03E6Fh, 02270h, 02671h ! 4292: DW 02672h, 02273h, 02674h, 02275h, 02276h, 02677h, 02E78h, 02A79h ! 4293: DW 03A7Ah, 03E7Bh, 03A7Ch, 03E7Dh, 03E7Eh, 03A7Fh, 08280h, 08681h ! 4294: DW 08682h, 08283h, 08684h, 08285h, 08286h, 08687h, 08E88h, 08A89h ! 4295: DW 09A8Ah, 09E8Bh, 09A8Ch, 09E8Dh, 09E8Eh, 09A8Fh, 08690h, 08291h ! 4296: DW 08292h, 08693h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h ! 4297: DW 03F3Ah, 03B3Bh, 03F3Ch, 03B3Dh, 03B3Eh, 03F3Fh, 00340h, 00741h ! 4298: DW 00742h, 00343h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h ! 4299: DW 01B4Ah, 01F4Bh, 01B4Ch, 01F4Dh, 01F4Eh, 01B4Fh, 00750h, 00351h ! 4300: DW 00352h, 00753h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h ! 4301: DW 01F5Ah, 01B5Bh, 01F5Ch, 01B5Dh, 01B5Eh, 01F5Fh, 02760h, 02361h ! 4302: DW 02362h, 02763h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h ! 4303: DW 03F6Ah, 03B6Bh, 03F6Ch, 03B6Dh, 03B6Eh, 03F6Fh, 02370h, 02771h ! 4304: DW 02772h, 02373h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h ! 4305: DW 03B7Ah, 03F7Bh, 03B7Ch, 03F7Dh, 03F7Eh, 03B7Fh, 08380h, 08781h ! 4306: DW 08782h, 08383h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h ! 4307: DW 09B8Ah, 09F8Bh, 09B8Ch, 09F8Dh, 09F8Eh, 09B8Fh, 08790h, 08391h ! 4308: DW 08392h, 08793h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h ! 4309: DW 09F9Ah, 09B9Bh, 09F9Ch, 09B9Dh, 09B9Eh, 09F9Fh, 0A7A0h, 0A3A1h ! 4310: DW 0A3A2h, 0A7A3h, 0A3A4h, 0A7A5h, 0A7A6h, 0A3A7h, 0ABA8h, 0AFA9h ! 4311: DW 0BFAAh, 0BBABh, 0BFACh, 0BBADh, 0BBAEh, 0BFAFh, 0A3B0h, 0A7B1h ! 4312: DW 0A7B2h, 0A3B3h, 0A7B4h, 0A3B5h, 0A3B6h, 0A7B7h, 0AFB8h, 0ABB9h ! 4313: DW 0BBBAh, 0BFBBh, 0BBBCh, 0BFBDh, 0BFBEh, 0BBBFh, 087C0h, 083C1h ! 4314: DW 083C2h, 087C3h, 083C4h, 087C5h, 087C6h, 083C7h, 08BC8h, 08FC9h ! 4315: DW 09FCAh, 09BCBh, 09FCCh, 09BCDh, 09BCEh, 09FCFh, 083D0h, 087D1h ! 4316: DW 087D2h, 083D3h, 087D4h, 083D5h, 083D6h, 087D7h, 08FD8h, 08BD9h ! 4317: DW 09BDAh, 09FDBh, 09BDCh, 09FDDh, 09FDEh, 09BDFh, 0A3E0h, 0A7E1h ! 4318: DW 0A7E2h, 0A3E3h, 0A7E4h, 0A3E5h, 0A3E6h, 0A7E7h, 0AFE8h, 0ABE9h ! 4319: DW 0BBEAh, 0BFEBh, 0BBECh, 0BFEDh, 0BFEEh, 0BBEFh, 0A7F0h, 0A3F1h ! 4320: DW 0A3F2h, 0A7F3h, 0A3F4h, 0A7F5h, 0A7F6h, 0A3F7h, 0ABF8h, 0AFF9h ! 4321: DW 0BFFAh, 0BBFBh, 0BFFCh, 0BBFDh, 0BBFEh, 0BFFFh, 04700h, 00301h ! 4322: DW 00302h, 00703h, 00304h, 00705h, 00706h, 00307h, 00B08h, 00F09h ! 4323: DW 01F0Ah, 01B0Bh, 01F0Ch, 01B0Dh, 01B0Eh, 01F0Fh, 00310h, 00711h ! 4324: DW 00712h, 00313h, 00714h, 00315h, 00316h, 00717h, 00F18h, 00B19h ! 4325: DW 01B1Ah, 01F1Bh, 01B1Ch, 01F1Dh, 01F1Eh, 01B1Fh, 02320h, 02721h ! 4326: DW 02722h, 02323h, 02724h, 02325h, 02326h, 02727h, 02F28h, 02B29h ! 4327: DW 03B2Ah, 03F2Bh, 03B2Ch, 03F2Dh, 03F2Eh, 03B2Fh, 02730h, 02331h ! 4328: DW 02332h, 02733h, 02334h, 02735h, 02736h, 02337h, 02B38h, 02F39h ! 4329: DW 03F3Ah, 03B3Bh, 03F3Ch, 03B3Dh, 03B3Eh, 03F3Fh, 00340h, 00741h ! 4330: DW 00742h, 00343h, 00744h, 00345h, 00346h, 00747h, 00F48h, 00B49h ! 4331: DW 01B4Ah, 01F4Bh, 01B4Ch, 01F4Dh, 01F4Eh, 01B4Fh, 00750h, 00351h ! 4332: DW 00352h, 00753h, 00354h, 00755h, 00756h, 00357h, 00B58h, 00F59h ! 4333: DW 01F5Ah, 01B5Bh, 01F5Ch, 01B5Dh, 01B5Eh, 01F5Fh, 02760h, 02361h ! 4334: DW 02362h, 02763h, 02364h, 02765h, 02766h, 02367h, 02B68h, 02F69h ! 4335: DW 03F6Ah, 03B6Bh, 03F6Ch, 03B6Dh, 03B6Eh, 03F6Fh, 02370h, 02771h ! 4336: DW 02772h, 02373h, 02774h, 02375h, 02376h, 02777h, 02F78h, 02B79h ! 4337: DW 03B7Ah, 03F7Bh, 03B7Ch, 03F7Dh, 03F7Eh, 03B7Fh, 08380h, 08781h ! 4338: DW 08782h, 08383h, 08784h, 08385h, 08386h, 08787h, 08F88h, 08B89h ! 4339: DW 09B8Ah, 09F8Bh, 09B8Ch, 09F8Dh, 09F8Eh, 09B8Fh, 08790h, 08391h ! 4340: DW 08392h, 08793h, 08394h, 08795h, 08796h, 08397h, 08B98h, 08F99h ! 4341: ! 4342: NEG_Table: ! 4343: DB 0,66,255,187,254,187,253,187,252,187,251,187,250,187,249,187,248,187,247,179 ! 4344: DB 246,179,245,179,244,179,243,179,242,179,241,179,240,163,239,187,238,187,237,187 ! 4345: DB 236,187,235,187,234,187,233,187,232,187,231,179,230,179,229,179,228,179,227,179 ! 4346: DB 226,179,225,179,224,163,223,155,222,155,221,155,220,155,219,155,218,155,217,155 ! 4347: DB 216,155,215,147,214,147,213,147,212,147,211,147,210,147,209,147,208,131,207,155 ! 4348: DB 206,155,205,155,204,155,203,155,202,155,201,155,200,155,199,147,198,147,197,147 ! 4349: DB 196,147,195,147,194,147,193,147,192,131,191,187,190,187,189,187,188,187,187,187 ! 4350: DB 186,187,185,187,184,187,183,179,182,179,181,179,180,179,179,179,178,179,177,179 ! 4351: DB 176,163,175,187,174,187,173,187,172,187,171,187,170,187,169,187,168,187,167,179 ! 4352: DB 166,179,165,179,164,179,163,179,162,179,161,179,160,163,159,155,158,155,157,155 ! 4353: DB 156,155,155,155,154,155,153,155,152,155,151,147,150,147,149,147,148,147,147,147 ! 4354: DB 146,147,145,147,144,131,143,155,142,155,141,155,140,155,139,155,138,155,137,155 ! 4355: DB 136,155,135,147,134,147,133,147,132,147,131,147,130,147,129,147,128,135,127,59 ! 4356: DB 126,59,125,59,124,59,123,59,122,59,121,59,120,59,119,51,118,51,117,51 ! 4357: DB 116,51,115,51,114,51,113,51,112,35,111,59,110,59,109,59,108,59,107,59 ! 4358: DB 106,59,105,59,104,59,103,51,102,51,101,51,100,51,99,51,98,51,97,51 ! 4359: DB 96,35,95,27,94,27,93,27,92,27,91,27,90,27,89,27,88,27,87,19 ! 4360: DB 86,19,85,19,84,19,83,19,82,19,81,19,80,3,79,27,78,27,77,27 ! 4361: DB 76,27,75,27,74,27,73,27,72,27,71,19,70,19,69,19,68,19,67,19 ! 4362: DB 66,19,65,19,64,3,63,59,62,59,61,59,60,59,59,59,58,59,57,59 ! 4363: DB 56,59,55,51,54,51,53,51,52,51,51,51,50,51,49,51,48,35,47,59 ! 4364: DB 46,59,45,59,44,59,43,59,42,59,41,59,40,59,39,51,38,51,37,51 ! 4365: DB 36,51,35,51,34,51,33,51,32,35,31,27,30,27,29,27,28,27,27,27 ! 4366: DB 26,27,25,27,24,27,23,19,22,19,21,19,20,19,19,19,18,19,17,19 ! 4367: DB 16,3,15,27,14,27,13,27,12,27,11,27,10,27,9,27,8,27,7,19 ! 4368: DB 6,19,5,19,4,19,3,19,2,19,1,19 ! 4369: ! 4370: ;- the end ------ (blimey) --------------------------------------------------;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.