mn1400: add i/o ports

This commit is contained in:
hap 2023-05-07 16:58:51 +02:00
parent eadecec11a
commit 63117eb131
11 changed files with 184 additions and 56 deletions

View File

@ -5,7 +5,11 @@
Matsushita MN1400, MN1405
TODO:
- stuff
- counter input pin (CSLCT and SNS1)
- are illegal opcodes 0x38/0xe0 and 0x39/0xe1 branch-always and branch-never?
right now they're implemented as such
- is branch emulation correct when near the end of a page?
- add other MCUs when needed
*/

View File

@ -6,7 +6,7 @@
4-bit microcontroller introduced in 1977, possibly Matsushita's first MCU.
Basic models:
Basic MN1400 series:
MN1400: 1KB ROM, 64 nibbles RAM
MN1402: 768 bytes ROM, 32 nibbles RAM
@ -24,6 +24,13 @@ MN1435: high-voltage version of MN1405
MN1450/MN1460: CMOS version of MN1400
MN1455/MN1465: CMOS version of MN1405
Other models:
MN1450B: internal FLT driver
MN1456A: MN1455 with double amount ROM/RAM
MN148x: DAC for TV/VTR tuner
MN1427: support for FM audio tuner
*/
#include "emu.h"
@ -34,12 +41,38 @@ mn1400_base_device::mn1400_base_device(const machine_config &mconfig, device_typ
cpu_device(mconfig, type, tag, owner, clock),
m_program_config("program", ENDIANNESS_LITTLE, 8, prgwidth, 0, program),
m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data),
m_opla(*this, "opla"),
m_stack_levels(stack_levels),
m_prgwidth(prgwidth),
m_datawidth(datawidth)
m_datawidth(datawidth),
m_read_a(*this),
m_read_b(*this),
m_read_sns(*this),
m_write_c(*this),
m_write_d(*this),
m_write_e(*this)
{ }
//-------------------------------------------------
// disasm
//-------------------------------------------------
void mn1400_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
case STATE_GENFLAGS:
str = string_format("%c%c%c",
(m_status & FLAG_P) ? 'P' : 'p',
(m_status & FLAG_C) ? 'C' : 'c',
(m_status & FLAG_Z) ? 'Z' : 'z'
);
break;
}
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@ -52,6 +85,12 @@ void mn1400_base_device::device_start()
m_datamask = (1 << m_datawidth) - 1;
// resolve callbacks
m_read_a.resolve_safe(0xf);
m_read_b.resolve_safe(0xf);
m_read_sns.resolve_safe(3);
m_write_c.resolve_safe();
m_write_d.resolve_safe();
m_write_e.resolve_safe();
// zerofill
m_pc = 0;
@ -104,28 +143,6 @@ void mn1400_base_device::device_start()
set_icountptr(m_icount);
}
device_memory_interface::space_config_vector mn1400_base_device::memory_space_config() const
{
return space_config_vector {
std::make_pair(AS_PROGRAM, &m_program_config),
std::make_pair(AS_DATA, &m_data_config)
};
}
void mn1400_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
case STATE_GENFLAGS:
str = string_format("%c%c%c",
(m_status & FLAG_P) ? 'P' : 'p',
(m_status & FLAG_C) ? 'C' : 'c',
(m_status & FLAG_Z) ? 'Z' : 'z'
);
break;
}
}
//-------------------------------------------------
// device_reset - device-specific reset
@ -136,9 +153,27 @@ void mn1400_base_device::device_reset()
m_pc = m_prev_pc = 0;
m_op = m_prev_op = 0;
m_status = 0;
m_ec = false;
// clear output ports
m_c = 0;
m_write_c(m_c = 0);
write_d(0);
m_write_e(0);
}
//-------------------------------------------------
// D output port
//-------------------------------------------------
void mn1400_base_device::device_add_mconfig(machine_config &config)
{
PLA(config, m_opla, 5, 8, 24).set_format(pla_device::FMT::BERKELEY);
}
void mn1400_base_device::write_d(u8 data)
{
m_write_d(m_opla->read(data));
}
@ -146,6 +181,14 @@ void mn1400_base_device::device_reset()
// common internal memory maps
//-------------------------------------------------
device_memory_interface::space_config_vector mn1400_base_device::memory_space_config() const
{
return space_config_vector {
std::make_pair(AS_PROGRAM, &m_program_config),
std::make_pair(AS_DATA, &m_data_config)
};
}
void mn1400_base_device::program_1kx8(address_map &map)
{
map(0x000, 0x3ff).rom();

View File

@ -14,6 +14,8 @@
#pragma once
#include "machine/pla.h"
class mn1400_base_device : public cpu_device
{
@ -21,6 +23,23 @@ public:
// configuration helpers
// I/O ports:
// 4-bit A/B input ports
auto read_a() { return m_read_a.bind(); }
auto read_b() { return m_read_b.bind(); }
// SNS0/SNS1 input pins
auto read_sns() { return m_read_sns.bind(); }
// up to 12-bit C output port
auto write_c() { return m_write_c.bind(); }
// up to 8-bit D output port
// for 4-bit, it uses D1-D4 or D1-D3,D5
auto write_d() { return m_write_d.bind(); }
// 4-bit E output port
auto write_e() { return m_write_e.bind(); }
protected:
// construction/destruction
mn1400_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data);
@ -28,6 +47,7 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
@ -42,15 +62,17 @@ protected:
// device_memory_interface overrides
virtual space_config_vector memory_space_config() const override;
void program_1kx8(address_map &map);
void program_2kx8(address_map &map);
void data_64x4(address_map &map);
void data_128x4(address_map &map);
address_space_config m_program_config;
address_space_config m_data_config;
address_space *m_program;
address_space *m_data;
void program_1kx8(address_map &map);
void program_2kx8(address_map &map);
void data_64x4(address_map &map);
void data_128x4(address_map &map);
optional_device<pla_device> m_opla; // D port output PLA
int m_icount;
int m_state_count;
@ -61,6 +83,7 @@ protected:
u16 m_prgmask; // "
u16 m_datamask; // "
virtual void write_d(u8 data);
virtual void cycle();
virtual void increment_pc();
virtual bool op_has_param(u8 op) = 0;
@ -71,7 +94,7 @@ protected:
u8 m_prev_op;
u8 m_param;
u8 m_ram_address;
u16 m_stack[2];
u16 m_stack[2]; // max 2
u8 m_sp;
u8 m_a;
@ -90,6 +113,12 @@ protected:
};
// i/o handlers
devcb_read8 m_read_a;
devcb_read8 m_read_b;
devcb_read8 m_read_sns;
devcb_write16 m_write_c;
devcb_write8 m_write_d;
devcb_write8 m_write_e;
};

View File

@ -208,9 +208,9 @@ void mn1400_cpu_device::op_xor()
void mn1400_cpu_device::op_a()
{
// A: add memory + carry to A
u8 c = (m_status & FLAG_C) ? 1 : 0;
m_a += ram_r() + c;
// A: add memory + CF to A
u8 cf = (m_status & FLAG_C) ? 1 : 0;
m_a += ram_r() + cf;
set_cz(m_a);
m_a &= 0xf;
}
@ -314,46 +314,61 @@ void mn1400_cpu_device::op_tb()
void mn1400_cpu_device::op_ina()
{
// INA: input from port A
m_a = m_read_a() & 0xf;
set_z(m_a);
}
void mn1400_cpu_device::op_inb()
{
// INB: input from port B
m_a = m_read_b() & 0xf;
set_z(m_a);
}
void mn1400_cpu_device::op_otd()
{
// OTD: output A + PS to port D
u8 ps = (m_status & FLAG_P) ? 1 : 0;
write_d(ps << 4 | m_a);
}
void mn1400_cpu_device::op_otmd()
{
// OTMD: output memory + PS to port D
u8 ps = (m_status & FLAG_P) ? 1 : 0;
write_d(ps << 4 | ram_r());
}
void mn1400_cpu_device::op_ote()
{
// OTE: output A to port E
m_write_e(m_a);
}
void mn1400_cpu_device::op_otie()
{
// OTIE: output immediate to port E
m_write_e(m_op & 0xf);
}
void mn1400_cpu_device::op_rco()
{
// RCO: reset C pin
m_c &= ~(1 << m_y);
m_write_c(m_c);
}
void mn1400_cpu_device::op_sco()
{
// SCO: set C pin
m_c |= 1 << m_y;
m_write_c(m_c);
}
void mn1400_cpu_device::op_cco()
{
// CCO: clear C port
m_write_c(m_c = 0);
}
@ -386,6 +401,9 @@ void mn1400_cpu_device::op_sp()
void mn1400_cpu_device::op_bs01()
{
// BS(N)0/1: branch on S pins
u8 mask = m_read_sns() & (m_op >> 1 & 3);
if (bool(m_op & 1) == bool(mask))
m_pc = (m_prev_pc & ~0xff) | m_param;
}
void mn1400_cpu_device::op_bpcz()

View File

@ -93,7 +93,12 @@ tms1k_base_device::tms1k_base_device(const machine_config &mconfig, device_type
m_decode_micro(*this)
{ }
// disasm
//-------------------------------------------------
// disasm
//-------------------------------------------------
void tms1k_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
@ -118,6 +123,7 @@ void tms1k_base_device::state_string_export(const device_state_entry &entry, std
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@ -242,14 +248,6 @@ void tms1k_base_device::device_start()
set_icountptr(m_icount);
}
device_memory_interface::space_config_vector tms1k_base_device::memory_space_config() const
{
return space_config_vector {
std::make_pair(AS_PROGRAM, &m_program_config),
std::make_pair(AS_DATA, &m_data_config)
};
}
//-------------------------------------------------
@ -291,6 +289,14 @@ void tms1k_base_device::device_reset()
// common internal memory maps
//-------------------------------------------------
device_memory_interface::space_config_vector tms1k_base_device::memory_space_config() const
{
return space_config_vector {
std::make_pair(AS_PROGRAM, &m_program_config),
std::make_pair(AS_DATA, &m_data_config)
};
}
void tms1k_base_device::rom_10bit(address_map &map)
{
map(0x000, 0x3ff).rom();

View File

@ -125,10 +125,17 @@ public:
void compperf(machine_config &config);
private:
void write_e(u8 data);
};
// handlers
void compperf_state::write_e(u8 data)
{
// E2,E3: speaker out
m_speaker->level_w(data >> 2 & 3);
}
// inputs
static INPUT_PORTS_START( compperf )
@ -140,6 +147,7 @@ void compperf_state::compperf(machine_config &config)
{
// basic machine hardware
MN1400(config, m_maincpu, 300000); // approximation - RC osc. R=18K, C=100pF
m_maincpu->write_e().set(FUNC(compperf_state::write_e));
// video hardware
PWM_DISPLAY(config, m_display).set_size(1, 10);
@ -147,7 +155,10 @@ void compperf_state::compperf(machine_config &config)
// sound hardware
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, m_speaker);
static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 };
m_speaker->set_levels(4, speaker_levels);
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125);
}
// roms
@ -155,6 +166,9 @@ void compperf_state::compperf(machine_config &config)
ROM_START( compperf )
ROM_REGION( 0x0400, "maincpu", 0 )
ROM_LOAD( "mn1400ml", 0x0000, 0x0400, NO_DUMP )
ROM_REGION( 200, "maincpu:opla", 0 )
ROM_LOAD( "mn1400_compperf_output.pla", 0, 200, NO_DUMP )
ROM_END
@ -182,10 +196,17 @@ public:
void scrablexa(machine_config &config);
private:
void write_e(u8 data);
};
// handlers
void scrablexa_state::write_e(u8 data)
{
// E2,E3: speaker out
m_speaker->level_w(data >> 2 & 3);
}
// inputs
static INPUT_PORTS_START( scrablexa )
@ -197,6 +218,7 @@ void scrablexa_state::scrablexa(machine_config &config)
{
// basic machine hardware
MN1405(config, m_maincpu, 300000); // approximation - RC osc. R=15K, C=100pF
m_maincpu->write_e().set(FUNC(scrablexa_state::write_e));
// video hardware
PWM_DISPLAY(config, m_display).set_size(1, 1);
@ -204,7 +226,10 @@ void scrablexa_state::scrablexa(machine_config &config)
// sound hardware
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, m_speaker);
static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 };
m_speaker->set_levels(4, speaker_levels);
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125);
}
// roms
@ -212,6 +237,9 @@ void scrablexa_state::scrablexa(machine_config &config)
ROM_START( scrablexa )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "mn1405ms", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 200, "maincpu:opla", 0 )
ROM_LOAD( "mn1400_scrablexa_output.pla", 0, 200, NO_DUMP )
ROM_END

View File

@ -508,7 +508,7 @@ static INPUT_PORTS_START( snspell )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module Select")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Erase")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Erase")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter")
PORT_START("IN.6") // R6
@ -534,7 +534,7 @@ static INPUT_PORTS_START( snspellfr ) // French button names
PORT_MODIFY("IN.5")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module 2")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Efface")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Efface")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Essaie")
PORT_MODIFY("IN.7")
@ -557,7 +557,7 @@ static INPUT_PORTS_START( snspellit ) // Italian button names
PORT_MODIFY("IN.5")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Moduli")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Cancella")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Cancella")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Controllo")
PORT_MODIFY("IN.7")
@ -625,7 +625,7 @@ static INPUT_PORTS_START( snspellsp ) // Spanish button names, different alphabe
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_NAME("Acento")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Listo")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Programa")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Borra")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Borra")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Repite")
PORT_START("IN.8") // Vss!

View File

@ -490,7 +490,7 @@ static INPUT_PORTS_START( snspellc )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
PORT_START("IN.4") // R4
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Erase")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Erase")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W')

View File

@ -325,7 +325,7 @@ static INPUT_PORTS_START( spellb )
PORT_START("IN.5") // R5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_NAME("Memory")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Clue")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Erase")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Erase")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
@ -350,7 +350,7 @@ static INPUT_PORTS_START( spellabc )
PORT_MODIFY("IN.5")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_NAME("Speicher")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Rat")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Tilgen")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Tilgen")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Eingabe")
PORT_MODIFY("IN.6")
@ -386,7 +386,7 @@ static INPUT_PORTS_START( letterlf )
PORT_MODIFY("IN.5")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_NAME("Joueur 2")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Aide")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Effacez")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Effacez")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Marque")
PORT_MODIFY("IN.6")
@ -406,7 +406,7 @@ static INPUT_PORTS_START( letterlg )
PORT_MODIFY("IN.5")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_NAME("Spieler 2")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Rat")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Tilgen")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Tilgen")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Punkte")
PORT_MODIFY("IN.6")

View File

@ -237,7 +237,7 @@ static INPUT_PORTS_START( k28 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("<")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I')
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Erase/Clear")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Erase/Clear")
PORT_START("IN.2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("Menu")

View File

@ -271,7 +271,7 @@ static INPUT_PORTS_START( k28m2 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
PORT_START("IN.7") // O7
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(127) PORT_NAME("Clear")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H/8")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')