Annotation of generator/raze/raze.asm, revision 1.1.1.1

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) --------------------------------------------------;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.