From 89a4191d47599c410dca62be98b6aaac9bb9ad1c Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 3 May 2012 18:17:43 +0000 Subject: [PATCH] vectrex: support 64k bankswitched carts and carts with SRAM by mkasick and kbare credited in MESS (no whatsnew) --- src/mame/drivers/vectrex.c | 4 ++-- src/mame/includes/vectrex.h | 1 + src/mame/machine/vectrex.c | 10 ++++++++++ src/mame/video/vectrex.c | 8 ++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/vectrex.c b/src/mame/drivers/vectrex.c index 3e0dc0c5107..4b3479c8251 100644 --- a/src/mame/drivers/vectrex.c +++ b/src/mame/drivers/vectrex.c @@ -20,7 +20,7 @@ Bruce Tomlin (hardware info) static ADDRESS_MAP_START(vectrex_map, AS_PROGRAM, 8, vectrex_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x0000, 0x7fff) AM_RAMBANK("bank1") AM_REGION("maincpu", 0) AM_RANGE(0xc800, 0xcbff) AM_RAM AM_MIRROR(0x0400) AM_SHARE("gce_vectorram") AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(vectrex_via_r, vectrex_via_w) AM_RANGE(0xe000, 0xffff) AM_ROM @@ -133,7 +133,7 @@ static MACHINE_CONFIG_START( vectrex, vectrex_state ) MACHINE_CONFIG_END ROM_START(vectrex) - ROM_REGION(0x10000,"maincpu", 0) + ROM_REGION(0x18000,"maincpu", 0) ROM_LOAD("system.img", 0xe000, 0x2000, CRC(ba13fb57) SHA1(65d07426b520ddd3115d40f255511e0fd2e20ae7)) ROM_END diff --git a/src/mame/includes/vectrex.h b/src/mame/includes/vectrex.h index b0b6b7454ec..eef512dedb7 100644 --- a/src/mame/includes/vectrex.h +++ b/src/mame/includes/vectrex.h @@ -26,6 +26,7 @@ public: m_gce_vectorram(*this, "gce_vectorram"){ } required_shared_ptr m_gce_vectorram; + int m_64k_cart; int m_imager_status; UINT32 m_beam_color; unsigned char m_via_out[2]; diff --git a/src/mame/machine/vectrex.c b/src/mame/machine/vectrex.c index dda8096b289..32135330090 100644 --- a/src/mame/machine/vectrex.c +++ b/src/mame/machine/vectrex.c @@ -71,6 +71,11 @@ DEVICE_IMAGE_LOAD(vectrex_cart) if (image.software_entry() == NULL) { image.fread( mem, 0x8000); + if (image.length() > 0x8000) + { + image.fread( mem+0x10000, 0x8000); + state->m_64k_cart = 1; + } } else { int size = image.get_software_region_length("rom"); memcpy(mem, image.get_software_region("rom"), size); @@ -83,6 +88,10 @@ DEVICE_IMAGE_LOAD(vectrex_cart) return IMAGE_INIT_FAIL; } + if (memcmp(mem + 0x06,"SRAM",4)) { + image.device().machine().device("maincpu")->memory().space(AS_PROGRAM)->unmap_write(0x0000, 0x7fff); + } + /* If VIA T2 starts, reset refresh timer. This is the best strategy for most games. */ state->m_reset_refresh = 1; @@ -352,6 +361,7 @@ DRIVER_INIT(vectrex) vectrex_state *state = machine.driver_data(); int i; + state->m_64k_cart = 0; state->m_imager_angles = unknown_game_angles; state->m_beam_color = RGB_WHITE; for (i=0; im_imager_colors); i++) diff --git a/src/mame/video/vectrex.c b/src/mame/video/vectrex.c index 53da1479764..32600036e57 100644 --- a/src/mame/video/vectrex.c +++ b/src/mame/video/vectrex.c @@ -386,6 +386,14 @@ static WRITE8_DEVICE_HANDLER(v_via_pb_w) } } + /* Cartridge bank-switching */ + if (state->m_64k_cart && ((data ^ state->m_via_out[PORTB]) & 0x40)) + { + device_t &root_device = device->machine().root_device(); + + root_device.membank("bank1")->set_base(root_device.memregion("maincpu")->base() + ((data & 0x40) ? 0x10000 : 0x0000)); + } + /* Sound */ if (data & 0x10) {