Previous 199869 Revisions Next

r36116 Friday 27th February, 2015 at 02:24:38 UTC by hap
moved splitsec.c, stopthie.c, merlin.c, cnsector.c to hh_tms1k.c (remove parker.a before recompile)
[src/mess]mess.mak
[src/mess/drivers]cnsector.c hh_tms1k.c merlin.c splitsec.c
[src/mess/layout]cnsector.lay

trunk/src/mess/drivers/cnsector.c
r244627r244628
1// license:BSD-3-Clause
2// copyright-holders:hap
3/***************************************************************************
4
5  Parker Brothers Code Name: Sector, by Bob Doyle
6  * MP0905BNL ZA0379 (die labeled 0970F-05B)
7
8  This is a tabletop submarine pursuit game. A grid board and small toy
9  boats are used to remember your locations (a Paint app should be ok too).
10  Refer to the official manual for more information, it is not a simple game.
11
12
13  TODO:
14  - MCU clock is unknown
15
16***************************************************************************/
17
18#include "emu.h"
19#include "cpu/tms0980/tms0980.h"
20
21#include "cnsector.lh"
22
23// master clock is unknown, the value below is an approximation
24#define MASTER_CLOCK (250000)
25
26
27class cnsector_state : public driver_device
28{
29public:
30   cnsector_state(const machine_config &mconfig, device_type type, const char *tag)
31      : driver_device(mconfig, type, tag),
32      m_maincpu(*this, "maincpu"),
33      m_button_matrix(*this, "IN")
34   { }
35
36   required_device<cpu_device> m_maincpu;
37   required_ioport_array<5> m_button_matrix;
38
39   UINT16 m_o;
40
41   UINT16 m_display_state[0x10];
42   UINT16 m_display_cache[0x10];
43   UINT8 m_display_decay[0x100];
44
45   DECLARE_READ8_MEMBER(read_k);
46   DECLARE_WRITE16_MEMBER(write_o);
47   DECLARE_WRITE16_MEMBER(write_r);
48
49   TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
50   void display_update();
51
52   virtual void machine_start();
53};
54
55
56
57/***************************************************************************
58
59  LED Display
60
61***************************************************************************/
62
63// The device strobes the outputs very fast, it is unnoticeable to the user.
64// To prevent flickering here, we need to simulate a decay.
65
66// decay time, in steps of 1ms
67#define DISPLAY_DECAY_TIME 40
68
69void cnsector_state::display_update()
70{
71   UINT16 active_state[0x10];
72
73   for (int i = 0; i < 0x10; i++)
74   {
75      active_state[i] = 0;
76
77      for (int j = 0; j < 0x10; j++)
78      {
79         int di = j << 4 | i;
80
81         // turn on powered segments
82         if (m_display_state[i] >> j & 1)
83            m_display_decay[di] = DISPLAY_DECAY_TIME;
84
85         // determine active state
86         int ds = (m_display_decay[di] != 0) ? 1 : 0;
87         active_state[i] |= (ds << j);
88      }
89   }
90
91   // on difference, send to output
92   for (int i = 0; i < 0x10; i++)
93      if (m_display_cache[i] != active_state[i])
94         output_set_digit_value(i, active_state[i]);
95
96   memcpy(m_display_cache, active_state, sizeof(m_display_cache));
97}
98
99TIMER_DEVICE_CALLBACK_MEMBER(cnsector_state::display_decay_tick)
100{
101   // slowly turn off unpowered segments
102   for (int i = 0; i < 0x100; i++)
103      if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
104         m_display_decay[i]--;
105
106   display_update();
107}
108
109
110
111/***************************************************************************
112
113  I/O
114
115***************************************************************************/
116
117READ8_MEMBER(cnsector_state::read_k)
118{
119   UINT8 k = 0;
120
121   // read selected button rows
122   for (int i = 0; i < 5; i++)
123      if (m_o >> i & 1)
124         k |= m_button_matrix[i]->read();
125
126   return k;
127}
128
129WRITE16_MEMBER(cnsector_state::write_r)
130{
131   // R0-R5: select digit (right-to-left)
132   for (int i = 0; i < 6; i++)
133      m_display_state[i] = (data >> i & 1) ? m_o : 0;
134   display_update();
135
136   // R6-R9: direction leds
137   for (int i = 6; i < 10; i++)
138      output_set_lamp_value(i - 6, data >> i & 1);
139}
140
141WRITE16_MEMBER(cnsector_state::write_o)
142{
143   // O0-O4: input mux
144   // O0-O7: digit segments
145   m_o = data;
146}
147
148
149
150/***************************************************************************
151
152  Inputs
153
154***************************************************************************/
155
156static INPUT_PORTS_START( cnsector )
157   PORT_START("IN.0") // O0
158   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship")
159   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left")
160   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
161   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range")
162
163   PORT_START("IN.1") // O1
164   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim")
165   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right")
166   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
167   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
168
169   PORT_START("IN.2") // O2
170   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire")
171   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button
172   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
173   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall")
174
175   PORT_START("IN.3") // O3
176   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button
177   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower")
178   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
179   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
180
181   PORT_START("IN.4") // O4
182   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode")
183   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster")
184   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
185   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship")
186INPUT_PORTS_END
187
188
189
190/***************************************************************************
191
192  Machine Config
193
194***************************************************************************/
195
196void cnsector_state::machine_start()
197{
198   // zerofill
199   memset(m_display_state, 0, sizeof(m_display_state));
200   memset(m_display_cache, 0, sizeof(m_display_cache));
201   memset(m_display_decay, 0, sizeof(m_display_decay));
202
203   m_o = 0;
204
205   // register for savestates
206   save_item(NAME(m_display_state));
207   save_item(NAME(m_display_cache));
208   save_item(NAME(m_display_decay));
209
210   save_item(NAME(m_o));
211}
212
213
214static MACHINE_CONFIG_START( cnsector, cnsector_state )
215
216   /* basic machine hardware */
217   MCFG_CPU_ADD("maincpu", TMS0970, MASTER_CLOCK)
218   MCFG_TMS1XXX_READ_K_CB(READ8(cnsector_state, read_k))
219   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(cnsector_state, write_o))
220   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(cnsector_state, write_r))
221
222   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", cnsector_state, display_decay_tick, attotime::from_msec(1))
223
224   MCFG_DEFAULT_LAYOUT(layout_cnsector)
225
226   /* no video! */
227
228   /* no sound! */
229MACHINE_CONFIG_END
230
231
232
233/***************************************************************************
234
235  Game driver(s)
236
237***************************************************************************/
238
239ROM_START( cnsector )
240   ROM_REGION( 0x0400, "maincpu", 0 )
241   ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) )
242
243   ROM_REGION( 782, "maincpu:ipla", 0 )
244   ROM_LOAD( "tms0970_default_ipla.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
245   ROM_REGION( 860, "maincpu:mpla", 0 )
246   ROM_LOAD( "tms0970_cnsector_mpla.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) )
247   ROM_REGION( 352, "maincpu:opla", 0 )
248   ROM_LOAD( "tms0970_cnsector_opla.pla", 0, 352, CRC(7c0bdcd6) SHA1(dade774097e8095dca5deac7b2367d0c701aca51) )
249   ROM_REGION( 157, "maincpu:spla", 0 )
250   ROM_LOAD( "tms0970_cnsector_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) )
251ROM_END
252
253
254CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
trunk/src/mess/drivers/hh_tms1k.c
r244627r244628
1414#include "sound/speaker.h"
1515
1616#include "amaztron.lh"
17#include "bankshot.lh"
18#include "cnsector.lh"
1719#include "ebball.lh"
1820#include "elecdet.lh"
1921#include "comp4.lh"
2022#include "mathmagi.lh"
23#include "merlin.lh"
2124#include "simon.lh"
25#include "splitsec.lh"
2226#include "starwbc.lh"
27#include "stopthie.lh"
2328#include "tandy12.lh"
2429#include "tc4.lh"
2530
r244627r244628
96101   DECLARE_WRITE16_MEMBER(simon_write_r);
97102   DECLARE_WRITE16_MEMBER(simon_write_o);
98103
104   DECLARE_READ8_MEMBER(cnsector_read_k);
105   DECLARE_WRITE16_MEMBER(cnsector_write_r);
106   DECLARE_WRITE16_MEMBER(cnsector_write_o);
107
108   DECLARE_READ8_MEMBER(merlin_read_k);
109   DECLARE_WRITE16_MEMBER(merlin_write_r);
110   DECLARE_WRITE16_MEMBER(merlin_write_o);
111
112   DECLARE_READ8_MEMBER(stopthief_read_k);
113   DECLARE_WRITE16_MEMBER(stopthief_write_r);
114   DECLARE_WRITE16_MEMBER(stopthief_write_o);
115
116   void bankshot_display();
117   DECLARE_READ8_MEMBER(bankshot_read_k);
118   DECLARE_WRITE16_MEMBER(bankshot_write_r);
119   DECLARE_WRITE16_MEMBER(bankshot_write_o);
120
121   void splitsec_display();
122   DECLARE_READ8_MEMBER(splitsec_read_k);
123   DECLARE_WRITE16_MEMBER(splitsec_write_r);
124   DECLARE_WRITE16_MEMBER(splitsec_write_o);
125
99126   void tandy12_display();
100127   DECLARE_READ8_MEMBER(tandy12_read_k);
101128   DECLARE_WRITE16_MEMBER(tandy12_write_r);
r244627r244628
452479      m_display_state[y] = (m_r >> (y + 8) & 1) ? m_o : 0;
453480   }
454481   
455   // R6,R7: lamps -> lamp20, lamp21
482   // R6,R7: lamps (-> lamp20,21)
456483   m_display_state[2] = m_r >> 6 & 3;
457484   
458485   display_update();
r244627r244628
11701197
11711198
11721199
1200/***************************************************************************
11731201
1202  Parker Brothers Code Name: Sector, by Bob Doyle
1203  * MP0905BNL ZA0379 (die labeled 0970F-05B)
11741204
1205  This is a tabletop submarine pursuit game. A grid board and small toy
1206  boats are used to remember your locations (a Paint app should be ok too).
1207  Refer to the official manual for more information, it is not a simple game.
11751208
11761209
1210  TODO:
1211  - MCU clock is unknown
1212
1213***************************************************************************/
1214
1215READ8_MEMBER(hh_tms1k_state::cnsector_read_k)
1216{
1217   return read_inputs(5);
1218}
1219
1220WRITE16_MEMBER(hh_tms1k_state::cnsector_write_r)
1221{
1222   m_display_maxy = 7;
1223   m_display_maxx = 8;
1224
1225   // R0-R5: select digit (right-to-left)
1226   for (int y = 0; y < 6; y++)
1227   {
1228      m_7seg_mask[y] = 0xff;
1229      m_display_state[y] = (data >> y & 1) ? m_o : 0;
1230   }
1231
1232   // R6-R9: direction leds (-> lamp60-63)
1233   m_display_state[6] = data >> 6 & 0xf;
1234   
1235   display_update();
1236}
1237
1238WRITE16_MEMBER(hh_tms1k_state::cnsector_write_o)
1239{
1240   // O0-O4: input mux
1241   m_inp_mux = data & 0x1f;
1242   
1243   // O0-O7: digit segments
1244   m_o = data;
1245}
1246
1247
1248
1249static INPUT_PORTS_START( cnsector )
1250   PORT_START("IN.0") // O0
1251   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship")
1252   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left")
1253   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
1254   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range")
1255
1256   PORT_START("IN.1") // O1
1257   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim")
1258   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right")
1259   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
1260   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
1261
1262   PORT_START("IN.2") // O2
1263   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire")
1264   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button
1265   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
1266   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall")
1267
1268   PORT_START("IN.3") // O3
1269   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button
1270   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower")
1271   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
1272   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
1273
1274   PORT_START("IN.4") // O4
1275   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode")
1276   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster")
1277   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
1278   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship")
1279INPUT_PORTS_END
1280
1281
1282static MACHINE_CONFIG_START( cnsector, hh_tms1k_state )
1283
1284   /* basic machine hardware */
1285   MCFG_CPU_ADD("maincpu", TMS0970, 250000) // approximation - unknown freq
1286   MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, cnsector_read_k))
1287   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, cnsector_write_r))
1288   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, cnsector_write_o))
1289
1290   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
1291   MCFG_DEFAULT_LAYOUT(layout_cnsector)
1292
1293   /* no video! */
1294
1295   /* no sound! */
1296MACHINE_CONFIG_END
1297
1298
1299
1300
11771301/***************************************************************************
11781302
1303  Parker Bros Merlin handheld computer game, by Bob Doyle
1304  * TMS1100NLL MP3404A-N2
1305
1306  To start a game, press NEW GAME, followed by a number:
1307  1: Tic-Tac-Toe
1308  2: Music Machine
1309  3: Echo
1310  4: Blackjack 13
1311  5: Magic Square
1312  6: Mindbender
1313
1314  Refer to the official manual for more information on the games.
1315
1316
1317  Other handhelds assumed to be on similar hardware:
1318  - Dr. Smith - by Tomy, released in Japan (basically a white version of Merlin,
1319    let's assume for now that the ROM contents is identical)
1320  - Master Merlin
1321
1322***************************************************************************/
1323
1324READ8_MEMBER(hh_tms1k_state::merlin_read_k)
1325{
1326   return read_inputs(4);
1327}
1328
1329WRITE16_MEMBER(hh_tms1k_state::merlin_write_r)
1330{
1331   /* leds:
1332
1333        R0
1334   R1   R2   R3
1335   R4   R5   R6
1336   R7   R8   R9
1337        R10
1338   */
1339   m_display_maxx = 11;
1340   m_display_state[0] = data;
1341   display_update();
1342}
1343
1344WRITE16_MEMBER(hh_tms1k_state::merlin_write_o)
1345{
1346   // O4-O6: speaker out (paralleled for increased current driving capability)
1347   static const int count[8] = { 0, 1, 1, 2, 1, 2, 2, 3 };
1348   m_speaker->level_w(count[data >> 4 & 7]);
1349
1350   // O0-O3: input mux
1351   // O7: N/C
1352   m_inp_mux = data & 0xf;
1353}
1354
1355
1356
1357static INPUT_PORTS_START( merlin )
1358   PORT_START("IN.0") // O0
1359   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0")
1360   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1")
1361   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3")
1362   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2")
1363
1364   PORT_START("IN.1") // O1
1365   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4")
1366   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5")
1367   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7")
1368   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6")
1369
1370   PORT_START("IN.2") // O2
1371   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8")
1372   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9")
1373   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Same Game")
1374   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10")
1375
1376   PORT_START("IN.3") // O3
1377   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
1378   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn")
1379   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me")
1380   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game")
1381INPUT_PORTS_END
1382
1383
1384static const INT16 merlin_speaker_levels[] = { 0, 10922, 21845, 32767 };
1385
1386
1387static MACHINE_CONFIG_START( merlin, hh_tms1k_state )
1388
1389   /* basic machine hardware */
1390   MCFG_CPU_ADD("maincpu", TMS1100, 350000) // RC osc. R=33K, C=100pf -> ~350kHz
1391   MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, merlin_read_k))
1392   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, merlin_write_r))
1393   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, merlin_write_o))
1394
1395   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
1396   MCFG_DEFAULT_LAYOUT(layout_merlin)
1397
1398   /* no video! */
1399
1400   /* sound hardware */
1401   MCFG_SPEAKER_STANDARD_MONO("mono")
1402   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
1403   MCFG_SPEAKER_LEVELS(4, merlin_speaker_levels)
1404   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1405MACHINE_CONFIG_END
1406
1407
1408/***************************************************************************
1409
1410  Parker Brothers Stop Thief, by Bob Doyle
1411  * TMS0980NLL MP6101B (die labeled 0980B-01A)
1412
1413  Stop Thief is actually a board game, the electronic device emulated here
1414  (called Electronic Crime Scanner) is an accessory. To start a game, press
1415  the ON button. Otherwise, it is in test-mode where you can hear all sounds.
1416
1417
1418  TODO:
1419  - MCU clock is unknown
1420  - stopthiep: unable to start a game (may be intentional?)
1421
1422***************************************************************************/
1423
1424READ8_MEMBER(hh_tms1k_state::stopthief_read_k)
1425{
1426   // note: the Vss row is always on
1427   return m_inp_matrix[2]->read() | read_inputs(2);
1428}
1429
1430WRITE16_MEMBER(hh_tms1k_state::stopthief_write_r)
1431{
1432   m_display_maxy = 3;
1433   m_display_maxx = 7;
1434
1435   // R0-R2: select digit
1436   UINT8 o = BITSWAP8(m_o,3,5,2,1,4,0,6,7);
1437   for (int y = 0; y < m_display_maxy; y++)
1438   {
1439      m_7seg_mask[y] = 0x7f;
1440      m_display_state[y] = (data >> y & 1) ? o : 0;
1441   }
1442
1443   display_update();
1444
1445   // R3-R8: speaker on
1446   m_speaker->level_w((data & 0x1f8 && m_o & 8) ? 1 : 0);
1447}
1448
1449WRITE16_MEMBER(hh_tms1k_state::stopthief_write_o)
1450{
1451   // O0,O6: input mux
1452   m_inp_mux = (data & 1) | (data >> 5 & 2);
1453   
1454   // O3: speaker out
1455   // O0-O2,O4-O7: led segments A-G
1456   m_o = data;
1457}
1458
1459
1460/* physical button layout and labels is like this:
1461
1462    [1] [2] [OFF]
1463    [3] [4] [ON]
1464    [5] [6] [T, TIP]
1465    [7] [8] [A, ARREST]
1466    [9] [0] [C, CLUE]
1467*/
1468
1469static INPUT_PORTS_START( stopthief )
1470   PORT_START("IN.0") // O0
1471   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
1472   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
1473   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
1474   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
1475   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
1476
1477   PORT_START("IN.1") // O6
1478   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
1479   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
1480   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
1481   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
1482   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
1483
1484   // note: even though power buttons are on the matrix, they are not CPU-controlled
1485   PORT_START("IN.2") // Vss!
1486   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)true)
1487   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip")
1488   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest")
1489   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue")
1490   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)false)
1491INPUT_PORTS_END
1492
1493static MACHINE_CONFIG_START( stopthief, hh_tms1k_state )
1494
1495   /* basic machine hardware */
1496   MCFG_CPU_ADD("maincpu", TMS0980, 425000) // approximation - unknown freq
1497   MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, stopthief_read_k))
1498   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, stopthief_write_r))
1499   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, stopthief_write_o))
1500   MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(hh_tms1k_state, tms0980_auto_power_off))
1501
1502   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
1503   MCFG_DEFAULT_LAYOUT(layout_stopthie)
1504
1505   /* no video! */
1506
1507   /* sound hardware */
1508   MCFG_SPEAKER_STANDARD_MONO("mono")
1509   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
1510   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1511MACHINE_CONFIG_END
1512
1513
1514
1515
1516/***************************************************************************
1517
1518  Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen
1519  * TMS1400NLL MP7313-N2 (die labeled MP7313)
1520
1521  Bank Shot is an electronic pool game. To select a game, repeatedly press
1522  the [SELECT] button, then press [CUE UP] to start. Refer to the official
1523  manual for more information. The game selections are:
1524  1: Straight Pool (1 player)
1525  2: Straight Pool (2 players)
1526  3: Poison Pool
1527  4: Trick Shots
1528
1529
1530  TODO:
1531  - bankshot: the cue ball led is strobed more often than other leds,
1532    making it look brighter. We need more accurate led decay simulation
1533    for this to work.
1534  - MCU clock is unknown
1535
1536***************************************************************************/
1537
1538void hh_tms1k_state::bankshot_display()
1539{
1540   m_display_maxy = 11;
1541   m_display_maxx = 7;
1542   
1543   // update current state
1544   for (int y = 0; y < m_display_maxy; y++)
1545      m_display_state[y] = (m_r >> y & 1) ? m_o : 0;
1546   
1547   display_update();
1548}
1549
1550READ8_MEMBER(hh_tms1k_state::bankshot_read_k)
1551{
1552   return read_inputs(2);
1553}
1554
1555
1556WRITE16_MEMBER(hh_tms1k_state::bankshot_write_r)
1557{
1558   // R0: speaker out
1559   m_speaker->level_w(data & 1);
1560
1561   // R2,R3: input mux
1562   m_inp_mux = data >> 2 & 3;
1563
1564   // R2-R10: led rows
1565   m_r = data & ~3;
1566   bankshot_display();
1567}
1568
1569WRITE16_MEMBER(hh_tms1k_state::bankshot_write_o)
1570{
1571   // O0-O6: led columns
1572   // O7: N/C
1573   m_o = data;
1574   bankshot_display();
1575}
1576
1577
1578
1579
1580/* physical button layout and labels is like this:
1581  (note: remember that you can rotate the display in MESS)
1582
1583    [SELECT  [BALL UP] [BALL OVER]
1584     SCORE]
1585
1586    ------  led display  ------
1587
1588    [ANGLE]  [AIM]     [CUE UP
1589                        SHOOT]
1590*/
1591
1592static INPUT_PORTS_START( bankshot )
1593   PORT_START("IN.0") // R2
1594   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle")
1595   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim")
1596   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up / Shoot")
1597   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
1598
1599   PORT_START("IN.1") // R3
1600   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select / Score")
1601   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up")
1602   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over")
1603   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
1604INPUT_PORTS_END
1605
1606
1607static MACHINE_CONFIG_START( bankshot, hh_tms1k_state )
1608
1609   /* basic machine hardware */
1610   MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pf, but unknown RC curve
1611   MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, bankshot_read_k))
1612   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, bankshot_write_r))
1613   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, bankshot_write_o))
1614
1615   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
1616   MCFG_DEFAULT_LAYOUT(layout_bankshot)
1617
1618   /* no video! */
1619
1620   /* sound hardware */
1621   MCFG_SPEAKER_STANDARD_MONO("mono")
1622   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
1623   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1624MACHINE_CONFIG_END
1625
1626
1627
1628
1629/***************************************************************************
1630
1631  Parker Brothers Split Second
1632  * TMS1400NLL MP7314-N2 (die labeled MP7314)
1633
1634  This is an electronic handheld reflex gaming device, it's straightforward
1635  to use. The included mini-games are:
1636  1, 2, 3: Mad Maze*
1637  4, 5: Space Attack*
1638  6: Auto Cross
1639  7: Stomp
1640  8: Speedball
1641
1642  *: higher number indicates higher difficulty
1643
1644***************************************************************************/
1645
1646
1647/* display layout, where number xy is lamp R(x),O(y)
1648
1649       00    02    04
1650    10 01 12 03 14 05 16
1651       11    13    15
1652    20 21 22 23 24 25 26
1653       31    33    35
1654    30 41 32 43 34 45 36
1655       51    53    55
1656    40 61 42 63 44 65 46
1657       71    73    75
1658    50 60 52 62 54 64 56
1659       70    72    74
1660*/
1661
1662void hh_tms1k_state::splitsec_display()
1663{
1664   m_display_maxy = 8;
1665   m_display_maxx = 7;
1666   
1667   // update current state
1668   for (int y = 0; y < m_display_maxy; y++)
1669      m_display_state[y] = (m_r >> y & 1) ? m_o : 0;
1670   
1671   display_update();
1672}
1673
1674READ8_MEMBER(hh_tms1k_state::splitsec_read_k)
1675{
1676   return read_inputs(2);
1677}
1678
1679WRITE16_MEMBER(hh_tms1k_state::splitsec_write_r)
1680{
1681   // R8: speaker out
1682   m_speaker->level_w(data >> 8 & 1);
1683
1684   // R9,R10: input mux
1685   m_inp_mux = data >> 9 & 3;
1686
1687   // R0-R7: led rows
1688   m_r = data;
1689   display_update();
1690}
1691
1692WRITE16_MEMBER(hh_tms1k_state::splitsec_write_o)
1693{
1694   // O0-O6: led columns
1695   // O7: N/C
1696   m_o = data;
1697   splitsec_display();
1698}
1699
1700static INPUT_PORTS_START( splitsec )
1701   PORT_START("IN.0") // R9
1702   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 4 separate directional buttons, hence 16way
1703   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
1704   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY
1705   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
1706
1707   PORT_START("IN.1") // R10
1708   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY
1709   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select")
1710   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Start")
1711   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
1712INPUT_PORTS_END
1713
1714static MACHINE_CONFIG_START( splitsec, hh_tms1k_state )
1715
1716   /* basic machine hardware */
1717   MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pf, but unknown RC curve
1718   MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, splitsec_read_k))
1719   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, splitsec_write_r))
1720   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, splitsec_write_o))
1721
1722   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
1723   MCFG_DEFAULT_LAYOUT(layout_splitsec)
1724
1725   /* no video! */
1726
1727   /* sound hardware */
1728   MCFG_SPEAKER_STANDARD_MONO("mono")
1729   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
1730   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1731MACHINE_CONFIG_END
1732
1733
1734
1735
1736
1737
1738
1739/***************************************************************************
1740
11791741  Tandy Radio Shack Computerized Arcade (1981, 1982, 1995)
11801742  * TMS1100 CD7282SL
11811743
r244627r244628
15282090   ROM_LOAD( "tms1000_simon_opla.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) )
15292091ROM_END
15302092
2093ROM_START( cnsector )
2094   ROM_REGION( 0x0400, "maincpu", 0 )
2095   ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) )
2096
2097   ROM_REGION( 782, "maincpu:ipla", 0 )
2098   ROM_LOAD( "tms0970_default_ipla.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
2099   ROM_REGION( 860, "maincpu:mpla", 0 )
2100   ROM_LOAD( "tms0970_cnsector_mpla.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) )
2101   ROM_REGION( 352, "maincpu:opla", 0 )
2102   ROM_LOAD( "tms0970_cnsector_opla.pla", 0, 352, CRC(7c0bdcd6) SHA1(dade774097e8095dca5deac7b2367d0c701aca51) )
2103   ROM_REGION( 157, "maincpu:spla", 0 )
2104   ROM_LOAD( "tms0970_cnsector_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) )
2105ROM_END
2106
2107
2108ROM_START( merlin )
2109   ROM_REGION( 0x800, "maincpu", 0 )
2110   ROM_LOAD( "mp3404", 0x0000, 0x800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) )
2111
2112   ROM_REGION( 867, "maincpu:mpla", 0 )
2113   ROM_LOAD( "tms1100_merlin_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
2114   ROM_REGION( 365, "maincpu:opla", 0 )
2115   ROM_LOAD( "tms1100_merlin_opla.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) )
2116ROM_END
2117
2118
2119ROM_START( stopthie )
2120   ROM_REGION( 0x1000, "maincpu", 0 )
2121   ROM_LOAD( "tms0980nll_mp6101b", 0x0000, 0x1000, CRC(8bde5bb4) SHA1(8c318fcce67acc24c7ae361f575f28ec6f94665a) )
2122
2123   ROM_REGION( 1246, "maincpu:ipla", 0 )
2124   ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
2125   ROM_REGION( 1982, "maincpu:mpla", 0 )
2126   ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
2127   ROM_REGION( 352, "maincpu:opla", 0 )
2128   ROM_LOAD( "tms0980_stopthie_opla.pla", 0, 352, CRC(50337a48) SHA1(4a9ea62ed797a9ac5190eec3bb6ebebb7814628c) )
2129   ROM_REGION( 157, "maincpu:spla", 0 )
2130   ROM_LOAD( "tms0980_stopthie_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
2131ROM_END
2132
2133ROM_START( stopthiep )
2134   ROM_REGION( 0x1000, "maincpu", 0 )
2135   ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums)
2136
2137   ROM_REGION( 1246, "maincpu:ipla", 0 )
2138   ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
2139   ROM_REGION( 1982, "maincpu:mpla", 0 )
2140   ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
2141   ROM_REGION( 352, "maincpu:opla", 0 )
2142   ROM_LOAD( "tms0980_stopthie_opla.pla", 0, 352, CRC(50337a48) SHA1(4a9ea62ed797a9ac5190eec3bb6ebebb7814628c) )
2143   ROM_REGION( 157, "maincpu:spla", 0 )
2144   ROM_LOAD( "tms0980_stopthie_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
2145ROM_END
2146
2147ROM_START( bankshot )
2148   ROM_REGION( 0x1000, "maincpu", 0 )
2149   ROM_LOAD( "tms1400nll_mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) )
2150
2151   ROM_REGION( 867, "maincpu:mpla", 0 )
2152   ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
2153   ROM_REGION( 557, "maincpu:opla", 0 )
2154   ROM_LOAD( "tms1400_bankshot_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
2155ROM_END
2156
2157
2158ROM_START( splitsec )
2159   ROM_REGION( 0x1000, "maincpu", 0 )
2160   ROM_LOAD( "tms1400nll_mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) )
2161
2162   ROM_REGION( 867, "maincpu:mpla", 0 )
2163   ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
2164   ROM_REGION( 557, "maincpu:opla", 0 )
2165   ROM_LOAD( "tms1400_splitsec_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
2166ROM_END
2167
2168
15312169ROM_START( tandy12 )
15322170   ROM_REGION( 0x800, "maincpu", 0 )
15332171   ROM_LOAD( "cd7282sl", 0x0000, 0x800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) )
r244627r244628
15702208CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
15712209CONS( 1978, simon, 0, 0, simon, simon, driver_device, 0, "Milton Bradley", "Simon (Rev. A)", GAME_SUPPORTS_SAVE )
15722210
2211
2212CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
2213CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin", GAME_SUPPORTS_SAVE )
2214CONS( 1979, stopthie,  0,        0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner)", GAME_SUPPORTS_SAVE )
2215CONS( 1979, stopthiep, stopthie, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner) (prototype)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
2216CONS( 1980, bankshot, 0, 0, bankshot, bankshot, driver_device, 0, "Parker Brothers", "Bank Shot - Electronic Pool", GAME_SUPPORTS_SAVE )
2217CONS( 1980, splitsec, 0, 0, splitsec, splitsec, driver_device, 0, "Parker Brothers", "Split Second", GAME_SUPPORTS_SAVE )
2218
15732219CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE )
15742220
15752221CONS( 1978, unk3403, 0, 0, unk3403, unk3403, driver_device, 0, "<unknown>", "unknown TMS1100 electronic game", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
trunk/src/mess/drivers/merlin.c
r244627r244628
1// license:BSD-3-Clause
2// copyright-holders:Wilbert Pol, hap
3/***************************************************************************
4
5  Parker Bros Merlin handheld computer game, by Bob Doyle
6  * TMS1100NLL MP3404A-N2 (has internal ROM)
7
8  To start a game, press NEW GAME, followed by a number:
9  1: Tic-Tac-Toe
10  2: Music Machine
11  3: Echo
12  4: Blackjack 13
13  5: Magic Square
14  6: Mindbender
15
16  Refer to the official manual for more information on the games.
17
18
19  Other handhelds assumed to be on similar hardware:
20  - Dr. Smith - by Tomy, released in Japan (basically a white version of Merlin,
21    let's assume for now that the ROM contents is identical)
22  - Master Merlin
23
24
25***************************************************************************/
26
27#include "emu.h"
28#include "cpu/tms0980/tms0980.h"
29#include "sound/speaker.h"
30
31#include "merlin.lh" // clickable
32
33// master clock is a single stage RC oscillator: R=33K, C=100pf,
34// according to the TMS 1000 series data manual this is around 350kHz
35#define MASTER_CLOCK (350000)
36
37
38class merlin_state : public driver_device
39{
40public:
41   merlin_state(const machine_config &mconfig, device_type type, const char *tag)
42      : driver_device(mconfig, type, tag),
43      m_maincpu(*this, "maincpu"),
44      m_button_matrix(*this, "IN"),
45      m_speaker(*this, "speaker")
46   { }
47
48   DECLARE_READ8_MEMBER(read_k);
49   DECLARE_WRITE16_MEMBER(write_o);
50   DECLARE_WRITE16_MEMBER(write_r);
51
52   virtual void machine_start();
53
54protected:
55   required_device<cpu_device> m_maincpu;
56   required_ioport_array<4> m_button_matrix;
57   required_device<speaker_sound_device> m_speaker;
58
59   UINT16 m_o;
60};
61
62
63/***************************************************************************
64
65  I/O
66
67***************************************************************************/
68
69READ8_MEMBER(merlin_state::read_k)
70{
71   UINT8 k = 0;
72
73   // read selected button rows
74   for (int i = 0; i < 4; i++)
75      if (m_o >> i & 1)
76         k |= m_button_matrix[i]->read();
77
78   return k;
79}
80
81WRITE16_MEMBER(merlin_state::write_o)
82{
83   /* The speaker is connected to O4 through O6.  The 3 outputs are paralleled for
84   increased current driving capability.  They are passed thru a 220 ohm resistor
85   and then to the speaker, which has the other side grounded.  The software then
86   toggles these lines to make sounds and noises. (There is no audio generator
87   other than toggling it with a software delay between to make tones). */
88   static const int count[8] = { 0, 1, 1, 2, 1, 2, 2, 3 };
89   m_speaker->level_w(count[data >> 4 & 7]);
90
91   // O0-O3: input mux
92   // O7: N/C
93   m_o = data;
94}
95
96WRITE16_MEMBER(merlin_state::write_r)
97{
98   /* LEDs:
99
100        R0
101   R1   R2   R3
102   R4   R5   R6
103   R7   R8   R9
104        R10
105   */
106   for (int i = 0; i < 11; i++)
107      output_set_lamp_value(i, data >> i & 1);
108}
109
110
111
112/***************************************************************************
113
114  Inputs
115
116***************************************************************************/
117
118static INPUT_PORTS_START( merlin )
119   PORT_START("IN.0") // O0
120   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0")
121   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1")
122   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3")
123   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2")
124
125   PORT_START("IN.1") // O1
126   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4")
127   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5")
128   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7")
129   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6")
130
131   PORT_START("IN.2") // O2
132   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8")
133   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9")
134   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Same Game")
135   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10")
136
137   PORT_START("IN.3") // O3
138   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
139   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn")
140   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me")
141   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game")
142INPUT_PORTS_END
143
144
145
146/***************************************************************************
147
148  Machine Config
149
150***************************************************************************/
151
152void merlin_state::machine_start()
153{
154   m_o = 0;
155   save_item(NAME(m_o));
156}
157
158static const INT16 speaker_levels[] = { 0, 10922, 21845, 32767 };
159
160
161static MACHINE_CONFIG_START( merlin, merlin_state )
162
163   /* basic machine hardware */
164   MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
165   MCFG_TMS1XXX_READ_K_CB(READ8(merlin_state, read_k))
166   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(merlin_state, write_o))
167   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(merlin_state, write_r))
168
169   MCFG_DEFAULT_LAYOUT(layout_merlin)
170
171   /* no video! */
172
173   /* sound hardware */
174   MCFG_SPEAKER_STANDARD_MONO("mono")
175   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
176   MCFG_SPEAKER_LEVELS(4, speaker_levels)
177   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
178MACHINE_CONFIG_END
179
180
181
182/***************************************************************************
183
184  Game driver(s)
185
186***************************************************************************/
187
188ROM_START( merlin )
189   ROM_REGION( 0x800, "maincpu", 0 )
190   ROM_LOAD( "mp3404", 0x0000, 0x800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) )
191
192   ROM_REGION( 867, "maincpu:mpla", 0 )
193   ROM_LOAD( "tms1100_merlin_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
194   ROM_REGION( 365, "maincpu:opla", 0 )
195   ROM_LOAD( "tms1100_merlin_opla.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) )
196ROM_END
197
198
199CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin", GAME_SUPPORTS_SAVE )
trunk/src/mess/drivers/splitsec.c
r244627r244628
1// license:BSD-3-Clause
2// copyright-holders:hap
3/***************************************************************************
4
5  Parker Brothers Split Second
6  * TMS1400NLL MP7314-N2 (die labeled MP7314)
7
8  This is an electronic handheld reflex gaming device, it's straightforward
9  to use. The included mini-games are:
10  1, 2, 3: Mad Maze*
11  4, 5: Space Attack*
12  6: Auto Cross
13  7: Stomp
14  8: Speedball
15
16  *: higher number indicates higher difficulty
17
18
19----------------------------------------------------------------------------
20
21  Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen
22  * TMS1400NLL MP7313-N2 (die labeled MP7313)
23
24  Bank Shot is an electronic pool game. To select a game, repeatedly press
25  the [SELECT] button, then press [CUE UP] to start. Refer to the official
26  manual for more information. The game selections are:
27  1: Straight Pool (1 player)
28  2: Straight Pool (2 players)
29  3: Poison Pool
30  4: Trick Shots
31
32
33  TODO:
34  - bankshot: the cue ball led is strobed more often than other leds,
35    making it look brighter. We need more accurate led decay simulation
36    for this to work.
37  - MCU clock is unknown
38
39***************************************************************************/
40
41#include "emu.h"
42#include "cpu/tms0980/tms0980.h"
43#include "sound/speaker.h"
44
45#include "splitsec.lh"
46#include "bankshot.lh"
47
48// The master clock is a single stage RC oscillator: R=24K, C=100pf,
49// according to the TMS 1000 series data manual this is around 375kHz.
50// However, this sounds too low-pitched and runs too slow when compared
51// to recordings, maybe the RC osc curve is different for TMS1400?
52
53// so for now, the value below is an approximation
54#define MASTER_CLOCK (475000)
55
56
57class splitsec_state : public driver_device
58{
59public:
60   splitsec_state(const machine_config &mconfig, device_type type, const char *tag)
61      : driver_device(mconfig, type, tag),
62      m_maincpu(*this, "maincpu"),
63      m_button_matrix(*this, "IN"),
64      m_speaker(*this, "speaker")
65   { }
66
67   required_device<cpu_device> m_maincpu;
68   required_ioport_array<2> m_button_matrix;
69   required_device<speaker_sound_device> m_speaker;
70
71   UINT8 m_input_mux;
72   UINT16 m_r;
73   UINT16 m_o;
74
75   UINT16 m_display_state[0x10];
76   UINT16 m_display_cache[0x10];
77   UINT8 m_display_decay[0x100];
78
79   DECLARE_READ8_MEMBER(read_k);
80   DECLARE_WRITE16_MEMBER(write_o);
81   DECLARE_WRITE16_MEMBER(splitsec_write_r);
82   DECLARE_WRITE16_MEMBER(bankshot_write_r);
83
84   TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
85   void display_update();
86
87   virtual void machine_start();
88};
89
90
91
92/***************************************************************************
93
94  LED Display
95
96***************************************************************************/
97
98// The device strobes the outputs very fast, it is unnoticeable to the user.
99// To prevent flickering here, we need to simulate a decay.
100
101// decay time, in steps of 1ms
102#define DISPLAY_DECAY_TIME 40
103
104/* display layout, where number xy is lamp R(x),O(y)
105
106  Split Second:
107
108       00    02    04
109    10 01 12 03 14 05 16
110       11    13    15
111    20 21 22 23 24 25 26
112       31    33    35
113    30 41 32 43 34 45 36
114       51    53    55
115    40 61 42 63 44 65 46
116       71    73    75
117    50 60 52 62 54 64 56
118       70    72    74
119
120
121  Bank Shot: pretty much linear, see bankshot.lay
122
123*/
124
125void splitsec_state::display_update()
126{
127   UINT16 active_state[0x10];
128
129   for (int i = 0; i < 0x10; i++)
130   {
131      // update current state
132      m_display_state[i] = (m_r >> i & 1) ? m_o : 0;
133
134      active_state[i] = 0;
135
136      for (int j = 0; j < 0x10; j++)
137      {
138         int di = j << 4 | i;
139
140         // turn on powered segments
141         if (m_display_state[i] >> j & 1)
142            m_display_decay[di] = DISPLAY_DECAY_TIME;
143
144         // determine active state
145         int ds = (m_display_decay[di] != 0) ? 1 : 0;
146         active_state[i] |= (ds << j);
147      }
148   }
149
150   // on difference, send to output
151   for (int i = 0; i < 0x10; i++)
152      if (m_display_cache[i] != active_state[i])
153      {
154         for (int j = 0; j < 8; j++)
155            output_set_lamp_value(i*10 + j, active_state[i] >> j & 1);
156      }
157
158   memcpy(m_display_cache, active_state, sizeof(m_display_cache));
159}
160
161TIMER_DEVICE_CALLBACK_MEMBER(splitsec_state::display_decay_tick)
162{
163   // slowly turn off unpowered segments
164   for (int i = 0; i < 0x100; i++)
165      if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
166         m_display_decay[i]--;
167
168   display_update();
169}
170
171
172
173/***************************************************************************
174
175  I/O
176
177***************************************************************************/
178
179READ8_MEMBER(splitsec_state::read_k)
180{
181   UINT8 k = 0;
182
183   // read selected button rows
184   for (int i = 0; i < 2; i++)
185      if (m_input_mux >> i & 1)
186         k |= m_button_matrix[i]->read();
187
188   return k;
189}
190
191WRITE16_MEMBER(splitsec_state::write_o)
192{
193   // O0-O6: led columns
194   // O7: N/C
195   m_o = data;
196   display_update();
197}
198
199WRITE16_MEMBER(splitsec_state::splitsec_write_r)
200{
201   // R8: speaker out
202   m_speaker->level_w(data >> 8 & 1);
203
204   // R9,R10: input mux
205   m_input_mux = data >> 9 & 3;
206
207   // R0-R7: led rows
208   m_r = data & 0xff;
209   display_update();
210}
211
212WRITE16_MEMBER(splitsec_state::bankshot_write_r)
213{
214   // R0: speaker out
215   m_speaker->level_w(data & 1);
216
217   // R2,R3: input mux
218   m_input_mux = data >> 2 & 3;
219
220   // R2-R10: led rows
221   m_r = data & ~3;
222   display_update();
223}
224
225
226
227/***************************************************************************
228
229  Inputs
230
231***************************************************************************/
232
233static INPUT_PORTS_START( splitsec )
234   PORT_START("IN.0") // R9
235   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 4 separate directional buttons, hence 16way
236   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
237   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY
238   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
239
240   PORT_START("IN.1") // R10
241   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY
242   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select")
243   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Start")
244   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
245INPUT_PORTS_END
246
247
248/* bankshot physical button layout and labels is like this:
249  (note: remember that you can rotate the display in MESS)
250
251    [SELECT  [BALL UP] [BALL OVER]
252     SCORE]
253
254    ------  led display  ------
255
256    [ANGLE]  [AIM]     [CUE UP
257                        SHOOT]
258*/
259
260static INPUT_PORTS_START( bankshot )
261   PORT_START("IN.0") // R2
262   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle")
263   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim")
264   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up / Shoot")
265   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
266
267   PORT_START("IN.1") // R3
268   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select / Score")
269   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up")
270   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over")
271   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
272INPUT_PORTS_END
273
274
275
276/***************************************************************************
277
278  Machine Config
279
280***************************************************************************/
281
282void splitsec_state::machine_start()
283{
284   // zerofill
285   memset(m_display_state, 0, sizeof(m_display_state));
286   memset(m_display_cache, 0, sizeof(m_display_cache));
287   memset(m_display_decay, 0, sizeof(m_display_decay));
288
289   m_input_mux = 0;
290   m_r = 0;
291   m_o = 0;
292
293   // register for savestates
294   save_item(NAME(m_display_state));
295   save_item(NAME(m_display_cache));
296   save_item(NAME(m_display_decay));
297
298   save_item(NAME(m_input_mux));
299   save_item(NAME(m_r));
300   save_item(NAME(m_o));
301}
302
303
304static MACHINE_CONFIG_START( splitsec, splitsec_state )
305
306   /* basic machine hardware */
307   MCFG_CPU_ADD("maincpu", TMS1400, MASTER_CLOCK)
308   MCFG_TMS1XXX_READ_K_CB(READ8(splitsec_state, read_k))
309   MCFG_TMS1XXX_WRITE_O_CB(WRITE16(splitsec_state, write_o))
310   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(splitsec_state, splitsec_write_r))
311
312   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", splitsec_state, display_decay_tick, attotime::from_msec(1))
313
314   MCFG_DEFAULT_LAYOUT(layout_splitsec)
315
316   /* no video! */
317
318   /* sound hardware */
319   MCFG_SPEAKER_STANDARD_MONO("mono")
320   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
321   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
322MACHINE_CONFIG_END
323
324static MACHINE_CONFIG_DERIVED( bankshot, splitsec )
325
326   /* basic machine hardware */
327   MCFG_CPU_MODIFY("maincpu")
328   MCFG_TMS1XXX_WRITE_R_CB(WRITE16(splitsec_state, bankshot_write_r))
329
330   MCFG_DEFAULT_LAYOUT(layout_bankshot)
331MACHINE_CONFIG_END
332
333
334
335/***************************************************************************
336
337  Game driver(s)
338
339***************************************************************************/
340
341ROM_START( splitsec )
342   ROM_REGION( 0x1000, "maincpu", 0 )
343   ROM_LOAD( "tms1400nll_mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) )
344
345   ROM_REGION( 867, "maincpu:mpla", 0 )
346   ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
347   ROM_REGION( 557, "maincpu:opla", 0 )
348   ROM_LOAD( "tms1400_splitsec_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
349ROM_END
350
351ROM_START( bankshot )
352   ROM_REGION( 0x1000, "maincpu", 0 )
353   ROM_LOAD( "tms1400nll_mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) )
354
355   ROM_REGION( 867, "maincpu:mpla", 0 )
356   ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
357   ROM_REGION( 557, "maincpu:opla", 0 )
358   ROM_LOAD( "tms1400_bankshot_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
359ROM_END
360
361
362CONS( 1980, splitsec, 0, 0, splitsec, splitsec, driver_device, 0, "Parker Brothers", "Split Second", GAME_SUPPORTS_SAVE )
363CONS( 1980, bankshot, 0, 0, bankshot, bankshot, driver_device, 0, "Parker Brothers", "Bank Shot - Electronic Pool", GAME_SUPPORTS_SAVE )
trunk/src/mess/layout/cnsector.lay
r244627r244628
115115      <bezel element="static_gray"><bounds x="0" y="50" width="100" height="100" /></bezel>
116116      <bezel element="static_red"><bounds x="0" y="55" width="100" height="86" /></bezel>
117117
118      <bezel name="lamp0" element="lamp">
118      <bezel name="lamp60" element="lamp">
119119         <bounds x="42" y="62" width="8" height="8" />
120120      </bezel>
121      <bezel name="lamp1" element="lamp">
121      <bezel name="lamp61" element="lamp">
122122         <bounds x="42" y="126" width="8" height="8" />
123123      </bezel>
124      <bezel name="lamp2" element="lamp">
124      <bezel name="lamp62" element="lamp">
125125         <bounds x="74" y="94" width="8" height="8" />
126126      </bezel>
127      <bezel name="lamp3" element="lamp">
127      <bezel name="lamp63" element="lamp">
128128         <bounds x="10" y="94" width="8" height="8" />
129129      </bezel>
130130
trunk/src/mess/mess.mak
r244627r244628
14871487   $(MESS_DRIVERS)/palmz22.o   \
14881488
14891489$(MESSOBJ)/parker.a:            \
1490   $(MESS_DRIVERS)/cnsector.o  \
1491   $(MESS_DRIVERS)/merlin.o    \
1492   $(MESS_DRIVERS)/splitsec.o  \
1493   $(MESS_DRIVERS)/stopthie.o  \
14941490   $(MESS_DRIVERS)/wildfire.o  \
14951491
14961492$(MESSOBJ)/pitronic.a:          \
r244627r244628
21062102$(MESS_DRIVERS)/chessmst.o: $(MESS_LAYOUT)/chessmst.lh
21072103$(MESS_DRIVERS)/chesstrv.o: $(MESS_LAYOUT)/chesstrv.lh \
21082104                     $(MESS_LAYOUT)/borisdpl.lh
2109$(MESS_DRIVERS)/cnsector.o: $(MESS_LAYOUT)/cnsector.lh
21102105$(MESS_DRIVERS)/comp4.o:    $(MESS_LAYOUT)/comp4.lh
21112106$(MESS_DRIVERS)/cp1.o:      $(MESS_LAYOUT)/cp1.lh
21122107$(MESS_DRIVERS)/cvicny.o:   $(MESS_LAYOUT)/cvicny.lh
r244627r244628
21312126$(MESS_DRIVERS)/glasgow.o:  $(MESS_LAYOUT)/glasgow.lh
21322127$(MESS_DRIVERS)/h8.o:       $(MESS_LAYOUT)/h8.lh
21332128$(MESS_DRIVERS)/hh_tms1k.o: $(MESS_LAYOUT)/amaztron.lh \
2129                            $(MESS_LAYOUT)/bankshot.lh \
2130                            $(MESS_LAYOUT)/cnsector.lh \
21342131                            $(MESS_LAYOUT)/comp4.lh \
21352132                            $(MESS_LAYOUT)/ebball.lh \
21362133                            $(MESS_LAYOUT)/elecdet.lh \
21372134                            $(MESS_LAYOUT)/mathmagi.lh \
2135                            $(MESS_LAYOUT)/merlin.lh \
21382136                            $(MESS_LAYOUT)/simon.lh \
2137                            $(MESS_LAYOUT)/splitsec.lh \
21392138                            $(MESS_LAYOUT)/starwbc.lh \
2139                            $(MESS_LAYOUT)/stopthie.lh \
21402140                            $(MESS_LAYOUT)/tandy12.lh \
21412141                            $(MESS_LAYOUT)/tc4.lh
21422142$(MESS_DRIVERS)/ie15.o:     $(MESS_LAYOUT)/ie15.lh
r244627r244628
21512151$(MESS_MACHINE)/megacd.o:   $(MESS_LAYOUT)/megacd.lh
21522152$(MESS_DRIVERS)/mekd2.o:    $(MESS_LAYOUT)/mekd2.lh
21532153$(MESS_DRIVERS)/mephisto.o: $(MESS_LAYOUT)/mephisto.lh
2154$(MESS_DRIVERS)/merlin.o:   $(MESS_LAYOUT)/merlin.lh
21552154$(MESS_DRIVERS)/minicom.o:  $(MESS_LAYOUT)/minicom.lh
21562155$(MESS_DRIVERS)/mirage.o:   $(MESS_LAYOUT)/mirage.lh
21572156$(MESS_DRIVERS)/mk1.o:      $(MESS_LAYOUT)/mk1.lh
r244627r244628
21872186$(MESS_DRIVERS)/sitcom.o:   $(MESS_LAYOUT)/sitcom.lh
21882187$(MESS_DRIVERS)/slc1.o:     $(MESS_LAYOUT)/slc1.lh
21892188$(MESS_DRIVERS)/sms.o:      $(MESS_LAYOUT)/sms1.lh
2190$(MESS_DRIVERS)/splitsec.o: $(MESS_LAYOUT)/bankshot.lh \
2191                     $(MESS_LAYOUT)/splitsec.lh
2192$(MESS_DRIVERS)/stopthie.o: $(MESS_LAYOUT)/stopthie.lh
21932189$(MESS_DRIVERS)/super80.o:  $(MESS_LAYOUT)/super80.lh
21942190$(MESS_DRIVERS)/supercon.o: $(MESS_LAYOUT)/supercon.lh
21952191$(MESS_DRIVERS)/svision.o:  $(MESS_LAYOUT)/svision.lh


Previous 199869 Revisions Next


© 1997-2024 The MAME Team