diff --git a/hash/vsmilem_cart.xml b/hash/vsmilem_cart.xml
index ffcafbb1dd2..07bd9990595 100644
--- a/hash/vsmilem_cart.xml
+++ b/hash/vsmilem_cart.xml
@@ -160,7 +160,7 @@ Language:
| | (IT) | Toy Story 3 (EAN 8033836704196) GP470419? |
| | 80-084422(NL) | Toy Story 3 |
| | 80-084423(UK) | Toy Story 3 |
-| | 80-084424(GE) | Toy Story 3 |
+| XX | 80-084424(GE) | Toy Story 3 |
| | 80-084425(FR) | Toy Story 3 |
| | 80-084427(SP) | Toy Story 3 |
+========+===================+============================================================================+
@@ -184,10 +184,10 @@ Language:
| | 80-084485(FR) | La Princesse Et La Grenouille |
| | 80-084487(SP) | Tiana y el Sapo - El gran sueño de Tiana |
+========+===================+============================================================================+
-| | 80-084500(US) | Shrek Forever After |
+| XX | 80-084500(US) | Shrek Forever After |
| | 80-084502(NL) | Sjrek voor eeuwig en altijd |
| | 80-084503(UK) | Shrek Forever After |
-| | 80-084504(GE) | Fuer immer Shrek |
+| XX | 80-084504(GE) | Fuer immer Shrek |
| | 80-084505(FR) | Shrek 4 - Il Etait une Fin |
| | 80-084507(SP) | Shrek Felices para siempre |
+========+===================+============================================================================+
@@ -421,6 +421,22 @@ Smartbooks currently have no dumps available, hence they are temporarily listed
+
+ Für immer Shrek (Ger)
+ 2010
+ VTech
+
+
+
+
+
+
+
+
+
+
+
+
Spider-Man & Freunde - Geheime Missionen (Ger)
2010
@@ -478,6 +494,22 @@ Smartbooks currently have no dumps available, hence they are temporarily listed
+
+ Toy Story 3 (Ger)
+ 2010
+ VTech
+
+
+
+
+
+
+
+
+
+
+
+
Wintersport (Ger)
2009?
diff --git a/src/devices/bus/vsmile/rom.cpp b/src/devices/bus/vsmile/rom.cpp
index 49740bc7f37..584a8cfe058 100644
--- a/src/devices/bus/vsmile/rom.cpp
+++ b/src/devices/bus/vsmile/rom.cpp
@@ -49,10 +49,12 @@ vsmile_rom_nvram_device::vsmile_rom_nvram_device(const machine_config &mconfig,
void vsmile_rom_device::device_start()
{
+ save_item(NAME(m_bank_offset));
}
void vsmile_rom_device::device_reset()
{
+ m_bank_offset = 0;
}
@@ -73,3 +75,12 @@ WRITE16_MEMBER(vsmile_rom_nvram_device::bank2_w)
if (!m_nvram.empty() && offset < m_nvram.size())
COMBINE_DATA(&m_nvram[offset]);
}
+
+/*-------------------------------------------------
+ CS2 bankswitching
+ -------------------------------------------------*/
+
+void vsmile_rom_device::set_cs2(bool cs2)
+{
+ m_bank_offset = cs2 ? 0x400000 : 0x000000;
+}
diff --git a/src/devices/bus/vsmile/rom.h b/src/devices/bus/vsmile/rom.h
index 5d93cb64109..ec39f1f743e 100644
--- a/src/devices/bus/vsmile/rom.h
+++ b/src/devices/bus/vsmile/rom.h
@@ -16,10 +16,13 @@ public:
vsmile_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ16_MEMBER(bank0_r) override { return m_rom[0x000000 + offset]; }
- virtual DECLARE_READ16_MEMBER(bank1_r) override { return m_rom[0x100000 + offset]; }
- virtual DECLARE_READ16_MEMBER(bank2_r) override { return m_rom[0x200000 + offset]; }
- virtual DECLARE_READ16_MEMBER(bank3_r) override { return m_rom[0x300000 + offset]; }
+ virtual DECLARE_READ16_MEMBER(bank0_r) override { return m_rom[m_bank_offset + 0x000000 + offset]; }
+ virtual DECLARE_READ16_MEMBER(bank1_r) override { return m_rom[m_bank_offset + 0x100000 + offset]; }
+ virtual DECLARE_READ16_MEMBER(bank2_r) override { return m_rom[m_bank_offset + 0x200000 + offset]; }
+ virtual DECLARE_READ16_MEMBER(bank3_r) override { return m_rom[m_bank_offset + 0x300000 + offset]; }
+
+ // banking
+ virtual void set_cs2(bool cs2) override;
protected:
vsmile_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -27,6 +30,8 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+
+ uint32_t m_bank_offset;
};
diff --git a/src/devices/bus/vsmile/vsmile_slot.cpp b/src/devices/bus/vsmile/vsmile_slot.cpp
index f413a9aeb7e..e7b8546ea20 100644
--- a/src/devices/bus/vsmile/vsmile_slot.cpp
+++ b/src/devices/bus/vsmile/vsmile_slot.cpp
@@ -50,7 +50,7 @@ void device_vsmile_cart_interface::rom_alloc(uint32_t size, const char *tag)
if (m_rom == nullptr)
{
// We always alloc 8MB of ROM region
- m_rom = (uint16_t *)device().machine().memory().region_alloc(std::string(tag).append(VSMILE_SLOT_ROM_REGION_TAG).c_str(), 0x800000, 2, ENDIANNESS_BIG)->base();
+ m_rom = (uint16_t *)device().machine().memory().region_alloc(std::string(tag).append(VSMILE_SLOT_ROM_REGION_TAG).c_str(), size, 2, ENDIANNESS_BIG)->base();
m_rom_size = size;
}
}
@@ -138,9 +138,9 @@ image_init_result vsmile_cart_slot_device::call_load()
if (m_cart)
{
uint32_t size = loaded_through_softlist() ? get_software_region_length("rom") : length();
- if (size > 0x800000)
+ if (size > 0x1000000)
{
- seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 8MB");
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 16MB");
return image_init_result::FAIL;
}
@@ -205,7 +205,7 @@ std::string vsmile_cart_slot_device::get_default_card_software(get_default_card_
/*-------------------------------------------------
- read
+ cart accessors
-------------------------------------------------*/
READ16_MEMBER(vsmile_cart_slot_device::bank0_r)
@@ -228,11 +228,6 @@ READ16_MEMBER(vsmile_cart_slot_device::bank3_r)
return m_cart->bank3_r(space, offset, mem_mask);
}
-
-/*-------------------------------------------------
- write
- -------------------------------------------------*/
-
WRITE16_MEMBER(vsmile_cart_slot_device::bank0_w)
{
m_cart->bank0_w(space, offset, data, mem_mask);
@@ -252,3 +247,8 @@ WRITE16_MEMBER(vsmile_cart_slot_device::bank3_w)
{
m_cart->bank3_w(space, offset, data, mem_mask);
}
+
+void vsmile_cart_slot_device::set_cs2(bool cs2)
+{
+ m_cart->set_cs2(cs2);
+}
\ No newline at end of file
diff --git a/src/devices/bus/vsmile/vsmile_slot.h b/src/devices/bus/vsmile/vsmile_slot.h
index b50af088027..7d800677214 100644
--- a/src/devices/bus/vsmile/vsmile_slot.h
+++ b/src/devices/bus/vsmile/vsmile_slot.h
@@ -33,10 +33,13 @@ public:
virtual DECLARE_READ16_MEMBER(bank1_r) { return 0; }
virtual DECLARE_READ16_MEMBER(bank2_r) { return 0; }
virtual DECLARE_READ16_MEMBER(bank3_r) { return 0; }
- virtual DECLARE_WRITE16_MEMBER(bank0_w) { printf("0 %08x = %04x\n", offset, data); }
- virtual DECLARE_WRITE16_MEMBER(bank1_w) { printf("1 %08x = %04x\n", offset, data); }
- virtual DECLARE_WRITE16_MEMBER(bank2_w) { printf("2 %08x = %04x\n", offset, data); }
- virtual DECLARE_WRITE16_MEMBER(bank3_w) { printf("3 %08x = %04x\n", offset, data); }
+ virtual DECLARE_WRITE16_MEMBER(bank0_w) { }
+ virtual DECLARE_WRITE16_MEMBER(bank1_w) { }
+ virtual DECLARE_WRITE16_MEMBER(bank2_w) { }
+ virtual DECLARE_WRITE16_MEMBER(bank3_w) { }
+
+ // banking
+ virtual void set_cs2(bool cs2) = 0;
void rom_alloc(uint32_t size, const char *tag);
void nvram_alloc(uint32_t size);
@@ -111,6 +114,9 @@ public:
virtual DECLARE_WRITE16_MEMBER(bank2_w);
virtual DECLARE_WRITE16_MEMBER(bank3_w);
+ // banking
+ void set_cs2(bool cs2);
+
protected:
int m_type;
device_vsmile_cart_interface* m_cart;
diff --git a/src/devices/machine/spg2xx.cpp b/src/devices/machine/spg2xx.cpp
index a5fef62486d..f03c3e4eb25 100644
--- a/src/devices/machine/spg2xx.cpp
+++ b/src/devices/machine/spg2xx.cpp
@@ -45,7 +45,7 @@ DEFINE_DEVICE_TYPE(SPG28X, spg28x_device, "spg28x", "SPG280-series System-on-a-C
#define LOG_SIO (1U << 26)
#define LOG_EXT_MEM (1U << 27)
#define LOG_EXTINT (1U << 28)
-#define LOG_IO (LOG_IO_READS | LOG_IO_WRITES | LOG_IRQS | LOG_GPIO | LOG_UART | LOG_I2C | LOG_DMA | LOG_TIMERS | LOG_UNKNOWN_IO)
+#define LOG_IO (LOG_IO_READS | LOG_IO_WRITES | LOG_IRQS | LOG_GPIO | LOG_UART | LOG_I2C | LOG_DMA | LOG_TIMERS | LOG_EXTINT | LOG_UNKNOWN_IO)
#define LOG_CHANNELS (LOG_CHANNEL_READS | LOG_CHANNEL_WRITES)
#define LOG_SPU (LOG_SPU_READS | LOG_SPU_WRITES | LOG_UNKNOWN_SPU | LOG_CHANNEL_READS | LOG_CHANNEL_WRITES \
| LOG_ENVELOPES | LOG_SAMPLES | LOG_RAMPDOWN | LOG_BEAT)
@@ -1587,6 +1587,11 @@ WRITE16_MEMBER(spg2xx_device::io_w)
const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS &= ~data;
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (m_uart_rx_irq || m_uart_tx_irq)
+ {
+ LOGMASKED(LOG_IRQS | LOG_UART, "Re-setting UART IRQ due to still-unacknowledged Rx or Tx.\n");
+ IO_IRQ_STATUS |= 0x0100;
+ }
if (changed)
check_irqs(changed);
break;
@@ -2033,19 +2038,24 @@ void spg2xx_device::extint_w(int channel, bool state)
m_extint[channel] = state;
if (old != state)
{
- LOGMASKED(LOG_EXTINT, "extint state changed, so %sing interrupt\n", state ? "rais" : "lower");
- const uint16_t mask = (channel == 0) ? 0x0200 : 0x1000;
- const uint16_t old_irq = IO_IRQ_STATUS;
- if (state)
- IO_IRQ_STATUS |= mask;
- else
- IO_IRQ_STATUS &= ~mask;
+ check_extint_irq(channel);
+ }
+}
- if (old_irq != IO_IRQ_STATUS)
- {
- LOGMASKED(LOG_EXTINT, "extint IRQ changed, so checking interrupts\n");
- check_irqs(mask);
- }
+void spg2xx_device::check_extint_irq(int channel)
+{
+ LOGMASKED(LOG_EXTINT, "%sing extint %d interrupt\n", m_extint[channel] ? "rais" : "lower", channel + 1);
+ const uint16_t mask = (channel == 0) ? 0x0200 : 0x1000;
+ const uint16_t old_irq = IO_IRQ_STATUS;
+ if (m_extint[channel])
+ IO_IRQ_STATUS |= mask;
+ else
+ IO_IRQ_STATUS &= ~mask;
+
+ if (old_irq != IO_IRQ_STATUS)
+ {
+ LOGMASKED(LOG_EXTINT, "extint IRQ changed, so checking interrupts\n");
+ check_irqs(mask);
}
}
diff --git a/src/devices/machine/spg2xx.h b/src/devices/machine/spg2xx.h
index e8a006dc273..93b689a1ef9 100644
--- a/src/devices/machine/spg2xx.h
+++ b/src/devices/machine/spg2xx.h
@@ -384,6 +384,7 @@ protected:
virtual DECLARE_READ16_MEMBER(io_r);
virtual DECLARE_WRITE16_MEMBER(io_w);
+ void check_extint_irq(int channel);
void check_irqs(const uint16_t changed);
inline void check_video_irq();
diff --git a/src/mame/drivers/vsmile.cpp b/src/mame/drivers/vsmile.cpp
index 8c36fae0cdd..d498fe82653 100644
--- a/src/mame/drivers/vsmile.cpp
+++ b/src/mame/drivers/vsmile.cpp
@@ -50,18 +50,6 @@ READ16_MEMBER(vsmile_base_state::bank3_r)
return ((uint16_t*)m_system_region->base())[offset];
}
-void vsmile_base_state::mem_map(address_map &map)
-{
- map(0x000000, 0x3fffff).rw(m_bankdev, FUNC(address_map_bank_device::read16), FUNC(address_map_bank_device::write16));
- map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
-}
-
-/************************************
- *
- * V.Smile
- *
- ************************************/
-
void vsmile_state::machine_start()
{
vsmile_base_state::machine_start();
@@ -101,6 +89,12 @@ READ16_MEMBER(vsmile_state::portb_r)
return VSMILE_PORTB_OFF_SW | VSMILE_PORTB_ON_SW | VSMILE_PORTB_RESET;
}
+WRITE16_MEMBER(vsmile_state::portb_w)
+{
+ if (BIT(mem_mask, 4))
+ m_cart->set_cs2(BIT(data, 4));
+}
+
READ16_MEMBER(vsmile_state::portc_r)
{
uint16_t data = m_dsw_region->read();
@@ -128,6 +122,36 @@ WRITE16_MEMBER(vsmile_state::portc_w)
}
}
+/************************************
+ *
+ * V.Smile Motion-specific
+ *
+ ************************************/
+
+WRITE16_MEMBER(vsmilem_state::porta_w)
+{
+ //printf("Port A write: %04x & %04x\n", data, mem_mask);
+}
+
+READ16_MEMBER(vsmilem_state::porta_r)
+{
+ const uint16_t data = 0xc000;
+ //printf("Port A read: %04x & %04x\n", data, mem_mask);
+ return data;
+}
+
+/************************************
+ *
+ * Address Maps
+ *
+ ************************************/
+
+void vsmile_base_state::mem_map(address_map &map)
+{
+ map(0x000000, 0x3fffff).rw(m_bankdev, FUNC(address_map_bank_device::read16), FUNC(address_map_bank_device::write16));
+ 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);
@@ -249,6 +273,13 @@ void vsmile_state::vsmilep(machine_config &config)
m_spg->set_pal(true);
}
+void vsmilem_state::vsmilem(machine_config &config)
+{
+ vsmile(config);
+ m_spg->porta_out().set(FUNC(vsmilem_state::porta_w));
+ m_spg->porta_in().set(FUNC(vsmilem_state::porta_r));
+}
+
/************************************
*
* ROM Loading
@@ -271,7 +302,13 @@ ROM_START( vsmilef )
ROM_LOAD16_WORD_SWAP( "sysrom_france", 0x000000, 0x200000, CRC(0cd0bdf5) SHA1(5c8d1eada1b6b545555b8d2b09325d7127681af8) )
ROM_END
-// year, name, parent, compat, machine, input, class, init, company, fullname, flags
-CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+ROM_START( vsmilem )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "vsmilebios.bin", 0x000000, 0x200000, BAD_DUMP CRC(11f1b416) SHA1(11f77c4973d29c962567390e41879c86a759c93b) )
+ROM_END
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2008, vsmilem, vsmile, 0, vsmilem, vsmile, vsmilem_state, empty_init, "VTech", "V.Smile Motion (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/includes/vsmile.h b/src/mame/includes/vsmile.h
index defb83e106e..0069803295f 100644
--- a/src/mame/includes/vsmile.h
+++ b/src/mame/includes/vsmile.h
@@ -85,6 +85,7 @@ private:
template DECLARE_WRITE_LINE_MEMBER(ctrl_rts_w);
DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_WRITE16_MEMBER(portb_w);
DECLARE_READ16_MEMBER(portc_r);
DECLARE_WRITE16_MEMBER(portc_w);
@@ -115,6 +116,20 @@ private:
bool m_ctrl_select[2];
};
+class vsmilem_state : public vsmile_state
+{
+public:
+ vsmilem_state(const machine_config &mconfig, device_type type, const char *tag)
+ : vsmile_state(mconfig, type, tag)
+ { }
+
+ void vsmilem(machine_config &config);
+
+protected:
+ DECLARE_WRITE16_MEMBER(porta_w);
+ DECLARE_READ16_MEMBER(porta_r);
+};
+
class vsmileb_state : public vsmile_base_state
{
public:
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index d9a29c990a9..8787b0fc1a9 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -38671,6 +38671,7 @@ mattelcs //
vsmile //
vsmilef //
vsmileg //
+vsmilem //
@source:vsmileb.cpp
vsmileb //