This commit is contained in:
mooglyguy 2019-06-18 14:42:36 +02:00
commit 72ffd2fedb
13 changed files with 626 additions and 474 deletions

View File

@ -1212,7 +1212,7 @@ function linkProjects_mame_mess(_target, _subtarget)
"svi",
"svision",
"swtpc",
"synertec",
"synertek",
"ta",
"tandberg",
"tangerin",
@ -3331,8 +3331,9 @@ files {
MAME_DIR .. "src/mame/machine/swtpc09.cpp",
}
createMESSProjects(_target, _subtarget, "synertec")
createMESSProjects(_target, _subtarget, "synertek")
files {
MAME_DIR .. "src/mame/drivers/ktm3.cpp",
MAME_DIR .. "src/mame/drivers/sym1.cpp",
}
@ -3452,8 +3453,6 @@ files {
MAME_DIR .. "src/mame/drivers/evmbug.cpp",
MAME_DIR .. "src/mame/drivers/exelv.cpp",
MAME_DIR .. "src/mame/drivers/geneve.cpp",
MAME_DIR .. "src/mame/machine/screenless.cpp", -- delete soon
MAME_DIR .. "src/mame/includes/screenless.h", -- delete soon
MAME_DIR .. "src/mame/drivers/hh_tms1k.cpp",
MAME_DIR .. "src/mame/includes/hh_tms1k.h",
MAME_DIR .. "src/mame/drivers/tispeak.cpp", -- subdriver of hh_tms1k

View File

@ -2047,6 +2047,9 @@ void validity_checker::validate_device_types()
char const *name((dev->shortname() && *dev->shortname()) ? dev->shortname() : type.type().name());
std::string const description((dev->source() && *dev->source()) ? util::string_format("%s(%s)", core_filename_extract_base(dev->source()).c_str(), name) : name);
if (m_print_verbose)
output_via_delegate(OSD_OUTPUT_CHANNEL_ERROR, "Validating device %s...\n", description.c_str());
// ensure shortname exists
if (!dev->shortname() || !*dev->shortname())
{

View File

@ -206,6 +206,7 @@ const double XTAL::known_xtals[] = {
14'705'882, /* 14.705882_MHz_XTAL Aleck64 */
14'728'000, /* 14.728_MHz_XTAL ADM 36 */
14'742'800, /* 14.7428_MHz_XTAL ADM 23 */
14'745'000, /* 14.745_MHz_XTAL Synertek KTM-3 */
14'745'600, /* 14.7456_MHz_XTAL Namco System 12 & System Super 22/23 for JVS */
14'784'000, /* 14.784_MHz_XTAL Zenith Z-29 */
14'916'000, /* 14.916_MHz_XTAL ADDS Viewpoint 122 */

File diff suppressed because it is too large Load Diff

298
src/mame/drivers/ktm3.cpp Normal file
View File

@ -0,0 +1,298 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/*******************************************************************************
KTM-3 (c) 1980 Synertek Systems Corp.
This is a sort of single-board video display terminal. The second 6502,
which uses part of the same program ROM as the first 6502 and runs on the
inverse phases of its clock, appears to function as a crude CRTC,
generating character addresses and sync signals with its address outputs.
Only a few address lines are decoded at all. The resulting mirroring might
not be accurately emulated yet.
*******************************************************************************/
#include "emu.h"
#include "bus/rs232/rs232.h"
#include "cpu/m6502/m6502.h"
#include "machine/clock.h"
#include "machine/mos6551.h"
#include "screen.h"
class ktm3_state : public driver_device
{
public:
ktm3_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_pcpu(*this, "pcpu")
, m_vcpu(*this, "vcpu")
, m_acia(*this, "acia")
, m_key_matrix(*this, "KEY%u", 0U)
, m_option_sw(*this, "OPTION")
, m_chargen(*this, "chargen")
, m_ram(*this, "ram%u", 0U)
{
}
void ktm3(machine_config &config);
DECLARE_READ_LINE_MEMBER(ac_r);
template <int N> DECLARE_READ_LINE_MEMBER(sw_r);
protected:
virtual void machine_start() override;
private:
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
u8 allram_r(offs_t offset);
void allram_w(offs_t offset, u8 data);
u8 keyboard_r(offs_t offset);
void pcpu_map(address_map &map);
void vcpu_map(address_map &map);
DECLARE_WRITE_LINE_MEMBER(signal_w);
required_device<cpu_device> m_pcpu;
required_device<cpu_device> m_vcpu;
required_device<mos6551_device> m_acia;
required_ioport_array<10> m_key_matrix;
required_ioport m_option_sw;
required_region_ptr<u8> m_chargen;
required_shared_ptr_array<u8, 2> m_ram;
bool m_signal;
};
void ktm3_state::machine_start()
{
m_acia->write_cts(0);
save_item(NAME(m_signal));
}
u32 ktm3_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
return 0;
}
u8 ktm3_state::allram_r(offs_t offset)
{
return m_ram[0][offset] & m_ram[1][offset];
}
void ktm3_state::allram_w(offs_t offset, u8 data)
{
m_ram[0][offset] = m_ram[1][offset] = data;
}
u8 ktm3_state::keyboard_r(offs_t offset)
{
u8 ret = 0xff;
for (int i = 0; i < 10; i++)
if (BIT(offset, i))
ret &= m_key_matrix[i]->read();
return ret ^ 0xff;
}
void ktm3_state::pcpu_map(address_map &map)
{
map(0x0000, 0x03ff).mirror(0xf000).rw(FUNC(ktm3_state::allram_r), FUNC(ktm3_state::allram_w));
map(0x0400, 0x0400).mirror(0xe3ff).portr("SPECIAL");
map(0x0800, 0x0bff).mirror(0xe000).r(FUNC(ktm3_state::keyboard_r));
map(0x1400, 0x17ff).mirror(0xe000).ram().share("ram0"); // 2x SY2114L-3
map(0x1800, 0x1bff).mirror(0xc000).ram().share("ram1"); // 2x SY2114L-3
map(0x3800, 0x3fff).mirror(0xc000).rom().region("program", 0x000);
map(0x5c00, 0x5c03).mirror(0x83fc).rw(m_acia, FUNC(mos6551_device::read), FUNC(mos6551_device::write));
}
void ktm3_state::vcpu_map(address_map &map)
{
map(0x0000, 0x00ff).mirror(0xf800).rw(FUNC(ktm3_state::allram_r), FUNC(ktm3_state::allram_w));
map(0x0100, 0x01ff).mirror(0xfc00).rom().region("program", 0x000);
map(0x0300, 0x03ff).mirror(0xfc00).rom().region("program", 0x100);
}
WRITE_LINE_MEMBER(ktm3_state::signal_w)
{
m_signal = state;
}
READ_LINE_MEMBER(ktm3_state::ac_r)
{
return m_signal;
}
template <int N>
READ_LINE_MEMBER(ktm3_state::sw_r)
{
return BIT(m_option_sw->read(), N);
}
static INPUT_PORTS_START(ktm3)
PORT_START("KEY0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x1b) PORT_NAME("Esc") PORT_CODE(KEYCODE_TAB)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR(')') PORT_CODE(KEYCODE_9)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
PORT_START("KEY1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('"') PORT_CODE(KEYCODE_2)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CODE(KEYCODE_0)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
PORT_START("KEY2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(':') PORT_CHAR('*') PORT_CODE(KEYCODE_MINUS)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR('+') PORT_CODE(KEYCODE_COLON)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL)
PORT_START("KEY3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('=') PORT_CODE(KEYCODE_EQUALS)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x0a) PORT_NAME("Line Feed") PORT_CODE(KEYCODE_RALT) // actually between P and Return key
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('@') PORT_CHAR('`') PORT_CODE(KEYCODE_QUOTE)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<0>)
PORT_START("KEY4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('^') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE) // actually between - and Home/Clear keys
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x0d) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE) // actually to right of @ `
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<1>)
PORT_START("KEY5")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('&') PORT_CODE(KEYCODE_6)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_NAME("Home Clear") PORT_CODE(KEYCODE_HOME)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('_') PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CODE(KEYCODE_BACKSPACE) // actually to right of Return key
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<2>)
PORT_START("KEY6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('\'') PORT_CODE(KEYCODE_7)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<3>)
PORT_START("KEY7")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('(') PORT_CODE(KEYCODE_8)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_RCONTROL)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<4>)
PORT_START("KEY8")
PORT_BIT(0x7f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<5>)
PORT_START("KEY9")
PORT_BIT(0x7f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<6>)
PORT_START("OPTION")
PORT_DIPNAME(0x01, 0x01, DEF_STR(Unused)) PORT_DIPLOCATION("SW:1")
PORT_DIPSETTING(0x01, DEF_STR(Off))
PORT_DIPSETTING(0x00, DEF_STR(On))
PORT_DIPNAME(0x02, 0x00, "Conversation Mode") PORT_DIPLOCATION("SW:2")
PORT_DIPSETTING(0x02, "Half Duplex")
PORT_DIPSETTING(0x00, "Full Duplex")
PORT_DIPNAME(0x04, 0x04, "Stop Bits") PORT_DIPLOCATION("SW:3")
PORT_DIPSETTING(0x04, "1")
PORT_DIPSETTING(0x00, "2")
PORT_DIPNAME(0x18, 0x18, "Parity") PORT_DIPLOCATION("SW:4,5")
PORT_DIPSETTING(0x00, "Even")
PORT_DIPSETTING(0x08, "Odd")
PORT_DIPSETTING(0x10, "Mark")
PORT_DIPSETTING(0x18, "Space")
PORT_DIPNAME(0xe0, 0xc0, "Baud Rate") PORT_DIPLOCATION("SW:6,7,8")
PORT_DIPSETTING(0x00, "109.92")
PORT_DIPSETTING(0x20, "300")
PORT_DIPSETTING(0x40, "600")
PORT_DIPSETTING(0x60, "1200")
PORT_DIPSETTING(0x80, "2400")
PORT_DIPSETTING(0xa0, "4800")
PORT_DIPSETTING(0xc0, "9600")
PORT_DIPSETTING(0xe0, "19200")
PORT_START("SPECIAL")
PORT_BIT(0x3f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, ac_r)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, ktm3_state, sw_r<7>)
PORT_START("JUMPER")
PORT_DIPNAME(0x01, 0x00, "Columns") PORT_DIPLOCATION("J1:1")
PORT_DIPSETTING(0x01, "40")
PORT_DIPSETTING(0x00, "80")
INPUT_PORTS_END
void ktm3_state::ktm3(machine_config &config)
{
M6502(config, m_pcpu, 14.745_MHz_XTAL / 15); // SY6502 at U2; divider not verified
m_pcpu->set_addrmap(AS_PROGRAM, &ktm3_state::pcpu_map);
M6502(config, m_vcpu, 14.745_MHz_XTAL / 15); // SY6502 at U1; divider not verified
m_vcpu->set_addrmap(AS_PROGRAM, &ktm3_state::vcpu_map);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(14.745_MHz_XTAL, 930, 0, 600, 262, 0, 240); // parameters guessed
screen.set_screen_update(FUNC(ktm3_state::screen_update));
MOS6551(config, m_acia, 14.745_MHz_XTAL / 15); // SY6551
m_acia->set_xtal(14.745_MHz_XTAL / 8);
m_acia->irq_handler().set_inputline(m_pcpu, m6502_device::IRQ_LINE);
m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
m_acia->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts));
m_acia->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr));
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "loopback"));
rs232.rxd_handler().set(m_acia, FUNC(mos6551_device::write_rxd));
rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
rs232.dcd_handler().set(m_acia, FUNC(mos6551_device::write_dcd));
CLOCK(config, "60hz", 60).signal_handler().set(FUNC(ktm3_state::signal_w));
}
ROM_START(ktm3)
ROM_REGION(0x800, "program", 0)
ROM_LOAD("02-9001-126.bin", 0x000, 0x800, CRC(d7441e28) SHA1(bf0c05bfdcfd9083183325336d9702c67b7de63c))
ROM_REGION(0x800, "chargen", 0)
ROM_LOAD("02-0061-a.bin", 0x000, 0x800, CRC(9739e2ac) SHA1(672059b7618afb6c19632663d58a854ea9ec2401))
ROM_END
COMP(1980, ktm3, 0, 0, ktm3, ktm3, ktm3_state, empty_init, "Synertek Systems", "KTM-3", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW)

View File

@ -85,7 +85,7 @@ INPUT_PORTS_END
static const gfx_layout char_layout =
{
8,12,
RGN_FRAC(1,1),
RGN_FRAC(1,1), // 512
1,
{ 0 },
{ STEP8(0,1) },
@ -93,8 +93,24 @@ static const gfx_layout char_layout =
8*16
};
static const gfx_layout drawing_char_layout =
{
8,12,
16,
1,
{ 0 },
{ STEP8(0,1) },
{
0x000*8+12*8, 0x000*8+13*8, 0x000*8+14*8, 0x000*8+15*8,
0x200*8+12*8, 0x200*8+13*8, 0x200*8+14*8, 0x200*8+15*8,
0x400*8+12*8, 0x400*8+13*8, 0x400*8+14*8, 0x400*8+15*8
},
8*16
};
static GFXDECODE_START(chars)
GFXDECODE_ENTRY("chargen", 0, char_layout, 0, 1)
GFXDECODE_ENTRY("chargen", 0, drawing_char_layout, 0, 1)
GFXDECODE_END
void qvt190_state::qvt190(machine_config &config)

View File

@ -13,6 +13,7 @@ Skeleton driver for Qume QVT-201 & QVT-202 display terminals.
#include "machine/mc68681.h"
#include "machine/nvram.h"
#include "video/scn2674.h"
#include "emupal.h"
#include "screen.h"
class qvt201_state : public driver_device
@ -99,6 +100,40 @@ void qvt201_state::mem_map(address_map &map)
static INPUT_PORTS_START( qvt201 )
INPUT_PORTS_END
static const gfx_layout char_layout =
{
8,10,
RGN_FRAC(1,1), // 256
1,
{ 0 },
{ STEP8(0,1) },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8 },
8*16
};
// ascii control code chars
// those are also at 0x80 to 0x9f in the normal char decode
// don't know why they are duplicated here
static const gfx_layout ctrl_char_layout =
{
8,10,
RGN_FRAC(1,4), // 32
1,
{ 0 },
{ STEP8(0,1) },
{ 10*8, 11*8, 12*8, 13*8, 14*8, 16*8+10*8, 16*8+11*8, 16*8+12*8, 16*8+13*8, 16*8+14*8 },
8*32
};
// 64 bytes of data remain undecoded
// byte 10 and 11 from 0x400 to 0x7ff in the rom
// (0x000 to 0x3ff are the control chars above, 0x800 to 0xfff is 0xff)
static GFXDECODE_START(chars)
GFXDECODE_ENTRY("chargen", 0, char_layout, 0, 1)
GFXDECODE_ENTRY("chargen", 0, ctrl_char_layout, 0, 1)
GFXDECODE_END
void qvt201_state::qvt201(machine_config &config)
{
Z80(config, m_maincpu, 3.6864_MHz_XTAL);
@ -130,6 +165,10 @@ void qvt201_state::qvt201(machine_config &config)
//screen.set_raw(48.654_MHz_XTAL / 2, 170 * 9, 0, 132 * 9, 265, 0, 250);
screen.set_screen_update("crtc", FUNC(scn2672_device::screen_update));
PALETTE(config, "palette", palette_device::MONOCHROME_HIGHLIGHT);
GFXDECODE(config, "gfxdecode", "palette", chars);
scn2672_device &crtc(SCN2672(config, "crtc", 48.654_MHz_XTAL / 30));
crtc.set_character_width(10); // 9 in 132-column mode
crtc.intr_callback().set("mainint", FUNC(input_merger_device::in_w<0>));

View File

@ -2033,12 +2033,24 @@ ROM_START(corv_px4)
ROM_REGION(0x80000, "maincpu", 0)
ROM_LOAD("u6-px4.rom", 0x00000, 0x80000, CRC(a5f22149) SHA1(e0b0bce31b1e66e6b74930c3184f87ebec400f80))
ROM_REGION16_LE(0x1000000, "dcs", ROMREGION_ERASEFF)
ROM_LOAD16_BYTE("corvsnd2", 0x000000, 0x080000, CRC(630d20a3) SHA1(c7b6cbc7f23c1f9c149a3ef32e84ca8797ff8026))
ROM_LOAD16_BYTE("corvsnd3", 0x200000, 0x080000, CRC(6ace0353) SHA1(dec5b6f129ee6b7c0d03c1677d6b71672dd25a5a))
ROM_LOAD16_BYTE("corvsnd4", 0x400000, 0x080000, CRC(87807278) SHA1(ba01b44c0ad6d10163a8aed2211539d541e69449))
ROM_LOAD16_BYTE("corvsnd5", 0x600000, 0x080000, CRC(35f82c21) SHA1(ee14489e5629e9cd5622a56849fab65b94ff9b59))
ROM_LOAD16_BYTE("corvsnd6", 0x800000, 0x080000, CRC(61e56d90) SHA1(41388523fca4839132d3f7e117bdac9ea9f4020c))
ROM_LOAD16_BYTE("corvsnd7", 0xa00000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004))
ROM_LOAD16_BYTE("su2-sl1.rom", 0x000000, 0x080000, CRC(141d280e) SHA1(ab1e8e38b9fa0e693837c93616f0821e25b31588))
ROM_LOAD16_BYTE("corvsnd3", 0x200000, 0x080000, CRC(6ace0353) SHA1(dec5b6f129ee6b7c0d03c1677d6b71672dd25a5a))
ROM_LOAD16_BYTE("corvsnd4", 0x400000, 0x080000, CRC(87807278) SHA1(ba01b44c0ad6d10163a8aed2211539d541e69449))
ROM_LOAD16_BYTE("corvsnd5", 0x600000, 0x080000, CRC(35f82c21) SHA1(ee14489e5629e9cd5622a56849fab65b94ff9b59))
ROM_LOAD16_BYTE("corvsnd6", 0x800000, 0x080000, CRC(61e56d90) SHA1(41388523fca4839132d3f7e117bdac9ea9f4020c))
ROM_LOAD16_BYTE("corvsnd7", 0xa00000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004))
ROM_END
ROM_START(corv_px3)
ROM_REGION(0x80000, "maincpu", 0)
ROM_LOAD("u6-px3.rom", 0x00000, 0x80000, CRC(5a363db8) SHA1(19eea89bf1ab3cc84c5b67eac00d8be4e65249f6))
ROM_REGION16_LE(0x1000000, "dcs", ROMREGION_ERASEFF)
ROM_LOAD16_BYTE("su2-sp2.rom", 0x000000, 0x080000, CRC(9ae4bf31) SHA1(a33978d9ac8ffdc7b8719c803edd3e804f0dd886))
ROM_LOAD16_BYTE("corvsnd3", 0x200000, 0x080000, CRC(6ace0353) SHA1(dec5b6f129ee6b7c0d03c1677d6b71672dd25a5a))
ROM_LOAD16_BYTE("corvsnd4", 0x400000, 0x080000, CRC(87807278) SHA1(ba01b44c0ad6d10163a8aed2211539d541e69449))
ROM_LOAD16_BYTE("corvsnd5", 0x600000, 0x080000, CRC(35f82c21) SHA1(ee14489e5629e9cd5622a56849fab65b94ff9b59))
ROM_LOAD16_BYTE("corvsnd6", 0x800000, 0x080000, CRC(61e56d90) SHA1(41388523fca4839132d3f7e117bdac9ea9f4020c))
ROM_LOAD16_BYTE("corvsnd7", 0xa00000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004))
ROM_END
ROM_START(corv_la1)
@ -2754,7 +2766,8 @@ ROM_START(tfs_12)
ROM_END
GAME(1994, corv_21, 0, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (2.1)", MACHINE_MECHANICAL)
GAME(1994, corv_px4, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (PX4)", MACHINE_MECHANICAL)
GAME(1994, corv_px4, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (PX4 Prototype)", MACHINE_MECHANICAL)
GAME(1994, corv_px3, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (PX3 Prototype)", MACHINE_MECHANICAL)
GAME(1994, corv_lx1, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (LX1)", MACHINE_MECHANICAL)
GAME(1994, corv_lx2, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (LX2)", MACHINE_MECHANICAL)
GAME(1994, corv_la1, corv_21, wpc_s, corv, wpc_s_state, init_corv, ROT0, "Bally", "Corvette (LA1)", MACHINE_MECHANICAL)

View File

@ -11,8 +11,6 @@
#pragma once
#include "includes/screenless.h"
#include "cpu/tms1000/tms1000.h"
#include "cpu/tms1000/tms1000c.h"
#include "cpu/tms1000/tms1100.h"
@ -25,11 +23,11 @@
#include "sound/spkrdev.h"
class hh_tms1k_state : public screenless_state
class hh_tms1k_state : public driver_device
{
public:
hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) :
screenless_state(mconfig, type, tag),
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_display(*this, "display"),
m_speaker(*this, "speaker"),

View File

@ -1,74 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
Generic screenless base class
implementation is in machine/screenless.cpp
******************************************************************************/
#ifndef MAME_INCLUDES_SCREENLESS_H
#define MAME_INCLUDES_SCREENLESS_H
#pragma once
class screenless_state : public driver_device
{
public:
screenless_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_out_x(*this, "%u.%u", 0U, 0U),
m_out_a(*this, "%u.a", 0U),
m_out_digit(*this, "digit%u", 0U),
m_display_maxy(0),
m_display_maxx(-1)
{
// set defaults (60hz frames, 0.5 interpolation, 1 brightness level)
set_display_duration(attotime::from_hz(60));
set_display_factor(0.5);
set_display_levels(0.02);
}
protected:
output_finder<0x20, 0x40> m_out_x; // max 32, 63
output_finder<0x20> m_out_a;
output_finder<0x20> m_out_digit;
int m_display_maxy; // display matrix number of rows
int m_display_maxx; // display matrix number of columns
u64 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
void set_display_duration(attotime duration);
void set_display_factor(double factor);
void reset_display_levels();
void set_display_level(u8 i, double level);
void set_display_levels(double l0, double l1 = 1.0, double l2 = 1.0, double l3 = 1.0);
void set_display_size(int maxx, int maxy);
void set_display_segmask(u32 digits, u32 mask);
void display_matrix(int maxx, int maxy, u64 setx, u32 sety, bool update = true);
virtual void display_update();
bool display_element_on(u32 x, u32 y);
virtual void machine_start() override;
private:
u64 m_ds_prev[0x20];
double m_ds_bri[0x20][0x40];
attotime m_ds_acc[0x20][0x40];
attotime m_ds_update_time;
attotime m_ds_frame_time;
attotime m_ds_frame_time_set;
double m_ds_frame_factor;
double m_ds_level[0x100];
emu_timer *m_display_frame_timer;
TIMER_CALLBACK_MEMBER(display_frame);
void display_schedule_frame();
};
#endif // MAME_INCLUDES_SCREENLESS_H

View File

@ -1,204 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
Generic screenless base class
This file contains helpers for strobed display elements.
TODO:
- use pwm_display_device, remove this file
******************************************************************************/
#include "emu.h"
#include "includes/screenless.h"
#include <algorithm>
// machine start
ALLOW_SAVE_TYPE(attotime); // m_ds_acc
void screenless_state::machine_start()
{
// resolve handlers
m_out_x.resolve();
m_out_a.resolve();
m_out_digit.resolve();
// initialize
std::fill_n(m_display_state, ARRAY_LENGTH(m_display_state), 0);
std::fill_n(m_ds_prev, ARRAY_LENGTH(m_ds_prev), 0);
std::fill_n(m_display_segmask, ARRAY_LENGTH(m_display_segmask), 0);
std::fill_n(*m_ds_bri, ARRAY_LENGTH(m_ds_bri) * ARRAY_LENGTH(m_ds_bri[0]), 0.0);
m_display_frame_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(screenless_state::display_frame),this));
display_schedule_frame();
m_ds_update_time = machine().time();
// register for savestates
save_item(NAME(m_display_maxy));
save_item(NAME(m_display_maxx));
save_item(NAME(m_display_state));
save_item(NAME(m_display_segmask));
save_item(NAME(m_ds_prev));
save_item(NAME(m_ds_bri));
save_item(NAME(m_ds_acc));
save_item(NAME(m_ds_update_time));
save_item(NAME(m_ds_frame_time));
save_item(NAME(m_ds_frame_time_set));
save_item(NAME(m_ds_frame_factor));
save_item(NAME(m_ds_level));
}
// public interface
void screenless_state::set_display_duration(attotime duration)
{
// set frame duration
m_ds_frame_time_set = duration;
}
void screenless_state::set_display_factor(double factor)
{
// set frame interpolation (factor * curframe, 1.0-factor * prev frame)
// factor range is 0.0 to 1.0
m_ds_frame_factor = factor;
}
void screenless_state::reset_display_levels()
{
std::fill_n(m_ds_level, ARRAY_LENGTH(m_ds_level), 1.0);
}
void screenless_state::set_display_level(u8 i, double level)
{
// set a brightness level, range is 0.0 to 1.0
m_ds_level[i] = level;
}
void screenless_state::set_display_levels(double l0, double l1, double l2, double l3)
{
// init brightness level(s) (if you need to set more than 4, use set_display_level)
reset_display_levels();
m_ds_level[0] = l0;
m_ds_level[1] = l1;
m_ds_level[2] = l2;
m_ds_level[3] = l3;
}
void screenless_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
void screenless_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
{
if (digits & 1)
m_display_segmask[i] = mask;
digits >>= 1;
}
}
void screenless_state::display_matrix(int maxx, int maxy, u64 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
u64 mask = (u64(1) << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (u64(1) << maxx)) : 0;
if (update)
display_update();
}
void screenless_state::display_update()
{
// call this every time m_display_state is changed (automatic with display_matrix)
const attotime now = machine().time();
const attotime diff = (m_ds_update_time >= now) ? attotime::zero : now - m_ds_update_time;
// accumulate active time
for (int y = 0; y < m_display_maxy; y++)
{
u64 row = m_ds_prev[y];
m_ds_prev[y] = m_display_state[y];
if (diff != attotime::zero)
{
for (int x = 0; x <= m_display_maxx; x++)
{
if (BIT(row, x))
m_ds_acc[y][x] += diff;
}
}
}
m_ds_update_time = now;
}
bool screenless_state::display_element_on(u32 x, u32 y)
{
// display element active state
return m_ds_bri[y][x] > m_ds_level[0];
}
// internal handlers
void screenless_state::display_schedule_frame()
{
std::fill_n(*m_ds_acc, ARRAY_LENGTH(m_ds_acc) * ARRAY_LENGTH(m_ds_acc[0]), attotime::zero);
m_ds_frame_time = m_ds_frame_time_set;
m_display_frame_timer->adjust(m_ds_frame_time);
}
TIMER_CALLBACK_MEMBER(screenless_state::display_frame)
{
display_update();
const double frame_time = m_ds_frame_time.as_double();
const double factor0 = m_ds_frame_factor;
const double factor1 = 1.0 - factor0;
for (int y = 0; y < m_display_maxy; y++)
{
u64 row = 0;
for (int x = 0; x <= m_display_maxx; x++)
{
// determine brightness level
double bri = m_ds_bri[y][x] * factor1 + (m_ds_acc[y][x].as_double() / frame_time) * factor0;
if (bri > 1.0) bri = 1.0; // shouldn't happen
m_ds_bri[y][x] = bri;
u8 level;
for (level = 0; bri > m_ds_level[level]; level++) { ; }
if (level > 0)
row |= (u64(1) << x);
// output to y.x, or y.a when always-on
if (x != m_display_maxx)
m_out_x[y][x] = level;
else
m_out_a[y] = level;
}
// output to digity
if (m_display_segmask[y] != 0)
m_out_digit[y] = row & m_display_segmask[y];
}
display_schedule_frame();
}

View File

@ -18243,6 +18243,9 @@ salarymc // 2000 - Salary Man Champ (G*A18 VER. JAA)
stepchmp // 1999 - Step Champ (GE930 VER. JA)
sys573 //
@source:ktm3.cpp
ktm3 // (c) 1980 Synertek Systems Corp.
@source:kungfur.cpp
kungfur // (c) 1987
@ -40045,6 +40048,7 @@ corv_21 //
corv_la1 //
corv_lx1 //
corv_lx2 //
corv_px3 //
corv_px4 //
dh_lf2 //
dh_lx2 //

View File

@ -404,6 +404,7 @@ kramermc.cpp
krokha.cpp
kron.cpp
krz2000.cpp
ktm3.cpp
kyocera.cpp
laser3k.cpp
lb186.cpp