Previous 15994 Revisions Next

r5437 Saturday 15th August, 2009 at 11:14:47 UTC by Angelo Salese
[SNES]: Fixed HDMA boundary as well
[src/mame/machine]snes.c

src/mame/machine/snes.c
r5436r5437
11711171      case NMITIMEN:   /* Flag for v-blank, timer int. and joy read */
11721172      case OLDJOY2:   /* Old NES joystick support */
11731173         break;
1174      case WRIO:      /* Programmable I/O port - latches H/V counters on a 1->0 transition */
1174      case WRIO:      /* Programmable I/O port - latches H/V counters on a 0->1 transition */
11751175         if (!(snes_ram[WRIO] & 0x80) && (data & 0x80))
11761176         {
11771177            // external latch
r5436r5437
20062006   UINT8 mask = 1, dma = 0, i, contmode;
20072007   UINT16 bbus;
20082008   UINT32 abus;
2009   UINT32 abus_bank;
20092010
20102011   /* Assume priority of the 8 DMA channels is 0-7 */
20112012   for( i = 0; i < 8; i++ )
r5436r5437
20152016         /* Check if we need to read a new line from the table */
20162017         if( !(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f ) )
20172018         {
2018            abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
2019            abus = (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
2020            abus_bank = (snes_ram[SNES_DMA_BASE + dma + 4] << 16);
20192021
20202022            /* Get the number of lines */
20212023            snes_ram[SNES_DMA_BASE + dma + 0xa] = memory_read_byte(space, abus);
r5436r5437
20412043
20422044         /* Transfer addresses */
20432045         if( snes_ram[SNES_DMA_BASE + dma] & 0x40 )   /* Indirect */
2044            abus = (snes_ram[SNES_DMA_BASE + dma + 7] << 16) + (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5];
2046         {
2047            abus = (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5];
2048            abus_bank = (snes_ram[SNES_DMA_BASE + dma + 7] << 16);
2049         }
20452050         else                           /* Absolute */
2046            abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
2051         {
2052            abus = (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
2053            abus_bank = (snes_ram[SNES_DMA_BASE + dma + 4] << 16);
2054         }
20472055         bbus = 0x2100 + snes_ram[SNES_DMA_BASE + dma + 1];
20482056
20492057#ifdef SNES_DBG_HDMA
r5436r5437
20542062         {
20552063            case 0:      /* 1 address */
20562064            {
2057               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2065               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
20582066            } break;
20592067            case 5:      /* 4 bytes to 2 addresses (l,h,l,h) */
20602068            {
2061               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2062               memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
2063               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2064               memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
2069               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2070               memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2071               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2072               memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
20652073            } break;
20662074            case 1:      /* 2 addresses (l,h) */
20672075            {
2068               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2069               memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
2076               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2077               memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
20702078            } break;
20712079            case 2:      /* Write twice (l,l) */
20722080            case 6:
20732081            {
2074               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2075               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2082               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2083               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
20762084            } break;
20772085            case 3:      /* 2 addresses/Write twice (l,l,h,h) */
20782086            case 7:
20792087            {
2080               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2081               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2082               memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
2083               memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
2088               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2089               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2090               memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2091               memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
20842092            } break;
20852093            case 4:      /* 4 addresses (l,h,l,h) */
20862094            {
2087               memory_write_byte(space, bbus, memory_read_byte(space, abus++));
2088               memory_write_byte(space, bbus + 1, memory_read_byte(space, abus++));
2089               memory_write_byte(space, bbus + 2, memory_read_byte(space, abus++));
2090               memory_write_byte(space, bbus + 3, memory_read_byte(space, abus++));
2095               memory_write_byte(space, bbus, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2096               memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2097               memory_write_byte(space, bbus + 2, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
2098               memory_write_byte(space, bbus + 3, memory_read_byte(space, ((abus++) & 0xffff) | (abus_bank)));
20912099            } break;
20922100            default:
20932101#ifdef MAME_DEBUG

Previous 15994 Revisions Next


© 1998-2018 The MESS Team