|
|
| version 1.1, 2003/12/08 00:55:31 | version 1.4, 2004/03/07 01:23:14 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "memory.h" | #include "cpucore.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "dmap.h" | #include "dmap.h" |
| void dmap_i286(void) { | void dmap(void) { |
| DMACH ch; | DMACH ch; |
| int bit; | REG8 bit; |
| UINT32 addr; | |
| if (dmac.working) { | if (dmac.working) { |
| ch = dmac.dmach; | ch = dmac.dmach; |
| Line 19 void dmap_i286(void) { | Line 20 void dmap_i286(void) { |
| if (!ch->leng.w) { | if (!ch->leng.w) { |
| dmac.stat |= bit; | dmac.stat |= bit; |
| dmac.working &= ~bit; | dmac.working &= ~bit; |
| ch->extproc(DMAEXT_END); | ch->proc.extproc(DMAEXT_END); |
| } | } |
| ch->leng.w--; | ch->leng.w--; |
| addr = ch->adrs.d; | |
| switch(ch->mode & 0x0c) { | if (necio.port0439 & 4) { |
| case 0x00: // verifty | addr = ch->adrs.d & 0xffffff; |
| ch->inproc(); | |
| break; | |
| case 0x04: // port->mem | |
| i286_memorywrite(ch->adrs.d, ch->inproc()); | |
| break; | |
| default: | |
| ch->outproc(i286_memoryread(ch->adrs.d)); | |
| break; | |
| } | } |
| ch->adrs.d += ((ch->mode & 0x20)?-1:1); | ch->adrs.d += ((ch->mode & 0x20)?-1:1); |
| } | // ch->adrs.w[DMA16_LOW] += ((ch->mode & 0x20)?-1:1); |
| ch++; | |
| bit <<= 1; | |
| } while(bit & 0x0f); | |
| } | |
| } | |
| void dmap_v30(void) { | |
| DMACH ch; | |
| int bit; | |
| if (dmac.working) { | |
| ch = dmac.dmach; | |
| bit = 1; | |
| do { | |
| if (dmac.working & bit) { | |
| // DMA working ! | |
| if (!ch->leng.w) { | |
| dmac.stat |= bit; | |
| dmac.working &= ~bit; | |
| ch->extproc(DMAEXT_END); | |
| } | |
| ch->leng.w--; | |
| switch(ch->mode & 0x0c) { | switch(ch->mode & 0x0c) { |
| case 0x00: // verifty | case 0x00: // verifty |
| ch->inproc(); | ch->proc.inproc(); |
| break; | break; |
| case 0x04: // port->mem | case 0x04: // port->mem |
| i286_memorywrite(ch->adrs.d, ch->inproc()); | i286_memorywrite(addr, ch->proc.inproc()); |
| break; | break; |
| default: | default: |
| ch->outproc(i286_memoryread(ch->adrs.d)); | ch->proc.outproc(i286_memoryread(addr)); |
| break; | break; |
| } | } |
| ch->adrs.w[DMA16_LOW] += ((ch->mode & 0x20)?-1:1); | |
| } | } |
| ch++; | ch++; |
| bit <<= 1; | bit <<= 1; |