--- xmil/z80c/z80dmap.c 2004/08/11 12:08:17 1.7 +++ xmil/z80c/z80dmap.c 2004/08/11 16:09:04 1.8 @@ -2,28 +2,20 @@ #include "z80core.h" #include "pccore.h" #include "iocore.h" +#include "ievent.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; // mod - if (r & 2) { - if (dma.MACH_FLG != 0) return; // mod - } - if (dma.DMA_MODE != 1) { - if ((dma.WR[5] ^ dma.DMA_REDY) & 8) return; + if (!dma.working) { + return; } if (dma.WR[0] & 4) { @@ -40,12 +32,6 @@ void z80dmap(void) { } do { // dma_lp - if (dma.ENDB_FLG) { - break; - } - if ((dma.DMA_CMND & 2) && (dma.MACH_FLG)) { - break; - } addr = *off1; if (flag1 & 8) { dat = iocore_inp(addr); @@ -53,7 +39,7 @@ void z80dmap(void) { else { dat = mem_read8(addr); } - if (dma.DMA_CMND & 1) { + if (dma.cmd & 1) { addr = *off2; if (flag2 & 8) { iocore_out(addr, dat); @@ -62,14 +48,16 @@ void z80dmap(void) { mem_write8(addr, dat); } } - if (dma.DMA_CMND & 2) { + if (dma.cmd & 2) { if (!((dat ^ dma.MACH_BYT) & (~dma.MASK_BYT))) { + dma.working = FALSE; dma.MACH_FLG = 1; } } - if (dma.DMA_MODE != 1) { - dma.DMA_STOP = (dma.WR[5] ^ dma.DMA_REDY) & 8; + if (dma.mode != 1) { + dma.DMA_STOP = (dma.WR[5] ^ dma.ready) & 8; if (dma.DMA_STOP) { + dma.working = FALSE; // 既にセットされてる筈だが goto dma_stop; } } @@ -83,32 +71,24 @@ void z80dmap(void) { dma_stop: dma.BYT_N.w++; if (dma.BYT_N.w == 0) { + dma.working = FALSE; dma.ENDB_FLG = 1; - break; + goto intr; } if ((dma.BYT_L.w) && (dma.BYT_L.w != 0xffff) && (dma.BYT_N.w >= (dma.BYT_L.w + 1))) { + dma.working = FALSE; dma.ENDB_FLG = 1; - break; + goto intr; + } + if (!dma.working) { + goto intr; } - } while(dma.DMA_MODE); + } while(dma.mode); + return; +intr: 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); - } + ievent_set(IEVENT_DMA); } }