mirror of
https://github.com/holub/mame
synced 2025-06-06 21:03:47 +03:00
segas32.cpp: Added save state support, and fixed backdrop color fill when screen resolution is changed. (#7583)
This commit is contained in:
parent
54e03f47e0
commit
90152f33d5
@ -654,6 +654,8 @@ void sega_multi32_analog_state::device_start()
|
||||
{
|
||||
sega_multi32_state::device_start();
|
||||
m_analog_bank = 0;
|
||||
|
||||
save_item(NAME(m_analog_bank));
|
||||
}
|
||||
|
||||
void segas32_state::device_reset()
|
||||
@ -5715,6 +5717,8 @@ void segas32_state::init_arescue(int m_hasdsp)
|
||||
elem = 0x00;
|
||||
|
||||
m_sw1_output = &segas32_state::arescue_sw1_output;
|
||||
|
||||
save_item(NAME(m_arescue_dsp_io));
|
||||
}
|
||||
|
||||
|
||||
@ -5732,6 +5736,8 @@ void segas32_state::init_brival()
|
||||
m_system32_protram = std::make_unique<uint16_t[]>(0x1000/2);
|
||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x20ba00, 0x20ba07, read16s_delegate(*this, FUNC(segas32_state::brival_protection_r)));
|
||||
m_maincpu->space(AS_PROGRAM).install_write_handler(0xa00000, 0xa00fff, write16sm_delegate(*this, FUNC(segas32_state::brival_protection_w)));
|
||||
|
||||
save_pointer(NAME(m_system32_protram), 0x1000/2);
|
||||
}
|
||||
|
||||
|
||||
|
@ -233,6 +233,7 @@ protected:
|
||||
|
||||
const bool m_is_multi32;
|
||||
|
||||
// internal states
|
||||
uint8_t m_v60_irq_control[0x10];
|
||||
timer_device *m_v60_irq_timer[2];
|
||||
uint8_t m_sound_irq_control[4];
|
||||
@ -242,10 +243,14 @@ protected:
|
||||
sys32_output_callback m_sw1_output;
|
||||
sys32_output_callback m_sw2_output;
|
||||
sys32_output_callback m_sw3_output;
|
||||
|
||||
// hardware specific
|
||||
std::unique_ptr<uint16_t[]> m_system32_protram;
|
||||
uint16_t m_arescue_dsp_io[6];
|
||||
|
||||
// video-related
|
||||
uint16_t m_system32_displayenable[2];
|
||||
uint16_t m_system32_tilebank_external;
|
||||
uint16_t m_arescue_dsp_io[6];
|
||||
std::unique_ptr<cache_entry[]> m_tmap_cache;
|
||||
cache_entry *m_cache_head;
|
||||
layer_info m_layer_data[11];
|
||||
@ -256,6 +261,9 @@ protected:
|
||||
uint8_t m_sprite_control_latched[8];
|
||||
uint8_t m_sprite_control[8];
|
||||
std::unique_ptr<uint32_t[]> m_spriteram_32bit;
|
||||
std::unique_ptr<int32_t[]> m_prev_bgstartx;
|
||||
std::unique_ptr<int32_t[]> m_prev_bgendx;
|
||||
std::unique_ptr<int32_t[]> m_bgcolor_line;
|
||||
typedef void (segas32_state::*prot_vblank_func)();
|
||||
prot_vblank_func m_system32_prot_vblank;
|
||||
int m_print_count;
|
||||
|
@ -268,15 +268,24 @@ void segas32_state::device_start()
|
||||
m_layer_data[bmap].bitmap.allocate(416, 224);
|
||||
m_layer_data[bmap].transparent = make_unique_clear<uint8_t[]>(256);
|
||||
m_layer_data[bmap].num = bmap;
|
||||
|
||||
save_pointer(NAME(m_layer_data[bmap].transparent), 256, bmap);
|
||||
}
|
||||
|
||||
/* allocate pre-rendered solid lines of 0's and ffff's */
|
||||
m_solid_0000 = make_unique_clear<uint16_t[]>(512);
|
||||
m_solid_ffff = make_unique_clear<uint16_t[],0xff>(512);
|
||||
|
||||
memset(m_videoram, 0x00, 0x20000);
|
||||
/* allocate background color per line*/
|
||||
m_prev_bgstartx = std::make_unique<int32_t[]>(512);
|
||||
m_prev_bgendx = std::make_unique<int32_t[]>(512);
|
||||
m_bgcolor_line = std::make_unique<int32_t[]>(512);
|
||||
std::fill_n(&m_prev_bgstartx[0], 512, -1);
|
||||
std::fill_n(&m_prev_bgendx[0], 512, -1);
|
||||
std::fill_n(&m_bgcolor_line[0], 512, -1);
|
||||
|
||||
/* initialize videoram */
|
||||
memset(m_videoram, 0x00, 0x20000);
|
||||
m_videoram[0x1ff00/2] = 0x8000;
|
||||
|
||||
memset(m_mixer_control, 0xff, sizeof(m_mixer_control[0][0]) * 0x80 );
|
||||
@ -284,6 +293,24 @@ void segas32_state::device_start()
|
||||
/* needs to be initialized to 0xff, otherwise f1en has bad sound (MT04531) */
|
||||
if (m_soundram)
|
||||
std::fill_n(&m_soundram[0], m_soundram.bytes() / sizeof(m_soundram[0]), 0xff);
|
||||
|
||||
/* save states */
|
||||
save_item(NAME(m_v60_irq_control));
|
||||
save_item(NAME(m_sound_irq_control));
|
||||
save_item(NAME(m_sound_irq_input));
|
||||
save_item(NAME(m_sound_dummy_value));
|
||||
save_item(NAME(m_sound_bank));
|
||||
|
||||
save_item(NAME(m_mixer_control));
|
||||
save_item(NAME(m_system32_displayenable));
|
||||
save_item(NAME(m_system32_tilebank_external));
|
||||
save_item(NAME(m_sprite_render_count));
|
||||
save_item(NAME(m_sprite_control_latched));
|
||||
save_item(NAME(m_sprite_control));
|
||||
save_pointer(NAME(m_spriteram_32bit), 0x20000/4);
|
||||
save_pointer(NAME(m_prev_bgstartx), 512);
|
||||
save_pointer(NAME(m_prev_bgendx), 512);
|
||||
save_pointer(NAME(m_bgcolor_line), 512);
|
||||
}
|
||||
|
||||
|
||||
@ -1233,9 +1260,15 @@ void segas32_state::update_background(segas32_state::layer_info &layer, const re
|
||||
color = m_videoram[0x1ff5e/2] & 0x1e00;
|
||||
|
||||
/* if the color doesn't match, fill */
|
||||
if (dst[cliprect.min_x] != color)
|
||||
if ((m_bgcolor_line[y & 0x1ff] != color) || (m_prev_bgstartx[y & 0x1ff] != cliprect.min_x) || (m_prev_bgendx[y & 0x1ff] != cliprect.max_x))
|
||||
{
|
||||
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
|
||||
dst[x] = color;
|
||||
|
||||
m_prev_bgstartx[y & 0x1ff] = cliprect.min_x;
|
||||
m_prev_bgendx[y & 0x1ff] = cliprect.max_x;
|
||||
m_bgcolor_line[y & 0x1ff] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user