File:  [RetroPC.NET] / xmil / z80c / z80dmap.c
Revision 1.4: download - view: text, annotated - select for diffs
Sun Aug 8 23:00:56 2004 JST (21 years, 2 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix...

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


void z80dmap(void) {

	REG8	r;
	UINT16	*off1;
	UINT16	*off2;
	REG8	flag1;
	REG8	flag2;
	UINT	addr;
	REG8	dat;
	REG8	vect;

	r = dma.DMA_CMND;
	if ((r & 3) == 0) return;
	if (dma.DMA_ENBL == 0) return;
	if (dma.ENDB_FLG != 0) return;
	if (r & 2) {
		if (dma.MACH_FLG != 0) return;
	}
	if (dma.DMA_MODE != 1) {
		if ((dma.WR[5] ^ dma.DMA_REDY) & 8) return;
	}

	if (dma.WR[0] & 4) {
		off1 = &dma.CNT_A.w;
		flag1 = dma.WR[1];
		off2 = &dma.CNT_B.w;
		flag2 = dma.WR[2];
	}
	else {
		off2 = &dma.CNT_A.w;
		flag2 = dma.WR[1];
		off1 = &dma.CNT_B.w;
		flag1 = dma.WR[2];
	}

	do {		// dma_lp
		if (dma.ENDB_FLG) {
			break;
		}
		if ((dma.DMA_CMND & 2) && (dma.MACH_FLG)) {
			break;
		}
		addr = *off1;
		if (flag1 & 8) {
			if (addr == 0x0ffb) {
				fdcdummyread = 0;
			}
			dat = iocore_inp(addr);
		}
		else {
			dat = mem_read8(addr);
		}
		if (dma.DMA_CMND & 1) {
			addr = *off2;
			if (flag2 & 8) {
				if ((addr == 0x0ffb) && (!ppi.IO_MODE)) {
					fdcdummyread = 0;
				}
				iocore_out(addr, dat);
			}
			else {
				mem_write8(addr, dat);
			}
		}
		if (dma.DMA_CMND & 2) {
			if (!((dat ^ dma.MACH_BYT) & (~dma.MASK_BYT))) {
				dma.MACH_FLG = 1;
			}
		}
		if (dma.DMA_MODE != 1) {
			dma.DMA_STOP = (dma.WR[5] ^ dma.DMA_REDY) & 8;
			if (dma.DMA_STOP) {
				goto dma_stop;
			}
		}
		if (!(flag1 & 0x20)) {
			*off1 += (flag1 & 0x10)?1:-1;
		}
		if (!(flag2 & 0x20)) {
			*off2 += (flag2 & 0x10)?1:-1;
		}

dma_stop:
		dma.BYT_N.w++;
		if (dma.BYT_N.w == 0) {
			dma.ENDB_FLG = 1;
			break;
		}
		if ((dma.BYT_L.w) && (dma.BYT_L.w != 0xffff) && (dma.BYT_N.w >= (dma.BYT_L.w + 1))) {
			dma.ENDB_FLG = 1;
			break;
		}
	} while(dma.DMA_MODE);

	if (dma.INT_ENBL) {
		vect = 0;
		if ((dma.INT_FLG & 1) && (dma.MACH_FLG)) {
			vect = 2;
		}
		else if ((dma.INT_FLG & 2) && (dma.ENDB_FLG)) {
			vect = 4;
		}
		if (vect) {
			if (dma.INT_FLG & 0x20) {
				vect += (dma.INT_VCT & 0xf9);
			}
			else {
				vect = dma.INT_VCT;
			}
			z80c_interrupt(vect);
		}
	}
}


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