diff options
Diffstat (limited to 'src/emu/video/snes_ppu.c')
-rw-r--r-- | src/emu/video/snes_ppu.c | 145 |
1 files changed, 104 insertions, 41 deletions
diff --git a/src/emu/video/snes_ppu.c b/src/emu/video/snes_ppu.c index 526e449ae85..929ed11623f 100644 --- a/src/emu/video/snes_ppu.c +++ b/src/emu/video/snes_ppu.c @@ -214,51 +214,10 @@ void snes_ppu_device::device_start() { m_openbus_cb.resolve_safe(0); -#if SNES_LAYER_DEBUG - memset(&m_debug_options, 0, sizeof(m_debug_options)); -#endif - m_vram = auto_alloc_array(machine(), UINT8, SNES_VRAM_SIZE); m_cgram = auto_alloc_array(machine(), UINT16, SNES_CGRAM_SIZE/2); m_oam_ram = auto_alloc_array(machine(), UINT16, SNES_OAM_SIZE/2); - /* Inititialize registers/variables */ - m_update_windows = 1; - m_beam.latch_vert = 0; - m_beam.latch_horz = 0; - m_beam.current_vert = 0; - m_beam.current_horz = 0; - m_beam.last_visible_line = 225; /* TODO: PAL setting */ - m_mode = 0; - m_ppu1_version = 1; // 5C77 chip version number, read by STAT77, only '1' is known - m_ppu2_version = 3; // 5C78 chip version number, read by STAT78, only '2' & '3' encountered so far. - - m_cgram_address = 0; - m_read_ophct = 0; - m_read_opvct = 0; - - PPU_REG(VMAIN) = 0x80; - // what about other regs? - - /* Inititialize mosaic table */ - for (int j = 0; j < 16; j++) - { - for (int i = 0; i < 4096; i++) - m_mosaic_table[j][i] = (i / (j + 1)) * (j + 1); - } - - /* Init VRAM */ - memset(m_vram, 0, SNES_VRAM_SIZE); - - /* Init Palette RAM */ - memset((UINT8 *)m_cgram, 0, SNES_CGRAM_SIZE); - - /* Init oam RAM */ - memset((UINT8 *)m_oam_ram, 0xff, SNES_OAM_SIZE); - - m_stat78 = 0; - memset(m_regs, 0x00, sizeof(m_regs)); - for (int i = 0; i < 2; i++) { save_item(NAME(m_scanlines[i].enable), i); @@ -400,7 +359,111 @@ void snes_ppu_device::device_start() save_pointer(NAME(m_oam_ram), SNES_OAM_SIZE/2); } +void snes_ppu_device::device_reset() +{ + +#if SNES_LAYER_DEBUG + memset(&m_debug_options, 0, sizeof(m_debug_options)); +#endif + + /* Inititialize registers/variables */ + m_update_windows = 1; + m_beam.latch_vert = 0; + m_beam.latch_horz = 0; + m_beam.current_vert = 0; + m_beam.current_horz = 0; + m_beam.last_visible_line = 225; /* TODO: PAL setting */ + m_mode = 0; + m_ppu1_version = 1; // 5C77 chip version number, read by STAT77, only '1' is known + m_ppu2_version = 3; // 5C78 chip version number, read by STAT78, only '2' & '3' encountered so far. + + m_cgram_address = 0; + m_read_ophct = 0; + m_read_opvct = 0; + + PPU_REG(VMAIN) = 0x80; + // what about other regs? + + /* Inititialize mosaic table */ + for (int j = 0; j < 16; j++) + { + for (int i = 0; i < 4096; i++) + m_mosaic_table[j][i] = (i / (j + 1)) * (j + 1); + } + + /* Init VRAM */ + memset(m_vram, 0, SNES_VRAM_SIZE); + + /* Init Palette RAM */ + memset((UINT8 *)m_cgram, 0, SNES_CGRAM_SIZE); + + /* Init oam RAM */ + memset((UINT8 *)m_oam_ram, 0xff, SNES_OAM_SIZE); + + m_stat78 = 0; + + // other initializations to 0 + memset(m_regs, 0, sizeof(m_regs)); + memset(m_oam_itemlist, 0, sizeof(m_oam_itemlist)); + memset(&m_oam, 0, sizeof(m_oam)); + memset(&m_mode7, 0, sizeof(m_mode7)); + for (int i = 0; i < 2; i++) + { + m_scanlines[i].enable = 0; + m_scanlines[i].clip = 0; + memset(m_scanlines[i].buffer, 0, SNES_SCR_WIDTH); + memset(m_scanlines[i].priority, 0, SNES_SCR_WIDTH); + memset(m_scanlines[i].layer, 0, SNES_SCR_WIDTH); + memset(m_scanlines[i].blend_exception, 0, SNES_SCR_WIDTH); + } + + for (int i = 0; i < 6; i++) + { + m_layer[i].window1_enabled = 0; + m_layer[i].window1_invert = 0; + m_layer[i].window2_enabled = 0; + m_layer[i].window2_invert = 0; + m_layer[i].wlog_mask = 0; + m_layer[i].color_math = 0; + m_layer[i].charmap = 0; + m_layer[i].tilemap = 0; + m_layer[i].tilemap_size = 0; + m_layer[i].tile_size = 0; + m_layer[i].mosaic_enabled = 0; + m_layer[i].main_window_enabled = 0; + m_layer[i].sub_window_enabled = 0; + m_layer[i].main_bg_enabled = 0; + m_layer[i].sub_bg_enabled = 0; + m_layer[i].hoffs = 0; + m_layer[i].voffs = 0; + + memset(m_clipmasks[i], 0, SNES_SCR_WIDTH); + } + + for (int i = 0; i < ARRAY_LENGTH(m_oam_spritelist); i++) + { + m_oam_spritelist[i].tile = 0; + m_oam_spritelist[i].x = 0; + m_oam_spritelist[i].y = 0; + m_oam_spritelist[i].size = 0; + m_oam_spritelist[i].vflip = 0; + m_oam_spritelist[i].hflip = 0; + m_oam_spritelist[i].priority_bits = 0; + m_oam_spritelist[i].pal = 0; + m_oam_spritelist[i].height = 0; + m_oam_spritelist[i].width = 0; + } + + for (int i = 0; i < ARRAY_LENGTH(m_oam_tilelist); i++) + { + m_oam_tilelist[i].x = 0; + m_oam_tilelist[i].priority = 0; + m_oam_tilelist[i].pal = 0; + m_oam_tilelist[i].tileaddr = 0; + m_oam_tilelist[i].hflip = 0; + } +} /***************************************** * get_bgcolor() |