From 6ce39d0260897abae35d1eb5a4706f531b4aa91c Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Sun, 21 Sep 2014 07:43:38 +0000 Subject: [PATCH] added 32bit rom accesses to generic slot and converted pockstat and casloopy to use the slot code. nw. --- src/emu/bus/generic/rom.c | 16 ++++- src/emu/bus/generic/rom.h | 2 + src/emu/bus/generic/slot.c | 12 ++++ src/emu/bus/generic/slot.h | 5 +- src/mess/drivers/casloopy.c | 118 +++++++++++++++++++++--------------- src/mess/drivers/pockstat.c | 88 +++++++++++++-------------- 6 files changed, 145 insertions(+), 96 deletions(-) diff --git a/src/emu/bus/generic/rom.c b/src/emu/bus/generic/rom.c index 632b6398d5c..1b3fbcae4c5 100644 --- a/src/emu/bus/generic/rom.c +++ b/src/emu/bus/generic/rom.c @@ -10,7 +10,6 @@ TODO: - possibly support linear mapping when non-power of 2 ROMs are mapped - - add support for 32bit ROM access ***********************************************************************************************************/ @@ -64,6 +63,15 @@ READ16_MEMBER(generic_rom_plain_device::read16_rom) return 0xffff; } +READ32_MEMBER(generic_rom_plain_device::read32_rom) +{ + UINT32 *ROM = (UINT32 *)m_rom; + if (offset < m_rom_size/4) + return ROM[offset]; + else + return 0xffffffff; +} + READ8_MEMBER(generic_rom_linear_device::read_rom) { @@ -76,3 +84,9 @@ READ16_MEMBER(generic_rom_linear_device::read16_rom) return ROM[offset % (m_rom_size/2)]; } +READ32_MEMBER(generic_rom_linear_device::read32_rom) +{ + UINT32 *ROM = (UINT32 *)m_rom; + return ROM[offset % (m_rom_size/4)]; +} + diff --git a/src/emu/bus/generic/rom.h b/src/emu/bus/generic/rom.h index 24f9962d07a..6b6129647a9 100644 --- a/src/emu/bus/generic/rom.h +++ b/src/emu/bus/generic/rom.h @@ -29,6 +29,7 @@ public: // reading and writing virtual DECLARE_READ8_MEMBER(read_rom); virtual DECLARE_READ16_MEMBER(read16_rom); + virtual DECLARE_READ32_MEMBER(read32_rom); }; @@ -43,6 +44,7 @@ public: // reading and writing virtual DECLARE_READ8_MEMBER(read_rom); virtual DECLARE_READ16_MEMBER(read16_rom); + virtual DECLARE_READ32_MEMBER(read32_rom); }; diff --git a/src/emu/bus/generic/slot.c b/src/emu/bus/generic/slot.c index 0f4266a6a8f..4b4ea07e2f6 100644 --- a/src/emu/bus/generic/slot.c +++ b/src/emu/bus/generic/slot.c @@ -245,6 +245,18 @@ READ16_MEMBER(generic_slot_device::read16_rom) return 0xffff; } +/*------------------------------------------------- + read32_rom + -------------------------------------------------*/ + +READ32_MEMBER(generic_slot_device::read32_rom) +{ + if (m_cart) + return m_cart->read32_rom(space, offset, mem_mask); + else + return 0xffffffff; +} + /*------------------------------------------------- read_ram -------------------------------------------------*/ diff --git a/src/emu/bus/generic/slot.h b/src/emu/bus/generic/slot.h index 6dc9dc702b4..f04db757018 100644 --- a/src/emu/bus/generic/slot.h +++ b/src/emu/bus/generic/slot.h @@ -18,6 +18,7 @@ public: // reading and writing virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; } virtual DECLARE_READ16_MEMBER(read16_rom) { return 0xffff; } + virtual DECLARE_READ32_MEMBER(read32_rom) { return 0xffffffff; } virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; } virtual DECLARE_WRITE8_MEMBER(write_ram) {}; @@ -41,7 +42,8 @@ public: enum { GENERIC_ROM8_WIDTH = 1, - GENERIC_ROM16_WIDTH + GENERIC_ROM16_WIDTH = 2, + GENERIC_ROM32_WIDTH = 4 }; #define GENERIC_ROM_REGION_TAG ":cart:rom" @@ -120,6 +122,7 @@ public: // reading and writing virtual DECLARE_READ8_MEMBER(read_rom); virtual DECLARE_READ16_MEMBER(read16_rom); + virtual DECLARE_READ32_MEMBER(read32_rom); virtual DECLARE_READ8_MEMBER(read_ram); virtual DECLARE_WRITE8_MEMBER(write_ram); diff --git a/src/mess/drivers/casloopy.c b/src/mess/drivers/casloopy.c index 028756debdb..ccdbee1a1d9 100644 --- a/src/mess/drivers/casloopy.c +++ b/src/mess/drivers/casloopy.c @@ -150,7 +150,8 @@ PCB 'Z545-1 A240570-1' #include "emu.h" #include "cpu/sh2/sh2.h" //#include "cpu/v60/v60.h" -#include "imagedev/cartslot.h" +#include "bus/generic/slot.h" +#include "bus/generic/carts.h" class casloopy_state : public driver_device @@ -161,11 +162,17 @@ public: m_bios_rom(*this, "bios_rom"), m_vregs(*this, "vregs"), m_maincpu(*this, "maincpu"), + m_cart(*this, "cartslot"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette") { } required_shared_ptr m_bios_rom; required_shared_ptr m_vregs; + required_device m_maincpu; + required_device m_cart; + required_device m_gfxdecode; + required_device m_palette; + UINT16 *m_paletteram; UINT8 *m_vram; UINT8 *m_bitmap_vram; @@ -176,19 +183,18 @@ public: virtual void machine_reset(); virtual void video_start(); UINT32 screen_update_casloopy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - DECLARE_READ16_MEMBER(casloopy_vregs_r); - DECLARE_WRITE16_MEMBER(casloopy_vregs_w); - DECLARE_READ16_MEMBER(casloopy_pal_r); - DECLARE_WRITE16_MEMBER(casloopy_pal_w); - DECLARE_READ8_MEMBER(casloopy_vram_r); - DECLARE_WRITE8_MEMBER(casloopy_vram_w); + DECLARE_READ16_MEMBER(vregs_r); + DECLARE_WRITE16_MEMBER(vregs_w); + DECLARE_READ16_MEMBER(pal_r); + DECLARE_WRITE16_MEMBER(pal_w); + DECLARE_READ8_MEMBER(vram_r); + DECLARE_WRITE8_MEMBER(vram_w); + DECLARE_READ32_MEMBER(cart_r); DECLARE_READ16_MEMBER(sh7021_r); DECLARE_WRITE16_MEMBER(sh7021_w); - DECLARE_READ8_MEMBER(casloopy_bitmap_r); - DECLARE_WRITE8_MEMBER(casloopy_bitmap_w); - required_device m_maincpu; - required_device m_gfxdecode; - required_device m_palette; + DECLARE_READ8_MEMBER(bitmap_r); + DECLARE_WRITE8_MEMBER(bitmap_w); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(loopy_cart); }; @@ -292,7 +298,7 @@ UINT32 casloopy_state::screen_update_casloopy(screen_device &screen, bitmap_ind1 return 0; } -READ16_MEMBER(casloopy_state::casloopy_vregs_r) +READ16_MEMBER(casloopy_state::vregs_r) { if(offset == 4/2) { @@ -310,18 +316,18 @@ READ16_MEMBER(casloopy_state::casloopy_vregs_r) return 0xffff; } -WRITE16_MEMBER(casloopy_state::casloopy_vregs_w) +WRITE16_MEMBER(casloopy_state::vregs_w) { if(offset != 6/2) printf("%08x %08x\n",offset*2,data); } -READ16_MEMBER(casloopy_state::casloopy_pal_r) +READ16_MEMBER(casloopy_state::pal_r) { return m_paletteram[offset]; } -WRITE16_MEMBER(casloopy_state::casloopy_pal_w) +WRITE16_MEMBER(casloopy_state::pal_w) { int r,g,b; COMBINE_DATA(&m_paletteram[offset]); @@ -333,12 +339,12 @@ WRITE16_MEMBER(casloopy_state::casloopy_pal_w) m_palette->set_pen_color(offset, pal5bit(r), pal5bit(g), pal5bit(b)); } -READ8_MEMBER(casloopy_state::casloopy_vram_r) +READ8_MEMBER(casloopy_state::vram_r) { return m_vram[offset]; } -WRITE8_MEMBER(casloopy_state::casloopy_vram_w) +WRITE8_MEMBER(casloopy_state::vram_w) { m_vram[offset] = data; @@ -387,31 +393,37 @@ WRITE16_MEMBER(casloopy_state::sh7021_w) // printf("%08x %04x\n",sh7021_regs[offset],0x05ffff00+offset*2); } -READ8_MEMBER(casloopy_state::casloopy_bitmap_r) +READ8_MEMBER(casloopy_state::bitmap_r) { return m_bitmap_vram[offset]; } -WRITE8_MEMBER(casloopy_state::casloopy_bitmap_w) +WRITE8_MEMBER(casloopy_state::bitmap_w) { m_bitmap_vram[offset] = data; } +READ32_MEMBER(casloopy_state::cart_r) +{ + return m_cart->read32_rom(space, offset, mem_mask); +} + + static ADDRESS_MAP_START( casloopy_map, AS_PROGRAM, 32, casloopy_state ) AM_RANGE(0x00000000, 0x00007fff) AM_RAM AM_SHARE("bios_rom") AM_RANGE(0x01000000, 0x0107ffff) AM_RAM AM_SHARE("wram")// stack pointer points here - AM_RANGE(0x04000000, 0x0401ffff) AM_READWRITE8(casloopy_bitmap_r,casloopy_bitmap_w,0xffffffff) - AM_RANGE(0x04040000, 0x0404ffff) AM_READWRITE8(casloopy_vram_r,casloopy_vram_w,0xffffffff) // tilemap + PCG + AM_RANGE(0x04000000, 0x0401ffff) AM_READWRITE8(bitmap_r, bitmap_w, 0xffffffff) + AM_RANGE(0x04040000, 0x0404ffff) AM_READWRITE8(vram_r, vram_w, 0xffffffff) // tilemap + PCG AM_RANGE(0x04050000, 0x040503ff) AM_RAM // ??? - AM_RANGE(0x04051000, 0x040511ff) AM_READWRITE16(casloopy_pal_r,casloopy_pal_w,0xffffffff) - AM_RANGE(0x04058000, 0x04058007) AM_READWRITE16(casloopy_vregs_r,casloopy_vregs_w,0xffffffff) + AM_RANGE(0x04051000, 0x040511ff) AM_READWRITE16(pal_r, pal_w, 0xffffffff) + AM_RANGE(0x04058000, 0x04058007) AM_READWRITE16(vregs_r, vregs_w, 0xffffffff) AM_RANGE(0x0405b000, 0x0405b00f) AM_RAM AM_SHARE("vregs") // RGB555 brightness control plus scrolling - AM_RANGE(0x05ffff00, 0x05ffffff) AM_READWRITE16(sh7021_r,sh7021_w,0xffffffff) + AM_RANGE(0x05ffff00, 0x05ffffff) AM_READWRITE16(sh7021_r, sh7021_w, 0xffffffff) // AM_RANGE(0x05ffff00, 0x05ffffff) - SH7021 internal i/o - AM_RANGE(0x06000000, 0x061fffff) AM_ROM AM_REGION("rom_cart",0) + AM_RANGE(0x06000000, 0x061fffff) AM_READ(cart_r) AM_RANGE(0x07000000, 0x070003ff) AM_RAM AM_SHARE("oram")// on-chip RAM, actually at 0xf000000 (1 kb) AM_RANGE(0x09000000, 0x0907ffff) AM_RAM AM_SHARE("wram") - AM_RANGE(0x0e000000, 0x0e1fffff) AM_ROM AM_REGION("rom_cart",0) + AM_RANGE(0x0e000000, 0x0e1fffff) AM_READ(cart_r) AM_RANGE(0x0f000000, 0x0f0003ff) AM_RAM AM_SHARE("oram") ADDRESS_MAP_END @@ -424,22 +436,8 @@ ADDRESS_MAP_END static INPUT_PORTS_START( casloopy ) INPUT_PORTS_END -/* TODO: move this into DEVICE_IMAGE_LOAD_MEMBER */ void casloopy_state::machine_start() { - UINT8 *SRC = memregion("cart")->base(); - UINT8 *DST = memregion("rom_cart")->base(); - - // fix endianness - for (int i=0;i<0x200000;i+=4) - { - UINT8 tempa = SRC[i+0]; - UINT8 tempb = SRC[i+1]; - DST[i+0] = SRC[i+2]; - DST[i+1] = SRC[i+3]; - DST[i+2] = tempa; - DST[i+3] = tempb; - } } void casloopy_state::machine_reset() @@ -474,7 +472,32 @@ static const gfx_layout casloopy_8bpp_layoutROM = #endif +DEVICE_IMAGE_LOAD_MEMBER( casloopy_state, loopy_cart ) +{ + UINT32 size = m_cart->common_get_size("rom"); + UINT8 *SRC, *DST; + dynamic_buffer temp; + temp.resize(0x200000); + + m_cart->rom_alloc(size, GENERIC_ROM32_WIDTH); + SRC = temp; + DST = m_cart->get_rom_base(); + m_cart->common_load_rom(temp, size, "rom"); + + // fix endianness + for (int i = 0; i < 0x200000; i += 4) + { + UINT8 tempa = SRC[i + 0]; + UINT8 tempb = SRC[i + 1]; + DST[i + 0] = SRC[i + 2]; + DST[i + 1] = SRC[i + 3]; + DST[i + 2] = tempa; + DST[i + 3] = tempb; + } + + return IMAGE_INIT_PASS; +} static MACHINE_CONFIG_START( casloopy, casloopy_state ) @@ -500,10 +523,10 @@ static MACHINE_CONFIG_START( casloopy, casloopy_state ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty) - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("ic1,bin") - MCFG_CARTSLOT_MANDATORY - MCFG_CARTSLOT_INTERFACE("loopy_cart") + MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM32_WIDTH, generic_plain_slot, "loopy_cart") + MCFG_GENERIC_EXTENSIONS("bin,ic1") + MCFG_GENERIC_MANDATORY + MCFG_GENERIC_LOAD(casloopy_state, loopy_cart) /* software lists */ MCFG_SOFTWARE_LIST_ADD("cart_list","casloopy") @@ -524,11 +547,6 @@ ROM_START( casloopy ) ROM_REGION( 0x80000, "subcpu", 0) //NEC CDT-109 ROM_LOAD( "bios2.lsi352", 0x0000, 0x80000, CRC(8f51fa17) SHA1(99f50be06b083fdb07e08f30b0b26d9037afc869) ) - - ROM_REGION( 0x200000, "cart", 0 ) - ROM_CART_LOAD("cart", 0x00000, 0x200000, ROM_NOMIRROR) - - ROM_REGION( 0x200000, "rom_cart", ROMREGION_ERASE00 ) ROM_END DRIVER_INIT_MEMBER(casloopy_state,casloopy) diff --git a/src/mess/drivers/pockstat.c b/src/mess/drivers/pockstat.c index 274b3a97ff7..ba527d2f178 100644 --- a/src/mess/drivers/pockstat.c +++ b/src/mess/drivers/pockstat.c @@ -41,9 +41,11 @@ If you do nothing for about 20 secs, it turns itself off (screen goes white). #include "emu.h" #include "cpu/arm7/arm7.h" #include "cpu/arm7/arm7core.h" -#include "imagedev/cartslot.h" #include "sound/dac.h" +#include "bus/generic/slot.h" +#include "bus/generic/carts.h" + #define MAX_PS_TIMERS 3 struct ps_ftlb_regs_t @@ -104,9 +106,16 @@ public: : driver_device(mconfig, type, tag), m_lcd_buffer(*this, "lcd_buffer"), m_maincpu(*this, "maincpu"), - m_dac(*this, "dac") { } + m_dac(*this, "dac"), + m_cart(*this, "cartslot") + { } required_shared_ptr m_lcd_buffer; + required_device m_maincpu; + required_device m_dac; + required_device m_cart; + memory_region *m_cart_rom; + ps_ftlb_regs_t m_ftlb_regs; ps_intc_regs_t m_intc_regs; ps_timer_regs_t m_timer_regs; @@ -128,6 +137,7 @@ public: DECLARE_READ32_MEMBER(ps_lcd_r); DECLARE_WRITE32_MEMBER(ps_lcd_w); DECLARE_READ32_MEMBER(ps_rombank_r); + DECLARE_READ32_MEMBER(ps_flash_r); DECLARE_WRITE32_MEMBER(ps_flash_w); DECLARE_READ32_MEMBER(ps_audio_r); DECLARE_WRITE32_MEMBER(ps_audio_w); @@ -143,8 +153,6 @@ public: UINT32 ps_intc_get_interrupt_line(UINT32 line); void ps_intc_set_interrupt_line(UINT32 line, int state); void ps_timer_start(int index); - required_device m_maincpu; - required_device m_dac; }; @@ -773,19 +781,18 @@ INPUT_CHANGED_MEMBER(pockstat_state::input_update) READ32_MEMBER(pockstat_state::ps_rombank_r) { INT32 bank = (offset >> 11) & 0x0f; - int index = 0; - for(index = 0; index < 32; index++) + for (int index = 0; index < 32; index++) { - if(m_ftlb_regs.valid & (1 << index)) + if (m_ftlb_regs.valid & (1 << index)) { - if(m_ftlb_regs.entry[index] == bank) + if (m_ftlb_regs.entry[index] == bank) { //printf( "Address %08x is assigned to %08x in entry %d\n", 0x02000000 + (offset << 2), index * 0x2000 + ((offset << 2) & 0x1fff), index ); - return memregion("flash")->u32(index * (0x2000/4) + (offset & (0x1fff/4))); + return m_cart->read32_rom(space, index * (0x2000/4) + (offset & (0x1fff/4)), mem_mask); } } } - return memregion("flash")->u32(offset & 0x7fff); + return m_cart->read32_rom(space, offset & 0x7fff, mem_mask); } @@ -811,10 +818,15 @@ WRITE32_MEMBER(pockstat_state::ps_flash_w) if(m_ps_flash_write_count) { m_ps_flash_write_count--; - COMBINE_DATA(&((UINT32*)(*memregion("flash")))[offset]); + COMBINE_DATA(&((UINT32*)(m_cart_rom->base()))[offset]); } } +READ32_MEMBER(pockstat_state::ps_flash_r) +{ + return m_cart->read32_rom(space, offset, mem_mask); +} + READ32_MEMBER(pockstat_state::ps_audio_r) { verboselog(0, "ps_audio_r: Unknown Read: %08x = %08x & %08x\n", 0xd800000 + (offset << 2), 0x10, mem_mask); @@ -836,7 +848,7 @@ static ADDRESS_MAP_START(pockstat_mem, AS_PROGRAM, 32, pockstat_state ) AM_RANGE(0x02000000, 0x02ffffff) AM_READ(ps_rombank_r) AM_RANGE(0x04000000, 0x04003fff) AM_ROM AM_REGION("maincpu", 0) AM_RANGE(0x06000000, 0x06000307) AM_READWRITE(ps_ftlb_r, ps_ftlb_w) - AM_RANGE(0x08000000, 0x0801ffff) AM_ROM AM_WRITE(ps_flash_w) AM_REGION("flash", 0) + AM_RANGE(0x08000000, 0x0801ffff) AM_READWRITE(ps_flash_r, ps_flash_w) AM_RANGE(0x0a000000, 0x0a000013) AM_READWRITE(ps_intc_r, ps_intc_w) AM_RANGE(0x0a800000, 0x0a80002b) AM_READWRITE(ps_timer_r, ps_timer_w) AM_RANGE(0x0b000000, 0x0b000007) AM_READWRITE(ps_clock_r, ps_clock_w) @@ -861,7 +873,7 @@ INPUT_PORTS_END void pockstat_state::machine_start() { int index = 0; - for(index = 0; index < 3; index++) + for (index = 0; index < 3; index++) { m_timer_regs.timer[index].timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pockstat_state::timer_tick),this)); m_timer_regs.timer[index].timer->adjust(attotime::never, index); @@ -873,6 +885,9 @@ void pockstat_state::machine_start() m_rtc_regs.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pockstat_state::rtc_tick),this)); m_rtc_regs.timer->adjust(attotime::from_hz(1), index); + astring region_tag; + m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG)); + save_item(NAME(m_ftlb_regs.control)); save_item(NAME(m_ftlb_regs.stat)); save_item(NAME(m_ftlb_regs.valid)); @@ -919,28 +934,20 @@ void pockstat_state::machine_reset() UINT32 pockstat_state::screen_update_pockstat(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - int x = 0; - int y = 0; - for(y = 0; y < 32; y++) + for (int y = 0; y < 32; y++) { UINT32 *scanline = &bitmap.pix32(y); - for(x = 0; x < 32; x++) + for (int x = 0; x < 32; x++) { - if(m_lcd_control != 0) // Hack + if (m_lcd_control != 0) // Hack { - if(m_lcd_buffer[y] & (1 << x)) - { + if (m_lcd_buffer[y] & (1 << x)) scanline[x] = 0x00000000; - } else - { scanline[x] = 0x00ffffff; - } } else - { scanline[x] = 0x00ffffff; - } } } return 0; @@ -948,26 +955,23 @@ UINT32 pockstat_state::screen_update_pockstat(screen_device &screen, bitmap_rgb3 DEVICE_IMAGE_LOAD_MEMBER( pockstat_state, pockstat_flash ) { - int i, length; - UINT8 *cart = memregion("flash")->base(); static const char *gme_id = "123-456-STD"; + char cart_id[0xf40]; + UINT32 size = image.length(); - length = image.fread( cart, 0x20f40); - - if(length != 0x20f40) - { + if (size != 0x20f40) return IMAGE_INIT_FAIL; - } + + image.fread(cart_id, 0xf40); - for(i = 0; i < strlen(gme_id); i++) + for (int i = 0; i < strlen(gme_id); i++) { - if(cart[i] != gme_id[i]) - { + if (cart_id[i] != gme_id[i]) return IMAGE_INIT_FAIL; - } } - memcpy(cart, cart + 0xf40, 0x20000); + m_cart->rom_alloc(0x20000, GENERIC_ROM32_WIDTH); + image.fread(m_cart->get_rom_base(), 0x20000); return IMAGE_INIT_PASS; } @@ -977,7 +981,6 @@ static MACHINE_CONFIG_START( pockstat, pockstat_state ) MCFG_CPU_ADD("maincpu", ARM7, DEFAULT_CLOCK) MCFG_CPU_PROGRAM_MAP(pockstat_mem) - /* video hardware */ MCFG_SCREEN_ADD("screen", LCD) MCFG_SCREEN_REFRESH_RATE(50) @@ -993,18 +996,15 @@ static MACHINE_CONFIG_START( pockstat, pockstat_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) /* cartridge */ - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("gme") - MCFG_CARTSLOT_NOT_MANDATORY - MCFG_CARTSLOT_LOAD(pockstat_state, pockstat_flash) + MCFG_GENERIC_CARTSLOT_ADD("cartslot", GENERIC_ROM32_WIDTH, generic_plain_slot, "pockstat_cart") + MCFG_GENERIC_EXTENSIONS("gme") + MCFG_GENERIC_LOAD(pockstat_state, pockstat_flash) MACHINE_CONFIG_END /* ROM definition */ ROM_START( pockstat ) ROM_REGION( 0x4000, "maincpu", 0 ) ROM_LOAD( "kernel.bin", 0x0000, 0x4000, CRC(5fb47dd8) SHA1(6ae880493ddde880827d1e9f08e9cb2c38f9f2ec) ) - - ROM_REGION( 0x20f40, "flash", ROMREGION_ERASEFF ) ROM_END /* Driver */