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

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

unix.superglobalmegacorp.com

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