From d6c52375321ab0dee4e23c20d3ba9d917d804153 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sat, 8 Aug 2020 12:54:09 +1000 Subject: [PATCH] vtech1: small cleanup --- src/mame/drivers/vtech1.cpp | 175 +++++++++++++++--------------------- 1 file changed, 74 insertions(+), 101 deletions(-) diff --git a/src/mame/drivers/vtech1.cpp b/src/mame/drivers/vtech1.cpp index d9e1f6226b1..bb69f550b54 100644 --- a/src/mame/drivers/vtech1.cpp +++ b/src/mame/drivers/vtech1.cpp @@ -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 m_videoram; - + required_shared_ptr m_vram; required_device m_maincpu; - required_device m_mc6847; + required_device m_crtc; required_device m_speaker; required_device m_cassette; + required_ioport_array<8> m_io_keyboard; required_device m_ioexp; required_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 )