summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/vii.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/vii.cpp')
-rw-r--r--src/mame/drivers/vii.cpp318
1 files changed, 262 insertions, 56 deletions
diff --git a/src/mame/drivers/vii.cpp b/src/mame/drivers/vii.cpp
index 85c999d71f5..a05a68c231b 100644
--- a/src/mame/drivers/vii.cpp
+++ b/src/mame/drivers/vii.cpp
@@ -77,9 +77,10 @@ Detailed list of bugs:
#include "emu.h"
#include "cpu/unsp/unsp.h"
-#include "machine/spg2xx.h"
+#include "machine/bankdev.h"
#include "machine/i2cmem.h"
#include "machine/nvram.h"
+#include "machine/spg2xx.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
@@ -100,7 +101,7 @@ public:
, m_debug_screen(*this, "debug_screen")
#endif
, m_spg(*this, "spg")
- , m_bank(*this, "cart")
+ , m_bank(*this, "cartbank")
, m_io_p1(*this, "P1")
, m_io_p2(*this, "P2")
, m_io_p3(*this, "P3")
@@ -142,7 +143,7 @@ protected:
required_device<screen_device> m_debug_screen;
#endif
required_device<spg2xx_device> m_spg;
- required_memory_bank m_bank;
+ optional_memory_bank m_bank;
protected:
DECLARE_WRITE_LINE_MEMBER(poll_controls);
@@ -152,7 +153,7 @@ protected:
virtual void machine_reset() override;
- void mem_map(address_map &map);
+ virtual void mem_map(address_map &map);
uint32_t m_current_bank;
@@ -178,6 +179,55 @@ protected:
DECLARE_READ16_MEMBER(rad_crik_hack_r);
};
+class vsmile_state : public spg2xx_game_state
+{
+public:
+ vsmile_state(const machine_config &mconfig, device_type type, const char *tag)
+ : spg2xx_game_state(mconfig, type, tag)
+ , m_cart(*this, "cartslot")
+ , m_bankdev(*this, "bank")
+ , m_cart_banks(*this, "cartbank%u", 0U)
+ { }
+
+ void vsmile(machine_config &config);
+ void vsmilep(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ static const device_timer_id TIMER_PAD = 0;
+
+ virtual void mem_map(address_map &map) override;
+ void banked_map(address_map &map);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
+
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_READ16_MEMBER(portc_r);
+ DECLARE_WRITE16_MEMBER(portb_w);
+ DECLARE_WRITE16_MEMBER(portc_w);
+
+ DECLARE_WRITE8_MEMBER(chip_sel_w);
+
+ DECLARE_WRITE8_MEMBER(uart_tx);
+
+ DECLARE_READ16_MEMBER(bank0_r);
+ DECLARE_READ16_MEMBER(bank1_r);
+ DECLARE_READ16_MEMBER(bank2_r);
+ DECLARE_READ16_MEMBER(bank3_r);
+ optional_device<generic_slot_device> m_cart;
+ memory_region *m_cart_rom;
+ required_device<address_map_bank_device> m_bankdev;
+ optional_memory_bank_array<4> m_cart_banks;
+
+ emu_timer *m_pad_timer;
+ uint8_t m_pad_counter;
+
+ uint16_t m_portb_data;
+ uint16_t m_portc_data;
+};
class spg2xx_cart_state : public spg2xx_game_state
{
@@ -188,33 +238,17 @@ public:
{ }
void vii(machine_config &config);
- void vsmile(machine_config &config);
- void vsmilep(machine_config &config);
-
- void init_vii();
private:
DECLARE_WRITE16_MEMBER(vii_portb_w);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(vii_cart);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(vsmile_cart);
-
- DECLARE_READ16_MEMBER(vsmile_porta_r);
- DECLARE_READ16_MEMBER(vsmile_portb_r);
- DECLARE_READ16_MEMBER(vsmile_portc_r);
- DECLARE_WRITE16_MEMBER(vsmile_porta_w);
- DECLARE_WRITE16_MEMBER(vsmile_portb_w);
- DECLARE_WRITE16_MEMBER(vsmile_portc_w);
virtual void machine_start() override;
virtual void machine_reset() override;
optional_device<generic_slot_device> m_cart;
memory_region *m_cart_rom;
-
- uint16_t m_vsmile_porta_data;
- uint16_t m_vsmile_portb_data;
- uint16_t m_vsmile_portc_data;
};
#define VERBOSE_LEVEL (4)
@@ -298,40 +332,119 @@ WRITE16_MEMBER(spg2xx_cart_state::vii_portb_w)
switch_bank(((data & 0x80) >> 7) | ((data & 0x20) >> 4));
}
-READ16_MEMBER(spg2xx_cart_state::vsmile_porta_r)
+void vsmile_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- logerror("V.Smile Port A read, pull mask %04x\n", mem_mask);
- return m_vsmile_porta_data & mem_mask;
+ if (id == TIMER_PAD)
+ {
+ m_pad_counter++;
+ if (m_pad_counter >= 100)
+ {
+ m_pad_counter = 0;
+ m_spg->uart_rx(0x55);
+ }
+ }
}
-READ16_MEMBER(spg2xx_cart_state::vsmile_portb_r)
+#define VSMILE_PORTB_CS1 0x0001
+#define VSMILE_PORTB_CS2 0x0002
+#define VSMILE_PORTB_CART 0x0004
+#define VSMILE_PORTB_RESET 0x0008
+#define VSMILE_PORTB_FRONT24 0x0010
+#define VSMILE_PORTB_OFF 0x0020
+#define VSMILE_PORTB_OFF_SW 0x0040
+#define VSMILE_PORTB_ON_SW 0x0080
+
+#define VSMILE_PORTC_VER 0x000f
+#define VSMILE_PORTC_LOGO 0x0010
+#define VSMILE_PORTC_TEST 0x0020
+#define VSMILE_PORTC_AMP 0x0040
+#define VSMILE_PORTC_SYSRESET 0x0080
+
+READ16_MEMBER(vsmile_state::bank0_r)
{
- logerror("V.Smile Port B read, pull mask %04x\n", mem_mask);
- return m_vsmile_portb_data & mem_mask;
+ const uint16_t data = ((uint16_t*)m_cart_rom->base())[offset];
+ //printf("bank0_r: %06x: %04x\n", offset, data);
+ return data;
}
-READ16_MEMBER(spg2xx_cart_state::vsmile_portc_r)
+READ16_MEMBER(vsmile_state::bank1_r)
{
- logerror("V.Smile Port C read, pull mask %04x\n", mem_mask);
- return m_vsmile_portc_data & mem_mask;
+ const uint16_t data = ((uint16_t*)m_cart_rom->base())[offset + 0x100000];
+ //printf("bank1_r: %06x: %04x\n", offset + 0x100000, data);
+ return data;
}
-WRITE16_MEMBER(spg2xx_cart_state::vsmile_porta_w)
+READ16_MEMBER(vsmile_state::bank2_r)
{
- logerror("V.Smile Port A write %04x, push mask %04x\n", data, mem_mask);
- m_vsmile_porta_data = data & mem_mask;
+ const uint16_t data = ((uint16_t*)m_cart_rom->base())[offset + 0x200000];
+ //printf("bank2_r: %06x: %04x\n", offset + 0x200000, data);
+ return data;
}
-WRITE16_MEMBER(spg2xx_cart_state::vsmile_portb_w)
+READ16_MEMBER(vsmile_state::bank3_r)
{
- logerror("V.Smile Port B write %04x, push mask %04x\n", data, mem_mask);
- m_vsmile_portb_data = data & mem_mask;
+ const uint16_t data = ((uint16_t*)memregion("maincpu")->base())[offset];
+ //printf("bank3_r: %06x: %04x\n", offset + 0x300000, data);
+ return data;
}
-WRITE16_MEMBER(spg2xx_cart_state::vsmile_portc_w)
+READ16_MEMBER(vsmile_state::portb_r)
{
- logerror("V.Smile Port C write %04x, push mask %04x\n", data, mem_mask);
- m_vsmile_portc_data = data & mem_mask;
+ //const uint8_t inputs = m_io_p2->read();
+ //const uint16_t input_bits = BIT(inputs, 0) ? VSMILE_PORTB_ON_SW : 0;
+ const uint16_t data = VSMILE_PORTB_ON_SW | (m_cart && m_cart->exists() ? VSMILE_PORTB_CART : 0);
+ logerror("V.Smile Port B read %04x, mask %04x\n", data, mem_mask);
+ //printf("V.Smile Port B read %04x, mask %04x\n", data, mem_mask);
+ return data;
+}
+
+READ16_MEMBER(vsmile_state::portc_r)
+{
+ const uint16_t data = VSMILE_PORTC_LOGO | 0x0004;
+ logerror("V.Smile Port C read %04x, mask %04x\n", data, mem_mask);
+ return data;
+}
+
+WRITE16_MEMBER(vsmile_state::portb_w)
+{
+ m_portb_data = data & mem_mask;
+ logerror("V.Smile Port B write %04x, mask %04x\n", m_portb_data, mem_mask);
+ //printf("V.Smile Port B write %04x, mask %04x\n", m_portb_data, mem_mask);
+}
+
+WRITE16_MEMBER(vsmile_state::portc_w)
+{
+ m_portc_data = data & mem_mask;
+ logerror("V.Smile Port C write %04x, mask %04x\n", m_portc_data, mem_mask);
+ //printf("V.Smile Port C write %04x, mask %04x\n", m_portc_data, mem_mask);
+ //printf("%02x ", data >> 8);
+}
+
+WRITE8_MEMBER(vsmile_state::uart_tx)
+{
+ logerror("UART Tx: %02x\n", data);
+}
+
+WRITE8_MEMBER(vsmile_state::chip_sel_w)
+{
+ logerror("Chip select mode: %d\n", data);
+ const uint16_t cart_offset = m_cart && m_cart->exists() ? 4 : 0;
+ switch (data)
+ {
+ case 0:
+ logerror("Setting bank %d\n", cart_offset);
+ m_bankdev->set_bank(cart_offset);
+ break;
+ case 1:
+ logerror("Setting bank %d\n", 1 + cart_offset);
+ m_bankdev->set_bank(1 + cart_offset);
+ break;
+ case 2:
+ case 3:
+ logerror("Setting bank %d\n", 2 + cart_offset);
+ m_bankdev->set_bank(2 + cart_offset);
+ break;
+ }
}
READ16_MEMBER(spg2xx_game_state::walle_portc_r)
@@ -382,7 +495,46 @@ READ16_MEMBER(spg2xx_game_state::jakks_porta_r)
void spg2xx_game_state::mem_map(address_map &map)
{
- map(0x000000, 0x3fffff).bankr("cart");
+ map(0x000000, 0x3fffff).bankr("cartbank");
+ map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
+}
+
+void vsmile_state::banked_map(address_map &map)
+{
+ map(0x0000000, 0x00fffff).rom().region("maincpu", 0);
+ map(0x0100000, 0x01fffff).rom().region("maincpu", 0);
+ map(0x0200000, 0x02fffff).rom().region("maincpu", 0);
+ map(0x0300000, 0x03fffff).rom().region("maincpu", 0);
+
+ map(0x0400000, 0x04fffff).rom().region("maincpu", 0);
+ map(0x0500000, 0x05fffff).rom().region("maincpu", 0);
+ map(0x0600000, 0x06fffff).rom().region("maincpu", 0);
+ map(0x0700000, 0x07fffff).rom().region("maincpu", 0);
+
+ map(0x0800000, 0x08fffff).rom().region("maincpu", 0);
+ map(0x0900000, 0x09fffff).rom().region("maincpu", 0);
+ map(0x0a00000, 0x0afffff).rom().region("maincpu", 0);
+ map(0x0b00000, 0x0bfffff).rom().region("maincpu", 0);
+
+ map(0x1000000, 0x10fffff).bankr("cartbank0");
+ map(0x1100000, 0x11fffff).bankr("cartbank0");
+ map(0x1200000, 0x12fffff).bankr("cartbank0");
+ map(0x1300000, 0x13fffff).bankr("cartbank0");
+
+ map(0x1400000, 0x14fffff).bankr("cartbank0");
+ map(0x1500000, 0x15fffff).bankr("cartbank0");
+ map(0x1600000, 0x16fffff).bankr("cartbank1");
+ map(0x1700000, 0x17fffff).bankr("cartbank1");
+
+ map(0x1800000, 0x18fffff).r(FUNC(vsmile_state::bank0_r));
+ map(0x1900000, 0x19fffff).r(FUNC(vsmile_state::bank1_r));
+ map(0x1a00000, 0x1afffff).nopr();
+ map(0x1b00000, 0x1bfffff).r(FUNC(vsmile_state::bank3_r));
+}
+
+void vsmile_state::mem_map(address_map &map)
+{
+ map(0x000000, 0x3fffff).r(m_bankdev, FUNC(address_map_bank_device::read16));
map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
}
@@ -429,6 +581,14 @@ static INPUT_PORTS_START( vsmile )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Menu")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("B Button")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("X Button")
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "POWER ON" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, "POWER OFF" )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START( walle )
@@ -620,10 +780,48 @@ void spg2xx_cart_state::machine_start()
m_bank->configure_entries(0, ceilf((float)m_cart_rom->bytes() / 0x800000), m_cart_rom->base(), 0x800000);
m_bank->set_entry(0);
}
+}
+
+void vsmile_state::machine_start()
+{
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ for (uint32_t i = 0; i < 2; i++)
+ {
+ m_cart_banks[i]->configure_entries(0, (m_cart_rom->bytes() + 0x1fffff) / 0x200000, m_cart_rom->base(), 0x200000);
+ m_cart_banks[i]->set_entry(i);
+ }
+ }
+ else
+ {
+ for (uint32_t i = 0; i < 2; i++)
+ {
+ m_cart_rom = memregion("maincpu");
+ m_cart_banks[i]->configure_entries(0, (m_cart_rom->bytes() + 0x1fffff) / 0x200000, m_cart_rom->base(), 0x200000);
+ m_cart_banks[i]->set_entry(0);
+ }
+ }
- m_vsmile_porta_data = 0;
- m_vsmile_portb_data = 0;
- m_vsmile_portc_data = 0;
+ m_bankdev->set_bank(m_cart && m_cart->exists() ? 4 : 0);
+
+ m_serial_eeprom = std::make_unique<uint8_t[]>(0x400);
+ if (m_nvram)
+ m_nvram->set_base(&m_serial_eeprom[0], 0x400);
+
+ m_pad_timer = timer_alloc(TIMER_PAD);
+ m_pad_timer->adjust(attotime::never);
+}
+
+void vsmile_state::machine_reset()
+{
+ m_portb_data = 0;
+ m_portc_data = 0;
+
+ m_pad_timer->adjust(attotime::from_hz(100), 0, attotime::from_hz(100));
+ m_pad_counter = 0;
}
void spg2xx_cart_state::machine_reset()
@@ -699,7 +897,7 @@ DEVICE_IMAGE_LOAD_MEMBER(spg2xx_cart_state, vii_cart)
return image_init_result::PASS;
}
-DEVICE_IMAGE_LOAD_MEMBER(spg2xx_cart_state, vsmile_cart)
+DEVICE_IMAGE_LOAD_MEMBER(vsmile_state, cart)
{
uint32_t size = m_cart->common_get_size("rom");
@@ -778,7 +976,7 @@ void spg2xx_cart_state::vii(machine_config &config)
SOFTWARE_LIST(config, "vii_cart").set_original("vii");
}
-void spg2xx_cart_state::vsmile(machine_config &config)
+void vsmile_state::vsmile(machine_config &config)
{
#if SPG2XX_VISUAL_AUDIO_DEBUG
SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen, m_debug_screen);
@@ -786,22 +984,30 @@ void spg2xx_cart_state::vsmile(machine_config &config)
SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
#endif
spg2xx_base(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vsmile_state::mem_map);
- m_spg->porta_in().set(FUNC(spg2xx_cart_state::vsmile_porta_r));
- m_spg->portb_in().set(FUNC(spg2xx_cart_state::vsmile_portb_r));
- m_spg->portc_in().set(FUNC(spg2xx_cart_state::vsmile_portc_r));
- m_spg->porta_out().set(FUNC(spg2xx_cart_state::vsmile_porta_w));
- m_spg->portb_out().set(FUNC(spg2xx_cart_state::vsmile_portb_w));
- m_spg->portc_out().set(FUNC(spg2xx_cart_state::vsmile_portc_w));
+ m_spg->portb_in().set(FUNC(vsmile_state::portb_r));
+ m_spg->portc_in().set(FUNC(vsmile_state::portc_r));
+ m_spg->portb_out().set(FUNC(vsmile_state::portb_w));
+ m_spg->portc_out().set(FUNC(vsmile_state::portc_w));
+ m_spg->chip_select().set(FUNC(vsmile_state::chip_sel_w));
+ m_spg->uart_tx().set(FUNC(vsmile_state::uart_tx));
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "vsmile_cart");
m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_device_load(device_image_load_delegate(&spg2xx_cart_state::device_image_load_vsmile_cart, this));
+ m_cart->set_device_load(device_image_load_delegate(&vsmile_state::device_image_load_cart, this));
+
+ ADDRESS_MAP_BANK(config, m_bankdev);
+ m_bankdev->set_addrmap(AS_PROGRAM, &vsmile_state::banked_map);
+ m_bankdev->set_endianness(ENDIANNESS_LITTLE);
+ m_bankdev->set_data_width(16);
+ m_bankdev->set_shift(-1);
+ m_bankdev->set_stride(0x400000);
SOFTWARE_LIST(config, "cart_list").set_original("vsmile_cart");
}
-void spg2xx_cart_state::vsmilep(machine_config &config)
+void vsmile_state::vsmilep(machine_config &config)
{
vsmile(config);
m_spg->set_pal(true);
@@ -1091,10 +1297,10 @@ ROM_END
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
// VTech systems
-CONS( 2005, vsmile, 0, 0, vsmile, vsmile, spg2xx_cart_state, empty_init, "VTech", "V.Smile (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, spg2xx_cart_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, spg2xx_cart_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-CONS( 2005, vsmileb, 0, 0, vsmile, vsmile, spg2xx_cart_state, empty_init, "VTech", "V.Smile Baby (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+CONS( 2005, vsmileb, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile Baby (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
// Jungle Soft TV games
CONS( 2007, vii, 0, 0, vii, vii, spg2xx_cart_state, empty_init, "Jungle Soft / KenSingTon / Siatronics", "Vii", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // motion controls are awkward, but playable for the most part