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


	.include	"./agb/ramptr.inc"
	.include	"../z80aadv/z80a.inc"
	.include	"../z80aadv/z80dma.inc"

	.global	z80dmap2
	.extern	iocore_inp
	.extern	fastioout
	.extern	ievent_setbit

	.section	.iwram.text
	.code	32
	.align	0

rDMA		.req	r4
rDMACA		.req	r8
rDMACB		.req	r9


z80dmap2:		ldr		r11, [rDMA, #(Z80CORE2DMA + DMA_FLAG)]
				tst		r11, #DMAF_WORKING
				moveq	pc, lr

				stmdb	sp!, {r8, r9, lr}

				ldr		rDMACA, [rDMA, #(Z80CORE2DMA + DMA_CNTA)]
				ldr		rDMACB, [rDMA, #(Z80CORE2DMA + DMA_CNTB)]

00:				sub		rREMCLOCK, rREMCLOCK, #6
				tst		r11, #DMAF_INCREMENT
				orr		r11, r11, #DMAF_INCREMENT
				beq		20f

				tst		rDMACA, #0x20
				bne		11f
				tst		rDMACA, #0x10
				addne	rDMACA, rDMACA, #(1 << 16)
				subeq	rDMACA, rDMACA, #(1 << 16)
				str		rDMACA, [rDMA, #(Z80CORE2DMA + DMA_CNTA)]

11:				tst		rDMACB, #0x20
				bne		20f
				tst		rDMACB, #0x10
				addne	rDMACB, rDMACB, #(1 << 16)
				subeq	rDMACB, rDMACB, #(1 << 16)
				str		rDMACB, [rDMA, #(Z80CORE2DMA + DMA_CNTB)]

20:				tst		r11, #DMAF_DIR
				movne	r0, rDMACA
				moveq	r0, rDMACB
				tst		r0, #0x08
				bne		21f
				teq		r0, #0
				ldrmib	r1, [r5, r0, lsr #16]
				ldrplb	r1, [r10, r0, lsr #16]

30:				tst		r11, #DMAF_CMDM
				beq		40f

				ldrh	r0, [rDMA, #(Z80CORE2DMA + DMA_MASKBYTE)]
				eor		r12, r0, r1, lsl #8
				bics	r12, r0, r12, lsr #8
				biceq	r11, r11, #(DMAF_WORKING + DMAF_MACH)

40:				tst		r11, #DMAF_CMDO
				beq		50f

				tst		r11, #DMAF_DIR
				movne	r0, rDMACB
				moveq	r0, rDMACA
				tst		r0, #0x08
				bne		41f
				strb	r1, [r5, r0, lsr #16]

50:				ldr		r0, [rDMA, #(Z80CORE2DMA + DMA_BYTEL)]
				movs	r12, r0, lsl #16
				cmpne	r0, r12
				bichi	r11, r11, #(DMAF_WORKING + DMAF_ENDB)
				adds	r0, r0, #(1 << 16)
				biccs	r11, r11, #(DMAF_WORKING + DMAF_ENDB)
				str		r0, [rDMA, #(Z80CORE2DMA + DMA_BYTEL)]
				tst		r11, #DMAF_WORKING
				beq		60f
				tst		r11, #(0xff << 16)
				bne		00b
				strb	r11, [rDMA, #(Z80CORE2DMA + DMA_FLAG)]
				ldmia	sp!, {r8, r9, pc}

60:				strb	r11, [rDMA, #(Z80CORE2DMA + DMA_FLAG)]
				tst		r11, #(0xff << 24)
				ldmeqia	sp!, {r8, r9, pc}
				str		rREMCLOCK, [rZ80CORE, #_CPU_REMCLOCK]
				mov		r0, #(1 << 1)			; @ IEVENT_DMA
				mov		lr, pc
				ldr		pc, 61f
				ldr		rREMCLOCK, [rZ80CORE, #_CPU_REMCLOCK]
				ldmia	sp!, {r8, r9, pc}
61:				.word	ievent_setbit


21:				mov		r0, r0, lsr #16
				strb	r11, [rDMA, #(Z80CORE2DMA + DMA_FLAG)]
				Z80INP
				ldr		r11, [rDMA, #(Z80CORE2DMA + DMA_FLAG)]
				mov		r1, r0
				b		30b

41:				mov		r0, r0, lsr #16
				strb	r11, [rDMA, #(Z80CORE2DMA + DMA_FLAG)]
				mov		r11, pc
				b		fastioout
				ldr		r11, [rDMA, #(Z80CORE2DMA + DMA_FLAG)]
				b		50b

	.end


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