qvt102: Previous 'LB4' was identified as Qume QVT-102

- Rename driver
- Remove skeleton QVT-102 we already had, add its alternate ROM to the
driver along with the keyboard MCU ROM
- Major gfx rendering update, supports all attributes but needs
verification
- Add NVRAM
This commit is contained in:
Dirk Best 2018-11-18 00:32:11 +01:00
parent 4b7285cb0e
commit fed9a5b345
5 changed files with 72 additions and 112 deletions

View File

@ -2851,6 +2851,7 @@ files {
createMESSProjects(_target, _subtarget, "qume") createMESSProjects(_target, _subtarget, "qume")
files { files {
MAME_DIR .. "src/mame/drivers/qvt70.cpp", 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/qvt103.cpp",
MAME_DIR .. "src/mame/drivers/qvt201.cpp", MAME_DIR .. "src/mame/drivers/qvt201.cpp",
MAME_DIR .. "src/mame/drivers/qvt6800.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/jade.cpp",
MAME_DIR .. "src/mame/drivers/jonos.cpp", MAME_DIR .. "src/mame/drivers/jonos.cpp",
MAME_DIR .. "src/mame/drivers/kron.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/leapster.cpp",
MAME_DIR .. "src/mame/drivers/lee1214.cpp", MAME_DIR .. "src/mame/drivers/lee1214.cpp",
MAME_DIR .. "src/mame/drivers/learnwin.cpp", MAME_DIR .. "src/mame/drivers/learnwin.cpp",

View File

@ -1,16 +1,19 @@
// license:BSD-3-Clause // 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: Known hardware:
- Motorola 6800 CPU - Motorola 6800 CPU
- Hitachi HD46505 (Motorola 6845-compatible) CRTC - Hitachi HD46505 (Motorola 6845-compatible) CRTC
- Hitachi HD46850 (Motorola 6850-compatible) ACIA - Hitachi HD46850 (Motorola 6850-compatible) ACIA
- M58725P-15 (16k RAM)
- Zilog Z8430 CTC - Zilog Z8430 CTC
- 16.6698MHz Crystal - 16.6698MHz Crystal
Keyboard: D8748D, 6.000, Beeper
Not sure what's going on here... the ACIA only has one serial channel, Not sure what's going on here... the ACIA only has one serial channel,
is it for the host, the printer, or the keyboard? is it for the host, the printer, or the keyboard?
@ -21,7 +24,9 @@
#include "emu.h" #include "emu.h"
#include "cpu/m6800/m6800.h" #include "cpu/m6800/m6800.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/6850acia.h" #include "machine/6850acia.h"
#include "machine/nvram.h"
#include "machine/z80ctc.h" #include "machine/z80ctc.h"
#include "video/mc6845.h" #include "video/mc6845.h"
#include "screen.h" #include "screen.h"
@ -30,22 +35,23 @@
#define MASTER_CLOCK 16.6698_MHz_XTAL #define MASTER_CLOCK 16.6698_MHz_XTAL
class lb4_state : public driver_device class qvt102_state : public driver_device
{ {
public: 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) : driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_acia(*this, "acia") , m_acia(*this, "acia")
, m_ctc(*this, "ctc") , m_ctc(*this, "ctc")
, m_crtc(*this, "crtc") , m_crtc(*this, "crtc")
, m_screen(*this, "screen")
, m_gfxdecode(*this, "gfxdecode") , m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette") , m_palette(*this, "palette")
, m_p_videoram(*this, "videoram") , m_p_videoram(*this, "videoram")
, m_p_chargen(*this, "chargen") , m_p_chargen(*this, "chargen")
{ } { }
void lb4(machine_config &config); void qvt102(machine_config &config);
private: private:
void mem_map(address_map &map); void mem_map(address_map &map);
@ -55,15 +61,16 @@ private:
required_device<acia6850_device> m_acia; required_device<acia6850_device> m_acia;
required_device<z80ctc_device> m_ctc; required_device<z80ctc_device> m_ctc;
required_device<h46505_device> m_crtc; required_device<h46505_device> m_crtc;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_p_videoram; required_shared_ptr<uint8_t> m_p_videoram;
required_region_ptr<u8> m_p_chargen; required_region_ptr<u8> 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(0x2800, 0x2803).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
map(0x3000, 0x3000).nopr(); map(0x3000, 0x3000).nopr();
map(0x3800, 0x3800).nopw(); // many writes of 43 and 4B 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); map(0xe000, 0xffff).rom().region("maincpu", 0);
} }
// identical to esprit.cpp MC6845_UPDATE_ROW( qvt102_state::crtc_update_row )
MC6845_UPDATE_ROW(lb4_state::crtc_update_row)
{ {
const rgb_t *palette = m_palette->palette()->entry_list_raw(); 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++) for (int x = 0; x < x_count; x++)
{ {
uint16_t mem = (ma + x) & 0x7ff; uint16_t mem = (ma + x) & 0x7ff;
uint8_t chr = m_p_videoram[mem]; 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) */ // check for new attribute
*p++ = palette[BIT(gfx, 8)]; if (chr >= 0x90 && chr <= 0x9f)
*p++ = palette[BIT(gfx, 7)]; attr = chr;
*p++ = palette[BIT(gfx, 6)];
*p++ = palette[BIT(gfx, 5)]; // draw 9 pixels of the character
*p++ = palette[BIT(gfx, 4)]; for (int i = 0; i < 9; i++)
*p++ = palette[BIT(gfx, 3)]; {
*p++ = palette[BIT(gfx, 2)]; int pixel = BIT(gfx, i);
*p++ = palette[BIT(gfx, 1)]; int half = BIT(chr, 7);
*p++ = palette[BIT(gfx, 0)];
// 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_ENTRY("chargen", 0, char_layout, 0, 1)
GFXDECODE_END GFXDECODE_END
void lb4_state::lb4(machine_config &config) void qvt102_state::qvt102(machine_config &config)
{ {
M6800(config, m_maincpu, MASTER_CLOCK / 18); 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 */ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 2x TC5514-APL + 3V battery
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));
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); GFXDECODE(config, m_gfxdecode, m_palette, chars);
H46505(config, m_crtc, MASTER_CLOCK / 9); H46505(config, m_crtc, MASTER_CLOCK / 9);
m_crtc->set_screen("screen"); m_crtc->set_screen("screen");
m_crtc->set_show_border_area(false); m_crtc->set_show_border_area(false);
m_crtc->set_char_width(9); 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); m_crtc->out_vsync_callback().set_inputline(m_maincpu, M6800_IRQ_LINE);
ACIA6850(config, m_acia, 0); 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.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
rs232.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); 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<0>(MASTER_CLOCK / 18);
m_ctc->set_clk<1>(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>().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<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( qvt102 )
static INPUT_PORTS_START( lb4 )
INPUT_PORTS_END INPUT_PORTS_END
ROM_START( lb4 ) ROM_START( qvt102 )
ROM_REGION( 0x2000, "maincpu", 0 ) 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_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 ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS // 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 ) COMP( 1983, qvt102, 0, 0, qvt102, qvt102, qvt102_state, empty_init, "Qume", "QVT-102", MACHINE_NO_SOUND_HW )

View File

@ -8,7 +8,6 @@ Skeleton driver for M6800-based display terminals by Qume.
#include "emu.h" #include "emu.h"
#include "cpu/m6800/m6800.h" #include "cpu/m6800/m6800.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/6850acia.h" #include "machine/6850acia.h"
#include "machine/nvram.h" #include "machine/nvram.h"
#include "machine/z80ctc.h" #include "machine/z80ctc.h"
@ -26,12 +25,10 @@ public:
{ } { }
void qvt190(machine_config &config); void qvt190(machine_config &config);
void qvt102(machine_config &config);
private: private:
MC6845_UPDATE_ROW(update_row); MC6845_UPDATE_ROW(update_row);
void qvt102_mem_map(address_map &map);
void qvt190_mem_map(address_map &map); void qvt190_mem_map(address_map &map);
required_device<cpu_device> m_maincpu; required_device<cpu_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) void qvt6800_state::qvt190_mem_map(address_map &map)
{ {
map(0x0000, 0x07ff).ram().share("nvram"); map(0x0000, 0x07ff).ram().share("nvram");
@ -68,34 +54,6 @@ void qvt6800_state::qvt190_mem_map(address_map &map)
static INPUT_PORTS_START( qvt6800 ) static INPUT_PORTS_START( qvt6800 )
INPUT_PORTS_END 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) MACHINE_CONFIG_START(qvt6800_state::qvt190)
MCFG_DEVICE_ADD("maincpu", M6800, XTAL(16'669'800) / 9) MCFG_DEVICE_ADD("maincpu", M6800, XTAL(16'669'800) / 9)
MCFG_DEVICE_PROGRAM_MAP(qvt190_mem_map) MCFG_DEVICE_PROGRAM_MAP(qvt190_mem_map)
@ -116,32 +74,6 @@ MACHINE_CONFIG_START(qvt6800_state::qvt190)
MCFG_VIDEO_SET_SCREEN("screen") MCFG_VIDEO_SET_SCREEN("screen")
MACHINE_CONFIG_END 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. Qume QVT-190.

View File

@ -18031,9 +18031,6 @@ medlanes // [1977?]
@source:lb186.cpp @source:lb186.cpp
lb186 // Ampro Little Board/186 lb186 // Ampro Little Board/186
@source:lb4.cpp
lb4 // Liberty Electronics LB-4
@source:lbeach.cpp @source:lbeach.cpp
lbeach // (c) 1979 Olympia / Seletron lbeach // (c) 1979 Olympia / Seletron
@ -32920,6 +32917,9 @@ quizshow // 005464 1976/04 [2650]
@source:qvt70.cpp @source:qvt70.cpp
qvt70 // qvt70 //
@source:qvt102.cpp
qvt102 // (c) 1983 Qume Corp.
@source:qvt103.cpp @source:qvt103.cpp
qvt103 // (c) 1983 Qume Corp. qvt103 // (c) 1983 Qume Corp.
@ -32927,7 +32927,6 @@ qvt103 // (c) 1983 Qume Corp.
qvt201 // (c) 1986 Qume Corp. qvt201 // (c) 1986 Qume Corp.
@source:qvt6800.cpp @source:qvt6800.cpp
qvt102 //
qvt190 // qvt190 //
@source:qx10.cpp @source:qx10.cpp

View File

@ -366,7 +366,6 @@ krz2000.cpp
kyocera.cpp kyocera.cpp
laser3k.cpp laser3k.cpp
lb186.cpp lb186.cpp
lb4.cpp
lc80.cpp lc80.cpp
lcmate2.cpp lcmate2.cpp
leapster.cpp leapster.cpp
@ -605,6 +604,7 @@ pyl601.cpp
ql.cpp ql.cpp
qtsbc.cpp qtsbc.cpp
qvt70.cpp qvt70.cpp
qvt102.cpp
qvt103.cpp qvt103.cpp
qvt201.cpp qvt201.cpp
qvt6800.cpp qvt6800.cpp