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

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