mirror of
https://github.com/holub/mame
synced 2025-06-03 03:16:30 +03:00
Hooked up NVRAM loading/saving
This commit is contained in:
parent
1dad614294
commit
8b34eaabbd
@ -439,12 +439,13 @@ According to Planet Virtual Boy, the following undumped protos exist
|
||||
</software>
|
||||
|
||||
<!-- Developers: Nintendo R&D1 -->
|
||||
<software name="wariolnd" supported="no">
|
||||
<software name="wariolnd" supported="yes">
|
||||
<description>Virtual Boy Wario Land (USA) ~ Virtual Boy Wario Land - Awazon no Hihou (Jpn)</description>
|
||||
<year>1995</year>
|
||||
<publisher>Nintendo</publisher>
|
||||
<info name="serial" value="VUE-VWCJ-JPN, VUE-VWCJ-USA"/>
|
||||
<info name="release" value="19951201 (JPN), 199511xx (USA)"/>
|
||||
<sharedfeat name="eeprom" value="Yes"/>
|
||||
<part name="cart" interface="vboy_cart">
|
||||
<dataarea name="rom" size="2097152">
|
||||
<rom name="virtual boy wario land (japan, usa).bin" size="2097152" crc="133e9372" sha1="274c328fbd904f20e69172ab826bf8f94ced1bdb" offset="000000" />
|
||||
@ -459,6 +460,7 @@ According to Planet Virtual Boy, the following undumped protos exist
|
||||
<publisher>Ocean</publisher>
|
||||
<info name="serial" value="VUE-VWEE-USA"/>
|
||||
<info name="release" value="19951221"/>
|
||||
<sharedfeat name="eeprom" value="No"/>
|
||||
<part name="cart" interface="vboy_cart">
|
||||
<dataarea name="rom" size="2097152">
|
||||
<rom name="waterworld (usa).bin" size="2097152" crc="82a95e51" sha1="dcc46484bd0acab0ac1ea178f425a0f5ccfb8dc2" offset="000000" />
|
||||
|
@ -1302,7 +1302,7 @@ static CPU_EXECUTE( v810 )
|
||||
|
||||
if (cpustate->irq_state != CLEAR_LINE) {
|
||||
if (!(GET_NP | GET_EP | GET_ID)) {
|
||||
if (cpustate->irq_line >((cpustate->PSW & 0xF0000) >> 16)) {
|
||||
if (cpustate->irq_line >=((cpustate->PSW & 0xF0000) >> 16)) {
|
||||
take_interrupt(cpustate);
|
||||
}
|
||||
}
|
||||
|
@ -133,6 +133,11 @@ public:
|
||||
void m_timer_tick(void);
|
||||
void m_scanline_tick(int scanline, UINT8 screen_type);
|
||||
void m_set_irq(UINT16 irq_vector);
|
||||
UINT8 *m_nvptr;
|
||||
UINT32 m_vboy_sram[0x10000/4];
|
||||
device_t *m_nvimage;
|
||||
DECLARE_READ32_MEMBER(sram_r);
|
||||
DECLARE_WRITE32_MEMBER(sram_w);
|
||||
|
||||
void m_pcg_debug(UINT16 offset,UINT16 data,UINT16 mem_mask);
|
||||
|
||||
@ -1084,8 +1089,8 @@ static ADDRESS_MAP_START( vboy_mem, AS_PROGRAM, 32, vboy_state )
|
||||
AM_RANGE( 0x02000000, 0x0200002b ) AM_MIRROR(0x0ffff00) AM_READWRITE(io_r, io_w) // Hardware control registers mask 0xff
|
||||
//AM_RANGE( 0x04000000, 0x04ffffff ) // Expansion area
|
||||
AM_RANGE( 0x05000000, 0x0500ffff ) AM_MIRROR(0x0ff0000) AM_RAM AM_SHARE("wram")// Main RAM - 64K mask 0xffff
|
||||
AM_RANGE( 0x06000000, 0x06003fff ) AM_RAM AM_SHARE("nvram") // Cart RAM - 8K NVRAM
|
||||
AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_ROM AM_REGION("user1", 0) /* ROM */
|
||||
// AM_RANGE( 0x06000000, 0x06003fff ) AM_RAM AM_SHARE("nvram") // Cart RAM - 8K NVRAM
|
||||
AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_ROM AM_REGION("cartridge", 0) /* ROM */
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( vboy_io, AS_IO, 32, vboy_state )
|
||||
@ -1114,7 +1119,7 @@ static ADDRESS_MAP_START( vboy_io, AS_IO, 32, vboy_state )
|
||||
// AM_RANGE( 0x04000000, 0x04ffffff ) // Expansion area
|
||||
AM_RANGE( 0x05000000, 0x0500ffff ) AM_MIRROR(0x0ff0000) AM_RAM AM_SHARE("wram") // Main RAM - 64K mask 0xffff
|
||||
AM_RANGE( 0x06000000, 0x06003fff ) AM_RAM AM_SHARE("nvram") // Cart RAM - 8K NVRAM
|
||||
AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_ROM AM_REGION("user1", 0) /* ROM */
|
||||
AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_ROM AM_REGION("cartridge", 0) /* ROM */
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/* Input ports */
|
||||
@ -1138,6 +1143,27 @@ static INPUT_PORTS_START( vboy )
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED ) // Battery low
|
||||
INPUT_PORTS_END
|
||||
|
||||
static void vboy_machine_stop(running_machine &machine)
|
||||
{
|
||||
vboy_state *state = machine.driver_data<vboy_state>();
|
||||
|
||||
// only do this if the cart loader detected some form of backup
|
||||
if (state->m_nvptr != NULL)
|
||||
{
|
||||
device_image_interface *image = dynamic_cast<device_image_interface *>(state->m_nvimage);
|
||||
image->battery_save(state->m_nvptr, 0x10000);
|
||||
}
|
||||
}
|
||||
|
||||
static MACHINE_START( vboy )
|
||||
{
|
||||
// vboy_state *state = machine.driver_data<vboy_state>();
|
||||
|
||||
/* add a hook for battery save */
|
||||
machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(vboy_machine_stop),&machine));
|
||||
|
||||
// state->m_vboy_sram = auto_alloc_array(machine, UINT32, 0x10000/4);
|
||||
}
|
||||
|
||||
static MACHINE_RESET(vboy)
|
||||
{
|
||||
@ -1204,7 +1230,8 @@ static TIMER_DEVICE_CALLBACK( timer_pad_tick )
|
||||
{
|
||||
vboy_state *state = timer.machine().driver_data<vboy_state>();
|
||||
|
||||
device_set_input_line(state->m_maincpu, 0, HOLD_LINE);
|
||||
if((state->m_vboy_regs.kcr & 0x80) == 0)
|
||||
device_set_input_line(state->m_maincpu, 0, HOLD_LINE);
|
||||
}
|
||||
|
||||
static PALETTE_INIT( vboy )
|
||||
@ -1313,6 +1340,91 @@ static GFXDECODE_START( vboy )
|
||||
GFXDECODE_ENTRY( "pcg", 0x00000, vboy_pcg_8x8, 0, 1 )
|
||||
GFXDECODE_END
|
||||
|
||||
typedef struct _vboy_pcb vboy_pcb;
|
||||
struct _vboy_pcb
|
||||
{
|
||||
const char *pcb_name;
|
||||
int pcb_id;
|
||||
};
|
||||
|
||||
READ32_MEMBER(vboy_state::sram_r)
|
||||
{
|
||||
return m_vboy_sram[offset];
|
||||
}
|
||||
|
||||
WRITE32_MEMBER(vboy_state::sram_w)
|
||||
{
|
||||
COMBINE_DATA(&m_vboy_sram[offset]);
|
||||
}
|
||||
|
||||
#define VBOY_CHIP_NONE 0
|
||||
#define VBOY_CHIP_SRAM 1
|
||||
|
||||
static const vboy_pcb pcb_list[] =
|
||||
{
|
||||
{"No", VBOY_CHIP_NONE},
|
||||
{"Yes", VBOY_CHIP_SRAM}
|
||||
};
|
||||
|
||||
|
||||
static int vboy_get_pcb_id(const char *pcb)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_LENGTH(pcb_list); i++)
|
||||
{
|
||||
if (!mame_stricmp(pcb_list[i].pcb_name, pcb))
|
||||
return pcb_list[i].pcb_id;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static DEVICE_IMAGE_LOAD( vboy_cart )
|
||||
{
|
||||
vboy_state *state = image.device().machine().driver_data<vboy_state>();
|
||||
UINT32 chip = 0;
|
||||
UINT8 *ROM = image.device().machine().root_device().memregion("cartridge")->base();
|
||||
UINT32 cart_size;
|
||||
|
||||
state->m_nvptr = (UINT8 *)NULL;
|
||||
if (image.software_entry() == NULL)
|
||||
{
|
||||
cart_size = image.length();
|
||||
image.fread(ROM, cart_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *pcb_name;
|
||||
cart_size = image.get_software_region_length("rom");
|
||||
memcpy(ROM, image.get_software_region("rom"), cart_size);
|
||||
|
||||
pcb_name = image.get_feature("eeprom");
|
||||
if (pcb_name == NULL)
|
||||
chip = 0;
|
||||
else
|
||||
chip = vboy_get_pcb_id(pcb_name);
|
||||
|
||||
}
|
||||
|
||||
if(chip & VBOY_CHIP_SRAM)
|
||||
{
|
||||
state->m_nvptr = (UINT8 *)&state->m_vboy_sram;
|
||||
|
||||
image.device().machine().device("maincpu")->memory().space(AS_PROGRAM)->install_read_handler(0x06000000, 0x0600ffff, read32_delegate(FUNC(vboy_state::sram_r),state));
|
||||
image.device().machine().device("maincpu")->memory().space(AS_PROGRAM)->install_write_handler(0x06000000, 0x0600ffff, write32_delegate(FUNC(vboy_state::sram_w),state));
|
||||
|
||||
image.battery_load(state->m_nvptr, 0x10000, 0x00);
|
||||
state->m_nvimage = image;
|
||||
}
|
||||
else
|
||||
{
|
||||
state->m_nvimage = NULL;
|
||||
}
|
||||
|
||||
return IMAGE_INIT_PASS;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( vboy, vboy_state )
|
||||
|
||||
@ -1323,6 +1435,7 @@ static MACHINE_CONFIG_START( vboy, vboy_state )
|
||||
MCFG_TIMER_ADD_SCANLINE("scantimer_l", vboy_scanlineL, "3dleft", 0, 1)
|
||||
//MCFG_TIMER_ADD_SCANLINE("scantimer_r", vboy_scanlineR, "3dright", 0, 1)
|
||||
|
||||
MCFG_MACHINE_START(vboy)
|
||||
MCFG_MACHINE_RESET(vboy)
|
||||
|
||||
// programmable timer
|
||||
@ -1352,6 +1465,7 @@ static MACHINE_CONFIG_START( vboy, vboy_state )
|
||||
MCFG_CARTSLOT_EXTENSION_LIST("vb,bin")
|
||||
MCFG_CARTSLOT_MANDATORY
|
||||
MCFG_CARTSLOT_INTERFACE("vboy_cart")
|
||||
MCFG_CARTSLOT_LOAD(vboy_cart)
|
||||
|
||||
MCFG_GFXDECODE(vboy)
|
||||
|
||||
@ -1367,8 +1481,7 @@ MACHINE_CONFIG_END
|
||||
|
||||
/* ROM definition */
|
||||
ROM_START( vboy )
|
||||
ROM_REGION( 0x200000, "user1", 0 )
|
||||
ROM_CART_LOAD("cart", 0x0000, 0x200000, ROM_MIRROR)
|
||||
ROM_REGION( 0x2000000, "cartridge", ROMREGION_ERASEFF )
|
||||
|
||||
ROM_REGION( 0x8000, "pcg", ROMREGION_ERASE00 )
|
||||
ROM_END
|
||||
|
Loading…
Reference in New Issue
Block a user