src/mame/video/snes.c
| r7674 | r7675 | |
| 1737 | 1737 | INLINE UINT32 snes_get_vram_address( running_machine *machine ) |
| 1738 | 1738 | { |
| 1739 | 1739 | snes_state *state = (snes_state *)machine->driver_data; |
| 1740 | | UINT32 addr = (snes_ram[VMADDH] << 8) | snes_ram[VMADDL]; |
| 1740 | UINT32 addr = state->vmadd; |
| 1741 | 1741 | |
| 1742 | 1742 | if (state->vram_fgr_count) |
| 1743 | 1743 | { |
| r7674 | r7675 | |
| 2027 | 2027 | state->vram_read_buffer = snes_vram_read(space, addr); |
| 2028 | 2028 | state->vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8); |
| 2029 | 2029 | |
| 2030 | | addr = ((snes_ram[VMADDH] << 8) | snes_ram[VMADDL]) + state->vram_fgr_increment; |
| 2031 | | snes_ram[VMADDL] = addr & 0xff; |
| 2032 | | snes_ram[VMADDH] = (addr >> 8) & 0xff; |
| 2030 | state->vmadd = (state->vmadd + state->vram_fgr_increment) & 0xffff; |
| 2033 | 2031 | } |
| 2034 | 2032 | |
| 2035 | 2033 | return snes_ppu.ppu1_open_bus; |
| r7674 | r7675 | |
| 2044 | 2042 | state->vram_read_buffer = snes_vram_read(space, addr); |
| 2045 | 2043 | state->vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8); |
| 2046 | 2044 | |
| 2047 | | addr = ((snes_ram[VMADDH] << 8) | snes_ram[VMADDL]) + state->vram_fgr_increment; |
| 2048 | | snes_ram[VMADDL] = addr & 0xff; |
| 2049 | | snes_ram[VMADDH] = (addr >> 8) & 0xff; |
| 2045 | state->vmadd = (state->vmadd + state->vram_fgr_increment) & 0xffff; |
| 2050 | 2046 | } |
| 2051 | 2047 | |
| 2052 | 2048 | return snes_ppu.ppu1_open_bus; |
| r7674 | r7675 | |
| 2270 | 2266 | // printf("VMAIN: high %x inc %x count %x mask %x shift %x\n", state->vram_fgr_high, state->vram_fgr_increment, state->vram_fgr_count, state->vram_fgr_mask, state->vram_fgr_shift); |
| 2271 | 2267 | break; |
| 2272 | 2268 | case VMADDL: /* Address for VRAM read/write (low) */ |
| 2269 | { |
| 2270 | UINT32 addr; |
| 2271 | state->vmadd = (state->vmadd & 0xff00) | (data << 0); |
| 2272 | addr = snes_get_vram_address(space->machine) << 1; |
| 2273 | state->vram_read_buffer = snes_vram_read(space, addr); |
| 2274 | state->vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8); |
| 2275 | } |
| 2276 | break; |
| 2273 | 2277 | case VMADDH: /* Address for VRAM read/write (high) */ |
| 2274 | 2278 | { |
| 2275 | 2279 | UINT32 addr; |
| 2276 | | snes_ram[offset] = data; |
| 2280 | state->vmadd = (state->vmadd & 0x00ff) | (data << 8); |
| 2277 | 2281 | addr = snes_get_vram_address(space->machine) << 1; |
| 2278 | 2282 | state->vram_read_buffer = snes_vram_read(space, addr); |
| 2279 | 2283 | state->vram_read_buffer |= (snes_vram_read(space, addr + 1) << 8); |
| r7674 | r7675 | |
| 2285 | 2289 | snes_vram_write(space, addr, data); |
| 2286 | 2290 | |
| 2287 | 2291 | if (!state->vram_fgr_high) |
| 2288 | | { |
| 2289 | | addr = ((snes_ram[VMADDH] << 8) | snes_ram[VMADDL]) + state->vram_fgr_increment; |
| 2290 | | snes_ram[VMADDL] = addr & 0xff; |
| 2291 | | snes_ram[VMADDH] = (addr >> 8) & 0xff; |
| 2292 | | } |
| 2292 | state->vmadd = (state->vmadd + state->vram_fgr_increment) & 0xffff; |
| 2293 | 2293 | } |
| 2294 | 2294 | return; |
| 2295 | 2295 | case VMDATAH: /* 2119: Data for VRAM write (high) */ |
| r7674 | r7675 | |
| 2298 | 2298 | snes_vram_write(space, addr + 1, data); |
| 2299 | 2299 | |
| 2300 | 2300 | if (state->vram_fgr_high) |
| 2301 | | { |
| 2302 | | addr = ((snes_ram[VMADDH] << 8) | snes_ram[VMADDL]) + state->vram_fgr_increment; |
| 2303 | | snes_ram[VMADDL] = addr & 0xff; |
| 2304 | | snes_ram[VMADDH] = (addr >> 8) & 0xff; |
| 2305 | | } |
| 2301 | state->vmadd = (state->vmadd + state->vram_fgr_increment) & 0xffff; |
| 2306 | 2302 | } |
| 2307 | 2303 | return; |
| 2308 | 2304 | case M7SEL: /* Mode 7 initial settings */ |