DMA channel 0 page setting is now writable on 386 and later machines;

DMA channel 4 now correctly works as a cascade.
This commit is contained in:
OBattler
2016-11-13 23:44:16 +01:00
parent 995c62ab06
commit 677cf7598c

View File

@@ -218,6 +218,12 @@ void dma_page_write(uint16_t addr, uint8_t val, void *priv)
case 3: case 3:
dma.page[1] = (AT) ? val : val & 0xf; dma.page[1] = (AT) ? val : val & 0xf;
break; break;
case 0x7:
if (is386)
{
dma.page[0] = (AT) ? val : val & 0xf;
}
break;
case 0x9: case 0x9:
dma16.page[2] = val; dma16.page[2] = val;
break; break;
@@ -313,7 +319,7 @@ int dma_channel_read(int channel)
else else
{ {
channel &= 3; channel &= 3;
if (dma16.m & (1 << channel)) if ((dma16.m & (1 << channel)) || (dma16.m & 1))
return DMA_NODATA; return DMA_NODATA;
if ((dma16.mode[channel] & 0xC) != 8) if ((dma16.mode[channel] & 0xC) != 8)
return DMA_NODATA; return DMA_NODATA;
@@ -337,7 +343,13 @@ int dma_channel_read(int channel)
dma16.ac[channel] = dma16.ab[channel]; dma16.ac[channel] = dma16.ab[channel];
} }
else else
{
dma16.m |= (1 << channel); dma16.m |= (1 << channel);
if (!channel)
{
dma16.m |= 0xf;
}
}
dma16.stat |= (1 << channel); dma16.stat |= (1 << channel);
} }
@@ -397,7 +409,7 @@ int dma_channel_write(int channel, uint16_t val)
else else
{ {
channel &= 3; channel &= 3;
if (dma16.m & (1 << channel)) if ((dma16.m & (1 << channel)) || (dma16.m & 1))
return DMA_NODATA; return DMA_NODATA;
if ((dma16.mode[channel] & 0xC) != 4) if ((dma16.mode[channel] & 0xC) != 4)
return DMA_NODATA; return DMA_NODATA;
@@ -419,11 +431,15 @@ int dma_channel_write(int channel, uint16_t val)
dma16.cc[channel] = dma16.cb[channel] + 1; dma16.cc[channel] = dma16.cb[channel] + 1;
dma16.ac[channel] = dma16.ab[channel]; dma16.ac[channel] = dma16.ab[channel];
} }
dma16.m |= (1 << channel); dma16.m |= (1 << channel);
if (!channel)
{
dma16.m |= 0xf;
}
dma16.stat |= (1 << channel); dma16.stat |= (1 << channel);
} }
if (dma.m & (1 << channel)) if ((dma.m & (1 << channel)) || (dma.m & 1))
return DMA_OVER; return DMA_OVER;
} }
return 0; return 0;