mirror of
https://github.com/holub/mame
synced 2025-05-24 14:56:21 +03:00
[SNES]: Fixed HDMA boundary as well
This commit is contained in:
parent
2a76fb52c6
commit
02cfc27453
@ -1171,7 +1171,7 @@ WRITE8_HANDLER( snes_w_io )
|
||||
case NMITIMEN: /* Flag for v-blank, timer int. and joy read */
|
||||
case OLDJOY2: /* Old NES joystick support */
|
||||
break;
|
||||
case WRIO: /* Programmable I/O port - latches H/V counters on a 1->0 transition */
|
||||
case WRIO: /* Programmable I/O port - latches H/V counters on a 0->1 transition */
|
||||
if (!(snes_ram[WRIO] & 0x80) && (data & 0x80))
|
||||
{
|
||||
// external latch
|
||||
@ -2006,6 +2006,7 @@ void snes_hdma(const address_space *space)
|
||||
UINT8 mask = 1, dma = 0, i, contmode;
|
||||
UINT16 bbus;
|
||||
UINT32 abus;
|
||||
UINT32 abus_bank;
|
||||
|
||||
/* Assume priority of the 8 DMA channels is 0-7 */
|
||||
for( i = 0; i < 8; i++ )
|
||||
@ -2015,7 +2016,8 @@ void snes_hdma(const address_space *space)
|
||||
/* Check if we need to read a new line from the table */
|
||||
if( !(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f ) )
|
||||
{
|
||||
abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
|
||||
abus = (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
|
||||
abus_bank = (snes_ram[SNES_DMA_BASE + dma + 4] << 16);
|
||||
|
||||
/* Get the number of lines */
|
||||
snes_ram[SNES_DMA_BASE + dma + 0xa] = memory_read_byte(space, abus);
|
||||
@ -2041,9 +2043,15 @@ void snes_hdma(const address_space *space)
|
||||
|
||||
/* Transfer addresses */
|
||||
if( snes_ram[SNES_DMA_BASE + dma] & 0x40 ) /* Indirect */
|
||||
abus = (snes_ram[SNES_DMA_BASE + dma + 7] << 16) + (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5];
|
||||
{
|
||||
abus = (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5];
|
||||
abus_bank = (snes_ram[SNES_DMA_BASE + dma + 7] << 16);
|
||||
}
|
||||
else /* Absolute */
|
||||
abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
|
||||
{
|
||||
abus = (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
|
||||
abus_bank = (snes_ram[SNES_DMA_BASE + dma + 4] << 16);
|
||||
}
|
||||
bbus = 0x2100 + snes_ram[SNES_DMA_BASE + dma + 1];
|
||||
|
||||
#ifdef SNES_DBG_HDMA
|
||||
@ -2054,40 +2062,40 @@ void snes_hdma(const address_space *space)
|
||||
{
|
||||
case 0: /* 1 address */
|
||||
{
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
} break;
|
||||
case 5: /* 4 bytes to 2 addresses (l,h,l,h) */
|
||||
{
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
} break;
|
||||
case 1: /* 2 addresses (l,h) */
|
||||
{
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
} break;
|
||||
case 2: /* Write twice (l,l) */
|
||||
case 6:
|
||||
{
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
} break;
|
||||
case 3: /* 2 addresses/Write twice (l,l,h,h) */
|
||||
case 7:
|
||||
{
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
} break;
|
||||
case 4: /* 4 addresses (l,h,l,h) */
|
||||
{
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 2, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus + 3, memory_read_byte(space, abus++));
|
||||
memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 2, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
memory_write_byte(space, bbus + 3, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
|
||||
} break;
|
||||
default:
|
||||
#ifdef MAME_DEBUG
|
||||
|
Loading…
Reference in New Issue
Block a user