summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2023-05-07 16:58:51 +0200
committer hap <happppp@users.noreply.github.com>2023-05-07 16:59:04 +0200
commit63117eb131602863cb7f0f4a98f1068180541195 (patch)
tree49e9930f7e37c1e4d8cb1f038d53b57cf53022c0
parenteadecec11ad1704f950c35e36c6f62d2dc092e9c (diff)
mn1400: add i/o ports
-rw-r--r--src/devices/cpu/mn1400/mn1400.cpp6
-rw-r--r--src/devices/cpu/mn1400/mn1400base.cpp93
-rw-r--r--src/devices/cpu/mn1400/mn1400base.h39
-rw-r--r--src/devices/cpu/mn1400/mn1400op.cpp24
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.cpp24
-rw-r--r--src/mame/handheld/hh_mn1400.cpp32
-rw-r--r--src/mame/ti/snspell.cpp8
-rw-r--r--src/mame/ti/snspellc.cpp2
-rw-r--r--src/mame/ti/spellb.cpp8
-rw-r--r--src/mame/tiger/k28.cpp2
-rw-r--r--src/mame/tiger/k28m2.cpp2
11 files changed, 184 insertions, 56 deletions
diff --git a/src/devices/cpu/mn1400/mn1400.cpp b/src/devices/cpu/mn1400/mn1400.cpp
index 3981866938b..974e8a9393c 100644
--- a/src/devices/cpu/mn1400/mn1400.cpp
+++ b/src/devices/cpu/mn1400/mn1400.cpp
@@ -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
*/
diff --git a/src/devices/cpu/mn1400/mn1400base.cpp b/src/devices/cpu/mn1400/mn1400base.cpp
index d6868956925..409f9f9521a 100644
--- a/src/devices/cpu/mn1400/mn1400base.cpp
+++ b/src/devices/cpu/mn1400/mn1400base.cpp
@@ -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,13 +41,39 @@ 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();
diff --git a/src/devices/cpu/mn1400/mn1400base.h b/src/devices/cpu/mn1400/mn1400base.h
index b0596a46dd7..f7232d5a277 100644
--- a/src/devices/cpu/mn1400/mn1400base.h
+++ b/src/devices/cpu/mn1400/mn1400base.h
@@ -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;
};
diff --git a/src/devices/cpu/mn1400/mn1400op.cpp b/src/devices/cpu/mn1400/mn1400op.cpp
index eb37c18ebd8..21e51d4cc2b 100644
--- a/src/devices/cpu/mn1400/mn1400op.cpp
+++ b/src/devices/cpu/mn1400/mn1400op.cpp
@@ -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()
diff --git a/src/devices/cpu/tms1000/tms1k_base.cpp b/src/devices/cpu/tms1000/tms1k_base.cpp
index 28ef3121199..7fb2395f639 100644
--- a/src/devices/cpu/tms1000/tms1k_base.cpp
+++ b/src/devices/cpu/tms1000/tms1k_base.cpp
@@ -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();
diff --git a/src/mame/handheld/hh_mn1400.cpp b/src/mame/handheld/hh_mn1400.cpp
index 7befe2ce49d..d8aa905ecc7 100644
--- a/src/mame/handheld/hh_mn1400.cpp
+++ b/src/mame/handheld/hh_mn1400.cpp
@@ -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
diff --git a/src/mame/ti/snspell.cpp b/src/mame/ti/snspell.cpp
index b9ea1527621..c095a6910c1 100644
--- a/src/mame/ti/snspell.cpp
+++ b/src/mame/ti/snspell.cpp
@@ -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!
diff --git a/src/mame/ti/snspellc.cpp b/src/mame/ti/snspellc.cpp
index 3c3971c3afb..da38401ebd4 100644
--- a/src/mame/ti/snspellc.cpp
+++ b/src/mame/ti/snspellc.cpp
@@ -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')
diff --git a/src/mame/ti/spellb.cpp b/src/mame/ti/spellb.cpp
index 6775c5947e5..3746840bf04 100644
--- a/src/mame/ti/spellb.cpp
+++ b/src/mame/ti/spellb.cpp
@@ -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")
diff --git a/src/mame/tiger/k28.cpp b/src/mame/tiger/k28.cpp
index c93a3232329..34be91990fd 100644
--- a/src/mame/tiger/k28.cpp
+++ b/src/mame/tiger/k28.cpp
@@ -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")
diff --git a/src/mame/tiger/k28m2.cpp b/src/mame/tiger/k28m2.cpp
index f8547de9751..0e871125329 100644
--- a/src/mame/tiger/k28m2.cpp
+++ b/src/mame/tiger/k28m2.cpp
@@ -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')