mirror of
https://github.com/mamedev/mame.git
synced 2024-11-16 07:48:32 +01:00
Clones promoted to working
-------------------------- Scrabble Lexor: Computer Word Game (MN1405 version) [hap, Sean Riddle] New systems marked not working ------------------------------ Basketball (Tomy) [hap, Sean Riddle]
This commit is contained in:
parent
a36456e507
commit
442c6ba728
17 changed files with 379 additions and 50 deletions
|
@ -50,7 +50,10 @@ mn1400_base_device::mn1400_base_device(const machine_config &mconfig, device_typ
|
|||
m_read_sns(*this),
|
||||
m_write_c(*this),
|
||||
m_write_d(*this),
|
||||
m_write_e(*this)
|
||||
m_write_e(*this),
|
||||
m_c_mask(0xfff),
|
||||
m_d_mask(0xff),
|
||||
m_d_bits(0)
|
||||
{ }
|
||||
|
||||
|
||||
|
@ -85,9 +88,9 @@ 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_read_a.resolve_safe(0);
|
||||
m_read_b.resolve_safe(0);
|
||||
m_read_sns.resolve_safe(0);
|
||||
m_write_c.resolve_safe();
|
||||
m_write_d.resolve_safe();
|
||||
m_write_e.resolve_safe();
|
||||
|
@ -156,14 +159,14 @@ void mn1400_base_device::device_reset()
|
|||
m_ec = false;
|
||||
|
||||
// clear output ports
|
||||
m_write_c(m_c = 0);
|
||||
write_c(0);
|
||||
write_d(0);
|
||||
m_write_e(0);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// D output port
|
||||
// I/O
|
||||
//-------------------------------------------------
|
||||
|
||||
void mn1400_base_device::device_add_mconfig(machine_config &config)
|
||||
|
@ -173,7 +176,20 @@ void mn1400_base_device::device_add_mconfig(machine_config &config)
|
|||
|
||||
void mn1400_base_device::write_d(u8 data)
|
||||
{
|
||||
m_write_d(m_opla->read(data));
|
||||
u8 output = m_opla->read(data);
|
||||
output = bitswap<8>(output,7,6,5,3,1,2,0,4);
|
||||
|
||||
// DO outputs may be bonded to different DO pins
|
||||
if (u32 b = m_d_bits)
|
||||
output = bitswap<8>(output, b >> 28 & 7, b >> 24 & 7, b >> 20 & 7, b >> 16 & 7, b >> 12 & 7, b >> 8 & 7, b >> 4 & 7, b >> 0 & 7);
|
||||
|
||||
m_write_d(~output & m_d_mask);
|
||||
}
|
||||
|
||||
void mn1400_base_device::write_c(u16 data)
|
||||
{
|
||||
m_c = data & m_c_mask;
|
||||
m_write_c(m_c);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -32,10 +32,12 @@ public:
|
|||
|
||||
// up to 12-bit C output port
|
||||
auto write_c() { return m_write_c.bind(); }
|
||||
auto &set_c_mask(u16 mask) { m_c_mask = mask; return *this; }
|
||||
|
||||
// up to 8-bit D output port
|
||||
// for 4-bit, it uses D1-D4 or D1-D3,D5
|
||||
// for 4-bit, it commonly uses D1-D3,D5
|
||||
auto write_d() { return m_write_d.bind(); }
|
||||
auto &set_d_mask(u8 mask, u32 bits) { m_d_mask = mask; m_d_bits = bits; return *this; }
|
||||
|
||||
// 4-bit E output port
|
||||
auto write_e() { return m_write_e.bind(); }
|
||||
|
@ -83,6 +85,7 @@ protected:
|
|||
u16 m_prgmask; // "
|
||||
u16 m_datamask; // "
|
||||
|
||||
virtual void write_c(u16 data);
|
||||
virtual void write_d(u8 data);
|
||||
virtual void cycle();
|
||||
virtual void increment_pc();
|
||||
|
@ -119,6 +122,10 @@ protected:
|
|||
devcb_write16 m_write_c;
|
||||
devcb_write8 m_write_d;
|
||||
devcb_write8 m_write_e;
|
||||
|
||||
u16 m_c_mask;
|
||||
u8 m_d_mask;
|
||||
u32 m_d_bits;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -244,7 +244,7 @@ void mn1400_cpu_device::op_ci()
|
|||
|
||||
void mn1400_cpu_device::op_cy()
|
||||
{
|
||||
// CY: compare A with Y
|
||||
// CY: compare Y with immediate
|
||||
set_z(m_y ^ (m_op & 0xf));
|
||||
}
|
||||
|
||||
|
@ -283,7 +283,7 @@ void mn1400_cpu_device::op_dcm()
|
|||
{
|
||||
// DCM: decrement memory
|
||||
cycle();
|
||||
u8 temp = ram_r() - 1;
|
||||
u8 temp = ram_r() + 0xf;
|
||||
ram_w(temp);
|
||||
set_cz(temp);
|
||||
}
|
||||
|
@ -354,21 +354,19 @@ void mn1400_cpu_device::op_otie()
|
|||
void mn1400_cpu_device::op_rco()
|
||||
{
|
||||
// RCO: reset C pin
|
||||
m_c &= ~(1 << m_y);
|
||||
m_write_c(m_c);
|
||||
write_c(m_c & ~(1 << m_y));
|
||||
}
|
||||
|
||||
void mn1400_cpu_device::op_sco()
|
||||
{
|
||||
// SCO: set C pin
|
||||
m_c |= 1 << m_y;
|
||||
m_write_c(m_c);
|
||||
write_c(m_c | (1 << m_y));
|
||||
}
|
||||
|
||||
void mn1400_cpu_device::op_cco()
|
||||
{
|
||||
// CCO: clear C port
|
||||
m_write_c(m_c = 0);
|
||||
write_c(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -417,7 +415,7 @@ void mn1400_cpu_device::op_bpcz()
|
|||
void mn1400_cpu_device::op_jmp()
|
||||
{
|
||||
// JMP: jump
|
||||
m_pc = ((m_op & 0xf) << 8 | m_param) & m_prgmask;
|
||||
m_pc = ((m_op & 7) << 8 | m_param) & m_prgmask;
|
||||
}
|
||||
|
||||
void mn1400_cpu_device::op_cal()
|
||||
|
|
|
@ -129,7 +129,7 @@ u16 hh_cop400_state::read_inputs(int columns, u16 colmask)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (~m_inp_mux >> i & 1)
|
||||
if (!BIT(m_inp_mux, i))
|
||||
ret &= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -106,7 +106,7 @@ u8 hh_cops1_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -223,7 +223,7 @@ u16 hh_hmcs40_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -88,7 +88,7 @@ u8 hh_melps4_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -6,8 +6,7 @@
|
|||
Matsushita (Panasonic) MN1400 handhelds
|
||||
|
||||
TODO:
|
||||
- WIP
|
||||
- NO_DUMP: it's decapped, but rom layout is not fully verified yet
|
||||
- internal artwork for compperf and tmbaskb
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
|
@ -47,16 +46,16 @@ protected:
|
|||
required_device<mn1400_base_device> m_maincpu;
|
||||
optional_device<pwm_display_device> m_display;
|
||||
optional_device<speaker_sound_device> m_speaker;
|
||||
optional_ioport_array<4> m_inputs; // max 4
|
||||
optional_ioport_array<5> m_inputs; // max 5
|
||||
|
||||
u8 m_inp_mux = 0; // multiplexed inputs mask
|
||||
u16 m_inp_mux = 0; // multiplexed inputs mask
|
||||
|
||||
// MCU output pins state
|
||||
u16 m_c = 0; // C pins
|
||||
u8 m_d = 0; // D pins
|
||||
u8 m_e = 0; // E pins
|
||||
u16 m_c = 0; // C pins
|
||||
u8 m_d = 0; // D pins
|
||||
u8 m_e = 0; // E pins
|
||||
|
||||
u8 read_inputs(int columns);
|
||||
u16 read_inputs(int columns);
|
||||
};
|
||||
|
||||
|
||||
|
@ -73,7 +72,6 @@ void hh_mn1400_state::machine_start()
|
|||
|
||||
void hh_mn1400_state::machine_reset()
|
||||
{
|
||||
read_inputs(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -86,13 +84,13 @@ void hh_mn1400_state::machine_reset()
|
|||
|
||||
// generic input handlers
|
||||
|
||||
u8 hh_mn1400_state::read_inputs(int columns)
|
||||
u16 hh_mn1400_state::read_inputs(int columns)
|
||||
{
|
||||
u8 ret = 0;
|
||||
u16 ret = 0;
|
||||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
@ -125,20 +123,86 @@ public:
|
|||
void compperf(machine_config &config);
|
||||
|
||||
private:
|
||||
void update_display();
|
||||
void write_c(u16 data);
|
||||
void write_d(u8 data);
|
||||
void write_e(u8 data);
|
||||
u8 read_sns();
|
||||
};
|
||||
|
||||
// handlers
|
||||
|
||||
void compperf_state::update_display()
|
||||
{
|
||||
m_display->matrix(1, ~m_inp_mux);
|
||||
}
|
||||
|
||||
void compperf_state::write_c(u16 data)
|
||||
{
|
||||
// CO5-CO9: leds/input mux part
|
||||
m_inp_mux = (m_inp_mux & ~0x3e0) | (data & 0x3e0);
|
||||
update_display();
|
||||
}
|
||||
|
||||
void compperf_state::write_d(u8 data)
|
||||
{
|
||||
// DO0-DO3: leds/input mux part
|
||||
m_inp_mux = (m_inp_mux & ~0x1e) | (data << 1 & 0x1e);
|
||||
update_display();
|
||||
}
|
||||
|
||||
void compperf_state::write_e(u8 data)
|
||||
{
|
||||
// E2,E3: speaker out
|
||||
// EO0: leds/input mux part
|
||||
m_inp_mux = (m_inp_mux & ~1) | (data & 1);
|
||||
update_display();
|
||||
|
||||
// EO2,EO3: speaker out
|
||||
m_speaker->level_w(data >> 2 & 3);
|
||||
}
|
||||
|
||||
u8 compperf_state::read_sns()
|
||||
{
|
||||
// SNS0: multiplexed inputs, SNS1: set button
|
||||
u8 sns0 = (m_inputs[2]->read() & m_inp_mux) ? 1 : 0;
|
||||
return (m_inputs[3]->read() & 2) | sns0;
|
||||
}
|
||||
|
||||
// inputs
|
||||
|
||||
static INPUT_PORTS_START( compperf )
|
||||
PORT_START("IN.0") // AI
|
||||
PORT_CONFNAME( 0x07, 0x01, "Game" )
|
||||
PORT_CONFSETTING( 0x01, "1" )
|
||||
PORT_CONFSETTING( 0x02, "2" )
|
||||
PORT_CONFSETTING( 0x04, "3" )
|
||||
PORT_CONFSETTING( 0x00, "4" )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Score")
|
||||
|
||||
PORT_START("IN.1") // BI
|
||||
PORT_CONFNAME( 0x03, 0x00, "Mode" )
|
||||
PORT_CONFSETTING( 0x01, "T" ) // Test
|
||||
PORT_CONFSETTING( 0x00, "N" ) // New
|
||||
PORT_CONFSETTING( 0x02, "R" ) // Repeat
|
||||
PORT_CONFNAME( 0x0c, 0x00, DEF_STR( Difficulty ) )
|
||||
PORT_CONFSETTING( 0x00, "1" )
|
||||
PORT_CONFSETTING( 0x08, "2" )
|
||||
PORT_CONFSETTING( 0x04, "3" )
|
||||
|
||||
PORT_START("IN.2") // EO/DO/CO SNS0
|
||||
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_BUTTON1 )
|
||||
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_BUTTON2 )
|
||||
PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_BUTTON3 )
|
||||
PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_BUTTON4 )
|
||||
PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_BUTTON5 )
|
||||
PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_BUTTON6 )
|
||||
PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_BUTTON7 )
|
||||
PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_BUTTON8 )
|
||||
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_BUTTON9 )
|
||||
PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_BUTTON10 ) // 0
|
||||
|
||||
PORT_START("IN.3") // SNS1
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Set")
|
||||
INPUT_PORTS_END
|
||||
|
||||
// config
|
||||
|
@ -147,10 +211,18 @@ 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_c().set(FUNC(compperf_state::write_c));
|
||||
m_maincpu->set_c_mask(0x3e0);
|
||||
m_maincpu->write_d().set(FUNC(compperf_state::write_d));
|
||||
m_maincpu->set_d_mask(0xf, 0x5321);
|
||||
m_maincpu->write_e().set(FUNC(compperf_state::write_e));
|
||||
m_maincpu->read_a().set_ioport("IN.0");
|
||||
m_maincpu->read_b().set_ioport("IN.1");
|
||||
m_maincpu->read_sns().set(FUNC(compperf_state::read_sns));
|
||||
|
||||
// video hardware
|
||||
PWM_DISPLAY(config, m_display).set_size(1, 10);
|
||||
m_display->set_bri_levels(0.25);
|
||||
config.set_default_layout(layout_hh_mn1400_test);
|
||||
|
||||
// sound hardware
|
||||
|
@ -165,10 +237,10 @@ void compperf_state::compperf(machine_config &config)
|
|||
|
||||
ROM_START( compperf )
|
||||
ROM_REGION( 0x0400, "maincpu", 0 )
|
||||
ROM_LOAD( "mn1400ml", 0x0000, 0x0400, NO_DUMP )
|
||||
ROM_LOAD( "mn1400ml", 0x0000, 0x0400, CRC(8d5ab2af) SHA1(f6281bb5a5a7ffeead107681d68b66a4844e93ad) )
|
||||
|
||||
ROM_REGION( 200, "maincpu:opla", 0 )
|
||||
ROM_LOAD( "mn1400_compperf_output.pla", 0, 200, NO_DUMP )
|
||||
ROM_REGION( 428, "maincpu:opla", 0 ) // 4-bit
|
||||
ROM_LOAD( "mn1400_common1_output.pla", 0, 428, CRC(07489d8b) SHA1(4fe65af8ee798490ed0bbe6a77d61713a2fb28b4) )
|
||||
ROM_END
|
||||
|
||||
|
||||
|
@ -196,20 +268,111 @@ public:
|
|||
void scrablexa(machine_config &config);
|
||||
|
||||
private:
|
||||
void update_display();
|
||||
void write_c(u16 data);
|
||||
void write_d(u8 data);
|
||||
void write_e(u8 data);
|
||||
template<int N> u8 read_abs();
|
||||
};
|
||||
|
||||
// handlers
|
||||
|
||||
void scrablexa_state::update_display()
|
||||
{
|
||||
u16 data = bitswap<14>(m_e << 12 | m_c,10,8,6,12,11,7,9,13,5,4,3,2,1,0);
|
||||
m_display->matrix(m_d, ~data);
|
||||
}
|
||||
|
||||
void scrablexa_state::write_c(u16 data)
|
||||
{
|
||||
// CO0-CO11: digit segments
|
||||
m_c = data;
|
||||
update_display();
|
||||
}
|
||||
|
||||
void scrablexa_state::write_d(u8 data)
|
||||
{
|
||||
// DO0-DO4: input mux
|
||||
// DO0-DO7: digit select
|
||||
m_inp_mux = data & 0x1f;
|
||||
m_d = data;
|
||||
update_display();
|
||||
}
|
||||
|
||||
void scrablexa_state::write_e(u8 data)
|
||||
{
|
||||
// E2,E3: speaker out
|
||||
// EO0,EO1: digit segments
|
||||
m_e = data;
|
||||
update_display();
|
||||
|
||||
// EO2,EO3: speaker out
|
||||
m_speaker->level_w(data >> 2 & 3);
|
||||
}
|
||||
|
||||
template<int N>
|
||||
u8 scrablexa_state::read_abs()
|
||||
{
|
||||
// AI/BI/SNS: multiplexed inputs
|
||||
return read_inputs(5) >> (N * 4);
|
||||
}
|
||||
|
||||
// inputs
|
||||
|
||||
static INPUT_PORTS_START( scrablexa )
|
||||
PORT_START("IN.0") // DO0
|
||||
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
|
||||
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
|
||||
PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
|
||||
PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
|
||||
PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
|
||||
PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
|
||||
PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G')
|
||||
PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H')
|
||||
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I')
|
||||
|
||||
PORT_START("IN.1") // DO1
|
||||
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J')
|
||||
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K')
|
||||
PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L')
|
||||
PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M')
|
||||
PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N')
|
||||
PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O')
|
||||
PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P')
|
||||
PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
|
||||
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R')
|
||||
|
||||
PORT_START("IN.2") // DO2
|
||||
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
|
||||
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T')
|
||||
PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U')
|
||||
PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
|
||||
PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W')
|
||||
PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X')
|
||||
PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
|
||||
PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
|
||||
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR('*')
|
||||
|
||||
PORT_START("IN.3") // DO4
|
||||
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Double")
|
||||
PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Triple")
|
||||
PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Word")
|
||||
PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Bonus")
|
||||
PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Minus")
|
||||
PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear")
|
||||
PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter")
|
||||
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
|
||||
PORT_START("IN.4") // DO5
|
||||
PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Flash")
|
||||
PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Solo")
|
||||
PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Score")
|
||||
PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
|
||||
PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
|
||||
PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
|
||||
PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
|
||||
PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Timer")
|
||||
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Review")
|
||||
INPUT_PORTS_END
|
||||
|
||||
// config
|
||||
|
@ -218,10 +381,16 @@ 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_c().set(FUNC(scrablexa_state::write_c));
|
||||
m_maincpu->write_d().set(FUNC(scrablexa_state::write_d));
|
||||
m_maincpu->write_e().set(FUNC(scrablexa_state::write_e));
|
||||
m_maincpu->read_a().set(FUNC(scrablexa_state::read_abs<0>));
|
||||
m_maincpu->read_b().set(FUNC(scrablexa_state::read_abs<1>));
|
||||
m_maincpu->read_sns().set(FUNC(scrablexa_state::read_abs<2>));
|
||||
|
||||
// video hardware
|
||||
PWM_DISPLAY(config, m_display).set_size(1, 1);
|
||||
PWM_DISPLAY(config, m_display).set_size(8, 14);
|
||||
m_display->set_segmask(0xff, 0x3fff);
|
||||
config.set_default_layout(layout_scrablexa);
|
||||
|
||||
// sound hardware
|
||||
|
@ -236,10 +405,145 @@ void scrablexa_state::scrablexa(machine_config &config)
|
|||
|
||||
ROM_START( scrablexa )
|
||||
ROM_REGION( 0x0800, "maincpu", 0 )
|
||||
ROM_LOAD( "mn1405ms", 0x0000, 0x0800, NO_DUMP )
|
||||
ROM_LOAD( "mn1405ms", 0x0000, 0x0800, CRC(d6d61d03) SHA1(b319cb0f0539e7516bb28f1182665b05b7dd16b1) )
|
||||
|
||||
ROM_REGION( 200, "maincpu:opla", 0 )
|
||||
ROM_LOAD( "mn1400_scrablexa_output.pla", 0, 200, NO_DUMP )
|
||||
ROM_REGION( 428, "maincpu:opla", 0 )
|
||||
ROM_LOAD( "mn1400_scrablexa_output.pla", 0, 428, CRC(555fe168) SHA1(cf19be34391dae0a8aacc7be53f2a3415fed3108) )
|
||||
ROM_END
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
Tomy Basketball
|
||||
* PCB label: TOMY, BASKET, 2E018E01
|
||||
* MN9008 (28-pin MN1400, AI0-AI3 replaced with CO0-CO3, die label: 1400 BM-0)
|
||||
* 2 7seg LEDs, 29 other LEDs, 1-bit sound
|
||||
|
||||
Two versions are known: one with a black bezel and one with a brown bezel,
|
||||
the internal hardware is the same.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
class tmbaskb_state : public hh_mn1400_state
|
||||
{
|
||||
public:
|
||||
tmbaskb_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
hh_mn1400_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void tmbaskb(machine_config &config);
|
||||
|
||||
private:
|
||||
void update_display();
|
||||
void write_c(u16 data);
|
||||
void write_d(u8 data);
|
||||
void write_e(u8 data);
|
||||
u8 read_b();
|
||||
};
|
||||
|
||||
// handlers
|
||||
|
||||
void tmbaskb_state::update_display()
|
||||
{
|
||||
u8 data = bitswap<8>(m_e << 4 | m_d,7,5,1,4,3,2,6,0);
|
||||
m_display->matrix((m_c >> 1 & 0x30) | (m_c & 0xf), data);
|
||||
}
|
||||
|
||||
void tmbaskb_state::write_c(u16 data)
|
||||
{
|
||||
// CO0,CO1: digit select
|
||||
// CO2,CO3,CO5,CO6: led select
|
||||
m_c = data;
|
||||
update_display();
|
||||
|
||||
// CO3,CO5: input mux
|
||||
m_inp_mux = bitswap<2>(data,5,3);
|
||||
|
||||
// CO7: speaker out
|
||||
m_speaker->level_w(BIT(data, 7));
|
||||
}
|
||||
|
||||
void tmbaskb_state::write_d(u8 data)
|
||||
{
|
||||
// DO0-DO3: led data
|
||||
m_d = data;
|
||||
update_display();
|
||||
}
|
||||
|
||||
void tmbaskb_state::write_e(u8 data)
|
||||
{
|
||||
// EO0-EO3: led data
|
||||
m_e = data;
|
||||
update_display();
|
||||
}
|
||||
|
||||
u8 tmbaskb_state::read_b()
|
||||
{
|
||||
// BI1-BI3: multiplexed inputs, BI0: score button
|
||||
return (read_inputs(2) & 0xe) | (m_inputs[2]->read() & 1);
|
||||
}
|
||||
|
||||
// inputs
|
||||
|
||||
static INPUT_PORTS_START( tmbaskb )
|
||||
PORT_START("IN.0") // CO3 BI (left)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Offense P")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Offense S")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Defense")
|
||||
|
||||
PORT_START("IN.1") // CO5 BI (right)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Offense P")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Offense S")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Defense")
|
||||
|
||||
PORT_START("IN.2") // BI0
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Score")
|
||||
|
||||
PORT_START("IN.3") // SNS
|
||||
PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) )
|
||||
PORT_CONFSETTING( 0x01, "1" )
|
||||
PORT_CONFSETTING( 0x00, "2" )
|
||||
PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) )
|
||||
PORT_CONFSETTING( 0x02, "1" ) // PRO1
|
||||
PORT_CONFSETTING( 0x00, "2" ) // PRO2
|
||||
INPUT_PORTS_END
|
||||
|
||||
// config
|
||||
|
||||
void tmbaskb_state::tmbaskb(machine_config &config)
|
||||
{
|
||||
// basic machine hardware
|
||||
MN1400(config, m_maincpu, 300000); // approximation - RC osc. R=18K, C=100pF
|
||||
m_maincpu->write_c().set(FUNC(tmbaskb_state::write_c));
|
||||
m_maincpu->set_c_mask(0x3ef);
|
||||
m_maincpu->write_d().set(FUNC(tmbaskb_state::write_d));
|
||||
m_maincpu->set_d_mask(0xf, 0x5321);
|
||||
m_maincpu->write_e().set(FUNC(tmbaskb_state::write_e));
|
||||
m_maincpu->read_b().set(FUNC(tmbaskb_state::read_b));
|
||||
m_maincpu->read_sns().set_ioport("IN.3");
|
||||
|
||||
// video hardware
|
||||
PWM_DISPLAY(config, m_display).set_size(6, 8);
|
||||
m_display->set_segmask(3, 0x7f);
|
||||
config.set_default_layout(layout_hh_mn1400_test);
|
||||
|
||||
// sound hardware
|
||||
SPEAKER(config, "mono").front_center();
|
||||
SPEAKER_SOUND(config, m_speaker);
|
||||
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
|
||||
}
|
||||
|
||||
// roms
|
||||
|
||||
ROM_START( tmbaskb )
|
||||
ROM_REGION( 0x0400, "maincpu", 0 )
|
||||
ROM_LOAD( "tomy_basket_mn9008", 0x0000, 0x0400, CRC(25be3560) SHA1(17855397cf05963c1381191cd4731860b8e180a8) )
|
||||
|
||||
ROM_REGION( 428, "maincpu:opla", 0 ) // 4-bit
|
||||
ROM_LOAD( "mn1400_common1_output.pla", 0, 428, CRC(07489d8b) SHA1(4fe65af8ee798490ed0bbe6a77d61713a2fb28b4) )
|
||||
ROM_END
|
||||
|
||||
|
||||
|
@ -255,4 +559,6 @@ ROM_END
|
|||
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
|
||||
SYST( 1979, compperf, 0, 0, compperf, compperf, compperf_state, empty_init, "Lakeside", "Computer Perfection", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
|
||||
|
||||
SYST( 1980, scrablexa, scrablex, 0, scrablexa, scrablexa, scrablexa_state, empty_init, "Selchow & Righter", "Scrabble Lexor: Computer Word Game (MN1405 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
|
||||
SYST( 1980, scrablexa, scrablex, 0, scrablexa, scrablexa, scrablexa_state, empty_init, "Selchow & Righter", "Scrabble Lexor: Computer Word Game (MN1405 version)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
SYST( 1980, tmbaskb, 0, 0, tmbaskb, tmbaskb, tmbaskb_state, empty_init, "Tomy", "Basketball (Tomy)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
|
||||
|
|
|
@ -162,7 +162,7 @@ u16 hh_pic16_state::read_inputs(int columns, u16 colmask)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (~m_inp_mux >> i & 1)
|
||||
if (!BIT(m_inp_mux, i))
|
||||
ret &= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -106,7 +106,7 @@ u8 hh_pps41_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -108,7 +108,7 @@ u8 hh_rw5000_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -276,7 +276,7 @@ u8 hh_sm510_state::read_inputs(int columns, int fixed)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
if (fixed >= 0)
|
||||
|
|
|
@ -103,7 +103,7 @@ u8 hh_smc1k_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -437,7 +437,7 @@ u8 hh_tms1k_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -202,7 +202,7 @@ u8 hh_ucom4_state::read_inputs(int columns)
|
|||
|
||||
// read selected input rows
|
||||
for (int i = 0; i < columns; i++)
|
||||
if (m_inp_mux >> i & 1)
|
||||
if (BIT(m_inp_mux, i))
|
||||
ret |= m_inputs[i]->read();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -11,7 +11,8 @@ Hardware notes:
|
|||
- Fujitsu MB8841 MCU
|
||||
- 8-digit 14-seg LEDs, 2-bit sound
|
||||
|
||||
There's also a version of this game on a Matsushita MN1405 MCU (see hh_mn1400.cpp).
|
||||
There's also a version of this game on a Matsushita MN1405 MCU (see hh_mn1400.cpp),
|
||||
even though it's a different MCU, the I/O is very similar.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
|
|
|
@ -18714,6 +18714,7 @@ gjungler // Gakken
|
|||
@source:handheld/hh_mn1400.cpp
|
||||
compperf // Lakeside
|
||||
scrablexa // Selchow & Righter
|
||||
tmbaskb // Tomy
|
||||
|
||||
@source:handheld/hh_pic16.cpp
|
||||
drdunk // Kmart
|
||||
|
|
Loading…
Reference in a new issue