vtech1: small cleanup

This commit is contained in:
Robbbert 2020-08-08 12:54:09 +10:00
parent 983035768e
commit d6c5237532

View File

@ -40,7 +40,6 @@ Todo:
#include "sound/spkrdev.h"
#include "video/mc6847.h"
#include "softlist.h"
#include "speaker.h"
#include "formats/imageutl.h"
@ -64,15 +63,16 @@ Todo:
class vtech1_state : public driver_device
{
public:
vtech1_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_maincpu(*this, "maincpu"),
m_mc6847(*this, "mc6847"),
m_speaker(*this, "speaker"),
m_cassette(*this, "cassette"),
m_ioexp(*this, "io"),
m_memexp(*this, "mem")
vtech1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_vram(*this, "videoram")
, m_maincpu(*this, "maincpu")
, m_crtc(*this, "crtc")
, m_speaker(*this, "speaker")
, m_cassette(*this, "cassette")
, m_io_keyboard(*this, "X%u", 0U)
, m_ioexp(*this, "io")
, m_memexp(*this, "mem")
{
}
@ -85,11 +85,10 @@ public:
void init_vtech1h();
private:
uint8_t vtech1_lightpen_r(offs_t offset);
uint8_t vtech1_keyboard_r(offs_t offset);
void vtech1_latch_w(uint8_t data);
void vtech1_video_bank_w(uint8_t data);
uint8_t lightpen_r(offs_t offset);
uint8_t keyboard_r(offs_t offset);
void latch_w(uint8_t data);
void video_bank_w(uint8_t data);
uint8_t mc6847_videoram_r(offs_t offset);
DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb);
@ -103,12 +102,12 @@ private:
static const uint8_t VZ_BASIC = 0xf0;
static const uint8_t VZ_MCODE = 0xf1;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_vram;
required_device<cpu_device> m_maincpu;
required_device<mc6847_base_device> m_mc6847;
required_device<mc6847_base_device> m_crtc;
required_device<speaker_sound_device> m_speaker;
required_device<cassette_image_device> m_cassette;
required_ioport_array<8> m_io_keyboard;
required_device<vtech_ioexp_slot_device> m_ioexp;
required_device<vtech_memexp_slot_device> m_memexp;
};
@ -191,31 +190,25 @@ SNAPSHOT_LOAD_MEMBER(vtech1_state::snapshot_cb)
INPUTS
***************************************************************************/
uint8_t vtech1_state::vtech1_lightpen_r(offs_t offset)
uint8_t vtech1_state::lightpen_r(offs_t offset)
{
logerror("vtech1_lightpen_r(%d)\n", offset);
return 0xff;
}
uint8_t vtech1_state::vtech1_keyboard_r(offs_t offset)
uint8_t vtech1_state::keyboard_r(offs_t offset)
{
uint8_t result = 0x3f;
// bit 0 to 5, keyboard input
if (!BIT(offset, 0)) result &= ioport("keyboard_0")->read();
if (!BIT(offset, 1)) result &= ioport("keyboard_1")->read();
if (!BIT(offset, 2)) result &= ioport("keyboard_2")->read();
if (!BIT(offset, 3)) result &= ioport("keyboard_3")->read();
if (!BIT(offset, 4)) result &= ioport("keyboard_4")->read();
if (!BIT(offset, 5)) result &= ioport("keyboard_5")->read();
if (!BIT(offset, 6)) result &= ioport("keyboard_6")->read();
if (!BIT(offset, 7)) result &= ioport("keyboard_7")->read();
for (u8 i = 0; i < 8; i++)
if (!BIT(offset, i)) result &= m_io_keyboard[i]->read();
// bit 6, cassette input
result |= (m_cassette->input() > 0.04) ? 0 : 0x40;
// bit 7, field sync
result |= m_mc6847->fs_r() << 7;
result |= m_crtc->fs_r() << 7;
return result;
}
@ -225,24 +218,24 @@ uint8_t vtech1_state::vtech1_keyboard_r(offs_t offset)
I/O LATCH
***************************************************************************/
void vtech1_state::vtech1_latch_w(uint8_t data)
void vtech1_state::latch_w(uint8_t data)
{
if (LOG_VTECH1_LATCH)
logerror("vtech1_latch_w $%02X\n", data);
// bit 1, SHRG mod (if installed)
if (m_videoram.bytes() == 0x2000)
if (m_vram.bytes() == 0x2000)
{
m_mc6847->gm0_w(BIT(data, 1));
m_mc6847->gm2_w(BIT(data, 1));
m_crtc->gm0_w(BIT(data, 1));
m_crtc->gm2_w(BIT(data, 1));
}
// bit 2, cassette out (actually bits 1 and 2 perform this function, so either can be used)
m_cassette->output( BIT(data, 2) ? 1.0 : -1.0);
// bit 3 and 4, vdc mode control lines
m_mc6847->ag_w(BIT(data, 3));
m_mc6847->css_w(BIT(data, 4));
m_crtc->ag_w(BIT(data, 3));
m_crtc->css_w(BIT(data, 4));
// bit 0 and 5, speaker
m_speaker->level_w((BIT(data, 5) << 1) | BIT(data, 0));
@ -253,7 +246,7 @@ void vtech1_state::vtech1_latch_w(uint8_t data)
MEMORY BANKING
***************************************************************************/
void vtech1_state::vtech1_video_bank_w(uint8_t data)
void vtech1_state::video_bank_w(uint8_t data)
{
membank("bank4")->set_entry(data & 0x03);
}
@ -267,10 +260,10 @@ uint8_t vtech1_state::mc6847_videoram_r(offs_t offset)
{
if (offset == ~0) return 0xff;
m_mc6847->inv_w(BIT(m_videoram[offset], 6));
m_mc6847->as_w(BIT(m_videoram[offset], 7));
m_crtc->inv_w(BIT(m_vram[offset], 6));
m_crtc->as_w(BIT(m_vram[offset], 7));
return m_videoram[offset];
return m_vram[offset];
}
@ -281,10 +274,10 @@ uint8_t vtech1_state::mc6847_videoram_r(offs_t offset)
void vtech1_state::init_vtech1h()
{
// the SHRG mod replaces the standard videoram chip with an 8k chip
m_videoram.allocate(0x2000);
m_vram.allocate(0x2000);
m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x7000, 0x77ff, "bank4");
membank("bank4")->configure_entries(0, 4, m_videoram, 0x800);
membank("bank4")->configure_entries(0, 4, m_vram, 0x800);
membank("bank4")->set_entry(0);
}
@ -296,37 +289,34 @@ void vtech1_state::init_vtech1h()
void vtech1_state::laser110_mem(address_map &map)
{
map(0x0000, 0x3fff).rom(); // basic rom
map(0x6800, 0x6fff).rw(FUNC(vtech1_state::vtech1_keyboard_r), FUNC(vtech1_state::vtech1_latch_w));
map(0x6800, 0x6fff).rw(FUNC(vtech1_state::keyboard_r), FUNC(vtech1_state::latch_w));
map(0x7000, 0x77ff).ram().share("videoram"); // 6847
map(0x7800, 0x7fff).ram(); // 2k user ram
}
void vtech1_state::laser210_mem(address_map &map)
{
map(0x0000, 0x3fff).rom(); // basic rom
map(0x6800, 0x6fff).rw(FUNC(vtech1_state::vtech1_keyboard_r), FUNC(vtech1_state::vtech1_latch_w));
map(0x7000, 0x77ff).ram().share("videoram"); // 6847
laser110_mem(map);
map(0x7800, 0x8fff).ram(); // 6k user ram
}
void vtech1_state::laser310_mem(address_map &map)
{
map(0x0000, 0x3fff).rom(); // basic rom
map(0x6800, 0x6fff).rw(FUNC(vtech1_state::vtech1_keyboard_r), FUNC(vtech1_state::vtech1_latch_w));
map(0x7000, 0x77ff).ram().share("videoram"); // 6847
laser110_mem(map);
map(0x7800, 0xb7ff).ram(); // 16k user ram
}
void vtech1_state::vtech1_io(address_map &map)
{
map.global_mask(0xff);
map(0x40, 0x4f).r(FUNC(vtech1_state::vtech1_lightpen_r));
map(0x40, 0x4f).r(FUNC(vtech1_state::lightpen_r));
}
void vtech1_state::vtech1_shrg_io(address_map &map)
{
map.global_mask(0xff);
vtech1_io(map);
map(0xd0, 0xdf).w(FUNC(vtech1_state::vtech1_video_bank_w));
map(0xd0, 0xdf).w(FUNC(vtech1_state::video_bank_w));
}
@ -335,8 +325,7 @@ void vtech1_state::vtech1_shrg_io(address_map &map)
***************************************************************************/
static INPUT_PORTS_START(vtech1)
PORT_START("keyboard_0")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X0")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R RETURN LEFT$") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q FOR CHR$") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E NEXT LEN(") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
@ -344,8 +333,7 @@ static INPUT_PORTS_START(vtech1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W TO VAL(") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T THEN MID$") PORT_CODE(KEYCODE_T) PORT_CHAR('T')
PORT_START("keyboard_1")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X1")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F GOSUB RND(") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A MODE( ASC(") PORT_CODE(KEYCODE_A) PORT_CHAR('A')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D DIM RESTORE") PORT_CODE(KEYCODE_D) PORT_CHAR('D')
@ -353,8 +341,7 @@ static INPUT_PORTS_START(vtech1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S STEP STR$(") PORT_CODE(KEYCODE_S) PORT_CHAR('S')
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G GOTO STOP") PORT_CODE(KEYCODE_G) PORT_CHAR('G')
PORT_START("keyboard_2")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X2")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V LPRINT USR") PORT_CODE(KEYCODE_V) PORT_CHAR('V')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z PEEK( INP") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C CONT COPY") PORT_CODE(KEYCODE_C) PORT_CHAR('C')
@ -362,8 +349,7 @@ static INPUT_PORTS_START(vtech1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X POKE OUT") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B LLIST SOUND") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
PORT_START("keyboard_3")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X3")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 $ VERIFY ATN(") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 ! CSAVE SIN(") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 # CRUN TAN(") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
@ -371,8 +357,7 @@ static INPUT_PORTS_START(vtech1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 \" CLOAD COS(") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"')
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 % LIST LOG(") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
PORT_START("keyboard_4")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X4")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M \\ \xE2\x86\x90") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('\\') PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE \xE2\x86\x93") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHAR('~') PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(", < \xE2\x86\x92") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
@ -380,8 +365,7 @@ static INPUT_PORTS_START(vtech1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". > \xE2\x86\x91") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N ^ COLOR USING") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('^')
PORT_START("keyboard_5")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X5")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 ' END SGN(") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0 @ DATA INT(") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('@')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 ( NEW SQR(") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
@ -389,8 +373,7 @@ static INPUT_PORTS_START(vtech1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 ) READ ABS(") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 & RUN EXP(") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
PORT_START("keyboard_6")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X6")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U IF INKEY$") PORT_CODE(KEYCODE_U) PORT_CHAR('U')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P ] PRINT NOT") PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR(']')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I INPUT AND") PORT_CODE(KEYCODE_I) PORT_CHAR('I')
@ -398,23 +381,13 @@ static INPUT_PORTS_START(vtech1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O [ LET OR") PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('[')
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y ELSE RIGHT$(") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
PORT_START("keyboard_7")
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("X7")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J REM RESET") PORT_CODE(KEYCODE_J) PORT_CHAR('J')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("; + [Rubout]") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') PORT_CHAR(UCHAR_MAMEKEY(DEL))
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K / TAB( POINT") PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('/')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(": * [Inverse]") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') PORT_CHAR(UCHAR_MAMEKEY(HOME))
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L ? [Insert]") PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('?') PORT_CHAR(UCHAR_MAMEKEY(INSERT))
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H CLS SET") PORT_CODE(KEYCODE_H) PORT_CHAR('H')
/* Enhanced options not available on real hardware */
PORT_START("CONFIG")
PORT_CONFNAME( 0x01, 0x01, "Autorun on Quickload")
PORT_CONFSETTING( 0x00, DEF_STR(No))
PORT_CONFSETTING( 0x01, DEF_STR(Yes))
// PORT_CONFNAME( 0x08, 0x08, "Cassette Speaker")
// PORT_CONFSETTING( 0x08, DEF_STR(On))
// PORT_CONFSETTING( 0x00, DEF_STR(Off))
INPUT_PORTS_END
@ -432,12 +405,12 @@ void vtech1_state::laser110(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &vtech1_state::vtech1_io);
// video hardware
MC6847_PAL(config, m_mc6847, XTAL(4'433'619));
m_mc6847->set_screen("screen");
m_mc6847->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_mc6847->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_mc6847->set_black_and_white(true);
m_mc6847->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
MC6847_PAL(config, m_crtc, XTAL(4'433'619));
m_crtc->set_screen("screen");
m_crtc->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_crtc->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_crtc->set_black_and_white(true);
m_crtc->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
// GM2 = GND, GM0 = GND, INTEXT = GND
// other lines not connected
@ -475,11 +448,11 @@ void vtech1_state::laser110(machine_config &config)
void vtech1_state::laser200(machine_config &config)
{
laser110(config);
MC6847_PAL(config.replace(), m_mc6847, XTAL(4'433'619));
m_mc6847->set_screen("screen");
m_mc6847->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_mc6847->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_mc6847->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
MC6847_PAL(config.replace(), m_crtc, XTAL(4'433'619));
m_crtc->set_screen("screen");
m_crtc->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_crtc->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_crtc->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
// GM2 = GND, GM0 = GND, INTEXT = GND
// other lines not connected
}
@ -503,11 +476,11 @@ void vtech1_state::laser310h(machine_config &config)
laser310(config);
m_maincpu->set_addrmap(AS_IO, &vtech1_state::vtech1_shrg_io);
MC6847_PAL(config.replace(), m_mc6847, XTAL(4'433'619));
m_mc6847->set_screen("screen");
m_mc6847->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_mc6847->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_mc6847->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
MC6847_PAL(config.replace(), m_crtc, XTAL(4'433'619));
m_crtc->set_screen("screen");
m_crtc->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_crtc->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_crtc->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
// INTEXT = GND
// other lines not connected
}
@ -569,13 +542,13 @@ ROM_END
***************************************************************************/
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 110", 0 )
COMP( 1983, laser200, 0, 0, laser200, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 200", 0 )
COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Video Technology", "VZ-200 (Germany & Netherlands)", MACHINE_NOT_WORKING )
COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Salora", "Fellow (Finland)", 0 )
COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Texet", "TX-8000 (UK)", 0 )
COMP( 1984, laser210, 0, 0, laser210, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 210", 0 )
COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, empty_init, "Dick Smith Electronics", "VZ-200 (Oceania)", 0 )
COMP( 1984, laser310, 0, 0, laser310, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 310", 0 )
COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, empty_init, "Dick Smith Electronics", "VZ-300 (Oceania)", 0 )
COMP( 1984, laser310h, laser310, 0, laser310h, vtech1, vtech1_state, init_vtech1h, "Video Technology", "Laser 310 (SHRG)", MACHINE_UNOFFICIAL )
COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 110", MACHINE_SUPPORTS_SAVE )
COMP( 1983, laser200, 0, 0, laser200, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 200", MACHINE_SUPPORTS_SAVE )
COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Video Technology", "VZ-200 (Germany & Netherlands)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Salora", "Fellow (Finland)", MACHINE_SUPPORTS_SAVE )
COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Texet", "TX-8000 (UK)", MACHINE_SUPPORTS_SAVE )
COMP( 1984, laser210, 0, 0, laser210, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 210", MACHINE_SUPPORTS_SAVE )
COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, empty_init, "Dick Smith Electronics", "VZ-200 (Oceania)", MACHINE_SUPPORTS_SAVE )
COMP( 1984, laser310, 0, 0, laser310, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 310", MACHINE_SUPPORTS_SAVE )
COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, empty_init, "Dick Smith Electronics", "VZ-300 (Oceania)", MACHINE_SUPPORTS_SAVE )
COMP( 1984, laser310h, laser310, 0, laser310h, vtech1, vtech1_state, init_vtech1h, "Video Technology", "Laser 310 (SHRG)", MACHINE_UNOFFICIAL | MACHINE_SUPPORTS_SAVE )