trunk/src/mame/video/snes.c
r17390 | r17391 | |
132 | 132 | |
133 | 133 | static UINT8 *snes_vram; /* Video RAM (Should be 16-bit, but it's easier this way) */ |
134 | 134 | static UINT16 *snes_cgram; /* Colour RAM */ |
135 | | static UINT16 *snes_oam; /* Object Attribute Memory */ |
136 | 135 | |
137 | 136 | /***************************************** |
138 | 137 | * snes_get_bgcolor() |
r17390 | r17391 | |
843 | 842 | |
844 | 843 | void snes_state::snes_oam_list_build( void ) |
845 | 844 | { |
846 | | UINT8 *oamram = (UINT8 *)snes_oam; |
| 845 | UINT8 *oamram = (UINT8 *)m_snes_oam; |
847 | 846 | INT16 oam = 0x1ff; |
848 | 847 | UINT16 oam_extra = oam + 0x20; |
849 | 848 | UINT16 extra = 0; |
r17390 | r17391 | |
1658 | 1657 | |
1659 | 1658 | VIDEO_START( snes ) |
1660 | 1659 | { |
| 1660 | snes_state *state = machine.driver_data<snes_state>(); |
1661 | 1661 | int i,j; |
1662 | 1662 | |
1663 | 1663 | #if SNES_LAYER_DEBUG |
r17390 | r17391 | |
1666 | 1666 | |
1667 | 1667 | snes_vram = auto_alloc_array(machine, UINT8, SNES_VRAM_SIZE); |
1668 | 1668 | snes_cgram = auto_alloc_array(machine, UINT16, SNES_CGRAM_SIZE/2); |
1669 | | snes_oam = auto_alloc_array(machine, UINT16, SNES_OAM_SIZE/2); |
| 1669 | state->m_snes_oam = auto_alloc_array(machine, UINT16, SNES_OAM_SIZE/2); |
1670 | 1670 | |
1671 | 1671 | /* Inititialize registers/variables */ |
1672 | 1672 | snes_ppu.update_windows = 1; |
r17390 | r17391 | |
1693 | 1693 | memset((UINT8 *)snes_cgram, 0, SNES_CGRAM_SIZE); |
1694 | 1694 | |
1695 | 1695 | /* Init oam RAM */ |
1696 | | memset(snes_oam, 0xff, SNES_OAM_SIZE); |
| 1696 | memset(state->m_snes_oam, 0xff, SNES_OAM_SIZE); |
1697 | 1697 | |
1698 | 1698 | for (i = 0; i < 6; i++) |
1699 | 1699 | { |
r17390 | r17391 | |
1785 | 1785 | |
1786 | 1786 | state_save_register_global_pointer(machine, snes_vram, SNES_VRAM_SIZE); |
1787 | 1787 | state_save_register_global_pointer(machine, snes_cgram, SNES_CGRAM_SIZE/2); |
1788 | | state_save_register_global_pointer(machine, snes_oam, SNES_OAM_SIZE/2); |
| 1788 | state_save_register_global_pointer(machine, state->m_snes_oam, SNES_OAM_SIZE/2); |
1789 | 1789 | } |
1790 | 1790 | |
1791 | 1791 | SCREEN_UPDATE_RGB32( snes ) |
r17390 | r17391 | |
1977 | 1977 | to choose the high/low byte of the snes_oam word. |
1978 | 1978 | *************************************************/ |
1979 | 1979 | |
1980 | | static READ8_HANDLER( snes_oam_read ) |
| 1980 | READ8_MEMBER( snes_state::snes_oam_read ) |
1981 | 1981 | { |
1982 | 1982 | offset &= 0x1ff; |
1983 | 1983 | |
r17390 | r17391 | |
1986 | 1986 | |
1987 | 1987 | if (!snes_ppu.screen_disabled) |
1988 | 1988 | { |
1989 | | UINT16 v = space->machine().primary_screen->vpos(); |
| 1989 | UINT16 v = machine().primary_screen->vpos(); |
1990 | 1990 | |
1991 | 1991 | if (v < snes_ppu.beam.last_visible_line) |
1992 | 1992 | offset = 0x010c; |
1993 | 1993 | } |
1994 | 1994 | |
1995 | | return (snes_oam[offset] >> (snes_ram[OAMDATA] << 3)) & 0xff; |
| 1995 | return (m_snes_oam[offset] >> (snes_ram[OAMDATA] << 3)) & 0xff; |
1996 | 1996 | } |
1997 | 1997 | |
1998 | | static WRITE8_HANDLER( snes_oam_write ) |
| 1998 | WRITE8_MEMBER( snes_state::snes_oam_write ) |
1999 | 1999 | { |
2000 | 2000 | offset &= 0x1ff; |
2001 | 2001 | |
r17390 | r17391 | |
2004 | 2004 | |
2005 | 2005 | if (!snes_ppu.screen_disabled) |
2006 | 2006 | { |
2007 | | UINT16 v = space->machine().primary_screen->vpos(); |
| 2007 | UINT16 v = machine().primary_screen->vpos(); |
2008 | 2008 | |
2009 | 2009 | if (v < snes_ppu.beam.last_visible_line) |
2010 | 2010 | offset = 0x010c; |
2011 | 2011 | } |
2012 | 2012 | |
2013 | 2013 | if (!(snes_ram[OAMDATA])) |
2014 | | snes_oam[offset] = (snes_oam[offset] & 0xff00) | (data << 0); |
| 2014 | m_snes_oam[offset] = (m_snes_oam[offset] & 0xff00) | (data << 0); |
2015 | 2015 | else |
2016 | | snes_oam[offset] = (snes_oam[offset] & 0x00ff) | (data << 8); |
| 2016 | m_snes_oam[offset] = (m_snes_oam[offset] & 0x00ff) | (data << 8); |
2017 | 2017 | } |
2018 | 2018 | |
2019 | 2019 | /************************************************* |
r17390 | r17391 | |
2141 | 2141 | snes_latch_counters(space->machine()); |
2142 | 2142 | return snes_open_bus_r(space, 0); /* Return value is meaningless */ |
2143 | 2143 | case ROAMDATA: /* Read data from OAM (DR) */ |
2144 | | snes_ppu.ppu1_open_bus = snes_oam_read(space, snes_ppu.oam.address); |
| 2144 | snes_ppu.ppu1_open_bus = state->snes_oam_read(*space, snes_ppu.oam.address); |
2145 | 2145 | snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2; |
2146 | 2146 | if (!snes_ram[OAMDATA]) |
2147 | 2147 | { |
r17390 | r17391 | |
2274 | 2274 | break; |
2275 | 2275 | case OAMDATA: /* Data for OAM write (DW) */ |
2276 | 2276 | if (snes_ppu.oam.address >= 0x100) |
2277 | | snes_oam_write(space, snes_ppu.oam.address, data); |
| 2277 | state->snes_oam_write(*space, snes_ppu.oam.address, data); |
2278 | 2278 | else |
2279 | 2279 | { |
2280 | 2280 | if (!snes_ram[OAMDATA]) |
r17390 | r17391 | |
2284 | 2284 | // in this case, we not only write data to the upper byte of the word, |
2285 | 2285 | // but also snes_ppu.oam.write_latch to the lower byte (recall that |
2286 | 2286 | // snes_ram[OAMDATA] is used to select high/low byte) |
2287 | | snes_oam_write(space, snes_ppu.oam.address, data); |
| 2287 | state->snes_oam_write(*space, snes_ppu.oam.address, data); |
2288 | 2288 | snes_ram[OAMDATA] = 0; |
2289 | | snes_oam_write(space, snes_ppu.oam.address, snes_ppu.oam.write_latch); |
| 2289 | state->snes_oam_write(*space, snes_ppu.oam.address, snes_ppu.oam.write_latch); |
2290 | 2290 | snes_ram[OAMDATA] = 1; |
2291 | 2291 | } |
2292 | 2292 | } |