File:  [RetroPC.NET] / xmil / z80x / z80dmap.c
Revision 1.11: download - view: text, annotated - select for diffs
Tue Mar 24 00:02:25 2009 JST (16 years, 7 months ago) by yui
Branches: MAIN
CVS tags: HEAD
sync local (pointer and defines 4 ds)

#include	"compiler.h"
#include	"z80core.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"ievent.h"


void z80dmap(void) {

	DMACNT	*cnt1;
	DMACNT	*cnt2;
	UINT	addr;
	REG8	dat;
	REG8	flag1;
	REG8	flag2;

#if !defined(DMAS_STOIC)
	if (!dma.working)
#else
	if (!(dma.flag & DMAF_WORKING))
#endif
	{
		return;
	}

	if (dma.WR0 & 4) {
		cnt1 = &dma.cnt_a;
		cnt2 = &dma.cnt_b;
	}
	else {
		cnt2 = &dma.cnt_a;
		cnt1 = &dma.cnt_b;
	}

	flag1 = cnt1->b.flag;
	flag2 = cnt2->b.flag;
	do {		// dma_lp
		CPU_REMCLOCK -= 6;
#if !defined(DMAS_STOIC)
		if (dma.increment)
#else
		if (dma.flag & DMAF_INCREMENT)
#endif
		{
			if (!(flag1 & 0x20)) {
				cnt1->w.addr += (flag1 & 0x10)?1:-1;
			}
			if (!(flag2 & 0x20)) {
				cnt2->w.addr += (flag2 & 0x10)?1:-1;
			}
		}
		else {
#if !defined(DMAS_STOIC)
			dma.increment = 1;
#else
			dma.flag |= DMAF_INCREMENT;
#endif
		}
		addr = cnt1->w.addr;
		if (flag1 & 8) {
			dat = iocore_inp(addr);
			/* TRACEOUT(("dma r %.4x - %.2x", addr, dat)); */
		}
		else {
			dat = z80mem_read8(addr);
		}
		if (dma.WR0 & 2) {
			if (!((dat ^ dma.MACH_BYT) & (~dma.MASK_BYT))) {
#if !defined(DMAS_STOIC)
				dma.working = FALSE;
				dma.MACH_FLG = 1;
#else
				dma.flag &= ~(DMAF_WORKING | DMAF_MACH);
#endif
			}
		}
		if (dma.WR0 & 1) {
			addr = cnt2->w.addr;
			if (flag2 & 8) {
				iocore_out(addr, dat);
			}
			else {
				z80mem_write8(addr, dat);
				/* TRACEOUT(("dma w %.4x - %.2x", addr, dat)); */
			}
		}

		dma.leng.w.n++;
		if (dma.leng.w.n == 0) {
#if !defined(DMAS_STOIC)
			dma.working = FALSE;
			dma.ENDB_FLG = 1;
#else
			dma.flag &= ~(DMAF_WORKING | DMAF_ENDB);
#endif
		}
		else if ((dma.leng.w.l) && ((dma.leng.w.n - 1) >= dma.leng.w.l)) {
#if !defined(DMAS_STOIC)
			dma.working = FALSE;
			dma.ENDB_FLG = 1;
#else
			dma.flag &= ~(DMAF_WORKING | DMAF_ENDB);
#endif
		}
#if !defined(DMAS_STOIC)
		if (!dma.working)
#else
		if (!(dma.flag & DMAF_WORKING))
#endif
		{
			goto intr;
		}
	} while(dma.mode);
	return;

intr:
	if (dma.INT_ENBL) {
		ievent_set(IEVENT_DMA);
	}
}


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