diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 621429d5af5..202c06ba876 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2851,6 +2851,7 @@ files { createMESSProjects(_target, _subtarget, "qume") files { MAME_DIR .. "src/mame/drivers/qvt70.cpp", + MAME_DIR .. "src/mame/drivers/qvt102.cpp", MAME_DIR .. "src/mame/drivers/qvt103.cpp", MAME_DIR .. "src/mame/drivers/qvt201.cpp", MAME_DIR .. "src/mame/drivers/qvt6800.cpp", @@ -3765,7 +3766,6 @@ files { MAME_DIR .. "src/mame/drivers/jade.cpp", MAME_DIR .. "src/mame/drivers/jonos.cpp", MAME_DIR .. "src/mame/drivers/kron.cpp", - MAME_DIR .. "src/mame/drivers/lb4.cpp", MAME_DIR .. "src/mame/drivers/leapster.cpp", MAME_DIR .. "src/mame/drivers/lee1214.cpp", MAME_DIR .. "src/mame/drivers/learnwin.cpp", diff --git a/src/mame/drivers/lb4.cpp b/src/mame/drivers/qvt102.cpp similarity index 57% rename from src/mame/drivers/lb4.cpp rename to src/mame/drivers/qvt102.cpp index 24934d0b457..be8053c1578 100644 --- a/src/mame/drivers/lb4.cpp +++ b/src/mame/drivers/qvt102.cpp @@ -1,16 +1,19 @@ // license:BSD-3-Clause -// copyright-holders:Robbbert +// copyright-holders:Robbbert, Dirk Best /**************************************************************************** - Liberty Electronics LB-4 serial terminal + Qume QVT-102 serial terminal Known hardware: - Motorola 6800 CPU - Hitachi HD46505 (Motorola 6845-compatible) CRTC - Hitachi HD46850 (Motorola 6850-compatible) ACIA + - M58725P-15 (16k RAM) - Zilog Z8430 CTC - 16.6698MHz Crystal + Keyboard: D8748D, 6.000, Beeper + Not sure what's going on here... the ACIA only has one serial channel, is it for the host, the printer, or the keyboard? @@ -21,7 +24,9 @@ #include "emu.h" #include "cpu/m6800/m6800.h" +#include "cpu/mcs48/mcs48.h" #include "machine/6850acia.h" +#include "machine/nvram.h" #include "machine/z80ctc.h" #include "video/mc6845.h" #include "screen.h" @@ -30,22 +35,23 @@ #define MASTER_CLOCK 16.6698_MHz_XTAL -class lb4_state : public driver_device +class qvt102_state : public driver_device { public: - lb4_state(const machine_config &mconfig, device_type type, const char *tag) + qvt102_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_acia(*this, "acia") , m_ctc(*this, "ctc") , m_crtc(*this, "crtc") + , m_screen(*this, "screen") , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") , m_p_videoram(*this, "videoram") , m_p_chargen(*this, "chargen") { } - void lb4(machine_config &config); + void qvt102(machine_config &config); private: void mem_map(address_map &map); @@ -55,15 +61,16 @@ private: required_device m_acia; required_device m_ctc; required_device m_crtc; + required_device m_screen; required_device m_gfxdecode; required_device m_palette; required_shared_ptr m_p_videoram; required_region_ptr m_p_chargen; }; -void lb4_state::mem_map(address_map &map) +void qvt102_state::mem_map(address_map &map) { - map(0x0000, 0x03ff).ram(); + map(0x0000, 0x03ff).ram().share("nvram"); map(0x2800, 0x2803).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); map(0x3000, 0x3000).nopr(); map(0x3800, 0x3800).nopw(); // many writes of 43 and 4B @@ -75,28 +82,40 @@ void lb4_state::mem_map(address_map &map) map(0xe000, 0xffff).rom().region("maincpu", 0); } -// identical to esprit.cpp -MC6845_UPDATE_ROW(lb4_state::crtc_update_row) +MC6845_UPDATE_ROW( qvt102_state::crtc_update_row ) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); - uint32_t *p = &bitmap.pix32(y); + + // line attribute (active for the rest of the line) + uint8_t attr = 0; for (int x = 0; x < x_count; x++) { uint16_t mem = (ma + x) & 0x7ff; uint8_t chr = m_p_videoram[mem]; - uint16_t gfx = m_p_chargen[(chr<<4) | ra] ^ (((x == cursor_x) ^ (BIT(chr, 7))) ? 0x1ff : 0); + uint16_t gfx = m_p_chargen[(chr << 4) | ra]; - /* Display a scanline of a character (9 pixels) */ - *p++ = palette[BIT(gfx, 8)]; - *p++ = palette[BIT(gfx, 7)]; - *p++ = palette[BIT(gfx, 6)]; - *p++ = palette[BIT(gfx, 5)]; - *p++ = palette[BIT(gfx, 4)]; - *p++ = palette[BIT(gfx, 3)]; - *p++ = palette[BIT(gfx, 2)]; - *p++ = palette[BIT(gfx, 1)]; - *p++ = palette[BIT(gfx, 0)]; + // check for new attribute + if (chr >= 0x90 && chr <= 0x9f) + attr = chr; + + // draw 9 pixels of the character + for (int i = 0; i < 9; i++) + { + int pixel = BIT(gfx, i); + int half = BIT(chr, 7); + + // apply attributes + if (BIT(attr, 2)) pixel ^= 1; // reverse + if (BIT(attr, 1) && (m_screen->frame_number() & 32)) pixel ^= 1; // blink (frequency?) + if (BIT(attr, 0)) pixel = 0; // blank + if (BIT(attr, 3) && ra == 11) pixel = 1; // underline + + // cursor active? + if (x == cursor_x) pixel ^= 1; + + bitmap.pix32(y, x*9 + (8-i)) = palette[pixel ? 2 - half : 0]; + } } } @@ -115,25 +134,27 @@ static GFXDECODE_START(chars) GFXDECODE_ENTRY("chargen", 0, char_layout, 0, 1) GFXDECODE_END -void lb4_state::lb4(machine_config &config) +void qvt102_state::qvt102(machine_config &config) { M6800(config, m_maincpu, MASTER_CLOCK / 18); - m_maincpu->set_addrmap(AS_PROGRAM, &lb4_state::mem_map); + m_maincpu->set_addrmap(AS_PROGRAM, &qvt102_state::mem_map); - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_color(rgb_t::green()); - screen.set_raw(MASTER_CLOCK, 882, 9, 729, 315, 0, 300); // 80x25 - screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update)); + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 2x TC5514-APL + 3V battery - PALETTE(config, m_palette, 2).set_init("palette", FUNC(palette_device::palette_init_monochrome)); + // video hardware + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_color(rgb_t::green()); + m_screen->set_raw(MASTER_CLOCK, 882, 9, 729, 315, 0, 300); // 80x24+1 + m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update)); + + PALETTE(config, m_palette, 2).set_init("palette", FUNC(palette_device::palette_init_monochrome_highlight)); GFXDECODE(config, m_gfxdecode, m_palette, chars); H46505(config, m_crtc, MASTER_CLOCK / 9); m_crtc->set_screen("screen"); m_crtc->set_show_border_area(false); m_crtc->set_char_width(9); - m_crtc->set_update_row_callback(FUNC(lb4_state::crtc_update_row), this); + m_crtc->set_update_row_callback(FUNC(qvt102_state::crtc_update_row), this); m_crtc->out_vsync_callback().set_inputline(m_maincpu, M6800_IRQ_LINE); ACIA6850(config, m_acia, 0); @@ -145,24 +166,32 @@ void lb4_state::lb4(machine_config &config) rs232.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); rs232.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); - Z80CTC(config, m_ctc, MASTER_CLOCK / 4); // divider? + Z80CTC(config, m_ctc, MASTER_CLOCK / 9); m_ctc->set_clk<0>(MASTER_CLOCK / 18); m_ctc->set_clk<1>(MASTER_CLOCK / 18); m_ctc->zc_callback<0>().set(m_acia, FUNC(acia6850_device::write_txc)); m_ctc->zc_callback<0>().append(m_acia, FUNC(acia6850_device::write_rxc)); +// m_ctc->zc_callback<1>().set(m_acia, FUNC(acia6850_device::write_rxc)); + + I8748(config, "kbdmcu", XTAL(6'000'000)); } - -static INPUT_PORTS_START( lb4 ) +static INPUT_PORTS_START( qvt102 ) INPUT_PORTS_END -ROM_START( lb4 ) +ROM_START( qvt102 ) ROM_REGION( 0x2000, "maincpu", 0 ) - ROM_LOAD( "u8.bin", 0x0000, 0x2000, CRC(2e375abc) SHA1(12ad1e49c5773c36c3a8d65845c9a50f9dec141f) ) + ROM_SYSTEM_BIOS( 0, "1", "1" ) // no status bar by default + ROMX_LOAD( "u8.bin", 0x0000, 0x2000, CRC(2e375abc) SHA1(12ad1e49c5773c36c3a8d65845c9a50f9dec141f), ROM_BIOS(0) ) + ROM_SYSTEM_BIOS( 1, "2", "2" ) // status bar by default (+ more changes) + ROMX_LOAD( "t205m.u8", 0x0000, 0x2000, CRC(59cc04f6) SHA1(ee2e3a3ea7b57a231483fcc74266f0f3f51204af), ROM_BIOS(1) ) ROM_REGION( 0x1000, "chargen", 0 ) - ROM_LOAD( "u32.bin", 0x0000, 0x1000, CRC(f6d86e87) SHA1(c0885e4a35095a730d760bf91a1cf4e8edd6a2bb) ) + ROM_LOAD( "c3205m.u32", 0x0000, 0x1000, CRC(f6d86e87) SHA1(c0885e4a35095a730d760bf91a1cf4e8edd6a2bb) ) + + ROM_REGION(0x0400, "kbdmcu", 0) + ROM_LOAD( "k301.u302", 0x0000, 0x0400, CRC(67564b20) SHA1(5897ff920f8fae4aa498d3a4dfd45b58183c041d) ) ROM_END -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 197?, lb4, 0, 0, lb4, lb4, lb4_state, empty_init, "Liberty Electronics", "LB-4", MACHINE_NO_SOUND_HW ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1983, qvt102, 0, 0, qvt102, qvt102, qvt102_state, empty_init, "Qume", "QVT-102", MACHINE_NO_SOUND_HW ) diff --git a/src/mame/drivers/qvt6800.cpp b/src/mame/drivers/qvt6800.cpp index d628ec58d83..c8f22b5b4ee 100644 --- a/src/mame/drivers/qvt6800.cpp +++ b/src/mame/drivers/qvt6800.cpp @@ -8,7 +8,6 @@ Skeleton driver for M6800-based display terminals by Qume. #include "emu.h" #include "cpu/m6800/m6800.h" -#include "cpu/mcs48/mcs48.h" #include "machine/6850acia.h" #include "machine/nvram.h" #include "machine/z80ctc.h" @@ -26,12 +25,10 @@ public: { } void qvt190(machine_config &config); - void qvt102(machine_config &config); private: MC6845_UPDATE_ROW(update_row); - void qvt102_mem_map(address_map &map); void qvt190_mem_map(address_map &map); required_device m_maincpu; @@ -43,17 +40,6 @@ MC6845_UPDATE_ROW(qvt6800_state::update_row) { } -void qvt6800_state::qvt102_mem_map(address_map &map) -{ - map(0x0000, 0x03ff).ram().share("nvram"); - map(0x2800, 0x2803).w("ctc", FUNC(z80ctc_device::write)); - map(0x4000, 0x47ff).ram().share("videoram"); - map(0x8000, 0x8000).rw("crtc", FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); - map(0x8001, 0x8001).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); - map(0x9800, 0x9801).rw("acia", FUNC(acia6850_device::read), FUNC(acia6850_device::write)); - map(0xe000, 0xffff).rom().region("maincpu", 0); -} - void qvt6800_state::qvt190_mem_map(address_map &map) { map(0x0000, 0x07ff).ram().share("nvram"); @@ -68,34 +54,6 @@ void qvt6800_state::qvt190_mem_map(address_map &map) static INPUT_PORTS_START( qvt6800 ) INPUT_PORTS_END -MACHINE_CONFIG_START(qvt6800_state::qvt102) - MCFG_DEVICE_ADD("maincpu", M6800, XTAL(16'669'800) / 18) - MCFG_DEVICE_PROGRAM_MAP(qvt102_mem_map) - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 2x TC5514-APL + 3V battery - - //MCFG_DEVICE_ADD("crtc", MC6845, XTAL(16'669'800) / 9) - - MCFG_DEVICE_ADD("acia", ACIA6850, 0) - - z80ctc_device& ctc(Z80CTC(config, "ctc", XTAL(16'669'800) / 9)); - ctc.set_clk<0>(16.6698_MHz_XTAL / 18); // OR of CRTC CLK and ϕ1 - ctc.set_clk<1>(16.6698_MHz_XTAL / 18); // OR of CRTC CLK and ϕ1 - ctc.zc_callback<0>().set("acia", FUNC(acia6850_device::write_txc)); - ctc.zc_callback<1>().set("acia", FUNC(acia6850_device::write_rxc)); - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL(16'669'800), 882, 0, 720, 315, 0, 300) - MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) - - MCFG_DEVICE_ADD("crtc", MC6845, XTAL(16'669'800) / 9) - MCFG_MC6845_CHAR_WIDTH(9) - MCFG_MC6845_UPDATE_ROW_CB(qvt6800_state, update_row) - MCFG_VIDEO_SET_SCREEN("screen") - - MCFG_DEVICE_ADD("kbdmcu", I8748, XTAL(6'000'000)) -MACHINE_CONFIG_END - MACHINE_CONFIG_START(qvt6800_state::qvt190) MCFG_DEVICE_ADD("maincpu", M6800, XTAL(16'669'800) / 9) MCFG_DEVICE_PROGRAM_MAP(qvt190_mem_map) @@ -116,32 +74,6 @@ MACHINE_CONFIG_START(qvt6800_state::qvt190) MCFG_VIDEO_SET_SCREEN("screen") MACHINE_CONFIG_END - - -/************************************************************************************************************** - -Qume QVT-102. -Chips: HD46800DP (6800), HD46505SP (6845), HD46850P (6850), M58725P-15 (16k RAM), LH0082 (Z80CTC), Button battery -Crystals: 16.6698 -Keyboard: D8748D, 6.000, Beeper - -***************************************************************************************************************/ - -ROM_START( qvt102 ) - ROM_REGION(0x2000, "maincpu", 0) - ROM_LOAD( "t205m.u8", 0x0000, 0x2000, CRC(59cc04f6) SHA1(ee2e3a3ea7b57a231483fcc74266f0f3f51204af) ) - - ROM_REGION(0x1000, "chargen", 0) - ROM_LOAD( "c3205m.u32", 0x0000, 0x1000, CRC(f6d86e87) SHA1(c0885e4a35095a730d760bf91a1cf4e8edd6a2bb) ) - - ROM_REGION(0x0400, "kbdmcu", 0) - ROM_LOAD( "k301.u302", 0x0000, 0x0400, CRC(67564b20) SHA1(5897ff920f8fae4aa498d3a4dfd45b58183c041d) ) -ROM_END - -COMP( 1983, qvt102, 0, 0, qvt102, qvt6800, qvt6800_state, empty_init, "Qume", "QVT-102", MACHINE_IS_SKELETON ) - - - /************************************************************************************************************** Qume QVT-190. diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 803c4fa8221..fe6b4258695 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -18031,9 +18031,6 @@ medlanes // [1977?] @source:lb186.cpp lb186 // Ampro Little Board/186 -@source:lb4.cpp -lb4 // Liberty Electronics LB-4 - @source:lbeach.cpp lbeach // (c) 1979 Olympia / Seletron @@ -32920,6 +32917,9 @@ quizshow // 005464 1976/04 [2650] @source:qvt70.cpp qvt70 // +@source:qvt102.cpp +qvt102 // (c) 1983 Qume Corp. + @source:qvt103.cpp qvt103 // (c) 1983 Qume Corp. @@ -32927,7 +32927,6 @@ qvt103 // (c) 1983 Qume Corp. qvt201 // (c) 1986 Qume Corp. @source:qvt6800.cpp -qvt102 // qvt190 // @source:qx10.cpp diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 2bba09abed8..82f56132b24 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -366,7 +366,6 @@ krz2000.cpp kyocera.cpp laser3k.cpp lb186.cpp -lb4.cpp lc80.cpp lcmate2.cpp leapster.cpp @@ -605,6 +604,7 @@ pyl601.cpp ql.cpp qtsbc.cpp qvt70.cpp +qvt102.cpp qvt103.cpp qvt201.cpp qvt6800.cpp