mirror of
https://github.com/holub/mame
synced 2025-07-05 18:08:04 +03:00
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:
parent
4b7285cb0e
commit
fed9a5b345
@ -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",
|
||||
|
@ -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<acia6850_device> m_acia;
|
||||
required_device<z80ctc_device> m_ctc;
|
||||
required_device<h46505_device> m_crtc;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
required_shared_ptr<uint8_t> m_p_videoram;
|
||||
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(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 )
|
@ -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<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)
|
||||
{
|
||||
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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user