added spellb i/o, comms, inputs

This commit is contained in:
hap 2015-12-21 20:13:02 +01:00
parent a94b7332b0
commit f087b29c5f
3 changed files with 175 additions and 24 deletions

View File

@ -908,7 +908,7 @@ void tms0270_cpu_device::dynamic_output()
if (m_chipsel)
{
// ACC via SEG B,C,D,G: TMS5100 CTL pins
// ACC via SEG G,B,C,D: TMS5100 CTL pins
if (m_ctl_dir && m_a != m_ctl_out)
{
m_ctl_out = m_a;
@ -956,7 +956,7 @@ UINT8 tms0980_cpu_device::read_k_input()
UINT8 tms0270_cpu_device::read_k_input()
{
// external: TMS5100 CTL port via SEG B,C,D,G
// external: TMS5100 CTL port via SEG G,B,C,D
if (m_chipsel)
return (m_ctl_dir) ? m_ctl_out : m_read_ctl(0, 0xff) & 0xf;

View File

@ -517,7 +517,7 @@ WRITE16_MEMBER(tispeak_state::snspell_write_o)
READ8_MEMBER(tispeak_state::snspell_read_k)
{
// note: the Vss row is always on
// K: multiplexed inputs (note: the Vss row is always on)
return m_inp_matrix[8]->read() | read_inputs(8);
}
@ -678,7 +678,7 @@ static INPUT_PORTS_START( snspell )
PORT_START("IN.7") // R7
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") // -> auto_power_off
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Go")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Clue")
@ -717,7 +717,7 @@ static INPUT_PORTS_START( snmath )
PORT_START("IN.3") // R3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Go")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") // -> auto_power_off
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )

View File

@ -7,7 +7,8 @@
Texas Instruments Spelling B hardware
The Spelling B was introduced together with the Speak & Spell. It is a
handheld educational toy. Two revisions of the hardware exist. (* indicates not dumped)
handheld educational toy with booklet. Two revisions of the hardware exist.
(* indicates not dumped)
1st revision:
@ -18,7 +19,6 @@
Spelling ABC (UK), 1979: exact same hardware as US version
2nd revision:
Spelling B (US), 1980
@ -65,9 +65,29 @@ class tispellb_state : public hh_tms1k_state
{
public:
tispellb_state(const machine_config &mconfig, device_type type, const char *tag)
: hh_tms1k_state(mconfig, type, tag)
: hh_tms1k_state(mconfig, type, tag),
m_subcpu(*this, "subcpu")
{ }
// devices
optional_device<cpu_device> m_subcpu;
UINT8 m_rev1_ctl;
UINT16 m_sub_o;
UINT16 m_sub_r;
DECLARE_READ8_MEMBER(main_read_k);
DECLARE_WRITE16_MEMBER(main_write_o);
DECLARE_WRITE16_MEMBER(main_write_r);
DECLARE_READ8_MEMBER(rev1_ctl_r);
DECLARE_WRITE8_MEMBER(rev1_ctl_w);
DECLARE_READ8_MEMBER(sub_read_k);
DECLARE_WRITE16_MEMBER(sub_write_o);
DECLARE_WRITE16_MEMBER(sub_write_r);
void prepare_display();
protected:
virtual void machine_start() override;
};
@ -77,6 +97,16 @@ void tispellb_state::machine_start()
{
hh_tms1k_state::machine_start();
memset(m_display_segmask, ~0, sizeof(m_display_segmask)); // !
// zerofill
m_rev1_ctl = 0;
m_sub_o = 0;
m_sub_r = 0;
// register for savestates
save_item(NAME(m_rev1_ctl));
save_item(NAME(m_sub_o));
save_item(NAME(m_sub_r));
}
@ -87,6 +117,69 @@ void tispellb_state::machine_start()
***************************************************************************/
// common
void tispellb_state::prepare_display()
{
display_matrix_seg(16, 8, m_plate, m_grid, 0x3fff);
}
WRITE16_MEMBER(tispellb_state::main_write_o)
{
// reorder opla to led14seg, plus DP as d14 and AP as d15, same as snspell
m_plate = BITSWAP16(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5);
prepare_display();
}
WRITE16_MEMBER(tispellb_state::main_write_r)
{
// R0-R6: input mux
// R0-R7: select digit
m_r = data;
m_inp_mux = data & 0x7f;
m_grid = data & 0xff;
prepare_display();
}
READ8_MEMBER(tispellb_state::main_read_k)
{
// K: multiplexed inputs (note: the Vss row is always on)
return m_inp_matrix[7]->read() | read_inputs(7);
}
// 1st revision mcu/mcu comms
WRITE8_MEMBER(tispellb_state::rev1_ctl_w)
{
// main CTL write data
m_rev1_ctl = data & 0xf;
}
READ8_MEMBER(tispellb_state::sub_read_k)
{
// sub K3210 <- main CTL3201
return BITSWAP8(m_rev1_ctl,7,6,5,4,3,2,0,1);
}
WRITE16_MEMBER(tispellb_state::sub_write_o)
{
// sub O write data
m_sub_o = data;
}
READ8_MEMBER(tispellb_state::rev1_ctl_r)
{
// main CTL3210 <- sub O6043
return BITSWAP8(m_sub_o,7,5,2,1,6,0,4,3) & 0xf;
}
WRITE16_MEMBER(tispellb_state::sub_write_r)
{
// sub R: unused?
m_sub_r = data;
}
/***************************************************************************
@ -96,7 +189,61 @@ void tispellb_state::machine_start()
***************************************************************************/
static INPUT_PORTS_START( spellb )
PORT_START("IN.0") // R0
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
PORT_START("IN.1") // R1
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
PORT_START("IN.2") // R2
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M')
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_O) PORT_CHAR('O')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K')
PORT_START("IN.3") // R3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P')
PORT_START("IN.4") // R4
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U')
PORT_START("IN.5") // R5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Memory")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Clue")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
PORT_START("IN.6") // R6
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") // -> auto_power_off
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Level")
PORT_START("IN.7") // Vss!
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Missing Letter")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Mystery Word")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Scramble")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spelling B/On") //PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, (void *)true)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Starts With")
INPUT_PORTS_END
@ -107,10 +254,22 @@ INPUT_PORTS_END
***************************************************************************/
static MACHINE_CONFIG_START( spellb, tispellb_state )
static MACHINE_CONFIG_START( rev1, tispellb_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS0270, 300000) // guessed
MCFG_CPU_ADD("maincpu", TMS0270, 300000) // approximation
MCFG_TMS1XXX_READ_K_CB(READ8(tispellb_state, main_read_k))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(tispellb_state, main_write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tispellb_state, main_write_r))
MCFG_TMS0270_READ_CTL_CB(READ8(tispellb_state, rev1_ctl_r))
MCFG_TMS0270_WRITE_CTL_CB(WRITE8(tispellb_state, rev1_ctl_w))
MCFG_CPU_ADD("subcpu", TMS1980, 300000) // approximation
MCFG_TMS1XXX_READ_K_CB(READ8(tispellb_state, sub_read_k))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(tispellb_state, sub_write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tispellb_state, sub_write_r))
MCFG_QUANTUM_PERFECT_CPU("maincpu")
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_spellb)
@ -120,11 +279,6 @@ MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
@ -142,21 +296,18 @@ ROM_START( spellb )
ROM_REGION( 1246, "maincpu:opla", 0 )
ROM_LOAD( "tms0270_spellb_output.pla", 0, 1246, CRC(3e021cbd) SHA1(c9bdfe10601b8a5a70442fe4805e4bfed8bbed35) )
ROM_REGION( 0x1000, "sub", 0 )
ROM_REGION( 0x1000, "subcpu", 0 )
ROM_LOAD( "tmc1984nl", 0x0000, 0x1000, CRC(ad417878) SHA1(d02ca44db104d34e8089037ddd514958eb007e27) )
ROM_REGION( 1246, "sub:ipla", 0 )
ROM_REGION( 1246, "subcpu:ipla", 0 )
ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
ROM_REGION( 2127, "sub:mpla", 0 )
ROM_REGION( 2127, "subcpu:mpla", 0 )
ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
ROM_REGION( 525, "sub:opla", 0 )
ROM_REGION( 525, "subcpu:opla", 0 )
ROM_LOAD( "tms1980_spellb_output.pla", 0, 525, CRC(1e26a719) SHA1(eb031aa216fe865bc9e40b070ca5de2b1509f13b) )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */
COMP( 1978, spellb, 0, 0, spellb, spellb, driver_device, 0, "Texas Instruments", "Spelling B (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */
COMP( 1978, spellb, 0, 0, rev1, spellb, driver_device, 0, "Texas Instruments", "Spelling B (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )