moved starwbc.c, elecdet.c, unk3403.c, mathmagi.c, tandy12.c to hh_tms1k.c (before recompile, remove: apf.a, trs.a, skeleton.a --- kenner.a and ideal.a are obsolete)

This commit is contained in:
hap 2015-02-27 02:06:26 +01:00
parent 50d7d0f8ad
commit ebd15c9e25
7 changed files with 846 additions and 1379 deletions

View File

@ -1,313 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
/***************************************************************************
Ideal Electronic Detective
* TMS0980NLL MP6100A (die labeled 0980B-00)
hardware (and concept) is very similar to Parker Bros Stop Thief
This is an electronic board game. It requires game cards with suspect info,
and good old pen and paper to record game progress. To start the game, enter
difficulty(1-3), then number of players(1-4), then [ENTER]. Refer to the
manual for more information.
TODO:
- MCU clock is unknown
***************************************************************************/
#include "emu.h"
#include "cpu/tms0980/tms0980.h"
#include "sound/speaker.h"
#include "elecdet.lh"
// master clock is unknown, the value below is an approximation
#define MASTER_CLOCK (425000)
class elecdet_state : public driver_device
{
public:
elecdet_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_button_matrix(*this, "IN"),
m_speaker(*this, "speaker")
{ }
required_device<cpu_device> m_maincpu;
required_ioport_array<5> m_button_matrix;
required_device<speaker_sound_device> m_speaker;
UINT16 m_o;
bool m_power_on;
UINT16 m_display_state[0x10];
UINT16 m_display_cache[0x10];
UINT8 m_display_decay[0x100];
DECLARE_READ8_MEMBER(read_k);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_INPUT_CHANGED_MEMBER(power_button);
DECLARE_WRITE_LINE_MEMBER(auto_power_off);
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
virtual void machine_reset();
virtual void machine_start();
};
/***************************************************************************
LED Display
***************************************************************************/
// The device strobes the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
// decay time, in steps of 1ms
#define DISPLAY_DECAY_TIME 40
void elecdet_state::display_update()
{
UINT16 active_state[0x10];
for (int i = 0; i < 0x10; i++)
{
active_state[i] = 0;
for (int j = 0; j < 0x10; j++)
{
int di = j << 4 | i;
// turn on powered segments
if (m_power_on && m_display_state[i] >> j & 1)
m_display_decay[di] = DISPLAY_DECAY_TIME;
// determine active state
int ds = (m_display_decay[di] != 0) ? 1 : 0;
active_state[i] |= (ds << j);
}
}
// on difference, send to output
for (int i = 0; i < 0x10; i++)
if (m_display_cache[i] != active_state[i])
output_set_digit_value(i, active_state[i]);
memcpy(m_display_cache, active_state, sizeof(m_display_cache));
}
TIMER_DEVICE_CALLBACK_MEMBER(elecdet_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int i = 0; i < 0x100; i++)
if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
m_display_decay[i]--;
display_update();
}
/***************************************************************************
I/O
***************************************************************************/
READ8_MEMBER(elecdet_state::read_k)
{
// the Vss row is always on
UINT8 k = m_button_matrix[4]->read();
// read selected button rows
for (int i = 0; i < 4; i++)
{
const int ki[4] = { 0, 1, 4, 6 };
if (m_o >> ki[i] & 1)
k |= m_button_matrix[i]->read();
}
return k;
}
WRITE16_MEMBER(elecdet_state::write_r)
{
// R0-R6: select digit
UINT8 o = BITSWAP8(m_o,7,5,2,1,4,0,6,3) & 0x7f;
for (int i = 0; i < 7; i++)
m_display_state[i] = (data >> i & 1) ? o : 0;
display_update();
// R7,R8: speaker on
m_speaker->level_w((data & 0x180 && m_o & 0x80) ? 1 : 0);
}
WRITE16_MEMBER(elecdet_state::write_o)
{
// O0,O1,O4,O6: input mux
// O0-O6: led segments A-G
// O7: speaker out
m_o = data;
}
/***************************************************************************
Inputs
***************************************************************************/
INPUT_CHANGED_MEMBER(elecdet_state::power_button)
{
m_power_on = (bool)(FPTR)param;
m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE);
}
/* physical button layout and labels is like this:
[1] [2] [3] [SUSPECT]
[4] [5] [6] [PRIVATE QUESTION]
[7] [8] [9] [I ACCUSE]
[0] [ENTER]
[ON] [OFF] [END TURN]
*/
static INPUT_PORTS_START( elecdet )
PORT_START("IN.0") // O0 pin18
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
PORT_START("IN.1") // O1 pin17
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.2") // O4 pin14
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_START("IN.3") // O6 pin12
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Suspect")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.4") // Vss!
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, elecdet_state, power_button, (void *)true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, elecdet_state, power_button, (void *)false)
INPUT_PORTS_END
/***************************************************************************
Machine Config
***************************************************************************/
WRITE_LINE_MEMBER(elecdet_state::auto_power_off)
{
// TMS0980 auto power-off opcode
if (state)
{
m_power_on = false;
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
}
void elecdet_state::machine_reset()
{
m_power_on = true;
}
void elecdet_state::machine_start()
{
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_cache, 0, sizeof(m_display_cache));
memset(m_display_decay, 0, sizeof(m_display_decay));
m_o = 0;
m_power_on = false;
// register for savestates
save_item(NAME(m_display_state));
save_item(NAME(m_display_cache));
save_item(NAME(m_display_decay));
save_item(NAME(m_o));
save_item(NAME(m_power_on));
}
static MACHINE_CONFIG_START( elecdet, elecdet_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS0980, MASTER_CLOCK)
MCFG_TMS1XXX_READ_K_CB(READ8(elecdet_state, read_k))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(elecdet_state, write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(elecdet_state, write_r))
MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(elecdet_state, auto_power_off))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", elecdet_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_elecdet)
/* no video! */
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( elecdet )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD( "tms0980nll_mp6100a", 0x0000, 0x1000, CRC(6f396bb8) SHA1(1f104d4ca9bee0d4572be4779b7551dfe20c4f04) )
ROM_REGION( 1246, "maincpu:ipla", 0 )
ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
ROM_REGION( 1982, "maincpu:mpla", 0 )
ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
ROM_REGION( 352, "maincpu:opla", 0 )
ROM_LOAD( "tms0980_elecdet_opla.pla", 0, 352, CRC(652d19c3) SHA1(75550c2b293453b6b9efed88c8cc77195a53161f) )
ROM_REGION( 157, "maincpu:spla", 0 )
ROM_LOAD( "tms0980_elecdet_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
ROM_END
CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE )

File diff suppressed because it is too large Load Diff

View File

@ -1,273 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
/***************************************************************************
APF Mathemagician
* TMS1100 MP1030 - MCU
* 2 x DS8870N - Hex LED Digit Driver
* 2 x DS8861N - MOS-to-LED 5-Segment Driver
This is a tabletop educational calculator. It came with plastic overlays
for playing different kind of games. Refer to the manual on how to use it.
In short, to start from scratch, press [SEL]. By default the device is in
calculator teaching mode. If [SEL] is followed with 1-6 and then [NXT],
one of the games is started.
1) Number Machine
2) Countin' On
3) Walk The Plank
4) Gooey Gumdrop
5) Football
6) Lunar Lander
TODO:
- some of the led symbols are probably wrong, output PLA is unknown
- microinstructions PLA is not verified
***************************************************************************/
#include "emu.h"
#include "cpu/tms0980/tms0980.h"
#include "mathmagi.lh"
// master clock is a single stage RC oscillator: R=68K, C=82pf,
// according to the TMS 1000 series data manual this is around 200kHz
#define MASTER_CLOCK (200000)
class mathmagi_state : public driver_device
{
public:
mathmagi_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_button_matrix(*this, "IN")
{ }
required_device<tms1xxx_cpu_device> m_maincpu;
required_ioport_array<6> m_button_matrix;
UINT16 m_o;
UINT16 m_r;
DECLARE_READ8_MEMBER(read_k);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_WRITE16_MEMBER(write_r);
virtual void machine_start();
};
/***************************************************************************
I/O
***************************************************************************/
READ8_MEMBER(mathmagi_state::read_k)
{
UINT8 k = 0;
// read selected button rows
for (int i = 0; i < 6; i++)
{
const int ki[6] = { 3, 5, 6, 7, 9, 10 };
if (m_r >> ki[i] & 1)
k |= m_button_matrix[i]->read();
}
return k;
}
WRITE16_MEMBER(mathmagi_state::write_o)
{
// O1-O7: led segments A-G
// O0: N/C
m_o = data;
}
WRITE16_MEMBER(mathmagi_state::write_r)
{
// R3,R5-R7,R9,R10: input mux
// and outputs:
for (int i = 0; i < 11; i++)
{
if (data >> i & 1)
{
// R8: custom math symbols digit
// R9: custom equals digit
// R10: lamps
if (i >= 8)
for (int j = 0; j < 8; j++)
output_set_lamp_value(i*10 + j, m_o >> j & 1);
// R0-R7: 7seg leds
else
output_set_digit_value(i, m_o >> 1 & 0x7f);
}
}
m_r = data;
}
/***************************************************************************
Inputs
***************************************************************************/
/* physical button layout and labels is like this:
ON ONE [SEL] [NXT] [?] [/]
| | [7] [8] [9] [x]
OFF TWO [4] [5] [6] [-]
PLAYERS [1] [2] [3] [+]
[0] [_] [r] [=]
*/
static INPUT_PORTS_START( mathmagi )
PORT_START("IN.0") // R3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-")
PORT_START("IN.1") // R5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("_") // blank
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("r")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
PORT_START("IN.2") // R6
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
PORT_START("IN.3") // R7
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("NXT")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("?") // check
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
PORT_START("IN.4") // R9
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
PORT_START("IN.5") // R10
PORT_CONFNAME( 0x01, 0x00, "Players")
PORT_CONFSETTING( 0x00, "1" )
PORT_CONFSETTING( 0x01, "2" )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
/***************************************************************************
Machine Config
***************************************************************************/
void mathmagi_state::machine_start()
{
m_o = 0;
m_r = 0;
save_item(NAME(m_o));
save_item(NAME(m_r));
}
// LED segments A-G
enum
{
lA = 0x02,
lB = 0x04,
lC = 0x08,
lD = 0x10,
lE = 0x20,
lF = 0x40,
lG = 0x80
};
static const UINT16 mathmagi_output_pla[0x20] =
{
lA+lB+lC+lD+lE+lF, // 0
lB+lC, // 1
lA+lB+lG+lE+lD, // 2
lA+lB+lG+lC+lD, // 3
lF+lB+lG+lC, // 4
lA+lF+lG+lC+lD, // 5
lA+lF+lG+lC+lD+lE, // 6
lA+lB+lC, // 7
lA+lB+lC+lD+lE+lF+lG, // 8
lA+lB+lG+lF+lC+lD, // 9
lA+lB+lG+lE, // question mark
lE+lG, // r
lD, // underscore?
lA+lF+lG+lE+lD, // E
lG, // -
0, // empty
0, // empty
lG, // lamp 4 or MATH -
lD, // lamp 3
lF+lE+lD+lC+lG, // b
lB, // lamp 2
lB+lG, // MATH +
lB+lC, // MATH mul
lF+lG+lB+lC+lD, // y
lA, // lamp 1
lA+lG, // MATH div
lA+lD, // EQUALS
0, // ?
0, // ?
lE+lD+lC+lG, // o
0, // ?
lA+lF+lE+lD+lC // G
};
static MACHINE_CONFIG_START( mathmagi, mathmagi_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
MCFG_TMS1XXX_OUTPUT_PLA(mathmagi_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(mathmagi_state, read_k))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mathmagi_state, write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mathmagi_state, write_r))
MCFG_DEFAULT_LAYOUT(layout_mathmagi)
/* no video! */
/* no sound! */
MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( mathmagi )
ROM_REGION( 0x800, "maincpu", 0 )
ROM_LOAD( "mp1030", 0x0000, 0x800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
ROM_REGION( 365, "maincpu:opla", 0 )
ROM_LOAD( "tms1100_mathmagi_opla.pla", 0, 365, NO_DUMP )
ROM_END
COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, driver_device, 0, "APF Electronics Inc.", "Mathemagician", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )

View File

@ -1,297 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
/***************************************************************************
Kenner Star Wars - Electronic Battle Command
* TMS1100 MCU, labeled MP3438A
This is a small tabletop space-dogfighting game. To start the game,
press BASIC/INTER/ADV and enter P#(number of players), then
START TURN. Refer to the official manual for more information.
***************************************************************************/
#include "emu.h"
#include "cpu/tms0980/tms0980.h"
#include "sound/speaker.h"
#include "starwbc.lh"
// master clock is a single stage RC oscillator: R=51K, C=47pf,
// according to the TMS 1000 series data manual this is around 350kHz
#define MASTER_CLOCK (350000)
class starwbc_state : public driver_device
{
public:
starwbc_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_button_matrix(*this, "IN"),
m_speaker(*this, "speaker")
{ }
required_device<cpu_device> m_maincpu;
required_ioport_array<5> m_button_matrix;
required_device<speaker_sound_device> m_speaker;
UINT16 m_r;
UINT16 m_o;
UINT16 m_display_state[0x10];
UINT16 m_display_cache[0x10];
UINT8 m_display_decay[0x100];
DECLARE_READ8_MEMBER(read_k);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_WRITE16_MEMBER(write_r);
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void prepare_and_update();
virtual void machine_start();
};
/***************************************************************************
LED Display
***************************************************************************/
// The device strobes the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
// decay time, in steps of 1ms
#define DISPLAY_DECAY_TIME 40
void starwbc_state::display_update()
{
UINT16 active_state[0x10];
for (int i = 0; i < 0x10; i++)
{
active_state[i] = 0;
for (int j = 0; j < 0x10; j++)
{
int di = j << 4 | i;
// turn on powered segments
if (m_display_state[i] >> j & 1)
m_display_decay[di] = DISPLAY_DECAY_TIME;
// determine active state
int ds = (m_display_decay[di] != 0) ? 1 : 0;
active_state[i] |= (ds << j);
}
}
// on difference, send to output
for (int i = 0; i < 0x10; i++)
if (m_display_cache[i] != active_state[i])
{
output_set_digit_value(i, active_state[i]);
for (int j = 0; j < 8; j++)
output_set_lamp_value(i*10 + j, active_state[i] >> j & 1);
}
memcpy(m_display_cache, active_state, sizeof(m_display_cache));
}
TIMER_DEVICE_CALLBACK_MEMBER(starwbc_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int i = 0; i < 0x100; i++)
if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
m_display_decay[i]--;
display_update();
}
void starwbc_state::prepare_and_update()
{
UINT8 o = (m_o << 4 & 0xf0) | (m_o >> 4 & 0x0f);
const UINT8 mask[5] = { 0x30, 0xff, 0xff, 0x7f, 0x7f };
// R0,R2,R4,R6,R8
for (int i = 0; i < 5; i++)
m_display_state[i*2] = (m_r >> (i*2) & 1) ? (o & mask[i]) : 0;
display_update();
}
/***************************************************************************
I/O
***************************************************************************/
READ8_MEMBER(starwbc_state::read_k)
{
UINT8 k = 0;
// read selected button rows
for (int i = 0; i < 5; i++)
{
const int ki[5] = { 0, 1, 3, 5, 7 };
if (m_r >> ki[i] & 1)
k |= m_button_matrix[i]->read();
}
return k;
}
WRITE16_MEMBER(starwbc_state::write_r)
{
// R0,R2,R4: select lamp row
// R6,R8: select digit
// R0,R1,R3,R5,R7: input mux
// R9: piezo speaker
m_speaker->level_w(data >> 9 & 1);
m_r = data;
prepare_and_update();
}
WRITE16_MEMBER(starwbc_state::write_o)
{
// O0-O7: leds state
m_o = data;
prepare_and_update();
}
/***************************************************************************
Inputs
***************************************************************************/
/* physical button layout and labels is like this:
(reconnnaissance=yellow) (tactical reaction=green)
[MAGNA] [ENEMY] [EM] [BS] [SCR]
[BASIC] [INTER] [START TURN] [END TURN] [MOVE] [FIRE]
[ADV] [P#] [<] [^] [>] [v]
(game=blue) (maneuvers=red) */
static INPUT_PORTS_START( starwbc )
PORT_START("IN.0") // R0
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number")
PORT_START("IN.1") // R1
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("End Turn")
PORT_START("IN.2") // R3
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Magna Scan") // only used in adv. game
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Enemy Scan") // only used in adv. game
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Screen Up")
PORT_START("IN.3") // R5
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Evasive Maneuvers")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Move")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Fire")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Battle Stations")
PORT_START("IN.4") // R7
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right")
INPUT_PORTS_END
/***************************************************************************
Machine Config
***************************************************************************/
void starwbc_state::machine_start()
{
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_cache, 0, sizeof(m_display_cache));
memset(m_display_decay, 0, sizeof(m_display_decay));
m_r = 0;
m_o = 0;
// register for savestates
save_item(NAME(m_display_state));
save_item(NAME(m_display_cache));
save_item(NAME(m_display_decay));
save_item(NAME(m_r));
save_item(NAME(m_o));
}
static MACHINE_CONFIG_START( starwbc, starwbc_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
MCFG_TMS1XXX_READ_K_CB(READ8(starwbc_state, read_k))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(starwbc_state, write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(starwbc_state, write_r))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", starwbc_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_starwbc)
/* no video! */
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( starwbc )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1100_starwbc_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
ROM_REGION( 365, "maincpu:opla", 0 )
ROM_LOAD( "tms1100_starwbc_opla.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
ROM_END
ROM_START( starwbcp )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1100_starwbc_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
ROM_REGION( 365, "maincpu:opla", 0 )
ROM_LOAD( "tms1100_starwbc_opla.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
ROM_END
CONS( 1979, starwbc, 0, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command", GAME_SUPPORTS_SAVE )
CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command (prototype)", GAME_SUPPORTS_SAVE )

View File

@ -1,229 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
/***************************************************************************
Tandy Radio Shack Computerized Arcade (1981, 1982, 1995)
* TMS1100 CD7282SL
This handheld contains 12 minigames. It looks and plays like "Fabulous Fred"
by the Japanese company Mego Corp. in 1980, which in turn is a mix of Merlin
and Simon. Unlike Merlin and Simon, spin-offs like these were not successful.
There were releases with and without the prefix "Tandy-12", I don't know
which name was more common. Also not worth noting is that it needed five
batteries; 4 C-cells and a 9-volt.
Some of the games require accessories included with the toy (eg. the Baseball
game is played with a board representing the playing field). To start a game,
hold the [SELECT] button, then press [START] when the game button lights up.
As always, refer to the official manual for more information.
See below at the input defs for a list of the games.
TODO:
- output PLA is not verified
- microinstructions PLA is not verified
***************************************************************************/
#include "emu.h"
#include "cpu/tms0980/tms0980.h"
#include "sound/speaker.h"
#include "tandy12.lh" // clickable
// master clock is a single stage RC oscillator: R=39K, C=47pf,
// according to the TMS 1000 series data manual this is around 400kHz
#define MASTER_CLOCK (400000)
class tandy12_state : public driver_device
{
public:
tandy12_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_button_matrix(*this, "IN"),
m_speaker(*this, "speaker")
{ }
required_device<tms1xxx_cpu_device> m_maincpu;
required_ioport_array<5> m_button_matrix;
required_device<speaker_sound_device> m_speaker;
UINT16 m_r;
DECLARE_READ8_MEMBER(read_k);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_WRITE16_MEMBER(write_r);
virtual void machine_start();
};
/***************************************************************************
I/O
***************************************************************************/
READ8_MEMBER(tandy12_state::read_k)
{
UINT8 k = 0;
// read selected button rows
for (int i = 0; i < 5; i++)
if (m_r >> (i+5) & 1)
k |= m_button_matrix[i]->read();
return k;
}
WRITE16_MEMBER(tandy12_state::write_o)
{
// O0-O7: button lamps 1-8
for (int i = 0; i < 8; i++)
output_set_lamp_value(i+1, data >> i & 1);
}
WRITE16_MEMBER(tandy12_state::write_r)
{
// R0-R3: button lamps 9-12
for (int i = 0; i < 4; i++)
output_set_lamp_value(i+1 + 8, data >> i & 1);
// R10: speaker out
m_speaker->level_w(data >> 10 & 1);
// R5-R9: input mux
m_r = data;
}
/***************************************************************************
Inputs
***************************************************************************/
/* physical button layout and labels is like this:
REPEAT-2 SPACE-2
[O] OFF--ON [O]
[purple]1 [blue]5 [l-green]9
ORGAN TAG-IT TREASURE HUNT
[l-orange]2 [turquoise]6 [red]10
SONG WRITER ROULETTE COMPETE
[pink]3 [yellow]7 [violet]11
REPEAT BASEBALL FIRE AWAY
[green]4 [orange]8 [brown]12
TORPEDO REPEAT PLUS HIDE 'N SEEK
[O] [O] [O]
START SELECT PLAY-2/HIT-7
*/
static INPUT_PORTS_START( tandy12 )
PORT_START("IN.0") // R5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("12")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("11")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_START("IN.1") // R6
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Space-2")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Play-2/Hit-7")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Select")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Start")
PORT_START("IN.2") // R7
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat-2")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.3") // R8
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
PORT_START("IN.4") // R9
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
INPUT_PORTS_END
/***************************************************************************
Machine Config
***************************************************************************/
void tandy12_state::machine_start()
{
m_r = 0;
save_item(NAME(m_r));
}
static const UINT16 tandy12_output_pla[0x20] =
{
// these are certain
0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
0x80, 0x00, 0x00, 0x00, 0x00,
// rest is unused?
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static MACHINE_CONFIG_START( tandy12, tandy12_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
MCFG_TMS1XXX_OUTPUT_PLA(tandy12_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(tandy12_state, read_k))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(tandy12_state, write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tandy12_state, write_r))
MCFG_DEFAULT_LAYOUT(layout_tandy12)
/* no video! */
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( tandy12 )
ROM_REGION( 0x800, "maincpu", 0 )
ROM_LOAD( "cd7282sl", 0x0000, 0x800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
ROM_REGION( 365, "maincpu:opla", 0 )
ROM_LOAD( "tms1100_tandy12_opla.pla", 0, 365, NO_DUMP )
ROM_END
CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE )

View File

@ -1,211 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
/***************************************************************************
TMS1100NLL MP3403 DBS 7836 SINGAPORE some game board with 7-segs.
What old electronic game is this?
some clues:
- it's from 1978
- Merlin is MP3404, Amaze-A-Tron is MP3405, this one is MP3403
- it plays some short jingles (you need to be lucky with button mashing),
jingles feel like maybe a horse racing game
***************************************************************************/
#include "emu.h"
#include "cpu/tms0980/tms0980.h"
#include "sound/speaker.h"
// master clock is unknown, the value below is an approximation
#define MASTER_CLOCK (350000)
class unk3403_state : public driver_device
{
public:
unk3403_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_button_matrix(*this, "IN"),
m_speaker(*this, "speaker")
{ }
required_device<cpu_device> m_maincpu;
required_ioport_array<4> m_button_matrix;
required_device<speaker_sound_device> m_speaker;
UINT16 m_r;
UINT16 m_o;
DECLARE_READ8_MEMBER(read_k);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_WRITE16_MEMBER(write_r);
void leds_update();
virtual void machine_start();
};
/***************************************************************************
I/O
***************************************************************************/
void unk3403_state::leds_update()
{
// show debug clues
static UINT8 leds[0x10] = { 0 };
char msg[0x100] = { 0 };
char dig[0x100] = { 0 };
sprintf(msg, "R, *R, O[R]");
for (int i = 0; i < 11; i++)
{
if (m_r >> i & 1)
{
leds[i]=m_o;
}
sprintf(dig, "\n %X %c %02X",i, (m_r >> i & 1) ? 'X' : '_', leds[i]);
strcat(msg, dig);
}
popmessage("%s", msg);
}
READ8_MEMBER(unk3403_state::read_k)
{
UINT8 k = 0;
// read selected button rows
for (int i = 0; i < 4; i++)
{
if (m_r >> (i + 4) & 1)
k |= m_button_matrix[i]->read();
}
return k;
}
WRITE16_MEMBER(unk3403_state::write_r)
{
// R4-R7: input mux
// R10: maybe a switch or other button row?
// R9: speaker out
m_speaker->level_w(data >> 9 & 1);
// others: ?
m_r = data;
leds_update();
}
WRITE16_MEMBER(unk3403_state::write_o)
{
// ?
m_o = data;
leds_update();
}
/***************************************************************************
Inputs
***************************************************************************/
static INPUT_PORTS_START( unk3403 )
PORT_START("IN.0") // R4
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)
PORT_START("IN.1") // R5
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)
PORT_START("IN.2") // R6
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) // reset/newgame?
PORT_START("IN.3") // R7
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)
INPUT_PORTS_END
/***************************************************************************
Machine Config
***************************************************************************/
void unk3403_state::machine_start()
{
m_r = 0;
m_o = 0;
save_item(NAME(m_r));
save_item(NAME(m_o));
}
static const UINT16 unk3403_output_pla[0x20] =
{
/* O output PLA configuration currently unknown */
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
};
static MACHINE_CONFIG_START( unk3403, unk3403_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
MCFG_TMS1XXX_OUTPUT_PLA(unk3403_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(unk3403_state, read_k))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(unk3403_state, write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(unk3403_state, write_r))
/* no video! */
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( unk3403 )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "tms1100nll_mp3403", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
ROM_REGION( 365, "maincpu:opla", 0 )
ROM_LOAD( "tms1100_xxx_opla.pla", 0, 365, NO_DUMP )
ROM_END
CONS( 1978, unk3403, 0, 0, unk3403, unk3403, driver_device, 0, "<unknown>", "unknown TMS1100 electronic game", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )

View File

@ -735,14 +735,12 @@ DRVLIBS += \
$(MESSOBJ)/homebrew.a \
$(MESSOBJ)/homelab.a \
$(MESSOBJ)/hp.a \
$(MESSOBJ)/ideal.a \
$(MESSOBJ)/imp.a \
$(MESSOBJ)/intel.a \
$(MESSOBJ)/interton.a \
$(MESSOBJ)/intv.a \
$(MESSOBJ)/isc.a \
$(MESSOBJ)/kaypro.a \
$(MESSOBJ)/kenner.a \
$(MESSOBJ)/koei.a \
$(MESSOBJ)/kyocera.a \
$(MESSOBJ)/luxor.a \
@ -1004,7 +1002,6 @@ $(MESSOBJ)/amstrad.a: \
$(MESSOBJ)/apf.a: \
$(MESS_DRIVERS)/apf.o \
$(MESS_DRIVERS)/mathmagi.o \
$(MESSOBJ)/apollo.a: \
$(MESS_DRIVERS)/apollo.o $(MESS_MACHINE)/apollo.o $(MESS_MACHINE)/apollo_dbg.o $(MESS_MACHINE)/apollo_kbd.o $(MESS_VIDEO)/apollo.o \
@ -1333,9 +1330,6 @@ $(MESSOBJ)/intel.a: \
$(MESS_DRIVERS)/sdk85.o \
$(MESS_DRIVERS)/sdk86.o \
$(MESSOBJ)/ideal.a: \
$(MESS_DRIVERS)/elecdet.o \
$(MESSOBJ)/imp.a: \
$(MESS_DRIVERS)/tim011.o \
$(MESS_DRIVERS)/tim100.o \
@ -1352,9 +1346,6 @@ $(MESSOBJ)/isc.a: \
$(MESSOBJ)/kaypro.a: \
$(MESS_DRIVERS)/kaypro.o $(MESS_MACHINE)/kaypro.o $(MESS_MACHINE)/kay_kbd.o $(MESS_VIDEO)/kaypro.o \
$(MESSOBJ)/kenner.a: \
$(MESS_DRIVERS)/starwbc.o \
$(MESSOBJ)/koei.a: \
$(MESS_DRIVERS)/pasogo.o \
@ -1825,7 +1816,6 @@ $(MESSOBJ)/trs.a: \
$(MESS_MACHINE)/dragon.o \
$(MESS_MACHINE)/dgnalpha.o \
$(MESS_VIDEO)/gime.o \
$(MESS_DRIVERS)/tandy12.o \
$(MESS_DRIVERS)/trs80.o $(MESS_MACHINE)/trs80.o $(MESS_VIDEO)/trs80.o \
$(MESS_DRIVERS)/trs80m2.o $(MESS_MACHINE)/trs80m2kb.o \
$(MESS_DRIVERS)/tandy2k.o $(MESS_MACHINE)/tandy2kb.o \
@ -2017,7 +2007,6 @@ $(MESSOBJ)/skeleton.a: \
$(MESS_DRIVERS)/ti630.o \
$(MESS_DRIVERS)/tsispch.o \
$(MESS_DRIVERS)/unistar.o \
$(MESS_DRIVERS)/unk3403.o \
$(MESS_DRIVERS)/v6809.o \
$(MESS_DRIVERS)/vector4.o \
$(MESS_DRIVERS)/vii.o \
@ -2129,7 +2118,6 @@ $(MESS_DRIVERS)/dmv.o: $(MESS_LAYOUT)/dmv.lh
$(MESS_DRIVERS)/dolphunk.o: $(MESS_LAYOUT)/dolphunk.lh
$(MESS_DRIVERS)/eacc.o: $(MESS_LAYOUT)/eacc.lh
$(MESS_DRIVERS)/edracula.o: $(MESS_LAYOUT)/edracula.lh
$(MESS_DRIVERS)/elecdet.o: $(MESS_LAYOUT)/elecdet.lh
$(MESS_DRIVERS)/elekscmp.o: $(MESS_LAYOUT)/elekscmp.lh
$(MESS_DRIVERS)/elf.o: $(MESS_LAYOUT)/elf2.lh
$(MESS_MACHINE)/esqvfd.o: $(MESS_LAYOUT)/esq2by40.lh \
@ -2145,7 +2133,11 @@ $(MESS_DRIVERS)/h8.o: $(MESS_LAYOUT)/h8.lh
$(MESS_DRIVERS)/hh_tms1k.o: $(MESS_LAYOUT)/amaztron.lh \
$(MESS_LAYOUT)/comp4.lh \
$(MESS_LAYOUT)/ebball.lh \
$(MESS_LAYOUT)/elecdet.lh \
$(MESS_LAYOUT)/mathmagi.lh \
$(MESS_LAYOUT)/simon.lh \
$(MESS_LAYOUT)/starwbc.lh \
$(MESS_LAYOUT)/tandy12.lh \
$(MESS_LAYOUT)/tc4.lh
$(MESS_DRIVERS)/ie15.o: $(MESS_LAYOUT)/ie15.lh
$(MESS_DRIVERS)/instruct.o: $(MESS_LAYOUT)/instruct.lh
@ -2156,7 +2148,6 @@ $(MESS_DRIVERS)/lc80.o: $(MESS_LAYOUT)/lc80.lh
$(MESS_DRIVERS)/llc.o: $(MESS_LAYOUT)/llc1.lh
$(MESS_DRIVERS)/lynx.o: $(MESS_LAYOUT)/lynx.lh
$(MESS_DRIVERS)/mac.o: $(MESS_LAYOUT)/mac.lh
$(MESS_DRIVERS)/mathmagi.o: $(MESS_LAYOUT)/mathmagi.lh
$(MESS_MACHINE)/megacd.o: $(MESS_LAYOUT)/megacd.lh
$(MESS_DRIVERS)/mekd2.o: $(MESS_LAYOUT)/mekd2.lh
$(MESS_DRIVERS)/mephisto.o: $(MESS_LAYOUT)/mephisto.lh
@ -2198,14 +2189,12 @@ $(MESS_DRIVERS)/slc1.o: $(MESS_LAYOUT)/slc1.lh
$(MESS_DRIVERS)/sms.o: $(MESS_LAYOUT)/sms1.lh
$(MESS_DRIVERS)/splitsec.o: $(MESS_LAYOUT)/bankshot.lh \
$(MESS_LAYOUT)/splitsec.lh
$(MESS_DRIVERS)/starwbc.o: $(MESS_LAYOUT)/starwbc.lh
$(MESS_DRIVERS)/stopthie.o: $(MESS_LAYOUT)/stopthie.lh
$(MESS_DRIVERS)/super80.o: $(MESS_LAYOUT)/super80.lh
$(MESS_DRIVERS)/supercon.o: $(MESS_LAYOUT)/supercon.lh
$(MESS_DRIVERS)/svision.o: $(MESS_LAYOUT)/svision.lh
$(MESS_DRIVERS)/svmu.o: $(MESS_LAYOUT)/svmu.lh
$(MESS_DRIVERS)/sym1.o: $(MESS_LAYOUT)/sym1.lh
$(MESS_DRIVERS)/tandy12.o: $(MESS_LAYOUT)/tandy12.lh
$(MESS_DRIVERS)/tavernie.o: $(MESS_LAYOUT)/tavernie.lh
$(MESS_DRIVERS)/tb303.o: $(MESS_LAYOUT)/tb303.lh
$(MESS_DRIVERS)/tc4.o: $(MESS_LAYOUT)/tc4.lh