1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert
3 /*
4  * Sega System 24
5  *
6  * Kudos to Charles MacDonald (http://cgfm2.emuviews.com) for his
7  * very useful research
8  *
9  * 3 Player controls for Gain Ground added by 'Unknown'
10  */
11 
12 /* Missing:
13    - linescroll in special modes (qgh title, mahmajn2/qrouka attract mode)
14    - screen flipping (mix register 13 & 2)
15    - FRC timer IRQ is currently in a slight off-beat (timer should be reset every time
16      that the mode changes, but current MAME framework doesn't seem to like it)
17 */
18 
19 /*
20 Sega System24 Overview
21 Sega, 1987-1994
22 
23 PCB Layout
24 ----------
25 
26 Note: The differences in the revisions is just the use of different sized RAMs
27 and the quantities of RAM used.
28 
29 (1st Revision)
30 837-6442 SYSTEM 24 (C)SEGA 1987
31 |-------------------------------------------------------------------------------|
32 | YM2151 DSW1 EPRxxxxx.IC1           --------------------------| TMM41464-10    |
33 |          DSW2         EPRxxxxx.IC2 |-------------------------- TMM41464-10    |
34 |                                                CN2             TMM41464-10    |
35 |                 68000               |---------|                TMM41464-10    |
36 |   |---------|  |--------------|     | 315-5295|                TMM41464-10    |
37 |   | 315-5296|  |HITACHI FD1094|     |(QFP100) |                TMM41464-10    |
38 |-| |(QFP100) |  |317-0xxx-0xx  |     |         |                TMM41464-10    |
39   | |         |  |--------------|     |---------|                TMM41464-10    |
40 |-| |---------|                                                  MB81C466-10    |
41 |                                                                MB81C466-10    |
42 |                                     |---------|                MB81C466-10    |
43 |S                        |---------| | 315-5295|                MB81C466-10    |
44 |E                 20MHz  | 315-5295| |(QFP100) |                MB81C466-10    |
45 |G                        |(QFP100) | |         |                MB81C466-10    |
46 |A                        |         | |---------|                MB81C466-10    |
47 |                         |---------|                            MB81C466-10    |
48 |5                                                               |---------|    |
49 |6                       |---------|  |---------|                | 315-5293|    |
50 |                        | 315-5294|  | 315-5292|                | (QFP160)|    |
51 |                        |(QFP100) |  | (QFP160)|    32MHz       |         |    |
52 |            MB81C78A-45 |         |  |         |                |---------|    |
53 |-|          MB81C78A-45 |---------|  |---------|M5M4464-12 x4   MB81461-12 x6  |
54   |                                                                             |
55 |-|      YM3012                                                                 |
56 |            |--------|                                                         |
57 |            |315-5242| HM65256 HM65256 HM65256  M5M4464-12 x4   MB81461-12 x6  |
58 |            |(QFP44) | HM65256 HM65256 HM65256                                 |
59 |------------|--------|---------------------------------------------------------|
60 
61 
62 (2nd Revision)
63 837-6442-01 SYSTEM 24 (C) SEGA 1987
64 |-------------------------------------------------------------------------------|
65 | YM2151 DSW1 EPRxxxxx.IC1           --------------------------| TMM41464-10    |
66 |          DSW2         EPRxxxxx.IC2 |-------------------------- TMM41464-10    |
67 |                                                CN2             TMM41464-10    |
68 |                 68000               |---------|                TMM41464-10    |
69 |   |---------|  |--------------|     | 315-5295|                TMM41464-10    |
70 |   | 315-5296|  |HITACHI FD1094|     |(QFP100) |                TMM41464-10    |
71 |-| |(QFP100) |  |317-0xxx-0xx  |     |         |                TMM41464-10    |
72   | |         |  |--------------|     |---------|                TMM41464-10    |
73 |-| |---------|                                                  TMM41464-10    |
74 |                                                                TMM41464-10    |
75 |                                     |---------|                TMM41464-10    |
76 |S                        |---------| | 315-5295|                TMM41464-10    |
77 |E                 20MHz  | 315-5295| |(QFP100) |                TMM41464-10    |
78 |G                        |(QFP100) | |         |                TMM41464-10    |
79 |A                        |         | |---------|                TMM41464-10    |
80 |                         |---------|                            TMM41464-10    |
81 |5                                                               |---------|    |
82 |6                       |---------|  |---------|                | 315-5293|    |
83 |                        | 315-5294|  | 315-5292|                | (QFP160)|    |
84 |                        |(QFP100) |  | (QFP160)|    32MHz       |         |    |
85 |            MB81C78A-45 |         |  |         |                |---------|    |
86 |-|          MB81C78A-45 |---------|  |---------|M5M4464-12 x4   MB81461-12 x6  |
87   |                                                                             |
88 |-|      YM3012                                (*)                              |
89 |            |--------|                                                         |
90 |            |315-5242| HM65256 HM65256 HM65256  M5M4464-12 x4   MB81461-12 x6  |
91 |            |(QFP44) | HM65256 HM65256 HM65256                                 |
92 |------------|--------|---------------------------------------------------------|
93 (*) Unpopulated Sockets for MB81C4256 x4
94 
95 
96 (3rd Revision)
97 837-6442-02 SYSTEM 24 (C) SEGA 1987
98 |-------------------------------------------------------------------------------|
99 | YM2151 DSW1 EPRxxxxx.IC1           --------------------------| TC514256-10    |
100 |          DSW2         EPRxxxxx.IC2 |-------------------------- TC514256-10    |
101 |                                                CN2             TC514256-10    |
102 |                 68000               |---------|                TC514256-10    |
103 |   |---------|  |--------------|     | 315-5295|                TC514256-10    |
104 |   | 315-5296|  |HITACHI FD1094|     |(QFP100) |                TC514256-10    |
105 |-| |(QFP100) |  |317-0xxx-0xx  |     |         |                TC514256-10    |
106   | |         |  |--------------|     |---------|                TC514256-10    |
107 |-| |---------|                                                                 |
108 |                                                                               |
109 |                                     |---------|                               |
110 |S                        |---------| | 315-5295|                               |
111 |E                 20MHz  | 315-5295| |(QFP100) |                               |
112 |G                        |(QFP100) | |         |                               |
113 |A                        |         | |---------|                               |
114 |                         |---------|                                           |
115 |5                                                               |---------|    |
116 |6                       |---------|  |---------|                | 315-5293|    |
117 |                        | 315-5294|  | 315-5292|                | (QFP160)|    |
118 |                        |(QFP100) |  | (QFP160)|    32MHz       |         |    |
119 |            MB81C78A-45 |         |  |         |                |---------|    |
120 |-|          MB81C78A-45 |---------|  |---------|                MB81461-12 x6  |
121   |                                                                             |
122 |-|      YM3012                                                                 |
123 |            |--------|                                                         |
124 |            |315-5242| HM65256 HM65256 TC51832  TC514256-10 x4  MB81461-12 x6  |
125 |            |(QFP44) | HM65256 HM65256 TC51832                                 |
126 |------------|--------|---------------------------------------------------------|
127 Notes:
128                315-5292: Custom Sega IC (QFP160, Tilemap Generator)
129                315-5293: Custom Sega IC (QFP160, Object Generator)
130                315-5294: Custom Sega IC (QFP100, Mixer Chip)
131                315-5295: Custom Sega IC (QFP100, Object Generator)
132                315-5296: Custom Sega IC (QFP100, I/O Chip)
133                315-5242: Custom Sega IC (QFP44, Colour Encoder)
134             68000 clock: 10.000MHz
135    Hitachi FD1094 clock: 10.000MHz
136            YM2151 clock: 4.000MHz
137                   VSync: 58Hz
138                   HSync: 24.33kHz (All System24 games require 24kHz monitor)
139         CN2 (Above PCB): Connector for ROM Board (Not used for floppy-based games)
140         CN2 (Below PCB): Connector for Floppy Controller Board (Not used for ROM-based games)
141         Main PCB Pinout same as System 16
142         Floppy Drive is a standard 1.44 High Density drive, but the controller is custom and
143         the floppy disk format is custom. The floppy disk can be read with "Anadisk"
144         depending on the PC being used and it's floppy controller. Most clone PC's can't read the
145         System 24 floppies even with "Anadisk"[1]. But many brand-name PC's can. It's likely due to the
146         proprietary nature of the components used in brand-name PC's. Generally the older and crappier
147         the PC is, the better chance you have of being able to read the floppy ;-)
148 
149         [1] Actually, most can _except_ for the Hotrod disks.  Those 8K sectors are deadly.
150 
151 
152 Floppy Controller PCB Layout
153 ----------------------------
154 
155 837-6443         ___________
156 |---------------|    DATA   |-- ||||---|
157 |                               PWR    |
158 |     74LS367 74LS05                   |
159 |     74LS367 74LS174                  |
160 |                     MB4107   74LS05  |
161 |                                      |
162 |     MB89311         74LS139   8MHz   |
163 |                CN1                   |
164 |     --------------------------|      |
165 |     |--------------------------      |
166 |--------------------------------------|
167 
168 
169 I/O Controller PCB Layout
170 -------------------------
171 
172 834-6510
173 (sticker 834-6510-01)   ___________
174 |----------------------|  IDC 34   |---|
175 |                                      |
176 |                                      |
177 |  D4701                               |
178 |             MSM6253RS                |
179 |                                      |
180 |  D4701      MSM6253RS   74LS139      |
181 |                                      |
182 |                  CN1                 |
183 |       --------------------------|    |
184 |       |--------------------------    |
185 |--------------------------------------|
186 Notes:
187       - For games other than Hot Rod, ICs other than LS139 and one uPD4701A are not
188         populated. Hot Rod doesn't seem to use the second MSM6253 (whose four inputs
189         are labeled "BLAKE" on the schematics), but has it populated anyway.
190 
191       - CN1 is shown for completeness, it's actually underneath the I/O PCB.
192 
193       - The custom I/O board plugs into the top connector on the main board and
194         is used for player steering controls. The wiring diagram has 8 pins coming from
195         the connector. Four are labelled 'JST4P 1P (L)', the other four are labelled
196         'JST4P 2P (R)'. I assume this is for an analog wheel or similar for player 1
197         (being on the left) and player 2 (being on the right)
198         The wiring diagram also lists some buttons for both PL1 and PL2 coming from
199         the regular 56-way edge connector....  'Nitro' and 'Accel'
200         The manual shows a controller that looks like a spinner which they call
201         a 'sensor board' with part 839-0138 and has a photo-sensor disc, which looks
202         like it's used for steering.
203         This board is used on Hot Rod, Rough Racer and the Golf games only.
204 
205 
206 ROM Board Layout
207 ----------------
208 
209 837-7187-01
210 171-5875-01B
211 (SYSTEM24) (C)SEGA 1989 . 1991
212 |------------------------------------------|
213 |                                          |
214 |                                          |
215 |                                  J1      |
216 |CN1    ROM1.IC4      ROM2.IC5     J2      |
217 ||-|                               J3      |
218 || |                               J4      |
219 || |    ROM3.IC6      ROM4.IC7             |
220 || |                               J5      |
221 || |                               J6      |
222 || |    ROM5.IC8      ROM6.IC9     J7      |
223 || |                               J8      |
224 || |                               J9      |
225 || |    ROM7.IC10     ROM8.IC11            |
226 || |                                       |
227 || |                  74HC4040  74LS139    |
228 ||-|    EPM5032DC.IC2                      |
229 |------------------------------------------|
230 Notes:
231       CN1: Connector for joining ROM board to Main Board. This connector is above and below the PCB to allow for chaining of several boards.
232 
233       The ROM Daughter board has a protection device on it at location IC2. It's an Erasable Programmable Logic Device; EPLD, like a normal PLD,
234       but uses an EPROM and is erasable and re-programmable. It's type is Altera EPM5032DC. It's part of the Altera MAX 5000 Programmable Logic
235       Device Family and (generally) has it's protection bit set at the factory.
236 
237       All jumpers are 2 pins, they're either shorted or not shorted. All ROMs are configured as the same type.
238       See the table below for details.
239       Jumpers to set ROM sizes:
240                                2M (J1, J3, J6, J8)
241                                4M (J2, J3, J7, J9)
242                                8M (J2, J4, J5, J9)
243 
244 
245 FD1094/Floppy/ROM details
246 -------------------------
247 
248 Game                   FD1094         Floppy          ROMs                                                          Other
249 -------------------------------------------------------------------------------------------------------------------------------------------------------------
250 Hot Rod (3p Turbo)     none           DS3-5000-01D    Main Board:     EPR11338.IC1, EPR11339.IC2                    I/O Controller PCB, Floppy Controller PCB
251 
252 Hot Rod (4p Rev C)     none           DS3-5000-01A    Main Board:     EPR11338.IC1, EPR11339.IC2                    I/O Controller PCB, Floppy Controller PCB
253                                       Rev C
254 
255 Hot Rod (4p Japanese   none           DS3-5000-01A    Main Board:     EPR11338.IC1, EPR11339.IC2                    I/O Controller PCB, Floppy Controller PCB
256          Rev B)                       Rev B
257 
258 Scramble Spirits       none           DS3-5000-02?    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
259 
260 Scramble Spirits       317-0058-02D   DS3-5000-02D    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
261 (Encrypted Version)
262 
263 Gain Ground (Japan)    317-0058-03B   DS3-5000-03B    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
264 
265 Gain Ground            317-0058-03D   DS3-5000-03D    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
266 
267 Crack Down (Japan)     317-0058-04B   DS3-5000-04B    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
268                                       Rev A
269 
270 Crack Down             317-0058-04D   DS3-5000-04D    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
271 
272 Super Masters Golf     317-0058-05B   DS3-5000-05B    Main Board:     EPR12186.IC1, EPR12187.IC2                    I/O Controller PCB, Floppy Controller PCB
273 Rev B
274 
275 Super Masters Golf     317-0058-05D   DS3-5000-05D    Main Board:     EPR12186.IC1, EPR12187.IC2                    I/O Controller PCB, Floppy Controller PCB
276 Rev D
277 
278 Rough Racer            317-0058-06B   DS3-5000-06B    Main Board:     EPR12186.IC1, EPR12187.IC2                    I/O Controller PCB, Floppy Controller PCB
279 
280 Bonanza Bros           none           DS3-5000-07D    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
281                                                       Daughter Board: MPR13187.IC4, MPR13188.IC5, MPR13189.IC6
282                                                                       MPR13190.IC7
283                                                                       EPLD: 317-0156
284 
285 Quiz Syukudai wo       317-0058-08B   DS3-5000-08B    Main Board:     EPR12186.IC1, EPR12187.IC2                    Floppy Controller PCB
286 Wasuremashita
287 
288 Dynamic Country Club   317-0058-09D   DS3-5000-09D    Main Board:     EPR13947.IC1, EPR13948.IC2                    I/O Controller PCB, Floppy Controller PCB
289 (Disk version)
290 
291 Dynamic Country Club   none           none            Main Board:     EPR13947.IC1, EPR13948.IC2
292 (ROM version)                                         Daughter Board: EPR15345.IC4  EPR15344.IC5, MPR14097.IC6
293                                                                       MPR14096.IC7
294                                                                       EPLD: 317-0177
295 
296 Quiz Mekuromeku Story  none           none            Main Board:     EPR15342.IC1, EPR15343.IC2
297                                                       Daughter Board: EPR15344.IC4, EPR15345.IC5, EPR15346.IC6
298                                                                       EPR15347.IC7, EPR15348.IC8, EPR15349.IC9
299                                                                       EPLD: 317-0205
300 
301 Tokoro San no          none           none            Main Board:     EPR14812.IC1, EPR14813.IC2
302 MahMahjan                                             Daughter Board: MPR14819.IC4, MPR14820.IC5, MPR14821.IC6
303                                                                       MPR14822IC.7, MPR14823.IC8, MPR14824.IC9
304                                                                       MPR14825.IC10, MPR14826.IC11
305                                                                       EPLD: 317-0200
306 
307 Quiz Rouka Ni          none           none            Main Board:     EPR14484.IC1, EPR14485.IC2
308 Tattenasai                                            Daughter Board: EPR14482.IC5, EPR14483.IC7
309                                                                       EPLD: 317-0191
310 
311 Tokoro San no          none           none            Main Board:     EPR16798.IC1, EPR16799.IC2
312 MahMahjan 2                                           Daughter Board: MPR16800.IC4, MPR16801.IC5, MPR16802.IC6
313                                                                       MPR16803.IC7, MPR16804.IC8, MPR16805.IC9
314                                                                       MPR16806.IC10, MPR16807.IC11
315                                                                       EPLD: 317-0220
316 
317 Quiz Ghost Hunter      none           none            Main Board:     EPR16899B.IC1, EPR16900B.IC2
318                                                       Daughter Board: MPR16901A.IC4, MPR16902A.IC5, MPR16903.IC6
319                                                                       MPR16904.IC7,  MPR16905.IC8,  MPR16906.IC9
320                                                                       MPR16907.IC10,  MPR16908.IC11
321                                                                       EPLD: 317-0226
322 
323 Notes:
324       A regular 68000-10 is used in position IC3. If used, the Hitachi CPU sits at position IC4.
325       Where FD1094 is listed as 'none', a standard 68000 CPU is used instead at IC4 on the PCB.
326 
327       The last 3 digits of the floppy number is also the last part of the Hitachi CPU number....they're a matching pair.
328       So if one had the Hitachi part number and a floppy without a label, it's possible to create the correct floppy disk name from
329       the last 3 digits of the Hitachi FD1094 part number.
330 
331 */
332 
333 
334 /* system24temp_ functions / variables are from shared rewrite files,
335    once the rest of the rewrite is complete they can be removed, I
336    just made a copy & renamed them for now to avoid any conflicts
337 */
338 
339 #include "emu.h"
340 #include "includes/segas24.h"
341 #include "includes/segaipt.h"
342 
343 #include "cpu/m68000/m68000.h"
344 #include "machine/fd1094.h"
345 #include "machine/msm6253.h"
346 #include "machine/nvram.h"
347 #include "machine/upd4701.h"
348 #include "machine/315_5296.h"
349 #include "sound/dac.h"
350 #include "sound/ym2151.h"
351 #include "video/segaic24.h"
352 #include "speaker.h"
353 
354 
355 #define MASTER_CLOCK        XTAL(20'000'000)
356 #define VIDEO_CLOCK         XTAL(32'000'000)
357 #define TIMER_CLOCK         (VIDEO_CLOCK/4)
358 #define HSYNC_CLOCK         (VIDEO_CLOCK/2/656.0)
359 /* TODO: understand why divisors don't match at all with the reference */
360 #define FRC_CLOCK_MODE0     (MASTER_CLOCK/2)/24 // /16 according to Charles
361 #define FRC_CLOCK_MODE1     (MASTER_CLOCK/2)/1536 // /1024 according to Charles, but /1536 sounds better
362 
363 #define FDC_LEGACY_LOG      0
364 #define FDC_LOG(x) do { if (FDC_LEGACY_LOG) logerror x; } while (0)
365 
366 enum {
367 	IRQ_YM2151 = 1,
368 	IRQ_TIMER  = 2,
369 	IRQ_VBLANK = 3,
370 	IRQ_SPRITE = 4,
371 	IRQ_FRC = 5
372 };
373 
374 // Floppy Disk Controller
375 
fdc_init()376 void segas24_state::fdc_init()
377 {
378 	m_fdc_track_side = 0;
379 	m_fdc_mode = 0;
380 	m_fdc_status = 0;
381 	m_fdc_track = 0;
382 	m_fdc_sector = 0;
383 	m_fdc_data = 0;
384 	m_fdc_phys_track = 0;
385 	m_fdc_irq = false;
386 	m_fdc_drq = false;
387 	m_fdc_index_count = 0;
388 }
389 
device_post_load()390 void segas24_state::device_post_load()
391 {
392 	switch(m_fdc_mode) {
393 	case 0x9:
394 	case 0xb:
395 		m_fdc_pt = &m_floppy[m_track_size*(2*m_fdc_phys_track+m_fdc_track_side) + (m_track_size - m_fdc_span)];
396 		break;
397 	default:
398 		break;
399 	}
400 }
401 
fdc_r(offs_t offset)402 uint16_t segas24_state::fdc_r(offs_t offset)
403 {
404 	if(!m_track_size)
405 		return 0xffff;
406 
407 	switch(offset) {
408 	case 0:
409 		m_fdc_irq = false;
410 		return m_fdc_status;
411 	case 1:
412 		return m_fdc_track;
413 	case 2:
414 		return m_fdc_sector;
415 	case 3:
416 	default: {
417 		int res = m_fdc_data;
418 		if(m_fdc_drq) {
419 			m_fdc_span--;
420 			// FDC_LOG(("Read %02x (%d)\n", res, m_fdc_span));
421 			if(m_fdc_span) {
422 				m_fdc_pt++;
423 				m_fdc_data = *m_fdc_pt;
424 			} else {
425 				FDC_LOG(("FDC: transfert complete\n"));
426 				m_fdc_drq = false;
427 				m_fdc_status = 0;
428 				m_fdc_irq = true;
429 			}
430 		} else
431 			FDC_LOG(("FDC: data read with drq down\n"));
432 		return res;
433 	}
434 	}
435 }
436 
fdc_w(offs_t offset,uint16_t data,uint16_t mem_mask)437 void segas24_state::fdc_w(offs_t offset, uint16_t data, uint16_t mem_mask)
438 {
439 	if(!m_track_size)
440 		return;
441 
442 	if(ACCESSING_BITS_0_7) {
443 		data &= 0xff;
444 		switch(offset) {
445 		case 0:
446 			m_fdc_irq = false;
447 			switch(data >> 4) {
448 			case 0x0:
449 				FDC_LOG(("FDC: Restore\n"));
450 				m_fdc_phys_track = m_fdc_track = 0;
451 				m_fdc_irq = true;
452 				m_fdc_status = 4;
453 				break;
454 			case 0x1:
455 				FDC_LOG(("FDC: Seek %d\n", m_fdc_data));
456 				m_fdc_phys_track = m_fdc_track = m_fdc_data;
457 				m_fdc_irq = true;
458 				m_fdc_status = m_fdc_track ? 0 : 4;
459 				break;
460 			case 0x9:
461 				m_fdc_track_side = (data & 8 ? 1 : 0);
462 				m_fdc_mode = 0x9;
463 				FDC_LOG(("Read multiple [%02x] %d..%d side %d track %d\n", data, m_fdc_sector, m_fdc_sector+m_fdc_data-1, m_fdc_track_side, m_fdc_phys_track));
464 				m_fdc_pt = &m_floppy[m_track_size*(2*m_fdc_phys_track+m_fdc_track_side)];
465 				m_fdc_span = m_track_size;
466 				m_fdc_status = 3;
467 				m_fdc_drq = true;
468 				m_fdc_data = *m_fdc_pt;
469 				break;
470 			case 0xb:
471 				m_fdc_track_side = (data & 8 ? 1 : 0);
472 				m_fdc_mode = 0xb;
473 				FDC_LOG(("Write multiple [%02x] %d..%d side %d track %d\n", data, m_fdc_sector, m_fdc_sector+m_fdc_data-1, m_fdc_track_side, m_fdc_phys_track));
474 				m_fdc_pt = &m_floppy[m_track_size*(2*m_fdc_phys_track+m_fdc_track_side)];
475 				m_fdc_span = m_track_size;
476 				m_fdc_status = 3;
477 				m_fdc_drq = true;
478 				break;
479 			case 0xd:
480 				m_fdc_mode = 0xd;
481 				FDC_LOG(("FDC: Forced interrupt\n"));
482 				m_fdc_span = 0;
483 				m_fdc_drq = false;
484 				m_fdc_irq = BIT(data, 0);
485 				m_fdc_status = 0;
486 				break;
487 			case 0xf:
488 				if(data == 0xfe)
489 					FDC_LOG(("FDC: Assign mode %02x\n", m_fdc_data));
490 				else if(data == 0xfd)
491 					FDC_LOG(("FDC: Assign parameter %02x\n", m_fdc_data));
492 				else
493 					FDC_LOG(("FDC: Unknown command %02x\n", data));
494 				break;
495 			default:
496 				FDC_LOG(("FDC: Unknown command %02x\n", data));
497 				break;
498 			}
499 			break;
500 		case 1:
501 			FDC_LOG(("FDC: Track register %02x\n", data));
502 			m_fdc_track = data;
503 			break;
504 		case 2:
505 			FDC_LOG(("FDC: Sector register %02x\n", data));
506 			m_fdc_sector = data;
507 			break;
508 		case 3:
509 			if(m_fdc_drq) {
510 				//              FDC_LOG("Write %02x (%d)\n", data, m_fdc_span);
511 				*m_fdc_pt++ = data;
512 				m_fdc_span--;
513 				if(!m_fdc_span) {
514 					FDC_LOG(("FDC: transfert complete\n"));
515 					m_fdc_drq = false;
516 					m_fdc_status = 0;
517 					m_fdc_irq = true;
518 				}
519 			} else
520 				FDC_LOG(("FDC: Data register %02x\n", data));
521 			m_fdc_data = data;
522 			break;
523 		}
524 	}
525 }
526 
fdc_status_r()527 uint16_t segas24_state::fdc_status_r()
528 {
529 	if(!m_track_size)
530 		return 0xffff;
531 
532 	return 0x90 | (m_fdc_irq ? 2 : 0) | (m_fdc_drq ? 1 : 0) | (m_fdc_phys_track ? 0x40 : 0) | (m_fdc_index_count ? 0x20 : 0);
533 }
534 
fdc_ctrl_w(offs_t offset,uint16_t data,uint16_t mem_mask)535 void segas24_state::fdc_ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask)
536 {
537 	if(ACCESSING_BITS_0_7)
538 		FDC_LOG(("FDC control %02x\n", data & 0xff));
539 }
540 
541 
542 // I/O Mappers
543 
dcclub_p1_r()544 uint8_t segas24_state::dcclub_p1_r()
545 {
546 	static const uint8_t pos[16] = { 0, 1, 3, 2, 6, 4, 12, 8, 9, 0, 0, 0 };
547 	return (m_p1->read() & 0xf) | ((~pos[m_paddle->read()>>4]<<4) & 0xf0);
548 }
549 
dcclub_p3_r()550 uint8_t segas24_state::dcclub_p3_r()
551 {
552 	static const uint8_t pos[16] = { 0, 0, 0, 0, 0, 0,  0, 0, 0, 1, 3, 2 };
553 	return(~pos[m_paddle->read()>>4] & 0x03) | 0xfc;
554 }
555 
556 
mahmajn_input_line_r()557 uint8_t segas24_state::mahmajn_input_line_r()
558 {
559 	return ~(1 << m_cur_input_line);
560 }
561 
mahmajn_inputs_r()562 uint8_t segas24_state::mahmajn_inputs_r()
563 {
564 	return m_mj_inputs[m_cur_input_line].read_safe(0xff);
565 }
566 
mahmajn_mux_w(uint8_t data)567 void segas24_state::mahmajn_mux_w(uint8_t data)
568 {
569 	if(data & 4)
570 		m_cur_input_line = (m_cur_input_line + 1) & 7;
571 }
572 
hotrod_lamps_w(uint8_t data)573 void segas24_state::hotrod_lamps_w(uint8_t data)
574 {
575 	// Lamps
576 }
577 
iod_r(offs_t offset)578 uint16_t segas24_state::iod_r(offs_t offset)
579 {
580 	logerror("IO daughterboard read %02x %s\n", offset, machine().describe_context());
581 	return 0xffff;
582 }
583 
iod_w(offs_t offset,uint16_t data,uint16_t mem_mask)584 void segas24_state::iod_w(offs_t offset, uint16_t data, uint16_t mem_mask)
585 {
586 	logerror("IO daughterboard write %02x, %04x & %04x %s\n", offset, data, mem_mask, machine().describe_context());
587 }
588 
589 /* HACK for Gain Ground to avoid 'forced free play' issue
590 
591 Notes from Olivier
592 
593 The encrypted CPU does:
594 
595 849c:  moveq #-1, d1
596 849e:  move.w 0xa00000, d0
597 84a4:  cmp.w 0xa00000, d0
598 84aa:  beq.s 84a4
599 84ac:  add.w #0x200, d0
600 84b0:  andi.w #0xfff, d0
601 84b4:  cmp.w 0xa00000, d0 // 16 cycles
602 84ba:  dbeq d1, 84b4      // 10 cycles
603 84be:  addi.w #0x1b5f, d1
604 84c2:  bpl 84c8
605 84c4:  st 0x404           // Force freeplay
606 84c8:  ...
607 
608 
609 a00000 is the timer 12bit counter.  It is configured to be clocked by
610 the hsync pulse.  That code counts how many loops it takes for the
611 counter to count 512 times.  The force freeplay happens if the count
612 is more than 7007.
613 
614 Pixel clock is 16MHz, hsync is every 656 pixels, cpu clock is 10MHz.
615 So that's 656*10/16=410 cpu clocks per hsync, or 410*512=209902 total.
616 With 26 cycles per loop, that's 8073 loops.  Freeplay it is.
617 
618 --- Update from Charles MacDonald ---
619 
620 I ran some tests. For the two CPUs, A (68000) and B (FD1094), normally
621 there are no wait states when CPU A accesses $A00000. As that address
622 is on CPU A's bus, CPU B's accesses to it take twice as long (eight 10 MHz
623 clocks instead of four) due to contention. The only exception is when
624 CPU A is completely idle from a STOP instruction, at which point CPU B
625 can access that memory at full speed (four clocks per access).
626 
627 Assuming Gain Ground has CPU A running code out of BIOS ROM or work RAM,
628 and CPU B is running out of work RAM, then each one of those $A00000
629 accesses will eat up double the time.
630 
631 The other factor is DRAM refresh for the work RAM, both CPUs have some
632 memory access stretched out by four cycles every 19 to 20 ms. It looks
633 like both DRAM banks are refreshed in parallel which seems to explain
634 why refresh on CPU A's bus doesn't count as contention for CPU B and
635 vice-versa. So there's only refresh event that eats up time for both
636 CPUs to worry about.
637 
638 
639 
640 */
641 
TIMER_CALLBACK_MEMBER(segas24_state::gground_hack_timer_callback)642 TIMER_CALLBACK_MEMBER(segas24_state::gground_hack_timer_callback)
643 {
644 	m_subcpu->set_clock_scale(1.0f);
645 }
646 
647 
648 // Cpu #1 reset control
649 
650 
WRITE_LINE_MEMBER(segas24_state::cnt1)651 WRITE_LINE_MEMBER(segas24_state::cnt1)
652 {
653 	if (bool(state) != m_cnt1)
654 	{
655 		if (state)
656 		{
657 			m_subcpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
658 			m_subcpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
659 			//osd_printf_debug("enable 2nd cpu!\n");
660 			//machine().debug_break();
661 			if (m_gground_hack_timer)
662 			{
663 				m_subcpu->set_clock_scale(0.7f); // reduce clock speed temporarily so a check passes, see notes above
664 				m_gground_hack_timer->adjust(attotime::from_seconds(2));
665 			}
666 		}
667 		else
668 			m_subcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
669 	}
670 
671 	m_cnt1 = bool(state);
672 }
673 
674 
675 // Rom board bank access
676 
677 
reset_bank()678 void segas24_state::reset_bank()
679 {
680 	if (m_romboard != nullptr)
681 	{
682 		m_rombank[0]->set_entry(m_curbank & 15);
683 		m_rombank[1]->set_entry(m_curbank & 15);
684 	}
685 }
686 
curbank_r()687 uint8_t segas24_state::curbank_r()
688 {
689 	return m_curbank;
690 }
691 
curbank_w(uint8_t data)692 void segas24_state::curbank_w(uint8_t data)
693 {
694 	m_curbank = data;
695 	reset_bank();
696 }
697 
frc_mode_r()698 uint8_t segas24_state::frc_mode_r()
699 {
700 	return m_frc_mode & 1;
701 }
702 
frc_mode_w(uint8_t data)703 void segas24_state::frc_mode_w(uint8_t data)
704 {
705 	/* reset frc if a write happens here */
706 	m_frc_cnt_timer->reset();
707 	m_frc_mode = data & 1;
708 }
709 
frc_r()710 uint8_t segas24_state::frc_r()
711 {
712 	int32_t result = (m_frc_cnt_timer->time_elapsed() * (m_frc_mode ? FRC_CLOCK_MODE1 : FRC_CLOCK_MODE0).dvalue()).as_double();
713 
714 	result %= ((m_frc_mode) ? 0x67 : 0x100);
715 
716 	return result;
717 }
718 
frc_w(uint8_t data)719 void segas24_state::frc_w(uint8_t data)
720 {
721 	/* Undocumented behaviour, Bonanza Bros. seems to use this for irq ack'ing ... */
722 	m_maincpu->set_input_line(IRQ_FRC+1, CLEAR_LINE);
723 	m_subcpu->set_input_line(IRQ_FRC+1, CLEAR_LINE);
724 }
725 
726 
727 // Protection magic latch
728 
729 const uint8_t  segas24_state::s_mahmajn_mlt[8] = { 5, 1, 6, 2, 3, 7, 4, 0 };
730 const uint8_t segas24_state::s_mahmajn2_mlt[8] = { 6, 0, 5, 3, 1, 4, 2, 7 };
731 const uint8_t      segas24_state::s_qgh_mlt[8] = { 3, 7, 4, 0, 2, 6, 5, 1 };
732 const uint8_t segas24_state::s_bnzabros_mlt[8] = { 2, 4, 0, 5, 7, 3, 1, 6 };
733 const uint8_t   segas24_state::s_qrouka_mlt[8] = { 1, 6, 4, 7, 0, 5, 3, 2 };
734 const uint8_t segas24_state::s_quizmeku_mlt[8] = { 0, 3, 2, 4, 6, 1, 7, 5 };
735 const uint8_t   segas24_state::s_dcclub_mlt[8] = { 4, 7, 3, 0, 2, 6, 5, 1 };
736 
737 
mlatch_r()738 uint8_t segas24_state::mlatch_r()
739 {
740 	return m_mlatch;
741 }
742 
mlatch_w(uint8_t data)743 void segas24_state::mlatch_w(uint8_t data)
744 {
745 	int i;
746 	uint8_t mxor = 0;
747 	if(!m_mlatch_table) {
748 		logerror("Protection: magic latch accessed but no table loaded %s\n", machine().describe_context());
749 		return;
750 	}
751 
752 	if(data != 0xff) {
753 		for(i=0; i<8; i++)
754 			if(m_mlatch & (1<<i))
755 				mxor |= 1 << m_mlatch_table[i];
756 		m_mlatch = data ^ mxor;
757 		logerror("Magic latching %02x ^ %02x as %02x %s\n", data & 0xff, mxor, m_mlatch, machine().describe_context());
758 	} else {
759 		logerror("Magic latch reset %s\n", machine().describe_context());
760 		m_mlatch = 0x00;
761 	}
762 }
763 
764 
765 // Timers and IRQs
766 
irq_timer_sync()767 void segas24_state::irq_timer_sync()
768 {
769 	attotime ctime = machine().time();
770 
771 	switch(m_irq_tmode) {
772 	case 0:
773 		break;
774 	case 1: {
775 		// Don't remove the floor(), the value may be slightly negative
776 		int ppos = floor((m_irq_synctime - m_irq_vsynctime).as_double() * HSYNC_CLOCK.dvalue());
777 		int cpos = floor((ctime - m_irq_vsynctime).as_double() * HSYNC_CLOCK.dvalue());
778 		m_irq_tval += cpos-ppos;
779 		break;
780 	}
781 	case 2: {
782 		fatalerror("segas24_state::irq_timer_sync - case 2\n");
783 	}
784 	case 3: {
785 		int ppos = floor((m_irq_synctime - m_irq_vsynctime).as_double() * TIMER_CLOCK.dvalue());
786 		int cpos = floor((ctime - m_irq_vsynctime).as_double() * TIMER_CLOCK.dvalue());
787 		m_irq_tval += cpos-ppos;
788 		break;
789 	}
790 	}
791 
792 	m_irq_synctime = ctime;
793 }
794 
irq_timer_start(int old_tmode)795 void segas24_state::irq_timer_start(int old_tmode)
796 {
797 	switch(m_irq_tmode) {
798 	case 0:
799 		if(old_tmode) {
800 			m_irq_tval++;
801 			if(m_irq_tval == 0x1000)
802 				m_irq_timer->adjust(attotime::zero);
803 			else
804 				m_irq_timer->enable(false);
805 		}
806 		break;
807 	case 1: {
808 		int count = 0x1000 - m_irq_tval;
809 		m_irq_timer->adjust(attotime::from_hz(HSYNC_CLOCK)*count);
810 		break;
811 	}
812 	case 2:
813 		fatalerror("segas24_state::irq_timer_start - case 2\n");
814 	case 3: {
815 		int count = 0x1000 - m_irq_tval;
816 		m_irq_timer->adjust(attotime::from_hz(TIMER_CLOCK)*count);
817 		break;
818 	}
819 	}
820 }
821 
TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_timer_cb)822 TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_timer_cb)
823 {
824 	irq_timer_sync();
825 
826 	if(m_irq_tval != 0x1000)
827 		fprintf(stderr, "Error: timer desync %x != 1000\n", m_irq_tval);
828 
829 	m_irq_tval = m_irq_tdata;
830 	irq_timer_start(m_irq_tmode);
831 
832 	m_irq_timer_pend0 = m_irq_timer_pend1 = true;
833 	if(m_irq_allow0 & (1 << IRQ_TIMER))
834 		m_maincpu->set_input_line(IRQ_TIMER+1, ASSERT_LINE);
835 	if(m_irq_allow1 & (1 << IRQ_TIMER))
836 		m_subcpu->set_input_line(IRQ_TIMER+1, ASSERT_LINE);
837 
838 	if (m_irq_tmode == 1 || m_irq_tmode == 2)
839 	{
840 	//  m_screen->update_now();
841 		m_screen->update_partial(m_screen->vpos());
842 	}
843 }
844 
TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_timer_clear_cb)845 TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_timer_clear_cb)
846 {
847 	m_irq_sprite = m_irq_vblank = false;
848 	m_maincpu->set_input_line(IRQ_VBLANK+1, CLEAR_LINE);
849 	m_maincpu->set_input_line(IRQ_SPRITE+1, CLEAR_LINE);
850 	m_subcpu->set_input_line(IRQ_VBLANK+1, CLEAR_LINE);
851 	m_subcpu->set_input_line(IRQ_SPRITE+1, CLEAR_LINE);
852 }
853 
TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_frc_cb)854 TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_frc_cb)
855 {
856 	if(m_irq_allow0 & (1 << IRQ_FRC) && m_frc_mode == 1)
857 		m_maincpu->set_input_line(IRQ_FRC+1, ASSERT_LINE);
858 
859 	if(m_irq_allow1 & (1 << IRQ_FRC) && m_frc_mode == 1)
860 		m_subcpu->set_input_line(IRQ_FRC+1, ASSERT_LINE);
861 }
862 
irq_init()863 void segas24_state::irq_init()
864 {
865 	m_irq_tdata = 0;
866 	m_irq_tmode = 0;
867 	m_irq_allow0 = 0;
868 	m_irq_allow1 = 0;
869 	m_irq_timer_pend0 = false;
870 	m_irq_timer_pend1 = false;
871 	m_irq_vblank = false;
872 	m_irq_sprite = false;
873 	m_irq_tval = 0;
874 	m_irq_synctime = attotime::zero;
875 	m_irq_vsynctime = attotime::zero;
876 }
877 
irq_w(offs_t offset,uint16_t data,uint16_t mem_mask)878 void segas24_state::irq_w(offs_t offset, uint16_t data, uint16_t mem_mask)
879 {
880 	switch(offset) {
881 	case 0: {
882 		irq_timer_sync();
883 		COMBINE_DATA(&m_irq_tdata);
884 		m_irq_tdata &= 0xfff;
885 		irq_timer_start(m_irq_tmode);
886 		break;
887 	}
888 	case 1:
889 		if(ACCESSING_BITS_0_7) {
890 			uint8_t old_tmode = m_irq_tmode;
891 			irq_timer_sync();
892 			m_irq_tmode = data & 3;
893 			irq_timer_start(old_tmode);
894 		}
895 		break;
896 	case 2:
897 		m_irq_allow0 = data & 0x3f;
898 		m_irq_timer_pend0 = false;
899 		m_maincpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE);
900 		m_maincpu->set_input_line(IRQ_YM2151+1, m_irq_yms && (m_irq_allow0 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE);
901 		m_maincpu->set_input_line(IRQ_VBLANK+1, m_irq_vblank && (m_irq_allow0 & (1 << IRQ_VBLANK)) ? ASSERT_LINE : CLEAR_LINE);
902 		m_maincpu->set_input_line(IRQ_SPRITE+1, m_irq_sprite && (m_irq_allow0 & (1 << IRQ_SPRITE)) ? ASSERT_LINE : CLEAR_LINE);
903 		//m_maincpu->set_input_line(IRQ_FRC+1, m_irq_frc && (m_irq_allow0 & (1 << IRQ_FRC)) ? ASSERT_LINE : CLEAR_LINE);
904 		break;
905 	case 3:
906 		m_irq_allow1 = data & 0x3f;
907 		m_irq_timer_pend1 = false;
908 		m_subcpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE);
909 		m_subcpu->set_input_line(IRQ_YM2151+1, m_irq_yms && (m_irq_allow1 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE);
910 		m_subcpu->set_input_line(IRQ_VBLANK+1, m_irq_vblank && (m_irq_allow1 & (1 << IRQ_VBLANK)) ? ASSERT_LINE : CLEAR_LINE);
911 		m_subcpu->set_input_line(IRQ_SPRITE+1, m_irq_sprite && (m_irq_allow1 & (1 << IRQ_SPRITE)) ? ASSERT_LINE : CLEAR_LINE);
912 		//m_subcpu->set_input_line(IRQ_FRC+1, m_irq_frc && (m_irq_allow1 & (1 << IRQ_FRC)) ? ASSERT_LINE : CLEAR_LINE);
913 		break;
914 	}
915 }
916 
917 // gground bp at 849c (84a4)
918 // cmp.w $a00000, d0   | 16
919 // dbeq d1, 84b4       | 10
920 // 26 cycles/tour
921 // 0x200 counts
922 // 656 cycles/ligne
923 // 656*0x200/26 = 12918 (3276) -> cd89 (got e087, delta = 1f78, 8056)
924 // 410 cycles/ligne
925 // 410*0x200/26 = 8073
926 
irq_r(offs_t offset)927 uint16_t segas24_state::irq_r(offs_t offset)
928 {
929 	switch(offset) {
930 	case 2:
931 		m_irq_timer_pend0 = false;
932 		m_maincpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE);
933 		break;
934 	case 3:
935 		m_irq_timer_pend1 = false;
936 		m_subcpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE);
937 		break;
938 	}
939 	irq_timer_sync();
940 	return m_irq_tval & 0xfff;
941 }
942 
TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_vbl)943 TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_vbl)
944 {
945 	int irq, mask;
946 	int scanline = param;
947 
948 	/* TODO: perhaps vblank irq happens at 400, sprite IRQ certainly don't at 0! */
949 	if(scanline == 0) { irq = IRQ_SPRITE; m_irq_sprite = true; }
950 	else if(scanline == 384) { irq = IRQ_VBLANK; m_irq_vblank = true; }
951 	else
952 		return;
953 
954 	m_irq_timer_clear->adjust(attotime::from_hz(HSYNC_CLOCK));
955 
956 	mask = 1 << irq;
957 
958 	if(m_irq_allow0 & mask)
959 		m_maincpu->set_input_line(1+irq, ASSERT_LINE);
960 
961 	if(m_irq_allow1 & mask)
962 		m_subcpu->set_input_line(1+irq, ASSERT_LINE);
963 
964 	if(scanline == 384) {
965 		// Ensure one index pulse every 20 frames
966 		// The is some code in bnzabros at 0x852 that makes it crash
967 		// if the pulse train is too fast
968 		m_fdc_index_count++;
969 		if(m_fdc_index_count >= 20)
970 			m_fdc_index_count = 0;
971 	}
972 
973 	irq_timer_sync();
974 	m_irq_vsynctime = machine().time();
975 }
976 
WRITE_LINE_MEMBER(segas24_state::irq_ym)977 WRITE_LINE_MEMBER(segas24_state::irq_ym)
978 {
979 	m_irq_yms = state;
980 	m_maincpu->set_input_line(IRQ_YM2151+1, m_irq_yms && (m_irq_allow0 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE);
981 	m_subcpu->set_input_line(IRQ_YM2151+1, m_irq_yms && (m_irq_allow1 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE);
982 }
983 
984 
985 // 315-5242
986 
paletteram_r(offs_t offset)987 uint16_t segas24_state::paletteram_r(offs_t offset)
988 {
989 	return m_paletteram[offset];
990 }
991 
paletteram_w(offs_t offset,uint16_t data,uint16_t mem_mask)992 void segas24_state::paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
993 {
994 	int r, g, b;
995 	COMBINE_DATA (m_paletteram + offset);
996 	data = m_paletteram[offset];
997 
998 	r = (data & 0x00f) << 4;
999 	if(data & 0x1000)
1000 		r |= 8;
1001 
1002 	g = data & 0x0f0;
1003 	if(data & 0x2000)
1004 		g |= 8;
1005 
1006 	b = (data & 0xf00) >> 4;
1007 	if(data & 0x4000)
1008 		b |= 8;
1009 
1010 	r |= r >> 5;
1011 	g |= g >> 5;
1012 	b |= b >> 5;
1013 
1014 	m_palette->set_pen_color(offset, rgb_t(r, g, b));
1015 
1016 	if(data & 0x8000) {
1017 		r = 255-0.6*(255-r);
1018 		g = 255-0.6*(255-g);
1019 		b = 255-0.6*(255-b);
1020 	} else {
1021 		r = 0.6*r;
1022 		g = 0.6*g;
1023 		b = 0.6*b;
1024 	}
1025 	m_palette->set_pen_color(offset+m_palette->entries()/2, rgb_t(r, g, b));
1026 }
1027 
1028 
1029 /*
1030 CPU1:
1031 00-03 ROM (1)
1032 04-07 ROM
1033 08-0f ramlo (2)
1034 10-13 ROM
1035 14-17 ROM
1036 f0-f3 ramprg (3)
1037 fc-ff ramhi (4)
1038 
1039 CPU2:
1040 00-03 ramprg
1041 04-07 ROM
1042 08-0f ramlo
1043 10-13 ROM
1044 14-17 ROM
1045 f0-f3 ramprg
1046 fc-ff ramhi
1047 */
1048 
1049 /*************************************
1050  *
1051  *  Shared memory handlers
1052  *
1053  *************************************/
1054 
1055 /*
1056  Both CPUs have the same memory map, except for the first 512K where
1057  CPU A has ROM and CPU B has work RAM mapped there.
1058 
1059  The memory map can be broken down into the following regions:
1060 
1061  000000-07FFFF : BIOS ROM (for CPU A only)
1062                  CPU B work RAM (for CPU B only)
1063  080000-0FFFFF : CPU A work RAM
1064  100000-1FFFFF : BIOS ROM
1065  200000-3FFFFF : Tilemap generator
1066  400000-5FFFFF : Mixer chip
1067  600000-7FFFFF : Sprite generator
1068  800000-9FFFFF : I/O chip
1069  A00000-AFFFFF : Timer and interrupt controller chip
1070  B00000-EFFFFF : Extra chip selects for expansion
1071  F00000-F7FFFF : CPU B work RAM
1072  F80000-FFFFFF : CPU A work RAM
1073 
1074  The BIOS ROM mirror at $100000 is common to both CPUs.
1075 */
1076 
1077 
common_map(address_map & map)1078 void segas24_state::common_map(address_map &map)
1079 {
1080 	map(0x080000, 0x0bffff).mirror(0x040000).ram().share("share1");
1081 	map(0x100000, 0x13ffff).mirror(0x0c0000).rom().region("maincpu", 0);
1082 	map(0x200000, 0x20ffff).mirror(0x110000).rw("tile", FUNC(segas24_tile_device::tile_r), FUNC(segas24_tile_device::tile_w));
1083 	map(0x220000, 0x220001).mirror(0x11fffe).nopw();        /* Horizontal split position (ABSEL) */
1084 	map(0x240000, 0x240001).mirror(0x11fffe).nopw();        /* Scanline trigger position (XHOUT) */
1085 	map(0x260000, 0x260001).mirror(0x10fffe).nopw();        /* Frame trigger position (XVOUT) */
1086 	map(0x270000, 0x270001).mirror(0x10fffe).nopw();        /* Synchronization mode */
1087 	map(0x280000, 0x29ffff).mirror(0x160000).rw("tile", FUNC(segas24_tile_device::char_r), FUNC(segas24_tile_device::char_w));
1088 	map(0x400000, 0x403fff).mirror(0x1f8000).rw(FUNC(segas24_state::paletteram_r), FUNC(segas24_state::paletteram_w)).share("paletteram");
1089 	map(0x404000, 0x40401f).mirror(0x1fbfe0).rw("mixer", FUNC(segas24_mixer_device::read), FUNC(segas24_mixer_device::write));
1090 	map(0x600000, 0x63ffff).mirror(0x180000).rw("sprite", FUNC(segas24_sprite_device::read), FUNC(segas24_sprite_device::write));
1091 	map(0x800000, 0x80003f).mirror(0x1ffe00).rw("io", FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write)).umask16(0x00ff);
1092 	map(0x800040, 0x80007f).mirror(0x1ffe00).rw(FUNC(segas24_state::iod_r), FUNC(segas24_state::iod_w));
1093 	map(0x800100, 0x800103).mirror(0x1ffe00).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
1094 	map(0xa00000, 0xa00007).mirror(0x0ffff8).rw(FUNC(segas24_state::irq_r), FUNC(segas24_state::irq_w));
1095 	map(0xb00000, 0xb00007).mirror(0x07fff0).rw(FUNC(segas24_state::fdc_r), FUNC(segas24_state::fdc_w));
1096 	map(0xb00008, 0xb0000f).mirror(0x07fff0).rw(FUNC(segas24_state::fdc_status_r), FUNC(segas24_state::fdc_ctrl_w));
1097 	map(0xbc0003, 0xbc0003).mirror(0x03fff8).rw(FUNC(segas24_state::frc_mode_r), FUNC(segas24_state::frc_mode_w));
1098 	map(0xbc0005, 0xbc0005).mirror(0x03fff8).rw(FUNC(segas24_state::frc_r), FUNC(segas24_state::frc_w));
1099 	map(0xbc0007, 0xbc0007).mirror(0x03fff8).rw(FUNC(segas24_state::mlatch_r), FUNC(segas24_state::mlatch_w));
1100 	map(0xcc0003, 0xcc0003).mirror(0x03fff8).rw(FUNC(segas24_state::frc_mode_r), FUNC(segas24_state::frc_mode_w));
1101 	map(0xcc0005, 0xcc0005).mirror(0x03fff8).rw(FUNC(segas24_state::frc_r), FUNC(segas24_state::frc_w));
1102 	map(0xcc0007, 0xcc0007).mirror(0x03fff8).rw(FUNC(segas24_state::mlatch_r), FUNC(segas24_state::mlatch_w));
1103 	map(0xf00000, 0xf3ffff).mirror(0x040000).ram().share("subcpu");
1104 	map(0xf80000, 0xfbffff).mirror(0x040000).ram().share("share1");
1105 }
1106 
rombd_common_map(address_map & map)1107 void segas24_state::rombd_common_map(address_map &map)
1108 {
1109 	map(0xb80000, 0xbbffff).bankr("rombank1");
1110 	map(0xbc0001, 0xbc0001).mirror(0x03fff8).rw(FUNC(segas24_state::curbank_r), FUNC(segas24_state::curbank_w));
1111 	map(0xc80000, 0xcbffff).bankr("rombank2");
1112 	map(0xcc0001, 0xcc0001).mirror(0x03fff8).rw(FUNC(segas24_state::curbank_r), FUNC(segas24_state::curbank_w));
1113 }
1114 
roughrac_common_map(address_map & map)1115 void segas24_state::roughrac_common_map(address_map &map)
1116 {
1117 	map(0xc00000, 0xc00007).mirror(0x07ffe0).r("upd4701", FUNC(upd4701_device::read_xy)).umask16(0x00ff);
1118 }
1119 
hotrod_common_map(address_map & map)1120 void segas24_state::hotrod_common_map(address_map &map)
1121 {
1122 	map(0xc00000, 0xc00007).mirror(0x07ffe0).r("upd1", FUNC(upd4701_device::read_xy)).umask16(0x00ff);
1123 	map(0xc00008, 0xc0000f).mirror(0x07ffe0).r("upd2", FUNC(upd4701_device::read_xy)).umask16(0x00ff);
1124 	map(0xc00011, 0xc00011).mirror(0x07ffec).rw("adc1", FUNC(msm6253_device::d7_r), FUNC(msm6253_device::select_w));
1125 	map(0xc00013, 0xc00013).mirror(0x07ffec).rw("adc2", FUNC(msm6253_device::d7_r), FUNC(msm6253_device::select_w));
1126 }
1127 
1128 
1129 /*************************************
1130  *
1131  *  CPU 1 memory handlers
1132  *
1133  *************************************/
1134 
cpu1_map(address_map & map)1135 void segas24_state::cpu1_map(address_map &map)
1136 {
1137 	common_map(map);
1138 	map(0x000000, 0x03ffff).mirror(0x040000).rom().region("maincpu", 0);
1139 }
1140 
rombd_cpu1_map(address_map & map)1141 void segas24_state::rombd_cpu1_map(address_map &map)
1142 {
1143 	cpu1_map(map);
1144 	rombd_common_map(map);
1145 }
1146 
roughrac_cpu1_map(address_map & map)1147 void segas24_state::roughrac_cpu1_map(address_map &map)
1148 {
1149 	cpu1_map(map);
1150 	roughrac_common_map(map);
1151 }
1152 
hotrod_cpu1_map(address_map & map)1153 void segas24_state::hotrod_cpu1_map(address_map &map)
1154 {
1155 	cpu1_map(map);
1156 	hotrod_common_map(map);
1157 }
1158 
dcclubj_cpu1_map(address_map & map)1159 void segas24_state::dcclubj_cpu1_map(address_map &map)
1160 {
1161 	rombd_cpu1_map(map);
1162 	roughrac_common_map(map);
1163 }
1164 
1165 /*************************************
1166  *
1167  *  CPU 2 memory handlers
1168  *
1169  *************************************/
1170 
cpu2_map(address_map & map)1171 void segas24_state::cpu2_map(address_map &map)
1172 {
1173 	common_map(map);
1174 	map(0x000000, 0x03ffff).mirror(0x040000).ram().share("subcpu");
1175 }
1176 
rombd_cpu2_map(address_map & map)1177 void segas24_state::rombd_cpu2_map(address_map &map)
1178 {
1179 	cpu2_map(map);
1180 	rombd_common_map(map);
1181 }
1182 
roughrac_cpu2_map(address_map & map)1183 void segas24_state::roughrac_cpu2_map(address_map &map)
1184 {
1185 	cpu2_map(map);
1186 	roughrac_common_map(map);
1187 }
1188 
hotrod_cpu2_map(address_map & map)1189 void segas24_state::hotrod_cpu2_map(address_map &map)
1190 {
1191 	cpu2_map(map);
1192 	hotrod_common_map(map);
1193 }
1194 
dcclubj_cpu2_map(address_map & map)1195 void segas24_state::dcclubj_cpu2_map(address_map &map)
1196 {
1197 	rombd_cpu2_map(map);
1198 	roughrac_common_map(map);
1199 }
1200 
decrypted_opcodes_map(address_map & map)1201 void segas24_state::decrypted_opcodes_map(address_map &map)
1202 {
1203 	map(0x00000, 0xfffff).bankr("fd1094_decrypted_opcodes");
1204 }
1205 
1206 /*************************************
1207  *
1208  *  Generic driver initialization
1209  *
1210  *************************************/
1211 
machine_start()1212 void segas24_state::machine_start()
1213 {
1214 	if ((m_romboard != nullptr) && (m_rombank[0] != nullptr) && (m_rombank[1] != nullptr))
1215 	{
1216 		uint8_t *usr1 = m_romboard->base();
1217 		m_rombank[0]->configure_entries(0, 16, usr1, 0x40000);
1218 		m_rombank[1]->configure_entries(0, 16, usr1, 0x40000);
1219 
1220 		save_item(NAME(m_curbank));
1221 	}
1222 
1223 	if (m_track_size)
1224 	{
1225 		subdevice<nvram_device>("floppy_nvram")->set_base(&m_floppy[0], 2*m_track_size);
1226 
1227 		save_item(NAME(m_fdc_track_side));
1228 		save_item(NAME(m_fdc_mode));
1229 		save_item(NAME(m_fdc_status));
1230 		save_item(NAME(m_fdc_track));
1231 		save_item(NAME(m_fdc_sector));
1232 		save_item(NAME(m_fdc_data));
1233 		save_item(NAME(m_fdc_phys_track));
1234 		save_item(NAME(m_fdc_irq));
1235 		save_item(NAME(m_fdc_drq));
1236 		save_item(NAME(m_fdc_span));
1237 		save_item(NAME(m_fdc_index_count));
1238 	}
1239 
1240 	save_item(NAME(m_mlatch));
1241 
1242 	save_item(NAME(m_irq_tdata));
1243 	save_item(NAME(m_irq_tval));
1244 	save_item(NAME(m_irq_tmode));
1245 	save_item(NAME(m_irq_allow0));
1246 	save_item(NAME(m_irq_allow1));
1247 	save_item(NAME(m_irq_timer_pend0));
1248 	save_item(NAME(m_irq_timer_pend1));
1249 	save_item(NAME(m_irq_yms));
1250 	save_item(NAME(m_irq_vblank));
1251 	save_item(NAME(m_irq_sprite));
1252 
1253 	save_item(NAME(m_frc_mode));
1254 
1255 	save_item(NAME(m_cnt1));
1256 }
1257 
machine_reset()1258 void segas24_state::machine_reset()
1259 {
1260 	m_subcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
1261 	m_cnt1 = true;
1262 	fdc_init();
1263 	irq_init();
1264 	m_mlatch = 0x00;
1265 	m_frc_mode = 0;
1266 	m_frc_cnt_timer->reset();
1267 	if ((m_romboard != nullptr) && (m_rombank[0] != nullptr) && (m_rombank[1] != nullptr))
1268 	{
1269 		m_curbank = 0;
1270 		reset_bank();
1271 	}
1272 }
1273 
1274 /*************************************
1275  *
1276  *  Generic port definitions
1277  *
1278  *************************************/
1279 
1280 static INPUT_PORTS_START( system24_generic )
1281 	PORT_START("P1")
1282 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
1283 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
1284 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
1285 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 ) //enabled with "Separate"
1286 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
1287 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
1288 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
1289 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
1290 
1291 	PORT_START("P2")
1292 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
1293 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
1294 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
1295 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE3 ) //enabled with "Separate"
1296 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
1297 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
1298 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
1299 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
1300 
1301 	PORT_START("P3")
1302 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
1303 
1304 	PORT_START("SERVICE")
1305 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
1306 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
1307 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )
1308 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
1309 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
1310 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
1311 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
1312 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN4 )
1313 
1314 	PORT_START("COINAGE")
SEGA_COINAGE_LOC(SW1)1315 	SEGA_COINAGE_LOC(SW1)
1316 
1317 	PORT_START("DSW")
1318 	PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW2:1" )
1319 	PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "SW2:2" )
1320 	PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" )
1321 	PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW2:4" )
1322 	PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" )
1323 	PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW2:6" )
1324 	PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" )
1325 	PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" )
1326 INPUT_PORTS_END
1327 
1328 
1329 /*************************************
1330  *
1331  *  Game-specific port definitions
1332  *
1333  *************************************/
1334 
1335 static INPUT_PORTS_START( hotrod )
1336 	PORT_INCLUDE( system24_generic )
1337 
1338 	PORT_MODIFY("P1")
1339 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
1340 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
1341 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
1342 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 )
1343 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN5 )
1344 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN6 )
1345 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN7 )
1346 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN8 )
1347 
1348 	PORT_MODIFY("P2")
1349 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
1350 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
1351 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
1352 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
1353 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE2 )
1354 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 )
1355 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE4 )
1356 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
1357 
1358 	PORT_MODIFY("DSW")
1359 	//"SW2:1" unused
1360 	//"SW2:2" unused
1361 	//"SW2:3" unused
1362 	//"SW2:4" unused
1363 	//"SW2:5" unused
1364 	PORT_DIPNAME( 0x20, 0x20, "Start Credit" ) PORT_DIPLOCATION("SW2:6")
1365 	PORT_DIPSETTING(    0x20, "1" )
1366 	PORT_DIPSETTING(    0x00, "2" )
1367 	PORT_DIPNAME( 0x40, 0x40, "Coin Chute" ) PORT_DIPLOCATION("SW2:7")
1368 	PORT_DIPSETTING(    0x40, "Separate" )
1369 	PORT_DIPSETTING(    0x00, "Common" )
1370 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:8")
1371 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
1372 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1373 
1374 	PORT_START("DIAL1")
1375 	PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_RESET PORT_PLAYER(1)
1376 
1377 	PORT_START("DIAL2")
1378 	PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_RESET PORT_PLAYER(2)
1379 
1380 	PORT_START("DIAL3")
1381 	PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_RESET PORT_PLAYER(3)
1382 
1383 	PORT_START("DIAL4")
1384 	PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_RESET PORT_PLAYER(4)
1385 
1386 	PORT_START("PEDAL1")
1387 	PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
1388 
1389 	PORT_START("PEDAL2")
1390 	PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2)
1391 
1392 	PORT_START("PEDAL3")
1393 	PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(3)
1394 
1395 	PORT_START("PEDAL4")
1396 	PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(4)
1397 INPUT_PORTS_END
1398 
1399 static INPUT_PORTS_START( hotrodj )
1400 	PORT_INCLUDE( hotrod )
1401 
1402 	PORT_MODIFY("DSW")
1403 	//"SW2:1" unused
1404 	//"SW2:2" unused
1405 	PORT_DIPNAME( 0x04, 0x04, "Start Credit" ) PORT_DIPLOCATION("SW2:3")
1406 	PORT_DIPSETTING(    0x04, "1" )
1407 	PORT_DIPSETTING(    0x00, "2" )
1408 	PORT_DIPNAME( 0x08, 0x08, "Play Mode" ) PORT_DIPLOCATION("SW2:4")
1409 	PORT_DIPSETTING(    0x08, "4 Player" )
1410 	PORT_DIPSETTING(    0x00, "2 Player" )
1411 	PORT_DIPNAME( 0x10, 0x10, "Game Style" ) PORT_DIPLOCATION("SW2:5")
1412 	PORT_DIPSETTING(    0x10, "4 Sides" )
1413 	PORT_DIPSETTING(    0x00, "2 Sides" )
1414 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:6")
1415 	PORT_DIPSETTING(    0x20, DEF_STR( Japanese ) )
1416 	PORT_DIPSETTING(    0x00, DEF_STR( English ) )
1417 	//"SW2:7" not divert from "hotrod"
1418 	//"SW2:8" not divert from "hotrod"
1419 INPUT_PORTS_END
1420 
1421 static INPUT_PORTS_START( bnzabros )
1422 	PORT_INCLUDE( system24_generic )
1423 
1424 	PORT_MODIFY("DSW")
1425 	PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1")
1426 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
1427 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1428 	PORT_DIPNAME( 0x02, 0x02, "Start Credit" ) PORT_DIPLOCATION("SW2:2")
1429 	PORT_DIPSETTING(    0x02, "1" )
1430 	PORT_DIPSETTING(    0x00, "2" )
1431 	PORT_DIPNAME( 0x04, 0x04, "Coin Chute" ) PORT_DIPLOCATION("SW2:3")
1432 	PORT_DIPSETTING(    0x04, "Common" )
1433 	PORT_DIPSETTING(    0x00, "Individual" )
1434 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:4")
1435 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
1436 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1437 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6")
1438 	PORT_DIPSETTING(    0x20, DEF_STR( Easy ) )
1439 	PORT_DIPSETTING(    0x30, DEF_STR( Normal ) )
1440 	PORT_DIPSETTING(    0x10, DEF_STR( Hard ) )
1441 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1442 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:7,8")
1443 	PORT_DIPSETTING(    0x00, "1" )
1444 	PORT_DIPSETTING(    0x40, "2" )
1445 	PORT_DIPSETTING(    0xc0, "3" )
1446 	PORT_DIPSETTING(    0x80, "4" )
1447 INPUT_PORTS_END
1448 
1449 static INPUT_PORTS_START( crkdown )
1450 	PORT_INCLUDE( system24_generic )
1451 
1452 	PORT_MODIFY("DSW")
1453 	//"SW2:1" unused
1454 	//"SW2:2" unused
1455 	//"SW2:3" unused
1456 	//"SW2:4" unused
1457 	//"SW2:5" unused
1458 	//"SW2:6" unused
1459 	PORT_DIPNAME( 0x40, 0x40, "Coin Chute" ) PORT_DIPLOCATION("SW2:7")
1460 	PORT_DIPSETTING(    0x40, "Common" ) // Japanese manual says "Single"
1461 	PORT_DIPSETTING(    0x00, "Separate" ) // Japanese manual says "Twin"
1462 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:8")
1463 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
1464 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1465 INPUT_PORTS_END
1466 
1467 static INPUT_PORTS_START( roughrac )
1468 	PORT_INCLUDE( system24_generic )
1469 
1470 	PORT_MODIFY("DSW")
1471 	PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1")
1472 	PORT_DIPSETTING(    0x01, "1" )
1473 	PORT_DIPSETTING(    0x00, "2" )
1474 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1475 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1476 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1477 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:3")
1478 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
1479 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1480 	PORT_DIPNAME( 0x08, 0x08, "Game Instruction" ) PORT_DIPLOCATION("SW2:4")
1481 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
1482 	PORT_DIPSETTING(    0x08, DEF_STR( On ) )
1483 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6")
1484 	PORT_DIPSETTING(    0x20, DEF_STR( Easy ) )
1485 	PORT_DIPSETTING(    0x30, DEF_STR( Normal ) )
1486 	PORT_DIPSETTING(    0x10, DEF_STR( Hard ) )
1487 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1488 	PORT_DIPNAME( 0x40, 0x40, "Start Money" ) PORT_DIPLOCATION("SW2:7")
1489 	PORT_DIPSETTING(    0x40, "15000" )
1490 	PORT_DIPSETTING(    0x00, "20000" )
1491 	PORT_DIPNAME( 0x80, 0x80, "Start Intro" ) PORT_DIPLOCATION("SW2:8")
1492 	PORT_DIPSETTING(    0x80, "10" )
1493 	PORT_DIPSETTING(    0x00, "15" )
1494 
1495 	PORT_START("DIAL1")
1496 	PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_RESET PORT_PLAYER(1)
1497 
1498 	PORT_START("DIAL2")
1499 	PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_RESET PORT_PLAYER(2)
1500 INPUT_PORTS_END
1501 
1502 static INPUT_PORTS_START( sspirits )
1503 	PORT_INCLUDE( system24_generic )
1504 
1505 	PORT_MODIFY("DSW")
1506 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1")
1507 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
1508 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1509 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1510 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1511 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1512 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:3,4")
1513 	PORT_DIPSETTING(    0x00, "2" )
1514 	PORT_DIPSETTING(    0x0c, "3" )
1515 	PORT_DIPSETTING(    0x08, "4" )
1516 	PORT_DIPSETTING(    0x04, "5" )
1517 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:5,6")
1518 	PORT_DIPSETTING(    0x20, "500K" )
1519 	PORT_DIPSETTING(    0x30, "600K" )
1520 	PORT_DIPSETTING(    0x10, "800K" )
1521 	PORT_DIPSETTING(    0x00, DEF_STR( None ) )
1522 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8")
1523 	PORT_DIPSETTING(    0x80, DEF_STR( Easy ) )
1524 	PORT_DIPSETTING(    0xc0, DEF_STR( Normal ) )
1525 	PORT_DIPSETTING(    0x40, DEF_STR( Hard ) )
1526 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1527 INPUT_PORTS_END
1528 
1529 static INPUT_PORTS_START( qgh )
1530 	PORT_INCLUDE( system24_generic )
1531 
1532 	PORT_MODIFY("DSW")
1533 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1")
1534 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
1535 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1536 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1537 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1538 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1539 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4")
1540 	PORT_DIPSETTING(    0x08, DEF_STR( Easy ) )
1541 	PORT_DIPSETTING(    0x0c, DEF_STR( Normal ) )
1542 	PORT_DIPSETTING(    0x04, DEF_STR( Hard ) )
1543 	PORT_DIPSETTING(    0x00, DEF_STR( Hard ) )
1544 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6")
1545 	PORT_DIPSETTING(    0x10, "3" )
1546 	PORT_DIPSETTING(    0x00, "3" )
1547 	PORT_DIPSETTING(    0x20, "4" )
1548 	PORT_DIPSETTING(    0x30, "5" )
1549 	//"SW2:7" unused
1550 	//"SW2:8" unused
1551 INPUT_PORTS_END
1552 
1553 static INPUT_PORTS_START( qsww )
1554 	PORT_INCLUDE( system24_generic )
1555 
1556 	PORT_MODIFY("DSW")
1557 	PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1")
1558 	PORT_DIPSETTING(    0x01, "1" )
1559 	PORT_DIPSETTING(    0x00, "2" )
1560 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1561 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1562 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1563 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:3")
1564 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
1565 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1566 	//"SW2:4" unused
1567 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6")
1568 	PORT_DIPSETTING(    0x10, "2" )
1569 	PORT_DIPSETTING(    0x00, "3" )
1570 	PORT_DIPSETTING(    0x30, "4" )
1571 	PORT_DIPSETTING(    0x20, "5" )
1572 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8")
1573 	PORT_DIPSETTING(    0x80, DEF_STR( Easy ) )
1574 	PORT_DIPSETTING(    0xc0, DEF_STR( Normal ) )
1575 	PORT_DIPSETTING(    0x40, DEF_STR( Hard ) )
1576 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1577 INPUT_PORTS_END
1578 
1579 
1580 static INPUT_PORTS_START( sgmast )
1581 	PORT_INCLUDE( system24_generic )
1582 
1583 	PORT_MODIFY("P1")
1584 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Angle Left")
1585 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Club")
1586 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Angle Right")
1587 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Stance")
1588 	/* For select the power shot rotate the stick from up-left (max power) to up (minimum power) and release */
1589 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_CUSTOM )
1590 
1591 	PORT_MODIFY("P2")
1592 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
1593 
1594 	PORT_START("PADDLE")
1595 	PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xbf) PORT_SENSITIVITY(16) PORT_KEYDELTA(16) PORT_PLAYER(1) PORT_NAME("P1 Swing")
1596 
1597 	PORT_MODIFY("DSW")
1598 	PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1")
1599 	PORT_DIPSETTING(    0x01, "1" )
1600 	PORT_DIPSETTING(    0x00, "2" )
1601 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1602 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1603 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1604 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:3")
1605 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
1606 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1607 	PORT_DIPNAME( 0x08, 0x08, "Gameplay" ) PORT_DIPLOCATION("SW2:4")
1608 	PORT_DIPSETTING(    0x08, "1 Hole 1 Credit" )
1609 	PORT_DIPSETTING(    0x00, "Lose Ball Game Over" )
1610 	//"SW2:5" unused
1611 	PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7,8") // MeterWidth WindVelocity MeterSpeed
1612 	PORT_DIPSETTING(    0x80, DEF_STR( Easiest ) )                                  //        64%          30%        50%
1613 	PORT_DIPSETTING(    0xa0, DEF_STR( Easier ) )                                   //        64%          50%        75%
1614 	PORT_DIPSETTING(    0xc0, DEF_STR( Easy ) )                                     //       100%          75%        75%
1615 	PORT_DIPSETTING(    0xe0, DEF_STR( Normal ) )                                   //       100%         100%       100%
1616 	PORT_DIPSETTING(    0x60, "Little Hard" )                                       //       118%          75%       100%
1617 	PORT_DIPSETTING(    0x40, DEF_STR( Hard ) )                                     //       118%         100%       100%
1618 	PORT_DIPSETTING(    0x20, DEF_STR( Harder ) )                                   //       136%          75%       100%
1619 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )                                  //       136%         100%       100%
1620 INPUT_PORTS_END
1621 
1622 // Japanese version has an analog "angle" device in place of the two dedicated buttons
1623 static INPUT_PORTS_START( sgmastj )
1624 	PORT_INCLUDE( sgmast )
1625 
1626 	PORT_MODIFY("P1")
1627 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
1628 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
1629 
1630 	PORT_MODIFY("DSW")
1631 	//"SW2:1" not divert from "sgmast"
1632 	//"SW2:2" not divert from "sgmast"
1633 	//"SW2:3" not divert from "sgmast"
1634 	PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW2:4" )
1635 	//"SW2:5" unused
1636 	//"SW2:6" not divert from "sgmast"
1637 	//"SW2:7" not divert from "sgmast"
1638 	//"SW2:8" not divert from "sgmast"
1639 
1640 	PORT_START("DIAL1")
1641 	PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_RESET PORT_PLAYER(1) PORT_NAME("P1 Angle")
1642 
1643 	PORT_START("DIAL2")
1644 	PORT_BIT( 0xfff, 0x000, IPT_UNUSED )
1645 INPUT_PORTS_END
1646 
1647 static INPUT_PORTS_START( dcclub_dips )
1648 	PORT_MODIFY("DSW")
1649 	PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1")
1650 	PORT_DIPSETTING(    0x01, "1" )
1651 	PORT_DIPSETTING(    0x00, "2" )
1652 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:2")
1653 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1654 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1655 	PORT_DIPNAME( 0x04, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:3")
1656 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
1657 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1658 	PORT_DIPNAME( 0x08, 0x08, "Timing Meter" ) PORT_DIPLOCATION("SW2:4")
1659 	PORT_DIPSETTING(    0x08, DEF_STR( Normal ) )
1660 	PORT_DIPSETTING(    0x00, DEF_STR( Easy ) )
1661 	PORT_DIPNAME( 0x10, 0x10, "Initial Balls" ) PORT_DIPLOCATION("SW2:5")
1662 	PORT_DIPSETTING(    0x00, "1" )
1663 	PORT_DIPSETTING(    0x10, "2" )
1664 	PORT_DIPNAME( 0x20, 0x20, "Balls Limit" ) PORT_DIPLOCATION("SW2:6")
1665 	PORT_DIPSETTING(    0x00, "3" )
1666 	PORT_DIPSETTING(    0x20, "4" )
1667 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8")
1668 	PORT_DIPSETTING(    0x80, DEF_STR( Easy ) )
1669 	PORT_DIPSETTING(    0xc0, DEF_STR( Normal ) )
1670 	PORT_DIPSETTING(    0x40, DEF_STR( Hard ) )
1671 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1672 INPUT_PORTS_END
1673 
1674 static INPUT_PORTS_START( dcclub )
1675 	PORT_INCLUDE( sgmast )
1676 	PORT_INCLUDE( dcclub_dips )
1677 INPUT_PORTS_END
1678 
1679 static INPUT_PORTS_START( dcclubj )
1680 	PORT_INCLUDE( sgmastj )
1681 	PORT_INCLUDE( dcclub_dips )
1682 INPUT_PORTS_END
1683 
1684 static INPUT_PORTS_START( quizmeku )
1685 	PORT_INCLUDE( system24_generic )
1686 
1687 	PORT_MODIFY("P1")
1688 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START3 )
1689 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
1690 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
1691 
1692 	PORT_MODIFY("P2")
1693 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START4 )
1694 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
1695 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
1696 
1697 	PORT_MODIFY("P3")
1698 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(4)
1699 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4)
1700 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(4)
1701 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(4)
1702 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
1703 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
1704 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
1705 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
1706 
1707 	PORT_MODIFY("DSW")
1708 	PORT_DIPNAME( 0x01, 0x00, "Play Mode" ) PORT_DIPLOCATION("SW2:1")
1709 	PORT_DIPSETTING(    0x01, "2 Player" )
1710 	PORT_DIPSETTING(    0x00, "4 Player" )
1711 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1712 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1713 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1714 	PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:3,4")
1715 	PORT_DIPSETTING(    0x08, "2" )
1716 	PORT_DIPSETTING(    0x0c, "3" )
1717 	PORT_DIPSETTING(    0x04, "4" )
1718 	PORT_DIPSETTING(    0x00, "5" )
1719 	PORT_DIPNAME( 0x10, 0x10, "Answer Counts" ) PORT_DIPLOCATION("SW2:5")
1720 	PORT_DIPSETTING(    0x10, "Every" )
1721 	PORT_DIPSETTING(    0x00, "3" )
1722 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:6")
1723 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
1724 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1725 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8")
1726 	PORT_DIPSETTING(    0x80, DEF_STR( Easy ) )
1727 	PORT_DIPSETTING(    0xc0, DEF_STR( Normal ) )
1728 	PORT_DIPSETTING(    0x40, DEF_STR( Hard ) )
1729 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1730 INPUT_PORTS_END
1731 
1732 static INPUT_PORTS_START( qrouka )
1733 	PORT_INCLUDE( system24_generic )
1734 
1735 	PORT_MODIFY("P1")
1736 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START3 )
1737 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
1738 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
1739 
1740 	PORT_MODIFY("P2")
1741 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START4 )
1742 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
1743 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
1744 
1745 	PORT_MODIFY("P3")
1746 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(4)
1747 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4)
1748 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(4)
1749 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(4)
1750 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
1751 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
1752 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
1753 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
1754 
1755 	PORT_MODIFY("SERVICE")
1756 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00)
1757 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00)
1758 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )
1759 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
1760 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
1761 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
1762 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00)
1763 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00)
1764 	/* alt coin mode */
1765 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CONDITION("DSW",0x08,EQUALS,0x08)
1766 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_CONDITION("DSW",0x08,EQUALS,0x08)
1767 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW",0x08,EQUALS,0x08)
1768 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW",0x08,EQUALS,0x08)
1769 
1770 	PORT_MODIFY("DSW")
1771 	PORT_DIPNAME( 0x01, 0x00, "Play Mode" ) PORT_DIPLOCATION("SW2:1")
1772 	PORT_DIPSETTING(    0x01, "2 Player" )
1773 	PORT_DIPSETTING(    0x00, "4 Player" )
1774 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1775 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1776 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1777 	//"SW2:3" unused
1778 	PORT_DIPNAME( 0x08, 0x08, "Coin Chute" ) PORT_DIPLOCATION("SW2:4")
1779 	PORT_DIPSETTING(    0x08, "Common" )
1780 	PORT_DIPSETTING(    0x00, "Separate" )
1781 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6")
1782 	PORT_DIPSETTING(    0x10, "2" )
1783 	PORT_DIPSETTING(    0x00, "3" )
1784 	PORT_DIPSETTING(    0x30, "4" )
1785 	PORT_DIPSETTING(    0x20, "5" )
1786 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8")
1787 	PORT_DIPSETTING(    0x80, DEF_STR( Easy ) )
1788 	PORT_DIPSETTING(    0xc0, DEF_STR( Normal ) )
1789 	PORT_DIPSETTING(    0x40, DEF_STR( Hard ) )
1790 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1791 INPUT_PORTS_END
1792 
1793 static INPUT_PORTS_START( mahmajn )
1794 	PORT_INCLUDE( system24_generic )
1795 
1796 	PORT_MODIFY("P1")
1797 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
1798 
1799 	PORT_MODIFY("P2")
1800 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
1801 
1802 	PORT_MODIFY("P3")
1803 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
1804 
1805 	PORT_START("MJ0")
1806 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A )
1807 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_B )
1808 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_C )
1809 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_D )
1810 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
1811 
1812 	PORT_START("MJ1")
1813 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_E )
1814 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F )
1815 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_G )
1816 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_H )
1817 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
1818 
1819 	PORT_START("MJ2")
1820 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_I )
1821 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_J )
1822 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K )
1823 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_L )
1824 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
1825 
1826 	PORT_START("MJ3")
1827 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_M )
1828 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_N )
1829 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_CHI )
1830 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON )
1831 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
1832 
1833 	PORT_START("MJ4")
1834 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
1835 	PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED )
1836 
1837 	PORT_START("MJ5")
1838 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_KAN )
1839 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_REACH )
1840 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_RON )
1841 	PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED )
1842 
1843 	PORT_MODIFY("DSW")
1844 	PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1")
1845 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
1846 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1847 	PORT_DIPNAME( 0x02, 0x02, "Start Score" ) PORT_DIPLOCATION("SW2:2")
1848 	PORT_DIPSETTING(    0x00, "2000" )
1849 	PORT_DIPSETTING(    0x02, "3000" )
1850 	PORT_DIPNAME( 0x0c, 0x0c, "Difficulty (computer)" ) PORT_DIPLOCATION("SW2:3,4")
1851 	PORT_DIPSETTING(    0x08, DEF_STR( Easy ) )
1852 	PORT_DIPSETTING(    0x0c, DEF_STR( Normal ) )
1853 	PORT_DIPSETTING(    0x04, DEF_STR( Hard ) )
1854 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1855 	PORT_DIPNAME( 0x30, 0x30, "Difficulty (player)" ) PORT_DIPLOCATION("SW2:5,6")
1856 	PORT_DIPSETTING(    0x20, DEF_STR( Easy ) )
1857 	PORT_DIPSETTING(    0x30, DEF_STR( Normal ) )
1858 	PORT_DIPSETTING(    0x10, DEF_STR( Hard ) )
1859 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
1860 	//"SW2:7" unused
1861 	//"SW2:8" unused
1862 INPUT_PORTS_END
1863 
1864 static INPUT_PORTS_START( gground )
1865 	PORT_INCLUDE( system24_generic )
1866 
1867 	PORT_MODIFY("P3")
1868 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 )
1869 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
1870 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
1871 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE4 ) //enabled with "Separate"
1872 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
1873 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
1874 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
1875 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
1876 
1877 	PORT_MODIFY("DSW")
1878 	// Here is known problem.
1879 	// Service mode works as I hoped.
1880 	// But game mode doesn't. It works as all dipswitches are On.
1881 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1")
1882 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
1883 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1884 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
1885 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
1886 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
1887 	PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4,5")
1888 	PORT_DIPSETTING(    0x00, DEF_STR( Easiest ) )
1889 	PORT_DIPSETTING(    0x10, DEF_STR( Easier ) )
1890 	PORT_DIPSETTING(    0x08, DEF_STR( Easy ) )
1891 	PORT_DIPSETTING(    0x18, "Little Easy" )
1892 	PORT_DIPSETTING(    0x1c, DEF_STR( Normal ) )
1893 	PORT_DIPSETTING(    0x0c, "Little Hard" )
1894 	PORT_DIPSETTING(    0x14, DEF_STR( Hard ) )
1895 	PORT_DIPSETTING(    0x04, DEF_STR( Hardest ) )
1896 	PORT_DIPNAME( 0x60, 0x60, "Time Limit Per Stage" ) PORT_DIPLOCATION("SW2:6,7")
1897 	PORT_DIPSETTING(    0x20, DEF_STR( Easiest ) )
1898 	PORT_DIPSETTING(    0x40, DEF_STR( Easy ) )
1899 	PORT_DIPSETTING(    0x60, DEF_STR( Normal ) )
1900 	PORT_DIPSETTING(    0x00, DEF_STR( Hard ) )
1901 	PORT_DIPNAME( 0x80, 0x80, "Clock Of Time Limit" ) PORT_DIPLOCATION("SW2:8")
1902 	PORT_DIPSETTING(    0x80, "1.00 sec" )
1903 	PORT_DIPSETTING(    0x00, "0.80 sec" )
1904 INPUT_PORTS_END
1905 
1906 
1907 /*************************************
1908  *
1909  *  Generic machine drivers
1910  *
1911  *************************************/
1912 
1913 void segas24_state::system24(machine_config &config)
1914 {
1915 	/* basic machine hardware */
1916 	M68000(config, m_maincpu, MASTER_CLOCK/2);
1917 	m_maincpu->set_addrmap(AS_PROGRAM, &segas24_state::cpu1_map);
1918 	TIMER(config, "scantimer").configure_scanline(FUNC(segas24_state::irq_vbl), "screen", 0, 1);
1919 
1920 	M68000(config, m_subcpu, MASTER_CLOCK/2);
1921 	m_subcpu->set_addrmap(AS_PROGRAM, &segas24_state::cpu2_map);
1922 
1923 	config.set_maximum_quantum(attotime::from_hz(6000));
1924 
1925 	sega_315_5296_device &io(SEGA_315_5296(config, "io", VIDEO_CLOCK/2));
1926 	io.in_pa_callback().set_ioport("P1");
1927 	io.in_pb_callback().set_ioport("P2");
1928 	io.in_pc_callback().set_ioport("P3");
1929 	io.out_pd_callback().set(FUNC(segas24_state::hotrod_lamps_w));
1930 	io.in_pe_callback().set_ioport("SERVICE");
1931 	io.in_pf_callback().set_ioport("COINAGE");
1932 	io.in_pg_callback().set_ioport("DSW");
1933 	io.out_ph_callback().set("dac", FUNC(dac_byte_interface::data_w));
1934 	io.out_cnt1_callback().set(FUNC(segas24_state::cnt1));
1935 	io.out_cnt2_callback().set("ymsnd", FUNC(ym2151_device::reset_w));
1936 
1937 	TIMER(config, "irq_timer").configure_generic(FUNC(segas24_state::irq_timer_cb));
1938 	TIMER(config, "irq_timer_clear").configure_generic(FUNC(segas24_state::irq_timer_clear_cb));
1939 	TIMER(config, "frc_timer").configure_generic(nullptr);
1940 	TIMER(config, "irq_frc").configure_periodic(FUNC(segas24_state::irq_frc_cb), attotime::from_hz(FRC_CLOCK_MODE1));
1941 
1942 	S24TILE(config, m_vtile, 0, 0xfff).set_palette("palette");
1943 	S24SPRITE(config, m_vsprite, 0);
1944 	S24MIXER(config, m_vmixer, 0);
1945 
1946 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
1947 	m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
1948 	m_screen->set_raw(VIDEO_CLOCK/2, 656, 0/*+69*/, 496/*+69*/, 424, 0/*+25*/, 384/*+25*/);
1949 	m_screen->set_screen_update(FUNC(segas24_state::screen_update));
1950 	m_screen->set_palette(m_palette);
1951 
1952 	PALETTE(config, m_palette).set_entries(8192*2);
1953 
1954 	SPEAKER(config, "lspeaker").front_left();
1955 	SPEAKER(config, "rspeaker").front_right();
1956 
1957 	ym2151_device &ymsnd(YM2151(config, "ymsnd", 4000000));
1958 	ymsnd.irq_handler().set(FUNC(segas24_state::irq_ym));
1959 	ymsnd.add_route(0, "lspeaker", 0.50);
1960 	ymsnd.add_route(1, "rspeaker", 0.50);
1961 
1962 	DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
1963 }
1964 
system24_rom(machine_config & config)1965 void segas24_state::system24_rom(machine_config &config)
1966 {
1967 	system24(config);
1968 	m_maincpu->set_addrmap(AS_PROGRAM, &segas24_state::rombd_cpu1_map);
1969 	m_subcpu->set_addrmap(AS_PROGRAM, &segas24_state::rombd_cpu2_map);
1970 }
1971 
mahmajn(machine_config & config)1972 void segas24_state::mahmajn(machine_config &config)
1973 {
1974 	system24_rom(config);
1975 	sega_315_5296_device &io(*subdevice<sega_315_5296_device>("io"));
1976 	io.in_pa_callback().set(FUNC(segas24_state::mahmajn_input_line_r));
1977 	io.in_pc_callback().set(FUNC(segas24_state::mahmajn_inputs_r));
1978 	io.out_pd_callback().set(FUNC(segas24_state::mahmajn_mux_w));
1979 }
1980 
system24_floppy(machine_config & config)1981 void segas24_state::system24_floppy(machine_config &config)
1982 {
1983 	system24(config);
1984 	NVRAM(config, "floppy_nvram", nvram_device::DEFAULT_NONE);
1985 }
1986 
system24_floppy_rom(machine_config & config)1987 void segas24_state::system24_floppy_rom(machine_config &config)
1988 {
1989 	system24_floppy(config);
1990 	m_maincpu->set_addrmap(AS_PROGRAM, &segas24_state::rombd_cpu1_map);
1991 	m_subcpu->set_addrmap(AS_PROGRAM, &segas24_state::rombd_cpu2_map);
1992 }
1993 
system24_floppy_hotrod(machine_config & config)1994 void segas24_state::system24_floppy_hotrod(machine_config &config)
1995 {
1996 	system24_floppy(config);
1997 	m_maincpu->set_addrmap(AS_PROGRAM, &segas24_state::hotrod_cpu1_map);
1998 	m_subcpu->set_addrmap(AS_PROGRAM, &segas24_state::hotrod_cpu2_map);
1999 
2000 	upd4701_device &upd1(UPD4701A(config, "upd1")); // IC4 on 834-6510 I/O board
2001 	upd1.set_portx_tag("DIAL1");
2002 	upd1.set_porty_tag("DIAL2");
2003 
2004 	upd4701_device &upd2(UPD4701A(config, "upd2")); // IC1
2005 	upd2.set_portx_tag("DIAL3");
2006 	upd2.set_porty_tag("DIAL4");
2007 
2008 	msm6253_device &adc1(MSM6253(config, "adc1", 0)); // IC5 - 33k/33p R/C clock
2009 	adc1.set_input_tag<0>("PEDAL1");
2010 	adc1.set_input_tag<1>("PEDAL2");
2011 	adc1.set_input_tag<2>("PEDAL3");
2012 	adc1.set_input_tag<3>("PEDAL4");
2013 
2014 	MSM6253(config, "adc2", 0); // IC2 - 33k/33p R/C clock
2015 }
2016 
system24_floppy_fd1094(machine_config & config)2017 void segas24_state::system24_floppy_fd1094(machine_config &config)
2018 {
2019 	system24_floppy(config);
2020 	FD1094(config.replace(), m_subcpu, MASTER_CLOCK/2);
2021 	m_subcpu->set_addrmap(AS_PROGRAM, &segas24_state::cpu2_map);
2022 	m_subcpu->set_addrmap(AS_OPCODES, &segas24_state::decrypted_opcodes_map);
2023 }
2024 
system24_floppy_fd_upd(machine_config & config)2025 void segas24_state::system24_floppy_fd_upd(machine_config &config)
2026 {
2027 	system24_floppy_fd1094(config);
2028 	m_maincpu->set_addrmap(AS_PROGRAM, &segas24_state::roughrac_cpu1_map);
2029 	m_subcpu->set_addrmap(AS_PROGRAM, &segas24_state::roughrac_cpu2_map);
2030 
2031 	upd4701_device &upd4701(UPD4701A(config, "upd4701")); // IC4 on 834-6510 I/O board
2032 	upd4701.set_portx_tag("DIAL1");
2033 	upd4701.set_porty_tag("DIAL2");
2034 }
2035 
dcclub(machine_config & config)2036 void segas24_state::dcclub(machine_config &config)
2037 {
2038 	system24_rom(config);
2039 	sega_315_5296_device &io(*subdevice<sega_315_5296_device>("io"));
2040 	io.in_pa_callback().set(FUNC(segas24_state::dcclub_p1_r));
2041 	io.in_pc_callback().set(FUNC(segas24_state::dcclub_p3_r));
2042 }
2043 
dcclubj(machine_config & config)2044 void segas24_state::dcclubj(machine_config &config)
2045 {
2046 	dcclub(config);
2047 	m_maincpu->set_addrmap(AS_PROGRAM, &segas24_state::dcclubj_cpu1_map);
2048 	m_subcpu->set_addrmap(AS_PROGRAM, &segas24_state::dcclubj_cpu2_map);
2049 
2050 	upd4701_device &upd4701(UPD4701A(config, "upd4701"));
2051 	upd4701.set_portx_tag("DIAL1");
2052 	upd4701.set_porty_tag("DIAL2");
2053 }
2054 
system24_floppy_dcclub(machine_config & config)2055 void segas24_state::system24_floppy_dcclub(machine_config &config)
2056 {
2057 	system24_floppy_fd1094(config);
2058 	sega_315_5296_device &io(*subdevice<sega_315_5296_device>("io"));
2059 	io.in_pa_callback().set(FUNC(segas24_state::dcclub_p1_r));
2060 	io.in_pc_callback().set(FUNC(segas24_state::dcclub_p3_r));
2061 }
2062 
sgmastj(machine_config & config)2063 void segas24_state::sgmastj(machine_config &config)
2064 {
2065 	system24_floppy_fd_upd(config);
2066 	sega_315_5296_device &io(*subdevice<sega_315_5296_device>("io"));
2067 	io.in_pa_callback().set(FUNC(segas24_state::dcclub_p1_r));
2068 	io.in_pc_callback().set(FUNC(segas24_state::dcclub_p3_r));
2069 }
2070 
2071 /*************************************
2072  *
2073  *  ROM definition(s)
2074  *
2075  *************************************/
2076 
2077 //*************************************************************************************************************************
2078 //  Hot Rod, Sega System 24
2079 //   Sega game ID: 833-6570-01 HOT ROD
2080 //     Main board: 837-6571
2081 // I/O Controller: 834-6510
2082 ROM_START( hotrod )
2083 	ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
2084 	ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) )
2085 	ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) )
2086 
2087 	ROM_REGION( 0x1d6000, "floppy", 0)
2088 	ROM_LOAD( "ds3-5000-01d_3p_turbo.img", 0x000000, 0x1d6000, CRC(842006fd) SHA1(d5432f58c0fb39f2bf62786a0d842bdd469ab2cb) )
2089 ROM_END
2090 
ROM_START(hotroda)2091 ROM_START( hotroda )
2092 	ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
2093 	ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) )
2094 	ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) )
2095 
2096 	ROM_REGION( 0x1d6000, "floppy", 0)
2097 	ROM_LOAD( "ds3-5000-01d.img", 0x000000, 0x1d6000, CRC(e25c6b63) SHA1(fbf86d2ebccd8053b990939f63f5497907d18321) )
2098 ROM_END
2099 
2100 ROM_START( hotrodja )
2101 	ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
2102 	ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) )
2103 	ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) )
2104 
2105 	ROM_REGION( 0x1d6000, "floppy", 0)
2106 	ROM_LOAD( "ds3-5000-01a-rev-b.img", 0x000000, 0x1d6000, CRC(c18f6dca) SHA1(6f2b5a9567a340324a5f3fb57a3b744de0924a23) )
2107 ROM_END
2108 
2109 ROM_START( hotrodj )
2110 	ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
2111 	ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) )
2112 	ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) )
2113 
2114 	ROM_REGION( 0x1d6000, "floppy", 0)
2115 	ROM_LOAD( "ds3-5000-01a-rev-c.img", 0x000000, 0x1d6000, CRC(852f9b5f) SHA1(159e161f55beed0f90cce8a73b0aeb4564d6af90) )
2116 ROM_END
2117 
2118 ROM_START( qgh )
2119 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2120 	ROM_LOAD16_BYTE( "16900b", 0x000000, 0x20000, CRC(20d7b7d1) SHA1(345b228c27e5f2fef9a2b8b5f619c59450a070f8) )
2121 	ROM_LOAD16_BYTE( "16899b", 0x000001, 0x20000, CRC(397b3ba9) SHA1(1773212cd87dcff840f3953ec368be7e2394faf0) )
2122 
2123 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2124 	ROM_LOAD16_BYTE( "16902a", 0x000000, 0x80000, CRC(d35b7706) SHA1(341bca0af6b6d3f326328a88cdc69c7897b83a0d) )
2125 	ROM_LOAD16_BYTE( "16901a", 0x000001, 0x80000, CRC(ab4bcb33) SHA1(8acd73096eb485c6dc83da6adfcc47d5d0f5b7f3) )
2126 	ROM_LOAD16_BYTE( "16904",  0x100000, 0x80000, CRC(10987c88) SHA1(66f893690565aed613427421958ebe225a20ad0f) )
2127 	ROM_LOAD16_BYTE( "16903",  0x100001, 0x80000, CRC(c19f9e46) SHA1(f1275674a8b44957428d79402f240ca21a34f48d) )
2128 	ROM_LOAD16_BYTE( "16906",  0x200000, 0x80000, CRC(99c6773e) SHA1(568570b607d2cbbedb39ceae5bbc479478fae4ca) )
2129 	ROM_LOAD16_BYTE( "16905",  0x200001, 0x80000, CRC(3922bbe3) SHA1(4378ca900f96138b5e33265ddac56af7b45afbc8) )
2130 	ROM_LOAD16_BYTE( "16908",  0x300000, 0x80000, CRC(407ec20f) SHA1(c8a909d8e9ba024a37a5af6b7920fe7023f80d49) )
2131 	ROM_LOAD16_BYTE( "16907",  0x300001, 0x80000, CRC(734b0a82) SHA1(d3fb31c55e79b99040beb7c49faaf2e17b95aa87) )
2132 ROM_END
2133 
2134 ROM_START( qrouka )
2135 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2136 	ROM_LOAD16_BYTE( "14485", 0x000000, 0x20000, CRC(fc0085f9) SHA1(0250d1e17e19b541b85198ec4207e55bfbd5c32e) )
2137 	ROM_LOAD16_BYTE( "14484", 0x000001, 0x20000, CRC(f51c641c) SHA1(3f2fd0be7d58c75e88565393da5e810655413b53) )
2138 
2139 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2140 	ROM_LOAD16_BYTE( "14482", 0x000000, 0x80000, CRC(7a13dd97) SHA1(bfe9950d2cd41f3f866520923c1ed7b8da1990ec) )
2141 	ROM_LOAD16_BYTE( "14483", 0x100000, 0x80000, CRC(f3eb51a0) SHA1(6904830ff5e7aa5f016e115572fb6da678896ede) )
2142 ROM_END
2143 
2144 ROM_START( mahmajn )
2145 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2146 	ROM_LOAD16_BYTE( "epr14813.bin", 0x000000, 0x20000, CRC(ea38cf4b) SHA1(118ab2e0ae20a4db5e619945dfbb3f200de3979c) )
2147 	ROM_LOAD16_BYTE( "epr14812.bin", 0x000001, 0x20000, CRC(5a3cb4a7) SHA1(c0f21282140e8e6e927664f5f2b90525ae0207e9) )
2148 
2149 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2150 	ROM_LOAD16_BYTE( "mpr14820.bin", 0x000000, 0x80000, CRC(8d2a03d3) SHA1(b3339bcd101bcfe042e2a1cfdc8baef0a86624df) )
2151 	ROM_LOAD16_BYTE( "mpr14819.bin", 0x000001, 0x80000, CRC(e84c4827) SHA1(54741295e1bdca7d0c78eb795a68b92212d43b2e) )
2152 	ROM_LOAD16_BYTE( "mpr14822.bin", 0x100000, 0x80000, CRC(7c3dcc51) SHA1(a199c2c71cda44a2c8755074c1007d83c8d45d2d) )
2153 	ROM_LOAD16_BYTE( "mpr14821.bin", 0x100001, 0x80000, CRC(bd8dc543) SHA1(fd50b14fa73307a62dc0b522cfedb8b3332c407e) )
2154 	ROM_LOAD16_BYTE( "mpr14824.bin", 0x200000, 0x80000, CRC(38311933) SHA1(237d9a8ffe14ba9ec371bb571d7c9e74a93fe1f3) )
2155 	ROM_LOAD16_BYTE( "mpr14823.bin", 0x200001, 0x80000, CRC(4c8d4550) SHA1(be8717d4080ce932fc8272ebe54e2b0a60b20edd) )
2156 	ROM_LOAD16_BYTE( "mpr14826.bin", 0x300000, 0x80000, CRC(c31b8805) SHA1(b446388c83af2e14300b0c4248470d3a8c504f2c) )
2157 	ROM_LOAD16_BYTE( "mpr14825.bin", 0x300001, 0x80000, CRC(191080a1) SHA1(407c1c5fa4c76732e8a444860094542e90a1e8e8) )
2158 ROM_END
2159 
2160 ROM_START( mahmajn2 )
2161 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2162 	ROM_LOAD16_BYTE( "epr16799.bin", 0x000000, 0x20000, CRC(3a34cf75) SHA1(d22bf6334668af29167cf4244d18f9cd2e7ff7d6) )
2163 	ROM_LOAD16_BYTE( "epr16798.bin", 0x000001, 0x20000, CRC(662923fa) SHA1(dcd3964d899d3f34dab22ffcd1a5af895804fae1) )
2164 
2165 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2166 	ROM_LOAD16_BYTE( "mpr16801.bin", 0x000000, 0x80000, CRC(74855a17) SHA1(d2d8e7da7b261e7cb64605284d2c78fbd1465b69) )
2167 	ROM_LOAD16_BYTE( "mpr16800.bin", 0x000001, 0x80000, CRC(6dbc1e02) SHA1(cce5734243ff171759cecb5c05c12dc743a25c1d) )
2168 	ROM_LOAD16_BYTE( "mpr16803.bin", 0x100000, 0x80000, CRC(9b658dd6) SHA1(eaaae289a3555aa6a92f57eea964dbbf48c5c2a4) )
2169 	ROM_LOAD16_BYTE( "mpr16802.bin", 0x100001, 0x80000, CRC(b4723225) SHA1(acb8923c7d9908b1112f8d1f2512f18236915e5d) )
2170 	ROM_LOAD16_BYTE( "mpr16805.bin", 0x200000, 0x80000, CRC(d15528df) SHA1(bda1dd5c98867c2e7666380bca0bc7eef8022fbc) )
2171 	ROM_LOAD16_BYTE( "mpr16804.bin", 0x200001, 0x80000, CRC(a0de08e2) SHA1(2c36b66e74b88fb076e2eaa250c6d06ee0b4ac88) )
2172 	ROM_LOAD16_BYTE( "mpr16807.bin", 0x300000, 0x80000, CRC(816188bb) SHA1(76b2690a6156766a1af94f01f6de1209b7756b2c) )
2173 	ROM_LOAD16_BYTE( "mpr16806.bin", 0x300001, 0x80000, CRC(54b353d3) SHA1(40632e4571b44ee215b5a1f7aab9d89c460a5c9e) )
2174 ROM_END
2175 
2176 ROM_START( bnzabros )
2177 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2178 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2179 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2180 
2181 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2182 	ROM_LOAD16_BYTE( "mpr-13188-h.2",  0x000000, 0x80000, CRC(d3802294) SHA1(7608e71e8ef398ac24dbf851994253bca5ace625) )
2183 	ROM_LOAD16_BYTE( "mpr-13187-h.1",  0x000001, 0x80000, CRC(e3d8c5f7) SHA1(5b1e8646debee2f2ef272ddd3320b0a17192fbbe) )
2184 	ROM_LOAD16_BYTE( "mpr-13190.4",    0x100000, 0x40000, CRC(0b4df388) SHA1(340478bba82069ab745d6d8703e6801411fd2fc4) )
2185 	ROM_RELOAD ( 0x180000, 0x40000)
2186 	ROM_LOAD16_BYTE( "mpr-13189.3",    0x100001, 0x40000, CRC(5ea5a2f3) SHA1(514b5446303c50aeb1d6d10d0a3f210da2577e16) )
2187 	ROM_RELOAD ( 0x180001, 0x40000)
2188 
2189 	ROM_REGION( 0x1c2000, "floppy", 0)
2190 	ROM_LOAD( "ds3-5000-07d.img", 0x000000, 0x1c2000, CRC(2e70251f) SHA1(1c2616dfa5cc15e8ebf1424012f2dd66f3a001a1) ) /* Region letter needs to be verfied */
2191 ROM_END
2192 
2193 ROM_START( bnzabrosj )
2194 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2195 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2196 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2197 
2198 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2199 	ROM_LOAD16_BYTE( "mpr-13188-h.2",  0x000000, 0x80000, CRC(d3802294) SHA1(7608e71e8ef398ac24dbf851994253bca5ace625) )
2200 	ROM_LOAD16_BYTE( "mpr-13187-h.1",  0x000001, 0x80000, CRC(e3d8c5f7) SHA1(5b1e8646debee2f2ef272ddd3320b0a17192fbbe) )
2201 	ROM_LOAD16_BYTE( "mpr-13190.4",    0x100000, 0x40000, CRC(0b4df388) SHA1(340478bba82069ab745d6d8703e6801411fd2fc4) )
2202 	ROM_RELOAD ( 0x180000, 0x40000)
2203 	ROM_LOAD16_BYTE( "mpr-13189.3",    0x100001, 0x40000, CRC(5ea5a2f3) SHA1(514b5446303c50aeb1d6d10d0a3f210da2577e16) )
2204 	ROM_RELOAD ( 0x180001, 0x40000)
2205 
2206 	ROM_REGION( 0x1c2000, "floppy", 0)
2207 	ROM_LOAD( "ds3-5000-07b.img", 0x000000, 0x1c2000, CRC(efa7f2a7) SHA1(eb905bff88fa40324fb92b91ac8a5878648c26e5) )
2208 ROM_END
2209 
2210 ROM_START( quizmeku ) // Quiz Mekuromeku Story
2211 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2212 	ROM_LOAD16_BYTE( "epr15343.ic2", 0x000000, 0x20000, CRC(c72399a7) SHA1(bfbf0079ea63f89bca4ce9081aed5d5c1d9d169a) )
2213 	ROM_LOAD16_BYTE( "epr15342.ic1", 0x000001, 0x20000, CRC(0968ac84) SHA1(4e1170ac123adaec32819754b5075531ff1925fe) )
2214 
2215 	ROM_REGION16_BE( 0x400000, "romboard", 0) // ROM board: 834-7492-12E
2216 	ROM_LOAD16_BYTE( "epr15345.ic5", 0x000000, 0x80000, CRC(88030b5d) SHA1(d2feeedb9a64c3dc8dd25716209f945d12fa9b53) )
2217 	ROM_LOAD16_BYTE( "epr15344.ic4", 0x000001, 0x80000, CRC(dd11b382) SHA1(2b0f49fb307a9aba0f295de64782ee095c557170) )
2218 	ROM_LOAD16_BYTE( "mpr15347.ic7", 0x100000, 0x80000, CRC(0472677b) SHA1(93ae57a2817b6b54c99814fca28ef51f7ff5e559) )
2219 	ROM_LOAD16_BYTE( "mpr15346.ic6", 0x100001, 0x80000, CRC(746d4d0e) SHA1(7863abe36126684772a4459d5b6f3b24670ec02b) )
2220 	ROM_LOAD16_BYTE( "mpr15349.ic9", 0x200000, 0x80000, CRC(770eecf1) SHA1(86cc5b4a325198dc1da1446ecd8e718415b7998a) )
2221 	ROM_LOAD16_BYTE( "mpr15348.ic8", 0x200001, 0x80000, CRC(7666e960) SHA1(f3f88d5c8318301a8c73141de60292f8349ac0ce) )
2222 ROM_END
2223 
2224 ROM_START( sspirits )
2225 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2226 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2227 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2228 
2229 	ROM_REGION( 0x1c2000, "floppy", 0)
2230 	ROM_LOAD( "ds3-5000-02-.img", 0x000000, 0x1c2000, CRC(179b98e9) SHA1(f6fc52c599c336d5c6f7aa199515268b4b3218a8) )
2231 ROM_END
2232 
2233 ROM_START( sspiritj )
2234 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2235 	ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) )
2236 	ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) )
2237 
2238 	ROM_REGION( 0x1d6000, "floppy", 0)
2239 	ROM_LOAD( "ds3-5000-02-rev-a.img", 0x000000, 0x1d6000, CRC(0385470f) SHA1(62c1bfe3a88b2dee44629809e08b4b8a5770eaab)  )
2240 ROM_END
2241 
2242 ROM_START( sspirtfc )
2243 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2244 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2245 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2246 
2247 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2248 	ROM_LOAD( "317-0058-02c.key", 0x0000, 0x2000,  CRC(ebae170e) SHA1(b6d1e1b6943a35b96e98e426ecb39bb5a42fb643) )
2249 
2250 	ROM_REGION( 0x1c2000, "floppy", 0)
2251 	ROM_LOAD( "ds3-5000-02c.img", 0x000000, 0x1c2000, NO_DUMP )
2252 ROM_END
2253 
2254 ROM_START( sgmast )
2255 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2256 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2257 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2258 
2259 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2260 	// reconstructed key; some of the RNG-independent bits could be incorrect
2261 	ROM_LOAD( "317-0058-05d.key", 0x0000, 0x2000, BAD_DUMP  CRC(c779738d) SHA1(f65355c20fbcb22781816d24633a509f13bec170) )
2262 
2263 	ROM_REGION( 0x1c2000, "floppy", 0)
2264 	ROM_LOAD( "ds3-5000-05d.img",      0x000000, 0x1c2000, CRC(e9a69f93) SHA1(dc15e47ed78373688c1fab72a9605528068ad702) )
2265 ROM_END
2266 
2267 ROM_START( sgmastc )
2268 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2269 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2270 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2271 
2272 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2273 	ROM_LOAD( "317-0058-05c.key", 0x0000, 0x2000, CRC(ae0eabe5) SHA1(692d7565bf9c5b32cc80bb4bd88c9193aa04cbb0) )
2274 
2275 	ROM_REGION( 0x1c2000, "floppy", 0)
2276 	ROM_LOAD( "ds3-5000-05c.img", 0x000000, 0x1c2000, CRC(63a6ef3a) SHA1(f39fe0bf8930de994b1a77e0ba787d249d73c5e5) )
2277 ROM_END
2278 
2279 ROM_START( sgmastj )
2280 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2281 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2282 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2283 
2284 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2285 	ROM_LOAD( "317-0058-05b.key", 0x0000, 0x2000, CRC(adc0c83b) SHA1(2328d82d5057062eeb0072fd57f0422218cf24fc) )
2286 
2287 	ROM_REGION( 0x1c2000, "floppy", 0)
2288 	ROM_LOAD( "ds3-5000-05b.img", 0x000000, 0x1c2000,  CRC(a136668c) SHA1(7203f9d11023605a0a4b52a4be330785c8f7b623) )
2289 ROM_END
2290 
2291 ROM_START( qsww )
2292 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2293 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2294 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2295 
2296 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2297 	ROM_LOAD( "317-0058-08b.key", 0x0000, 0x2000,  CRC(fe0a336a) SHA1(f7a5b2c1a057d0bb8c1ae0453c58aa8f5fb731b9) )
2298 
2299 	ROM_REGION( 0x1c2000, "floppy", 0)
2300 	ROM_LOAD( "ds3-5000-08b.img", 0x000000, 0x1c2000, CRC(5a886d38) SHA1(2e974a9ffe3534da4fb117c579b8b0e61a63542c) )
2301 ROM_END
2302 
2303 ROM_START( gground )
2304 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2305 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2306 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2307 
2308 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2309 	ROM_LOAD( "317-0058-03d.key", 0x0000, 0x2000,  CRC(e1785bbd) SHA1(b4bebb2829299f1c0815d6a5f317a2526b322f63) ) /* Also labeled "rev-A" but is it different? */
2310 
2311 	ROM_REGION( 0x1c2000, "floppy", 0)
2312 	ROM_LOAD( "ds3-5000-03d-rev-a.img", 0x000000, 0x1c2000, CRC(5c5910f2) SHA1(9ed564a03c0d4ca4a207f3ecfb7336c6cbcaa70f) )
2313 ROM_END
2314 
2315 ROM_START( ggroundj )
2316 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2317 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2318 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2319 
2320 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2321 	ROM_LOAD( "317-0058-03b.key", 0x0000, 0x2000,  CRC(84aecdba) SHA1(ceddf967359a6e76543fe1ab00be53d0a11fe1ab) )
2322 
2323 	ROM_REGION( 0x1c2000, "floppy", 0)
2324 	ROM_LOAD( "ds3-5000-03b.img", 0x000000, 0x1c2000, CRC(7200dac9) SHA1(07cf33bf2a0da36e3852de409959f30128cdbf77) )
2325 ROM_END
2326 
2327 ROM_START( crkdown )
2328 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2329 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2330 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2331 
2332 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2333 	ROM_LOAD( "317-0058-04c.key", 0x0000, 0x2000,  CRC(16e978cc) SHA1(0e1482b5efa93b732d4cf0990919cb3fc903dca7) )
2334 
2335 	ROM_REGION( 0x1c2000, "floppy", 0)
2336 	ROM_LOAD( "ds3-5000-04c.img", 0x000000, 0x1c2000, CRC(7d97ba5e) SHA1(43f98bd04d031dd435bbd1bf8e6688bc57ce9666) )
2337 ROM_END
2338 
2339 ROM_START( crkdownu )
2340 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2341 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2342 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2343 
2344 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2345 	ROM_LOAD( "317-0058-04d.key", 0x0000, 0x2000,  CRC(934ac358) SHA1(73418e22c9d201bc3fec5c63284858958c010e05) )
2346 
2347 	ROM_REGION( 0x1c2000, "floppy", 0)
2348 	ROM_LOAD( "ds3-5000-04d.img", 0x000000, 0x1c2000, CRC(8679032c) SHA1(887b245a70652897fbda736b60e81a123866ec12) )
2349 ROM_END
2350 
2351 ROM_START( crkdownj )
2352 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2353 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2354 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2355 
2356 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2357 	ROM_LOAD( "317-0058-04b.key", 0x0000, 0x2000,  CRC(4a99a202) SHA1(d7375f09e7246ecd60ba0e48f049e9e252af92a8) ) /* Also labeled "rev-A" but is it different? */
2358 
2359 	ROM_REGION( 0x1c2000, "floppy", 0)
2360 	ROM_LOAD( "ds3-5000-04b-rev-a.img", 0x000000, 0x1c2000, CRC(5daa1a9a) SHA1(ce2f07b83b607bbbdb70f1ae344c1d897d601809) )
2361 ROM_END
2362 
2363 ROM_START( dcclub )
2364 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2365 	ROM_LOAD16_BYTE( "epr13948.bin", 0x000000, 0x20000, CRC(d6a031c8) SHA1(45b7e3cd2c7412e24f547cd4185166199d3938d5) )
2366 	ROM_LOAD16_BYTE( "epr13947.bin", 0x000001, 0x20000, CRC(7e3cff5e) SHA1(ff8cb776d2491796feeb8892c7e644e590438945) )
2367 
2368 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2369 	ROM_LOAD16_BYTE( "epr-15345.2",  0x000000, 0x80000, CRC(d9e120c2) SHA1(b18b76733078d8534c6f0d8950632ab51e6a10ab) )
2370 	ROM_LOAD16_BYTE( "epr-15344.1",  0x000001, 0x80000, CRC(8f8b9f74) SHA1(de6b923118bea60197547ad016cb5d5e1a8f372b) )
2371 	ROM_LOAD16_BYTE( "mpr-14097-t.4",0x100000, 0x80000, CRC(4bd74cae) SHA1(5aa90bd5d2b8e2338ef0fe41d1f794e8d51321e1) )
2372 	ROM_LOAD16_BYTE( "mpr-14096-t.3",0x100001, 0x80000, CRC(38d96502) SHA1(c68b3c5c83fd0839c3f6f81189c310ec19bdf1c4) )
2373 ROM_END
2374 
2375 //  Dynamic Country Club (Japan), Sega System 24
2376 //      ROM board: 834-7492-09E
2377 //     Main board: 837-6442-02
2378 // I/O Controller: 834-6510-01
2379 ROM_START( dcclubj )
2380 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2381 	ROM_LOAD16_BYTE( "epr13948.bin", 0x000000, 0x20000, CRC(d6a031c8) SHA1(45b7e3cd2c7412e24f547cd4185166199d3938d5) )
2382 	ROM_LOAD16_BYTE( "epr13947.bin", 0x000001, 0x20000, CRC(7e3cff5e) SHA1(ff8cb776d2491796feeb8892c7e644e590438945) )
2383 
2384 	ROM_REGION16_BE( 0x400000, "romboard", 0)
2385 	ROM_LOAD16_BYTE( "epr-14095a.2", 0x000000, 0x80000, CRC(88d184e9) SHA1(519f3a22e1619de9d5f13a45b85ebd249ebfa979) )
2386 	ROM_LOAD16_BYTE( "epr-14094a.1", 0x000001, 0x80000, CRC(7dd2b7d4) SHA1(c7eaf9e2700e0c55f7e867f5cd3ffaa5aae97956) )
2387 	ROM_LOAD16_BYTE( "mpr-14097-t.4",0x100000, 0x80000, CRC(4bd74cae) SHA1(5aa90bd5d2b8e2338ef0fe41d1f794e8d51321e1) )
2388 	ROM_LOAD16_BYTE( "mpr-14096-t.3",0x100001, 0x80000, CRC(38d96502) SHA1(c68b3c5c83fd0839c3f6f81189c310ec19bdf1c4) )
2389 ROM_END
2390 
2391 ROM_START( dcclubfd )
2392 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2393 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2394 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2395 
2396 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2397 	ROM_LOAD( "317-0058-09d.key", 0x0000, 0x2000, CRC(a91ebffb) SHA1(70b8b4272ca456491f254d115b434bb4ce73f049) )
2398 
2399 	ROM_REGION( 0x1c2000, "floppy", 0)
2400 	ROM_LOAD( "ds3-5000-09d.img", 0x000000, 0x1c2000,  CRC(69870887) SHA1(e47a997c2c783bf6670ab213ebe2ee35492eba34) )
2401 ROM_END
2402 
2403 ROM_START( roughrac )
2404 	ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
2405 	ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) )
2406 	ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) )
2407 
2408 	ROM_REGION( 0x2000, "subcpu:key", 0 )   /* decryption key */
2409 	ROM_LOAD( "317-0058-06b.key",    0x000000, 0x2000, CRC(6a5bf536) SHA1(3fc3e93ce8a47d7ee86da889efad2e7eca6e2ee9) )
2410 
2411 	ROM_REGION( 0x1c2000, "floppy", 0)
2412 	ROM_LOAD( "ds3-5000-06b.img",    0x000000, 0x1c2000, CRC(a7fb2149) SHA1(c04266ae31700b085ab45606aed83019a563de70) )
2413 ROM_END
2414 
2415 /* I think the letter after the disk code is the region
2416            'b' = Japan
2417            'c' = Europe?
2418            'd' = US
2419 */
2420 
2421 
2422 /*************************************
2423  *
2424  *  Game-specific driver inits
2425  *
2426  *************************************/
2427 
2428 void segas24_state::init_qgh()
2429 {
2430 	m_mlatch_table = s_qgh_mlt;
2431 	m_track_size = 0;
2432 }
2433 
init_dcclub()2434 void segas24_state::init_dcclub()
2435 {
2436 	m_mlatch_table = s_dcclub_mlt;
2437 	m_track_size = 0;
2438 }
2439 
init_qrouka()2440 void segas24_state::init_qrouka()
2441 {
2442 	m_mlatch_table = s_qrouka_mlt;
2443 	m_track_size = 0;
2444 }
2445 
init_quizmeku()2446 void segas24_state::init_quizmeku()
2447 {
2448 	m_mlatch_table = s_quizmeku_mlt;
2449 	m_track_size = 0;
2450 }
2451 
init_mahmajn()2452 void segas24_state::init_mahmajn()
2453 {
2454 	m_mlatch_table = s_mahmajn_mlt;
2455 	m_track_size = 0;
2456 	m_cur_input_line = 0;
2457 	save_item(NAME(m_cur_input_line));
2458 }
2459 
init_mahmajn2()2460 void segas24_state::init_mahmajn2()
2461 {
2462 	m_mlatch_table = s_mahmajn2_mlt;
2463 	m_track_size = 0;
2464 	m_cur_input_line = 0;
2465 	save_item(NAME(m_cur_input_line));
2466 }
2467 
init_hotrod()2468 void segas24_state::init_hotrod()
2469 {
2470 	m_mlatch_table = nullptr;
2471 
2472 	// Sector  Size
2473 	// 1       8192
2474 	// 2       1024
2475 	// 3       1024
2476 	// 4       1024
2477 	// 5        512
2478 	// 6        256
2479 
2480 	m_track_size = 0x2f00;
2481 }
2482 
init_bnzabros()2483 void segas24_state::init_bnzabros()
2484 {
2485 	m_mlatch_table = s_bnzabros_mlt;
2486 
2487 	// Sector  Size
2488 	// 1       2048
2489 	// 2       2048
2490 	// 3       2048
2491 	// 4       2048
2492 	// 5       2048
2493 	// 6       1024
2494 	// 7        256
2495 
2496 	m_track_size = 0x2d00;
2497 }
2498 
init_sspirits()2499 void segas24_state::init_sspirits()
2500 {
2501 	m_mlatch_table = nullptr;
2502 	m_track_size = 0x2d00;
2503 }
2504 
init_sspiritj()2505 void segas24_state::init_sspiritj()
2506 {
2507 	m_mlatch_table = nullptr;
2508 	m_track_size = 0x2f00;
2509 }
2510 
init_dcclubfd()2511 void segas24_state::init_dcclubfd()
2512 {
2513 	m_mlatch_table = s_dcclub_mlt;
2514 	m_track_size = 0x2d00;
2515 }
2516 
2517 
init_sgmast()2518 void segas24_state::init_sgmast()
2519 {
2520 	m_mlatch_table = nullptr;
2521 	m_track_size = 0x2d00;
2522 }
2523 
init_qsww()2524 void segas24_state::init_qsww()
2525 {
2526 	m_mlatch_table = nullptr;
2527 	m_track_size = 0x2d00;
2528 }
2529 
init_gground()2530 void segas24_state::init_gground()
2531 {
2532 	m_mlatch_table = nullptr;
2533 	m_track_size = 0x2d00;
2534 
2535 	m_gground_hack_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(segas24_state::gground_hack_timer_callback), this));
2536 }
2537 
init_crkdown()2538 void segas24_state::init_crkdown()
2539 {
2540 	m_mlatch_table = nullptr;
2541 	m_track_size = 0x2d00;
2542 }
2543 
init_roughrac()2544 void segas24_state::init_roughrac()
2545 {
2546 	m_mlatch_table = nullptr;
2547 	m_track_size = 0x2d00;
2548 }
2549 
2550 
2551 /*************************************
2552  *
2553  *  Game driver(s)
2554  *
2555  *************************************/
2556 
2557 //            YEAR  NAME       PARENT    MACHINE                 INPUT     CLASS          INIT           MONITOR COMPANY FULLNAME FLAGS
2558 /* Disk Based Games */
2559 /* 01 */GAME( 1988, hotrod,    0,        system24_floppy_hotrod, hotrod,   segas24_state, init_hotrod,   ROT0,   "Sega", "Hot Rod (World, 3 Players, Turbo set 1, Floppy Based)", 0 )
2560 /* 01 */GAME( 1988, hotroda,   hotrod,   system24_floppy_hotrod, hotrod,   segas24_state, init_hotrod,   ROT0,   "Sega", "Hot Rod (World, 3 Players, Turbo set 2, Floppy Based)", 0 )
2561 /* 01 */GAME( 1988, hotrodj,   hotrod,   system24_floppy_hotrod, hotrodj,  segas24_state, init_hotrod,   ROT0,   "Sega", "Hot Rod (Japan, 4 Players, Floppy Based, Rev C)", 0 )
2562 /* 01 */GAME( 1988, hotrodja,  hotrod,   system24_floppy_hotrod, hotrodj,  segas24_state, init_hotrod,   ROT0,   "Sega", "Hot Rod (Japan, 4 Players, Floppy Based, Rev B)", 0 )
2563 /* 02 */GAME( 1988, sspirits,  0,        system24_floppy,        sspirits, segas24_state, init_sspirits, ROT270, "Sega", "Scramble Spirits (World, Floppy Based)", 0 )
2564 /* 02 */GAME( 1988, sspiritj,  sspirits, system24_floppy,        sspirits, segas24_state, init_sspiritj, ROT270, "Sega", "Scramble Spirits (Japan, Floppy DS3-5000-02-REV-A Based)", 0 )
2565 /* 02 */GAME( 1988, sspirtfc,  sspirits, system24_floppy_fd1094, sspirits, segas24_state, init_sspirits, ROT270, "Sega", "Scramble Spirits (World, Floppy Based, FD1094 317-0058-02c)", MACHINE_NOT_WORKING ) /* MISSING disk image */
2566 /* 03 */GAME( 1988, gground,   0,        system24_floppy_fd1094, gground,  segas24_state, init_gground,  ROT270, "Sega", "Gain Ground (World, 3 Players, Floppy Based, FD1094 317-0058-03d Rev A)", 0 )
2567 /* 03 */GAME( 1988, ggroundj,  gground,  system24_floppy_fd1094, gground,  segas24_state, init_gground,  ROT270, "Sega", "Gain Ground (Japan, 2 Players, Floppy Based, FD1094 317-0058-03b)", 0 )
2568 /* 04 */GAME( 1989, crkdown,   0,        system24_floppy_fd1094, crkdown,  segas24_state, init_crkdown,  ROT0,   "Sega", "Crack Down (World, Floppy Based, FD1094 317-0058-04c)", MACHINE_IMPERFECT_GRAPHICS ) // clipping probs / solid layer probs? (radar display)
2569 /* 04 */GAME( 1989, crkdownu,  crkdown,  system24_floppy_fd1094, crkdown,  segas24_state, init_crkdown,  ROT0,   "Sega", "Crack Down (US, Floppy Based, FD1094 317-0058-04d)", MACHINE_IMPERFECT_GRAPHICS ) // clipping probs / solid layer probs? (radar display)
2570 /* 04 */GAME( 1989, crkdownj,  crkdown,  system24_floppy_fd1094, crkdown,  segas24_state, init_crkdown,  ROT0,   "Sega", "Crack Down (Japan, Floppy Based, FD1094 317-0058-04b Rev A)", MACHINE_IMPERFECT_GRAPHICS ) // clipping probs / solid layer probs? (radar display)
2571 /* 05 */GAME( 1989, sgmast,    0,        system24_floppy_dcclub, sgmast,   segas24_state, init_sgmast,   ROT0,   "Sega", "Super Masters Golf (World?, Floppy Based, FD1094 317-0058-05d?)", 0 )
2572 /* 05 */GAME( 1989, sgmastc,   sgmast,   system24_floppy_dcclub, sgmast,   segas24_state, init_sgmast,   ROT0,   "Sega", "Jumbo Ozaki Super Masters Golf (World, Floppy Based, FD1094 317-0058-05c)", MACHINE_IMPERFECT_GRAPHICS ) // some gfx offset / colour probs?
2573 /* 05 */GAME( 1989, sgmastj,   sgmast,   sgmastj,                sgmastj,  segas24_state, init_sgmast,   ROT0,   "Sega", "Jumbo Ozaki Super Masters Golf (Japan, Floppy Based, FD1094 317-0058-05b)", MACHINE_IMPERFECT_GRAPHICS ) // some gfx offset / colour probs?
2574 /* 06 */GAME( 1990, roughrac,  0,        system24_floppy_fd_upd, roughrac, segas24_state, init_roughrac, ROT0,   "Sega", "Rough Racer (Japan, Floppy Based, FD1094 317-0058-06b)", 0 )
2575 /* 07 */GAME( 1990, bnzabros,  0,        system24_floppy_rom,    bnzabros, segas24_state, init_bnzabros, ROT0,   "Sega", "Bonanza Bros (US, Floppy DS3-5000-07d? Based)", 0 )
2576 /* 07 */GAME( 1990, bnzabrosj, bnzabros, system24_floppy_rom,    bnzabros, segas24_state, init_bnzabros, ROT0,   "Sega", "Bonanza Bros (Japan, Floppy DS3-5000-07b Based)", 0 )
2577 /* 08 */GAME( 1991, qsww,      0,        system24_floppy_fd1094, qsww,     segas24_state, init_qsww,     ROT0,   "Sega", "Quiz Syukudai wo Wasuremashita (Japan, Floppy Based, FD1094 317-0058-08b)", MACHINE_IMPERFECT_GRAPHICS ) // wrong bg colour on title
2578 /* 09 */GAME( 1991, dcclubfd,  dcclub,   system24_floppy_dcclub, dcclub,   segas24_state, init_dcclubfd, ROT0,   "Sega", "Dynamic Country Club (US, Floppy Based, FD1094 317-0058-09d)", 0 )
2579 
2580 //    YEAR  NAME      PARENT    MACHINE       INPUT     CLASS          INIT           MONITOR COMPANY FULLNAME FLAGS
2581 /* ROM Based */
2582 GAME( 1991, dcclub,   0,        dcclub,       dcclub,   segas24_state, init_dcclub,   ROT0,   "Sega", "Dynamic Country Club (World, ROM Based)", 0 )
2583 GAME( 1991, dcclubj,  dcclub,   dcclubj,      dcclubj,  segas24_state, init_dcclub,   ROT0,   "Sega", "Dynamic Country Club (Japan, ROM Based)", 0 )
2584 GAME( 1991, qrouka,   0,        system24_rom, qrouka,   segas24_state, init_qrouka,   ROT0,   "Sega", "Quiz Rouka Ni Tattenasai (Japan, ROM Based)", 0 )
2585 GAME( 1992, quizmeku, 0,        system24_rom, quizmeku, segas24_state, init_quizmeku, ROT0,   "Sega", "Quiz Mekurumeku Story (Japan, ROM Based)", 0 ) /* Released in 05.1993 */
2586 GAME( 1992, mahmajn,  0,        mahmajn,      mahmajn,  segas24_state, init_mahmajn,  ROT0,   "Sega", "Tokoro San no MahMahjan (Japan, ROM Based)", 0 )
2587 GAME( 1994, qgh,      0,        system24_rom, qgh,      segas24_state, init_qgh,      ROT0,   "Sega", "Quiz Ghost Hunter (Japan, ROM Based)", 0 )
2588 GAME( 1994, mahmajn2, 0,        mahmajn,      mahmajn,  segas24_state, init_mahmajn2, ROT0,   "Sega", "Tokoro San no MahMahjan 2 (Japan, ROM Based)", 0 )
2589