| Previous | 199869 Revisions | Next |
| r30875 Saturday 7th June, 2014 at 09:57:00 UTC by Dirk Best |
|---|
| vtech1: Use the slot system for I/O and Memory expansion slots. Emulate the newly dumped RS-232 cartridge. Add support for the WordPro cartridge. Cleanup driver. |
| [src/emu/bus] | bus.mak |
| [src/emu/bus/vtech/ioexp] | carts.c* carts.h* ioexp.c* ioexp.h* joystick.c* joystick.h* printer.c* printer.h* |
| [src/emu/bus/vtech/memexp] | carts.c* carts.h* floppy.c* floppy.h* memexp.c* memexp.h* memory.c* memory.h* rs232.c* rs232.h* wordpro.c* wordpro.h* |
| [src/lib/formats] | vtech1_dsk.c |
| [src/mess] | mess.lst mess.mak |
| [src/mess/drivers] | vtech1.c |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Floppy Controller Cartridge | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | Laser DD 20 | |
| 9 | Dick Smith Electronics X-7304 | |
| 10 | ||
| 11 | ***************************************************************************/ | |
| 12 | ||
| 13 | #pragma once | |
| 14 | ||
| 15 | #ifndef __VTECH_MEMEXP_FLOPPY_H__ | |
| 16 | #define __VTECH_MEMEXP_FLOPPY_H__ | |
| 17 | ||
| 18 | #include "emu.h" | |
| 19 | #include "memexp.h" | |
| 20 | #include "imagedev/flopdrv.h" | |
| 21 | ||
| 22 | ||
| 23 | //************************************************************************** | |
| 24 | // TYPE DEFINITIONS | |
| 25 | //************************************************************************** | |
| 26 | ||
| 27 | // ======================> floppy_controller_device | |
| 28 | ||
| 29 | class floppy_controller_device : public device_t, public device_memexp_interface | |
| 30 | { | |
| 31 | public: | |
| 32 | // construction/destruction | |
| 33 | floppy_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 34 | ||
| 35 | DECLARE_READ8_MEMBER( floppy_r ); | |
| 36 | DECLARE_WRITE8_MEMBER( floppy_w ); | |
| 37 | ||
| 38 | // accessed from loadproc | |
| 39 | int get_floppy_id(device_image_interface *image); | |
| 40 | UINT8 m_fdc_wrprot[2]; | |
| 41 | ||
| 42 | protected: | |
| 43 | virtual const rom_entry *device_rom_region() const; | |
| 44 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 45 | virtual void device_start(); | |
| 46 | virtual void device_reset(); | |
| 47 | ||
| 48 | private: | |
| 49 | static const int TRKSIZE_VZ = 0x9a0; // arbitrary (actually from analyzing format) | |
| 50 | static const int TRKSIZE_FM = 3172; // size of a standard FM mode track | |
| 51 | ||
| 52 | device_image_interface *get_floppy_device(int drive); | |
| 53 | void put_track(); | |
| 54 | void get_track(); | |
| 55 | ||
| 56 | required_device<memexp_slot_device> m_memexp; | |
| 57 | required_device<legacy_floppy_image_device> m_floppy0; | |
| 58 | required_device<legacy_floppy_image_device> m_floppy1; | |
| 59 | ||
| 60 | int m_drive; | |
| 61 | UINT8 m_fdc_track_x2[2]; | |
| 62 | UINT8 m_fdc_status; | |
| 63 | UINT8 m_fdc_data[TRKSIZE_FM]; | |
| 64 | int m_data; | |
| 65 | int m_fdc_edge; | |
| 66 | int m_fdc_bits; | |
| 67 | int m_fdc_start; | |
| 68 | int m_fdc_write; | |
| 69 | int m_fdc_offs; | |
| 70 | int m_fdc_latch; | |
| 71 | }; | |
| 72 | ||
| 73 | // device type definition | |
| 74 | extern const device_type FLOPPY_CONTROLLER; | |
| 75 | ||
| 76 | #endif // __VTECH_MEMEXP_FLOPPY_H__ |
| Added: svn:eol-style + native Added: svn:mime-type + text/plain |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Memory Expansion Slot | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | 44-pin slot | |
| 9 | ||
| 10 | 22 GND 23 NC | |
| 11 | 21 +5VDC 24 A11 | |
| 12 | 20 /IORQ 25 A12 | |
| 13 | 19 /RD 26 A13 | |
| 14 | 18 /NMI 27 A14 | |
| 15 | 17 /WAIT 28 A15 | |
| 16 | 16 /MI 29 CLK | |
| 17 | 15 /RFSH 30 D4 | |
| 18 | 14 D7 31 D3 | |
| 19 | 13 D2 32 D5 | |
| 20 | 12 A1 33 D6 | |
| 21 | 11 A2 34 NC | |
| 22 | 10 A3 35 A0 | |
| 23 | 9 A4 36 D0 | |
| 24 | 8 A5 37 D1 | |
| 25 | 7 A6 38 /INT | |
| 26 | 6 A7 39 /HALT | |
| 27 | 5 A8 40 /MERQ | |
| 28 | 4 A9 41 /WR | |
| 29 | 3 A10 42 /NC | |
| 30 | 2 /RESET 43 +9VDC | |
| 31 | 1 GND 44 NC | |
| 32 | ||
| 33 | ***************************************************************************/ | |
| 34 | ||
| 35 | #pragma once | |
| 36 | ||
| 37 | #ifndef __VTECH_MEMEXP_H__ | |
| 38 | #define __VTECH_MEMEXP_H__ | |
| 39 | ||
| 40 | #include "emu.h" | |
| 41 | ||
| 42 | ||
| 43 | //************************************************************************** | |
| 44 | // INTERFACE CONFIGURATION MACROS | |
| 45 | //************************************************************************** | |
| 46 | ||
| 47 | #define MCFG_MEMEXP_SLOT_ADD(_tag) \ | |
| 48 | MCFG_DEVICE_ADD(_tag, MEMEXP_SLOT, 0) \ | |
| 49 | MCFG_DEVICE_SLOT_INTERFACE(memexp_slot_carts, NULL, false) | |
| 50 | ||
| 51 | #define MCFG_MEMEXP_SLOT_INT_HANDLER(_devcb) \ | |
| 52 | devcb = &memexp_device::set_int_handler(*device, DEVCB_##_devcb); | |
| 53 | ||
| 54 | #define MCFG_MEMEXP_SLOT_NMI_HANDLER(_devcb) \ | |
| 55 | devcb = &memexp_device::set_nmi_handler(*device, DEVCB_##_devcb); | |
| 56 | ||
| 57 | #define MCFG_MEMEXP_SLOT_RESET_HANDLER(_devcb) \ | |
| 58 | devcb = &memexp_device::set_reset_handler(*device, DEVCB_##_devcb); | |
| 59 | ||
| 60 | ||
| 61 | //************************************************************************** | |
| 62 | // TYPE DEFINITIONS | |
| 63 | //************************************************************************** | |
| 64 | ||
| 65 | class device_memexp_interface; | |
| 66 | ||
| 67 | class memexp_slot_device : public device_t, public device_slot_interface | |
| 68 | { | |
| 69 | public: | |
| 70 | // construction/destruction | |
| 71 | memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 72 | virtual ~memexp_slot_device(); | |
| 73 | ||
| 74 | void set_program_space(address_space *program); | |
| 75 | void set_io_space(address_space *io); | |
| 76 | ||
| 77 | // callbacks | |
| 78 | template<class _Object> static devcb_base &set_int_handler(device_t &device, _Object object) | |
| 79 | { return downcast<memexp_slot_device &>(device).m_int_handler.set_callback(object); } | |
| 80 | ||
| 81 | template<class _Object> static devcb_base &set_nmi_handler(device_t &device, _Object object) | |
| 82 | { return downcast<memexp_slot_device &>(device).m_nmi_handler.set_callback(object); } | |
| 83 | ||
| 84 | template<class _Object> static devcb_base &set_reset_handler(device_t &device, _Object object) | |
| 85 | { return downcast<memexp_slot_device &>(device).m_reset_handler.set_callback(object); } | |
| 86 | ||
| 87 | // called from cart device | |
| 88 | DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int_handler(state); } | |
| 89 | DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); } | |
| 90 | DECLARE_WRITE_LINE_MEMBER( reset_w ) { m_reset_handler(state); } | |
| 91 | ||
| 92 | address_space *m_program; | |
| 93 | address_space *m_io; | |
| 94 | ||
| 95 | protected: | |
| 96 | // device-level overrides | |
| 97 | virtual void device_start(); | |
| 98 | virtual void device_reset(); | |
| 99 | ||
| 100 | device_memexp_interface *m_cart; | |
| 101 | ||
| 102 | private: | |
| 103 | devcb_write_line m_int_handler; | |
| 104 | devcb_write_line m_nmi_handler; | |
| 105 | devcb_write_line m_reset_handler; | |
| 106 | }; | |
| 107 | ||
| 108 | // class representing interface-specific live memexp device | |
| 109 | class device_memexp_interface : public device_slot_card_interface | |
| 110 | { | |
| 111 | public: | |
| 112 | // construction/destruction | |
| 113 | device_memexp_interface(const machine_config &mconfig, device_t &device); | |
| 114 | virtual ~device_memexp_interface(); | |
| 115 | ||
| 116 | protected: | |
| 117 | memexp_slot_device *m_slot; | |
| 118 | }; | |
| 119 | ||
| 120 | // device type definition | |
| 121 | extern const device_type MEMEXP_SLOT; | |
| 122 | ||
| 123 | // include here so drivers don't need to | |
| 124 | #include "carts.h" | |
| 125 | ||
| 126 | #endif // __VTECH_MEMEXP_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | Dick Smith VZ-200/300 RS-232 Cartridge | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | ***************************************************************************/ | |
| 9 | ||
| 10 | #pragma once | |
| 11 | ||
| 12 | #ifndef __VTECH_MEMEXP_RS232_H__ | |
| 13 | #define __VTECH_MEMEXP_RS232_H__ | |
| 14 | ||
| 15 | #include "emu.h" | |
| 16 | #include "memexp.h" | |
| 17 | #include "bus/rs232/rs232.h" | |
| 18 | ||
| 19 | ||
| 20 | //************************************************************************** | |
| 21 | // TYPE DEFINITIONS | |
| 22 | //************************************************************************** | |
| 23 | ||
| 24 | // ======================> rs232_interface_device | |
| 25 | ||
| 26 | class rs232_interface_device : public device_t, public device_memexp_interface | |
| 27 | { | |
| 28 | public: | |
| 29 | // construction/destruction | |
| 30 | rs232_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 31 | ||
| 32 | DECLARE_WRITE_LINE_MEMBER( rs232_rx_w ); | |
| 33 | DECLARE_READ8_MEMBER( receive_data_r ); | |
| 34 | DECLARE_WRITE8_MEMBER( transmit_data_w ); | |
| 35 | ||
| 36 | protected: | |
| 37 | virtual const rom_entry *device_rom_region() const; | |
| 38 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 39 | virtual void device_start(); | |
| 40 | virtual void device_reset(); | |
| 41 | ||
| 42 | private: | |
| 43 | required_device<rs232_port_device> m_rs232; | |
| 44 | ||
| 45 | int m_rx; | |
| 46 | }; | |
| 47 | ||
| 48 | // device type definition | |
| 49 | extern const device_type RS232_INTERFACE; | |
| 50 | ||
| 51 | #endif // __VTECH_MEMEXP_RS232_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Memory Expansion Slot Devices | |
| 4 | ||
| 5 | ***************************************************************************/ | |
| 6 | ||
| 7 | #pragma once | |
| 8 | ||
| 9 | #ifndef __VTECH_MEMEXP_CARTS_H__ | |
| 10 | #define __VTECH_MEMEXP_CARTS_H__ | |
| 11 | ||
| 12 | #include "emu.h" | |
| 13 | ||
| 14 | #include "floppy.h" | |
| 15 | #include "memory.h" | |
| 16 | #include "rs232.h" | |
| 17 | #include "wordpro.h" | |
| 18 | ||
| 19 | SLOT_INTERFACE_EXTERN( memexp_slot_carts ); | |
| 20 | ||
| 21 | #endif // __VTECH_MEMEXP_CARTS_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | Dick Smith VZ-300 WordPro Cartridge | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | ***************************************************************************/ | |
| 9 | ||
| 10 | #pragma once | |
| 11 | ||
| 12 | #ifndef __VTECH_MEMEXP_WORDPRO_H__ | |
| 13 | #define __VTECH_MEMEXP_WORDPRO_H__ | |
| 14 | ||
| 15 | #include "emu.h" | |
| 16 | #include "memexp.h" | |
| 17 | ||
| 18 | ||
| 19 | //************************************************************************** | |
| 20 | // TYPE DEFINITIONS | |
| 21 | //************************************************************************** | |
| 22 | ||
| 23 | // ======================> wordpro_device | |
| 24 | ||
| 25 | class wordpro_device : public device_t, public device_memexp_interface | |
| 26 | { | |
| 27 | public: | |
| 28 | // construction/destruction | |
| 29 | wordpro_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 30 | ||
| 31 | protected: | |
| 32 | virtual const rom_entry *device_rom_region() const; | |
| 33 | virtual void device_start(); | |
| 34 | virtual void device_reset(); | |
| 35 | }; | |
| 36 | ||
| 37 | // device type definition | |
| 38 | extern const device_type WORDPRO; | |
| 39 | ||
| 40 | #endif // __VTECH_MEMEXP_WORDPRO_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Laser Memory Expansions | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | ***************************************************************************/ | |
| 9 | ||
| 10 | #include "memory.h" | |
| 11 | ||
| 12 | ||
| 13 | //************************************************************************** | |
| 14 | // DEVICE DEFINITIONS | |
| 15 | //************************************************************************** | |
| 16 | ||
| 17 | const device_type LASER110_16K = &device_creator<laser110_16k_device>; | |
| 18 | const device_type LASER210_16K = &device_creator<laser210_16k_device>; | |
| 19 | const device_type LASER310_16K = &device_creator<laser310_16k_device>; | |
| 20 | const device_type LASER_64K = &device_creator<laser_64k_device>; | |
| 21 | ||
| 22 | ||
| 23 | //************************************************************************** | |
| 24 | // LASER 110 16K DEVICE | |
| 25 | //************************************************************************** | |
| 26 | ||
| 27 | //------------------------------------------------- | |
| 28 | // laser110_16k_device - constructor | |
| 29 | //------------------------------------------------- | |
| 30 | ||
| 31 | laser110_16k_device::laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 32 | device_t(mconfig, LASER110_16K, "Laser 110/200/VZ-200 16k Memory", tag, owner, clock, "laser110_16k", __FILE__), | |
| 33 | device_memexp_interface(mconfig, *this) | |
| 34 | { | |
| 35 | } | |
| 36 | ||
| 37 | //------------------------------------------------- | |
| 38 | // device_start - device-specific startup | |
| 39 | //------------------------------------------------- | |
| 40 | ||
| 41 | void laser110_16k_device::device_start() | |
| 42 | { | |
| 43 | m_ram.resize(16 * 1024); | |
| 44 | } | |
| 45 | ||
| 46 | //------------------------------------------------- | |
| 47 | // device_reset - device-specific reset | |
| 48 | //------------------------------------------------- | |
| 49 | ||
| 50 | void laser110_16k_device::device_reset() | |
| 51 | { | |
| 52 | m_slot->m_program->install_ram(0x8000, 0xbfff, m_ram); | |
| 53 | } | |
| 54 | ||
| 55 | ||
| 56 | //************************************************************************** | |
| 57 | // LASER 210 16K DEVICE | |
| 58 | //************************************************************************** | |
| 59 | ||
| 60 | //------------------------------------------------- | |
| 61 | // laser210_16k_device - constructor | |
| 62 | //------------------------------------------------- | |
| 63 | ||
| 64 | laser210_16k_device::laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 65 | device_t(mconfig, LASER210_16K, "Laser 210/VZ-200 (DSE) 16k Memory", tag, owner, clock, "laser210_16k", __FILE__), | |
| 66 | device_memexp_interface(mconfig, *this) | |
| 67 | { | |
| 68 | } | |
| 69 | ||
| 70 | //------------------------------------------------- | |
| 71 | // device_start - device-specific startup | |
| 72 | //------------------------------------------------- | |
| 73 | ||
| 74 | void laser210_16k_device::device_start() | |
| 75 | { | |
| 76 | m_ram.resize(16 * 1024); | |
| 77 | } | |
| 78 | ||
| 79 | //------------------------------------------------- | |
| 80 | // device_reset - device-specific reset | |
| 81 | //------------------------------------------------- | |
| 82 | ||
| 83 | void laser210_16k_device::device_reset() | |
| 84 | { | |
| 85 | m_slot->m_program->install_ram(0x9000, 0xcfff, m_ram); | |
| 86 | } | |
| 87 | ||
| 88 | ||
| 89 | //************************************************************************** | |
| 90 | // VZ300 16K DEVICE | |
| 91 | //************************************************************************** | |
| 92 | ||
| 93 | //------------------------------------------------- | |
| 94 | // laser310_16k_device - constructor | |
| 95 | //------------------------------------------------- | |
| 96 | ||
| 97 | laser310_16k_device::laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 98 | device_t(mconfig, LASER310_16K, "Laser 310/VZ-300 16k Memory", tag, owner, clock, "laser310_16k", __FILE__), | |
| 99 | device_memexp_interface(mconfig, *this) | |
| 100 | { | |
| 101 | } | |
| 102 | ||
| 103 | //------------------------------------------------- | |
| 104 | // device_start - device-specific startup | |
| 105 | //------------------------------------------------- | |
| 106 | ||
| 107 | void laser310_16k_device::device_start() | |
| 108 | { | |
| 109 | m_ram.resize(16 * 1024); | |
| 110 | } | |
| 111 | ||
| 112 | //------------------------------------------------- | |
| 113 | // device_reset - device-specific reset | |
| 114 | //------------------------------------------------- | |
| 115 | ||
| 116 | void laser310_16k_device::device_reset() | |
| 117 | { | |
| 118 | m_slot->m_program->install_ram(0xb800, 0xf7ff, m_ram); | |
| 119 | } | |
| 120 | ||
| 121 | ||
| 122 | //************************************************************************** | |
| 123 | // VZ300 64K DEVICE | |
| 124 | //************************************************************************** | |
| 125 | ||
| 126 | //------------------------------------------------- | |
| 127 | // laser_64k_device - constructor | |
| 128 | //------------------------------------------------- | |
| 129 | ||
| 130 | laser_64k_device::laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 131 | device_t(mconfig, LASER_64K, "Laser/VZ 64k Memory", tag, owner, clock, "laser_64k", __FILE__), | |
| 132 | device_memexp_interface(mconfig, *this) | |
| 133 | { | |
| 134 | } | |
| 135 | ||
| 136 | //------------------------------------------------- | |
| 137 | // device_start - device-specific startup | |
| 138 | //------------------------------------------------- | |
| 139 | ||
| 140 | void laser_64k_device::device_start() | |
| 141 | { | |
| 142 | m_ram.resize(64 * 1024); | |
| 143 | } | |
| 144 | ||
| 145 | //------------------------------------------------- | |
| 146 | // device_reset - device-specific reset | |
| 147 | //------------------------------------------------- | |
| 148 | ||
| 149 | void laser_64k_device::device_reset() | |
| 150 | { | |
| 151 | // fixed first bank | |
| 152 | m_slot->m_program->install_ram(0x8000, 0xbfff, m_ram); | |
| 153 | ||
| 154 | // other banks | |
| 155 | m_slot->m_program->install_readwrite_bank(0xc000, 0xffff, tag()); | |
| 156 | ||
| 157 | membank(tag())->configure_entries(0, 4, m_ram, 0x4000); | |
| 158 | membank(tag())->set_entry(1); | |
| 159 | ||
| 160 | // bank switch | |
| 161 | m_slot->m_io->install_write_handler(0x70, 0x7f, write8_delegate(FUNC(laser_64k_device::bankswitch_w), this)); | |
| 162 | } | |
| 163 | ||
| 164 | WRITE8_MEMBER( laser_64k_device::bankswitch_w ) | |
| 165 | { | |
| 166 | membank(tag())->set_entry(data & 0x03); | |
| 167 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Floppy Controller Cartridge | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | Laser DD 20 | |
| 9 | Dick Smith Electronics X-7304 | |
| 10 | ||
| 11 | TODO: Broken currently, fix & modernize | |
| 12 | ||
| 13 | ***************************************************************************/ | |
| 14 | ||
| 15 | #include "floppy.h" | |
| 16 | #include "formats/vtech1_dsk.h" | |
| 17 | ||
| 18 | ||
| 19 | //************************************************************************** | |
| 20 | // CONSTANTS / MACROS | |
| 21 | //************************************************************************** | |
| 22 | ||
| 23 | #define VERBOSE 1 | |
| 24 | ||
| 25 | #define PHI0(n) (((n) >> 0) & 1) | |
| 26 | #define PHI1(n) (((n) >> 1) & 1) | |
| 27 | #define PHI2(n) (((n) >> 2) & 1) | |
| 28 | #define PHI3(n) (((n) >> 3) & 1) | |
| 29 | ||
| 30 | ||
| 31 | //************************************************************************** | |
| 32 | // FUNCTION PROTOTYPES | |
| 33 | //************************************************************************** | |
| 34 | ||
| 35 | static void laser_load_proc(device_image_interface &image); | |
| 36 | ||
| 37 | ||
| 38 | //************************************************************************** | |
| 39 | // DEVICE DEFINITIONS | |
| 40 | //************************************************************************** | |
| 41 | ||
| 42 | const device_type FLOPPY_CONTROLLER = &device_creator<floppy_controller_device>; | |
| 43 | ||
| 44 | //------------------------------------------------- | |
| 45 | // rom_region - device-specific ROM region | |
| 46 | //------------------------------------------------- | |
| 47 | ||
| 48 | ROM_START( floppy ) | |
| 49 | ROM_REGION(0x3000, "software", 0) | |
| 50 | ROM_LOAD("vzdos.rom", 0x0000, 0x2000, CRC(b6ed6084) SHA1(59d1cbcfa6c5e1906a32704fbf0d9670f0d1fd8b)) | |
| 51 | ROM_END | |
| 52 | ||
| 53 | const rom_entry *floppy_controller_device::device_rom_region() const | |
| 54 | { | |
| 55 | return ROM_NAME( floppy ); | |
| 56 | } | |
| 57 | ||
| 58 | //------------------------------------------------- | |
| 59 | // machine_config_additions - device-specific | |
| 60 | // machine configurations | |
| 61 | //------------------------------------------------- | |
| 62 | ||
| 63 | static const floppy_interface laser_floppy_interface = | |
| 64 | { | |
| 65 | FLOPPY_STANDARD_5_25_DSHD, | |
| 66 | LEGACY_FLOPPY_OPTIONS_NAME(vtech1_only), | |
| 67 | NULL | |
| 68 | }; | |
| 69 | ||
| 70 | static MACHINE_CONFIG_FRAGMENT( floppy_controller ) | |
| 71 | MCFG_MEMEXP_SLOT_ADD("mem") | |
| 72 | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(laser_floppy_interface) | |
| 73 | MACHINE_CONFIG_END | |
| 74 | ||
| 75 | machine_config_constructor floppy_controller_device::device_mconfig_additions() const | |
| 76 | { | |
| 77 | return MACHINE_CONFIG_NAME( floppy_controller ); | |
| 78 | } | |
| 79 | ||
| 80 | ||
| 81 | //************************************************************************** | |
| 82 | // LIVE DEVICE | |
| 83 | //************************************************************************** | |
| 84 | ||
| 85 | //------------------------------------------------- | |
| 86 | // floppy_controller_device - constructor | |
| 87 | //------------------------------------------------- | |
| 88 | ||
| 89 | floppy_controller_device::floppy_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 90 | device_t(mconfig, FLOPPY_CONTROLLER, "Laser/VZ Floppy Disk Controller", tag, owner, clock, "laserfdc", __FILE__), | |
| 91 | device_memexp_interface(mconfig, *this), | |
| 92 | m_memexp(*this, "mem"), | |
| 93 | m_floppy0(*this, "floppy0"), | |
| 94 | m_floppy1(*this, "floppy1") | |
| 95 | { | |
| 96 | } | |
| 97 | ||
| 98 | //------------------------------------------------- | |
| 99 | // device_start - device-specific startup | |
| 100 | //------------------------------------------------- | |
| 101 | ||
| 102 | void floppy_controller_device::device_start() | |
| 103 | { | |
| 104 | m_drive = -1; | |
| 105 | m_fdc_track_x2[0] = 80; | |
| 106 | m_fdc_track_x2[1] = 80; | |
| 107 | m_fdc_wrprot[0] = 0x80; | |
| 108 | m_fdc_wrprot[1] = 0x80; | |
| 109 | m_fdc_status = 0; | |
| 110 | m_fdc_edge = 0; | |
| 111 | m_fdc_bits = 8; | |
| 112 | m_fdc_start = 0; | |
| 113 | m_fdc_write = 0; | |
| 114 | m_fdc_offs = 0; | |
| 115 | m_fdc_latch = 0; | |
| 116 | ||
| 117 | m_floppy0->floppy_install_load_proc(laser_load_proc); | |
| 118 | m_floppy1->floppy_install_load_proc(laser_load_proc); | |
| 119 | } | |
| 120 | ||
| 121 | //------------------------------------------------- | |
| 122 | // device_reset - device-specific reset | |
| 123 | //------------------------------------------------- | |
| 124 | ||
| 125 | void floppy_controller_device::device_reset() | |
| 126 | { | |
| 127 | m_memexp->set_io_space(m_slot->m_io); | |
| 128 | m_memexp->set_program_space(m_slot->m_program); | |
| 129 | ||
| 130 | m_slot->m_program->install_rom(0x4000, 0x5fff, memregion("software")->base()); | |
| 131 | ||
| 132 | m_slot->m_io->install_read_handler(0x10, 0x1f, read8_delegate(FUNC(floppy_controller_device::floppy_r), this)); | |
| 133 | m_slot->m_io->install_write_handler(0x10, 0x1f, write8_delegate(FUNC(floppy_controller_device::floppy_w), this)); | |
| 134 | } | |
| 135 | ||
| 136 | ||
| 137 | //************************************************************************** | |
| 138 | // IMPLEMENTATION | |
| 139 | //************************************************************************** | |
| 140 | ||
| 141 | int floppy_controller_device::get_floppy_id(device_image_interface *image) | |
| 142 | { | |
| 143 | if (image == dynamic_cast<device_image_interface *>(m_floppy0.target())) | |
| 144 | return 0; | |
| 145 | if (image == dynamic_cast<device_image_interface *>(m_floppy1.target())) | |
| 146 | return 1; | |
| 147 | ||
| 148 | return -1; | |
| 149 | } | |
| 150 | ||
| 151 | device_image_interface *floppy_controller_device::get_floppy_device(int drive) | |
| 152 | { | |
| 153 | device_image_interface *image = NULL; | |
| 154 | ||
| 155 | switch (drive) | |
| 156 | { | |
| 157 | case 0: | |
| 158 | image = dynamic_cast<device_image_interface *>(m_floppy0.target()); | |
| 159 | break; | |
| 160 | ||
| 161 | case 1: | |
| 162 | image = dynamic_cast<device_image_interface *>(m_floppy1.target()); | |
| 163 | break; | |
| 164 | } | |
| 165 | ||
| 166 | return image; | |
| 167 | } | |
| 168 | ||
| 169 | static void laser_load_proc(device_image_interface &image) | |
| 170 | { | |
| 171 | floppy_controller_device *fdc = dynamic_cast<floppy_controller_device *>(image.device().owner()); | |
| 172 | ||
| 173 | int id = fdc->get_floppy_id(&image); | |
| 174 | ||
| 175 | if (!image.is_readonly()) | |
| 176 | fdc->m_fdc_wrprot[id] = 0x00; | |
| 177 | else | |
| 178 | fdc->m_fdc_wrprot[id] = 0x80; | |
| 179 | } | |
| 180 | ||
| 181 | void floppy_controller_device::get_track() | |
| 182 | { | |
| 183 | device_image_interface *image = get_floppy_device(m_drive); | |
| 184 | ||
| 185 | /* drive selected or and image file ok? */ | |
| 186 | if (m_drive >= 0 && image->exists()) | |
| 187 | { | |
| 188 | int size, offs; | |
| 189 | size = TRKSIZE_VZ; | |
| 190 | offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; | |
| 191 | image->fseek(offs, SEEK_SET); | |
| 192 | // some disks have slightly larger header, make sure we capture the checksum at the end of the track | |
| 193 | size = image->fread(m_fdc_data, size+4); | |
| 194 | if (VERBOSE) | |
| 195 | logerror("get track @$%05x $%04x bytes\n", offs, size); | |
| 196 | } | |
| 197 | m_fdc_offs = 0; | |
| 198 | m_fdc_write = 0; | |
| 199 | } | |
| 200 | ||
| 201 | void floppy_controller_device::put_track() | |
| 202 | { | |
| 203 | /* drive selected and image file ok? */ | |
| 204 | if (m_drive >= 0 && floppy_get_device(machine(),m_drive) != NULL) | |
| 205 | { | |
| 206 | int size, offs; | |
| 207 | device_image_interface *image = get_floppy_device(m_drive); | |
| 208 | offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; | |
| 209 | image->fseek(offs + m_fdc_start, SEEK_SET); | |
| 210 | size = image->fwrite(&m_fdc_data[m_fdc_start], m_fdc_write); | |
| 211 | if (VERBOSE) | |
| 212 | logerror("put track @$%05X+$%X $%04X/$%04X bytes\n", offs, m_fdc_start, size, m_fdc_write); | |
| 213 | } | |
| 214 | } | |
| 215 | ||
| 216 | READ8_MEMBER( floppy_controller_device::floppy_r ) | |
| 217 | { | |
| 218 | int data = 0xff; | |
| 219 | ||
| 220 | switch (offset) | |
| 221 | { | |
| 222 | case 1: /* data (read-only) */ | |
| 223 | if (m_fdc_bits > 0) | |
| 224 | { | |
| 225 | if( m_fdc_status & 0x80 ) | |
| 226 | m_fdc_bits--; | |
| 227 | data = (m_data >> m_fdc_bits) & 0xff; | |
| 228 | if (VERBOSE) { | |
| 229 | logerror("vtech1_fdc_r bits %d%d%d%d%d%d%d%d\n", | |
| 230 | (data>>7)&1,(data>>6)&1,(data>>5)&1,(data>>4)&1, | |
| 231 | (data>>3)&1,(data>>2)&1,(data>>1)&1,(data>>0)&1 ); | |
| 232 | } | |
| 233 | } | |
| 234 | if (m_fdc_bits == 0) | |
| 235 | { | |
| 236 | m_data = m_fdc_data[m_fdc_offs]; | |
| 237 | if (VERBOSE) | |
| 238 | logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, m_fdc_offs, m_data); | |
| 239 | if(m_fdc_status & 0x80) | |
| 240 | { | |
| 241 | m_fdc_bits = 8; | |
| 242 | m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; | |
| 243 | } | |
| 244 | m_fdc_status &= ~0x80; | |
| 245 | } | |
| 246 | break; | |
| 247 | case 2: /* polling (read-only) */ | |
| 248 | /* fake */ | |
| 249 | if (m_drive >= 0) | |
| 250 | m_fdc_status |= 0x80; | |
| 251 | data = m_fdc_status; | |
| 252 | break; | |
| 253 | case 3: /* write protect status (read-only) */ | |
| 254 | if (m_drive >= 0) | |
| 255 | data = m_fdc_wrprot[m_drive]; | |
| 256 | if (VERBOSE) | |
| 257 | logerror("vtech1_fdc_r %d : write_protect $%02X\n", offset, data); | |
| 258 | break; | |
| 259 | } | |
| 260 | return data; | |
| 261 | } | |
| 262 | ||
| 263 | WRITE8_MEMBER( floppy_controller_device::floppy_w ) | |
| 264 | { | |
| 265 | int drive; | |
| 266 | ||
| 267 | switch (offset) | |
| 268 | { | |
| 269 | case 0: /* latch (write-only) */ | |
| 270 | drive = (data & 0x10) ? 0 : (data & 0x80) ? 1 : -1; | |
| 271 | if (drive != m_drive) | |
| 272 | { | |
| 273 | m_drive = drive; | |
| 274 | if (m_drive >= 0) | |
| 275 | get_track(); | |
| 276 | } | |
| 277 | if (m_drive >= 0) | |
| 278 | { | |
| 279 | if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(m_fdc_latch)) || | |
| 280 | (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(m_fdc_latch)) || | |
| 281 | (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(m_fdc_latch)) || | |
| 282 | (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(m_fdc_latch))) | |
| 283 | { | |
| 284 | if (m_fdc_track_x2[m_drive] > 0) | |
| 285 | m_fdc_track_x2[m_drive]--; | |
| 286 | if (VERBOSE) | |
| 287 | 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)); | |
| 288 | if ((m_fdc_track_x2[m_drive] & 1) == 0) | |
| 289 | get_track(); | |
| 290 | } | |
| 291 | else | |
| 292 | if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(m_fdc_latch)) || | |
| 293 | (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(m_fdc_latch)) || | |
| 294 | (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(m_fdc_latch)) || | |
| 295 | (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(m_fdc_latch))) | |
| 296 | { | |
| 297 | if (m_fdc_track_x2[m_drive] < 2*40) | |
| 298 | m_fdc_track_x2[m_drive]++; | |
| 299 | if (VERBOSE) | |
| 300 | 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)); | |
| 301 | if ((m_fdc_track_x2[m_drive] & 1) == 0) | |
| 302 | get_track(); | |
| 303 | } | |
| 304 | if ((data & 0x40) == 0) | |
| 305 | { | |
| 306 | m_data <<= 1; | |
| 307 | if ((m_fdc_latch ^ data) & 0x20) | |
| 308 | m_data |= 1; | |
| 309 | if ((m_fdc_edge ^= 1) == 0) | |
| 310 | { | |
| 311 | m_fdc_bits--; | |
| 312 | ||
| 313 | if (m_fdc_bits == 0) | |
| 314 | { | |
| 315 | UINT8 value = 0; | |
| 316 | m_data &= 0xffff; | |
| 317 | if (m_data & 0x4000 ) value |= 0x80; | |
| 318 | if (m_data & 0x1000 ) value |= 0x40; | |
| 319 | if (m_data & 0x0400 ) value |= 0x20; | |
| 320 | if (m_data & 0x0100 ) value |= 0x10; | |
| 321 | if (m_data & 0x0040 ) value |= 0x08; | |
| 322 | if (m_data & 0x0010 ) value |= 0x04; | |
| 323 | if (m_data & 0x0004 ) value |= 0x02; | |
| 324 | if (m_data & 0x0001 ) value |= 0x01; | |
| 325 | if (VERBOSE) | |
| 326 | logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, m_fdc_offs, m_fdc_data[m_fdc_offs], value, m_data); | |
| 327 | m_fdc_data[m_fdc_offs] = value; | |
| 328 | m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; | |
| 329 | m_fdc_write++; | |
| 330 | m_fdc_bits = 8; | |
| 331 | } | |
| 332 | } | |
| 333 | } | |
| 334 | /* change of write signal? */ | |
| 335 | if ((m_fdc_latch ^ data) & 0x40) | |
| 336 | { | |
| 337 | /* falling edge? */ | |
| 338 | if (m_fdc_latch & 0x40) | |
| 339 | { | |
| 340 | m_fdc_start = m_fdc_offs; | |
| 341 | m_fdc_edge = 0; | |
| 342 | } | |
| 343 | else | |
| 344 | { | |
| 345 | /* data written to track before? */ | |
| 346 | if (m_fdc_write) | |
| 347 | put_track(); | |
| 348 | } | |
| 349 | m_fdc_bits = 8; | |
| 350 | m_fdc_write = 0; | |
| 351 | } | |
| 352 | } | |
| 353 | m_fdc_latch = data; | |
| 354 | break; | |
| 355 | } | |
| 356 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Memory Expansion Slot | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | 44-pin slot | |
| 9 | ||
| 10 | ***************************************************************************/ | |
| 11 | ||
| 12 | #include "memexp.h" | |
| 13 | ||
| 14 | ||
| 15 | //************************************************************************** | |
| 16 | // DEVICE DEFINITIONS | |
| 17 | //************************************************************************** | |
| 18 | ||
| 19 | const device_type MEMEXP_SLOT = &device_creator<memexp_slot_device>; | |
| 20 | ||
| 21 | ||
| 22 | //************************************************************************** | |
| 23 | // SLOT DEVICE | |
| 24 | //************************************************************************** | |
| 25 | ||
| 26 | //------------------------------------------------- | |
| 27 | // memexp_slot_device - constructor | |
| 28 | //------------------------------------------------- | |
| 29 | ||
| 30 | memexp_slot_device::memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 31 | device_t(mconfig, MEMEXP_SLOT, "Memory Expansion Slot", tag, owner, clock, "memexp_slot", __FILE__), | |
| 32 | device_slot_interface(mconfig, *this), | |
| 33 | m_program(NULL), | |
| 34 | m_io(NULL), | |
| 35 | m_cart(NULL), | |
| 36 | m_int_handler(*this), | |
| 37 | m_nmi_handler(*this), | |
| 38 | m_reset_handler(*this) | |
| 39 | { | |
| 40 | } | |
| 41 | ||
| 42 | //------------------------------------------------- | |
| 43 | // memexp_slot_device - destructor | |
| 44 | //------------------------------------------------- | |
| 45 | ||
| 46 | memexp_slot_device::~memexp_slot_device() | |
| 47 | { | |
| 48 | } | |
| 49 | ||
| 50 | //------------------------------------------------- | |
| 51 | // device_start - device-specific startup | |
| 52 | //------------------------------------------------- | |
| 53 | ||
| 54 | void memexp_slot_device::device_start() | |
| 55 | { | |
| 56 | // resolve callbacks | |
| 57 | m_int_handler.resolve_safe(); | |
| 58 | m_nmi_handler.resolve_safe(); | |
| 59 | m_reset_handler.resolve_safe(); | |
| 60 | } | |
| 61 | ||
| 62 | //------------------------------------------------- | |
| 63 | // device_reset - device-specific reset | |
| 64 | //------------------------------------------------- | |
| 65 | ||
| 66 | void memexp_slot_device::device_reset() | |
| 67 | { | |
| 68 | } | |
| 69 | ||
| 70 | //------------------------------------------------- | |
| 71 | // set_program_space - set address space we are attached to | |
| 72 | //------------------------------------------------- | |
| 73 | ||
| 74 | void memexp_slot_device::set_program_space(address_space *program) | |
| 75 | { | |
| 76 | m_program = program; | |
| 77 | } | |
| 78 | ||
| 79 | //------------------------------------------------- | |
| 80 | // set_io_space - set address space we are attached to | |
| 81 | //------------------------------------------------- | |
| 82 | ||
| 83 | void memexp_slot_device::set_io_space(address_space *io) | |
| 84 | { | |
| 85 | m_io = io; | |
| 86 | } | |
| 87 | ||
| 88 | ||
| 89 | //************************************************************************** | |
| 90 | // CARTRIDGE INTERFACE | |
| 91 | //************************************************************************** | |
| 92 | ||
| 93 | //------------------------------------------------- | |
| 94 | // device_memexp_interface - constructor | |
| 95 | //------------------------------------------------- | |
| 96 | ||
| 97 | device_memexp_interface::device_memexp_interface(const machine_config &mconfig, device_t &device) : | |
| 98 | device_slot_card_interface(mconfig, device) | |
| 99 | { | |
| 100 | m_slot = dynamic_cast<memexp_slot_device *>(device.owner()); | |
| 101 | } | |
| 102 | ||
| 103 | //------------------------------------------------- | |
| 104 | // ~device_memexp_interface - destructor | |
| 105 | //------------------------------------------------- | |
| 106 | ||
| 107 | device_memexp_interface::~device_memexp_interface() | |
| 108 | { | |
| 109 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | Dick Smith VZ-200/300 RS-232 Cartridge | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | ***************************************************************************/ | |
| 9 | ||
| 10 | #include "rs232.h" | |
| 11 | ||
| 12 | ||
| 13 | //************************************************************************** | |
| 14 | // DEVICE DEFINITIONS | |
| 15 | //************************************************************************** | |
| 16 | ||
| 17 | const device_type RS232_INTERFACE = &device_creator<rs232_interface_device>; | |
| 18 | ||
| 19 | //------------------------------------------------- | |
| 20 | // rom_region - device-specific ROM region | |
| 21 | //------------------------------------------------- | |
| 22 | ||
| 23 | ROM_START( rs232 ) | |
| 24 | ROM_REGION(0x800, "software", 0) | |
| 25 | ROM_LOAD("rs232_v15.ic2", 0x000, 0x800, CRC(6545260d) SHA1(4042f6f1e09e383f3c92f628c6187dc5f072fdb2)) | |
| 26 | ROM_END | |
| 27 | ||
| 28 | const rom_entry *rs232_interface_device::device_rom_region() const | |
| 29 | { | |
| 30 | return ROM_NAME( rs232 ); | |
| 31 | } | |
| 32 | ||
| 33 | //------------------------------------------------- | |
| 34 | // machine_config_additions - device-specific | |
| 35 | // machine configurations | |
| 36 | //------------------------------------------------- | |
| 37 | ||
| 38 | static MACHINE_CONFIG_FRAGMENT( rs232 ) | |
| 39 | MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL) | |
| 40 | MCFG_RS232_RXD_HANDLER(WRITELINE(rs232_interface_device, rs232_rx_w)) | |
| 41 | MACHINE_CONFIG_END | |
| 42 | ||
| 43 | machine_config_constructor rs232_interface_device::device_mconfig_additions() const | |
| 44 | { | |
| 45 | return MACHINE_CONFIG_NAME( rs232 ); | |
| 46 | } | |
| 47 | ||
| 48 | ||
| 49 | //************************************************************************** | |
| 50 | // LIVE DEVICE | |
| 51 | //************************************************************************** | |
| 52 | ||
| 53 | //------------------------------------------------- | |
| 54 | // wordpro_device - constructor | |
| 55 | //------------------------------------------------- | |
| 56 | ||
| 57 | rs232_interface_device::rs232_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 58 | device_t(mconfig, RS232_INTERFACE, "DSE VZ-200/300 RS-232 Interface", tag, owner, clock, "vz_rs232", __FILE__), | |
| 59 | device_memexp_interface(mconfig, *this), | |
| 60 | m_rs232(*this, "rs232"), | |
| 61 | m_rx(1) | |
| 62 | { | |
| 63 | } | |
| 64 | ||
| 65 | //------------------------------------------------- | |
| 66 | // device_start - device-specific startup | |
| 67 | //------------------------------------------------- | |
| 68 | ||
| 69 | void rs232_interface_device::device_start() | |
| 70 | { | |
| 71 | } | |
| 72 | ||
| 73 | //------------------------------------------------- | |
| 74 | // device_reset - device-specific reset | |
| 75 | //------------------------------------------------- | |
| 76 | ||
| 77 | void rs232_interface_device::device_reset() | |
| 78 | { | |
| 79 | // program | |
| 80 | m_slot->m_program->install_rom(0x4000, 0x47ff, 0, 0x800, memregion("software")->base()); | |
| 81 | ||
| 82 | // data | |
| 83 | m_slot->m_program->install_read_handler(0x5000, 0x57ff, read8_delegate(FUNC(rs232_interface_device::receive_data_r), this)); | |
| 84 | m_slot->m_program->install_write_handler(0x5800, 0x5fff, write8_delegate(FUNC(rs232_interface_device::transmit_data_w), this)); | |
| 85 | } | |
| 86 | ||
| 87 | ||
| 88 | //************************************************************************** | |
| 89 | // IMPLEMENTATION | |
| 90 | //************************************************************************** | |
| 91 | ||
| 92 | WRITE_LINE_MEMBER( rs232_interface_device::rs232_rx_w ) | |
| 93 | { | |
| 94 | m_rx = state; | |
| 95 | } | |
| 96 | ||
| 97 | READ8_MEMBER( rs232_interface_device::receive_data_r ) | |
| 98 | { | |
| 99 | return 0x7f | (m_rx << 7); | |
| 100 | } | |
| 101 | ||
| 102 | WRITE8_MEMBER( rs232_interface_device::transmit_data_w ) | |
| 103 | { | |
| 104 | m_rs232->write_txd(!BIT(data, 7)); | |
| 105 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Memory Expansion Slot Devices | |
| 4 | ||
| 5 | ***************************************************************************/ | |
| 6 | ||
| 7 | #include "carts.h" | |
| 8 | ||
| 9 | SLOT_INTERFACE_START( memexp_slot_carts ) | |
| 10 | SLOT_INTERFACE("floppy", FLOPPY_CONTROLLER) | |
| 11 | SLOT_INTERFACE("laser110_16k", LASER110_16K) | |
| 12 | SLOT_INTERFACE("laser210_16k", LASER210_16K) | |
| 13 | SLOT_INTERFACE("laser310_16k", LASER310_16K) | |
| 14 | SLOT_INTERFACE("laser_64k", LASER_64K) | |
| 15 | SLOT_INTERFACE("rs232", RS232_INTERFACE) | |
| 16 | SLOT_INTERFACE("wordpro", WORDPRO) | |
| 17 | SLOT_INTERFACE_END |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | Dick Smith VZ-300 WordPro Cartridge | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | ***************************************************************************/ | |
| 9 | ||
| 10 | #include "wordpro.h" | |
| 11 | ||
| 12 | ||
| 13 | //************************************************************************** | |
| 14 | // DEVICE DEFINITIONS | |
| 15 | //************************************************************************** | |
| 16 | ||
| 17 | const device_type WORDPRO = &device_creator<wordpro_device>; | |
| 18 | ||
| 19 | //------------------------------------------------- | |
| 20 | // rom_region - device-specific ROM region | |
| 21 | //------------------------------------------------- | |
| 22 | ||
| 23 | ROM_START( wordpro ) | |
| 24 | ROM_REGION(0x3000, "software", 0) | |
| 25 | ROM_LOAD("wordpro.u3", 0x0000, 0x1000, CRC(c37ea780) SHA1(03f56711e08d88e7b523c0ef9c2a5af83ee7ad05)) | |
| 26 | ROM_LOAD("wordpro.u4", 0x1000, 0x1000, CRC(2e3a8c45) SHA1(a9d48d809f39a3478496a6d3ddd728bd0b4efc37)) | |
| 27 | ROM_LOAD("wordpro.u5", 0x2000, 0x1000, CRC(2a336802) SHA1(b4de50f943243f18a2bfabef354b76d77178c189)) | |
| 28 | ROM_END | |
| 29 | ||
| 30 | const rom_entry *wordpro_device::device_rom_region() const | |
| 31 | { | |
| 32 | return ROM_NAME( wordpro ); | |
| 33 | } | |
| 34 | ||
| 35 | ||
| 36 | //************************************************************************** | |
| 37 | // LIVE DEVICE | |
| 38 | //************************************************************************** | |
| 39 | ||
| 40 | //------------------------------------------------- | |
| 41 | // wordpro_device - constructor | |
| 42 | //------------------------------------------------- | |
| 43 | ||
| 44 | wordpro_device::wordpro_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 45 | device_t(mconfig, WORDPRO, "DSE VZ-300 WordPro", tag, owner, clock, "wordpro", __FILE__), | |
| 46 | device_memexp_interface(mconfig, *this) | |
| 47 | { | |
| 48 | } | |
| 49 | ||
| 50 | //------------------------------------------------- | |
| 51 | // device_start - device-specific startup | |
| 52 | //------------------------------------------------- | |
| 53 | ||
| 54 | void wordpro_device::device_start() | |
| 55 | { | |
| 56 | } | |
| 57 | ||
| 58 | //------------------------------------------------- | |
| 59 | // device_reset - device-specific reset | |
| 60 | //------------------------------------------------- | |
| 61 | ||
| 62 | void wordpro_device::device_reset() | |
| 63 | { | |
| 64 | m_slot->m_program->install_rom(0x6000, 0x67ff, memregion("software")->base()); | |
| 65 | m_slot->m_program->install_rom(0xd000, 0xffff, memregion("software")->base()); | |
| 66 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Memory Expansions | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | ***************************************************************************/ | |
| 9 | ||
| 10 | #pragma once | |
| 11 | ||
| 12 | #ifndef __VTECH_MEMEXP_MEMORY__ | |
| 13 | #define __VTECH_MEMEXP_MEMORY__ | |
| 14 | ||
| 15 | #include "emu.h" | |
| 16 | #include "memexp.h" | |
| 17 | ||
| 18 | ||
| 19 | //************************************************************************** | |
| 20 | // TYPE DEFINITIONS | |
| 21 | //************************************************************************** | |
| 22 | ||
| 23 | // ======================> laser110_16k_device | |
| 24 | ||
| 25 | class laser110_16k_device : public device_t, public device_memexp_interface | |
| 26 | { | |
| 27 | public: | |
| 28 | // construction/destruction | |
| 29 | laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 30 | ||
| 31 | protected: | |
| 32 | virtual void device_start(); | |
| 33 | virtual void device_reset(); | |
| 34 | ||
| 35 | private: | |
| 36 | dynamic_array<UINT8> m_ram; | |
| 37 | }; | |
| 38 | ||
| 39 | // ======================> laser210_16k_device | |
| 40 | ||
| 41 | class laser210_16k_device : public device_t, public device_memexp_interface | |
| 42 | { | |
| 43 | public: | |
| 44 | // construction/destruction | |
| 45 | laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 46 | ||
| 47 | protected: | |
| 48 | virtual void device_start(); | |
| 49 | virtual void device_reset(); | |
| 50 | ||
| 51 | private: | |
| 52 | dynamic_array<UINT8> m_ram; | |
| 53 | }; | |
| 54 | ||
| 55 | // ======================> laser310_16k_device | |
| 56 | ||
| 57 | class laser310_16k_device : public device_t, public device_memexp_interface | |
| 58 | { | |
| 59 | public: | |
| 60 | // construction/destruction | |
| 61 | laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 62 | ||
| 63 | protected: | |
| 64 | virtual void device_start(); | |
| 65 | virtual void device_reset(); | |
| 66 | ||
| 67 | private: | |
| 68 | dynamic_array<UINT8> m_ram; | |
| 69 | }; | |
| 70 | ||
| 71 | // ======================> laser_64k_device | |
| 72 | ||
| 73 | class laser_64k_device : public device_t, public device_memexp_interface | |
| 74 | { | |
| 75 | public: | |
| 76 | // construction/destruction | |
| 77 | laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 78 | ||
| 79 | DECLARE_WRITE8_MEMBER( bankswitch_w ); | |
| 80 | ||
| 81 | protected: | |
| 82 | virtual void device_start(); | |
| 83 | virtual void device_reset(); | |
| 84 | ||
| 85 | private: | |
| 86 | dynamic_array<UINT8> m_ram; | |
| 87 | }; | |
| 88 | ||
| 89 | // device type definition | |
| 90 | extern const device_type LASER110_16K; | |
| 91 | extern const device_type LASER210_16K; | |
| 92 | extern const device_type LASER310_16K; | |
| 93 | extern const device_type LASER_64K; | |
| 94 | ||
| 95 | #endif // __VTECH_MEMEXP_MEMORY__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Joystick Interface | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | VTech Laser JS 20 | |
| 9 | Dick Smith Electronics X-7315 | |
| 10 | ||
| 11 | ***************************************************************************/ | |
| 12 | ||
| 13 | #include "joystick.h" | |
| 14 | ||
| 15 | ||
| 16 | //************************************************************************** | |
| 17 | // DEVICE DEFINITIONS | |
| 18 | //************************************************************************** | |
| 19 | ||
| 20 | const device_type JOYSTICK_INTERFACE = &device_creator<joystick_interface_device>; | |
| 21 | ||
| 22 | //------------------------------------------------- | |
| 23 | // input_ports - device-specific input ports | |
| 24 | //------------------------------------------------- | |
| 25 | ||
| 26 | static INPUT_PORTS_START( joystick ) | |
| 27 | PORT_START("joystick_0") | |
| 28 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) | |
| 29 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) | |
| 30 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) | |
| 31 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) | |
| 32 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) | |
| 33 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 34 | ||
| 35 | PORT_START("joystick_0_arm") | |
| 36 | PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 37 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) | |
| 38 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 39 | ||
| 40 | PORT_START("joystick_1") | |
| 41 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) | |
| 42 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) | |
| 43 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) | |
| 44 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) | |
| 45 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) | |
| 46 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 47 | ||
| 48 | PORT_START("joystick_1_arm") | |
| 49 | PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 50 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) | |
| 51 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 52 | INPUT_PORTS_END | |
| 53 | ||
| 54 | ioport_constructor joystick_interface_device::device_input_ports() const | |
| 55 | { | |
| 56 | return INPUT_PORTS_NAME( joystick ); | |
| 57 | } | |
| 58 | ||
| 59 | ||
| 60 | //************************************************************************** | |
| 61 | // LIVE DEVICE | |
| 62 | //************************************************************************** | |
| 63 | ||
| 64 | //------------------------------------------------- | |
| 65 | // joystick_interface_device - constructor | |
| 66 | //------------------------------------------------- | |
| 67 | ||
| 68 | joystick_interface_device::joystick_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 69 | device_t(mconfig, JOYSTICK_INTERFACE, "Laser/VZ Joystick Interface", tag, owner, clock, "joystick", __FILE__), | |
| 70 | device_ioexp_interface(mconfig, *this), | |
| 71 | m_joy0(*this, "joystick_0"), | |
| 72 | m_joy0_arm(*this, "joystick_0_arm"), | |
| 73 | m_joy1(*this, "joystick_1"), | |
| 74 | m_joy1_arm(*this, "joystick_1_arm") | |
| 75 | { | |
| 76 | } | |
| 77 | ||
| 78 | //------------------------------------------------- | |
| 79 | // device_start - device-specific startup | |
| 80 | //------------------------------------------------- | |
| 81 | ||
| 82 | void joystick_interface_device::device_start() | |
| 83 | { | |
| 84 | } | |
| 85 | ||
| 86 | //------------------------------------------------- | |
| 87 | // device_reset - device-specific reset | |
| 88 | //------------------------------------------------- | |
| 89 | ||
| 90 | void joystick_interface_device::device_reset() | |
| 91 | { | |
| 92 | m_slot->m_io->install_read_handler(0x20, 0x2f, read8_delegate(FUNC(joystick_interface_device::joystick_r), this)); | |
| 93 | } | |
| 94 | ||
| 95 | ||
| 96 | //************************************************************************** | |
| 97 | // IMPLEMENTATION | |
| 98 | //************************************************************************** | |
| 99 | ||
| 100 | READ8_MEMBER( joystick_interface_device::joystick_r ) | |
| 101 | { | |
| 102 | UINT8 data = 0xff; | |
| 103 | ||
| 104 | if (!BIT(offset, 0)) data &= m_joy0->read(); | |
| 105 | if (!BIT(offset, 1)) data &= m_joy0_arm->read(); | |
| 106 | if (!BIT(offset, 2)) data &= m_joy1->read(); | |
| 107 | if (!BIT(offset, 3)) data &= m_joy1_arm->read(); | |
| 108 | ||
| 109 | return data; | |
| 110 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ I/O Expansion Slot Devices | |
| 4 | ||
| 5 | ***************************************************************************/ | |
| 6 | ||
| 7 | #pragma once | |
| 8 | ||
| 9 | #ifndef __VTECH_IOEXP_CARTS_H__ | |
| 10 | #define __VTECH_IOEXP_CARTS_H__ | |
| 11 | ||
| 12 | #include "emu.h" | |
| 13 | ||
| 14 | #include "joystick.h" | |
| 15 | #include "printer.h" | |
| 16 | ||
| 17 | SLOT_INTERFACE_EXTERN( ioexp_slot_carts ); | |
| 18 | ||
| 19 | #endif // __VTECH_IOEXP_CARTS_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Printer Interface | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | VTech PI 20 | |
| 9 | Dick Smith Electronics X-7320 | |
| 10 | ||
| 11 | ***************************************************************************/ | |
| 12 | ||
| 13 | #include "printer.h" | |
| 14 | ||
| 15 | ||
| 16 | //************************************************************************** | |
| 17 | // DEVICE DEFINITIONS | |
| 18 | //************************************************************************** | |
| 19 | ||
| 20 | const device_type PRINTER_INTERFACE = &device_creator<printer_interface_device>; | |
| 21 | ||
| 22 | //------------------------------------------------- | |
| 23 | // machine_config_additions - device-specific | |
| 24 | // machine configurations | |
| 25 | //------------------------------------------------- | |
| 26 | ||
| 27 | static MACHINE_CONFIG_FRAGMENT( printer_interface ) | |
| 28 | MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer") | |
| 29 | MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(printer_interface_device, busy_w)) | |
| 30 | MCFG_CENTRONICS_OUTPUT_LATCH_ADD("latch", "centronics") | |
| 31 | MACHINE_CONFIG_END | |
| 32 | ||
| 33 | machine_config_constructor printer_interface_device::device_mconfig_additions() const | |
| 34 | { | |
| 35 | return MACHINE_CONFIG_NAME( printer_interface ); | |
| 36 | } | |
| 37 | ||
| 38 | ||
| 39 | //************************************************************************** | |
| 40 | // LIVE DEVICE | |
| 41 | //************************************************************************** | |
| 42 | ||
| 43 | //------------------------------------------------- | |
| 44 | // printer_interface_device - constructor | |
| 45 | //------------------------------------------------- | |
| 46 | ||
| 47 | printer_interface_device::printer_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 48 | device_t(mconfig, PRINTER_INTERFACE, "Laser/VZ Printer Interface", tag, owner, clock, "printer", __FILE__), | |
| 49 | device_ioexp_interface(mconfig, *this), | |
| 50 | m_centronics(*this, "centronics"), | |
| 51 | m_latch(*this, "latch"), | |
| 52 | m_centronics_busy(0) | |
| 53 | { | |
| 54 | } | |
| 55 | ||
| 56 | //------------------------------------------------- | |
| 57 | // device_start - device-specific startup | |
| 58 | //------------------------------------------------- | |
| 59 | ||
| 60 | void printer_interface_device::device_start() | |
| 61 | { | |
| 62 | } | |
| 63 | ||
| 64 | //------------------------------------------------- | |
| 65 | // device_reset - device-specific reset | |
| 66 | //------------------------------------------------- | |
| 67 | ||
| 68 | void printer_interface_device::device_reset() | |
| 69 | { | |
| 70 | m_slot->m_io->install_read_handler(0x00, 0x00, read8_delegate(FUNC(printer_interface_device::busy_r), this)); | |
| 71 | m_slot->m_io->install_write_handler(0x0d, 0x0d, write8_delegate(FUNC(printer_interface_device::strobe_w), this)); | |
| 72 | m_slot->m_io->install_write_handler(0x0e, 0x0e, write8_delegate(FUNC(output_latch_device::write), m_latch.target())); | |
| 73 | } | |
| 74 | ||
| 75 | ||
| 76 | //************************************************************************** | |
| 77 | // IMPLEMENTATION | |
| 78 | //************************************************************************** | |
| 79 | ||
| 80 | WRITE_LINE_MEMBER( printer_interface_device::busy_w ) | |
| 81 | { | |
| 82 | m_centronics_busy = state; | |
| 83 | } | |
| 84 | ||
| 85 | READ8_MEMBER( printer_interface_device::busy_r ) | |
| 86 | { | |
| 87 | return 0xfe | m_centronics_busy; | |
| 88 | } | |
| 89 | ||
| 90 | WRITE8_MEMBER( printer_interface_device::strobe_w ) | |
| 91 | { | |
| 92 | m_centronics->write_strobe(1); | |
| 93 | m_centronics->write_strobe(0); | |
| 94 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ I/O Expansion Slot | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | 30-pin slot | |
| 9 | ||
| 10 | ***************************************************************************/ | |
| 11 | ||
| 12 | #include "ioexp.h" | |
| 13 | ||
| 14 | ||
| 15 | //************************************************************************** | |
| 16 | // DEVICE DEFINITIONS | |
| 17 | //************************************************************************** | |
| 18 | ||
| 19 | const device_type IOEXP_SLOT = &device_creator<ioexp_slot_device>; | |
| 20 | ||
| 21 | ||
| 22 | //************************************************************************** | |
| 23 | // SLOT DEVICE | |
| 24 | //************************************************************************** | |
| 25 | ||
| 26 | //------------------------------------------------- | |
| 27 | // ioexp_slot_device - constructor | |
| 28 | //------------------------------------------------- | |
| 29 | ||
| 30 | ioexp_slot_device::ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 31 | device_t(mconfig, IOEXP_SLOT, "Peripheral Expansion Slot", tag, owner, clock, "ioexp_slot", __FILE__), | |
| 32 | device_slot_interface(mconfig, *this), | |
| 33 | m_io(NULL), | |
| 34 | m_cart(NULL) | |
| 35 | { | |
| 36 | } | |
| 37 | ||
| 38 | //------------------------------------------------- | |
| 39 | // ioexp_slot_device - destructor | |
| 40 | //------------------------------------------------- | |
| 41 | ||
| 42 | ioexp_slot_device::~ioexp_slot_device() | |
| 43 | { | |
| 44 | } | |
| 45 | ||
| 46 | //------------------------------------------------- | |
| 47 | // device_start - device-specific startup | |
| 48 | //------------------------------------------------- | |
| 49 | ||
| 50 | void ioexp_slot_device::device_start() | |
| 51 | { | |
| 52 | } | |
| 53 | ||
| 54 | //------------------------------------------------- | |
| 55 | // device_reset - device-specific reset | |
| 56 | //------------------------------------------------- | |
| 57 | ||
| 58 | void ioexp_slot_device::device_reset() | |
| 59 | { | |
| 60 | } | |
| 61 | ||
| 62 | //------------------------------------------------- | |
| 63 | // set_io_space - set address space we are attached to | |
| 64 | //------------------------------------------------- | |
| 65 | ||
| 66 | void ioexp_slot_device::set_io_space(address_space *io) | |
| 67 | { | |
| 68 | m_io = io; | |
| 69 | } | |
| 70 | ||
| 71 | ||
| 72 | //************************************************************************** | |
| 73 | // CARTRIDGE INTERFACE | |
| 74 | //************************************************************************** | |
| 75 | ||
| 76 | //------------------------------------------------- | |
| 77 | // device_ioexp_interface - constructor | |
| 78 | //------------------------------------------------- | |
| 79 | ||
| 80 | device_ioexp_interface::device_ioexp_interface(const machine_config &mconfig, device_t &device) : | |
| 81 | device_slot_card_interface(mconfig, device) | |
| 82 | { | |
| 83 | m_slot = dynamic_cast<ioexp_slot_device *>(device.owner()); | |
| 84 | } | |
| 85 | ||
| 86 | //------------------------------------------------- | |
| 87 | // ~device_ioexp_interface - destructor | |
| 88 | //------------------------------------------------- | |
| 89 | ||
| 90 | device_ioexp_interface::~device_ioexp_interface() | |
| 91 | { | |
| 92 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser Joystick Interface | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | VTech Laser JS 20 | |
| 9 | Dick Smith Electronics X-7315 | |
| 10 | ||
| 11 | ***************************************************************************/ | |
| 12 | ||
| 13 | #pragma once | |
| 14 | ||
| 15 | #ifndef __VTECH_IOEXP_JOYSTICK_H__ | |
| 16 | #define __VTECH_IOEXP_JOYSTICK_H__ | |
| 17 | ||
| 18 | #include "emu.h" | |
| 19 | #include "ioexp.h" | |
| 20 | ||
| 21 | ||
| 22 | //************************************************************************** | |
| 23 | // TYPE DEFINITIONS | |
| 24 | //************************************************************************** | |
| 25 | ||
| 26 | // ======================> joystick_interface_device | |
| 27 | ||
| 28 | class joystick_interface_device : public device_t, public device_ioexp_interface | |
| 29 | { | |
| 30 | public: | |
| 31 | // construction/destruction | |
| 32 | joystick_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 33 | ||
| 34 | DECLARE_READ8_MEMBER( joystick_r ); | |
| 35 | ||
| 36 | protected: | |
| 37 | virtual ioport_constructor device_input_ports() const; | |
| 38 | virtual void device_start(); | |
| 39 | virtual void device_reset(); | |
| 40 | ||
| 41 | private: | |
| 42 | required_ioport m_joy0; | |
| 43 | required_ioport m_joy0_arm; | |
| 44 | required_ioport m_joy1; | |
| 45 | required_ioport m_joy1_arm; | |
| 46 | }; | |
| 47 | ||
| 48 | // device type definition | |
| 49 | extern const device_type JOYSTICK_INTERFACE; | |
| 50 | ||
| 51 | #endif // __VTECH_IOEXP_JOYSTICK_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ Printer Interface | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | Dick Smith Electronics X-7320 | |
| 9 | ||
| 10 | ***************************************************************************/ | |
| 11 | ||
| 12 | #pragma once | |
| 13 | ||
| 14 | #ifndef __VTECH_IOEXP_PRINTER_H__ | |
| 15 | #define __VTECH_IOEXP_PRINTER_H__ | |
| 16 | ||
| 17 | #include "emu.h" | |
| 18 | #include "ioexp.h" | |
| 19 | #include "bus/centronics/ctronics.h" | |
| 20 | ||
| 21 | ||
| 22 | //************************************************************************** | |
| 23 | // TYPE DEFINITIONS | |
| 24 | //************************************************************************** | |
| 25 | ||
| 26 | // ======================> printer_interface_device | |
| 27 | ||
| 28 | class printer_interface_device : public device_t, public device_ioexp_interface | |
| 29 | { | |
| 30 | public: | |
| 31 | // construction/destruction | |
| 32 | printer_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 33 | ||
| 34 | DECLARE_WRITE_LINE_MEMBER( busy_w ); | |
| 35 | DECLARE_READ8_MEMBER( busy_r ); | |
| 36 | DECLARE_WRITE8_MEMBER( strobe_w ); | |
| 37 | ||
| 38 | protected: | |
| 39 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 40 | virtual void device_start(); | |
| 41 | virtual void device_reset(); | |
| 42 | ||
| 43 | private: | |
| 44 | required_device<centronics_device> m_centronics; | |
| 45 | required_device<output_latch_device> m_latch; | |
| 46 | ||
| 47 | int m_centronics_busy; | |
| 48 | }; | |
| 49 | ||
| 50 | // device type definition | |
| 51 | extern const device_type PRINTER_INTERFACE; | |
| 52 | ||
| 53 | #endif // __VTECH_IOEXP_PRINTER_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ I/O Expansion Slot | |
| 4 | ||
| 5 | license: MAME, GPL-2.0+ | |
| 6 | copyright-holders: Dirk Best | |
| 7 | ||
| 8 | 30-pin slot | |
| 9 | ||
| 10 | 15 GND 16 NC | |
| 11 | 14 /WR 17 NC | |
| 12 | 13 A3 18 NC | |
| 13 | 12 A6 19 +5VDC | |
| 14 | 11 A2 20 NC | |
| 15 | 10 A5 21 D4 | |
| 16 | 9 D0 22 D5 | |
| 17 | 8 D2 23 D7 | |
| 18 | 7 D6 24 D1 | |
| 19 | 6 D3 25 /RD | |
| 20 | 5 /IORQ 26 A1 | |
| 21 | 4 +5VDC 27 A4 | |
| 22 | 3 NC 28 A0 | |
| 23 | 2 NC 29 A7 | |
| 24 | 1 NC 30 NC | |
| 25 | ||
| 26 | ***************************************************************************/ | |
| 27 | ||
| 28 | #pragma once | |
| 29 | ||
| 30 | #ifndef __VTECH_IOEXP_H__ | |
| 31 | #define __VTECH_IOEXP_H__ | |
| 32 | ||
| 33 | #include "emu.h" | |
| 34 | ||
| 35 | ||
| 36 | //************************************************************************** | |
| 37 | // INTERFACE CONFIGURATION MACROS | |
| 38 | //************************************************************************** | |
| 39 | ||
| 40 | #define MCFG_IOEXP_SLOT_ADD(_tag) \ | |
| 41 | MCFG_DEVICE_ADD(_tag, IOEXP_SLOT, 0) \ | |
| 42 | MCFG_DEVICE_SLOT_INTERFACE(ioexp_slot_carts, NULL, false) | |
| 43 | ||
| 44 | ||
| 45 | //************************************************************************** | |
| 46 | // TYPE DEFINITIONS | |
| 47 | //************************************************************************** | |
| 48 | ||
| 49 | class device_ioexp_interface; | |
| 50 | ||
| 51 | class ioexp_slot_device : public device_t, public device_slot_interface | |
| 52 | { | |
| 53 | public: | |
| 54 | // construction/destruction | |
| 55 | ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 56 | virtual ~ioexp_slot_device(); | |
| 57 | ||
| 58 | void set_io_space(address_space *io); | |
| 59 | ||
| 60 | address_space *m_io; | |
| 61 | ||
| 62 | protected: | |
| 63 | // device-level overrides | |
| 64 | virtual void device_start(); | |
| 65 | virtual void device_reset(); | |
| 66 | ||
| 67 | device_ioexp_interface *m_cart; | |
| 68 | }; | |
| 69 | ||
| 70 | // class representing interface-specific live ioexp device | |
| 71 | class device_ioexp_interface : public device_slot_card_interface | |
| 72 | { | |
| 73 | public: | |
| 74 | // construction/destruction | |
| 75 | device_ioexp_interface(const machine_config &mconfig, device_t &device); | |
| 76 | virtual ~device_ioexp_interface(); | |
| 77 | ||
| 78 | protected: | |
| 79 | ioexp_slot_device *m_slot; | |
| 80 | }; | |
| 81 | ||
| 82 | // device type definition | |
| 83 | extern const device_type IOEXP_SLOT; | |
| 84 | ||
| 85 | // include here so drivers don't need to | |
| 86 | #include "carts.h" | |
| 87 | ||
| 88 | #endif // __VTECH_IOEXP_H__ |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | VTech Laser/VZ I/O Expansion Slot Devices | |
| 4 | ||
| 5 | ***************************************************************************/ | |
| 6 | ||
| 7 | #include "carts.h" | |
| 8 | ||
| 9 | SLOT_INTERFACE_START( ioexp_slot_carts ) | |
| 10 | SLOT_INTERFACE("joystick", JOYSTICK_INTERFACE) | |
| 11 | SLOT_INTERFACE("printer", PRINTER_INTERFACE) | |
| 12 | SLOT_INTERFACE_END |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r30874 | r30875 | |
|---|---|---|
| 1165 | 1165 | BUSOBJS += $(BUSOBJ)/ql/miracle_hd.o |
| 1166 | 1166 | BUSOBJS += $(BUSOBJ)/ql/std.o |
| 1167 | 1167 | endif |
| 1168 | ||
| 1169 | #------------------------------------------------- | |
| 1170 | # | |
| 1171 | #@src/emu/bus/vtech/memexp/memexp.h,BUSES += VTECH_MEMEXP | |
| 1172 | #------------------------------------------------- | |
| 1173 | ||
| 1174 | ifneq ($(filter VTECH_MEMEXP,$(BUSES)),) | |
| 1175 | OBJDIRS += $(BUSOBJ)/vtech/memexp | |
| 1176 | BUSOBJS += $(BUSOBJ)/vtech/memexp/memexp.o | |
| 1177 | BUSOBJS += $(BUSOBJ)/vtech/memexp/carts.o | |
| 1178 | BUSOBJS += $(BUSOBJ)/vtech/memexp/floppy.o | |
| 1179 | BUSOBJS += $(BUSOBJ)/vtech/memexp/memory.o | |
| 1180 | BUSOBJS += $(BUSOBJ)/vtech/memexp/rs232.o | |
| 1181 | BUSOBJS += $(BUSOBJ)/vtech/memexp/wordpro.o | |
| 1182 | endif | |
| 1183 | ||
| 1184 | #------------------------------------------------- | |
| 1185 | # | |
| 1186 | #@src/emu/bus/vtech/ioexp/ioexp.h,BUSES += VTECH_IOEXP | |
| 1187 | #------------------------------------------------- | |
| 1188 | ||
| 1189 | ifneq ($(filter VTECH_IOEXP,$(BUSES)),) | |
| 1190 | OBJDIRS += $(BUSOBJ)/vtech/ioexp | |
| 1191 | BUSOBJS += $(BUSOBJ)/vtech/ioexp/ioexp.o | |
| 1192 | BUSOBJS += $(BUSOBJ)/vtech/ioexp/carts.o | |
| 1193 | BUSOBJS += $(BUSOBJ)/vtech/ioexp/joystick.o | |
| 1194 | BUSOBJS += $(BUSOBJ)/vtech/ioexp/printer.o | |
| 1195 | endif |
| r30874 | r30875 | |
|---|---|---|
| 28 | 28 | vtech1_dsk_identify, |
| 29 | 29 | vtech1_dsk_construct, |
| 30 | 30 | NULL, |
| 31 | NULL | |
| 31 | HEADS([1]) | |
| 32 | TRACKS([40]) | |
| 33 | SECTORS([16]) | |
| 34 | SECTOR_LENGTH([154]) | |
| 35 | FIRST_SECTOR_ID([0]) | |
| 32 | 36 | ) |
| 33 | 37 | LEGACY_FLOPPY_OPTIONS_END0 |
| r30874 | r30875 | |
|---|---|---|
| 1211 | 1211 | vz2000 |
| 1212 | 1212 | crvisio2 |
| 1213 | 1213 | manager |
| 1214 | ||
| 1215 | // Video Technology Laser Generation 1 machines | |
| 1214 | 1216 | laser110 // 1983 Laser 110 |
| 1215 | las110de // 1983 Sanyo Laser 110 (Germany) | |
| 1216 | laser200 // 1983 Laser 200 (color version of 110) | |
| 1217 | // vz200de // 1983 VZ-200 (Germany) | |
| 1218 | fellow // 1983 Salora Fellow (Finland) | |
| 1219 | tx8000 // 1983 Texet TX-8000 (U.K.) | |
| 1220 | laser210 // 1984 Laser 210 (200 with more memory) | |
| 1221 | las210de // 1984 Sanyo Laser 210 (Germany) | |
| 1222 | vz200 // 1984 Dick Smith Electronics VZ-200 | |
| 1223 | laser310 // 1984 Laser 310 (210 with diff. keyboard and RAM) | |
| 1217 | laser200 // 1983 Laser 200 | |
| 1218 | vz200de // 1983 VZ-200 (Germany) | |
| 1219 | fellow // 1983 Salora Fellow | |
| 1220 | tx8000 // 1983 Texet TX-8000 | |
| 1221 | laser210 // 1984 Laser 210 | |
| 1222 | vz200 // 1984 Dick Smith Electronics VZ-200 | |
| 1223 | laser310 // 1984 Laser 310 | |
| 1224 | 1224 | laser310h // 1984 Laser 310 with SHRG mod |
| 1225 | vz300 // 1984 Dick Smith Electronics VZ-300 | |
| 1225 | vz300 // 1984 Dick Smith Electronics VZ-300 | |
| 1226 | ||
| 1227 | // Video Technology Laser Generation 2 machines | |
| 1226 | 1228 | laser350 // 1984? Laser 350 |
| 1227 | 1229 | laser500 // 1984? Laser 500 |
| 1228 | 1230 | laser700 // 1984? Laser 700 |
| 1231 | ||
| 1229 | 1232 | socrates // 1988 Socrates Educational Video System (USA) |
| 1230 | 1233 | socratfc // 1988 Socrates SAITOUT (French Canada) |
| 1231 | profweis // 1988 (Yeno) Prof | |
| 1234 | profweis // 1988 (Yeno) Professor Weiss-Alles (Germany) | |
| 1232 | 1235 | gl8008cx // 1999 Genius Leader 8008 CX (Germany) |
| 1233 | 1236 | bs9009cx // 1999 BrainStation 9009 CXL (Germany) |
| 1234 | 1237 | iq128_fr // 1997 Genius PC (France) |
| r30874 | r30875 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 1 | /*************************************************************************** | |
| 2 | 2 | |
| 3 | 3 | Video Technology Laser 110 |
| 4 | Sanyo Laser 110 | |
| 5 | 4 | Video Technology Laser 200 |
| 6 | 5 | Salora Fellow |
| 7 | Texet TX-8000 | |
| 6 | Texet TX-8000 (?) | |
| 8 | 7 | Video Technology VZ-200 |
| 9 | 8 | Video Technology Laser 210 |
| 10 | 9 | Dick Smith Electronics VZ-200 |
| 11 | Sanyo Laser 210 | |
| 12 | 10 | Video Technology Laser 310 |
| 13 | 11 | Dick Smith Electronics VZ-300 |
| 14 | 12 | |
| r30874 | r30875 | |
| 24 | 22 | - Davide Moretti for the detailed description of the colors |
| 25 | 23 | - Leslie Milburn |
| 26 | 24 | |
| 27 | Memory maps: | |
| 28 | ||
| 29 | Laser 110/200 | |
| 30 | 0000-1FFF 8K ROM 0 | |
| 31 | 2000-3FFF 8K ROM 1 | |
| 32 | 4000-5FFF 8K DOS ROM or other cartridges (optional) | |
| 33 | 6000-67FF 2K reserved for rom cartridges | |
| 34 | 6800-6FFF 2K memory mapped I/O | |
| 35 | R: keyboard | |
| 36 | W: cassette I/O, speaker, VDP control | |
| 37 | 7000-77FF 2K video RAM | |
| 38 | 7800-7FFF 2K internal user RAM | |
| 39 | 8800-C7FF 16K memory expansion | |
| 40 | 8000-BFFF 64K memory expansion, first bank | |
| 41 | C000-FFFF 64K memory expansion, other banks | |
| 42 | ||
| 43 | Laser 210 | |
| 44 | 0000-1FFF 8K ROM 0 | |
| 45 | 2000-3FFF 8K ROM 1 | |
| 46 | 4000-5FFF 8K DOS ROM or other cartridges (optional) | |
| 47 | 6000-67FF 2K reserved for rom cartridges | |
| 48 | 6800-6FFF 2K memory mapped I/O | |
| 49 | R: keyboard | |
| 50 | W: cassette I/O, speaker, VDP control | |
| 51 | 7000-77FF 2K video RAM | |
| 52 | 7800-8FFF 6K internal user RAM (3x2K: U2, U3, U4) | |
| 53 | 9000-CFFF 16K memory expansion | |
| 54 | 8000-BFFF 64K memory expansion, first bank | |
| 55 | C000-FFFF 64K memory expansion, other banks | |
| 56 | ||
| 57 | Laser 310 | |
| 58 | 0000-3FFF 16K ROM | |
| 59 | 4000-5FFF 8K DOS ROM or other cartridges (optional) | |
| 60 | 6000-67FF 2K reserved for rom cartridges | |
| 61 | 6800-6FFF 2K memory mapped I/O | |
| 62 | R: keyboard | |
| 63 | W: cassette I/O, speaker, VDP control | |
| 64 | 7000-77FF 2K video RAM | |
| 65 | 7800-B7FF 16K internal user RAM | |
| 66 | B800-F7FF 16K memory expansion | |
| 67 | 8000-BFFF 64K memory expansion, first bank | |
| 68 | C000-FFFF 64K memory expansion, other banks | |
| 69 | ||
| 70 | ||
| 71 | Memory expansions available for the Laser/VZ computers: | |
| 72 | ||
| 73 | - a 16kb expansion without banking | |
| 74 | - a 64kb expansion where the first bank is fixed and the other 3 are | |
| 75 | banked in as needed | |
| 76 | - a banked memory expansion similar to the 64kb one, that the user could | |
| 77 | fill themselves with memory up to 4MB total. | |
| 78 | ||
| 79 | They are externally connected devices. The 16kb extension is different | |
| 80 | between Laser 110/210/310 computers, though it could be relativly | |
| 81 | easily modified to work on another model. | |
| 82 | ||
| 83 | ||
| 84 | 25 | Todo: |
| 85 | 26 | |
| 86 | 27 | - Figure out which machines were shipped with which ROM version |
| 87 | 28 | where not known (currently only a guess) |
| 88 | 29 | - Lightpen support |
| 89 | - Rewrite floppy and move to its own file | |
| 90 | - Add support for the wordprocessor cartridge | |
| 30 | - Rewrite floppy | |
| 91 | 31 | |
| 92 | ||
| 32 | ***************************************************************************/ | |
| 93 | 33 | |
| 94 | - DOS ROM: CRC(b6ed6084) SHA1(59d1cbcfa6c5e1906a32704fbf0d9670f0d1fd8b) | |
| 95 | ||
| 96 | ||
| 97 | ******************************************************************************/ | |
| 98 | ||
| 99 | 34 | #include "emu.h" |
| 100 | 35 | #include "formats/imageutl.h" |
| 101 | 36 | #include "cpu/z80/z80.h" |
| 102 | 37 | #include "video/mc6847.h" |
| 103 | #include "bus/centronics/ctronics.h" | |
| 38 | #include "bus/vtech/ioexp/ioexp.h" | |
| 39 | #include "bus/vtech/memexp/memexp.h" | |
| 104 | 40 | #include "sound/wave.h" |
| 105 | 41 | #include "sound/speaker.h" |
| 106 | #include "imagedev/cartslot.h" | |
| 107 | #include "imagedev/flopdrv.h" | |
| 108 | 42 | #include "imagedev/snapquik.h" |
| 109 | 43 | #include "imagedev/cassette.h" |
| 110 | #include "machine/ram.h" | |
| 111 | 44 | #include "formats/vt_cas.h" |
| 112 | #include "formats/vtech1_dsk.h" | |
| 113 | 45 | |
| 46 | ||
| 114 | 47 | /*************************************************************************** |
| 115 | 48 | CONSTANTS & MACROS |
| 116 | 49 | ***************************************************************************/ |
| 117 | 50 | |
| 118 | 51 | #define LOG_VTECH1_LATCH 0 |
| 119 | #define LOG_VTECH1_FDC 0 | |
| 120 | 52 | |
| 121 | 53 | #define VTECH1_CLK 3579500 |
| 122 | 54 | #define VZ300_XTAL1_CLK XTAL_17_73447MHz |
| 123 | 55 | |
| 124 | #define VZ_BASIC 0xf0 | |
| 125 | #define VZ_MCODE 0xf1 | |
| 126 | 56 | |
| 127 | #define TRKSIZE_VZ 0x9a0 /* arbitrary (actually from analyzing format) */ | |
| 128 | #define TRKSIZE_FM 3172 /* size of a standard FM mode track */ | |
| 129 | ||
| 130 | #define PHI0(n) (((n)>>0)&1) | |
| 131 | #define PHI1(n) (((n)>>1)&1) | |
| 132 | #define PHI2(n) (((n)>>2)&1) | |
| 133 | #define PHI3(n) (((n)>>3)&1) | |
| 134 | ||
| 135 | ||
| 136 | 57 | /*************************************************************************** |
| 137 | 58 | TYPE DEFINITIONS |
| 138 | 59 | ***************************************************************************/ |
| r30874 | r30875 | |
| 140 | 61 | class vtech1_state : public driver_device |
| 141 | 62 | { |
| 142 | 63 | public: |
| 143 | vtech1_state(const machine_config &mconfig, device_type type, const char *tag) | |
| 144 | : driver_device(mconfig, type, tag), | |
| 64 | vtech1_state(const machine_config &mconfig, device_type type, const char *tag) : | |
| 65 | driver_device(mconfig, type, tag), | |
| 66 | m_videoram(*this, "videoram"), | |
| 67 | m_maincpu(*this, "maincpu"), | |
| 145 | 68 | m_mc6847(*this, "mc6847"), |
| 146 | 69 | m_speaker(*this, "speaker"), |
| 147 | 70 | m_cassette(*this, "cassette"), |
| 148 | m_videoram(*this, "videoram"), | |
| 149 | m_maincpu(*this, "maincpu"), | |
| 150 | m_ram(*this, RAM_TAG), | |
| 151 | m_centronics(*this, "centronics") | |
| 71 | m_ioexp(*this, "io"), | |
| 72 | m_memexp(*this, "mem") | |
| 152 | 73 | { |
| 153 | 74 | } |
| 154 | 75 | |
| 155 | /* devices */ | |
| 156 | required_device<mc6847_base_device> m_mc6847; | |
| 157 | optional_device<speaker_sound_device> m_speaker; | |
| 158 | optional_device<cassette_image_device> m_cassette; | |
| 76 | DECLARE_DRIVER_INIT(vtech1); | |
| 77 | DECLARE_DRIVER_INIT(vtech1h); | |
| 159 | 78 | |
| 160 | UINT8 *m_ram_pointer; | |
| 161 | UINT32 m_ram_size; | |
| 162 | required_shared_ptr<UINT8> m_videoram; | |
| 163 | ||
| 164 | /* floppy */ | |
| 165 | int m_drive; | |
| 166 | UINT8 m_fdc_track_x2[2]; | |
| 167 | UINT8 m_fdc_wrprot[2]; | |
| 168 | UINT8 m_fdc_status; | |
| 169 | UINT8 m_fdc_data[TRKSIZE_FM]; | |
| 170 | int m_data; | |
| 171 | int m_fdc_edge; | |
| 172 | int m_fdc_bits; | |
| 173 | int m_fdc_start; | |
| 174 | int m_fdc_write; | |
| 175 | int m_fdc_offs; | |
| 176 | int m_fdc_latch; | |
| 177 | int m_centronics_busy; | |
| 178 | DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); | |
| 179 | DECLARE_READ8_MEMBER(vtech1_fdc_r); | |
| 180 | DECLARE_WRITE8_MEMBER(vtech1_fdc_w); | |
| 181 | DECLARE_READ8_MEMBER(vtech1_serial_r); | |
| 182 | DECLARE_WRITE8_MEMBER(vtech1_serial_w); | |
| 183 | 79 | DECLARE_READ8_MEMBER(vtech1_lightpen_r); |
| 184 | DECLARE_READ8_MEMBER(vtech1_joystick_r); | |
| 185 | 80 | DECLARE_READ8_MEMBER(vtech1_keyboard_r); |
| 186 | 81 | DECLARE_WRITE8_MEMBER(vtech1_latch_w); |
| 187 | ||
| 82 | ||
| 188 | 83 | DECLARE_WRITE8_MEMBER(vtech1_video_bank_w); |
| 189 | DECLARE_DRIVER_INIT(vtech1h); | |
| 190 | DECLARE_DRIVER_INIT(vtech1); | |
| 191 | DECLARE_READ8_MEMBER(vtech1_printer_r); | |
| 192 | DECLARE_WRITE8_MEMBER(vtech1_strobe_w); | |
| 193 | 84 | DECLARE_READ8_MEMBER(mc6847_videoram_r); |
| 85 | ||
| 194 | 86 | DECLARE_SNAPSHOT_LOAD_MEMBER( vtech1 ); |
| 195 | void vtech1_get_track(); | |
| 196 | void vtech1_put_track(); | |
| 87 | ||
| 88 | private: | |
| 89 | static const UINT8 VZ_BASIC = 0xf0; | |
| 90 | static const UINT8 VZ_MCODE = 0xf1; | |
| 91 | ||
| 92 | required_shared_ptr<UINT8> m_videoram; | |
| 93 | ||
| 197 | 94 | required_device<cpu_device> m_maincpu; |
| 198 | required_device<ram_device> m_ram; | |
| 199 | required_device<centronics_device> m_centronics; | |
| 95 | required_device<mc6847_base_device> m_mc6847; | |
| 96 | required_device<speaker_sound_device> m_speaker; | |
| 97 | required_device<cassette_image_device> m_cassette; | |
| 98 | required_device<ioexp_slot_device> m_ioexp; | |
| 99 | required_device<memexp_slot_device> m_memexp; | |
| 200 | 100 | }; |
| 201 | 101 | |
| 202 | 102 | |
| r30874 | r30875 | |
| 207 | 107 | SNAPSHOT_LOAD_MEMBER( vtech1_state, vtech1 ) |
| 208 | 108 | { |
| 209 | 109 | address_space &space = m_maincpu->space(AS_PROGRAM); |
| 210 | UINT8 i, header[24]; | |
| 211 | UINT16 start, end, size; | |
| 110 | UINT8 header[24]; | |
| 212 | 111 | char pgmname[18]; |
| 213 | 112 | |
| 214 | /* get the header */ | |
| 215 | image.fread( &header, sizeof(header)); | |
| 216 | for (i = 0; i < 16; i++) pgmname[i] = header[i+4]; | |
| 113 | // get the header | |
| 114 | image.fread(&header, sizeof(header)); | |
| 115 | ||
| 116 | // get image name | |
| 117 | for (int i = 0; i < 16; i++) | |
| 118 | pgmname[i] = header[i+4]; | |
| 217 | 119 | pgmname[16] = '\0'; |
| 218 | 120 | |
| 219 | /* get start and end addresses */ | |
| 220 | start = pick_integer_le(header, 22, 2); | |
| 221 | end = start + snapshot_size - sizeof(header); | |
| 222 | size = end - start; | |
| 121 | // get start and end addresses | |
| 122 | UINT16 start = pick_integer_le(header, 22, 2); | |
| 123 | UINT16 end = start + snapshot_size - sizeof(header); | |
| 124 | UINT16 size = end - start; | |
| 223 | 125 | |
| 224 | /* check if we have enough ram */ | |
| 225 | if (m_ram_size < size) | |
| 126 | // write it to ram | |
| 127 | UINT8 *ptr = (UINT8 *)image.ptr() + sizeof(header); | |
| 128 | ||
| 129 | for (UINT16 addr = start; addr <= end; addr++, ptr++) | |
| 226 | 130 | { |
| 227 | char message[256]; | |
| 228 | snprintf(message, ARRAY_LENGTH(message), "SNAPLOAD: %s\nInsufficient RAM - need %04X",pgmname,size); | |
| 229 | image.seterror(IMAGE_ERROR_INVALIDIMAGE, message); | |
| 230 | image.message("SNAPLOAD: %s\nInsufficient RAM - need %04X",pgmname,size); | |
| 231 | return IMAGE_INIT_FAIL; | |
| 232 | } | |
| 131 | UINT8 to_write = *ptr; | |
| 132 | space.write_byte(addr, to_write); | |
| 233 | 133 | |
| 234 | /* write it to ram */ | |
| 235 | image.fread( &m_ram_pointer[start - 0x7800], size); | |
| 134 | // verify | |
| 135 | if (space.read_byte(addr) != to_write) | |
| 136 | { | |
| 137 | image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Insufficient RAM to load snapshot"); | |
| 138 | image.message("Insufficient RAM to load snapshot (%d bytes needed) [%s]", size, pgmname); | |
| 236 | 139 | |
| 237 | /* patch variables depending on snapshot type */ | |
| 140 | return IMAGE_INIT_FAIL; | |
| 141 | } | |
| 142 | } | |
| 143 | ||
| 144 | // patch variables depending on snapshot type | |
| 238 | 145 | switch (header[21]) |
| 239 | 146 | { |
| 240 | case VZ_BASIC: | |
| 147 | case VZ_BASIC: | |
| 241 | 148 | space.write_byte(0x78a4, start % 256); /* start of basic program */ |
| 242 | 149 | space.write_byte(0x78a5, start / 256); |
| 243 | 150 | space.write_byte(0x78f9, end % 256); /* end of basic program */ |
| r30874 | r30875 | |
| 246 | 153 | space.write_byte(0x78fc, end / 256); |
| 247 | 154 | space.write_byte(0x78fd, end % 256); /* start free mem, end variable table */ |
| 248 | 155 | space.write_byte(0x78fe, end / 256); |
| 249 | image.message(" %s (B)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end); | |
| 156 | image.message(" %s (B)\nsize=%04X : start=%04X : end=%04X", pgmname, size, start, end); | |
| 250 | 157 | break; |
| 251 | 158 | |
| 252 | case VZ_MCODE: | |
| 159 | case VZ_MCODE: | |
| 253 | 160 | space.write_byte(0x788e, start % 256); /* usr subroutine address */ |
| 254 | 161 | space.write_byte(0x788f, start / 256); |
| 255 | image.message(" %s (M)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end); | |
| 162 | image.message(" %s (M)\nsize=%04X : start=%04X : end=%04X", pgmname, size, start, end); | |
| 256 | 163 | m_maincpu->set_pc(start); /* start program */ |
| 257 | 164 | break; |
| 258 | 165 | |
| r30874 | r30875 | |
| 267 | 174 | |
| 268 | 175 | |
| 269 | 176 | /*************************************************************************** |
| 270 | FLOPPY DRIVE | |
| 271 | ***************************************************************************/ | |
| 272 | static void vtech1_load_proc(device_image_interface &image) | |
| 273 | { | |
| 274 | vtech1_state *vtech1 = image.device().machine().driver_data<vtech1_state>(); | |
| 275 | int id = floppy_get_drive(&image.device()); | |
| 276 | ||
| 277 | if (!image.is_readonly()) | |
| 278 | vtech1->m_fdc_wrprot[id] = 0x00; | |
| 279 | else | |
| 280 | vtech1->m_fdc_wrprot[id] = 0x80; | |
| 281 | } | |
| 282 | ||
| 283 | void vtech1_state::vtech1_get_track() | |
| 284 | { | |
| 285 | device_image_interface *image = dynamic_cast<device_image_interface *>(floppy_get_device(machine(),m_drive)); | |
| 286 | ||
| 287 | /* drive selected or and image file ok? */ | |
| 288 | if (m_drive >= 0 && image->exists()) | |
| 289 | { | |
| 290 | int size, offs; | |
| 291 | size = TRKSIZE_VZ; | |
| 292 | offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; | |
| 293 | image->fseek(offs, SEEK_SET); | |
| 294 | // some disks have slightly larger header, make sure we capture the checksum at the end of the track | |
| 295 | size = image->fread(m_fdc_data, size+4); | |
| 296 | if (LOG_VTECH1_FDC) | |
| 297 | logerror("get track @$%05x $%04x bytes\n", offs, size); | |
| 298 | } | |
| 299 | m_fdc_offs = 0; | |
| 300 | m_fdc_write = 0; | |
| 301 | } | |
| 302 | ||
| 303 | void vtech1_state::vtech1_put_track() | |
| 304 | { | |
| 305 | /* drive selected and image file ok? */ | |
| 306 | if (m_drive >= 0 && floppy_get_device(machine(),m_drive) != NULL) | |
| 307 | { | |
| 308 | int size, offs; | |
| 309 | device_image_interface *image = dynamic_cast<device_image_interface *>(floppy_get_device(machine(),m_drive)); | |
| 310 | offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2; | |
| 311 | image->fseek(offs + m_fdc_start, SEEK_SET); | |
| 312 | size = image->fwrite(&m_fdc_data[m_fdc_start], m_fdc_write); | |
| 313 | if (LOG_VTECH1_FDC) | |
| 314 | logerror("put track @$%05X+$%X $%04X/$%04X bytes\n", offs, m_fdc_start, size, m_fdc_write); | |
| 315 | } | |
| 316 | } | |
| 317 | ||
| 318 | READ8_MEMBER(vtech1_state::vtech1_fdc_r) | |
| 319 | { | |
| 320 | int data = 0xff; | |
| 321 | ||
| 322 | switch (offset) | |
| 323 | { | |
| 324 | case 1: /* data (read-only) */ | |
| 325 | if (m_fdc_bits > 0) | |
| 326 | { | |
| 327 | if( m_fdc_status & 0x80 ) | |
| 328 | m_fdc_bits--; | |
| 329 | data = (m_data >> m_fdc_bits) & 0xff; | |
| 330 | if (LOG_VTECH1_FDC) { | |
| 331 | logerror("vtech1_fdc_r bits %d%d%d%d%d%d%d%d\n", | |
| 332 | (data>>7)&1,(data>>6)&1,(data>>5)&1,(data>>4)&1, | |
| 333 | (data>>3)&1,(data>>2)&1,(data>>1)&1,(data>>0)&1 ); | |
| 334 | } | |
| 335 | } | |
| 336 | if (m_fdc_bits == 0) | |
| 337 | { | |
| 338 | m_data = m_fdc_data[m_fdc_offs]; | |
| 339 | if (LOG_VTECH1_FDC) | |
| 340 | logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, m_fdc_offs, m_data); | |
| 341 | if(m_fdc_status & 0x80) | |
| 342 | { | |
| 343 | m_fdc_bits = 8; | |
| 344 | m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; | |
| 345 | } | |
| 346 | m_fdc_status &= ~0x80; | |
| 347 | } | |
| 348 | break; | |
| 349 | case 2: /* polling (read-only) */ | |
| 350 | /* fake */ | |
| 351 | if (m_drive >= 0) | |
| 352 | m_fdc_status |= 0x80; | |
| 353 | data = m_fdc_status; | |
| 354 | break; | |
| 355 | case 3: /* write protect status (read-only) */ | |
| 356 | if (m_drive >= 0) | |
| 357 | data = m_fdc_wrprot[m_drive]; | |
| 358 | if (LOG_VTECH1_FDC) | |
| 359 | logerror("vtech1_fdc_r %d : write_protect $%02X\n", offset, data); | |
| 360 | break; | |
| 361 | } | |
| 362 | return data; | |
| 363 | } | |
| 364 | ||
| 365 | WRITE8_MEMBER(vtech1_state::vtech1_fdc_w) | |
| 366 | { | |
| 367 | int drive; | |
| 368 | ||
| 369 | switch (offset) | |
| 370 | { | |
| 371 | case 0: /* latch (write-only) */ | |
| 372 | drive = (data & 0x10) ? 0 : (data & 0x80) ? 1 : -1; | |
| 373 | if (drive != m_drive) | |
| 374 | { | |
| 375 | m_drive = drive; | |
| 376 | if (m_drive >= 0) | |
| 377 | vtech1_get_track(); | |
| 378 | } | |
| 379 | if (m_drive >= 0) | |
| 380 | { | |
| 381 | if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(m_fdc_latch)) || | |
| 382 | (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(m_fdc_latch)) || | |
| 383 | (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(m_fdc_latch)) || | |
| 384 | (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(m_fdc_latch))) | |
| 385 | { | |
| 386 | if (m_fdc_track_x2[m_drive] > 0) | |
| 387 | m_fdc_track_x2[m_drive]--; | |
| 388 | if (LOG_VTECH1_FDC) | |
| 389 | 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)); | |
| 390 | if ((m_fdc_track_x2[m_drive] & 1) == 0) | |
| 391 | vtech1_get_track(); | |
| 392 | } | |
| 393 | else | |
| 394 | if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(m_fdc_latch)) || | |
| 395 | (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(m_fdc_latch)) || | |
| 396 | (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(m_fdc_latch)) || | |
| 397 | (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(m_fdc_latch))) | |
| 398 | { | |
| 399 | if (m_fdc_track_x2[m_drive] < 2*40) | |
| 400 | m_fdc_track_x2[m_drive]++; | |
| 401 | if (LOG_VTECH1_FDC) | |
| 402 | 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)); | |
| 403 | if ((m_fdc_track_x2[m_drive] & 1) == 0) | |
| 404 | vtech1_get_track(); | |
| 405 | } | |
| 406 | if ((data & 0x40) == 0) | |
| 407 | { | |
| 408 | m_data <<= 1; | |
| 409 | if ((m_fdc_latch ^ data) & 0x20) | |
| 410 | m_data |= 1; | |
| 411 | if ((m_fdc_edge ^= 1) == 0) | |
| 412 | { | |
| 413 | m_fdc_bits--; | |
| 414 | ||
| 415 | if (m_fdc_bits == 0) | |
| 416 | { | |
| 417 | UINT8 value = 0; | |
| 418 | m_data &= 0xffff; | |
| 419 | if (m_data & 0x4000 ) value |= 0x80; | |
| 420 | if (m_data & 0x1000 ) value |= 0x40; | |
| 421 | if (m_data & 0x0400 ) value |= 0x20; | |
| 422 | if (m_data & 0x0100 ) value |= 0x10; | |
| 423 | if (m_data & 0x0040 ) value |= 0x08; | |
| 424 | if (m_data & 0x0010 ) value |= 0x04; | |
| 425 | if (m_data & 0x0004 ) value |= 0x02; | |
| 426 | if (m_data & 0x0001 ) value |= 0x01; | |
| 427 | if (LOG_VTECH1_FDC) | |
| 428 | logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, m_fdc_offs, m_fdc_data[m_fdc_offs], value, m_data); | |
| 429 | m_fdc_data[m_fdc_offs] = value; | |
| 430 | m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM; | |
| 431 | m_fdc_write++; | |
| 432 | m_fdc_bits = 8; | |
| 433 | } | |
| 434 | } | |
| 435 | } | |
| 436 | /* change of write signal? */ | |
| 437 | if ((m_fdc_latch ^ data) & 0x40) | |
| 438 | { | |
| 439 | /* falling edge? */ | |
| 440 | if (m_fdc_latch & 0x40) | |
| 441 | { | |
| 442 | m_fdc_start = m_fdc_offs; | |
| 443 | m_fdc_edge = 0; | |
| 444 | } | |
| 445 | else | |
| 446 | { | |
| 447 | /* data written to track before? */ | |
| 448 | if (m_fdc_write) | |
| 449 | vtech1_put_track(); | |
| 450 | } | |
| 451 | m_fdc_bits = 8; | |
| 452 | m_fdc_write = 0; | |
| 453 | } | |
| 454 | } | |
| 455 | m_fdc_latch = data; | |
| 456 | break; | |
| 457 | } | |
| 458 | } | |
| 459 | ||
| 460 | static const floppy_interface vtech1_floppy_interface = | |
| 461 | { | |
| 462 | FLOPPY_STANDARD_5_25_DSHD, | |
| 463 | LEGACY_FLOPPY_OPTIONS_NAME(vtech1_only), | |
| 464 | NULL | |
| 465 | }; | |
| 466 | ||
| 467 | /*************************************************************************** | |
| 468 | PRINTER | |
| 469 | ***************************************************************************/ | |
| 470 | ||
| 471 | WRITE_LINE_MEMBER(vtech1_state::write_centronics_busy) | |
| 472 | { | |
| 473 | m_centronics_busy = state; | |
| 474 | } | |
| 475 | ||
| 476 | READ8_MEMBER(vtech1_state::vtech1_printer_r) | |
| 477 | { | |
| 478 | return 0xfe | m_centronics_busy; | |
| 479 | } | |
| 480 | ||
| 481 | /* TODO: figure out how this really works */ | |
| 482 | WRITE8_MEMBER(vtech1_state::vtech1_strobe_w) | |
| 483 | { | |
| 484 | m_centronics->write_strobe(TRUE); | |
| 485 | m_centronics->write_strobe(FALSE); | |
| 486 | } | |
| 487 | ||
| 488 | ||
| 489 | /*************************************************************************** | |
| 490 | RS232 SERIAL | |
| 491 | ***************************************************************************/ | |
| 492 | ||
| 493 | READ8_MEMBER(vtech1_state::vtech1_serial_r) | |
| 494 | { | |
| 495 | logerror("vtech1_serial_r offset $%02x\n", offset); | |
| 496 | return 0xff; | |
| 497 | } | |
| 498 | ||
| 499 | WRITE8_MEMBER(vtech1_state::vtech1_serial_w) | |
| 500 | { | |
| 501 | logerror("vtech1_serial_w $%02x, offset %02x\n", data, offset); | |
| 502 | } | |
| 503 | ||
| 504 | ||
| 505 | /*************************************************************************** | |
| 506 | 177 | INPUTS |
| 507 | 178 | ***************************************************************************/ |
| 508 | 179 | |
| 509 | READ8_MEMBER(vtech1_state::vtech1_lightpen_r) | |
| 180 | READ8_MEMBER( vtech1_state::vtech1_lightpen_r ) | |
| 510 | 181 | { |
| 511 | 182 | logerror("vtech1_lightpen_r(%d)\n", offset); |
| 512 | 183 | return 0xff; |
| 513 | 184 | } |
| 514 | 185 | |
| 515 | READ8_MEMBER(vtech1_state::vtech1_ | |
| 186 | READ8_MEMBER( vtech1_state::vtech1_keyboard_r ) | |
| 516 | 187 | { |
| 517 | int result = 0xff; | |
| 518 | ||
| 519 | if (!BIT(offset, 0)) result &= ioport("joystick_0")->read(); | |
| 520 | if (!BIT(offset, 1)) result &= ioport("joystick_0_arm")->read(); | |
| 521 | if (!BIT(offset, 2)) result &= ioport("joystick_1")->read(); | |
| 522 | if (!BIT(offset, 3)) result &= ioport("joystick_1_arm")->read(); | |
| 523 | ||
| 524 | return result; | |
| 525 | } | |
| 526 | ||
| 527 | READ8_MEMBER(vtech1_state::vtech1_keyboard_r) | |
| 528 | { | |
| 529 | 188 | UINT8 result = 0x3f; |
| 530 | 189 | |
| 531 | / | |
| 190 | // bit 0 to 5, keyboard input | |
| 532 | 191 | if (!BIT(offset, 0)) result &= ioport("keyboard_0")->read(); |
| 533 | 192 | if (!BIT(offset, 1)) result &= ioport("keyboard_1")->read(); |
| 534 | 193 | if (!BIT(offset, 2)) result &= ioport("keyboard_2")->read(); |
| r30874 | r30875 | |
| 538 | 197 | if (!BIT(offset, 6)) result &= ioport("keyboard_6")->read(); |
| 539 | 198 | if (!BIT(offset, 7)) result &= ioport("keyboard_7")->read(); |
| 540 | 199 | |
| 541 | / | |
| 200 | // bit 6, cassette input | |
| 542 | 201 | result |= ((m_cassette->input()) > 0 ? 1 : 0) << 6; |
| 543 | 202 | |
| 544 | / | |
| 203 | // bit 7, field sync | |
| 545 | 204 | result |= m_mc6847->fs_r() << 7; |
| 546 | 205 | |
| 547 | 206 | return result; |
| r30874 | r30875 | |
| 552 | 211 | I/O LATCH |
| 553 | 212 | ***************************************************************************/ |
| 554 | 213 | |
| 555 | WRITE8_MEMBER(vtech1_state::vtech1_latch_w) | |
| 214 | WRITE8_MEMBER( vtech1_state::vtech1_latch_w ) | |
| 556 | 215 | { |
| 557 | 216 | if (LOG_VTECH1_LATCH) |
| 558 | 217 | logerror("vtech1_latch_w $%02X\n", data); |
| 559 | 218 | |
| 560 | / | |
| 219 | // bit 1, SHRG mod (if installed) | |
| 561 | 220 | if (m_videoram.bytes() == 0x2000) |
| 562 | 221 | { |
| 563 | 222 | m_mc6847->gm0_w(BIT(data, 1)); |
| 564 | 223 | m_mc6847->gm2_w(BIT(data, 1)); |
| 565 | 224 | } |
| 566 | 225 | |
| 567 | / | |
| 226 | // bit 2, cassette out | |
| 568 | 227 | m_cassette->output( BIT(data, 2) ? +1.0 : -1.0); |
| 569 | 228 | |
| 570 | / | |
| 229 | // bit 3 and 4, vdc mode control lines | |
| 571 | 230 | m_mc6847->ag_w(BIT(data, 3)); |
| 572 | 231 | m_mc6847->css_w(BIT(data, 4)); |
| 573 | 232 | |
| 574 | / | |
| 233 | // bit 0 and 5, speaker | |
| 575 | 234 | m_speaker->level_w((BIT(data, 5) << 1) | BIT(data, 0)); |
| 576 | 235 | } |
| 577 | 236 | |
| r30874 | r30875 | |
| 580 | 239 | MEMORY BANKING |
| 581 | 240 | ***************************************************************************/ |
| 582 | 241 | |
| 583 | WRITE8_MEMBER(vtech1_state::vtech1_ | |
| 242 | WRITE8_MEMBER( vtech1_state::vtech1_video_bank_w ) | |
| 584 | 243 | { |
| 585 | logerror("vtech1_memory_bank_w $%02X\n", data); | |
| 586 | ||
| 587 | if (data >= 1) | |
| 588 | if ((data <= 3 && m_ram_size == 66*1024) || (m_ram_size == 4098*1024)) | |
| 589 | membank("bank3")->set_entry(data - 1); | |
| 590 | } | |
| 591 | ||
| 592 | WRITE8_MEMBER(vtech1_state::vtech1_video_bank_w) | |
| 593 | { | |
| 594 | logerror("vtech1_video_bank_w $%02X\n", data); | |
| 595 | 244 | membank("bank4")->set_entry(data & 0x03); |
| 596 | 245 | } |
| 597 | 246 | |
| r30874 | r30875 | |
| 600 | 249 | VIDEO EMULATION |
| 601 | 250 | ***************************************************************************/ |
| 602 | 251 | |
| 603 | READ8_MEMBER(vtech1_state::mc6847_videoram_r) | |
| 252 | READ8_MEMBER( vtech1_state::mc6847_videoram_r ) | |
| 604 | 253 | { |
| 605 | 254 | if (offset == ~0) return 0xff; |
| 255 | ||
| 606 | 256 | m_mc6847->inv_w(BIT(m_videoram[offset], 6)); |
| 607 | 257 | m_mc6847->as_w(BIT(m_videoram[offset], 7)); |
| 608 | 258 | |
| r30874 | r30875 | |
| 614 | 264 | DRIVER INIT |
| 615 | 265 | ***************************************************************************/ |
| 616 | 266 | |
| 617 | DRIVER_INIT_MEMBER(vtech1_state,vtech1) | |
| 267 | DRIVER_INIT_MEMBER( vtech1_state, vtech1 ) | |
| 618 | 268 | { |
| 619 | address_space &prg = m_maincpu->space(AS_PROGRAM); | |
| 620 | int id; | |
| 621 | ||
| 622 | /* ram */ | |
| 623 | m_ram_pointer = m_ram->pointer(); | |
| 624 | m_ram_size = m_ram->size(); | |
| 625 | ||
| 626 | /* setup memory banking */ | |
| 627 | membank("bank1")->set_base(m_ram_pointer); | |
| 628 | ||
| 629 | /* 16k memory expansion? */ | |
| 630 | if (m_ram_size == 18*1024 || m_ram_size == 22*1024 || m_ram_size == 32*1024) | |
| 631 | { | |
| 632 | offs_t base = 0x7800 + (m_ram_size - 0x4000); | |
| 633 | prg.install_readwrite_bank(base, base + 0x3fff, "bank2"); | |
| 634 | membank("bank2")->set_base(m_ram_pointer + base - 0x7800); | |
| 635 | } | |
| 636 | ||
| 637 | /* 64k expansion? */ | |
| 638 | if (m_ram_size >= 66*1024) | |
| 639 | { | |
| 640 | /* install fixed first bank */ | |
| 641 | prg.install_readwrite_bank(0x8000, 0xbfff, "bank2"); | |
| 642 | membank("bank2")->set_base(m_ram_pointer + 0x800); | |
| 643 | ||
| 644 | /* install the others, dynamically banked in */ | |
| 645 | prg.install_readwrite_bank(0xc000, 0xffff, "bank3"); | |
| 646 | membank("bank3")->configure_entries(0, (m_ram_size - 0x4800) / 0x4000, m_ram_pointer + 0x4800, 0x4000); | |
| 647 | membank("bank3")->set_entry(0); | |
| 648 | } | |
| 649 | ||
| 650 | /* initialize floppy */ | |
| 651 | m_drive = -1; | |
| 652 | m_fdc_track_x2[0] = 80; | |
| 653 | m_fdc_track_x2[1] = 80; | |
| 654 | m_fdc_wrprot[0] = 0x80; | |
| 655 | m_fdc_wrprot[1] = 0x80; | |
| 656 | m_fdc_status = 0; | |
| 657 | m_fdc_edge = 0; | |
| 658 | m_fdc_bits = 8; | |
| 659 | m_fdc_start = 0; | |
| 660 | m_fdc_write = 0; | |
| 661 | m_fdc_offs = 0; | |
| 662 | m_fdc_latch = 0; | |
| 663 | ||
| 664 | for(id=0;id<2;id++) | |
| 665 | { | |
| 666 | floppy_get_device(machine(), id)->floppy_install_load_proc(vtech1_load_proc); | |
| 667 | } | |
| 269 | // setup expansion slots | |
| 270 | m_ioexp->set_io_space(&m_maincpu->space(AS_IO)); | |
| 271 | m_memexp->set_program_space(&m_maincpu->space(AS_PROGRAM)); | |
| 272 | m_memexp->set_io_space(&m_maincpu->space(AS_IO)); | |
| 668 | 273 | } |
| 669 | 274 | |
| 670 | DRIVER_INIT_MEMBER(vtech1_state,vtech1h) | |
| 275 | DRIVER_INIT_MEMBER( vtech1_state, vtech1h ) | |
| 671 | 276 | { |
| 672 | address_space &prg = m_maincpu->space(AS_PROGRAM); | |
| 673 | ||
| 674 | 277 | DRIVER_INIT_CALL(vtech1); |
| 675 | 278 | |
| 676 | / | |
| 279 | // the SHRG mod replaces the standard videoram chip with an 8k chip | |
| 677 | 280 | m_videoram.allocate(0x2000); |
| 678 | 281 | |
| 679 | p | |
| 282 | m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x7000, 0x77ff, "bank4"); | |
| 680 | 283 | membank("bank4")->configure_entries(0, 4, m_videoram, 0x800); |
| 681 | 284 | membank("bank4")->set_entry(0); |
| 682 | 285 | } |
| 683 | 286 | |
| 287 | ||
| 684 | 288 | /*************************************************************************** |
| 685 | 289 | ADDRESS MAPS |
| 686 | 290 | ***************************************************************************/ |
| 687 | 291 | |
| 688 | 292 | static ADDRESS_MAP_START( laser110_mem, AS_PROGRAM, 8, vtech1_state ) |
| 689 | AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */ | |
| 690 | AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */ | |
| 691 | AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */ | |
| 293 | AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom | |
| 692 | 294 | AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w) |
| 693 | AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* (6847) */ | |
| 694 | AM_RANGE(0x7800, 0x7fff) AM_RAMBANK("bank1") /* 2k user ram */ | |
| 695 | AM_RANGE(0x8000, 0xbfff) AM_NOP /* 16k ram expansion */ | |
| 696 | AM_RANGE(0xc000, 0xffff) AM_NOP | |
| 295 | AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847 | |
| 296 | AM_RANGE(0x7800, 0x7fff) AM_RAM // 2k user ram | |
| 697 | 297 | ADDRESS_MAP_END |
| 698 | 298 | |
| 699 | 299 | static ADDRESS_MAP_START( laser210_mem, AS_PROGRAM, 8, vtech1_state ) |
| 700 | AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */ | |
| 701 | AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */ | |
| 702 | AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */ | |
| 300 | AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom | |
| 703 | 301 | AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w) |
| 704 | AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* U7 (6847) */ | |
| 705 | AM_RANGE(0x7800, 0x8fff) AM_RAMBANK("bank1") /* 6k user ram */ | |
| 706 | AM_RANGE(0x9000, 0xcfff) AM_NOP /* 16k ram expansion */ | |
| 707 | AM_RANGE(0xd000, 0xffff) AM_NOP | |
| 302 | AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847 | |
| 303 | AM_RANGE(0x7800, 0x8fff) AM_RAM // 6k user ram | |
| 708 | 304 | ADDRESS_MAP_END |
| 709 | 305 | |
| 710 | 306 | static ADDRESS_MAP_START( laser310_mem, AS_PROGRAM, 8, vtech1_state ) |
| 711 | AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */ | |
| 712 | AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */ | |
| 713 | AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */ | |
| 307 | AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom | |
| 714 | 308 | AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w) |
| 715 | AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* (6847) */ | |
| 716 | AM_RANGE(0x7800, 0xb7ff) AM_RAMBANK("bank1") /* 16k user ram */ | |
| 717 | AM_RANGE(0xb800, 0xf7ff) AM_NOP /* 16k ram expansion */ | |
| 718 | AM_RANGE(0xf8ff, 0xffff) AM_NOP | |
| 309 | AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847 | |
| 310 | AM_RANGE(0x7800, 0xb7ff) AM_RAM // 16k user ram | |
| 719 | 311 | ADDRESS_MAP_END |
| 720 | 312 | |
| 721 | 313 | static ADDRESS_MAP_START( vtech1_io, AS_IO, 8, vtech1_state ) |
| 722 | 314 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 723 | AM_RANGE(0x00, 0x00) AM_READ(vtech1_printer_r) | |
| 724 | AM_RANGE(0x0d, 0x0d) AM_WRITE(vtech1_strobe_w) | |
| 725 | AM_RANGE(0x0e, 0x0e) AM_DEVWRITE("cent_data_out", output_latch_device, write) | |
| 726 | AM_RANGE(0x10, 0x1f) AM_READWRITE(vtech1_fdc_r, vtech1_fdc_w) | |
| 727 | AM_RANGE(0x20, 0x2f) AM_READ(vtech1_joystick_r) | |
| 728 | AM_RANGE(0x30, 0x3f) AM_READWRITE(vtech1_serial_r, vtech1_serial_w) | |
| 729 | 315 | AM_RANGE(0x40, 0x4f) AM_READ(vtech1_lightpen_r) |
| 730 | AM_RANGE(0x70, 0x7f) AM_WRITE(vtech1_memory_bank_w) | |
| 731 | 316 | ADDRESS_MAP_END |
| 732 | 317 | |
| 733 | 318 | static ADDRESS_MAP_START( vtech1_shrg_io, AS_IO, 8, vtech1_state ) |
| r30874 | r30875 | |
| 813 | 398 | 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)) |
| 814 | 399 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H CLS SET") PORT_CODE(KEYCODE_H) PORT_CHAR('H') |
| 815 | 400 | |
| 816 | PORT_START("joystick_0") | |
| 817 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 818 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) | |
| 819 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) | |
| 820 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) | |
| 821 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) | |
| 822 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) | |
| 823 | ||
| 824 | PORT_START("joystick_0_arm") | |
| 825 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 826 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) | |
| 827 | PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 828 | ||
| 829 | PORT_START("joystick_1") | |
| 830 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 831 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) | |
| 832 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) | |
| 833 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) | |
| 834 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) | |
| 835 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) | |
| 836 | ||
| 837 | PORT_START("joystick_1_arm") | |
| 838 | PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 839 | PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) | |
| 840 | PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED) | |
| 841 | ||
| 842 | 401 | /* Enhanced options not available on real hardware */ |
| 843 | 402 | PORT_START("CONFIG") |
| 844 | 403 | PORT_CONFNAME( 0x01, 0x01, "Autorun on Quickload") |
| r30874 | r30875 | |
| 851 | 410 | |
| 852 | 411 | |
| 853 | 412 | /*************************************************************************** |
| 854 | PALETTE | |
| 855 | ***************************************************************************/ | |
| 856 | ||
| 857 | static const UINT32 vtech1_palette_mono[] = | |
| 858 | { | |
| 859 | rgb_t(131, 131, 131), | |
| 860 | rgb_t(211, 211, 211), | |
| 861 | rgb_t(29, 29, 29), | |
| 862 | rgb_t(76, 76, 76), | |
| 863 | rgb_t(213, 213, 213), | |
| 864 | rgb_t(167, 167, 167), | |
| 865 | rgb_t(105, 105, 105), | |
| 866 | rgb_t(136, 136, 136), | |
| 867 | rgb_t(0, 0, 0), | |
| 868 | rgb_t(131, 131, 131), | |
| 869 | rgb_t(0, 0, 0), | |
| 870 | rgb_t(213, 213, 213), | |
| 871 | rgb_t(37, 37, 37), | |
| 872 | rgb_t(133, 133, 133), | |
| 873 | rgb_t(28, 28, 28), | |
| 874 | rgb_t(193, 193, 193) | |
| 875 | }; | |
| 876 | ||
| 877 | ||
| 878 | /*************************************************************************** | |
| 879 | 413 | MACHINE DRIVERS |
| 880 | 414 | ***************************************************************************/ |
| 881 | 415 | |
| r30874 | r30875 | |
| 889 | 423 | |
| 890 | 424 | static MACHINE_CONFIG_START( laser110, vtech1_state ) |
| 891 | 425 | |
| 892 | / | |
| 426 | // basic machine hardware | |
| 893 | 427 | MCFG_CPU_ADD("maincpu", Z80, VTECH1_CLK) /* 3.57950 MHz */ |
| 894 | 428 | MCFG_CPU_PROGRAM_MAP(laser110_mem) |
| 895 | 429 | MCFG_CPU_IO_MAP(vtech1_io) |
| 896 | 430 | |
| 897 | / | |
| 431 | // video hardware | |
| 898 | 432 | MCFG_SCREEN_MC6847_PAL_ADD("screen", "mc6847") |
| 899 | 433 | |
| 900 | 434 | MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz) |
| 901 | MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) | |
| 435 | MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT | |
| 902 | 436 | MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r)) |
| 903 | 437 | MCFG_MC6847_BW(true) |
| 904 | 438 | MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1) |
| 905 | 439 | // GM2 = GND, GM0 = GND, INTEXT = GND |
| 906 | 440 | // other lines not connected |
| 907 | 441 | |
| 908 | / | |
| 442 | // sound hardware | |
| 909 | 443 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 910 | 444 | MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette") |
| 911 | 445 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| r30874 | r30875 | |
| 913 | 447 | MCFG_SOUND_CONFIG(vtech1_speaker_interface) |
| 914 | 448 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) |
| 915 | 449 | |
| 916 | /* printer */ | |
| 917 | MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer") | |
| 918 | MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(vtech1_state, write_centronics_busy)) | |
| 450 | // peripheral and memory expansion slots | |
| 451 | MCFG_IOEXP_SLOT_ADD("io") | |
| 452 | MCFG_MEMEXP_SLOT_ADD("mem") | |
| 919 | 453 | |
| 920 | MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") | |
| 921 | ||
| 922 | /* snapshot/quickload */ | |
| 454 | // snapshot | |
| 923 | 455 | MCFG_SNAPSHOT_ADD("snapshot", vtech1_state, vtech1, "vz", 1.5) |
| 924 | 456 | |
| 925 | 457 | MCFG_CASSETTE_ADD( "cassette" ) |
| 926 | 458 | MCFG_CASSETTE_FORMATS(vtech1_cassette_formats) |
| 927 | 459 | MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY) |
| 928 | ||
| 929 | /* cartridge */ | |
| 930 | MCFG_CARTSLOT_ADD("cart") | |
| 931 | MCFG_CARTSLOT_EXTENSION_LIST("rom") | |
| 932 | ||
| 933 | /* internal ram */ | |
| 934 | MCFG_RAM_ADD(RAM_TAG) | |
| 935 | MCFG_RAM_DEFAULT_SIZE("2K") | |
| 936 | MCFG_RAM_EXTRA_OPTIONS("18K,66K,4098K") | |
| 937 | ||
| 938 | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(vtech1_floppy_interface) | |
| 939 | 460 | MACHINE_CONFIG_END |
| 940 | 461 | |
| 941 | 462 | static MACHINE_CONFIG_DERIVED( laser200, laser110 ) |
| 942 | 463 | MCFG_DEVICE_REMOVE("mc6847") |
| 943 | 464 | MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz) |
| 944 | MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) | |
| 465 | MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT | |
| 945 | 466 | MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r)) |
| 946 | 467 | MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1) |
| 947 | 468 | // GM2 = GND, GM0 = GND, INTEXT = GND |
| r30874 | r30875 | |
| 951 | 472 | static MACHINE_CONFIG_DERIVED( laser210, laser200 ) |
| 952 | 473 | MCFG_CPU_MODIFY("maincpu") |
| 953 | 474 | MCFG_CPU_PROGRAM_MAP(laser210_mem) |
| 954 | ||
| 955 | /* internal ram */ | |
| 956 | MCFG_RAM_MODIFY(RAM_TAG) | |
| 957 | MCFG_RAM_DEFAULT_SIZE("6K") | |
| 958 | MCFG_RAM_EXTRA_OPTIONS("22K,66K,4098K") | |
| 959 | 475 | MACHINE_CONFIG_END |
| 960 | 476 | |
| 961 | 477 | static MACHINE_CONFIG_DERIVED( laser310, laser200 ) |
| 962 | 478 | MCFG_CPU_REPLACE("maincpu", Z80, VZ300_XTAL1_CLK / 5) /* 3.546894 MHz */ |
| 963 | 479 | MCFG_CPU_PROGRAM_MAP(laser310_mem) |
| 964 | 480 | MCFG_CPU_IO_MAP(vtech1_io) |
| 965 | ||
| 966 | /* internal ram */ | |
| 967 | MCFG_RAM_MODIFY(RAM_TAG) | |
| 968 | MCFG_RAM_DEFAULT_SIZE("16K") | |
| 969 | MCFG_RAM_EXTRA_OPTIONS("32K,66K,4098K") | |
| 970 | 481 | MACHINE_CONFIG_END |
| 971 | 482 | |
| 972 | 483 | static MACHINE_CONFIG_DERIVED( laser310h, laser310 ) |
| r30874 | r30875 | |
| 975 | 486 | |
| 976 | 487 | MCFG_DEVICE_REMOVE("mc6847") |
| 977 | 488 | MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz) |
| 978 | MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) | |
| 489 | MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT | |
| 979 | 490 | MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r)) |
| 980 | 491 | MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1) |
| 981 | 492 | // INTEXT = GND |
| r30874 | r30875 | |
| 988 | 499 | ***************************************************************************/ |
| 989 | 500 | |
| 990 | 501 | ROM_START( laser110 ) |
| 991 | ROM_REGION(0x6800, "maincpu", 0) | |
| 992 | ROM_LOAD("vtechv12.u09", 0x0000, 0x2000, CRC(99412d43) SHA1(6aed8872a0818be8e1b08ecdfd92acbe57a3c96d)) | |
| 993 | ROM_LOAD("vtechv12.u10", 0x2000, 0x2000, CRC(e4c24e8b) SHA1(9d8fb3d24f3d4175b485cf081a2d5b98158ab2fb)) | |
| 994 | ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) | |
| 502 | ROM_REGION(0x4000, "maincpu", 0) | |
| 503 | ROM_LOAD("vtechv12.u09", 0x0000, 0x2000, CRC(99412d43) SHA1(6aed8872a0818be8e1b08ecdfd92acbe57a3c96d)) | |
| 504 | ROM_LOAD("vtechv12.u10", 0x2000, 0x2000, CRC(e4c24e8b) SHA1(9d8fb3d24f3d4175b485cf081a2d5b98158ab2fb)) | |
| 995 | 505 | ROM_END |
| 996 | 506 | |
| 997 | #if 0 | |
| 998 | /* The VZ-200 sold in Germany and the Netherlands came with BASIC V1.1, which | |
| 999 | is currently not dumped. */ | |
| 507 | // The VZ-200 sold in Germany and the Netherlands came with BASIC V1.1, which is currently not dumped. | |
| 1000 | 508 | ROM_START( vz200de ) |
| 1001 | ROM_REGION(0x6800, "maincpu", 0) | |
| 1002 | ROM_LOAD("vtechv11.u09", 0x0000, 0x2000, NO_DUMP) | |
| 1003 | ROM_LOAD("vtechv11.u10", 0x2000, 0x2000, NO_DUMP) | |
| 1004 | ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) | |
| 509 | ROM_REGION(0x4000, "maincpu", 0) | |
| 510 | ROM_LOAD("vtechv11.u09", 0x0000, 0x2000, NO_DUMP) | |
| 511 | ROM_LOAD("vtechv11.u10", 0x2000, 0x2000, NO_DUMP) | |
| 1005 | 512 | ROM_END |
| 1006 | #endif | |
| 1007 | 513 | |
| 1008 | 514 | #define rom_las110de rom_laser110 |
| 1009 | 515 | #define rom_laser200 rom_laser110 |
| 1010 | #define rom_fellow rom_laser110 | |
| 516 | #define rom_fellow rom_laser110 | |
| 1011 | 517 | |
| 1012 | /* It's possible that the Texet TX8000 came with BASIC V1.0, but this | |
| 1013 | needs to be verified */ | |
| 518 | // It's possible that the Texet TX-8000 came with BASIC V1.0, but this needs to be verified | |
| 1014 | 519 | #define rom_tx8000 rom_laser110 |
| 1015 | 520 | |
| 1016 | 521 | ROM_START( laser210 ) |
| 1017 | ROM_REGION(0x6800, "maincpu", 0) | |
| 1018 | ROM_LOAD("vtechv20.u09", 0x0000, 0x2000, CRC(cc854fe9) SHA1(6e66a309b8e6dc4f5b0b44e1ba5f680467353d66)) | |
| 1019 | ROM_LOAD("vtechv20.u10", 0x2000, 0x2000, CRC(7060f91a) SHA1(8f3c8f24f97ebb98f3c88d4e4ba1f91ffd563440)) | |
| 1020 | ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) | |
| 522 | ROM_REGION(0x4000, "maincpu", 0) | |
| 523 | ROM_LOAD("vtechv20.u09", 0x0000, 0x2000, CRC(cc854fe9) SHA1(6e66a309b8e6dc4f5b0b44e1ba5f680467353d66)) | |
| 524 | ROM_LOAD("vtechv20.u10", 0x2000, 0x2000, CRC(7060f91a) SHA1(8f3c8f24f97ebb98f3c88d4e4ba1f91ffd563440)) | |
| 1021 | 525 | ROM_END |
| 1022 | 526 | |
| 1023 | 527 | #define rom_las210de rom_laser210 |
| 1024 | #define rom_vz200 rom_laser210 | |
| 528 | #define rom_vz200 rom_laser210 | |
| 1025 | 529 | |
| 1026 | 530 | ROM_START( laser310 ) |
| 1027 | ROM_REGION(0x | |
| 531 | ROM_REGION(0x4000, "maincpu", 0) | |
| 1028 | 532 | ROM_SYSTEM_BIOS(0, "basic20", "BASIC V2.0") |
| 1029 | 533 | ROMX_LOAD("vtechv20.u12", 0x0000, 0x4000, CRC(613de12c) SHA1(f216c266bc09b0dbdbad720796e5ea9bc7d91e53), ROM_BIOS(1)) |
| 1030 | 534 | ROM_SYSTEM_BIOS(1, "basic21", "BASIC V2.1 (hack)") |
| 1031 | 535 | ROMX_LOAD("vtechv21.u12", 0x0000, 0x4000, CRC(f7df980f) SHA1(5ba14a7a2eedca331b033901080fa5d205e245ea), ROM_BIOS(2)) |
| 1032 | ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL) | |
| 1033 | 536 | ROM_END |
| 1034 | 537 | |
| 1035 | #define rom_vz300 rom_laser310 | |
| 538 | #define rom_vz300 rom_laser310 | |
| 1036 | 539 | #define rom_laser310h rom_laser310 |
| 1037 | 540 | |
| 541 | ||
| 1038 | 542 | /*************************************************************************** |
| 1039 | 543 | GAME DRIVERS |
| 1040 | 544 | ***************************************************************************/ |
| 1041 | 545 | |
| 1042 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ | |
| 1043 | COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 110", 0 ) | |
| 1044 | COMP( 1983, las110de, laser110, 0, laser110, vtech1, vtech1_state, vtech1, "Sanyo", "Laser 110 (Germany)", 0 ) | |
| 1045 | COMP( 1983, laser200, 0, laser110, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 200", 0 ) | |
| 1046 | //COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "VZ-200 (Germany & Netherlands)", 0 ) | |
| 1047 | COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Salora", "Fellow (Finland)", 0 ) | |
| 1048 | COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Texet", "TX-8000 (UK)", 0 ) | |
| 1049 | COMP( 1984, laser210, 0, laser200, laser210, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 210", 0 ) | |
| 1050 | COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-200 (Oceania)", 0 ) | |
| 1051 | COMP( 1984, las210de, laser210, 0, laser210, vtech1, vtech1_state, vtech1, "Sanyo", "Laser 210 (Germany)", 0 ) | |
| 1052 | COMP( 1984, laser310, 0, laser200, laser310, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 310", 0 ) | |
| 1053 | COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-300 (Oceania)", 0 ) | |
| 1054 | COMP( 1984, laser310h, laser310, 0, laser310h, vtech1, vtech1_state, vtech1h, "Video Technology", "Laser 310 (SHRG)", GAME_UNOFFICIAL) | |
| 546 | // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS | |
| 547 | COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 110", 0 ) | |
| 548 | COMP( 1983, laser200, 0, 0, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 200", 0 ) | |
| 549 | COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Video Technology", "VZ-200 (Germany & Netherlands)", 0 ) | |
| 550 | COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Salora", "Fellow (Finland)", 0 ) | |
| 551 | COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, vtech1, "Texet", "TX-8000 (UK)", 0 ) | |
| 552 | COMP( 1984, laser210, 0, 0, laser210, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 210", 0 ) | |
| 553 | COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-200 (Oceania)", 0 ) | |
| 554 | COMP( 1984, laser310, 0, 0, laser310, vtech1, vtech1_state, vtech1, "Video Technology", "Laser 310", 0 ) | |
| 555 | COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, vtech1, "Dick Smith Electronics", "VZ-300 (Oceania)", 0 ) | |
| 556 | COMP( 1984, laser310h, laser310, 0, laser310h, vtech1, vtech1_state, vtech1h, "Video Technology", "Laser 310 (SHRG)", GAME_UNOFFICIAL) |
| r30874 | r30875 | |
|---|---|---|
| 614 | 614 | BUSES += VIC20 |
| 615 | 615 | BUSES += VIDBRAIN |
| 616 | 616 | BUSES += VIP |
| 617 | BUSES += VTECH_IOEXP | |
| 618 | BUSES += VTECH_MEMEXP | |
| 617 | 619 | BUSES += WANGPC |
| 618 | 620 | BUSES += X68K |
| 619 | 621 | BUSES += Z88 |
| Previous | 199869 Revisions | Next |