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

unix.superglobalmegacorp.com

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