File:  [RetroPC.NET] / xmil / z80x / z80x_if.x86
Revision 1.9: download - view: text, annotated - select for diffs
Fri Feb 4 15:42:14 2005 JST (20 years, 8 months ago) by yui
Branches: MAIN
CVS tags: HEAD
RetroPC CVS restarting 2005/02/04 (T.Yui)


%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
	global	_z80x_step

	extern	_z80core
	extern	memfetch
	extern	memrd16_ecx_ax
	extern	memwr16_ecx_dx
	extern	_cycles_main
	extern	opcode_main

	extern	_z80dmap
	extern	_dma


				align	16
@z80x_interrupt@4:
				mov		edx, _z80core
				mov		al, [edx + R_Z80IFF]
				test	al, (1 << IFF_HALT)
				je		short .setintr
				inc		word [edx + R_Z80PC]
				and		al, ~(1 << IFF_HALT)
.setintr:		or		al, (1 << IFF_IFLAG)
				cmp		byte [edx + R_Z80IM], 1
				mov		[edx + R_Z80IFF], al
				je		short .im1
				jc		short .im0

.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

.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

.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	edx
				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
				test	byte [_dma], 1
				jne		short .dmalp
.lp:			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]
				mov		eax, [edi + z80core_t.remainclock]
				cmp		eax, byte 0
				jg		short .lp
.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
				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	edx
				call	dword [opcode_main + eax*4]
%if 0
				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]
%endif
				pop		edi
				pop		ebx
				jmp		_z80dmap

	ends


RetroPC.NET-CVS <cvs@retropc.net>