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