cv1k.cpp: some work towards save state support. Should work but it would be better not to save the bitmap, so for the time being it is disabled by default (nw)

This commit is contained in:
Ivan Vangelista 2016-04-01 19:25:57 +02:00
parent daadbc5fd5
commit bfbcdac2a6
6 changed files with 138 additions and 88 deletions

View File

@ -4115,7 +4115,7 @@ void sh34_base_device::device_start()
m_test_irq = 0;
save_item(NAME(m_pc));
save_item(NAME(m_r[15]));
save_item(NAME(m_r));
save_item(NAME(m_sr));
save_item(NAME(m_pr));
save_item(NAME(m_gbr));
@ -4126,59 +4126,20 @@ void sh34_base_device::device_start()
save_item(NAME(m_ssr));
save_item(NAME(m_sgr));
save_item(NAME(m_fpscr));
save_item(NAME(m_r[ 0]));
save_item(NAME(m_r[ 1]));
save_item(NAME(m_r[ 2]));
save_item(NAME(m_r[ 3]));
save_item(NAME(m_r[ 4]));
save_item(NAME(m_r[ 5]));
save_item(NAME(m_r[ 6]));
save_item(NAME(m_r[ 7]));
save_item(NAME(m_r[ 8]));
save_item(NAME(m_r[ 9]));
save_item(NAME(m_r[10]));
save_item(NAME(m_r[11]));
save_item(NAME(m_r[12]));
save_item(NAME(m_r[13]));
save_item(NAME(m_r[14]));
save_item(NAME(m_fr[ 0]));
save_item(NAME(m_fr[ 1]));
save_item(NAME(m_fr[ 2]));
save_item(NAME(m_fr[ 3]));
save_item(NAME(m_fr[ 4]));
save_item(NAME(m_fr[ 5]));
save_item(NAME(m_fr[ 6]));
save_item(NAME(m_fr[ 7]));
save_item(NAME(m_fr[ 8]));
save_item(NAME(m_fr[ 9]));
save_item(NAME(m_fr[10]));
save_item(NAME(m_fr[11]));
save_item(NAME(m_fr[12]));
save_item(NAME(m_fr[13]));
save_item(NAME(m_fr[14]));
save_item(NAME(m_fr[15]));
save_item(NAME(m_xf[ 0]));
save_item(NAME(m_xf[ 1]));
save_item(NAME(m_xf[ 2]));
save_item(NAME(m_xf[ 3]));
save_item(NAME(m_xf[ 4]));
save_item(NAME(m_xf[ 5]));
save_item(NAME(m_xf[ 6]));
save_item(NAME(m_xf[ 7]));
save_item(NAME(m_xf[ 8]));
save_item(NAME(m_xf[ 9]));
save_item(NAME(m_xf[10]));
save_item(NAME(m_xf[11]));
save_item(NAME(m_xf[12]));
save_item(NAME(m_xf[13]));
save_item(NAME(m_xf[14]));
save_item(NAME(m_xf[15]));
save_item(NAME(m_rbnk));
save_item(NAME(m_fr));
save_item(NAME(m_xf));
save_item(NAME(m_ea));
save_item(NAME(m_delay));
save_item(NAME(m_cpu_off));
save_item(NAME(m_pending_irq));
save_item(NAME(m_test_irq));
save_item(NAME(m_fpul));
save_item(NAME(m_dbr));
save_item(NAME(m_exception_priority));
save_item(NAME(m_exception_requesting));
save_item(NAME(m_irq_line_state));
save_item(NAME(m_m));
save_item(NAME(m_SH4_TSTR));
save_item(NAME(m_SH4_TCNT0));
save_item(NAME(m_SH4_TCNT1));
@ -4191,10 +4152,48 @@ void sh34_base_device::device_start()
save_item(NAME(m_SH4_TCOR2));
save_item(NAME(m_SH4_TOCR));
save_item(NAME(m_SH4_TCPR2));
save_item(NAME(m_SH4_IPRA));
save_item(NAME(m_SH4_IPRC));
save_item(NAME(m_SH4_DAR0));
save_item(NAME(m_SH4_DAR1));
save_item(NAME(m_SH4_DAR2));
save_item(NAME(m_SH4_DAR3));
save_item(NAME(m_SH4_CHCR0));
save_item(NAME(m_SH4_CHCR1));
save_item(NAME(m_SH4_CHCR2));
save_item(NAME(m_SH4_CHCR3));
save_item(NAME(m_SH4_DMATCR0));
save_item(NAME(m_SH4_DMATCR1));
save_item(NAME(m_SH4_DMATCR2));
save_item(NAME(m_SH4_DMATCR3));
save_item(NAME(m_SH4_DMAOR));
save_item(NAME(m_nmi_line_state));
save_item(NAME(m_sleep_mode));
save_item(NAME(m_frt_input));
save_item(NAME(m_irln));
save_item(NAME(m_internal_irq_level));
save_item(NAME(m_internal_irq_vector));
save_item(NAME(m_refresh_timer_base));
save_item(NAME(m_dma_timer_active));
save_item(NAME(m_dma_source));
save_item(NAME(m_dma_destination));
save_item(NAME(m_dma_count));
save_item(NAME(m_dma_wordsize));
save_item(NAME(m_dma_source_increment));
save_item(NAME(m_dma_destination_increment));
save_item(NAME(m_dma_mode));
save_item(NAME(m_sh4_icount));
save_item(NAME(m_fpu_sz));
save_item(NAME(m_fpu_pr));
save_item(NAME(m_ioport16_pullup));
save_item(NAME( m_ioport16_direction));
save_item(NAME(m_ioport4_pullup));
save_item(NAME(m_ioport4_direction));
save_item(NAME(m_sh4_tlb_address));
save_item(NAME(m_sh4_tlb_data));
save_item(NAME(m_sh4_mmu_enabled));
save_item(NAME(m_sh3internal_upper));
save_item(NAME(m_sh3internal_lower));
// Debugger state

View File

@ -15,6 +15,8 @@
#include "machine/rtc9701.h"
ALLOW_SAVE_TYPE(rtc9701_state_t);
//**************************************************************************
// GLOBAL VARIABLES
@ -104,6 +106,25 @@ void rtc9701_device::device_start()
rtc_state = RTC9701_CMD_WAIT;
cmd_stream_pos = 0;
current_cmd = 0;
save_item(NAME(m_latch));
save_item(NAME(m_reset_line));
save_item(NAME(m_clock_line));
save_item(NAME(rtc_state));
save_item(NAME(cmd_stream_pos));
save_item(NAME(current_cmd));
save_item(NAME(rtc9701_address_pos));
save_item(NAME(rtc9701_current_address));
save_item(NAME(rtc9701_current_data));
save_item(NAME(rtc9701_data_pos));
save_item(NAME(rtc9701_data));
save_item(NAME(m_rtc.sec));
save_item(NAME(m_rtc.min));
save_item(NAME(m_rtc.hour));
save_item(NAME(m_rtc.day));
save_item(NAME(m_rtc.wday));
save_item(NAME(m_rtc.month));
save_item(NAME(m_rtc.year));
}

View File

@ -9,6 +9,7 @@
#include "machine/serflash.h"
ALLOW_SAVE_TYPE(flash_state_t);
//**************************************************************************
// LIVE DEVICE
@ -42,12 +43,27 @@ void serflash_device::device_start()
m_flashwritemap.resize(m_length / FLASH_PAGE_SIZE);
memset(&m_flashwritemap[0], 0, m_length / FLASH_PAGE_SIZE);
save_item(NAME(m_flash_state));
save_item(NAME(m_flash_enab));
save_item(NAME(m_flash_cmd_seq));
save_item(NAME(m_flash_cmd_prev));
save_item(NAME(m_flash_addr_seq));
save_item(NAME(m_flash_read_seq));
save_item(NAME(m_flash_row));
save_item(NAME(m_flash_col));
save_item(NAME(m_flash_page_addr));
save_item(NAME(m_flash_page_index));
save_item(NAME(m_flashwritemap));
save_item(NAME(m_last_flash_cmd));
save_item(NAME(m_flash_addr));
save_item(NAME(m_flash_page_data));
}
void serflash_device::device_reset()
{
m_flash_enab = 0;
flash_hard_reset(machine());
flash_hard_reset();
m_last_flash_cmd = 0x00;
m_flash_addr_seq = 0;
@ -115,7 +131,7 @@ void serflash_device::nvram_write(emu_file &file)
file.write(&page, 4);
}
void serflash_device::flash_hard_reset(running_machine &machine)
void serflash_device::flash_hard_reset()
{
// logerror("%08x FLASH: RESET\n", cpuexec_describe_context(machine));
@ -141,7 +157,7 @@ WRITE8_MEMBER( serflash_device::flash_enab_w )
m_flash_enab = data;
}
void serflash_device::flash_change_state(running_machine &machine, flash_state_t state)
void serflash_device::flash_change_state(flash_state_t state)
{
m_flash_state = state;
@ -176,7 +192,7 @@ WRITE8_MEMBER( serflash_device::flash_cmd_w )
break;
case 0x70: // READ STATUS
flash_change_state( space.machine(), STATE_READ_STATUS );
flash_change_state( STATE_READ_STATUS );
break;
case 0x80: // PAGE / CACHE PROGRAM
@ -186,11 +202,11 @@ WRITE8_MEMBER( serflash_device::flash_cmd_w )
break;
case 0x90: // READ ID
flash_change_state( space.machine(), STATE_READ_ID );
flash_change_state( STATE_READ_ID );
break;
case 0xff: // RESET
flash_change_state( space.machine(), STATE_IDLE );
flash_change_state( STATE_IDLE );
break;
default:
@ -210,7 +226,7 @@ WRITE8_MEMBER( serflash_device::flash_cmd_w )
m_flash_page_addr = m_flash_col;
m_flash_page_index = m_flash_row;
flash_change_state( space.machine(), STATE_READ );
flash_change_state( STATE_READ );
//logerror("%08x FLASH: caching page = %04X\n", m_maincpu->pc(), m_flash_row);
}
@ -219,7 +235,7 @@ WRITE8_MEMBER( serflash_device::flash_cmd_w )
case 0x60: // BLOCK ERASE
if (data==0xd0)
{
flash_change_state( space.machine(), STATE_BLOCK_ERASE );
flash_change_state( STATE_BLOCK_ERASE );
m_flashwritemap[m_flash_col] |= 1;
memset(m_region + m_flash_col * FLASH_PAGE_SIZE, 0xff, FLASH_PAGE_SIZE);
//logerror("erased block %04x (%08x - %08x)\n", m_flash_col, m_flash_col * FLASH_PAGE_SIZE, ((m_flash_col+1) * FLASH_PAGE_SIZE)-1);
@ -232,7 +248,7 @@ WRITE8_MEMBER( serflash_device::flash_cmd_w )
case 0x80:
if (data==0x10)
{
flash_change_state( space.machine(), STATE_PAGE_PROGRAM );
flash_change_state( STATE_PAGE_PROGRAM );
m_flashwritemap[m_flash_row] |= (memcmp(m_region + m_flash_row * FLASH_PAGE_SIZE, m_flash_page_data, FLASH_PAGE_SIZE) != 0);
memcpy(m_region + m_flash_row * FLASH_PAGE_SIZE, m_flash_page_data, FLASH_PAGE_SIZE);
//logerror("re-written block %04x (%08x - %08x)\n", m_flash_row, m_flash_row * FLASH_PAGE_SIZE, ((m_flash_row+1) * FLASH_PAGE_SIZE)-1);

View File

@ -50,7 +50,7 @@ public:
DECLARE_WRITE8_MEMBER( flash_data_w );
DECLARE_WRITE8_MEMBER( flash_cmd_w );
DECLARE_WRITE8_MEMBER( flash_enab_w );
void flash_hard_reset(running_machine &machine);
void flash_hard_reset();
DECLARE_READ8_MEMBER(n3d_flash_r);
DECLARE_WRITE8_MEMBER(n3d_flash_cmd_w);
@ -66,7 +66,7 @@ protected:
virtual void nvram_read(emu_file &file) override;
virtual void nvram_write(emu_file &file) override;
void flash_change_state(running_machine &machine, flash_state_t state);
void flash_change_state(flash_state_t state);
// runtime state
size_t m_length;

View File

@ -49,6 +49,20 @@ void epic12_device::device_start()
m_blitter_delay_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(epic12_device::blitter_delay_callback),this));
m_blitter_delay_timer->adjust(attotime::never);
save_item(NAME(m_gfx_addr));
save_item(NAME(m_gfx_scroll_0_x));
save_item(NAME(m_gfx_scroll_0_y));
save_item(NAME(m_gfx_scroll_1_x));
save_item(NAME(m_gfx_scroll_1_y));
save_item(NAME(m_delay_scale));
save_item(NAME(m_gfx_addr_shadowcopy));
save_item(NAME(m_gfx_scroll_0_x_shadowcopy));
save_item(NAME(m_gfx_scroll_0_y_shadowcopy));
save_item(NAME(m_gfx_scroll_1_x_shadowcopy));
save_item(NAME(m_gfx_scroll_1_y_shadowcopy));
save_pointer(NAME(m_ram16_copy.get()), m_main_ramsize/2);
save_item(NAME(*m_bitmaps));
}
void epic12_device::device_reset()

View File

@ -207,18 +207,18 @@ public:
required_shared_ptr<UINT64> m_ram;
required_shared_ptr<UINT64> m_rombase;
DECLARE_READ8_MEMBER(cv1k_flash_io_r);
DECLARE_WRITE8_MEMBER(cv1k_flash_io_w);
DECLARE_READ8_MEMBER(flash_io_r);
DECLARE_WRITE8_MEMBER(flash_io_w);
DECLARE_READ8_MEMBER(serial_rtc_eeprom_r);
DECLARE_WRITE8_MEMBER(serial_rtc_eeprom_w);
DECLARE_READ64_MEMBER(cv1k_flash_port_e_r);
DECLARE_READ64_MEMBER(flash_port_e_r);
UINT32 screen_update_cv1k(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual void machine_reset() override;
/* game specific */
DECLARE_READ64_MEMBER(cv1k_speedup_r);
DECLARE_READ64_MEMBER(speedup_r);
DECLARE_DRIVER_INIT(mushisam);
DECLARE_DRIVER_INIT(ibara);
DECLARE_DRIVER_INIT(espgal2);
@ -232,13 +232,13 @@ public:
UINT32 m_idleramoffs;
UINT32 m_idlepc;
void install_cv1k_speedups(UINT32 idleramoff, UINT32 idlepc, bool is_typed);
void install_speedups(UINT32 idleramoff, UINT32 idlepc, bool is_typed);
};
/**************************************************************************/
UINT32 cv1k_state::screen_update_cv1k(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
UINT32 cv1k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
m_blitter->set_delay_scale(m_blitrate->read());
@ -249,13 +249,13 @@ UINT32 cv1k_state::screen_update_cv1k(screen_device &screen, bitmap_rgb32 &bitma
// FLASH interface
READ64_MEMBER( cv1k_state::cv1k_flash_port_e_r )
READ64_MEMBER( cv1k_state::flash_port_e_r )
{
return ((m_serflash->flash_ready_r(space, offset) ? 0x20 : 0x00)) | 0xdf;
}
READ8_MEMBER( cv1k_state::cv1k_flash_io_r )
READ8_MEMBER( cv1k_state::flash_io_r )
{
switch (offset)
{
@ -268,7 +268,7 @@ READ8_MEMBER( cv1k_state::cv1k_flash_io_r )
case 0x06:
case 0x07:
// logerror("cv1k_flash_io_r offset %04x\n", offset);
// logerror("flash_io_r offset %04x\n", offset);
return 0xff;
case 0x00:
@ -276,13 +276,13 @@ READ8_MEMBER( cv1k_state::cv1k_flash_io_r )
}
}
WRITE8_MEMBER( cv1k_state::cv1k_flash_io_w )
WRITE8_MEMBER( cv1k_state::flash_io_w )
{
switch (offset)
{
default:
case 0x03:
logerror("unknown cv1k_flash_io_w offset %04x data %02x\n", offset, data); // 03 enable/disable fgpa access?
logerror("unknown flash_io_w offset %04x data %02x\n", offset, data); // 03 enable/disable fgpa access?
break;
case 0x00:
@ -336,7 +336,7 @@ WRITE8_MEMBER( cv1k_state::serial_rtc_eeprom_w )
static ADDRESS_MAP_START( cv1k_map, AS_PROGRAM, 64, cv1k_state )
AM_RANGE(0x00000000, 0x003fffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITENOP AM_SHARE("rombase") // mmmbanc writes here on startup for some reason..
AM_RANGE(0x0c000000, 0x0c7fffff) AM_RAM AM_SHARE("mainram") AM_MIRROR(0x800000) // work RAM
AM_RANGE(0x10000000, 0x10000007) AM_READWRITE8(cv1k_flash_io_r, cv1k_flash_io_w, U64(0xffffffffffffffff))
AM_RANGE(0x10000000, 0x10000007) AM_READWRITE8(flash_io_r, flash_io_w, U64(0xffffffffffffffff))
AM_RANGE(0x10400000, 0x10400007) AM_DEVWRITE8("ymz770", ymz770_device, write, U64(0xffffffffffffffff))
AM_RANGE(0x10C00000, 0x10C00007) AM_READWRITE8(serial_rtc_eeprom_r, serial_rtc_eeprom_w, U64(0xffffffffffffffff))
// AM_RANGE(0x18000000, 0x18000057) // blitter, installed on reset
@ -346,7 +346,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( cv1k_d_map, AS_PROGRAM, 64, cv1k_state )
AM_RANGE(0x00000000, 0x003fffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITENOP AM_SHARE("rombase") // mmmbanc writes here on startup for some reason..
AM_RANGE(0x0c000000, 0x0cffffff) AM_RAM AM_SHARE("mainram") // work RAM
AM_RANGE(0x10000000, 0x10000007) AM_READWRITE8(cv1k_flash_io_r, cv1k_flash_io_w, U64(0xffffffffffffffff))
AM_RANGE(0x10000000, 0x10000007) AM_READWRITE8(flash_io_r, flash_io_w, U64(0xffffffffffffffff))
AM_RANGE(0x10400000, 0x10400007) AM_DEVWRITE8("ymz770", ymz770_device, write, U64(0xffffffffffffffff))
AM_RANGE(0x10C00000, 0x10C00007) AM_READWRITE8(serial_rtc_eeprom_r, serial_rtc_eeprom_w, U64(0xffffffffffffffff))
// AM_RANGE(0x18000000, 0x18000057) // blitter, installed on reset
@ -356,7 +356,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( cv1k_port, AS_IO, 64, cv1k_state )
AM_RANGE(SH3_PORT_C, SH3_PORT_C+7) AM_READ_PORT("PORT_C")
AM_RANGE(SH3_PORT_D, SH3_PORT_D+7) AM_READ_PORT("PORT_D")
AM_RANGE(SH3_PORT_E, SH3_PORT_E+7) AM_READ( cv1k_flash_port_e_r )
AM_RANGE(SH3_PORT_E, SH3_PORT_E+7) AM_READ( flash_port_e_r )
AM_RANGE(SH3_PORT_F, SH3_PORT_F+7) AM_READ_PORT("PORT_F")
AM_RANGE(SH3_PORT_L, SH3_PORT_L+7) AM_READ_PORT("PORT_L")
AM_RANGE(SH3_PORT_J, SH3_PORT_J+7) AM_DEVREADWRITE( "blitter", epic12_device, fpga_r, fpga_w )
@ -455,7 +455,7 @@ static MACHINE_CONFIG_START( cv1k, cv1k_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(0x200, 0x200)
MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xf0-1)
MCFG_SCREEN_UPDATE_DRIVER(cv1k_state, screen_update_cv1k)
MCFG_SCREEN_UPDATE_DRIVER(cv1k_state, screen_update)
MCFG_PALETTE_ADD("palette", 0x10000)
@ -828,18 +828,18 @@ ROM_START( dfkbl )
ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(31f9eb0a) SHA1(322158779e969bb321241065dd49c1167b91ff6c) )
ROM_END
READ64_MEMBER( cv1k_state::cv1k_speedup_r )
READ64_MEMBER( cv1k_state::speedup_r )
{
if (m_maincpu->pc()== m_idlepc ) m_maincpu->spin_until_time( attotime::from_usec(10));
return m_ram[m_idleramoffs/8];
}
void cv1k_state::install_cv1k_speedups(UINT32 idleramoff, UINT32 idlepc, bool is_typed)
void cv1k_state::install_speedups(UINT32 idleramoff, UINT32 idlepc, bool is_typed)
{
m_idleramoffs = idleramoff;
m_idlepc = idlepc;
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000000+m_idleramoffs, 0xc000000+m_idleramoffs+7, read64_delegate(FUNC(cv1k_state::cv1k_speedup_r),this));
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000000+m_idleramoffs, 0xc000000+m_idleramoffs+7, read64_delegate(FUNC(cv1k_state::speedup_r),this));
m_maincpu->add_fastram(0x00000000, 0x003fffff, TRUE, m_rombase);
@ -850,37 +850,37 @@ void cv1k_state::install_cv1k_speedups(UINT32 idleramoff, UINT32 idlepc, bool is
DRIVER_INIT_MEMBER(cv1k_state,mushisam)
{
install_cv1k_speedups(0x024d8, 0xc04a2aa, false);
install_speedups(0x024d8, 0xc04a2aa, false);
}
DRIVER_INIT_MEMBER(cv1k_state,ibara)
{
install_cv1k_speedups(0x022f0, 0xc04a0aa, false);
install_speedups(0x022f0, 0xc04a0aa, false);
}
DRIVER_INIT_MEMBER(cv1k_state,espgal2)
{
install_cv1k_speedups(0x02310, 0xc05177a, false);
install_speedups(0x02310, 0xc05177a, false);
}
DRIVER_INIT_MEMBER(cv1k_state,mushitam)
{
install_cv1k_speedups(0x0022f0, 0xc04a0da, false);
install_speedups(0x0022f0, 0xc04a0da, false);
}
DRIVER_INIT_MEMBER(cv1k_state,pinkswts)
{
install_cv1k_speedups(0x02310, 0xc05176a, false);
install_speedups(0x02310, 0xc05176a, false);
}
DRIVER_INIT_MEMBER(cv1k_state,deathsml)
{
install_cv1k_speedups(0x02310, 0xc0519a2, false);
install_speedups(0x02310, 0xc0519a2, false);
}
DRIVER_INIT_MEMBER(cv1k_state,dpddfk)
{
install_cv1k_speedups(0x02310, 0xc1d1346, true);
install_speedups(0x02310, 0xc1d1346, true);
}