%include '../z80x/z80x.inc'
%include '../z80x/z80x.mcr'
section .text
	global	_z80x_ableinterrupt
	global	@z80x_interrupt@4
	global	@z80x_interrupt2@4
	global	_z80x_nonmaskedinterrupt
	global	_z80x_execute
	extern	_z80core
	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
				align	16
@z80x_interrupt@4:
				mov		edx, _z80core
				btr		word [edx + R_Z80IFF], IFF_HALT
				jnc		short .haltclr
				inc		word [edx + R_Z80PC]
.haltclr:		or		byte [edx + R_Z80IFF], ((1 << IFF_IRQ) | (1 << IFF_IFLAG))
				cmp		byte [edx + R_Z80IM], 1
				je		short int_im1
				jc		short int_im0
int_im2:		mov		ch, [edx + R_Z80I]
				movzx	ecx, cx
				call	memrd16_ecx_ax
				sub		word [edx + R_Z80SP], byte 2
				xchg	ax, word [edx + R_Z80PC]
				movzx	ecx, word [edx + R_Z80SP]
				mov		dx, ax
				jmp		memwr16_ecx_dx
int_im1:		Z80WORK	byte 11
				mov		ax, [edx + R_Z80PC]
				mov		word [edx + R_Z80PC], 0x38
				sub		word [edx + R_Z80SP], byte 2
				movzx	ecx, word [edx + R_Z80SP]
				mov		dx, ax
				jmp		memwr16_ecx_dx
				align	16
@z80x_interrupt2@4:
				mov		edx, _z80core
				btr		word [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
				je		short .ed
				cmp		cl, 0edh
				je		short .ed
				cmp		cl, 0fdh
				je		short .ed
				push	ebx
				push	edi
				movzx	eax, cl
				mov		edi, edx
				movzx	edx, byte [_cycles_main + eax]
				Z80WORK	dx
				call	dword [opcode_main + eax*4]
				pop		edi
				pop		ebx
.ed:			ret
				align	16
_z80x_nonmaskedinterrupt:
				mov		eax, _z80core
				bts		word [eax + R_Z80IFF], IFF_NMI
				jc		short .cantnmi
				btr		word [eax + R_Z80IFF], IFF_HALT
				jnc		short .haltclr
				inc		word [eax + R_Z80PC]
.haltclr:		mov		dx, [eax + R_Z80PC]
				mov		word [eax + R_Z80PC], 66h
				sub		word [eax + R_Z80SP], byte 2
				movzx	ecx, word [eax + R_Z80SP]
				jmp		memwr16_ecx_dx
.cantnmi:		ret
				align	16
_z80x_execute:	push	ebx
				push	edi
				mov		edi, _z80core
				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	dx
				call	dword [opcode_main + eax*4]
				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	dx
				call	dword [opcode_main + eax*4]
				pop		edi
				pop		ebx
				ret
	ends
RetroPC.NET-CVS <cvs@retropc.net>