mirror of
https://github.com/holub/mame
synced 2025-07-07 02:50:50 +03:00
Merge branch 'master' of https://github.com/mamedev/mame
This commit is contained in:
commit
72ffd2fedb
@ -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
|
||||
|
@ -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())
|
||||
{
|
||||
|
@ -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
298
src/mame/drivers/ktm3.cpp
Normal 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)
|
@ -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)
|
||||
|
@ -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>));
|
||||
|
@ -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)
|
||||
|
@ -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"),
|
||||
|
@ -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
|
@ -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();
|
||||
}
|
@ -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 //
|
||||
|
@ -404,6 +404,7 @@ kramermc.cpp
|
||||
krokha.cpp
|
||||
kron.cpp
|
||||
krz2000.cpp
|
||||
ktm3.cpp
|
||||
kyocera.cpp
|
||||
laser3k.cpp
|
||||
lb186.cpp
|
||||
|
Loading…
Reference in New Issue
Block a user