diff --git a/.gitattributes b/.gitattributes index 7f2518c6e57..dfb64307c33 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1506,6 +1506,26 @@ src/emu/bus/vip/vp620.c svneol=native#text/plain src/emu/bus/vip/vp620.h svneol=native#text/plain src/emu/bus/vip/vp700.c svneol=native#text/plain src/emu/bus/vip/vp700.h svneol=native#text/plain +src/emu/bus/vtech/ioexp/carts.c svneol=native#text/plain +src/emu/bus/vtech/ioexp/carts.h svneol=native#text/plain +src/emu/bus/vtech/ioexp/ioexp.c svneol=native#text/plain +src/emu/bus/vtech/ioexp/ioexp.h svneol=native#text/plain +src/emu/bus/vtech/ioexp/joystick.c svneol=native#text/plain +src/emu/bus/vtech/ioexp/joystick.h svneol=native#text/plain +src/emu/bus/vtech/ioexp/printer.c svneol=native#text/plain +src/emu/bus/vtech/ioexp/printer.h svneol=native#text/plain +src/emu/bus/vtech/memexp/carts.c svneol=native#text/plain +src/emu/bus/vtech/memexp/carts.h svneol=native#text/plain +src/emu/bus/vtech/memexp/floppy.c svneol=native#text/plain +src/emu/bus/vtech/memexp/floppy.h svneol=native#text/plain +src/emu/bus/vtech/memexp/memexp.c svneol=native#text/plain +src/emu/bus/vtech/memexp/memexp.h svneol=native#text/plain +src/emu/bus/vtech/memexp/memory.c svneol=native#text/plain +src/emu/bus/vtech/memexp/memory.h svneol=native#text/plain +src/emu/bus/vtech/memexp/rs232.c svneol=native#text/plain +src/emu/bus/vtech/memexp/rs232.h svneol=native#text/plain +src/emu/bus/vtech/memexp/wordpro.c svneol=native#text/plain +src/emu/bus/vtech/memexp/wordpro.h svneol=native#text/plain src/emu/bus/wangpc/emb.c svneol=native#text/plain src/emu/bus/wangpc/emb.h svneol=native#text/plain src/emu/bus/wangpc/lic.c svneol=native#text/plain diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak index 82eeb2df5cd..46525786b05 100644 --- a/src/emu/bus/bus.mak +++ b/src/emu/bus/bus.mak @@ -1165,3 +1165,31 @@ BUSOBJS += $(BUSOBJ)/ql/rom.o BUSOBJS += $(BUSOBJ)/ql/miracle_hd.o BUSOBJS += $(BUSOBJ)/ql/std.o endif + +#------------------------------------------------- +# +#@src/emu/bus/vtech/memexp/memexp.h,BUSES += VTECH_MEMEXP +#------------------------------------------------- + +ifneq ($(filter VTECH_MEMEXP,$(BUSES)),) +OBJDIRS += $(BUSOBJ)/vtech/memexp +BUSOBJS += $(BUSOBJ)/vtech/memexp/memexp.o +BUSOBJS += $(BUSOBJ)/vtech/memexp/carts.o +BUSOBJS += $(BUSOBJ)/vtech/memexp/floppy.o +BUSOBJS += $(BUSOBJ)/vtech/memexp/memory.o +BUSOBJS += $(BUSOBJ)/vtech/memexp/rs232.o +BUSOBJS += $(BUSOBJ)/vtech/memexp/wordpro.o +endif + +#------------------------------------------------- +# +#@src/emu/bus/vtech/ioexp/ioexp.h,BUSES += VTECH_IOEXP +#------------------------------------------------- + +ifneq ($(filter VTECH_IOEXP,$(BUSES)),) +OBJDIRS += $(BUSOBJ)/vtech/ioexp +BUSOBJS += $(BUSOBJ)/vtech/ioexp/ioexp.o +BUSOBJS += $(BUSOBJ)/vtech/ioexp/carts.o +BUSOBJS += $(BUSOBJ)/vtech/ioexp/joystick.o +BUSOBJS += $(BUSOBJ)/vtech/ioexp/printer.o +endif diff --git a/src/emu/bus/vtech/ioexp/carts.c b/src/emu/bus/vtech/ioexp/carts.c new file mode 100644 index 00000000000..90260b722b1 --- /dev/null +++ b/src/emu/bus/vtech/ioexp/carts.c @@ -0,0 +1,12 @@ +/*************************************************************************** + + VTech Laser/VZ I/O Expansion Slot Devices + +***************************************************************************/ + +#include "carts.h" + +SLOT_INTERFACE_START( ioexp_slot_carts ) + SLOT_INTERFACE("joystick", JOYSTICK_INTERFACE) + SLOT_INTERFACE("printer", PRINTER_INTERFACE) +SLOT_INTERFACE_END diff --git a/src/emu/bus/vtech/ioexp/carts.h b/src/emu/bus/vtech/ioexp/carts.h new file mode 100644 index 00000000000..afca300774f --- /dev/null +++ b/src/emu/bus/vtech/ioexp/carts.h @@ -0,0 +1,19 @@ +/*************************************************************************** + + VTech Laser/VZ I/O Expansion Slot Devices + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_IOEXP_CARTS_H__ +#define __VTECH_IOEXP_CARTS_H__ + +#include "emu.h" + +#include "joystick.h" +#include "printer.h" + +SLOT_INTERFACE_EXTERN( ioexp_slot_carts ); + +#endif // __VTECH_IOEXP_CARTS_H__ diff --git a/src/emu/bus/vtech/ioexp/ioexp.c b/src/emu/bus/vtech/ioexp/ioexp.c new file mode 100644 index 00000000000..b9706c1812d --- /dev/null +++ b/src/emu/bus/vtech/ioexp/ioexp.c @@ -0,0 +1,92 @@ +/*************************************************************************** + + VTech Laser/VZ I/O Expansion Slot + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + 30-pin slot + +***************************************************************************/ + +#include "ioexp.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type IOEXP_SLOT = &device_creator; + + +//************************************************************************** +// SLOT DEVICE +//************************************************************************** + +//------------------------------------------------- +// ioexp_slot_device - constructor +//------------------------------------------------- + +ioexp_slot_device::ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, IOEXP_SLOT, "Peripheral Expansion Slot", tag, owner, clock, "ioexp_slot", __FILE__), + device_slot_interface(mconfig, *this), + m_io(NULL), + m_cart(NULL) +{ +} + +//------------------------------------------------- +// ioexp_slot_device - destructor +//------------------------------------------------- + +ioexp_slot_device::~ioexp_slot_device() +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void ioexp_slot_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void ioexp_slot_device::device_reset() +{ +} + +//------------------------------------------------- +// set_io_space - set address space we are attached to +//------------------------------------------------- + +void ioexp_slot_device::set_io_space(address_space *io) +{ + m_io = io; +} + + +//************************************************************************** +// CARTRIDGE INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_ioexp_interface - constructor +//------------------------------------------------- + +device_ioexp_interface::device_ioexp_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig, device) +{ + m_slot = dynamic_cast(device.owner()); +} + +//------------------------------------------------- +// ~device_ioexp_interface - destructor +//------------------------------------------------- + +device_ioexp_interface::~device_ioexp_interface() +{ +} diff --git a/src/emu/bus/vtech/ioexp/ioexp.h b/src/emu/bus/vtech/ioexp/ioexp.h new file mode 100644 index 00000000000..782cd8a229a --- /dev/null +++ b/src/emu/bus/vtech/ioexp/ioexp.h @@ -0,0 +1,88 @@ +/*************************************************************************** + + VTech Laser/VZ I/O Expansion Slot + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + 30-pin slot + + 15 GND 16 NC + 14 /WR 17 NC + 13 A3 18 NC + 12 A6 19 +5VDC + 11 A2 20 NC + 10 A5 21 D4 + 9 D0 22 D5 + 8 D2 23 D7 + 7 D6 24 D1 + 6 D3 25 /RD + 5 /IORQ 26 A1 + 4 +5VDC 27 A4 + 3 NC 28 A0 + 2 NC 29 A7 + 1 NC 30 NC + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_IOEXP_H__ +#define __VTECH_IOEXP_H__ + +#include "emu.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_IOEXP_SLOT_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, IOEXP_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(ioexp_slot_carts, NULL, false) + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class device_ioexp_interface; + +class ioexp_slot_device : public device_t, public device_slot_interface +{ +public: + // construction/destruction + ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~ioexp_slot_device(); + + void set_io_space(address_space *io); + + address_space *m_io; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + device_ioexp_interface *m_cart; +}; + +// class representing interface-specific live ioexp device +class device_ioexp_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_ioexp_interface(const machine_config &mconfig, device_t &device); + virtual ~device_ioexp_interface(); + +protected: + ioexp_slot_device *m_slot; +}; + +// device type definition +extern const device_type IOEXP_SLOT; + +// include here so drivers don't need to +#include "carts.h" + +#endif // __VTECH_IOEXP_H__ diff --git a/src/emu/bus/vtech/ioexp/joystick.c b/src/emu/bus/vtech/ioexp/joystick.c new file mode 100644 index 00000000000..9169c420e06 --- /dev/null +++ b/src/emu/bus/vtech/ioexp/joystick.c @@ -0,0 +1,110 @@ +/*************************************************************************** + + VTech Laser/VZ Joystick Interface + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + VTech Laser JS 20 + Dick Smith Electronics X-7315 + +***************************************************************************/ + +#include "joystick.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type JOYSTICK_INTERFACE = &device_creator; + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +static INPUT_PORTS_START( joystick ) + PORT_START("joystick_0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) + PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("joystick_0_arm") + PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) + PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("joystick_1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) + PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("joystick_1_arm") + PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) + PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) +INPUT_PORTS_END + +ioport_constructor joystick_interface_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( joystick ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// joystick_interface_device - constructor +//------------------------------------------------- + +joystick_interface_device::joystick_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, JOYSTICK_INTERFACE, "Laser/VZ Joystick Interface", tag, owner, clock, "joystick", __FILE__), + device_ioexp_interface(mconfig, *this), + m_joy0(*this, "joystick_0"), + m_joy0_arm(*this, "joystick_0_arm"), + m_joy1(*this, "joystick_1"), + m_joy1_arm(*this, "joystick_1_arm") +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void joystick_interface_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void joystick_interface_device::device_reset() +{ + m_slot->m_io->install_read_handler(0x20, 0x2f, read8_delegate(FUNC(joystick_interface_device::joystick_r), this)); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ8_MEMBER( joystick_interface_device::joystick_r ) +{ + UINT8 data = 0xff; + + if (!BIT(offset, 0)) data &= m_joy0->read(); + if (!BIT(offset, 1)) data &= m_joy0_arm->read(); + if (!BIT(offset, 2)) data &= m_joy1->read(); + if (!BIT(offset, 3)) data &= m_joy1_arm->read(); + + return data; +} diff --git a/src/emu/bus/vtech/ioexp/joystick.h b/src/emu/bus/vtech/ioexp/joystick.h new file mode 100644 index 00000000000..8344ce43d40 --- /dev/null +++ b/src/emu/bus/vtech/ioexp/joystick.h @@ -0,0 +1,51 @@ +/*************************************************************************** + + VTech Laser Joystick Interface + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + VTech Laser JS 20 + Dick Smith Electronics X-7315 + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_IOEXP_JOYSTICK_H__ +#define __VTECH_IOEXP_JOYSTICK_H__ + +#include "emu.h" +#include "ioexp.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> joystick_interface_device + +class joystick_interface_device : public device_t, public device_ioexp_interface +{ +public: + // construction/destruction + joystick_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ8_MEMBER( joystick_r ); + +protected: + virtual ioport_constructor device_input_ports() const; + virtual void device_start(); + virtual void device_reset(); + +private: + required_ioport m_joy0; + required_ioport m_joy0_arm; + required_ioport m_joy1; + required_ioport m_joy1_arm; +}; + +// device type definition +extern const device_type JOYSTICK_INTERFACE; + +#endif // __VTECH_IOEXP_JOYSTICK_H__ diff --git a/src/emu/bus/vtech/ioexp/printer.c b/src/emu/bus/vtech/ioexp/printer.c new file mode 100644 index 00000000000..bb659bdfd66 --- /dev/null +++ b/src/emu/bus/vtech/ioexp/printer.c @@ -0,0 +1,94 @@ +/*************************************************************************** + + VTech Laser/VZ Printer Interface + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + VTech PI 20 + Dick Smith Electronics X-7320 + +***************************************************************************/ + +#include "printer.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type PRINTER_INTERFACE = &device_creator; + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( printer_interface ) + MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer") + MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(printer_interface_device, busy_w)) + MCFG_CENTRONICS_OUTPUT_LATCH_ADD("latch", "centronics") +MACHINE_CONFIG_END + +machine_config_constructor printer_interface_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( printer_interface ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// printer_interface_device - constructor +//------------------------------------------------- + +printer_interface_device::printer_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, PRINTER_INTERFACE, "Laser/VZ Printer Interface", tag, owner, clock, "printer", __FILE__), + device_ioexp_interface(mconfig, *this), + m_centronics(*this, "centronics"), + m_latch(*this, "latch"), + m_centronics_busy(0) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void printer_interface_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void printer_interface_device::device_reset() +{ + m_slot->m_io->install_read_handler(0x00, 0x00, read8_delegate(FUNC(printer_interface_device::busy_r), this)); + m_slot->m_io->install_write_handler(0x0d, 0x0d, write8_delegate(FUNC(printer_interface_device::strobe_w), this)); + m_slot->m_io->install_write_handler(0x0e, 0x0e, write8_delegate(FUNC(output_latch_device::write), m_latch.target())); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +WRITE_LINE_MEMBER( printer_interface_device::busy_w ) +{ + m_centronics_busy = state; +} + +READ8_MEMBER( printer_interface_device::busy_r ) +{ + return 0xfe | m_centronics_busy; +} + +WRITE8_MEMBER( printer_interface_device::strobe_w ) +{ + m_centronics->write_strobe(1); + m_centronics->write_strobe(0); +} diff --git a/src/emu/bus/vtech/ioexp/printer.h b/src/emu/bus/vtech/ioexp/printer.h new file mode 100644 index 00000000000..0229b9051e7 --- /dev/null +++ b/src/emu/bus/vtech/ioexp/printer.h @@ -0,0 +1,53 @@ +/*************************************************************************** + + VTech Laser/VZ Printer Interface + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + Dick Smith Electronics X-7320 + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_IOEXP_PRINTER_H__ +#define __VTECH_IOEXP_PRINTER_H__ + +#include "emu.h" +#include "ioexp.h" +#include "bus/centronics/ctronics.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> printer_interface_device + +class printer_interface_device : public device_t, public device_ioexp_interface +{ +public: + // construction/destruction + printer_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_WRITE_LINE_MEMBER( busy_w ); + DECLARE_READ8_MEMBER( busy_r ); + DECLARE_WRITE8_MEMBER( strobe_w ); + +protected: + virtual machine_config_constructor device_mconfig_additions() const; + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_centronics; + required_device m_latch; + + int m_centronics_busy; +}; + +// device type definition +extern const device_type PRINTER_INTERFACE; + +#endif // __VTECH_IOEXP_PRINTER_H__ diff --git a/src/emu/bus/vtech/memexp/carts.c b/src/emu/bus/vtech/memexp/carts.c new file mode 100644 index 00000000000..101f726ce42 --- /dev/null +++ b/src/emu/bus/vtech/memexp/carts.c @@ -0,0 +1,17 @@ +/*************************************************************************** + + VTech Laser/VZ Memory Expansion Slot Devices + +***************************************************************************/ + +#include "carts.h" + +SLOT_INTERFACE_START( memexp_slot_carts ) + SLOT_INTERFACE("floppy", FLOPPY_CONTROLLER) + SLOT_INTERFACE("laser110_16k", LASER110_16K) + SLOT_INTERFACE("laser210_16k", LASER210_16K) + SLOT_INTERFACE("laser310_16k", LASER310_16K) + SLOT_INTERFACE("laser_64k", LASER_64K) + SLOT_INTERFACE("rs232", RS232_INTERFACE) + SLOT_INTERFACE("wordpro", WORDPRO) +SLOT_INTERFACE_END diff --git a/src/emu/bus/vtech/memexp/carts.h b/src/emu/bus/vtech/memexp/carts.h new file mode 100644 index 00000000000..30663b75ed0 --- /dev/null +++ b/src/emu/bus/vtech/memexp/carts.h @@ -0,0 +1,21 @@ +/*************************************************************************** + + VTech Laser/VZ Memory Expansion Slot Devices + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_MEMEXP_CARTS_H__ +#define __VTECH_MEMEXP_CARTS_H__ + +#include "emu.h" + +#include "floppy.h" +#include "memory.h" +#include "rs232.h" +#include "wordpro.h" + +SLOT_INTERFACE_EXTERN( memexp_slot_carts ); + +#endif // __VTECH_MEMEXP_CARTS_H__ diff --git a/src/emu/bus/vtech/memexp/floppy.c b/src/emu/bus/vtech/memexp/floppy.c new file mode 100644 index 00000000000..7fdba97ace5 --- /dev/null +++ b/src/emu/bus/vtech/memexp/floppy.c @@ -0,0 +1,356 @@ +/*************************************************************************** + + VTech Laser/VZ Floppy Controller Cartridge + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + Laser DD 20 + Dick Smith Electronics X-7304 + + TODO: Broken currently, fix & modernize + +***************************************************************************/ + +#include "floppy.h" +#include "formats/vtech1_dsk.h" + + +//************************************************************************** +// CONSTANTS / MACROS +//************************************************************************** + +#define VERBOSE 1 + +#define PHI0(n) (((n) >> 0) & 1) +#define PHI1(n) (((n) >> 1) & 1) +#define PHI2(n) (((n) >> 2) & 1) +#define PHI3(n) (((n) >> 3) & 1) + + +//************************************************************************** +// FUNCTION PROTOTYPES +//************************************************************************** + +static void laser_load_proc(device_image_interface &image); + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type FLOPPY_CONTROLLER = &device_creator; + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +ROM_START( floppy ) + ROM_REGION(0x3000, "software", 0) + ROM_LOAD("vzdos.rom", 0x0000, 0x2000, CRC(b6ed6084) SHA1(59d1cbcfa6c5e1906a32704fbf0d9670f0d1fd8b)) +ROM_END + +const rom_entry *floppy_controller_device::device_rom_region() const +{ + return ROM_NAME( floppy ); +} + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +static const floppy_interface laser_floppy_interface = +{ + FLOPPY_STANDARD_5_25_DSHD, + LEGACY_FLOPPY_OPTIONS_NAME(vtech1_only), + NULL +}; + +static MACHINE_CONFIG_FRAGMENT( floppy_controller ) + MCFG_MEMEXP_SLOT_ADD("mem") + MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(laser_floppy_interface) +MACHINE_CONFIG_END + +machine_config_constructor floppy_controller_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( floppy_controller ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// floppy_controller_device - constructor +//------------------------------------------------- + +floppy_controller_device::floppy_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, FLOPPY_CONTROLLER, "Laser/VZ Floppy Disk Controller", tag, owner, clock, "laserfdc", __FILE__), + device_memexp_interface(mconfig, *this), + m_memexp(*this, "mem"), + m_floppy0(*this, "floppy0"), + m_floppy1(*this, "floppy1") +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void floppy_controller_device::device_start() +{ + m_drive = -1; + m_fdc_track_x2[0] = 80; + m_fdc_track_x2[1] = 80; + m_fdc_wrprot[0] = 0x80; + m_fdc_wrprot[1] = 0x80; + m_fdc_status = 0; + m_fdc_edge = 0; + m_fdc_bits = 8; + m_fdc_start = 0; + m_fdc_write = 0; + m_fdc_offs = 0; + m_fdc_latch = 0; + + m_floppy0->floppy_install_load_proc(laser_load_proc); + m_floppy1->floppy_install_load_proc(laser_load_proc); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void floppy_controller_device::device_reset() +{ + m_memexp->set_io_space(m_slot->m_io); + m_memexp->set_program_space(m_slot->m_program); + + m_slot->m_program->install_rom(0x4000, 0x5fff, memregion("software")->base()); + + m_slot->m_io->install_read_handler(0x10, 0x1f, read8_delegate(FUNC(floppy_controller_device::floppy_r), this)); + m_slot->m_io->install_write_handler(0x10, 0x1f, write8_delegate(FUNC(floppy_controller_device::floppy_w), this)); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +int floppy_controller_device::get_floppy_id(device_image_interface *image) +{ + if (image == dynamic_cast(m_floppy0.target())) + return 0; + if (image == dynamic_cast(m_floppy1.target())) + return 1; + + return -1; +} + +device_image_interface *floppy_controller_device::get_floppy_device(int drive) +{ + device_image_interface *image = NULL; + + switch (drive) + { + case 0: + image = dynamic_cast(m_floppy0.target()); + break; + + case 1: + image = dynamic_cast(m_floppy1.target()); + break; + } + + return image; +} + +static void laser_load_proc(device_image_interface &image) +{ + floppy_controller_device *fdc = dynamic_cast(image.device().owner()); + + int id = fdc->get_floppy_id(&image); + + if (!image.is_readonly()) + fdc->m_fdc_wrprot[id] = 0x00; + else + fdc->m_fdc_wrprot[id] = 0x80; +} + +void floppy_controller_device::get_track() +{ + device_image_interface *image = get_floppy_device(m_drive); + + /* drive selected or and image file ok? */ + if (m_drive >= 0 && image->exists()) + { + int size, offs; + size = TRKSIZE_VZ; + offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; + image->fseek(offs, SEEK_SET); + // some disks have slightly larger header, make sure we capture the checksum at the end of the track + size = image->fread(m_fdc_data, size+4); + if (VERBOSE) + logerror("get track @$%05x $%04x bytes\n", offs, size); + } + m_fdc_offs = 0; + m_fdc_write = 0; +} + +void floppy_controller_device::put_track() +{ + /* drive selected and image file ok? */ + if (m_drive >= 0 && floppy_get_device(machine(),m_drive) != NULL) + { + int size, offs; + device_image_interface *image = get_floppy_device(m_drive); + offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; + image->fseek(offs + m_fdc_start, SEEK_SET); + size = image->fwrite(&m_fdc_data[m_fdc_start], m_fdc_write); + if (VERBOSE) + logerror("put track @$%05X+$%X $%04X/$%04X bytes\n", offs, m_fdc_start, size, m_fdc_write); + } +} + +READ8_MEMBER( floppy_controller_device::floppy_r ) +{ + int data = 0xff; + + switch (offset) + { + case 1: /* data (read-only) */ + if (m_fdc_bits > 0) + { + if( m_fdc_status & 0x80 ) + m_fdc_bits--; + data = (m_data >> m_fdc_bits) & 0xff; + if (VERBOSE) { + logerror("vtech1_fdc_r bits %d%d%d%d%d%d%d%d\n", + (data>>7)&1,(data>>6)&1,(data>>5)&1,(data>>4)&1, + (data>>3)&1,(data>>2)&1,(data>>1)&1,(data>>0)&1 ); + } + } + if (m_fdc_bits == 0) + { + m_data = m_fdc_data[m_fdc_offs]; + if (VERBOSE) + logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, m_fdc_offs, m_data); + if(m_fdc_status & 0x80) + { + m_fdc_bits = 8; + m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; + } + m_fdc_status &= ~0x80; + } + break; + case 2: /* polling (read-only) */ + /* fake */ + if (m_drive >= 0) + m_fdc_status |= 0x80; + data = m_fdc_status; + break; + case 3: /* write protect status (read-only) */ + if (m_drive >= 0) + data = m_fdc_wrprot[m_drive]; + if (VERBOSE) + logerror("vtech1_fdc_r %d : write_protect $%02X\n", offset, data); + break; + } + return data; +} + +WRITE8_MEMBER( floppy_controller_device::floppy_w ) +{ + int drive; + + switch (offset) + { + case 0: /* latch (write-only) */ + drive = (data & 0x10) ? 0 : (data & 0x80) ? 1 : -1; + if (drive != m_drive) + { + m_drive = drive; + if (m_drive >= 0) + get_track(); + } + if (m_drive >= 0) + { + if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(m_fdc_latch)) || + (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(m_fdc_latch)) || + (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(m_fdc_latch)) || + (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(m_fdc_latch))) + { + if (m_fdc_track_x2[m_drive] > 0) + m_fdc_track_x2[m_drive]--; + if (VERBOSE) + logerror("vtech1_fdc_w(%d) $%02X drive %d: stepout track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1)); + if ((m_fdc_track_x2[m_drive] & 1) == 0) + get_track(); + } + else + if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(m_fdc_latch)) || + (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(m_fdc_latch)) || + (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(m_fdc_latch)) || + (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(m_fdc_latch))) + { + if (m_fdc_track_x2[m_drive] < 2*40) + m_fdc_track_x2[m_drive]++; + if (VERBOSE) + logerror("vtech1_fdc_w(%d) $%02X drive %d: stepin track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1)); + if ((m_fdc_track_x2[m_drive] & 1) == 0) + get_track(); + } + if ((data & 0x40) == 0) + { + m_data <<= 1; + if ((m_fdc_latch ^ data) & 0x20) + m_data |= 1; + if ((m_fdc_edge ^= 1) == 0) + { + m_fdc_bits--; + + if (m_fdc_bits == 0) + { + UINT8 value = 0; + m_data &= 0xffff; + if (m_data & 0x4000 ) value |= 0x80; + if (m_data & 0x1000 ) value |= 0x40; + if (m_data & 0x0400 ) value |= 0x20; + if (m_data & 0x0100 ) value |= 0x10; + if (m_data & 0x0040 ) value |= 0x08; + if (m_data & 0x0010 ) value |= 0x04; + if (m_data & 0x0004 ) value |= 0x02; + if (m_data & 0x0001 ) value |= 0x01; + if (VERBOSE) + logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, m_fdc_offs, m_fdc_data[m_fdc_offs], value, m_data); + m_fdc_data[m_fdc_offs] = value; + m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; + m_fdc_write++; + m_fdc_bits = 8; + } + } + } + /* change of write signal? */ + if ((m_fdc_latch ^ data) & 0x40) + { + /* falling edge? */ + if (m_fdc_latch & 0x40) + { + m_fdc_start = m_fdc_offs; + m_fdc_edge = 0; + } + else + { + /* data written to track before? */ + if (m_fdc_write) + put_track(); + } + m_fdc_bits = 8; + m_fdc_write = 0; + } + } + m_fdc_latch = data; + break; + } +} diff --git a/src/emu/bus/vtech/memexp/floppy.h b/src/emu/bus/vtech/memexp/floppy.h new file mode 100644 index 00000000000..03e1a569734 --- /dev/null +++ b/src/emu/bus/vtech/memexp/floppy.h @@ -0,0 +1,76 @@ +/*************************************************************************** + + VTech Laser/VZ Floppy Controller Cartridge + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + Laser DD 20 + Dick Smith Electronics X-7304 + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_MEMEXP_FLOPPY_H__ +#define __VTECH_MEMEXP_FLOPPY_H__ + +#include "emu.h" +#include "memexp.h" +#include "imagedev/flopdrv.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> floppy_controller_device + +class floppy_controller_device : public device_t, public device_memexp_interface +{ +public: + // construction/destruction + floppy_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ8_MEMBER( floppy_r ); + DECLARE_WRITE8_MEMBER( floppy_w ); + + // accessed from loadproc + int get_floppy_id(device_image_interface *image); + UINT8 m_fdc_wrprot[2]; + +protected: + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + virtual void device_start(); + virtual void device_reset(); + +private: + static const int TRKSIZE_VZ = 0x9a0; // arbitrary (actually from analyzing format) + static const int TRKSIZE_FM = 3172; // size of a standard FM mode track + + device_image_interface *get_floppy_device(int drive); + void put_track(); + void get_track(); + + required_device m_memexp; + required_device m_floppy0; + required_device m_floppy1; + + int m_drive; + UINT8 m_fdc_track_x2[2]; + UINT8 m_fdc_status; + UINT8 m_fdc_data[TRKSIZE_FM]; + int m_data; + int m_fdc_edge; + int m_fdc_bits; + int m_fdc_start; + int m_fdc_write; + int m_fdc_offs; + int m_fdc_latch; +}; + +// device type definition +extern const device_type FLOPPY_CONTROLLER; + +#endif // __VTECH_MEMEXP_FLOPPY_H__ diff --git a/src/emu/bus/vtech/memexp/memexp.c b/src/emu/bus/vtech/memexp/memexp.c new file mode 100644 index 00000000000..f05bb52e3fb --- /dev/null +++ b/src/emu/bus/vtech/memexp/memexp.c @@ -0,0 +1,109 @@ +/*************************************************************************** + + VTech Laser/VZ Memory Expansion Slot + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + 44-pin slot + +***************************************************************************/ + +#include "memexp.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type MEMEXP_SLOT = &device_creator; + + +//************************************************************************** +// SLOT DEVICE +//************************************************************************** + +//------------------------------------------------- +// memexp_slot_device - constructor +//------------------------------------------------- + +memexp_slot_device::memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, MEMEXP_SLOT, "Memory Expansion Slot", tag, owner, clock, "memexp_slot", __FILE__), + device_slot_interface(mconfig, *this), + m_program(NULL), + m_io(NULL), + m_cart(NULL), + m_int_handler(*this), + m_nmi_handler(*this), + m_reset_handler(*this) +{ +} + +//------------------------------------------------- +// memexp_slot_device - destructor +//------------------------------------------------- + +memexp_slot_device::~memexp_slot_device() +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void memexp_slot_device::device_start() +{ + // resolve callbacks + m_int_handler.resolve_safe(); + m_nmi_handler.resolve_safe(); + m_reset_handler.resolve_safe(); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void memexp_slot_device::device_reset() +{ +} + +//------------------------------------------------- +// set_program_space - set address space we are attached to +//------------------------------------------------- + +void memexp_slot_device::set_program_space(address_space *program) +{ + m_program = program; +} + +//------------------------------------------------- +// set_io_space - set address space we are attached to +//------------------------------------------------- + +void memexp_slot_device::set_io_space(address_space *io) +{ + m_io = io; +} + + +//************************************************************************** +// CARTRIDGE INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_memexp_interface - constructor +//------------------------------------------------- + +device_memexp_interface::device_memexp_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig, device) +{ + m_slot = dynamic_cast(device.owner()); +} + +//------------------------------------------------- +// ~device_memexp_interface - destructor +//------------------------------------------------- + +device_memexp_interface::~device_memexp_interface() +{ +} diff --git a/src/emu/bus/vtech/memexp/memexp.h b/src/emu/bus/vtech/memexp/memexp.h new file mode 100644 index 00000000000..60940df14b5 --- /dev/null +++ b/src/emu/bus/vtech/memexp/memexp.h @@ -0,0 +1,126 @@ +/*************************************************************************** + + VTech Laser/VZ Memory Expansion Slot + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + + 44-pin slot + + 22 GND 23 NC + 21 +5VDC 24 A11 + 20 /IORQ 25 A12 + 19 /RD 26 A13 + 18 /NMI 27 A14 + 17 /WAIT 28 A15 + 16 /MI 29 CLK + 15 /RFSH 30 D4 + 14 D7 31 D3 + 13 D2 32 D5 + 12 A1 33 D6 + 11 A2 34 NC + 10 A3 35 A0 + 9 A4 36 D0 + 8 A5 37 D1 + 7 A6 38 /INT + 6 A7 39 /HALT + 5 A8 40 /MERQ + 4 A9 41 /WR + 3 A10 42 /NC + 2 /RESET 43 +9VDC + 1 GND 44 NC + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_MEMEXP_H__ +#define __VTECH_MEMEXP_H__ + +#include "emu.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_MEMEXP_SLOT_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, MEMEXP_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(memexp_slot_carts, NULL, false) + +#define MCFG_MEMEXP_SLOT_INT_HANDLER(_devcb) \ + devcb = &memexp_device::set_int_handler(*device, DEVCB_##_devcb); + +#define MCFG_MEMEXP_SLOT_NMI_HANDLER(_devcb) \ + devcb = &memexp_device::set_nmi_handler(*device, DEVCB_##_devcb); + +#define MCFG_MEMEXP_SLOT_RESET_HANDLER(_devcb) \ + devcb = &memexp_device::set_reset_handler(*device, DEVCB_##_devcb); + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class device_memexp_interface; + +class memexp_slot_device : public device_t, public device_slot_interface +{ +public: + // construction/destruction + memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~memexp_slot_device(); + + void set_program_space(address_space *program); + void set_io_space(address_space *io); + + // callbacks + template static devcb_base &set_int_handler(device_t &device, _Object object) + { return downcast(device).m_int_handler.set_callback(object); } + + template static devcb_base &set_nmi_handler(device_t &device, _Object object) + { return downcast(device).m_nmi_handler.set_callback(object); } + + template static devcb_base &set_reset_handler(device_t &device, _Object object) + { return downcast(device).m_reset_handler.set_callback(object); } + + // called from cart device + DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int_handler(state); } + DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); } + DECLARE_WRITE_LINE_MEMBER( reset_w ) { m_reset_handler(state); } + + address_space *m_program; + address_space *m_io; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + device_memexp_interface *m_cart; + +private: + devcb_write_line m_int_handler; + devcb_write_line m_nmi_handler; + devcb_write_line m_reset_handler; +}; + +// class representing interface-specific live memexp device +class device_memexp_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_memexp_interface(const machine_config &mconfig, device_t &device); + virtual ~device_memexp_interface(); + +protected: + memexp_slot_device *m_slot; +}; + +// device type definition +extern const device_type MEMEXP_SLOT; + +// include here so drivers don't need to +#include "carts.h" + +#endif // __VTECH_MEMEXP_H__ diff --git a/src/emu/bus/vtech/memexp/memory.c b/src/emu/bus/vtech/memexp/memory.c new file mode 100644 index 00000000000..f36bb5f0937 --- /dev/null +++ b/src/emu/bus/vtech/memexp/memory.c @@ -0,0 +1,167 @@ +/*************************************************************************** + + VTech Laser/VZ Laser Memory Expansions + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + +***************************************************************************/ + +#include "memory.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type LASER110_16K = &device_creator; +const device_type LASER210_16K = &device_creator; +const device_type LASER310_16K = &device_creator; +const device_type LASER_64K = &device_creator; + + +//************************************************************************** +// LASER 110 16K DEVICE +//************************************************************************** + +//------------------------------------------------- +// laser110_16k_device - constructor +//------------------------------------------------- + +laser110_16k_device::laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, LASER110_16K, "Laser 110/200/VZ-200 16k Memory", tag, owner, clock, "laser110_16k", __FILE__), + device_memexp_interface(mconfig, *this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void laser110_16k_device::device_start() +{ + m_ram.resize(16 * 1024); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void laser110_16k_device::device_reset() +{ + m_slot->m_program->install_ram(0x8000, 0xbfff, m_ram); +} + + +//************************************************************************** +// LASER 210 16K DEVICE +//************************************************************************** + +//------------------------------------------------- +// laser210_16k_device - constructor +//------------------------------------------------- + +laser210_16k_device::laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, LASER210_16K, "Laser 210/VZ-200 (DSE) 16k Memory", tag, owner, clock, "laser210_16k", __FILE__), + device_memexp_interface(mconfig, *this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void laser210_16k_device::device_start() +{ + m_ram.resize(16 * 1024); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void laser210_16k_device::device_reset() +{ + m_slot->m_program->install_ram(0x9000, 0xcfff, m_ram); +} + + +//************************************************************************** +// VZ300 16K DEVICE +//************************************************************************** + +//------------------------------------------------- +// laser310_16k_device - constructor +//------------------------------------------------- + +laser310_16k_device::laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, LASER310_16K, "Laser 310/VZ-300 16k Memory", tag, owner, clock, "laser310_16k", __FILE__), + device_memexp_interface(mconfig, *this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void laser310_16k_device::device_start() +{ + m_ram.resize(16 * 1024); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void laser310_16k_device::device_reset() +{ + m_slot->m_program->install_ram(0xb800, 0xf7ff, m_ram); +} + + +//************************************************************************** +// VZ300 64K DEVICE +//************************************************************************** + +//------------------------------------------------- +// laser_64k_device - constructor +//------------------------------------------------- + +laser_64k_device::laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, LASER_64K, "Laser/VZ 64k Memory", tag, owner, clock, "laser_64k", __FILE__), + device_memexp_interface(mconfig, *this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void laser_64k_device::device_start() +{ + m_ram.resize(64 * 1024); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void laser_64k_device::device_reset() +{ + // fixed first bank + m_slot->m_program->install_ram(0x8000, 0xbfff, m_ram); + + // other banks + m_slot->m_program->install_readwrite_bank(0xc000, 0xffff, tag()); + + membank(tag())->configure_entries(0, 4, m_ram, 0x4000); + membank(tag())->set_entry(1); + + // bank switch + m_slot->m_io->install_write_handler(0x70, 0x7f, write8_delegate(FUNC(laser_64k_device::bankswitch_w), this)); +} + +WRITE8_MEMBER( laser_64k_device::bankswitch_w ) +{ + membank(tag())->set_entry(data & 0x03); +} diff --git a/src/emu/bus/vtech/memexp/memory.h b/src/emu/bus/vtech/memexp/memory.h new file mode 100644 index 00000000000..99f3b9fd3ce --- /dev/null +++ b/src/emu/bus/vtech/memexp/memory.h @@ -0,0 +1,95 @@ +/*************************************************************************** + + VTech Laser/VZ Memory Expansions + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_MEMEXP_MEMORY__ +#define __VTECH_MEMEXP_MEMORY__ + +#include "emu.h" +#include "memexp.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> laser110_16k_device + +class laser110_16k_device : public device_t, public device_memexp_interface +{ +public: + // construction/destruction + laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + dynamic_array m_ram; +}; + +// ======================> laser210_16k_device + +class laser210_16k_device : public device_t, public device_memexp_interface +{ +public: + // construction/destruction + laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + dynamic_array m_ram; +}; + +// ======================> laser310_16k_device + +class laser310_16k_device : public device_t, public device_memexp_interface +{ +public: + // construction/destruction + laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + dynamic_array m_ram; +}; + +// ======================> laser_64k_device + +class laser_64k_device : public device_t, public device_memexp_interface +{ +public: + // construction/destruction + laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_WRITE8_MEMBER( bankswitch_w ); + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + dynamic_array m_ram; +}; + +// device type definition +extern const device_type LASER110_16K; +extern const device_type LASER210_16K; +extern const device_type LASER310_16K; +extern const device_type LASER_64K; + +#endif // __VTECH_MEMEXP_MEMORY__ diff --git a/src/emu/bus/vtech/memexp/rs232.c b/src/emu/bus/vtech/memexp/rs232.c new file mode 100644 index 00000000000..370879887d1 --- /dev/null +++ b/src/emu/bus/vtech/memexp/rs232.c @@ -0,0 +1,105 @@ +/*************************************************************************** + + Dick Smith VZ-200/300 RS-232 Cartridge + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + +***************************************************************************/ + +#include "rs232.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type RS232_INTERFACE = &device_creator; + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +ROM_START( rs232 ) + ROM_REGION(0x800, "software", 0) + ROM_LOAD("rs232_v15.ic2", 0x000, 0x800, CRC(6545260d) SHA1(4042f6f1e09e383f3c92f628c6187dc5f072fdb2)) +ROM_END + +const rom_entry *rs232_interface_device::device_rom_region() const +{ + return ROM_NAME( rs232 ); +} + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( rs232 ) + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL) + MCFG_RS232_RXD_HANDLER(WRITELINE(rs232_interface_device, rs232_rx_w)) +MACHINE_CONFIG_END + +machine_config_constructor rs232_interface_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( rs232 ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// wordpro_device - constructor +//------------------------------------------------- + +rs232_interface_device::rs232_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, RS232_INTERFACE, "DSE VZ-200/300 RS-232 Interface", tag, owner, clock, "vz_rs232", __FILE__), + device_memexp_interface(mconfig, *this), + m_rs232(*this, "rs232"), + m_rx(1) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void rs232_interface_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void rs232_interface_device::device_reset() +{ + // program + m_slot->m_program->install_rom(0x4000, 0x47ff, 0, 0x800, memregion("software")->base()); + + // data + m_slot->m_program->install_read_handler(0x5000, 0x57ff, read8_delegate(FUNC(rs232_interface_device::receive_data_r), this)); + m_slot->m_program->install_write_handler(0x5800, 0x5fff, write8_delegate(FUNC(rs232_interface_device::transmit_data_w), this)); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +WRITE_LINE_MEMBER( rs232_interface_device::rs232_rx_w ) +{ + m_rx = state; +} + +READ8_MEMBER( rs232_interface_device::receive_data_r ) +{ + return 0x7f | (m_rx << 7); +} + +WRITE8_MEMBER( rs232_interface_device::transmit_data_w ) +{ + m_rs232->write_txd(!BIT(data, 7)); +} diff --git a/src/emu/bus/vtech/memexp/rs232.h b/src/emu/bus/vtech/memexp/rs232.h new file mode 100644 index 00000000000..0d631875bad --- /dev/null +++ b/src/emu/bus/vtech/memexp/rs232.h @@ -0,0 +1,51 @@ +/*************************************************************************** + + Dick Smith VZ-200/300 RS-232 Cartridge + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_MEMEXP_RS232_H__ +#define __VTECH_MEMEXP_RS232_H__ + +#include "emu.h" +#include "memexp.h" +#include "bus/rs232/rs232.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> rs232_interface_device + +class rs232_interface_device : public device_t, public device_memexp_interface +{ +public: + // construction/destruction + rs232_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_WRITE_LINE_MEMBER( rs232_rx_w ); + DECLARE_READ8_MEMBER( receive_data_r ); + DECLARE_WRITE8_MEMBER( transmit_data_w ); + +protected: + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_rs232; + + int m_rx; +}; + +// device type definition +extern const device_type RS232_INTERFACE; + +#endif // __VTECH_MEMEXP_RS232_H__ diff --git a/src/emu/bus/vtech/memexp/wordpro.c b/src/emu/bus/vtech/memexp/wordpro.c new file mode 100644 index 00000000000..f1f3d1c2bed --- /dev/null +++ b/src/emu/bus/vtech/memexp/wordpro.c @@ -0,0 +1,66 @@ +/*************************************************************************** + + Dick Smith VZ-300 WordPro Cartridge + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + +***************************************************************************/ + +#include "wordpro.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type WORDPRO = &device_creator; + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +ROM_START( wordpro ) + ROM_REGION(0x3000, "software", 0) + ROM_LOAD("wordpro.u3", 0x0000, 0x1000, CRC(c37ea780) SHA1(03f56711e08d88e7b523c0ef9c2a5af83ee7ad05)) + ROM_LOAD("wordpro.u4", 0x1000, 0x1000, CRC(2e3a8c45) SHA1(a9d48d809f39a3478496a6d3ddd728bd0b4efc37)) + ROM_LOAD("wordpro.u5", 0x2000, 0x1000, CRC(2a336802) SHA1(b4de50f943243f18a2bfabef354b76d77178c189)) +ROM_END + +const rom_entry *wordpro_device::device_rom_region() const +{ + return ROM_NAME( wordpro ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// wordpro_device - constructor +//------------------------------------------------- + +wordpro_device::wordpro_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, WORDPRO, "DSE VZ-300 WordPro", tag, owner, clock, "wordpro", __FILE__), + device_memexp_interface(mconfig, *this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void wordpro_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void wordpro_device::device_reset() +{ + m_slot->m_program->install_rom(0x6000, 0x67ff, memregion("software")->base()); + m_slot->m_program->install_rom(0xd000, 0xffff, memregion("software")->base()); +} diff --git a/src/emu/bus/vtech/memexp/wordpro.h b/src/emu/bus/vtech/memexp/wordpro.h new file mode 100644 index 00000000000..b6b10226b41 --- /dev/null +++ b/src/emu/bus/vtech/memexp/wordpro.h @@ -0,0 +1,40 @@ +/*************************************************************************** + + Dick Smith VZ-300 WordPro Cartridge + + license: MAME, GPL-2.0+ + copyright-holders: Dirk Best + +***************************************************************************/ + +#pragma once + +#ifndef __VTECH_MEMEXP_WORDPRO_H__ +#define __VTECH_MEMEXP_WORDPRO_H__ + +#include "emu.h" +#include "memexp.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> wordpro_device + +class wordpro_device : public device_t, public device_memexp_interface +{ +public: + // construction/destruction + wordpro_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual const rom_entry *device_rom_region() const; + virtual void device_start(); + virtual void device_reset(); +}; + +// device type definition +extern const device_type WORDPRO; + +#endif // __VTECH_MEMEXP_WORDPRO_H__ diff --git a/src/lib/formats/vtech1_dsk.c b/src/lib/formats/vtech1_dsk.c index 8e542e9cc06..4ee02c89104 100644 --- a/src/lib/formats/vtech1_dsk.c +++ b/src/lib/formats/vtech1_dsk.c @@ -28,6 +28,10 @@ LEGACY_FLOPPY_OPTIONS_START( vtech1_only ) vtech1_dsk_identify, vtech1_dsk_construct, NULL, - NULL + HEADS([1]) + TRACKS([40]) + SECTORS([16]) + SECTOR_LENGTH([154]) + FIRST_SECTOR_ID([0]) ) LEGACY_FLOPPY_OPTIONS_END0 diff --git a/src/mess/drivers/vtech1.c b/src/mess/drivers/vtech1.c index d37c5423348..c2266a49559 100644 --- a/src/mess/drivers/vtech1.c +++ b/src/mess/drivers/vtech1.c @@ -1,14 +1,12 @@ -/***************************************************************************** +/*************************************************************************** Video Technology Laser 110 - Sanyo Laser 110 Video Technology Laser 200 Salora Fellow - Texet TX-8000 + Texet TX-8000 (?) Video Technology VZ-200 Video Technology Laser 210 Dick Smith Electronics VZ-200 - Sanyo Laser 210 Video Technology Laser 310 Dick Smith Electronics VZ-300 @@ -24,114 +22,37 @@ Thanks go to: - Davide Moretti for the detailed description of the colors - Leslie Milburn -Memory maps: - - Laser 110/200 - 0000-1FFF 8K ROM 0 - 2000-3FFF 8K ROM 1 - 4000-5FFF 8K DOS ROM or other cartridges (optional) - 6000-67FF 2K reserved for rom cartridges - 6800-6FFF 2K memory mapped I/O - R: keyboard - W: cassette I/O, speaker, VDP control - 7000-77FF 2K video RAM - 7800-7FFF 2K internal user RAM - 8800-C7FF 16K memory expansion - 8000-BFFF 64K memory expansion, first bank - C000-FFFF 64K memory expansion, other banks - - Laser 210 - 0000-1FFF 8K ROM 0 - 2000-3FFF 8K ROM 1 - 4000-5FFF 8K DOS ROM or other cartridges (optional) - 6000-67FF 2K reserved for rom cartridges - 6800-6FFF 2K memory mapped I/O - R: keyboard - W: cassette I/O, speaker, VDP control - 7000-77FF 2K video RAM - 7800-8FFF 6K internal user RAM (3x2K: U2, U3, U4) - 9000-CFFF 16K memory expansion - 8000-BFFF 64K memory expansion, first bank - C000-FFFF 64K memory expansion, other banks - - Laser 310 - 0000-3FFF 16K ROM - 4000-5FFF 8K DOS ROM or other cartridges (optional) - 6000-67FF 2K reserved for rom cartridges - 6800-6FFF 2K memory mapped I/O - R: keyboard - W: cassette I/O, speaker, VDP control - 7000-77FF 2K video RAM - 7800-B7FF 16K internal user RAM - B800-F7FF 16K memory expansion - 8000-BFFF 64K memory expansion, first bank - C000-FFFF 64K memory expansion, other banks - - - Memory expansions available for the Laser/VZ computers: - - - a 16kb expansion without banking - - a 64kb expansion where the first bank is fixed and the other 3 are - banked in as needed - - a banked memory expansion similar to the 64kb one, that the user could - fill themselves with memory up to 4MB total. - - They are externally connected devices. The 16kb extension is different - between Laser 110/210/310 computers, though it could be relativly - easily modified to work on another model. - - Todo: - Figure out which machines were shipped with which ROM version where not known (currently only a guess) - Lightpen support - - Rewrite floppy and move to its own file - - Add support for the wordprocessor cartridge + - Rewrite floppy -Notes: - - - DOS ROM: CRC(b6ed6084) SHA1(59d1cbcfa6c5e1906a32704fbf0d9670f0d1fd8b) - - -******************************************************************************/ +***************************************************************************/ #include "emu.h" #include "formats/imageutl.h" #include "cpu/z80/z80.h" #include "video/mc6847.h" -#include "bus/centronics/ctronics.h" +#include "bus/vtech/ioexp/ioexp.h" +#include "bus/vtech/memexp/memexp.h" #include "sound/wave.h" #include "sound/speaker.h" -#include "imagedev/cartslot.h" -#include "imagedev/flopdrv.h" #include "imagedev/snapquik.h" #include "imagedev/cassette.h" -#include "machine/ram.h" #include "formats/vt_cas.h" -#include "formats/vtech1_dsk.h" + /*************************************************************************** CONSTANTS & MACROS ***************************************************************************/ #define LOG_VTECH1_LATCH 0 -#define LOG_VTECH1_FDC 0 #define VTECH1_CLK 3579500 #define VZ300_XTAL1_CLK XTAL_17_73447MHz -#define VZ_BASIC 0xf0 -#define VZ_MCODE 0xf1 - -#define TRKSIZE_VZ 0x9a0 /* arbitrary (actually from analyzing format) */ -#define TRKSIZE_FM 3172 /* size of a standard FM mode track */ - -#define PHI0(n) (((n)>>0)&1) -#define PHI1(n) (((n)>>1)&1) -#define PHI2(n) (((n)>>2)&1) -#define PHI3(n) (((n)>>3)&1) - /*************************************************************************** TYPE DEFINITIONS @@ -140,63 +61,42 @@ Notes: class vtech1_state : public driver_device { public: - vtech1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + vtech1_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_videoram(*this, "videoram"), + m_maincpu(*this, "maincpu"), m_mc6847(*this, "mc6847"), m_speaker(*this, "speaker"), m_cassette(*this, "cassette"), - m_videoram(*this, "videoram"), - m_maincpu(*this, "maincpu"), - m_ram(*this, RAM_TAG), - m_centronics(*this, "centronics") + m_ioexp(*this, "io"), + m_memexp(*this, "mem") { } - /* devices */ - required_device m_mc6847; - optional_device m_speaker; - optional_device m_cassette; + DECLARE_DRIVER_INIT(vtech1); + DECLARE_DRIVER_INIT(vtech1h); - UINT8 *m_ram_pointer; - UINT32 m_ram_size; - required_shared_ptr m_videoram; - - /* floppy */ - int m_drive; - UINT8 m_fdc_track_x2[2]; - UINT8 m_fdc_wrprot[2]; - UINT8 m_fdc_status; - UINT8 m_fdc_data[TRKSIZE_FM]; - int m_data; - int m_fdc_edge; - int m_fdc_bits; - int m_fdc_start; - int m_fdc_write; - int m_fdc_offs; - int m_fdc_latch; - int m_centronics_busy; - DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); - DECLARE_READ8_MEMBER(vtech1_fdc_r); - DECLARE_WRITE8_MEMBER(vtech1_fdc_w); - DECLARE_READ8_MEMBER(vtech1_serial_r); - DECLARE_WRITE8_MEMBER(vtech1_serial_w); DECLARE_READ8_MEMBER(vtech1_lightpen_r); - DECLARE_READ8_MEMBER(vtech1_joystick_r); DECLARE_READ8_MEMBER(vtech1_keyboard_r); DECLARE_WRITE8_MEMBER(vtech1_latch_w); - DECLARE_WRITE8_MEMBER(vtech1_memory_bank_w); + DECLARE_WRITE8_MEMBER(vtech1_video_bank_w); - DECLARE_DRIVER_INIT(vtech1h); - DECLARE_DRIVER_INIT(vtech1); - DECLARE_READ8_MEMBER(vtech1_printer_r); - DECLARE_WRITE8_MEMBER(vtech1_strobe_w); DECLARE_READ8_MEMBER(mc6847_videoram_r); + DECLARE_SNAPSHOT_LOAD_MEMBER( vtech1 ); - void vtech1_get_track(); - void vtech1_put_track(); + +private: + static const UINT8 VZ_BASIC = 0xf0; + static const UINT8 VZ_MCODE = 0xf1; + + required_shared_ptr m_videoram; + required_device m_maincpu; - required_device m_ram; - required_device m_centronics; + required_device m_mc6847; + required_device m_speaker; + required_device m_cassette; + required_device m_ioexp; + required_device m_memexp; }; @@ -207,37 +107,44 @@ public: SNAPSHOT_LOAD_MEMBER( vtech1_state, vtech1 ) { address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 i, header[24]; - UINT16 start, end, size; + UINT8 header[24]; char pgmname[18]; - /* get the header */ - image.fread( &header, sizeof(header)); - for (i = 0; i < 16; i++) pgmname[i] = header[i+4]; + // get the header + image.fread(&header, sizeof(header)); + + // get image name + for (int i = 0; i < 16; i++) + pgmname[i] = header[i+4]; pgmname[16] = '\0'; - /* get start and end addresses */ - start = pick_integer_le(header, 22, 2); - end = start + snapshot_size - sizeof(header); - size = end - start; + // get start and end addresses + UINT16 start = pick_integer_le(header, 22, 2); + UINT16 end = start + snapshot_size - sizeof(header); + UINT16 size = end - start; - /* check if we have enough ram */ - if (m_ram_size < size) + // write it to ram + UINT8 *ptr = (UINT8 *)image.ptr() + sizeof(header); + + for (UINT16 addr = start; addr <= end; addr++, ptr++) { - char message[256]; - snprintf(message, ARRAY_LENGTH(message), "SNAPLOAD: %s\nInsufficient RAM - need %04X",pgmname,size); - image.seterror(IMAGE_ERROR_INVALIDIMAGE, message); - image.message("SNAPLOAD: %s\nInsufficient RAM - need %04X",pgmname,size); - return IMAGE_INIT_FAIL; + UINT8 to_write = *ptr; + space.write_byte(addr, to_write); + + // verify + if (space.read_byte(addr) != to_write) + { + image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Insufficient RAM to load snapshot"); + image.message("Insufficient RAM to load snapshot (%d bytes needed) [%s]", size, pgmname); + + return IMAGE_INIT_FAIL; + } } - /* write it to ram */ - image.fread( &m_ram_pointer[start - 0x7800], size); - - /* patch variables depending on snapshot type */ + // patch variables depending on snapshot type switch (header[21]) { - case VZ_BASIC: /* 0xF0 */ + case VZ_BASIC: space.write_byte(0x78a4, start % 256); /* start of basic program */ space.write_byte(0x78a5, start / 256); space.write_byte(0x78f9, end % 256); /* end of basic program */ @@ -246,13 +153,13 @@ SNAPSHOT_LOAD_MEMBER( vtech1_state, vtech1 ) space.write_byte(0x78fc, end / 256); space.write_byte(0x78fd, end % 256); /* start free mem, end variable table */ space.write_byte(0x78fe, end / 256); - image.message(" %s (B)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end); + image.message(" %s (B)\nsize=%04X : start=%04X : end=%04X", pgmname, size, start, end); break; - case VZ_MCODE: /* 0xF1 */ + case VZ_MCODE: space.write_byte(0x788e, start % 256); /* usr subroutine address */ space.write_byte(0x788f, start / 256); - image.message(" %s (M)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end); + image.message(" %s (M)\nsize=%04X : start=%04X : end=%04X", pgmname, size, start, end); m_maincpu->set_pc(start); /* start program */ break; @@ -266,269 +173,21 @@ SNAPSHOT_LOAD_MEMBER( vtech1_state, vtech1 ) } -/*************************************************************************** - FLOPPY DRIVE -***************************************************************************/ -static void vtech1_load_proc(device_image_interface &image) -{ - vtech1_state *vtech1 = image.device().machine().driver_data(); - int id = floppy_get_drive(&image.device()); - - if (!image.is_readonly()) - vtech1->m_fdc_wrprot[id] = 0x00; - else - vtech1->m_fdc_wrprot[id] = 0x80; -} - -void vtech1_state::vtech1_get_track() -{ - device_image_interface *image = dynamic_cast(floppy_get_device(machine(),m_drive)); - - /* drive selected or and image file ok? */ - if (m_drive >= 0 && image->exists()) - { - int size, offs; - size = TRKSIZE_VZ; - offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; - image->fseek(offs, SEEK_SET); - // some disks have slightly larger header, make sure we capture the checksum at the end of the track - size = image->fread(m_fdc_data, size+4); - if (LOG_VTECH1_FDC) - logerror("get track @$%05x $%04x bytes\n", offs, size); - } - m_fdc_offs = 0; - m_fdc_write = 0; -} - -void vtech1_state::vtech1_put_track() -{ - /* drive selected and image file ok? */ - if (m_drive >= 0 && floppy_get_device(machine(),m_drive) != NULL) - { - int size, offs; - device_image_interface *image = dynamic_cast(floppy_get_device(machine(),m_drive)); - offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; - image->fseek(offs + m_fdc_start, SEEK_SET); - size = image->fwrite(&m_fdc_data[m_fdc_start], m_fdc_write); - if (LOG_VTECH1_FDC) - logerror("put track @$%05X+$%X $%04X/$%04X bytes\n", offs, m_fdc_start, size, m_fdc_write); - } -} - -READ8_MEMBER(vtech1_state::vtech1_fdc_r) -{ - int data = 0xff; - - switch (offset) - { - case 1: /* data (read-only) */ - if (m_fdc_bits > 0) - { - if( m_fdc_status & 0x80 ) - m_fdc_bits--; - data = (m_data >> m_fdc_bits) & 0xff; - if (LOG_VTECH1_FDC) { - logerror("vtech1_fdc_r bits %d%d%d%d%d%d%d%d\n", - (data>>7)&1,(data>>6)&1,(data>>5)&1,(data>>4)&1, - (data>>3)&1,(data>>2)&1,(data>>1)&1,(data>>0)&1 ); - } - } - if (m_fdc_bits == 0) - { - m_data = m_fdc_data[m_fdc_offs]; - if (LOG_VTECH1_FDC) - logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, m_fdc_offs, m_data); - if(m_fdc_status & 0x80) - { - m_fdc_bits = 8; - m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; - } - m_fdc_status &= ~0x80; - } - break; - case 2: /* polling (read-only) */ - /* fake */ - if (m_drive >= 0) - m_fdc_status |= 0x80; - data = m_fdc_status; - break; - case 3: /* write protect status (read-only) */ - if (m_drive >= 0) - data = m_fdc_wrprot[m_drive]; - if (LOG_VTECH1_FDC) - logerror("vtech1_fdc_r %d : write_protect $%02X\n", offset, data); - break; - } - return data; -} - -WRITE8_MEMBER(vtech1_state::vtech1_fdc_w) -{ - int drive; - - switch (offset) - { - case 0: /* latch (write-only) */ - drive = (data & 0x10) ? 0 : (data & 0x80) ? 1 : -1; - if (drive != m_drive) - { - m_drive = drive; - if (m_drive >= 0) - vtech1_get_track(); - } - if (m_drive >= 0) - { - if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(m_fdc_latch)) || - (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(m_fdc_latch)) || - (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(m_fdc_latch)) || - (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(m_fdc_latch))) - { - if (m_fdc_track_x2[m_drive] > 0) - m_fdc_track_x2[m_drive]--; - if (LOG_VTECH1_FDC) - logerror("vtech1_fdc_w(%d) $%02X drive %d: stepout track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1)); - if ((m_fdc_track_x2[m_drive] & 1) == 0) - vtech1_get_track(); - } - else - if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(m_fdc_latch)) || - (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(m_fdc_latch)) || - (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(m_fdc_latch)) || - (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(m_fdc_latch))) - { - if (m_fdc_track_x2[m_drive] < 2*40) - m_fdc_track_x2[m_drive]++; - if (LOG_VTECH1_FDC) - logerror("vtech1_fdc_w(%d) $%02X drive %d: stepin track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1)); - if ((m_fdc_track_x2[m_drive] & 1) == 0) - vtech1_get_track(); - } - if ((data & 0x40) == 0) - { - m_data <<= 1; - if ((m_fdc_latch ^ data) & 0x20) - m_data |= 1; - if ((m_fdc_edge ^= 1) == 0) - { - m_fdc_bits--; - - if (m_fdc_bits == 0) - { - UINT8 value = 0; - m_data &= 0xffff; - if (m_data & 0x4000 ) value |= 0x80; - if (m_data & 0x1000 ) value |= 0x40; - if (m_data & 0x0400 ) value |= 0x20; - if (m_data & 0x0100 ) value |= 0x10; - if (m_data & 0x0040 ) value |= 0x08; - if (m_data & 0x0010 ) value |= 0x04; - if (m_data & 0x0004 ) value |= 0x02; - if (m_data & 0x0001 ) value |= 0x01; - if (LOG_VTECH1_FDC) - logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, m_fdc_offs, m_fdc_data[m_fdc_offs], value, m_data); - m_fdc_data[m_fdc_offs] = value; - m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; - m_fdc_write++; - m_fdc_bits = 8; - } - } - } - /* change of write signal? */ - if ((m_fdc_latch ^ data) & 0x40) - { - /* falling edge? */ - if (m_fdc_latch & 0x40) - { - m_fdc_start = m_fdc_offs; - m_fdc_edge = 0; - } - else - { - /* data written to track before? */ - if (m_fdc_write) - vtech1_put_track(); - } - m_fdc_bits = 8; - m_fdc_write = 0; - } - } - m_fdc_latch = data; - break; - } -} - -static const floppy_interface vtech1_floppy_interface = -{ - FLOPPY_STANDARD_5_25_DSHD, - LEGACY_FLOPPY_OPTIONS_NAME(vtech1_only), - NULL -}; - -/*************************************************************************** - PRINTER -***************************************************************************/ - -WRITE_LINE_MEMBER(vtech1_state::write_centronics_busy) -{ - m_centronics_busy = state; -} - -READ8_MEMBER(vtech1_state::vtech1_printer_r) -{ - return 0xfe | m_centronics_busy; -} - -/* TODO: figure out how this really works */ -WRITE8_MEMBER(vtech1_state::vtech1_strobe_w) -{ - m_centronics->write_strobe(TRUE); - m_centronics->write_strobe(FALSE); -} - - -/*************************************************************************** - RS232 SERIAL -***************************************************************************/ - -READ8_MEMBER(vtech1_state::vtech1_serial_r) -{ - logerror("vtech1_serial_r offset $%02x\n", offset); - return 0xff; -} - -WRITE8_MEMBER(vtech1_state::vtech1_serial_w) -{ - logerror("vtech1_serial_w $%02x, offset %02x\n", data, offset); -} - - /*************************************************************************** INPUTS ***************************************************************************/ -READ8_MEMBER(vtech1_state::vtech1_lightpen_r) +READ8_MEMBER( vtech1_state::vtech1_lightpen_r ) { logerror("vtech1_lightpen_r(%d)\n", offset); return 0xff; } -READ8_MEMBER(vtech1_state::vtech1_joystick_r) -{ - int result = 0xff; - - if (!BIT(offset, 0)) result &= ioport("joystick_0")->read(); - if (!BIT(offset, 1)) result &= ioport("joystick_0_arm")->read(); - if (!BIT(offset, 2)) result &= ioport("joystick_1")->read(); - if (!BIT(offset, 3)) result &= ioport("joystick_1_arm")->read(); - - return result; -} - -READ8_MEMBER(vtech1_state::vtech1_keyboard_r) +READ8_MEMBER( vtech1_state::vtech1_keyboard_r ) { UINT8 result = 0x3f; - /* bit 0 to 5, keyboard input */ + // bit 0 to 5, keyboard input if (!BIT(offset, 0)) result &= ioport("keyboard_0")->read(); if (!BIT(offset, 1)) result &= ioport("keyboard_1")->read(); if (!BIT(offset, 2)) result &= ioport("keyboard_2")->read(); @@ -538,10 +197,10 @@ READ8_MEMBER(vtech1_state::vtech1_keyboard_r) if (!BIT(offset, 6)) result &= ioport("keyboard_6")->read(); if (!BIT(offset, 7)) result &= ioport("keyboard_7")->read(); - /* bit 6, cassette input */ + // bit 6, cassette input result |= ((m_cassette->input()) > 0 ? 1 : 0) << 6; - /* bit 7, field sync */ + // bit 7, field sync result |= m_mc6847->fs_r() << 7; return result; @@ -552,26 +211,26 @@ READ8_MEMBER(vtech1_state::vtech1_keyboard_r) I/O LATCH ***************************************************************************/ -WRITE8_MEMBER(vtech1_state::vtech1_latch_w) +WRITE8_MEMBER( vtech1_state::vtech1_latch_w ) { if (LOG_VTECH1_LATCH) logerror("vtech1_latch_w $%02X\n", data); - /* bit 1, SHRG mod (if installed) */ + // bit 1, SHRG mod (if installed) if (m_videoram.bytes() == 0x2000) { m_mc6847->gm0_w(BIT(data, 1)); m_mc6847->gm2_w(BIT(data, 1)); } - /* bit 2, cassette out */ + // bit 2, cassette out m_cassette->output( BIT(data, 2) ? +1.0 : -1.0); - /* bit 3 and 4, vdc mode control lines */ + // bit 3 and 4, vdc mode control lines m_mc6847->ag_w(BIT(data, 3)); m_mc6847->css_w(BIT(data, 4)); - /* bit 0 and 5, speaker */ + // bit 0 and 5, speaker m_speaker->level_w((BIT(data, 5) << 1) | BIT(data, 0)); } @@ -580,18 +239,8 @@ WRITE8_MEMBER(vtech1_state::vtech1_latch_w) MEMORY BANKING ***************************************************************************/ -WRITE8_MEMBER(vtech1_state::vtech1_memory_bank_w) +WRITE8_MEMBER( vtech1_state::vtech1_video_bank_w ) { - logerror("vtech1_memory_bank_w $%02X\n", data); - - if (data >= 1) - if ((data <= 3 && m_ram_size == 66*1024) || (m_ram_size == 4098*1024)) - membank("bank3")->set_entry(data - 1); -} - -WRITE8_MEMBER(vtech1_state::vtech1_video_bank_w) -{ - logerror("vtech1_video_bank_w $%02X\n", data); membank("bank4")->set_entry(data & 0x03); } @@ -600,9 +249,10 @@ WRITE8_MEMBER(vtech1_state::vtech1_video_bank_w) VIDEO EMULATION ***************************************************************************/ -READ8_MEMBER(vtech1_state::mc6847_videoram_r) +READ8_MEMBER( vtech1_state::mc6847_videoram_r ) { if (offset == ~0) return 0xff; + m_mc6847->inv_w(BIT(m_videoram[offset], 6)); m_mc6847->as_w(BIT(m_videoram[offset], 7)); @@ -614,120 +264,55 @@ READ8_MEMBER(vtech1_state::mc6847_videoram_r) DRIVER INIT ***************************************************************************/ -DRIVER_INIT_MEMBER(vtech1_state,vtech1) +DRIVER_INIT_MEMBER( vtech1_state, vtech1 ) { - address_space &prg = m_maincpu->space(AS_PROGRAM); - int id; - - /* ram */ - m_ram_pointer = m_ram->pointer(); - m_ram_size = m_ram->size(); - - /* setup memory banking */ - membank("bank1")->set_base(m_ram_pointer); - - /* 16k memory expansion? */ - if (m_ram_size == 18*1024 || m_ram_size == 22*1024 || m_ram_size == 32*1024) - { - offs_t base = 0x7800 + (m_ram_size - 0x4000); - prg.install_readwrite_bank(base, base + 0x3fff, "bank2"); - membank("bank2")->set_base(m_ram_pointer + base - 0x7800); - } - - /* 64k expansion? */ - if (m_ram_size >= 66*1024) - { - /* install fixed first bank */ - prg.install_readwrite_bank(0x8000, 0xbfff, "bank2"); - membank("bank2")->set_base(m_ram_pointer + 0x800); - - /* install the others, dynamically banked in */ - prg.install_readwrite_bank(0xc000, 0xffff, "bank3"); - membank("bank3")->configure_entries(0, (m_ram_size - 0x4800) / 0x4000, m_ram_pointer + 0x4800, 0x4000); - membank("bank3")->set_entry(0); - } - - /* initialize floppy */ - m_drive = -1; - m_fdc_track_x2[0] = 80; - m_fdc_track_x2[1] = 80; - m_fdc_wrprot[0] = 0x80; - m_fdc_wrprot[1] = 0x80; - m_fdc_status = 0; - m_fdc_edge = 0; - m_fdc_bits = 8; - m_fdc_start = 0; - m_fdc_write = 0; - m_fdc_offs = 0; - m_fdc_latch = 0; - - for(id=0;id<2;id++) - { - floppy_get_device(machine(), id)->floppy_install_load_proc(vtech1_load_proc); - } + // setup expansion slots + m_ioexp->set_io_space(&m_maincpu->space(AS_IO)); + m_memexp->set_program_space(&m_maincpu->space(AS_PROGRAM)); + m_memexp->set_io_space(&m_maincpu->space(AS_IO)); } -DRIVER_INIT_MEMBER(vtech1_state,vtech1h) +DRIVER_INIT_MEMBER( vtech1_state, vtech1h ) { - address_space &prg = m_maincpu->space(AS_PROGRAM); - DRIVER_INIT_CALL(vtech1); - /* the SHRG mod replaces the standard videoram chip with an 8k chip */ + // the SHRG mod replaces the standard videoram chip with an 8k chip m_videoram.allocate(0x2000); - prg.install_readwrite_bank(0x7000, 0x77ff, "bank4"); + m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x7000, 0x77ff, "bank4"); membank("bank4")->configure_entries(0, 4, m_videoram, 0x800); membank("bank4")->set_entry(0); } + /*************************************************************************** ADDRESS MAPS ***************************************************************************/ static ADDRESS_MAP_START( laser110_mem, AS_PROGRAM, 8, vtech1_state ) - AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */ - AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */ - AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */ + AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w) - AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* (6847) */ - AM_RANGE(0x7800, 0x7fff) AM_RAMBANK("bank1") /* 2k user ram */ - AM_RANGE(0x8000, 0xbfff) AM_NOP /* 16k ram expansion */ - AM_RANGE(0xc000, 0xffff) AM_NOP + AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847 + AM_RANGE(0x7800, 0x7fff) AM_RAM // 2k user ram ADDRESS_MAP_END static ADDRESS_MAP_START( laser210_mem, AS_PROGRAM, 8, vtech1_state ) - AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */ - AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */ - AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */ + AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w) - AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* U7 (6847) */ - AM_RANGE(0x7800, 0x8fff) AM_RAMBANK("bank1") /* 6k user ram */ - AM_RANGE(0x9000, 0xcfff) AM_NOP /* 16k ram expansion */ - AM_RANGE(0xd000, 0xffff) AM_NOP + AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847 + AM_RANGE(0x7800, 0x8fff) AM_RAM // 6k user ram ADDRESS_MAP_END static ADDRESS_MAP_START( laser310_mem, AS_PROGRAM, 8, vtech1_state ) - AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */ - AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */ - AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */ + AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w) - AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* (6847) */ - AM_RANGE(0x7800, 0xb7ff) AM_RAMBANK("bank1") /* 16k user ram */ - AM_RANGE(0xb800, 0xf7ff) AM_NOP /* 16k ram expansion */ - AM_RANGE(0xf8ff, 0xffff) AM_NOP + AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847 + AM_RANGE(0x7800, 0xb7ff) AM_RAM // 16k user ram ADDRESS_MAP_END static ADDRESS_MAP_START( vtech1_io, AS_IO, 8, vtech1_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_READ(vtech1_printer_r) - AM_RANGE(0x0d, 0x0d) AM_WRITE(vtech1_strobe_w) - AM_RANGE(0x0e, 0x0e) AM_DEVWRITE("cent_data_out", output_latch_device, write) - AM_RANGE(0x10, 0x1f) AM_READWRITE(vtech1_fdc_r, vtech1_fdc_w) - AM_RANGE(0x20, 0x2f) AM_READ(vtech1_joystick_r) - AM_RANGE(0x30, 0x3f) AM_READWRITE(vtech1_serial_r, vtech1_serial_w) AM_RANGE(0x40, 0x4f) AM_READ(vtech1_lightpen_r) - AM_RANGE(0x70, 0x7f) AM_WRITE(vtech1_memory_bank_w) ADDRESS_MAP_END static ADDRESS_MAP_START( vtech1_shrg_io, AS_IO, 8, vtech1_state ) @@ -813,32 +398,6 @@ static INPUT_PORTS_START(vtech1) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L ? [Insert]") PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('?') PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H CLS SET") PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_START("joystick_0") - PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) - - PORT_START("joystick_0_arm") - PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) - PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) - - PORT_START("joystick_1") - PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) - - PORT_START("joystick_1_arm") - PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) - PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) - /* Enhanced options not available on real hardware */ PORT_START("CONFIG") PORT_CONFNAME( 0x01, 0x01, "Autorun on Quickload") @@ -850,31 +409,6 @@ static INPUT_PORTS_START(vtech1) INPUT_PORTS_END -/*************************************************************************** - PALETTE -***************************************************************************/ - -static const UINT32 vtech1_palette_mono[] = -{ - rgb_t(131, 131, 131), - rgb_t(211, 211, 211), - rgb_t(29, 29, 29), - rgb_t(76, 76, 76), - rgb_t(213, 213, 213), - rgb_t(167, 167, 167), - rgb_t(105, 105, 105), - rgb_t(136, 136, 136), - rgb_t(0, 0, 0), - rgb_t(131, 131, 131), - rgb_t(0, 0, 0), - rgb_t(213, 213, 213), - rgb_t(37, 37, 37), - rgb_t(133, 133, 133), - rgb_t(28, 28, 28), - rgb_t(193, 193, 193) -}; - - /*************************************************************************** MACHINE DRIVERS ***************************************************************************/ @@ -889,23 +423,23 @@ static const speaker_interface vtech1_speaker_interface = static MACHINE_CONFIG_START( laser110, vtech1_state ) - /* basic machine hardware */ + // basic machine hardware MCFG_CPU_ADD("maincpu", Z80, VTECH1_CLK) /* 3.57950 MHz */ MCFG_CPU_PROGRAM_MAP(laser110_mem) MCFG_CPU_IO_MAP(vtech1_io) - /* video hardware */ + // video hardware MCFG_SCREEN_MC6847_PAL_ADD("screen", "mc6847") MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz) - MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r)) MCFG_MC6847_BW(true) MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1) // GM2 = GND, GM0 = GND, INTEXT = GND // other lines not connected - /* sound hardware */ + // sound hardware MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette") MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) @@ -913,35 +447,22 @@ static MACHINE_CONFIG_START( laser110, vtech1_state ) MCFG_SOUND_CONFIG(vtech1_speaker_interface) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) - /* printer */ - MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer") - MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(vtech1_state, write_centronics_busy)) + // peripheral and memory expansion slots + MCFG_IOEXP_SLOT_ADD("io") + MCFG_MEMEXP_SLOT_ADD("mem") - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") - - /* snapshot/quickload */ + // snapshot MCFG_SNAPSHOT_ADD("snapshot", vtech1_state, vtech1, "vz", 1.5) MCFG_CASSETTE_ADD( "cassette" ) MCFG_CASSETTE_FORMATS(vtech1_cassette_formats) MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY) - - /* cartridge */ - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("rom") - - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2K") - MCFG_RAM_EXTRA_OPTIONS("18K,66K,4098K") - - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(vtech1_floppy_interface) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( laser200, laser110 ) MCFG_DEVICE_REMOVE("mc6847") MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz) - MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r)) MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1) // GM2 = GND, GM0 = GND, INTEXT = GND @@ -951,22 +472,12 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( laser210, laser200 ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(laser210_mem) - - /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("6K") - MCFG_RAM_EXTRA_OPTIONS("22K,66K,4098K") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( laser310, laser200 ) MCFG_CPU_REPLACE("maincpu", Z80, VZ300_XTAL1_CLK / 5) /* 3.546894 MHz */ MCFG_CPU_PROGRAM_MAP(laser310_mem) MCFG_CPU_IO_MAP(vtech1_io) - - /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("16K") - MCFG_RAM_EXTRA_OPTIONS("32K,66K,4098K") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( laser310h, laser310 ) @@ -975,7 +486,7 @@ static MACHINE_CONFIG_DERIVED( laser310h, laser310 ) MCFG_DEVICE_REMOVE("mc6847") MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz) - MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r)) MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1) // INTEXT = GND @@ -988,67 +499,58 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START( laser110 ) - ROM_REGION(0x6800, "maincpu", 0) - ROM_LOAD("vtechv12.u09", 0x0000, 0x2000, CRC(99412d43) SHA1(6aed8872a0818be8e1b08ecdfd92acbe57a3c96d)) - ROM_LOAD("vtechv12.u10", 0x2000, 0x2000, CRC(e4c24e8b) SHA1(9d8fb3d24f3d4175b485cf081a2d5b98158ab2fb)) - ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) + ROM_REGION(0x4000, "maincpu", 0) + ROM_LOAD("vtechv12.u09", 0x0000, 0x2000, CRC(99412d43) SHA1(6aed8872a0818be8e1b08ecdfd92acbe57a3c96d)) + ROM_LOAD("vtechv12.u10", 0x2000, 0x2000, CRC(e4c24e8b) SHA1(9d8fb3d24f3d4175b485cf081a2d5b98158ab2fb)) ROM_END -#if 0 -/* The VZ-200 sold in Germany and the Netherlands came with BASIC V1.1, which - is currently not dumped. */ +// The VZ-200 sold in Germany and the Netherlands came with BASIC V1.1, which is currently not dumped. ROM_START( vz200de ) - ROM_REGION(0x6800, "maincpu", 0) - ROM_LOAD("vtechv11.u09", 0x0000, 0x2000, NO_DUMP) - ROM_LOAD("vtechv11.u10", 0x2000, 0x2000, NO_DUMP) - ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) + ROM_REGION(0x4000, "maincpu", 0) + ROM_LOAD("vtechv11.u09", 0x0000, 0x2000, NO_DUMP) + ROM_LOAD("vtechv11.u10", 0x2000, 0x2000, NO_DUMP) ROM_END -#endif #define rom_las110de rom_laser110 #define rom_laser200 rom_laser110 -#define rom_fellow rom_laser110 +#define rom_fellow rom_laser110 -/* It's possible that the Texet TX8000 came with BASIC V1.0, but this - needs to be verified */ +// It's possible that the Texet TX-8000 came with BASIC V1.0, but this needs to be verified #define rom_tx8000 rom_laser110 ROM_START( laser210 ) - ROM_REGION(0x6800, "maincpu", 0) - ROM_LOAD("vtechv20.u09", 0x0000, 0x2000, CRC(cc854fe9) SHA1(6e66a309b8e6dc4f5b0b44e1ba5f680467353d66)) - ROM_LOAD("vtechv20.u10", 0x2000, 0x2000, CRC(7060f91a) SHA1(8f3c8f24f97ebb98f3c88d4e4ba1f91ffd563440)) - ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) + ROM_REGION(0x4000, "maincpu", 0) + ROM_LOAD("vtechv20.u09", 0x0000, 0x2000, CRC(cc854fe9) SHA1(6e66a309b8e6dc4f5b0b44e1ba5f680467353d66)) + ROM_LOAD("vtechv20.u10", 0x2000, 0x2000, CRC(7060f91a) SHA1(8f3c8f24f97ebb98f3c88d4e4ba1f91ffd563440)) ROM_END #define rom_las210de rom_laser210 -#define rom_vz200 rom_laser210 +#define rom_vz200 rom_laser210 ROM_START( laser310 ) - ROM_REGION(0x6800, "maincpu", 0) + ROM_REGION(0x4000, "maincpu", 0) ROM_SYSTEM_BIOS(0, "basic20", "BASIC V2.0") ROMX_LOAD("vtechv20.u12", 0x0000, 0x4000, CRC(613de12c) SHA1(f216c266bc09b0dbdbad720796e5ea9bc7d91e53), ROM_BIOS(1)) ROM_SYSTEM_BIOS(1, "basic21", "BASIC V2.1 (hack)") ROMX_LOAD("vtechv21.u12", 0x0000, 0x4000, CRC(f7df980f) SHA1(5ba14a7a2eedca331b033901080fa5d205e245ea), ROM_BIOS(2)) - ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) ROM_END -#define rom_vz300 rom_laser310 +#define rom_vz300 rom_laser310 #define rom_laser310h rom_laser310 + /*************************************************************************** GAME DRIVERS ***************************************************************************/ -/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ -COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 110", 0 ) -COMP( 1983, las110de, laser110, 0, laser110, vtech1, vtech1_state, vtech1, "Sanyo", "Laser 110 (Germany)", 0 ) -COMP( 1983, laser200, 0, laser110, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 200", 0 ) -//COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "VZ-200 (Germany & Netherlands)", 0 ) -COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Salora", "Fellow (Finland)", 0 ) -COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Texet", "TX-8000 (UK)", 0 ) -COMP( 1984, laser210, 0, laser200, laser210, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 210", 0 ) -COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-200 (Oceania)", 0 ) -COMP( 1984, las210de, laser210, 0, laser210, vtech1, vtech1_state, vtech1, "Sanyo", "Laser 210 (Germany)", 0 ) -COMP( 1984, laser310, 0, laser200, laser310, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 310", 0 ) -COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-300 (Oceania)", 0 ) -COMP( 1984, laser310h, laser310, 0, laser310h, vtech1, vtech1_state, vtech1h, "Video Technology", "Laser 310 (SHRG)", GAME_UNOFFICIAL) +// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS +COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 110", 0 ) +COMP( 1983, laser200, 0, 0, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 200", 0 ) +COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "VZ-200 (Germany & Netherlands)", 0 ) +COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Salora", "Fellow (Finland)", 0 ) +COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Texet", "TX-8000 (UK)", 0 ) +COMP( 1984, laser210, 0, 0, laser210, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 210", 0 ) +COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-200 (Oceania)", 0 ) +COMP( 1984, laser310, 0, 0, laser310, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 310", 0 ) +COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-300 (Oceania)", 0 ) +COMP( 1984, laser310h, laser310, 0, laser310h, vtech1, vtech1_state, vtech1h, "Video Technology", "Laser 310 (SHRG)", GAME_UNOFFICIAL) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index caadba5bbc1..4ccdf179ffe 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -1211,24 +1211,27 @@ rameses vz2000 crvisio2 manager + +// Video Technology Laser Generation 1 machines laser110 // 1983 Laser 110 -las110de // 1983 Sanyo Laser 110 (Germany) -laser200 // 1983 Laser 200 (color version of 110) -// vz200de // 1983 VZ-200 (Germany) -fellow // 1983 Salora Fellow (Finland) -tx8000 // 1983 Texet TX-8000 (U.K.) -laser210 // 1984 Laser 210 (200 with more memory) -las210de // 1984 Sanyo Laser 210 (Germany) -vz200 // 1984 Dick Smith Electronics VZ-200 -laser310 // 1984 Laser 310 (210 with diff. keyboard and RAM) +laser200 // 1983 Laser 200 +vz200de // 1983 VZ-200 (Germany) +fellow // 1983 Salora Fellow +tx8000 // 1983 Texet TX-8000 +laser210 // 1984 Laser 210 +vz200 // 1984 Dick Smith Electronics VZ-200 +laser310 // 1984 Laser 310 laser310h // 1984 Laser 310 with SHRG mod -vz300 // 1984 Dick Smith Electronics VZ-300 +vz300 // 1984 Dick Smith Electronics VZ-300 + +// Video Technology Laser Generation 2 machines laser350 // 1984? Laser 350 laser500 // 1984? Laser 500 laser700 // 1984? Laser 700 + socrates // 1988 Socrates Educational Video System (USA) socratfc // 1988 Socrates SAITOUT (French Canada) -profweis // 1988 (Yeno) Proffesor Weiss-Alles (Germany) +profweis // 1988 (Yeno) Professor Weiss-Alles (Germany) gl8008cx // 1999 Genius Leader 8008 CX (Germany) bs9009cx // 1999 BrainStation 9009 CXL (Germany) iq128_fr // 1997 Genius PC (France) diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 6d9e575c99d..8ab74924cdf 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -614,6 +614,8 @@ BUSES += VIC10 BUSES += VIC20 BUSES += VIDBRAIN BUSES += VIP +BUSES += VTECH_IOEXP +BUSES += VTECH_MEMEXP BUSES += WANGPC BUSES += X68K BUSES += Z88