1 // license:BSD-3-Clause
2 // copyright-holders:Robbbert
3 /****************************************************************************************************
4 
5 PINBALL
6 Gottlieb System 1
7 
8 Gottlieb's first foray into computerised pinball.
9 
10 Typical of Gottlieb's golden period, these machines are physically well-designed and made.
11 However, the computer side was another story, an attempt to catch up to its competitors who
12 were way ahead in the technology race. Instead of each board being solidly grounded to the
13 chassis, the only connections were through flaky edge connectors. Voltage differences would
14 then cause solenoids and lights to switch on at random and destroy transistors. Further, the
15 CPU chips chosen were an unusual 4-bit design that was already old.
16 
17 The first games had chimes. Then, this was replaced by 3 NE555 tone oscillators. The last
18 machines had a real sound board which had more computing power than the main cpu.
19 
20 Game numbering:
21 Each Gottlieb game had the model number printed on the instruction card, so it was very
22 easy to gather information. Gottlieb either made a single-player game, or a 2-player and
23 a 4-player game. For example, Centigrade 37 (#407) was a single-player game, while Bronco
24 (4-player)(#396) was exactly the same as Mustang (2-player)(#397). Cleopatra (#409) was
25 originally a 4-player EM game (with Pyramid #410 being the 2-player version). Then, the SS
26 version was made, and it kept the same number. After that, the SS versions were suffixed
27 with 'SS' up to The Incredible Hulk (#433), and then the 'SS' was dropped.
28 
29 
30 Game List:
31 Number  ROM  Name
32 409     A    Cleopatra
33 412SS   B    Sinbad
34 417SS   C    Joker Poker
35 419SS   D    Dragon
36 421SS   E    Solar Ride
37 422SS   F    Countdown
38 424SS   G    Close Encounters of the third kind
39 425SS   H    Charlie's Angels
40 427SS   I    Pinball Pool
41 429SS   J    Totem
42 433SS   K    The Incredible Hulk
43 435     L    Genie
44 437     N    Buck Rogers
45 438     P    Torch
46 440     R    Roller Disco
47 442     S    Asteroid Annie and the Aliens
48 
49 Chips used:
50 U1 11660     CPU
51 U2 10696EE   5101L RAM interface (device#6)
52 U3 10696EE   General purpose I/O (dipswitches, lamps, misc) (device#3)
53 U4 A1753CX   Custom 2kx8 ROM, 128x4 RAM, 16x1 I/O (solenoid control)
54 U5 A1752CX   Custom 2kx8 ROM, 128x4 RAM, 16x1 I/O (switch matrix)
55 U6 10788     Display driver
56    5101L     4-bit static RAM
57    MM6351-IJ ROM
58 
59 
60 ToDo:
61 - Everything
62 - Hard to debug because no errors are logged; also the program flow seems odd.
63 - 5101L RAM (battery-backed) is driven from the 10696.
64 - MM6351 ROM is driven from the CPU I/O ports and has 4 banks.
65 
66 *****************************************************************************************************/
67 
68 
69 #include "emu.h"
70 #include "machine/genpin.h"
71 #include "machine/ra17xx.h"
72 #include "machine/r10696.h"
73 #include "machine/r10788.h"
74 #include "cpu/pps4/pps4.h"
75 #include "gts1.lh"
76 
77 #define VERBOSE    1
78 #include "logmacro.h"
79 
80 
81 class gts1_state : public genpin_class
82 {
83 public:
gts1_state(const machine_config & mconfig,device_type type,const char * tag)84 	gts1_state(const machine_config &mconfig, device_type type, const char *tag)
85 		: genpin_class(mconfig, type, tag)
86 		, m_maincpu(*this, "maincpu")
87 		, m_dips(*this, "DSW%u", 0)
88 		, m_switches(*this, "X.%u", 0)
89 		, m_digit8(*this, "digit8_%u", 0U)
90 		, m_digit7(*this, "digit7_%u", 0U)
91 	{ }
92 
93 	void gts1(machine_config &config);
94 
95 private:
96 	uint8_t gts1_solenoid_r(offs_t offset);
97 	void gts1_solenoid_w(offs_t offset, uint8_t data);
98 	uint8_t gts1_switches_r(offs_t offset);
99 	void gts1_switches_w(offs_t offset, uint8_t data);
100 	void gts1_display_w(offs_t offset, uint8_t data);
101 	uint8_t gts1_lamp_apm_r(offs_t offset);
102 	void gts1_lamp_apm_w(offs_t offset, uint8_t data);
103 	uint8_t gts1_nvram_r(offs_t offset);
104 	void gts1_nvram_w(offs_t offset, uint8_t data);
105 	uint8_t gts1_io_r(offs_t offset);
106 	void gts1_io_w(offs_t offset, uint8_t data);
107 	uint8_t gts1_pa_r();
108 	void gts1_do_w(uint8_t data);
109 
110 	virtual void machine_start() override;
111 	virtual void machine_reset() override;
112 
113 	void gts1_map(address_map &map);
114 	void gts1_data(address_map &map);
115 	void gts1_io(address_map &map);
116 
117 	required_device<cpu_device> m_maincpu;
118 	required_ioport_array<3> m_dips;
119 	required_ioport_array<5> m_switches;
120 	output_finder<32> m_digit8; // driver currently uses 0-6, 8-14, 16-22 and 24-30
121 	output_finder<32> m_digit7; // driver currently uses 7, 15, 23 and 31
122 
123 	uint8_t m_strobe;             //!< switches strobe lines (5 lower bits used)
124 	uint8_t m_nvram_addr;         //!< NVRAM address
125 	bool m_nvram_e2;            //!< NVRWAM enable (E2 line)
126 	bool m_nvram_wr;            //!< NVRWAM write (W/R line)
127 	uint16_t m_6351_addr;         //!< ROM MM6351 address (12 bits)
128 	uint16_t m_z30_out;           //!< 4-to-16 decoder outputs
129 };
130 
gts1_map(address_map & map)131 void gts1_state::gts1_map(address_map &map)
132 {
133 	map(0x0000, 0x0fff).rom();
134 }
135 
gts1_data(address_map & map)136 void gts1_state::gts1_data(address_map &map)
137 {
138 	map(0x0000, 0x00ff).ram();
139 	map(0x0100, 0x01ff).ram().share("nvram");
140 }
141 
gts1_io(address_map & map)142 void gts1_state::gts1_io(address_map &map)
143 {
144 	map(0x0000, 0x00ff).r(FUNC(gts1_state::gts1_io_r)).w(FUNC(gts1_state::gts1_io_w));         // catch undecoded I/O accesss
145 
146 	map(0x0020, 0x002f).rw("u4", FUNC(ra17xx_device::io_r), FUNC(ra17xx_device::io_w)); // (U4) solenoid
147 	map(0x0030, 0x003f).rw("u3", FUNC(r10696_device::io_r), FUNC(r10696_device::io_w)); // (U3) solenoid + dips
148 	map(0x0040, 0x004f).rw("u5", FUNC(ra17xx_device::io_r), FUNC(ra17xx_device::io_w)); // (U5) switch matrix
149 	map(0x0060, 0x006f).rw("u2", FUNC(r10696_device::io_r), FUNC(r10696_device::io_w)); // (U2) NVRAM io chip
150 	map(0x00d0, 0x00df).rw("u6", FUNC(r10788_device::io_r), FUNC(r10788_device::io_w)); // (U6) display chip
151 }
152 
153 static INPUT_PORTS_START( gts1_dips )
154 	PORT_START("DSW0")
155 	PORT_DIPNAME( 0x01, 0x00, "S01")
DEF_STR(Off)156 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
157 	PORT_DIPSETTING(    0x01, DEF_STR( On ))
158 	PORT_DIPNAME( 0x02, 0x00, "S02")
159 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
160 	PORT_DIPSETTING(    0x02, DEF_STR( On ))
161 	PORT_DIPNAME( 0x04, 0x00, "S03")
162 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
163 	PORT_DIPSETTING(    0x04, DEF_STR( On ))
164 	PORT_DIPNAME( 0x08, 0x00, "S04")
165 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
166 	PORT_DIPSETTING(    0x08, DEF_STR( On ))
167 	PORT_DIPNAME( 0x10, 0x00, "S05")
168 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
169 	PORT_DIPSETTING(    0x10, DEF_STR( On ))
170 	PORT_DIPNAME( 0x20, 0x20, "S06")
171 	PORT_DIPSETTING(    0x00, DEF_STR( No ))
172 	PORT_DIPSETTING(    0x20, DEF_STR( Yes ))
173 	PORT_DIPNAME( 0x40, 0x40, "S07")
174 	PORT_DIPSETTING(    0x00, DEF_STR( No ))
175 	PORT_DIPSETTING(    0x40, DEF_STR( Yes ))
176 	PORT_DIPNAME( 0x80, 0x80, "S08")
177 	PORT_DIPSETTING(    0x00, DEF_STR( No ))
178 	PORT_DIPSETTING(    0x80, DEF_STR( Yes ))
179 
180 	PORT_START("DSW1")
181 	PORT_DIPNAME( 0x01, 0x00, "S09")
182 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
183 	PORT_DIPSETTING(    0x01, DEF_STR( On ))
184 	PORT_DIPNAME( 0x02, 0x00, "S10")
185 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
186 	PORT_DIPSETTING(    0x02, DEF_STR( On ))
187 	PORT_DIPNAME( 0x04, 0x00, "S11")
188 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
189 	PORT_DIPSETTING(    0x04, DEF_STR( On ))
190 	PORT_DIPNAME( 0x08, 0x00, "S12")
191 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
192 	PORT_DIPSETTING(    0x08, DEF_STR( On ))
193 	PORT_DIPNAME( 0x10, 0x00, "S13")
194 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
195 	PORT_DIPSETTING(    0x10, DEF_STR( On ))
196 	PORT_DIPNAME( 0x20, 0x00, "S14")
197 	PORT_DIPSETTING(    0x00, DEF_STR( Yes ))
198 	PORT_DIPSETTING(    0x20, DEF_STR( No ))
199 	PORT_DIPNAME( 0x40, 0x40, "S15")
200 	PORT_DIPSETTING(    0x00, DEF_STR( No ))
201 	PORT_DIPSETTING(    0x40, DEF_STR( Yes ))
202 	PORT_DIPNAME( 0x80, 0x00, "S16")
203 	PORT_DIPSETTING(    0x00, DEF_STR( No ))
204 	PORT_DIPSETTING(    0x80, DEF_STR( Yes ))
205 
206 	PORT_START("DSW2")
207 	PORT_DIPNAME( 0x01, 0x00, "S17")
208 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
209 	PORT_DIPSETTING(    0x01, DEF_STR( On ))
210 	PORT_DIPNAME( 0x02, 0x00, "S18")
211 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
212 	PORT_DIPSETTING(    0x02, DEF_STR( On ))
213 	PORT_DIPNAME( 0x04, 0x00, "S19")
214 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
215 	PORT_DIPSETTING(    0x04, DEF_STR( On ))
216 	PORT_DIPNAME( 0x08, 0x00, "S20")
217 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
218 	PORT_DIPSETTING(    0x08, DEF_STR( On ))
219 	PORT_DIPNAME( 0x10, 0x00, "S21")
220 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
221 	PORT_DIPSETTING(    0x10, DEF_STR( On ))
222 	PORT_DIPNAME( 0x20, 0x00, "S22")
223 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
224 	PORT_DIPSETTING(    0x20, DEF_STR( On ))
225 	PORT_DIPNAME( 0x40, 0x00, "S23")
226 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
227 	PORT_DIPSETTING(    0x40, DEF_STR( On ))
228 	PORT_DIPNAME( 0x80, 0x00, "S24")
229 	PORT_DIPSETTING(    0x00, DEF_STR( Off ))
230 	PORT_DIPSETTING(    0x80, DEF_STR( On ))
231 INPUT_PORTS_END
232 
233 static INPUT_PORTS_START( gts1_switches )
234 	PORT_START("X.0")
235 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
236 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
237 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
238 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
239 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
240 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
241 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
242 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
243 	PORT_START("X.1")
244 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
245 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
246 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
247 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
248 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
249 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
250 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
251 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
252 	PORT_START("X.2")
253 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
254 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
255 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
256 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
257 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
258 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
259 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
260 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
261 	PORT_START("X.3")
262 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
263 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
264 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
265 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
266 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
267 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
268 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
269 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
270 	PORT_START("X.4")
271 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER)
272 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
273 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
274 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
275 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER)
276 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER)
277 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
278 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
279 INPUT_PORTS_END
280 
281 static INPUT_PORTS_START( gts1 )
282 	PORT_INCLUDE( gts1_dips )
283 
284 	PORT_INCLUDE( gts1_switches )
285 INPUT_PORTS_END
286 
287 static INPUT_PORTS_START( jokrpokr )
288 	PORT_INCLUDE( gts1_dips )
289 
290 	PORT_START("X.0")
291 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PLAY/TEST")
292 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("POP/BUMBER")
293 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("EXTRA BALL TARGET")
294 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SPECIAL ROLLOVER")
295 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("10 POINT CONTACTS")
296 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (red)")
297 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
298 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
299 
300 	PORT_START("X.1")
301 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("#1 COIN CHUTE")
302 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" ROLLOVER")
303 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"10\" DROP TARGET")
304 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"Q\" DROP TARGET (red)")
305 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET (black)")
306 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (black)")
307 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
308 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
309 
310 	PORT_START("X.2")
311 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("#2 COIN CHUTE")
312 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"B\" ROLLOVER")
313 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"J\" DROP TARGET (black)")
314 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"O\" DROP TARGET (black)")
315 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET")
316 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("JOKER DROP TARGET")
317 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
318 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
319 
320 	PORT_START("X.3")
321 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("REPLAY BUTTON")
322 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"C\" ROLLOVER")
323 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"J\" DROP TARGET (red)")
324 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"O\" DROP TARGET (red)")
325 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET")
326 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (red)")
327 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
328 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
329 
330 	PORT_START("X.4")
331 	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("TILT PANEL")
332 	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER)
333 	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER)
334 	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)
335 	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"K\" DROP TARGET")
336 	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("\"A\" DROP TARGET (red)")
337 	PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER)
338 	PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER)
339 INPUT_PORTS_END
340 
341 void gts1_state::machine_start()
342 {
343 	genpin_class::machine_start();
344 
345 	m_digit8.resolve();
346 	m_digit7.resolve();
347 
348 	save_item(NAME(m_strobe));
349 	save_item(NAME(m_nvram_addr));
350 	save_item(NAME(m_nvram_e2));
351 	save_item(NAME(m_nvram_wr));
352 	save_item(NAME(m_6351_addr));
353 	save_item(NAME(m_z30_out));
354 }
355 
machine_reset()356 void gts1_state::machine_reset()
357 {
358 	genpin_class::machine_reset();
359 
360 	m_strobe = 0;
361 	m_nvram_addr = 0;
362 	m_nvram_e2 = false;
363 	m_nvram_wr = false;
364 	m_6351_addr = 0;
365 	m_z30_out = 0;
366 }
367 
gts1_solenoid_r(offs_t offset)368 uint8_t gts1_state::gts1_solenoid_r(offs_t offset)
369 {
370 	uint8_t data = 0;
371 	LOG("%s: solenoid[%02x] -> %x\n", __FUNCTION__, offset, data);
372 	return data;
373 }
374 
gts1_solenoid_w(offs_t offset,uint8_t data)375 void gts1_state::gts1_solenoid_w(offs_t offset, uint8_t data)
376 {
377 	switch (offset)
378 	{
379 	case  0:
380 		LOG("%s: outhole <- %x\n", __FUNCTION__, data);
381 		break;
382 	case  1:
383 		LOG("%s: knocker <- %x\n", __FUNCTION__, data);
384 		break;
385 	case  2:
386 		LOG("%s: tens chime <- %x\n", __FUNCTION__, data);
387 		break;
388 	case  3:
389 		LOG("%s: hundreds chime <- %x\n", __FUNCTION__, data);
390 		break;
391 	case  4:
392 		LOG("%s: thousands chime <- %x\n", __FUNCTION__, data);
393 		break;
394 	case  5:
395 		LOG("%s: no. 6 <- %x\n", __FUNCTION__, data);
396 		break;
397 	case  6:
398 		LOG("%s: no. 7 <- %x\n", __FUNCTION__, data);
399 		break;
400 	case  7:
401 		LOG("%s: no. 8 <- %x\n", __FUNCTION__, data);
402 		break;
403 	case  8: case  9: case 10: case 11:
404 		LOG("%s: not used [%x] <- %x\n", __FUNCTION__, offset, data);
405 		break;
406 	case 12:    // spare
407 		LOG("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data);
408 		break;
409 	case 13:    // RAM control E2
410 		LOG("%s: RAM control E2 <- %x\n", __FUNCTION__, data);
411 		m_nvram_e2 = (data & 1) ? true : false;
412 		break;
413 	case 14:    // RAM control W/R
414 		LOG("%s: RAM control W/R <- %x\n", __FUNCTION__, data);
415 		m_nvram_wr = (data & 1) ? true : false;
416 		break;
417 	case 15:    // spare
418 		LOG("%s: spare [%x] <- %x\n", __FUNCTION__, offset, data);
419 		break;
420 	}
421 }
422 
gts1_switches_r(offs_t offset)423 uint8_t gts1_state::gts1_switches_r(offs_t offset)
424 {
425 	uint8_t data = 1;
426 	if (offset >= 8 && offset < 16) {
427 		const int bit = offset - 8;
428 		for (int i = 0; i < 5; i++) {
429 			if (m_strobe & (1 << i)) {
430 				data &= BIT(m_switches[i]->read(), bit);
431 			}
432 		}
433 	}
434 	LOG("%s: switches[%x,%x] -> %x\n", __FUNCTION__, m_strobe, offset, data);
435 	return data;
436 }
437 
gts1_switches_w(offs_t offset,uint8_t data)438 void gts1_state::gts1_switches_w(offs_t offset, uint8_t data)
439 {
440 	LOG("%s: switches[%x] <- %x\n", __FUNCTION__, offset, data);
441 	if (offset < 5) {
442 		// outputs O-0 to O-4 are the 5 strobe lines
443 		m_strobe = (m_strobe & ~(1 << offset)) | ((data & 1) << offset);
444 	}
445 }
446 
447 /**
448  * @brief write a 8seg display value
449  * @param offset digit number 0 .. 19
450  * @param data 4-bit value to display
451  */
gts1_display_w(offs_t offset,uint8_t data)452 void gts1_state::gts1_display_w(offs_t offset, uint8_t data)
453 {
454 	/*
455 	 * The 7448 is modified to be disabled through RI/RBO
456 	 * when the input is 0001, and in this case the extra
457 	 * output H is generated instead.
458 	 */
459 	enum : uint8_t
460 	{
461 		_a = 1 << 0,
462 		_b = 1 << 1,
463 		_c = 1 << 2,
464 		_d = 1 << 3,
465 		_e = 1 << 4,
466 		_f = 1 << 5,
467 		_g = 1 << 6,
468 		_h = 1 << 7
469 	};
470 	static constexpr uint8_t ttl7448_mod[16] = {
471 	/* 0 */  _a | _b | _c | _d | _e | _f,
472 	/* 1 */  _h,
473 	/* 2 */  _a | _b | _d | _e | _g,
474 	/* 3 */  _a | _b | _c | _d | _g,
475 	/* 4 */  _b | _c | _f | _g,
476 	/* 5 */  _a | _c | _d | _f | _g,
477 	/* 6 */  _a | _c | _d | _e | _f | _g,
478 	/* 7 */  _a | _b | _c,
479 	/* 8 */  _a | _b | _c | _d | _e | _f | _g,
480 	/* 9 */  _a | _b | _c | _d | _f | _g,
481 	/* a */  _d | _e | _g,
482 	/* b */  _c | _d | _g,
483 	/* c */  _b | _f | _g,
484 	/* d */  _a | _d | _f | _g,
485 	/* e */  _d | _e | _f | _g,
486 	/* f */  0
487 	};
488 	uint8_t a = ttl7448_mod[(data >> 0) & 15];
489 	uint8_t b = ttl7448_mod[(data >> 4) & 15];
490 	// LOG("%s: offset:%d data:%02x a:%02x b:%02x\n", __FUNCTION__, offset, data, a, b);
491 	if ((offset % 8) < 7) { // FIXME: layout suggests this should be < 6 rather than < 7
492 		m_digit8[offset] = a;
493 		m_digit8[offset + 16] = b;
494 	} else {
495 		/*
496 		 * For the 4 7-seg displays the segment h is turned back into
497 		 * segments b and c to display the 7-seg "1".
498 		 */
499 		if (a & _h)
500 			a = _b | _c;
501 		if (b & _h)
502 			b = _b | _c;
503 		m_digit7[offset] = a;
504 		// FIXME: there is nothing on outputs 22, 23, 30 and 31?
505 		m_digit7[offset + 16] = b;
506 	}
507 }
508 
509 /**
510  * @brief read input groups A, B, C of NVRAM io chip (U2)
511  * @param offset 0 ... 2 = group
512  * @return 4-bit value read from the group
513  */
gts1_nvram_r(offs_t offset)514 uint8_t gts1_state::gts1_nvram_r(offs_t offset)
515 {
516 	uint8_t data = 0x0f;
517 	switch (offset)
518 	{
519 		case 0: // group A
520 			// FIXME: Schematics says TO Z5
521 			if (!m_nvram_wr && m_nvram_e2) {
522 				uint8_t* nvram = memregion("nvram")->base();
523 				assert(nvram != nullptr);
524 				data = nvram[m_nvram_addr];
525 				LOG("%s: nvram[%02x] -> %x\n", __FUNCTION__, m_nvram_addr, data);
526 			}
527 			break;
528 		case 1: // group B
529 		case 2: // group C
530 			// Schematics says: SPARES
531 			break;
532 	}
533 	return data;
534 }
535 
536 /**
537  * @brief write output groups A, B, C of NVRAM io chip (U2)
538  * @param offset 0 ... 2 = group
539  * @param data 4 bit value to write
540  */
gts1_nvram_w(offs_t offset,uint8_t data)541 void gts1_state::gts1_nvram_w(offs_t offset, uint8_t data)
542 {
543 	switch (offset)
544 	{
545 		case 0: // group A - address lines 3:0
546 			m_nvram_addr = (m_nvram_addr & ~15) | (data & 15);
547 			break;
548 		case 1: // group B - address lines 7:4
549 			m_nvram_addr = (m_nvram_addr & ~(15 << 4)) | ((data & 15) << 4);
550 			break;
551 		case 2: // group C - data bits 3:0 of NVRAM
552 			if (m_nvram_wr && m_nvram_e2) {
553 				LOG("%s: nvram[%02x] <- %x\n", __FUNCTION__, m_nvram_addr, data & 15);
554 				uint8_t* nvram = memregion("nvram")->base();
555 				assert(nvram != nullptr);
556 				nvram[m_nvram_addr] = data & 15;
557 			}
558 			break;
559 	}
560 }
561 
562 /**
563  * @brief read input groups A, B, C of lamp + apm I/O chip (U3)
564  * @param offset 0 ... 2 = group
565  * @return 4-bit value read from the group
566  */
gts1_lamp_apm_r(offs_t offset)567 uint8_t gts1_state::gts1_lamp_apm_r(offs_t offset)
568 {
569 	uint8_t data = 0x0f;
570 	switch (offset) {
571 		case 0: // group A switches S01-S04, S09-S12, S17-S20
572 			if (m_z30_out & 1) {
573 				uint8_t dsw0 = m_dips[0]->read();
574 				if (0 == BIT(dsw0,0)) // S01
575 					data &= ~(1 << 3);
576 				if (0 == BIT(dsw0,1)) // S02
577 					data &= ~(1 << 2);
578 				if (0 == BIT(dsw0,2)) // S03
579 					data &= ~(1 << 1);
580 				if (0 == BIT(dsw0,3)) // S04
581 					data &= ~(1 << 0);
582 			}
583 			if (m_z30_out & 2) {
584 				uint8_t dsw1 = m_dips[1]->read();
585 				if (0 == BIT(dsw1,0)) // S09
586 					data &= ~(1 << 0);
587 				if (0 == BIT(dsw1,1)) // S10
588 					data &= ~(1 << 1);
589 				if (0 == BIT(dsw1,2)) // S11
590 					data &= ~(1 << 2);
591 				if (0 == BIT(dsw1,3)) // S12
592 					data &= ~(1 << 3);
593 			}
594 			if (m_z30_out & 4) {
595 				uint8_t dsw2 = m_dips[2]->read();
596 				if (0 == BIT(dsw2,0)) // S17
597 					data &= ~(1 << 0);
598 				if (0 == BIT(dsw2,1)) // S18
599 					data &= ~(1 << 1);
600 				if (0 == BIT(dsw2,2)) // S19
601 					data &= ~(1 << 2);
602 				if (0 == BIT(dsw2,3)) // S20
603 					data &= ~(1 << 3);
604 			}
605 			break;
606 		case 1: // group B switches S05-S08, S09-S12, S17-S20
607 			if (m_z30_out & 1) {
608 				uint8_t dsw0 = m_dips[0]->read();
609 				if (0 == BIT(dsw0,4)) // S05
610 					data &= ~(1 << 3);
611 				if (0 == BIT(dsw0,5)) // S06
612 					data &= ~(1 << 2);
613 				if (0 == BIT(dsw0,6)) // S07
614 					data &= ~(1 << 1);
615 				if (0 == BIT(dsw0,7)) // S08
616 					data &= ~(1 << 0);
617 			}
618 			if (m_z30_out & 2) {
619 				uint8_t dsw1 = m_dips[1]->read();
620 				if (0 == BIT(dsw1,4)) // S13
621 					data &= ~(1 << 0);
622 				if (0 == BIT(dsw1,5)) // S14
623 					data &= ~(1 << 1);
624 				if (0 == BIT(dsw1,6)) // S15
625 					data &= ~(1 << 2);
626 				if (0 == BIT(dsw1,7)) // S16
627 					data &= ~(1 << 3);
628 			}
629 			if (m_z30_out & 4) {
630 				uint8_t dsw2 = m_dips[2]->read();
631 				if (0 == BIT(dsw2,4)) // S21
632 					data &= ~(1 << 0);
633 				if (0 == BIT(dsw2,5)) // S22
634 					data &= ~(1 << 1);
635 				if (0 == BIT(dsw2,6)) // S23
636 					data &= ~(1 << 2);
637 				if (0 == BIT(dsw2,7)) // S24
638 					data &= ~(1 << 3);
639 			}
640 			break;
641 		case 2: // TODO: connect
642 			// IN-9 (unused?)
643 			// IN-10 (reset sw25)
644 			// IN-11 (outhole sw)
645 			// IN-12 (slam sw)
646 			break;
647 	}
648 	return data;
649 }
650 
651 /**
652  * @brief write output groups A, B, C of lamp + apm I/O chip (U3)
653  * @param offset 0 ... 2 = group
654  * @param data 4 bit value to write
655  */
gts1_lamp_apm_w(offs_t offset,uint8_t data)656 void gts1_state::gts1_lamp_apm_w(offs_t offset, uint8_t data)
657 {
658 	switch (offset) {
659 		case 0: // LD1-LD4 on jumper J5
660 			break;
661 		case 1: // Z30 1-of-16 decoder
662 			m_z30_out = 1 << (data & 15);
663 			break;
664 		case 2: // O9: PGOL PROM A8, O10: PGOL PROM A9
665 			m_6351_addr = (m_6351_addr & ~(3 << 8)) | ((data & 3) << 8);
666 			// O11 and O12 are unused(?)
667 			break;
668 	}
669 }
670 
gts1_io_r(offs_t offset)671 uint8_t gts1_state::gts1_io_r(offs_t offset)
672 {
673 	const uint8_t data = 0x0f;
674 	LOG("%s: unmapped io[%02x] -> %x\n", __FUNCTION__, offset, data);
675 	return data;
676 }
677 
gts1_io_w(offs_t offset,uint8_t data)678 void gts1_state::gts1_io_w(offs_t offset, uint8_t data)
679 {
680 	LOG("%s: unmapped io[%02x] <- %x\n", __FUNCTION__, offset, data);
681 }
682 
gts1_pa_r()683 uint8_t gts1_state::gts1_pa_r()
684 {
685 	// return ROM nibble
686 	uint8_t *ROM = memregion("maincpu")->base();
687 	uint8_t data = ROM[0x2000 + m_6351_addr] & 0x0f;
688 	LOG("%s: ROM[%03x]:%02x\n", __FUNCTION__, m_6351_addr, data);
689 	return data;
690 }
691 
gts1_do_w(uint8_t data)692 void gts1_state::gts1_do_w(uint8_t data)
693 {
694 	// write address lines (DO1-4 to A0-3, DIO1-4 to A4-7)
695 	m_6351_addr = (m_6351_addr & 0x300) | data;
696 	LOG("%s: ROM addr:%02x\n", __FUNCTION__, m_6351_addr);
697 }
698 
699 
gts1(machine_config & config)700 void gts1_state::gts1(machine_config & config)
701 {
702 	/* basic machine hardware */
703 	pps4_2_device &maincpu(PPS4_2(config, m_maincpu, XTAL(3'579'545)));  // divided by 18 in the CPU
704 	maincpu.set_addrmap(AS_PROGRAM, &gts1_state::gts1_map);
705 	maincpu.set_addrmap(AS_DATA, &gts1_state::gts1_data);
706 	maincpu.set_addrmap(AS_IO, &gts1_state::gts1_io);
707 	maincpu.dia_cb().set(FUNC(gts1_state::gts1_pa_r));
708 	maincpu.do_cb().set(FUNC(gts1_state::gts1_do_w));
709 
710 	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
711 
712 	/* A1753CE 2048 x 8 ROM (000-7ff), 128 x 4 RAM (00-7f) and 16 I/O lines (20 ... 2f) */
713 	ra17xx_device &u5(RA17XX(config, "u5", 0));
714 	u5.iord_cb().set(FUNC(gts1_state::gts1_switches_r));
715 	u5.iowr_cb().set(FUNC(gts1_state::gts1_switches_w));
716 	u5.set_cpu_tag(m_maincpu);
717 
718 	/* A1752CF 2048 x 8 ROM (800-fff), 128 x 4 RAM (80-ff) and 16 I/O lines (40 ... 4f) */
719 	ra17xx_device &u4(RA17XX(config, "u4", 0));
720 	u4.iord_cb().set(FUNC(gts1_state::gts1_solenoid_r));
721 	u4.iowr_cb().set(FUNC(gts1_state::gts1_solenoid_w));
722 	u4.set_cpu_tag(m_maincpu);
723 
724 	/* 10696 General Purpose Input/Output */
725 	r10696_device &u2(R10696(config, "u2", 0));
726 	u2.iord_cb().set(FUNC(gts1_state::gts1_nvram_r));
727 	u2.iowr_cb().set(FUNC(gts1_state::gts1_nvram_w));
728 
729 	/* 10696 General Purpose Input/Output */
730 	r10696_device &u3(R10696(config, "u3", 0));
731 	u3.iord_cb().set(FUNC(gts1_state::gts1_lamp_apm_r));
732 	u3.iowr_cb().set(FUNC(gts1_state::gts1_lamp_apm_w));
733 
734 	/* 10788 General Purpose Display and Keyboard */
735 	r10788_device &u6(R10788(config, "u6", XTAL(3'579'545) / 18 ));  // divided in the circuit
736 	u6.update_cb().set(FUNC(gts1_state::gts1_display_w));
737 
738 	/* Video */
739 	config.set_default_layout(layout_gts1);
740 
741 	/* Sound */
742 	genpin_audio(config);
743 }
744 
745 
746 ROM_START( gts1 )
747 	ROM_REGION( 0x10000, "maincpu", 0 )
748 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
749 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
750 ROM_END
751 
752 ROM_START( gts1s )
753 	ROM_REGION( 0x10000, "maincpu", 0 )
754 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
755 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
756 ROM_END
757 
758 /*-------------------------------------------------------------------
759 / Asteroid Annie and the Aliens (12/1980) #442
760 /-------------------------------------------------------------------*/
761 ROM_START(astannie)
762 	ROM_REGION(0x10000, "maincpu", 0)
763 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
764 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
765 	ROM_LOAD("442.cpu", 0x2000, 0x0400, CRC(579521e0) SHA1(b1b19473e1ca3373955ee96104b87f586c4c311c))
766 	ROM_REGION(0x10000, "cpu2", 0)
767 	ROM_LOAD("442.snd", 0x0400, 0x0400, CRC(c70195b4) SHA1(ff06197f07111d6a4b8942dcfe8d2279bda6f281))
768 	ROM_RELOAD( 0x0800, 0x0400)
769 	ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
770 	ROM_RELOAD( 0xfc00, 0x0400)
771 ROM_END
772 
773 /*-------------------------------------------------------------------
774 / Buck Rogers (01/1980) #437
775 /-------------------------------------------------------------------*/
776 ROM_START(buckrgrs)
777 	ROM_REGION(0x10000, "maincpu", 0)
778 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
779 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
780 	ROM_LOAD("437.cpu", 0x2000, 0x0400, CRC(e57d9278) SHA1(dfc4ebff1e14b9a074468671a8e5ac7948d5b352))
781 	ROM_REGION(0x10000, "cpu2", 0)
782 	ROM_LOAD("437.snd", 0x0400, 0x0400, CRC(732b5a27) SHA1(7860ea54e75152246c3ac3205122d750b243b40c))
783 	ROM_RELOAD( 0x0800, 0x0400)
784 	ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
785 	ROM_RELOAD( 0xfc00, 0x0400)
786 ROM_END
787 
788 /*-------------------------------------------------------------------
789 / Charlie's Angels (11/1978) #425
790 /-------------------------------------------------------------------*/
791 ROM_START(charlies)
792 	ROM_REGION(0x10000, "maincpu", 0)
793 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
794 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
795 	ROM_LOAD("425.cpu", 0x2000, 0x0400, CRC(928b4279) SHA1(51096d45e880d6a8263eaeaa0cdab0f61ad2f58d))
796 ROM_END
797 /*-------------------------------------------------------------------
798 / Cleopatra (11/1977) #409
799 /-------------------------------------------------------------------*/
800 ROM_START(cleoptra)
801 	ROM_REGION(0x10000, "maincpu", 0)
802 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
803 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
804 	ROM_LOAD("409.cpu", 0x2000, 0x0400, CRC(8063ff71) SHA1(205f09f067bf79544d2ce2a48d23259901f935dd))
805 ROM_END
806 
807 /*-------------------------------------------------------------------
808 / Close Encounters of the Third Kind (10/1978) #424
809 /-------------------------------------------------------------------*/
810 ROM_START(closeenc)
811 	ROM_REGION(0x10000, "maincpu", 0)
812 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
813 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
814 	ROM_LOAD("424.cpu", 0x2000, 0x0400, CRC(a7a5dd13) SHA1(223c67b9484baa719c91de52b363ff22813db160))
815 ROM_END
816 
817 /*-------------------------------------------------------------------
818 / Count-Down (05/1979) #422
819 /-------------------------------------------------------------------*/
820 ROM_START(countdwn)
821 	ROM_REGION(0x10000, "maincpu", 0)
822 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
823 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
824 	ROM_LOAD("422.cpu", 0x2000, 0x0400, CRC(51bc2df0) SHA1(d4b555d106c6b4e420b0fcd1df8871f869476c22))
825 ROM_END
826 
827 /*-------------------------------------------------------------------
828 / Dragon (10/1978) #419
829 /-------------------------------------------------------------------*/
830 ROM_START(dragon)
831 	ROM_REGION(0x10000, "maincpu", 0)
832 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
833 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
834 	ROM_LOAD("419.cpu", 0x2000, 0x0400, CRC(018d9b3a) SHA1(da37ef5017c71bc41bdb1f30d3fd7ac3b7e1ee7e))
835 ROM_END
836 
837 /*-------------------------------------------------------------------
838 / Genie (11/1979) #435
839 /-------------------------------------------------------------------*/
840 ROM_START(geniep)
841 	ROM_REGION(0x10000, "maincpu", 0)
842 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
843 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
844 	ROM_LOAD("435.cpu", 0x2000, 0x0400, CRC(7749fd92) SHA1(9cd3e799842392e3939877bf295759c27f199e58))
845 	ROM_REGION(0x10000, "cpu2", 0)
846 	ROM_LOAD("435.snd", 0x0400, 0x0400, CRC(4a98ceed) SHA1(f1d7548e03107033c39953ee04b043b5301dbb47))
847 	ROM_RELOAD( 0x0800, 0x0400)
848 	ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
849 	ROM_RELOAD( 0xfc00, 0x0400)
850 ROM_END
851 
852 /*-------------------------------------------------------------------
853 / Joker Poker (08/1978) #417
854 /-------------------------------------------------------------------*/
855 ROM_START(jokrpokr)
856 	ROM_REGION(0x10000, "maincpu", 0)
857 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
858 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
859 	ROM_LOAD("417.cpu", 0x2000, 0x0400, CRC(33dade08) SHA1(23b8dbd7b6c84b806fc0d2da95478235cbf9f80a))
860 ROM_END
861 
862 /*-------------------------------------------------------------------
863 / Jungle Queen (1985)
864 /-------------------------------------------------------------------*/
865 /*-------------------------------------------------------------------
866 / L'Hexagone (04/1986)
867 /-------------------------------------------------------------------*/
868 ROM_START(hexagone)
869 	ROM_REGION(0x10000, "maincpu", 0)
870 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
871 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
872 	ROM_LOAD("435.cpu", 0x2000, 0x0400, CRC(7749fd92) SHA1(9cd3e799842392e3939877bf295759c27f199e58))
873 	ROM_REGION(0x10000, "cpu2", 0)
874 	ROM_LOAD("hexagone.bin", 0, 0x4000, CRC(002b5464) SHA1(e2d971c4e85b4fb6580c2d3945c9946ea0cebc2e))
875 ROM_END
876 /*-------------------------------------------------------------------
877 / Movie
878 /-------------------------------------------------------------------*/
879 
880 /*-------------------------------------------------------------------
881 / Pinball Pool (08/1979) #427
882 /-------------------------------------------------------------------*/
883 ROM_START(pinpool)
884 	ROM_REGION(0x10000, "maincpu", 0)
885 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
886 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
887 	ROM_LOAD("427.cpu", 0x2000, 0x0400, CRC(c496393d) SHA1(e91d9596aacdb4277fa200a3f8f9da099c278f32))
888 ROM_END
889 
890 /*-------------------------------------------------------------------
891 / Roller Disco (02/1980) #440
892 /-------------------------------------------------------------------*/
893 ROM_START(roldisco)
894 	ROM_REGION(0x10000, "maincpu", 0)
895 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
896 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
897 	ROM_LOAD("440.cpu", 0x2000, 0x0400, CRC(bc50631f) SHA1(6aa3124d09fc4e369d087a5ad6dd1737ace55e41))
898 	ROM_REGION(0x10000, "cpu2", 0)
899 	ROM_LOAD("440.snd", 0x0400, 0x0400, CRC(4a0a05ae) SHA1(88f21b5638494d8e78dc0b6b7d69873b76b5f75d))
900 	ROM_RELOAD( 0x0800, 0x0400)
901 	ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
902 	ROM_RELOAD( 0xfc00, 0x0400)
903 ROM_END
904 
905 /*-------------------------------------------------------------------
906 / Sahara Love (1984)
907 /-------------------------------------------------------------------*/
908 ROM_START(sahalove)
909 	ROM_REGION(0x10000, "maincpu", 0)
910 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
911 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
912 	ROM_LOAD("412.cpu",   0x2000, 0x0400, CRC(84a86b83) SHA1(f331f2ffd7d1b279b4ffbb939aa8649e723f5fac))
913 
914 	ROM_REGION(0x2000, "audiocpu", 0) // extra Z80 for sound. TODO: emulate
915 	ROM_LOAD("sahalove.bin", 0x0000, 0x2000,  CRC(3512840a) SHA1(eb36bb78bbf2f8610bc1d71a6651b937db3a5c69))
916 ROM_END
917 
918 /*-------------------------------------------------------------------
919 / Sinbad (05/1978) #412
920 /-------------------------------------------------------------------*/
921 ROM_START(sinbad)
922 	ROM_REGION(0x10000, "maincpu", 0)
923 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
924 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
925 	ROM_LOAD("412.cpu", 0x2000, 0x0400, CRC(84a86b83) SHA1(f331f2ffd7d1b279b4ffbb939aa8649e723f5fac))
926 ROM_END
927 
928 ROM_START(sinbadn)
929 	ROM_REGION(0x10000, "maincpu", 0)
930 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
931 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
932 	ROM_LOAD("412no1.cpu", 0x2000, 0x0400, CRC(f5373f5f) SHA1(027840501416ff01b2adf07188c7d667adf3ad5f))
933 ROM_END
934 
935 /*-------------------------------------------------------------------
936 / Sky Warrior (1983)
937 /-------------------------------------------------------------------*/
938 
939 /*-------------------------------------------------------------------
940 / Solar Ride (02/1979) #421
941 /-------------------------------------------------------------------*/
942 ROM_START(solaride)
943 	ROM_REGION(0x10000, "maincpu", 0)
944 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
945 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
946 	ROM_LOAD("421.cpu", 0x2000, 0x0400, CRC(6b5c5da6) SHA1(a09b7009473be53586f53f48b7bfed9a0c5ecd55))
947 ROM_END
948 
949 /*-------------------------------------------------------------------
950 / The Incredible Hulk (10/1979) #433
951 /-------------------------------------------------------------------*/
952 ROM_START(hulk)
953 	ROM_REGION(0x10000, "maincpu", 0)
954 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
955 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
956 	ROM_LOAD("433.cpu", 0x2000, 0x0400, CRC(c05d2b52) SHA1(393fe063b029246317c90ee384db95a84d61dbb7))
957 	ROM_REGION(0x10000, "cpu2", 0)
958 	ROM_LOAD("433.snd", 0x0400, 0x0400, CRC(20cd1dff) SHA1(93e7c47ff7051c3c0dc9f8f95aa33ba094e7cf25))
959 	ROM_RELOAD( 0x0800, 0x0400)
960 	ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
961 	ROM_RELOAD( 0xfc00, 0x0400)
962 ROM_END
963 
964 /*-------------------------------------------------------------------
965 / Torch (02/1980) #438
966 /-------------------------------------------------------------------*/
967 ROM_START(torch)
968 	ROM_REGION(0x10000, "maincpu", 0)
969 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
970 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
971 	ROM_LOAD("438.cpu", 0x2000, 0x0400, CRC(2d396a64) SHA1(38a1862771500faa471071db08dfbadc6e8759e8))
972 	ROM_REGION(0x10000, "cpu2", 0)
973 	ROM_LOAD("438.snd", 0x0400, 0x0400, CRC(a9619b48) SHA1(1906bc1b059bf31082e3b4546f5a30159479ad3c))
974 	ROM_RELOAD( 0x0800, 0x0400)
975 	ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
976 	ROM_RELOAD( 0xfc00, 0x0400)
977 ROM_END
978 
979 /*-------------------------------------------------------------------
980 / Totem (10/1979) #429
981 /-------------------------------------------------------------------*/
982 ROM_START(totem)
983 	ROM_REGION(0x10000, "maincpu", 0)
984 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
985 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
986 	ROM_LOAD("429.cpu", 0x2000, 0x0400, CRC(7885a384) SHA1(1770662af7d48ad8297097a9877c5c497119978d))
987 	ROM_REGION(0x10000, "cpu2", 0)
988 	ROM_LOAD("429.snd", 0x0400, 0x0400, CRC(5d1b7ed4) SHA1(4a584f880e907fb21da78f3b3a0617f20599688f))
989 	ROM_RELOAD( 0x0800, 0x0400)
990 	ROM_LOAD("6530sys1.bin", 0x0c00, 0x0400, CRC(b7831321) SHA1(c94f4bee97854d0373653a6867016e27d3fc1340))
991 	ROM_RELOAD( 0xfc00, 0x0400)
992 ROM_END
993 
994 /*-------------------------------------------------------------------
995 / System 1 Test prom
996 /-------------------------------------------------------------------*/
997 ROM_START(sys1test)
998 	ROM_REGION(0x10000, "maincpu", 0)
999 	ROM_LOAD("u5_cf.bin", 0x0000, 0x0800, CRC(e0d4b405) SHA1(17aadd79c0dcbb336aadd5d203bc6ca866492345))
1000 	ROM_LOAD("u4_ce.bin", 0x0800, 0x0800, CRC(4cd312dd) SHA1(31245daa9972ef8652caee69986585bb8239e86e))
1001 	ROM_LOAD("test.cpu", 0x2000, 0x0400, CRC(8b0704bb) SHA1(5f0eb8d5af867b815b6012c9d078927398efe6d8))
1002 ROM_END
1003 
1004 
1005 GAME(1977,  gts1,     0,      gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "System 1",                  MACHINE_IS_BIOS_ROOT | MACHINE_NOT_WORKING)
1006 
1007 //Exact same roms as gts1 with added hardware we'll likely need roms for to emulate properly
1008 GAME(1979,  gts1s,    gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "System 1 with sound board", MACHINE_IS_BIOS_ROOT | MACHINE_NOT_WORKING)
1009 GAME(19??,  sys1test, gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "System 1 Test prom",                   MACHINE_IS_SKELETON_MECHANICAL)
1010 
1011 // chimes
1012 GAME(1977,  cleoptra, gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Cleopatra",                            MACHINE_IS_SKELETON_MECHANICAL)
1013 GAME(1978,  sinbad,   gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Sinbad",                               MACHINE_IS_SKELETON_MECHANICAL)
1014 GAME(1978,  sinbadn,  sinbad, gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Sinbad (Norway)",                      MACHINE_IS_SKELETON_MECHANICAL)
1015 GAME(1978,  jokrpokr, gts1,   gts1, jokrpokr, gts1_state, empty_init, ROT0, "Gottlieb",         "Joker Poker",                          MACHINE_IS_SKELETON_MECHANICAL)
1016 GAME(1978,  dragon,   gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Dragon",                               MACHINE_IS_SKELETON_MECHANICAL)
1017 GAME(1979,  solaride, gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Solar Ride",                           MACHINE_IS_SKELETON_MECHANICAL)
1018 GAME(1979,  countdwn, gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Count-Down",                           MACHINE_IS_SKELETON_MECHANICAL)
1019 
1020 // NE555 beeper
1021 GAME(1978,  closeenc, gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Close Encounters of the Third Kind",   MACHINE_IS_SKELETON_MECHANICAL)
1022 GAME(1978,  charlies, gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Charlie's Angels",                     MACHINE_IS_SKELETON_MECHANICAL)
1023 GAME(1979,  pinpool,  gts1,   gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Pinball Pool",                         MACHINE_IS_SKELETON_MECHANICAL)
1024 
1025 // sound card
1026 GAME(1979,  totem,    gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Totem",                                MACHINE_IS_SKELETON_MECHANICAL)
1027 GAME(1979,  hulk,     gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "The Incredible Hulk",                  MACHINE_IS_SKELETON_MECHANICAL)
1028 GAME(1979,  geniep,   gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Genie (Pinball)",                      MACHINE_IS_SKELETON_MECHANICAL)
1029 GAME(1980,  buckrgrs, gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Buck Rogers",                          MACHINE_IS_SKELETON_MECHANICAL)
1030 GAME(1980,  torch,    gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Torch",                                MACHINE_IS_SKELETON_MECHANICAL)
1031 GAME(1980,  roldisco, gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Roller Disco",                         MACHINE_IS_SKELETON_MECHANICAL)
1032 GAME(1980,  astannie, gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Gottlieb",         "Asteroid Annie and the Aliens",        MACHINE_IS_SKELETON_MECHANICAL)
1033 
1034 // homebrew
1035 GAME(1984,  sahalove, sinbad, gts1, gts1,     gts1_state, empty_init, ROT0, "Christian Tabart", "Sahara Love (France)",                 MACHINE_IS_SKELETON_MECHANICAL) // based on sinbad, 150 units produced, not sure it's 'homebrew'
1036 GAME(1986,  hexagone, gts1s,  gts1, gts1,     gts1_state, empty_init, ROT0, "Christian Tabart", "L'Hexagone (France)",                  MACHINE_IS_SKELETON_MECHANICAL)
1037