src/mame/machine/snes.c
| r5436 | r5437 | |
| 1171 | 1171 | case NMITIMEN: /* Flag for v-blank, timer int. and joy read */ |
| 1172 | 1172 | case OLDJOY2: /* Old NES joystick support */ |
| 1173 | 1173 | 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 */ |
| 1175 | 1175 | if (!(snes_ram[WRIO] & 0x80) && (data & 0x80)) |
| 1176 | 1176 | { |
| 1177 | 1177 | // external latch |
| r5436 | r5437 | |
| 2006 | 2006 | UINT8 mask = 1, dma = 0, i, contmode; |
| 2007 | 2007 | UINT16 bbus; |
| 2008 | 2008 | UINT32 abus; |
| 2009 | UINT32 abus_bank; |
| 2009 | 2010 | |
| 2010 | 2011 | /* Assume priority of the 8 DMA channels is 0-7 */ |
| 2011 | 2012 | for( i = 0; i < 8; i++ ) |
| r5436 | r5437 | |
| 2015 | 2016 | /* Check if we need to read a new line from the table */ |
| 2016 | 2017 | if( !(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f ) ) |
| 2017 | 2018 | { |
| 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); |
| 2019 | 2021 | |
| 2020 | 2022 | /* Get the number of lines */ |
| 2021 | 2023 | snes_ram[SNES_DMA_BASE + dma + 0xa] = memory_read_byte(space, abus); |
| r5436 | r5437 | |
| 2041 | 2043 | |
| 2042 | 2044 | /* Transfer addresses */ |
| 2043 | 2045 | 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 | } |
| 2045 | 2050 | 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 | } |
| 2047 | 2055 | bbus = 0x2100 + snes_ram[SNES_DMA_BASE + dma + 1]; |
| 2048 | 2056 | |
| 2049 | 2057 | #ifdef SNES_DBG_HDMA |
| r5436 | r5437 | |
| 2054 | 2062 | { |
| 2055 | 2063 | case 0: /* 1 address */ |
| 2056 | 2064 | { |
| 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))); |
| 2058 | 2066 | } break; |
| 2059 | 2067 | case 5: /* 4 bytes to 2 addresses (l,h,l,h) */ |
| 2060 | 2068 | { |
| 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))); |
| 2065 | 2073 | } break; |
| 2066 | 2074 | case 1: /* 2 addresses (l,h) */ |
| 2067 | 2075 | { |
| 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))); |
| 2070 | 2078 | } break; |
| 2071 | 2079 | case 2: /* Write twice (l,l) */ |
| 2072 | 2080 | case 6: |
| 2073 | 2081 | { |
| 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))); |
| 2076 | 2084 | } break; |
| 2077 | 2085 | case 3: /* 2 addresses/Write twice (l,l,h,h) */ |
| 2078 | 2086 | case 7: |
| 2079 | 2087 | { |
| 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))); |
| 2084 | 2092 | } break; |
| 2085 | 2093 | case 4: /* 4 addresses (l,h,l,h) */ |
| 2086 | 2094 | { |
| 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))); |
| 2091 | 2099 | } break; |
| 2092 | 2100 | default: |
| 2093 | 2101 | #ifdef MAME_DEBUG |