--- xmil/z80x/z80x_if.x86 2004/08/11 12:08:17 1.5 +++ xmil/z80x/z80x_if.x86 2005/02/04 06:42:14 1.9 @@ -12,33 +12,31 @@ section .text global _z80x_step extern _z80core - extern _z80dmap extern memfetch extern memrd16_ecx_ax extern memwr16_ecx_dx extern _cycles_main extern opcode_main - - align 16 -_z80x_ableinterrupt: - test byte [_z80core + R_Z80IFF], ((1 << IFF_IFLAG) | (1 << IFF_IRQ) | (1 << IFF_NMI)) - setz al - ret + extern _z80dmap + extern _dma align 16 @z80x_interrupt@4: mov edx, _z80core - btr dword [edx + R_Z80IFF], IFF_HALT - jnc short .haltclr + mov al, [edx + R_Z80IFF] + test al, (1 << IFF_HALT) + je short .setintr inc word [edx + R_Z80PC] -.haltclr: or byte [edx + R_Z80IFF], ((1 << IFF_IRQ) | (1 << IFF_IFLAG)) + and al, ~(1 << IFF_HALT) +.setintr: or al, (1 << IFF_IFLAG) cmp byte [edx + R_Z80IM], 1 - je short int_im1 - jc short int_im0 + mov [edx + R_Z80IFF], al + je short .im1 + jc short .im0 -int_im2: mov ch, [edx + R_Z80I] +.im2: mov ch, [edx + R_Z80I] movzx ecx, cx call memrd16_ecx_ax sub word [edx + R_Z80SP], byte 2 @@ -47,7 +45,7 @@ int_im2: mov ch, [edx + R_Z80I] mov dx, ax jmp memwr16_ecx_dx -int_im1: Z80WORK byte 11 +.im1: Z80WORK byte 11 mov ax, [edx + R_Z80PC] mov word [edx + R_Z80PC], 0x38 sub word [edx + R_Z80SP], byte 2 @@ -55,19 +53,7 @@ int_im1: Z80WORK byte 11 mov dx, ax jmp memwr16_ecx_dx - - align 16 -@z80x_interrupt2@4: - mov edx, _z80core - btr dword [edx + R_Z80IFF], IFF_HALT - jnc short .haltclr - inc word [edx + R_Z80PC] -.haltclr: or byte [edx + R_Z80IFF], (1 << IFF_IFLAG) - cmp byte [edx + R_Z80IM], 1 - je short int_im1 - jnc short int_im2 - -int_im0: cmp cl, 0ddh +.im0: cmp cl, 0ddh je short .ed cmp cl, 0edh je short .ed @@ -104,6 +90,8 @@ _z80x_nonmaskedinterrupt: _z80x_execute push ebx push edi mov edi, _z80core + test byte [_dma], 1 + jne short .dmalp .lp: inc byte [edi + R_Z80R] movzx ecx, word [edi + R_Z80PC] inc word [edi + R_Z80PC] @@ -111,13 +99,25 @@ _z80x_execute push ebx movzx edx, byte [_cycles_main + eax] Z80WORK edx call dword [opcode_main + eax*4] - call _z80dmap mov eax, [edi + z80core_t.remainclock] cmp eax, byte 0 jg short .lp - pop edi +.ed: pop edi pop ebx ret +.dmalp: inc byte [edi + R_Z80R] + movzx ecx, word [edi + R_Z80PC] + inc word [edi + R_Z80PC] + call memfetch + movzx edx, byte [_cycles_main + eax] + Z80WORK edx + call dword [opcode_main + eax*4] + call _z80dmap + mov eax, [edi + z80core_t.remainclock] + cmp eax, byte 0 + jg short .dmalp + jmp short .ed + align 16 _z80x_step: push ebx