summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/vtech2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/vtech2.cpp')
-rw-r--r--src/mame/drivers/vtech2.cpp116
1 files changed, 101 insertions, 15 deletions
diff --git a/src/mame/drivers/vtech2.cpp b/src/mame/drivers/vtech2.cpp
index 78c72c220f2..9d69691bb99 100644
--- a/src/mame/drivers/vtech2.cpp
+++ b/src/mame/drivers/vtech2.cpp
@@ -59,9 +59,9 @@
F 0x3c000 - 0x3ffff ROM expansion
TODO:
- Add ROMs and drivers for the Laser100, 110,
- 210 and 310 machines and the Texet 8000.
- They should probably go to the vtech1.c files, though.
+ - Hook up cart slots
+ - Ram pak
+ - undumped DOS ROM
***************************************************************************/
@@ -77,24 +77,89 @@
#include "formats/vt_cas.h"
-void vtech2_state::vtech2_mem(address_map &map)
+void vtech2_state::mem_map(address_map &map)
{
- map.unmap_value_high();
- map(0x0000, 0x3fff).bankrw("bank1");
- map(0x4000, 0x7fff).bankrw("bank2");
- map(0x8000, 0xbfff).bankrw("bank3");
- map(0xc000, 0xffff).bankrw("bank4");
+ map(0x0000, 0x3fff).m(m_banka, FUNC(address_map_bank_device::amap8));
+ map(0x4000, 0x7fff).m(m_bankb, FUNC(address_map_bank_device::amap8));
+ map(0x8000, 0xbfff).m(m_bankc, FUNC(address_map_bank_device::amap8));
+ map(0xc000, 0xffff).m(m_bankd, FUNC(address_map_bank_device::amap8));
}
-void vtech2_state::vtech2_io(address_map &map)
+void vtech2_state::io_map(address_map &map)
{
map.global_mask(0xff);
map(0x10, 0x1f).rw(FUNC(vtech2_state::laser_fdc_r), FUNC(vtech2_state::laser_fdc_w));
- map(0x40, 0x43).w(FUNC(vtech2_state::laser_bank_select_w));
+ map(0x40, 0x40).lw8("set_bankA", [this] (u8 data) { m_banka->set_bank(data & 15); });
+ map(0x41, 0x41).lw8("set_bankB", [this] (u8 data) { m_bankb->set_bank(data & 15); });
+ map(0x42, 0x42).lw8("set_bankC", [this] (u8 data) { m_bankc->set_bank(data & 15); });
+ map(0x43, 0x43).lw8("set_bankD", [this] (u8 data) { m_bankd->set_bank(data & 15); });
map(0x44, 0x44).w(FUNC(vtech2_state::laser_bg_mode_w));
map(0x45, 0x45).w(FUNC(vtech2_state::laser_two_color_w));
}
+// Laser 350, 16k ram
+void vtech2_state::m_map350(address_map &map)
+{
+ map(0x00000, 0x03fff).rom().region("maincpu", 0);
+ map(0x04000, 0x07fff).rom().region("maincpu", 0x4000);
+ map(0x08000, 0x0bfff).rw(FUNC(vtech2_state::mmio_r), FUNC(vtech2_state::mmio_w));
+ map(0x0c000, 0x0ffff).ram().share(m_videoram);
+ map(0x10000, 0x13fff).noprw();
+ map(0x14000, 0x17fff).noprw();
+ map(0x18000, 0x1bfff).noprw();
+ map(0x1c000, 0x1ffff).noprw();
+ map(0x20000, 0x23fff).noprw(); // TODO: 64k ram expansion pak
+ map(0x24000, 0x27fff).noprw(); // TODO: 64k ram expansion pak
+ map(0x28000, 0x2bfff).noprw(); // TODO: 64k ram expansion pak
+ map(0x2c000, 0x2ffff).noprw(); // TODO: 64k ram expansion pak
+ map(0x30000, 0x33fff).noprw(); // TODO: rom in expansion port
+ map(0x34000, 0x37fff).noprw(); // TODO: rom in expansion port
+ map(0x38000, 0x3bfff).noprw(); // TODO: rom in expansion port
+ map(0x3c000, 0x3ffff).noprw(); // TODO: rom in expansion port
+}
+
+// Laser 500, 64k ram
+void vtech2_state::m_map500(address_map &map)
+{
+ map(0x00000, 0x03fff).rom().region("maincpu", 0);
+ map(0x04000, 0x07fff).rom().region("maincpu", 0x4000);
+ map(0x08000, 0x0bfff).rw(FUNC(vtech2_state::mmio_r), FUNC(vtech2_state::mmio_w));
+ map(0x0c000, 0x0ffff).noprw();
+ map(0x10000, 0x13fff).ram();
+ map(0x14000, 0x17fff).ram();
+ map(0x18000, 0x1bfff).ram();
+ map(0x1c000, 0x1ffff).ram().share(m_videoram);
+ map(0x20000, 0x23fff).noprw(); // TODO: 64k ram expansion pak
+ map(0x24000, 0x27fff).noprw(); // TODO: 64k ram expansion pak
+ map(0x28000, 0x2bfff).noprw(); // TODO: 64k ram expansion pak
+ map(0x2c000, 0x2ffff).noprw(); // TODO: 64k ram expansion pak
+ map(0x30000, 0x33fff).noprw(); // TODO: rom in expansion port
+ map(0x34000, 0x37fff).noprw(); // TODO: rom in expansion port
+ map(0x38000, 0x3bfff).noprw(); // TODO: rom in expansion port
+ map(0x3c000, 0x3ffff).noprw(); // TODO: rom in expansion port
+}
+
+// Laser 700, 128k ram
+void vtech2_state::m_map700(address_map &map)
+{
+ map(0x00000, 0x03fff).rom().region("maincpu", 0);
+ map(0x04000, 0x07fff).rom().region("maincpu", 0x4000);
+ map(0x08000, 0x0bfff).rw(FUNC(vtech2_state::mmio_r), FUNC(vtech2_state::mmio_w));
+ map(0x0c000, 0x0ffff).noprw();
+ map(0x10000, 0x13fff).ram();
+ map(0x14000, 0x17fff).ram();
+ map(0x18000, 0x1bfff).ram();
+ map(0x1c000, 0x1ffff).ram().share(m_videoram);
+ map(0x20000, 0x23fff).ram();
+ map(0x24000, 0x27fff).ram();
+ map(0x28000, 0x2bfff).ram();
+ map(0x2c000, 0x2ffff).ram();
+ map(0x30000, 0x33fff).noprw(); // TODO: rom in expansion port
+ map(0x34000, 0x37fff).noprw(); // TODO: rom in expansion port
+ map(0x38000, 0x3bfff).noprw(); // TODO: rom in expansion port
+ map(0x3c000, 0x3ffff).noprw(); // TODO: rom in expansion port
+}
+
static INPUT_PORTS_START( laser500 )
PORT_START("ROW0") /* KEY ROW 0 */
@@ -428,11 +493,16 @@ static const floppy_interface vtech2_floppy_interface =
MACHINE_CONFIG_START(vtech2_state::laser350)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", Z80, 3694700) /* 3.694700 MHz */
- MCFG_DEVICE_PROGRAM_MAP(vtech2_mem)
- MCFG_DEVICE_IO_MAP(vtech2_io)
+ MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ MCFG_DEVICE_IO_MAP(io_map)
MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vtech2_state, vtech2_interrupt)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ ADDRESS_MAP_BANK(config, "banka").set_map(&vtech2_state::m_map350).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankb").set_map(&vtech2_state::m_map350).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankc").set_map(&vtech2_state::m_map350).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankd").set_map(&vtech2_state::m_map350).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
@@ -467,13 +537,29 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(vtech2_state::laser500)
laser350(config);
- MCFG_MACHINE_RESET_OVERRIDE(vtech2_state, laser500 )
+
+ config.device_remove("banka");
+ config.device_remove("bankb");
+ config.device_remove("bankc");
+ config.device_remove("bankd");
+ ADDRESS_MAP_BANK(config, "banka").set_map(&vtech2_state::m_map500).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankb").set_map(&vtech2_state::m_map500).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankc").set_map(&vtech2_state::m_map500).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankd").set_map(&vtech2_state::m_map500).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(vtech2_state::laser700)
laser350(config);
- MCFG_MACHINE_RESET_OVERRIDE(vtech2_state, laser700 )
+
+ config.device_remove("banka");
+ config.device_remove("bankb");
+ config.device_remove("bankc");
+ config.device_remove("bankd");
+ ADDRESS_MAP_BANK(config, "banka").set_map(&vtech2_state::m_map700).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankb").set_map(&vtech2_state::m_map700).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankc").set_map(&vtech2_state::m_map700).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
+ ADDRESS_MAP_BANK(config, "bankd").set_map(&vtech2_state::m_map700).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
/* Second 5.25" floppy drive */
MCFG_LEGACY_FLOPPY_DRIVE_ADD( FLOPPY_1, vtech2_floppy_interface )