diff options
Diffstat (limited to 'src/mame/drivers/segas24.cpp')
-rw-r--r-- | src/mame/drivers/segas24.cpp | 2511 |
1 files changed, 2511 insertions, 0 deletions
diff --git a/src/mame/drivers/segas24.cpp b/src/mame/drivers/segas24.cpp new file mode 100644 index 00000000000..644b4f723c0 --- /dev/null +++ b/src/mame/drivers/segas24.cpp @@ -0,0 +1,2511 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/* + * Sega System 24 + * + * Kudos to Charles MacDonald (http://cgfm2.emuviews.com) for his + * very useful research + * + * 3 Player controls for Gain Ground added by 'Unknown' + */ + +/* Missing: + - linescroll in special modes (qgh title, mahmajn2/qrouka attract mode) + - screen flipping (mix register 13 & 2) + - FRC timer IRQ is currently in a slight off-beat (timer should be resetted every time + that the mode changes, but current MAME framework doesn't seem to like it) +*/ + +/* +Sega System24 Overview +Sega, 1987-1994 + +PCB Layout +---------- + +Note: The differences in the revisions is just the use of different sized RAMs +and the quantities of RAM used. + +(1st Revision) +837-6442 SYSTEM 24 (C)SEGA 1987 +|-------------------------------------------------------------------------------| +| YM2151 DSW1 EPRxxxxx.IC1 --------------------------| TMM41464-10 | +| DSW2 EPRxxxxx.IC2 |-------------------------- TMM41464-10 | +| CN2 TMM41464-10 | +| 68000 |---------| TMM41464-10 | +| |---------| |--------------| | 315-5295| TMM41464-10 | +| | 315-5296| |HITACHI FD1094| |(QFP100) | TMM41464-10 | +|-| |(QFP100) | |317-0xxx-0xx | | | TMM41464-10 | + | | | |--------------| |---------| TMM41464-10 | +|-| |---------| MB81C466-10 | +| MB81C466-10 | +| |---------| MB81C466-10 | +|S |---------| | 315-5295| MB81C466-10 | +|E 20MHz | 315-5295| |(QFP100) | MB81C466-10 | +|G |(QFP100) | | | MB81C466-10 | +|A | | |---------| MB81C466-10 | +| |---------| MB81C466-10 | +|5 |---------| | +|6 |---------| |---------| | 315-5293| | +| | 315-5294| | 315-5292| | (QFP160)| | +| |(QFP100) | | (QFP160)| 32MHz | | | +| MB81C78A-45 | | | | |---------| | +|-| MB81C78A-45 |---------| |---------|M5M4464-12 x4 MB81461-12 x6 | + | | +|-| YM3012 | +| |--------| | +| |315-5242| HM65256 HM65256 HM65256 M5M4464-12 x4 MB81461-12 x6 | +| |(QFP44) | HM65256 HM65256 HM65256 | +|------------|--------|---------------------------------------------------------| + + +(2nd Revision) +837-6442-01 SYSTEM 24 (C) SEGA 1987 +|-------------------------------------------------------------------------------| +| YM2151 DSW1 EPRxxxxx.IC1 --------------------------| TMM41464-10 | +| DSW2 EPRxxxxx.IC2 |-------------------------- TMM41464-10 | +| CN2 TMM41464-10 | +| 68000 |---------| TMM41464-10 | +| |---------| |--------------| | 315-5295| TMM41464-10 | +| | 315-5296| |HITACHI FD1094| |(QFP100) | TMM41464-10 | +|-| |(QFP100) | |317-0xxx-0xx | | | TMM41464-10 | + | | | |--------------| |---------| TMM41464-10 | +|-| |---------| TMM41464-10 | +| TMM41464-10 | +| |---------| TMM41464-10 | +|S |---------| | 315-5295| TMM41464-10 | +|E 20MHz | 315-5295| |(QFP100) | TMM41464-10 | +|G |(QFP100) | | | TMM41464-10 | +|A | | |---------| TMM41464-10 | +| |---------| TMM41464-10 | +|5 |---------| | +|6 |---------| |---------| | 315-5293| | +| | 315-5294| | 315-5292| | (QFP160)| | +| |(QFP100) | | (QFP160)| 32MHz | | | +| MB81C78A-45 | | | | |---------| | +|-| MB81C78A-45 |---------| |---------|M5M4464-12 x4 MB81461-12 x6 | + | | +|-| YM3012 (*) | +| |--------| | +| |315-5242| HM65256 HM65256 HM65256 M5M4464-12 x4 MB81461-12 x6 | +| |(QFP44) | HM65256 HM65256 HM65256 | +|------------|--------|---------------------------------------------------------| +(*) Unpopulated Sockets for MB81C4256 x4 + + +(3rd Revision) +837-6442-02 SYSTEM 24 (C) SEGA 1987 +|-------------------------------------------------------------------------------| +| YM2151 DSW1 EPRxxxxx.IC1 --------------------------| TC514256-10 | +| DSW2 EPRxxxxx.IC2 |-------------------------- TC514256-10 | +| CN2 TC514256-10 | +| 68000 |---------| TC514256-10 | +| |---------| |--------------| | 315-5295| TC514256-10 | +| | 315-5296| |HITACHI FD1094| |(QFP100) | TC514256-10 | +|-| |(QFP100) | |317-0xxx-0xx | | | TC514256-10 | + | | | |--------------| |---------| TC514256-10 | +|-| |---------| | +| | +| |---------| | +|S |---------| | 315-5295| | +|E 20MHz | 315-5295| |(QFP100) | | +|G |(QFP100) | | | | +|A | | |---------| | +| |---------| | +|5 |---------| | +|6 |---------| |---------| | 315-5293| | +| | 315-5294| | 315-5292| | (QFP160)| | +| |(QFP100) | | (QFP160)| 32MHz | | | +| MB81C78A-45 | | | | |---------| | +|-| MB81C78A-45 |---------| |---------| MB81461-12 x6 | + | | +|-| YM3012 | +| |--------| | +| |315-5242| HM65256 HM65256 TC51832 TC514256-10 x4 MB81461-12 x6 | +| |(QFP44) | HM65256 HM65256 TC51832 | +|------------|--------|---------------------------------------------------------| +Notes: + 315-5292: Custom Sega IC (QFP160, Tilemap Generator) + 315-5293: Custom Sega IC (QFP160, Object Generator) + 315-5294: Custom Sega IC (QFP100, Mixer Chip) + 315-5295: Custom Sega IC (QFP100, Object Generator) + 315-5296: Custom Sega IC (QFP100, I/O Chip) + 315-5242: Custom Sega IC (QFP44, Colour Encoder) + 68000 clock: 10.000MHz + Hitachi FD1094 clock: 10.000MHz + YM2151 clock: 4.000MHz + VSync: 58Hz + HSync: 24.33kHz (All System24 games require 24kHz monitor) + CN2 (Above PCB): Connector for ROM Board (Not used for floppy-based games) + CN2 (Below PCB): Connector for Floppy Controller Board (Not used for ROM-based games) + Main PCB Pinout same as System 16 + Floppy Drive is a standard 1.44 High Density drive, but the controller is custom and + the floppy disk format is custom. The floppy disk can be read with "Anadisk" + depending on the PC being used and it's floppy controller. Most clone PC's can't read the + System 24 floppies even with "Anadisk"[1]. But many brand-name PC's can. It's likely due to the + propietry nature of the components used in brand-name PC's. Generally the older and crappier + the PC is, the better chance you have of being able to read the floppy ;-) + + [1] Actually, most can _except_ for the Hotrod disks. Those 8K sectors are deadly. + + +Floppy Controller PCB Layout +---------------------------- + +837-6443 ___________ +|---------------| DATA |-- ||||---| +| PWR | +| 74LS367 74LS05 | +| 74LS367 74LS174 | +| MB4107 74LS05 | +| | +| MB89311 74LS139 8MHz | +| CN1 | +| --------------------------| | +| |-------------------------- | +|--------------------------------------| + + +I/O Controller PCB Layout +------------------------- + +834-6510 +(sticker 834-6510-01) ___________ +|----------------------| IDC 34 |---| +| | +| | +| D4701 %2 | +| | +| %3 | +| %1 74LS139 | +| CN1 | +| --------------------------| | +| |-------------------------- | +|--------------------------------------| +Notes: + - %1 - Unpopulated position for D4701 IC + %2 - Unpopulated position for MSM6253RS IC + %3 - Unpopulated position for MSM6253RS IC + + - CN1 is shown for completeness, it's actually underneath the I/O PCB. + + - The custom I/O board plugs into the top connector on the main board and + is used for player steering controls. The wiring diagram has 8 pins coming from + the connector. Four are labelled 'JST4P 1P (L)', the other four are labelled + 'JST4P 2P (R)'. I assume this is for an analog wheel or similar for player 1 + (being on the left) and player 2 (being on the right) + The wiring diagram also lists some buttons for both PL1 and PL2 coming from + the regular 56-way edge connector.... 'Nitro' and 'Accel' + The manual shows a controller that looks like a spinner which they call + a 'sensor board' with part 839-0138 and has a photo-sensor disc, which looks + like it's used for steering. + This board is used on Hot Rod, Rough Racer and the Golf games only. + + +ROM Board Layout +---------------- + +837-7187-01 +171-5875-01B +(SYSTEM24) (C)SEGA 1989 . 1991 +|------------------------------------------| +| | +| | +| J1 | +|CN1 ROM1.IC4 ROM2.IC5 J2 | +||-| J3 | +|| | J4 | +|| | ROM3.IC6 ROM4.IC7 | +|| | J5 | +|| | J6 | +|| | ROM5.IC8 ROM6.IC9 J7 | +|| | J8 | +|| | J9 | +|| | ROM7.IC10 ROM8.IC11 | +|| | | +|| | 74HC4040 74LS139 | +||-| EPM5032DC.IC2 | +|------------------------------------------| +Notes: + CN1: Connector for joining ROM board to Main Board. This connector is above and below the PCB to allow for chaining of several boards. + + 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, + 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 + Device Family and (generally) has it's protection bit set at the factory. + + All jumpers are 2 pins, they're either shorted or not shorted. All ROMs are configured as the same type. + See the table below for details. + Jumpers to set ROM sizes: + 2M (J1, J3, J6, J8) + 4M (J2, J3, J7, J9) + 8M (J2, J4, J5, J9) + + +FD1094/Floppy/ROM details +------------------------- + +Game FD1094 Floppy ROMs Other +------------------------------------------------------------------------------------------------------------------------------------------------------------- +Hot Rod (3p Turbo) none DS3-5000-01D Main Board: EPR11338.IC1, EPR11339.IC2 I/O Controller PCB, Floppy Controller PCB + +Hot Rod (4p Rev C) none DS3-5000-01A Main Board: EPR11338.IC1, EPR11339.IC2 I/O Controller PCB, Floppy Controller PCB + Rev C + +Hot Rod (4p Japanese none DS3-5000-01A Main Board: EPR11338.IC1, EPR11339.IC2 I/O Controller PCB, Floppy Controller PCB + Rev B) Rev B + +Scramble Spirits none DS3-5000-02? Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB + +Scramble Spirits 317-0058-02D DS3-5000-02D Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB +(Encrypted Version) + +Gain Ground (Japan) 317-0058-03B DS3-5000-03B Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB + +Gain Ground 317-0058-03D DS3-5000-03D Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB + +Crack Down (Japan) 317-0058-04B DS3-5000-04B Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB + Rev A + +Crack Down 317-0058-04D DS3-5000-04D Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB + +Super Masters Golf 317-0058-05B DS3-5000-05B Main Board: EPR12186.IC1, EPR12187.IC2 I/O Controller PCB, Floppy Controller PCB +Rev B + +Super Masters Golf 317-0058-05D DS3-5000-05D Main Board: EPR12186.IC1, EPR12187.IC2 I/O Controller PCB, Floppy Controller PCB +Rev D + +Rough Racer 317-0058-06B DS3-5000-06B Main Board: EPR12186.IC1, EPR12187.IC2 I/O Controller PCB, Floppy Controller PCB + +Bonanza Bros none DS3-5000-07D Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB + Daughter Board: MPR13187.IC4, MPR13188.IC5, MPR13189.IC6 + MPR13190.IC7 + EPLD: 317-0156 + +Quiz Syukudai wo 317-0058-08B DS3-5000-08B Main Board: EPR12186.IC1, EPR12187.IC2 Floppy Controller PCB +Wasuremashita + +Dynamic Country Club 317-0058-09D DS3-5000-09D Main Board: EPR13947.IC1, EPR13948.IC2 I/O Controller PCB, Floppy Controller PCB +(Disk version) + +Dynamic Country Club none none Main Board: EPR13947.IC1, EPR13948.IC2 +(ROM version) Daughter Board: EPR15345.IC4 EPR15344.IC5, MPR14097.IC6 + MPR14096.IC7 + EPLD: 317-0177 + +Quiz Mekuromeku Story none none Main Board: EPR15342.IC1, EPR15343.IC2 + Daughter Board: EPR15344.IC4, EPR15345.IC5, EPR15346.IC6 + EPR15347.IC7, EPR15348.IC8, EPR15349.IC9 + EPLD: 317-0205 + +Tokoro San no none none Main Board: EPR14812.IC1, EPR14813.IC2 +MahMahjan Daughter Board: MPR14819.IC4, MPR14820.IC5, MPR14821.IC6 + MPR14822IC.7, MPR14823.IC8, MPR14824.IC9 + MPR14825.IC10, MPR14826.IC11 + EPLD: 317-0200 + +Quiz Rouka Ni none none Main Board: EPR14484.IC1, EPR14485.IC2 +Tattenasai Daughter Board: EPR14482.IC5, EPR14483.IC7 + EPLD: 317-0191 + +Tokoro San no none none Main Board: EPR16798.IC1, EPR16799.IC2 +MahMahjan 2 Daughter Board: MPR16800.IC4, MPR16801.IC5, MPR16802.IC6 + MPR16803.IC7, MPR16804.IC8, MPR16805.IC9 + MPR16806.IC10, MPR16807.IC11 + EPLD: 317-0220 + +Quiz Ghost Hunter none none Main Board: EPR16899B.IC1, EPR16900B.IC2 + Daughter Board: MPR16901A.IC4, MPR16902A.IC5, MPR16903.IC6 + MPR16904.IC7, MPR16905.IC8, MPR16906.IC9 + MPR16907.IC10, MPR16908.IC11 + EPLD: 317-0226 + +Notes: + A regular 68000-10 is used in position IC3. If used, the Hitachi CPU sits at position IC4. + Where FD1094 is listed as 'none', a standard 68000 CPU is used instead at IC4 on the PCB. + + The last 3 digits of the floppy number is also the last part of the Hitachi CPU number....they're a matching pair. + 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 + the last 3 digits of the Hitachi FD1094 part number. + +*/ + + +/* system24temp_ functions / variables are from shared rewrite files, + once the rest of the rewrite is complete they can be removed, I + just made a copy & renamed them for now to avoid any conflicts +*/ + +#include "emu.h" +#include "cpu/m68000/m68000.h" +#include "sound/ym2151.h" +#include "sound/dac.h" +#include "sound/2151intf.h" +#include "machine/fd1094.h" +#include "machine/nvram.h" +#include "video/segaic24.h" +#include "includes/segas24.h" +#include "includes/segaipt.h" + +#define MASTER_CLOCK XTAL_20MHz +#define VIDEO_CLOCK XTAL_32MHz +#define TIMER_CLOCK (VIDEO_CLOCK/4) +#define HSYNC_CLOCK (VIDEO_CLOCK/2/656.0) +/* TODO: understand why divisors doesn't match at all with the reference */ +#define FRC_CLOCK_MODE0 (MASTER_CLOCK/2)/24 // /16 according to Charles +#define FRC_CLOCK_MODE1 (MASTER_CLOCK/2)/1536 // /1024 according to Charles, but /1536 sounds better + +enum { + IRQ_YM2151 = 1, + IRQ_TIMER = 2, + IRQ_VBLANK = 3, + IRQ_SPRITE = 4, + IRQ_FRC = 5 +}; + +// Floppy Disk Controller + +void segas24_state::fdc_init() +{ + fdc_status = 0; + fdc_track = 0; + fdc_sector = 0; + fdc_data = 0; + fdc_phys_track = 0; + fdc_irq = 0; + fdc_drq = 0; + fdc_index_count = 0; +} + +READ16_MEMBER( segas24_state::fdc_r ) +{ + if(!track_size) + return 0xffff; + + switch(offset) { + case 0: + fdc_irq = 0; + return fdc_status; + case 1: + return fdc_track; + case 2: + return fdc_sector; + case 3: + default: { + int res = fdc_data; + if(fdc_drq) { + fdc_span--; + // logerror("Read %02x (%d)\n", res, fdc_span); + if(fdc_span) { + fdc_pt++; + fdc_data = *fdc_pt; + } else { + logerror("FDC: transfert complete\n"); + fdc_drq = 0; + fdc_status = 0; + fdc_irq = 1; + } + } else + logerror("FDC: data read with drq down\n"); + return res; + } + } +} + +WRITE16_MEMBER( segas24_state::fdc_w ) +{ + if(!track_size) + return; + + if(ACCESSING_BITS_0_7) { + data &= 0xff; + switch(offset) { + case 0: + fdc_irq = 0; + switch(data >> 4) { + case 0x0: + logerror("FDC: Restore\n"); + fdc_phys_track = fdc_track = 0; + fdc_irq = 1; + fdc_status = 4; + break; + case 0x1: + logerror("FDC: Seek %d\n", fdc_data); + fdc_phys_track = fdc_track = fdc_data; + fdc_irq = 1; + fdc_status = fdc_track ? 0 : 4; + break; + case 0x9: + logerror("Read multiple [%02x] %d..%d side %d track %d\n", data, fdc_sector, fdc_sector+fdc_data-1, data & 8 ? 1 : 0, fdc_phys_track); + fdc_pt = memregion("floppy")->base() + track_size*(2*fdc_phys_track+(data & 8 ? 1 : 0)); + fdc_span = track_size; + fdc_status = 3; + fdc_drq = 1; + fdc_data = *fdc_pt; + break; + case 0xb: + logerror("Write multiple [%02x] %d..%d side %d track %d\n", data, fdc_sector, fdc_sector+fdc_data-1, data & 8 ? 1 : 0, fdc_phys_track); + fdc_pt = memregion("floppy")->base() + track_size*(2*fdc_phys_track+(data & 8 ? 1 : 0)); + fdc_span = track_size; + fdc_status = 3; + fdc_drq = 1; + break; + case 0xd: + logerror("FDC: Forced interrupt\n"); + fdc_span = 0; + fdc_drq = 0; + fdc_irq = data & 1; + fdc_status = 0; + break; + case 0xf: + if(data == 0xfe) + logerror("FDC: Assign mode %02x\n", fdc_data); + else if(data == 0xfd) + logerror("FDC: Assign parameter %02x\n", fdc_data); + else + logerror("FDC: Unknown command %02x\n", data); + break; + default: + logerror("FDC: Unknown command %02x\n", data); + break; + } + break; + case 1: + logerror("FDC: Track register %02x\n", data); + fdc_track = data; + break; + case 2: + logerror("FDC: Sector register %02x\n", data); + fdc_sector = data; + break; + case 3: + if(fdc_drq) { + // logerror("Write %02x (%d)\n", data, fdc_span); + *fdc_pt++ = data; + fdc_span--; + if(!fdc_span) { + logerror("FDC: transfert complete\n"); + fdc_drq = 0; + fdc_status = 0; + fdc_irq = 1; + } + } else + logerror("FDC: Data register %02x\n", data); + fdc_data = data; + break; + } + } +} + +READ16_MEMBER( segas24_state::fdc_status_r ) +{ + if(!track_size) + return 0xffff; + + return 0x90 | (fdc_irq ? 2 : 0) | (fdc_drq ? 1 : 0) | (fdc_phys_track ? 0x40 : 0) | (fdc_index_count ? 0x20 : 0); +} + +WRITE16_MEMBER( segas24_state::fdc_ctrl_w ) +{ + if(ACCESSING_BITS_0_7) + logerror("FDC control %02x\n", data & 0xff); +} + + +// I/O Mappers + +UINT8 segas24_state::hotrod_io_r(UINT8 port) +{ + switch(port) + { + case 0: + return ioport("P1")->read(); + case 1: + return ioport("P2")->read(); + case 2: + return read_safe(ioport("P3"), 0xff); + case 3: + return 0xff; + case 4: + return ioport("SERVICE")->read(); + case 5: // Dip switches + return ioport("COINAGE")->read(); + case 6: + return ioport("DSW")->read(); + case 7: // DAC + return 0xff; + } + return 0x00; +} + +UINT8 segas24_state::dcclub_io_r(UINT8 port) +{ + switch(port) + { + case 0: + { + static const UINT8 pos[16] = { 0, 1, 3, 2, 6, 4, 12, 8, 9 }; + return (ioport("P1")->read() & 0xf) | ((~pos[ioport("PADDLE")->read()>>4]<<4) & 0xf0); + } + case 1: + return ioport("P2")->read(); + case 2: + return 0xff; + case 3: + return 0xff; + case 4: + return ioport("SERVICE")->read(); + case 5: // Dip switches + return ioport("COINAGE")->read(); + case 6: + return ioport("DSW")->read(); + case 7: // DAC + return 0xff; + } + return 0x00; +} + + +UINT8 segas24_state::mahmajn_io_r(UINT8 port) +{ + static const char *const keynames[] = { "MJ0", "MJ1", "MJ2", "MJ3", "MJ4", "MJ5", "P1", "P2" }; + + switch(port) + { + case 0: + return ~(1 << cur_input_line); + case 1: + return 0xff; + case 2: + return ioport(keynames[cur_input_line])->read(); + case 3: + return 0xff; + case 4: + return ioport("SERVICE")->read(); + case 5: // Dip switches + return ioport("COINAGE")->read(); + case 6: + return ioport("DSW")->read(); + case 7: // DAC + return 0xff; + } + return 0x00; +} + +void segas24_state::mahmajn_io_w(UINT8 port, UINT8 data) +{ + switch(port) + { + case 3: + if(data & 4) + cur_input_line = (cur_input_line + 1) & 7; + break; + case 7: // DAC + m_dac->write_signed8(data); + break; + default: + fprintf(stderr, "Port %d : %02x\n", port, data & 0xff); + } +} + +void segas24_state::hotrod_io_w(UINT8 port, UINT8 data) +{ + switch(port) + { + case 3: // Lamps + break; + case 7: // DAC + m_dac->write_signed8(data); + break; + default: + fprintf(stderr, "Port %d : %02x\n", port, data & 0xff); + } +} + + +WRITE16_MEMBER( segas24_state::hotrod3_ctrl_w ) +{ + static const char *const portnames[] = { "PEDAL1", "PEDAL2", "PEDAL3", "PEDAL4" }; + + if(ACCESSING_BITS_0_7) + { + data &= 3; + hotrod_ctrl_cur = read_safe(ioport(portnames[data]), 0); + } +} + +READ16_MEMBER( segas24_state::hotrod3_ctrl_r ) +{ + if(ACCESSING_BITS_0_7) + { + switch(offset) + { + // Steering dials + case 0: + return read_safe(ioport("DIAL1"), 0) & 0xff; + case 1: + return read_safe(ioport("DIAL1"), 0) >> 8; + case 2: + return read_safe(ioport("DIAL2"), 0) & 0xff; + case 3: + return read_safe(ioport("DIAL2"), 0) >> 8; + case 4: + return read_safe(ioport("DIAL3"), 0) & 0xff; + case 5: + return read_safe(ioport("DIAL3"), 0) >> 8; + case 6: + return read_safe(ioport("DIAL4"), 0) & 0xff; + case 7: + return read_safe(ioport("DIAL4"), 0) >> 8; + + case 8: + { + // Serial ADCs for the accel + int v = hotrod_ctrl_cur & 0x80; + hotrod_ctrl_cur <<= 1; + return v ? 0xff : 0; + } + } + } + return 0; +} + +READ16_MEMBER( segas24_state::iod_r ) +{ + logerror("IO daughterboard read %02x (%x)\n", offset, space.device().safe_pc()); + return 0xffff; +} + +WRITE16_MEMBER( segas24_state::iod_w ) +{ + logerror("IO daughterboard write %02x, %04x & %04x (%x)\n", offset, data, mem_mask, space.device().safe_pc()); +} + + +// Cpu #1 reset control + + +void segas24_state::reset_reset() +{ + int changed = resetcontrol ^ prev_resetcontrol; + if(changed & 2) { + if(resetcontrol & 2) { + m_subcpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); + m_subcpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); +// osd_printf_debug("enable 2nd cpu!\n"); +// debugger_break(machine); + + } else + m_subcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); + } + if(changed & 4) + machine().device("ymsnd")->reset(); + prev_resetcontrol = resetcontrol; +} + +void segas24_state::reset_control_w(UINT8 data) +{ + resetcontrol = data; + reset_reset(); +} + + +// Rom board bank access + + +void segas24_state::reset_bank() +{ + if (memregion("romboard")->base()) + { + membank("bank1")->set_entry(curbank & 15); + membank("bank2")->set_entry(curbank & 15); + } +} + +READ16_MEMBER( segas24_state::curbank_r ) +{ + return curbank; +} + +WRITE16_MEMBER( segas24_state::curbank_w ) +{ + if(ACCESSING_BITS_0_7) { + curbank = data & 0xff; + reset_bank(); + } +} + +READ8_MEMBER( segas24_state::frc_mode_r ) +{ + return frc_mode & 1; +} + +WRITE8_MEMBER( segas24_state::frc_mode_w ) +{ + /* reset frc if a write happens here */ + frc_cnt_timer->reset(); + frc_mode = data & 1; +} + +READ8_MEMBER( segas24_state::frc_r ) +{ + INT32 result = (frc_cnt_timer->time_elapsed() * (frc_mode ? FRC_CLOCK_MODE1 : FRC_CLOCK_MODE0)).as_double(); + + result %= ((frc_mode) ? 0x67 : 0x100); + + return result; +} + +WRITE8_MEMBER( segas24_state::frc_w ) +{ + /* Undocumented behaviour, Bonanza Bros. seems to use this for irq ack'ing ... */ + m_maincpu->set_input_line(IRQ_FRC+1, CLEAR_LINE); + m_subcpu->set_input_line(IRQ_FRC+1, CLEAR_LINE); +} + + +// Protection magic latch + +const UINT8 segas24_state::mahmajn_mlt[8] = { 5, 1, 6, 2, 3, 7, 4, 0 }; +const UINT8 segas24_state::mahmajn2_mlt[8] = { 6, 0, 5, 3, 1, 4, 2, 7 }; +const UINT8 segas24_state::qgh_mlt[8] = { 3, 7, 4, 0, 2, 6, 5, 1 }; +const UINT8 segas24_state::bnzabros_mlt[8] = { 2, 4, 0, 5, 7, 3, 1, 6 }; +const UINT8 segas24_state::qrouka_mlt[8] = { 1, 6, 4, 7, 0, 5, 3, 2 }; +const UINT8 segas24_state::quizmeku_mlt[8] = { 0, 3, 2, 4, 6, 1, 7, 5 }; +const UINT8 segas24_state::dcclub_mlt[8] = { 4, 7, 3, 0, 2, 6, 5, 1 }; + + +READ16_MEMBER( segas24_state::mlatch_r ) +{ + return mlatch; +} + +WRITE16_MEMBER( segas24_state::mlatch_w ) +{ + if(ACCESSING_BITS_0_7) { + int i; + UINT8 mxor = 0; + if(!mlatch_table) { + logerror("Protection: magic latch accessed but no table loaded (%s:%x)\n", space.device().tag(), space.device().safe_pc()); + return; + } + + data &= 0xff; + + if(data != 0xff) { + for(i=0; i<8; i++) + if(mlatch & (1<<i)) + mxor |= 1 << mlatch_table[i]; + mlatch = data ^ mxor; + logerror("Magic latching %02x ^ %02x as %02x (%s:%x)\n", data & 0xff, mxor, mlatch, space.device().tag(), space.device().safe_pc()); + } else { + logerror("Magic latch reset (%s:%x)\n", space.device().tag(), space.device().safe_pc()); + mlatch = 0x00; + } + } +} + + +// Timers and IRQs + +void segas24_state::irq_timer_sync() +{ + attotime ctime = machine().time(); + + switch(irq_tmode) { + case 0: + break; + case 1: { + // Don't remove the floor(), the value may be slightly negative + int ppos = floor((irq_synctime - irq_vsynctime).as_double() * HSYNC_CLOCK); + int cpos = floor((ctime - irq_vsynctime).as_double() * HSYNC_CLOCK); + irq_tval += cpos-ppos; + break; + } + case 2: { + fatalerror("segas24_state::irq_timer_sync - case 2\n"); + } + case 3: { + int ppos = floor((irq_synctime - irq_vsynctime).as_double() * TIMER_CLOCK); + int cpos = floor((ctime - irq_vsynctime).as_double() * TIMER_CLOCK); + irq_tval += cpos-ppos; + break; + } + } + + irq_synctime = ctime; +} + +void segas24_state::irq_timer_start(int old_tmode) +{ + switch(irq_tmode) { + case 0: + if(old_tmode) { + irq_tval++; + if(irq_tval == 0x1000) + irq_timer->adjust(attotime::zero); + else + irq_timer->enable(false); + } + break; + case 1: { + int count = 0x1000 - irq_tval; + irq_timer->adjust(attotime::from_hz(HSYNC_CLOCK)*count); + break; + } + case 2: + fatalerror("segas24_state::irq_timer_start - case 2\n"); + case 3: { + int count = 0x1000 - irq_tval; + irq_timer->adjust(attotime::from_hz(TIMER_CLOCK)*count); + break; + } + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_timer_cb) +{ + irq_timer_sync(); + + if(irq_tval != 0x1000) + fprintf(stderr, "Error: timer desync %x != 1000\n", irq_tval); + + irq_tval = irq_tdata; + irq_timer_start(irq_tmode); + + irq_timer_pend0 = irq_timer_pend1 = 1; + if(irq_allow0 & (1 << IRQ_TIMER)) + m_maincpu->set_input_line(IRQ_TIMER+1, ASSERT_LINE); + if(irq_allow1 & (1 << IRQ_TIMER)) + m_subcpu->set_input_line(IRQ_TIMER+1, ASSERT_LINE); + + if (irq_tmode == 1 || irq_tmode == 2) + { + // m_screen->update_now(); + m_screen->update_partial(m_screen->vpos()); + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_timer_clear_cb) +{ + irq_sprite = irq_vblank = 0; + m_maincpu->set_input_line(IRQ_VBLANK+1, CLEAR_LINE); + m_maincpu->set_input_line(IRQ_SPRITE+1, CLEAR_LINE); + m_subcpu->set_input_line(IRQ_VBLANK+1, CLEAR_LINE); + m_subcpu->set_input_line(IRQ_SPRITE+1, CLEAR_LINE); +} + +TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_frc_cb) +{ + if(irq_allow0 & (1 << IRQ_FRC) && frc_mode == 1) + m_maincpu->set_input_line(IRQ_FRC+1, ASSERT_LINE); + + if(irq_allow1 & (1 << IRQ_FRC) && frc_mode == 1) + m_subcpu->set_input_line(IRQ_FRC+1, ASSERT_LINE); +} + +void segas24_state::irq_init() +{ + irq_tdata = 0; + irq_tmode = 0; + irq_allow0 = 0; + irq_allow1 = 0; + irq_timer_pend0 = 0; + irq_timer_pend1 = 0; + irq_vblank = 0; + irq_sprite = 0; + irq_timer = machine().device<timer_device>("irq_timer"); + irq_timer_clear = machine().device<timer_device>("irq_timer_clear"); + irq_tval = 0; + irq_synctime = attotime::zero; + irq_vsynctime = attotime::zero; +} + +WRITE16_MEMBER(segas24_state::irq_w) +{ + switch(offset) { + case 0: { + irq_timer_sync(); + COMBINE_DATA(&irq_tdata); + irq_tdata &= 0xfff; + irq_timer_start(irq_tmode); + break; + } + case 1: + if(ACCESSING_BITS_0_7) { + UINT8 old_tmode = irq_tmode; + irq_timer_sync(); + irq_tmode = data & 3; + irq_timer_start(old_tmode); + } + break; + case 2: + irq_allow0 = data & 0x3f; + irq_timer_pend0 = 0; + m_maincpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE); + m_maincpu->set_input_line(IRQ_YM2151+1, irq_yms && (irq_allow0 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(IRQ_VBLANK+1, irq_vblank && (irq_allow0 & (1 << IRQ_VBLANK)) ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(IRQ_SPRITE+1, irq_sprite && (irq_allow0 & (1 << IRQ_SPRITE)) ? ASSERT_LINE : CLEAR_LINE); + //m_maincpu->set_input_line(IRQ_FRC+1, irq_frc && (irq_allow0 & (1 << IRQ_FRC)) ? ASSERT_LINE : CLEAR_LINE); + break; + case 3: + irq_allow1 = data & 0x3f; + irq_timer_pend1 = 0; + m_subcpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE); + m_subcpu->set_input_line(IRQ_YM2151+1, irq_yms && (irq_allow1 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE); + m_subcpu->set_input_line(IRQ_VBLANK+1, irq_vblank && (irq_allow1 & (1 << IRQ_VBLANK)) ? ASSERT_LINE : CLEAR_LINE); + m_subcpu->set_input_line(IRQ_SPRITE+1, irq_sprite && (irq_allow1 & (1 << IRQ_SPRITE)) ? ASSERT_LINE : CLEAR_LINE); + //m_subcpu->set_input_line(IRQ_FRC+1, irq_frc && (irq_allow1 & (1 << IRQ_FRC)) ? ASSERT_LINE : CLEAR_LINE); + break; + } +} + +// gground bp at 849c (84a4) +// cmp.w $a00000, d0 | 16 +// dbeq d1, 84b4 | 10 +// 26 cycles/tour +// 0x200 counts +// 656 cycles/ligne +// 656*0x200/26 = 12918 (3276) -> cd89 (got e087, delta = 1f78, 8056) +// 410 cycles/ligne +// 410*0x200/26 = 8073 + +READ16_MEMBER(segas24_state::irq_r) +{ + switch(offset) { + case 2: + irq_timer_pend0 = 0; + m_maincpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE); + break; + case 3: + irq_timer_pend1 = 0; + m_subcpu->set_input_line(IRQ_TIMER+1, CLEAR_LINE); + break; + } + irq_timer_sync(); + return irq_tval & 0xfff; +} + +TIMER_DEVICE_CALLBACK_MEMBER(segas24_state::irq_vbl) +{ + int irq, mask; + int scanline = param; + + /* TODO: perhaps vblank irq happens at 400, sprite IRQ certainly don't at 0! */ + if(scanline == 0) { irq = IRQ_SPRITE; irq_sprite = 1; } + else if(scanline == 384) { irq = IRQ_VBLANK; irq_vblank = 1; } + else + return; + + irq_timer_clear->adjust(attotime::from_hz(HSYNC_CLOCK)); + + mask = 1 << irq; + + if(irq_allow0 & mask) + m_maincpu->set_input_line(1+irq, ASSERT_LINE); + + if(irq_allow1 & mask) + m_subcpu->set_input_line(1+irq, ASSERT_LINE); + + if(scanline == 384) { + // Ensure one index pulse every 20 frames + // The is some code in bnzabros at 0x852 that makes it crash + // if the pulse train is too fast + fdc_index_count++; + if(fdc_index_count >= 20) + fdc_index_count = 0; + } + + irq_timer_sync(); + irq_vsynctime = machine().time(); +} + +WRITE_LINE_MEMBER(segas24_state::irq_ym) +{ + irq_yms = state; + m_maincpu->set_input_line(IRQ_YM2151+1, irq_yms && (irq_allow0 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE); + m_subcpu->set_input_line(IRQ_YM2151+1, irq_yms && (irq_allow1 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE); +} + + +READ16_MEMBER ( segas24_state::sys16_io_r ) +{ + // logerror("IO read %02x (%s:%x)\n", offset, space.device().tag(), space.device().safe_pc()); + if(offset < 8) + return (this->*io_r)(offset); + else if (offset < 0x20) { + switch(offset) { + case 0x8: + return 'S'; + case 0x9: + return 'E'; + case 0xa: + return 'G'; + case 0xb: + return 'A'; + case 0xe: + return io_cnt; + case 0xf: + return io_dir; + default: + logerror("IO control read %02x (%s:%x)\n", offset, space.device().tag(), space.device().safe_pc()); + return 0xff; + } + } else + return iod_r(space, offset & 0x1f, mem_mask); +} + +WRITE16_MEMBER( segas24_state::sys16_io_w ) +{ + if(ACCESSING_BITS_0_7) { + if(offset < 8) { + if(!(io_dir & (1 << offset))) { + logerror("IO port write on input-only port (%d, [%02x], %02x, %s:%x)\n", offset, io_dir, data & 0xff, space.device().tag(), space.device().safe_pc()); + return; + } + (this->*io_w)(offset, data); + } else if (offset < 0x20) { + switch(offset) { + case 0xe: + io_cnt = data; + reset_control_w(data & 7); + break; + case 0xf: + io_dir = data; + break; + default: + logerror("IO control write %02x, %02x (%s:%x)\n", offset, data & 0xff, space.device().tag(), space.device().safe_pc()); + } + } + } + if(offset >= 0x20) + iod_w(space, offset & 0x1f, data, mem_mask); +} + +// 315-5242 + +READ16_MEMBER( segas24_state::sys16_paletteram_r ) +{ + return m_generic_paletteram_16[offset]; +} + +WRITE16_MEMBER( segas24_state::sys16_paletteram_w ) +{ + int r, g, b; + COMBINE_DATA (m_generic_paletteram_16 + offset); + data = m_generic_paletteram_16[offset]; + + r = (data & 0x00f) << 4; + if(data & 0x1000) + r |= 8; + + g = data & 0x0f0; + if(data & 0x2000) + g |= 8; + + b = (data & 0xf00) >> 4; + if(data & 0x4000) + b |= 8; + + r |= r >> 5; + g |= g >> 5; + b |= b >> 5; + + m_palette->set_pen_color(offset, rgb_t(r, g, b)); + + if(data & 0x8000) { + r = 255-0.6*(255-r); + g = 255-0.6*(255-g); + b = 255-0.6*(255-b); + } else { + r = 0.6*r; + g = 0.6*g; + b = 0.6*b; + } + m_palette->set_pen_color(offset+m_palette->entries()/2, rgb_t(r, g, b)); +} + + +/* +CPU1: +00-03 ROM (1) +04-07 ROM +08-0f ramlo (2) +10-13 ROM +14-17 ROM +f0-f3 ramprg (3) +fc-ff ramhi (4) + +CPU2: +00-03 ramprg +04-07 ROM +08-0f ramlo +10-13 ROM +14-17 ROM +f0-f3 ramprg +fc-ff ramhi +*/ + +/************************************* + * + * CPU 1 memory handlers + * + *************************************/ + +/* + Both CPUs have the same memory map, except for the first 512K where + CPU A has ROM and CPU B has work RAM mapped there. + + The memory map can be broken down into the following regions: + + 000000-07FFFF : BIOS ROM (for CPU A only) + CPU B work RAM (for CPU B only) + 080000-0FFFFF : CPU A work RAM + 100000-1FFFFF : BIOS ROM + 200000-3FFFFF : Tilemap generator + 400000-5FFFFF : Mixer chip + 600000-7FFFFF : Sprite generator + 800000-9FFFFF : I/O chip + A00000-AFFFFF : Timer and interrupt controller chip + B00000-EFFFFF : Extra chip selects for expansion + F00000-F7FFFF : CPU B work RAM + F80000-FFFFFF : CPU A work RAM + + The BIOS ROM mirror at $100000 is common to both CPUs. +*/ + + +static ADDRESS_MAP_START( system24_cpu1_map, AS_PROGRAM, 16, segas24_state ) + AM_RANGE(0x000000, 0x03ffff) AM_MIRROR(0x040000) AM_ROM AM_REGION("maincpu", 0) + AM_RANGE(0x080000, 0x0bffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share1") + AM_RANGE(0x100000, 0x13ffff) AM_MIRROR(0x0c0000) AM_ROM AM_REGION("maincpu", 0) + AM_RANGE(0x200000, 0x20ffff) AM_MIRROR(0x110000) AM_DEVREADWRITE("tile", segas24_tile, tile_r, tile_w) + AM_RANGE(0x220000, 0x220001) AM_MIRROR(0x11fffe) AM_WRITENOP /* Horizontal split position (ABSEL) */ + AM_RANGE(0x240000, 0x240001) AM_MIRROR(0x11fffe) AM_WRITENOP /* Scanline trigger position (XHOUT) */ + AM_RANGE(0x260000, 0x260001) AM_MIRROR(0x10fffe) AM_WRITENOP /* Frame trigger position (XVOUT) */ + AM_RANGE(0x270000, 0x270001) AM_MIRROR(0x10fffe) AM_WRITENOP /* Synchronization mode */ + AM_RANGE(0x280000, 0x29ffff) AM_MIRROR(0x160000) AM_DEVREADWRITE("tile", segas24_tile, char_r, char_w) + AM_RANGE(0x400000, 0x403fff) AM_MIRROR(0x1f8000) AM_READWRITE(sys16_paletteram_r, sys16_paletteram_w) AM_SHARE("paletteram") + AM_RANGE(0x404000, 0x40401f) AM_MIRROR(0x1fbfe0) AM_DEVREADWRITE("mixer", segas24_mixer, read, write) + AM_RANGE(0x600000, 0x63ffff) AM_MIRROR(0x180000) AM_DEVREADWRITE("sprite", segas24_sprite, read, write) + AM_RANGE(0x800000, 0x80007f) AM_MIRROR(0x1ffe00) AM_READWRITE(sys16_io_r, sys16_io_w) + AM_RANGE(0x800100, 0x800103) AM_MIRROR(0x1ffe00) AM_DEVREADWRITE8("ymsnd", ym2151_device, read, write, 0x00ff) + AM_RANGE(0xa00000, 0xa00007) AM_MIRROR(0x0ffff8) AM_READWRITE(irq_r, irq_w) + AM_RANGE(0xb00000, 0xb00007) AM_MIRROR(0x07fff0) AM_READWRITE(fdc_r, fdc_w) + AM_RANGE(0xb00008, 0xb0000f) AM_MIRROR(0x07fff0) AM_READWRITE(fdc_status_r, fdc_ctrl_w) + AM_RANGE(0xb80000, 0xbbffff) AM_ROMBANK("bank1") + AM_RANGE(0xbc0000, 0xbc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w) + AM_RANGE(0xbc0002, 0xbc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff) + AM_RANGE(0xbc0004, 0xbc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff) + AM_RANGE(0xbc0006, 0xbc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w) + AM_RANGE(0xc00000, 0xc00011) AM_MIRROR(0x07ffe0) AM_READWRITE(hotrod3_ctrl_r, hotrod3_ctrl_w) + AM_RANGE(0xc80000, 0xcbffff) AM_ROMBANK("bank2") + AM_RANGE(0xcc0000, 0xcc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w) + AM_RANGE(0xcc0002, 0xcc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff) + AM_RANGE(0xcc0004, 0xcc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff) + AM_RANGE(0xcc0006, 0xcc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w) + AM_RANGE(0xf00000, 0xf3ffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("subcpu") + AM_RANGE(0xf80000, 0xfbffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share1") +ADDRESS_MAP_END + + + +/************************************* + * + * CPU 2 memory handlers + * + *************************************/ + +static ADDRESS_MAP_START( system24_cpu2_map, AS_PROGRAM, 16, segas24_state ) + AM_RANGE(0x000000, 0x03ffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("subcpu") + AM_RANGE(0x080000, 0x0bffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share1") + AM_RANGE(0x100000, 0x13ffff) AM_MIRROR(0x0c0000) AM_ROM AM_REGION("maincpu", 0) + AM_RANGE(0x200000, 0x20ffff) AM_MIRROR(0x110000) AM_DEVREADWRITE("tile", segas24_tile, tile_r, tile_w) + AM_RANGE(0x220000, 0x220001) AM_MIRROR(0x11fffe) AM_WRITENOP /* Horizontal split position (ABSEL) */ + AM_RANGE(0x240000, 0x240001) AM_MIRROR(0x11fffe) AM_WRITENOP /* Scanline trigger position (XHOUT) */ + AM_RANGE(0x260000, 0x260001) AM_MIRROR(0x10fffe) AM_WRITENOP /* Frame trigger position (XVOUT) */ + AM_RANGE(0x270000, 0x270001) AM_MIRROR(0x10fffe) AM_WRITENOP /* Synchronization mode */ + AM_RANGE(0x280000, 0x29ffff) AM_MIRROR(0x160000) AM_DEVREADWRITE("tile", segas24_tile, char_r, char_w) + AM_RANGE(0x400000, 0x403fff) AM_MIRROR(0x1f8000) AM_READWRITE(sys16_paletteram_r, sys16_paletteram_w) AM_SHARE("paletteram") + AM_RANGE(0x404000, 0x40401f) AM_MIRROR(0x1fbfe0) AM_DEVREADWRITE("mixer", segas24_mixer, read, write) + AM_RANGE(0x600000, 0x63ffff) AM_MIRROR(0x180000) AM_DEVREADWRITE("sprite", segas24_sprite, read, write) + AM_RANGE(0x800000, 0x80007f) AM_MIRROR(0x1ffe00) AM_READWRITE(sys16_io_r, sys16_io_w) + AM_RANGE(0x800100, 0x800103) AM_MIRROR(0x1ffe00) AM_DEVREADWRITE8("ymsnd", ym2151_device, read, write, 0x00ff) + AM_RANGE(0xa00000, 0xa00007) AM_MIRROR(0x0ffff8) AM_READWRITE(irq_r, irq_w) + AM_RANGE(0xb00000, 0xb00007) AM_MIRROR(0x07fff0) AM_READWRITE(fdc_r, fdc_w) + AM_RANGE(0xb00008, 0xb0000f) AM_MIRROR(0x07fff0) AM_READWRITE(fdc_status_r, fdc_ctrl_w) + AM_RANGE(0xb80000, 0xbbffff) AM_ROMBANK("bank1") + AM_RANGE(0xbc0000, 0xbc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w) + AM_RANGE(0xbc0002, 0xbc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff) + AM_RANGE(0xbc0004, 0xbc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff) + AM_RANGE(0xbc0006, 0xbc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w) + AM_RANGE(0xc00000, 0xc00011) AM_MIRROR(0x07ffe0) AM_READWRITE(hotrod3_ctrl_r, hotrod3_ctrl_w) + AM_RANGE(0xc80000, 0xcbffff) AM_ROMBANK("bank2") + AM_RANGE(0xcc0000, 0xcc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w) + AM_RANGE(0xcc0002, 0xcc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff) + AM_RANGE(0xcc0004, 0xcc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff) + AM_RANGE(0xcc0006, 0xcc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w) + AM_RANGE(0xf00000, 0xf3ffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("subcpu") + AM_RANGE(0xf80000, 0xfbffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share1") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, segas24_state ) + AM_RANGE(0x00000, 0xfffff) AM_ROMBANK("fd1094_decrypted_opcodes") +ADDRESS_MAP_END + +/************************************* + * + * Generic driver initialization + * + *************************************/ + +void segas24_state::machine_start() +{ + if (track_size) + machine().device<nvram_device>("floppy_nvram")->set_base(memregion("floppy")->base(), 2*track_size); + + UINT8 *usr1 = memregion("romboard")->base(); + if (usr1) + { + membank("bank1")->configure_entries(0, 16, usr1, 0x40000); + membank("bank2")->configure_entries(0, 16, usr1, 0x40000); + } + + vtile = machine().device<segas24_tile>("tile"); + vsprite = machine().device<segas24_sprite>("sprite"); + vmixer = machine().device<segas24_mixer>("mixer"); +} + +void segas24_state::machine_reset() +{ + m_subcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); + prev_resetcontrol = resetcontrol = 0x06; + fdc_init(); + curbank = 0; + reset_bank(); + irq_init(); + mlatch = 0x00; + frc_mode = 0; + frc_cnt_timer = machine().device<timer_device>("frc_timer"); + frc_cnt_timer->reset(); +} + +/************************************* + * + * Generic port definitions + * + *************************************/ + +static INPUT_PORTS_START( system24_generic ) + PORT_START("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 ) //enabled with "Separate" + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + + PORT_START("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE3 ) //enabled with "Separate" + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) + + PORT_START("P3") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("SERVICE") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN4 ) + + PORT_START("COINAGE") + SEGA_COINAGE_LOC(SW1) + + PORT_START("DSW") + PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW2:1" ) + PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "SW2:2" ) + PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW2:4" ) + PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" ) + PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW2:6" ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" ) + PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" ) +INPUT_PORTS_END + + +/************************************* + * + * Game-specific port definitions + * + *************************************/ + +static INPUT_PORTS_START( hotrod ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN5 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN6 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN7 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN8 ) + + PORT_MODIFY("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE4 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("DSW") + //"SW2:1" unused + //"SW2:2" unused + //"SW2:3" unused + //"SW2:4" unused + //"SW2:5" unused + PORT_DIPNAME( 0x20, 0x20, "Start Credit" ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x20, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x40, 0x40, "Coin Chute" ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x40, "Separate" ) + PORT_DIPSETTING( 0x00, "Common" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DIAL1") + PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) + + PORT_START("DIAL2") + PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) + + PORT_START("DIAL3") + PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(3) + + PORT_START("DIAL4") + PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(4) + + PORT_START("PEDAL1") + PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) + + PORT_START("PEDAL2") + PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) + + PORT_START("PEDAL3") + PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(3) + + PORT_START("PEDAL4") + PORT_BIT( 0xff, 0x01, IPT_PEDAL ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(4) +INPUT_PORTS_END + +static INPUT_PORTS_START( hotrodj ) + PORT_INCLUDE( hotrod ) + + PORT_MODIFY("DSW") + //"SW2:1" unused + //"SW2:2" unused + PORT_DIPNAME( 0x04, 0x04, "Start Credit" ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x08, 0x08, "Play Mode" ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, "4 Player" ) + PORT_DIPSETTING( 0x00, "2 Player" ) + PORT_DIPNAME( 0x10, 0x10, "Game Style" ) PORT_DIPLOCATION("SW2:5") + PORT_DIPSETTING( 0x10, "4 Sides" ) + PORT_DIPSETTING( 0x00, "2 Sides" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x20, DEF_STR( Japanese ) ) + PORT_DIPSETTING( 0x00, DEF_STR( English ) ) + //"SW2:7" not divert from "hotrod" + //"SW2:8" not divert from "hotrod" +INPUT_PORTS_END + +static INPUT_PORTS_START( bnzabros ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Start Credit" ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x04, 0x04, "Coin Chute" ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, "Common" ) + PORT_DIPSETTING( 0x00, "Individual" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x20, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x30, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x40, "2" ) + PORT_DIPSETTING( 0xc0, "3" ) + PORT_DIPSETTING( 0x80, "4" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( crkdown ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("DSW") + //"SW2:1" unused + //"SW2:2" unused + //"SW2:3" unused + //"SW2:4" unused + //"SW2:5" unused + //"SW2:6" unused + PORT_DIPNAME( 0x40, 0x40, "Coin Chute" ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x40, "Common" ) // Japanese manual says "Single" + PORT_DIPSETTING( 0x00, "Separate" ) // Japanese manual says "Twin" + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( roughrac ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Game Instruction" ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x20, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x30, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x40, 0x40, "Start Money" ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x40, "15000" ) + PORT_DIPSETTING( 0x00, "20000" ) + PORT_DIPNAME( 0x80, 0x80, "Start Intro" ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x80, "10" ) + PORT_DIPSETTING( 0x00, "15" ) + + PORT_START("DIAL1") + PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) + + PORT_START("DIAL2") + PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) +INPUT_PORTS_END + +static INPUT_PORTS_START( sspirits ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPSETTING( 0x0c, "3" ) + PORT_DIPSETTING( 0x08, "4" ) + PORT_DIPSETTING( 0x04, "5" ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x20, "500K" ) + PORT_DIPSETTING( 0x30, "600K" ) + PORT_DIPSETTING( 0x10, "800K" ) + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPSETTING( 0x80, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( qgh ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPSETTING( 0x08, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x10, "3" ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x20, "4" ) + PORT_DIPSETTING( 0x30, "5" ) + //"SW2:7" unused + //"SW2:8" unused +INPUT_PORTS_END + +static INPUT_PORTS_START( qsww ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + //"SW2:4" unused + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x10, "2" ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x30, "4" ) + PORT_DIPSETTING( 0x20, "5" ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPSETTING( 0x80, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( dcclub ) /* In the Japan set missing angle input */ + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Timing Meter" ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) + PORT_DIPNAME( 0x10, 0x10, "Initial Balls" ) PORT_DIPLOCATION("SW2:5") + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x10, "2" ) + PORT_DIPNAME( 0x20, 0x20, "Balls Limit" ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x20, "4" ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPSETTING( 0x80, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + + PORT_START("PADDLE") + PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_MINMAX(0x00,0x8f) PORT_SENSITIVITY(64) PORT_KEYDELTA(64) PORT_PLAYER(1) +INPUT_PORTS_END + +static INPUT_PORTS_START( sgmast ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + /* For select the power shot rotate the stick from up-left (max power) to up (minimum power) and relese */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Gameplay" ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, "1 Hole 1 Credit" ) + PORT_DIPSETTING( 0x00, "Lose Ball Game Over" ) + //"SW2:5" unused + PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7,8") // MeterWidth WindVelocity MeterSpeed + PORT_DIPSETTING( 0x80, DEF_STR( Easiest ) ) // 64% 30% 50% + PORT_DIPSETTING( 0xa0, DEF_STR( Easier ) ) // 64% 50% 75% + PORT_DIPSETTING( 0xc0, DEF_STR( Easy ) ) // 100% 75% 75% + PORT_DIPSETTING( 0xe0, DEF_STR( Normal ) ) // 100% 100% 100% + PORT_DIPSETTING( 0x60, "Little Hard" ) // 118% 75% 100% + PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) // 118% 100% 100% + PORT_DIPSETTING( 0x20, DEF_STR( Harder ) ) // 136% 75% 100% + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // 136% 100% 100% +INPUT_PORTS_END + +static INPUT_PORTS_START( sgmastj ) + PORT_INCLUDE( sgmast ) + + PORT_MODIFY("DSW") + //"SW2:1" not divert from "sgmast" + //"SW2:2" not divert from "sgmast" + //"SW2:3" not divert from "sgmast" + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW2:4" ) + //"SW2:5" unused + //"SW2:6" not divert from "sgmast" + //"SW2:7" not divert from "sgmast" + //"SW2:8" not divert from "sgmast" + + PORT_START("DIAL1") + PORT_BIT( 0xfff, 0x000, IPT_DIAL ) PORT_MINMAX(0x000,0xfff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) +INPUT_PORTS_END + +static INPUT_PORTS_START( quizmeku ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START3 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) + + PORT_MODIFY("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START4 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) + + PORT_MODIFY("P3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x00, "Play Mode" ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "2 Player" ) + PORT_DIPSETTING( 0x00, "4 Player" ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPSETTING( 0x08, "2" ) + PORT_DIPSETTING( 0x0c, "3" ) + PORT_DIPSETTING( 0x04, "4" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x10, 0x10, "Answer Counts" ) PORT_DIPLOCATION("SW2:5") + PORT_DIPSETTING( 0x10, "Every" ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPSETTING( 0x80, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( qrouka ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START3 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) + + PORT_MODIFY("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START4 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) + + PORT_MODIFY("P3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(4) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3) + + PORT_MODIFY("SERVICE") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CONDITION("DSW",0x08,EQUALS,0x00) + /* alt coin mode */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CONDITION("DSW",0x08,EQUALS,0x08) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_CONDITION("DSW",0x08,EQUALS,0x08) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW",0x08,EQUALS,0x08) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW",0x08,EQUALS,0x08) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x00, "Play Mode" ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "2 Player" ) + PORT_DIPSETTING( 0x00, "4 Player" ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + //"SW2:3" unused + PORT_DIPNAME( 0x08, 0x08, "Coin Chute" ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, "Common" ) + PORT_DIPSETTING( 0x00, "Separate" ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x10, "2" ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x30, "4" ) + PORT_DIPSETTING( 0x20, "5" ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPSETTING( 0x80, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( mahmajn ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("P1") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("P2") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("P3") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MJ0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_B ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_C ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_D ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MJ1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_E ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_G ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_H ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MJ2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_I ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_J ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_L ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MJ3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_M ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_N ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MJ4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("MJ5") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) + PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Start Score" ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x00, "2000" ) + PORT_DIPSETTING( 0x02, "3000" ) + PORT_DIPNAME( 0x0c, 0x0c, "Difficulty (computer)" ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPSETTING( 0x08, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x30, 0x30, "Difficulty (player)" ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x20, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x30, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + //"SW2:7" unused + //"SW2:8" unused +INPUT_PORTS_END + +static INPUT_PORTS_START( gground ) + PORT_INCLUDE( system24_generic ) + + PORT_MODIFY("P3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE4 ) //enabled with "Separate" + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3) + + PORT_MODIFY("DSW") + // Here is known problem. + // Service mode works as I hoped. + // But game mode doesn't. It works as all dipswitches are On. + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4,5") + PORT_DIPSETTING( 0x00, DEF_STR( Easiest ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Easier ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x18, "Little Easy" ) + PORT_DIPSETTING( 0x1c, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x0c, "Little Hard" ) + PORT_DIPSETTING( 0x14, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x60, 0x60, "Time Limit Per Stage" ) PORT_DIPLOCATION("SW2:6,7") + PORT_DIPSETTING( 0x20, DEF_STR( Easiest ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x60, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME( 0x80, 0x80, "Clock Of Time Limit" ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x80, "1.00 sec" ) + PORT_DIPSETTING( 0x00, "0.80 sec" ) +INPUT_PORTS_END + + +/************************************* + * + * Generic machine drivers + * + *************************************/ + +static MACHINE_CONFIG_START( system24, segas24_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", M68000, MASTER_CLOCK/2) + MCFG_CPU_PROGRAM_MAP(system24_cpu1_map) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", segas24_state, irq_vbl, "screen", 0, 1) + + MCFG_CPU_ADD("subcpu", M68000, MASTER_CLOCK/2) + MCFG_CPU_PROGRAM_MAP(system24_cpu2_map) + + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + + MCFG_TIMER_DRIVER_ADD("irq_timer", segas24_state, irq_timer_cb) + MCFG_TIMER_DRIVER_ADD("irq_timer_clear", segas24_state, irq_timer_clear_cb) + MCFG_TIMER_ADD_NONE("frc_timer") + MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_frc", segas24_state, irq_frc_cb, attotime::from_hz(FRC_CLOCK_MODE1)) + + MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty) + MCFG_S24TILE_DEVICE_ADD("tile", 0xfff) + MCFG_S24TILE_DEVICE_GFXDECODE("gfxdecode") + MCFG_S24TILE_DEVICE_PALETTE("palette") + MCFG_S24SPRITE_DEVICE_ADD("sprite") + MCFG_S24MIXER_DEVICE_ADD("mixer") + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK) + MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 656, 0/*+69*/, 496/*+69*/, 424, 0/*+25*/, 384/*+25*/) + MCFG_SCREEN_UPDATE_DRIVER(segas24_state, screen_update_system24) + MCFG_SCREEN_PALETTE("palette") + + MCFG_PALETTE_ADD("palette", 8192*2) + + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + + MCFG_YM2151_ADD("ymsnd", 4000000) + MCFG_YM2151_IRQ_HANDLER(WRITELINE(segas24_state,irq_ym)) + MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) + MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) + + MCFG_DAC_ADD("dac") + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( system24_floppy, system24 ) + MCFG_NVRAM_ADD_NO_FILL("floppy_nvram") +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( system24_floppy_fd1094, system24_floppy ) + MCFG_CPU_REPLACE("subcpu", FD1094, MASTER_CLOCK/2) + MCFG_CPU_PROGRAM_MAP(system24_cpu2_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + + +/************************************* + * + * ROM definition(s) + * + *************************************/ + +ROM_START( hotrod ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) ) + ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) ) + + ROM_REGION( 0x1d6000, "floppy", 0) + ROM_LOAD( "ds3-5000-01d_3p_turbo.img", 0x000000, 0x1d6000, CRC(842006fd) SHA1(d5432f58c0fb39f2bf62786a0d842bdd469ab2cb) ) +ROM_END + +ROM_START( hotroda ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) ) + ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) ) + + ROM_REGION( 0x1d6000, "floppy", 0) + ROM_LOAD( "ds3-5000-01d.img", 0x000000, 0x1d6000, CRC(e25c6b63) SHA1(fbf86d2ebccd8053b990939f63f5497907d18321) ) +ROM_END + +ROM_START( hotrodja ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) ) + ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) ) + + ROM_REGION( 0x1d6000, "floppy", 0) + ROM_LOAD( "ds3-5000-01a-rev-b.img", 0x000000, 0x1d6000, CRC(c18f6dca) SHA1(6f2b5a9567a340324a5f3fb57a3b744de0924a23) ) +ROM_END + +ROM_START( hotrodj ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) ) + ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) ) + + ROM_REGION( 0x1d6000, "floppy", 0) + ROM_LOAD( "ds3-5000-01a-rev-c.img", 0x000000, 0x1d6000, CRC(852f9b5f) SHA1(159e161f55beed0f90cce8a73b0aeb4564d6af90) ) +ROM_END + +ROM_START( qgh ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "16900b", 0x000000, 0x20000, CRC(20d7b7d1) SHA1(345b228c27e5f2fef9a2b8b5f619c59450a070f8) ) + ROM_LOAD16_BYTE( "16899b", 0x000001, 0x20000, CRC(397b3ba9) SHA1(1773212cd87dcff840f3953ec368be7e2394faf0) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "16902a", 0x000000, 0x80000, CRC(d35b7706) SHA1(341bca0af6b6d3f326328a88cdc69c7897b83a0d) ) + ROM_LOAD16_BYTE( "16901a", 0x000001, 0x80000, CRC(ab4bcb33) SHA1(8acd73096eb485c6dc83da6adfcc47d5d0f5b7f3) ) + ROM_LOAD16_BYTE( "16904", 0x100000, 0x80000, CRC(10987c88) SHA1(66f893690565aed613427421958ebe225a20ad0f) ) + ROM_LOAD16_BYTE( "16903", 0x100001, 0x80000, CRC(c19f9e46) SHA1(f1275674a8b44957428d79402f240ca21a34f48d) ) + ROM_LOAD16_BYTE( "16906", 0x200000, 0x80000, CRC(99c6773e) SHA1(568570b607d2cbbedb39ceae5bbc479478fae4ca) ) + ROM_LOAD16_BYTE( "16905", 0x200001, 0x80000, CRC(3922bbe3) SHA1(4378ca900f96138b5e33265ddac56af7b45afbc8) ) + ROM_LOAD16_BYTE( "16908", 0x300000, 0x80000, CRC(407ec20f) SHA1(c8a909d8e9ba024a37a5af6b7920fe7023f80d49) ) + ROM_LOAD16_BYTE( "16907", 0x300001, 0x80000, CRC(734b0a82) SHA1(d3fb31c55e79b99040beb7c49faaf2e17b95aa87) ) +ROM_END + +ROM_START( qrouka ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "14485", 0x000000, 0x20000, CRC(fc0085f9) SHA1(0250d1e17e19b541b85198ec4207e55bfbd5c32e) ) + ROM_LOAD16_BYTE( "14484", 0x000001, 0x20000, CRC(f51c641c) SHA1(3f2fd0be7d58c75e88565393da5e810655413b53) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "14482", 0x000000, 0x80000, CRC(7a13dd97) SHA1(bfe9950d2cd41f3f866520923c1ed7b8da1990ec) ) + ROM_LOAD16_BYTE( "14483", 0x100000, 0x80000, CRC(f3eb51a0) SHA1(6904830ff5e7aa5f016e115572fb6da678896ede) ) +ROM_END + +ROM_START( mahmajn ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr14813.bin", 0x000000, 0x20000, CRC(ea38cf4b) SHA1(118ab2e0ae20a4db5e619945dfbb3f200de3979c) ) + ROM_LOAD16_BYTE( "epr14812.bin", 0x000001, 0x20000, CRC(5a3cb4a7) SHA1(c0f21282140e8e6e927664f5f2b90525ae0207e9) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "mpr14820.bin", 0x000000, 0x80000, CRC(8d2a03d3) SHA1(b3339bcd101bcfe042e2a1cfdc8baef0a86624df) ) + ROM_LOAD16_BYTE( "mpr14819.bin", 0x000001, 0x80000, CRC(e84c4827) SHA1(54741295e1bdca7d0c78eb795a68b92212d43b2e) ) + ROM_LOAD16_BYTE( "mpr14822.bin", 0x100000, 0x80000, CRC(7c3dcc51) SHA1(a199c2c71cda44a2c8755074c1007d83c8d45d2d) ) + ROM_LOAD16_BYTE( "mpr14821.bin", 0x100001, 0x80000, CRC(bd8dc543) SHA1(fd50b14fa73307a62dc0b522cfedb8b3332c407e) ) + ROM_LOAD16_BYTE( "mpr14824.bin", 0x200000, 0x80000, CRC(38311933) SHA1(237d9a8ffe14ba9ec371bb571d7c9e74a93fe1f3) ) + ROM_LOAD16_BYTE( "mpr14823.bin", 0x200001, 0x80000, CRC(4c8d4550) SHA1(be8717d4080ce932fc8272ebe54e2b0a60b20edd) ) + ROM_LOAD16_BYTE( "mpr14826.bin", 0x300000, 0x80000, CRC(c31b8805) SHA1(b446388c83af2e14300b0c4248470d3a8c504f2c) ) + ROM_LOAD16_BYTE( "mpr14825.bin", 0x300001, 0x80000, CRC(191080a1) SHA1(407c1c5fa4c76732e8a444860094542e90a1e8e8) ) +ROM_END + +ROM_START( mahmajn2 ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr16799.bin", 0x000000, 0x20000, CRC(3a34cf75) SHA1(d22bf6334668af29167cf4244d18f9cd2e7ff7d6) ) + ROM_LOAD16_BYTE( "epr16798.bin", 0x000001, 0x20000, CRC(662923fa) SHA1(dcd3964d899d3f34dab22ffcd1a5af895804fae1) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "mpr16801.bin", 0x000000, 0x80000, CRC(74855a17) SHA1(d2d8e7da7b261e7cb64605284d2c78fbd1465b69) ) + ROM_LOAD16_BYTE( "mpr16800.bin", 0x000001, 0x80000, CRC(6dbc1e02) SHA1(cce5734243ff171759cecb5c05c12dc743a25c1d) ) + ROM_LOAD16_BYTE( "mpr16803.bin", 0x100000, 0x80000, CRC(9b658dd6) SHA1(eaaae289a3555aa6a92f57eea964dbbf48c5c2a4) ) + ROM_LOAD16_BYTE( "mpr16802.bin", 0x100001, 0x80000, CRC(b4723225) SHA1(acb8923c7d9908b1112f8d1f2512f18236915e5d) ) + ROM_LOAD16_BYTE( "mpr16805.bin", 0x200000, 0x80000, CRC(d15528df) SHA1(bda1dd5c98867c2e7666380bca0bc7eef8022fbc) ) + ROM_LOAD16_BYTE( "mpr16804.bin", 0x200001, 0x80000, CRC(a0de08e2) SHA1(2c36b66e74b88fb076e2eaa250c6d06ee0b4ac88) ) + ROM_LOAD16_BYTE( "mpr16807.bin", 0x300000, 0x80000, CRC(816188bb) SHA1(76b2690a6156766a1af94f01f6de1209b7756b2c) ) + ROM_LOAD16_BYTE( "mpr16806.bin", 0x300001, 0x80000, CRC(54b353d3) SHA1(40632e4571b44ee215b5a1f7aab9d89c460a5c9e) ) +ROM_END + +ROM_START( bnzabros ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "mpr-13188-h.2", 0x000000, 0x80000, CRC(d3802294) SHA1(7608e71e8ef398ac24dbf851994253bca5ace625) ) + ROM_LOAD16_BYTE( "mpr-13187-h.1", 0x000001, 0x80000, CRC(e3d8c5f7) SHA1(5b1e8646debee2f2ef272ddd3320b0a17192fbbe) ) + ROM_LOAD16_BYTE( "mpr-13190.4", 0x100000, 0x40000, CRC(0b4df388) SHA1(340478bba82069ab745d6d8703e6801411fd2fc4) ) + ROM_RELOAD ( 0x180000, 0x40000) + ROM_LOAD16_BYTE( "mpr-13189.3", 0x100001, 0x40000, CRC(5ea5a2f3) SHA1(514b5446303c50aeb1d6d10d0a3f210da2577e16) ) + ROM_RELOAD ( 0x180001, 0x40000) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-07d.img", 0x000000, 0x1c2000, CRC(2e70251f) SHA1(1c2616dfa5cc15e8ebf1424012f2dd66f3a001a1) ) /* Region letter needs to be verfied */ +ROM_END + +ROM_START( bnzabrosj ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "mpr-13188-h.2", 0x000000, 0x80000, CRC(d3802294) SHA1(7608e71e8ef398ac24dbf851994253bca5ace625) ) + ROM_LOAD16_BYTE( "mpr-13187-h.1", 0x000001, 0x80000, CRC(e3d8c5f7) SHA1(5b1e8646debee2f2ef272ddd3320b0a17192fbbe) ) + ROM_LOAD16_BYTE( "mpr-13190.4", 0x100000, 0x40000, CRC(0b4df388) SHA1(340478bba82069ab745d6d8703e6801411fd2fc4) ) + ROM_RELOAD ( 0x180000, 0x40000) + ROM_LOAD16_BYTE( "mpr-13189.3", 0x100001, 0x40000, CRC(5ea5a2f3) SHA1(514b5446303c50aeb1d6d10d0a3f210da2577e16) ) + ROM_RELOAD ( 0x180001, 0x40000) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-07b.img", 0x000000, 0x1c2000, CRC(efa7f2a7) SHA1(eb905bff88fa40324fb92b91ac8a5878648c26e5) ) +ROM_END + +ROM_START( quizmeku ) // Quiz Mekuromeku Story + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr15343.ic2", 0x000000, 0x20000, CRC(c72399a7) SHA1(bfbf0079ea63f89bca4ce9081aed5d5c1d9d169a) ) + ROM_LOAD16_BYTE( "epr15342.ic1", 0x000001, 0x20000, CRC(0968ac84) SHA1(4e1170ac123adaec32819754b5075531ff1925fe) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "epr15345.ic5", 0x000000, 0x80000, CRC(88030b5d) SHA1(d2feeedb9a64c3dc8dd25716209f945d12fa9b53) ) + ROM_LOAD16_BYTE( "epr15344.ic4", 0x000001, 0x80000, CRC(dd11b382) SHA1(2b0f49fb307a9aba0f295de64782ee095c557170) ) + ROM_LOAD16_BYTE( "mpr15347.ic7", 0x100000, 0x80000, CRC(0472677b) SHA1(93ae57a2817b6b54c99814fca28ef51f7ff5e559) ) + ROM_LOAD16_BYTE( "mpr15346.ic6", 0x100001, 0x80000, CRC(746d4d0e) SHA1(7863abe36126684772a4459d5b6f3b24670ec02b) ) + ROM_LOAD16_BYTE( "mpr15349.ic9", 0x200000, 0x80000, CRC(770eecf1) SHA1(86cc5b4a325198dc1da1446ecd8e718415b7998a) ) + ROM_LOAD16_BYTE( "mpr15348.ic8", 0x200001, 0x80000, CRC(7666e960) SHA1(f3f88d5c8318301a8c73141de60292f8349ac0ce) ) +ROM_END + +ROM_START( sspirits ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-02-.img", 0x000000, 0x1c2000, CRC(179b98e9) SHA1(f6fc52c599c336d5c6f7aa199515268b4b3218a8) ) +ROM_END + +ROM_START( sspiritj ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-11339.ic2", 0x000000, 0x20000, CRC(75130e73) SHA1(e079739f4a3da3807aac570442c5afef1a7d7b0e) ) + ROM_LOAD16_BYTE( "epr-11338.ic1", 0x000001, 0x20000, CRC(7d4a7ff3) SHA1(3d3af04d990d232ba0a8fe155de59bc632a0a461) ) + + ROM_REGION( 0x1d6000, "floppy", 0) + ROM_LOAD( "ds3-5000-02-rev-a.img", 0x000000, 0x1d6000, CRC(0385470f) SHA1(62c1bfe3a88b2dee44629809e08b4b8a5770eaab) ) +ROM_END + +ROM_START( sspirtfc ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-02c.key", 0x0000, 0x2000, CRC(ebae170e) SHA1(b6d1e1b6943a35b96e98e426ecb39bb5a42fb643) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-02c.img", 0x000000, 0x1c2000, NO_DUMP ) +ROM_END + +ROM_START( sgmast ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + // reconstructed key; some of the RNG-independent bits could be incorrect + ROM_LOAD( "317-0058-05d.key", 0x0000, 0x2000, BAD_DUMP CRC(c779738d) SHA1(f65355c20fbcb22781816d24633a509f13bec170) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-05d.img", 0x000000, 0x1c2000, CRC(e9a69f93) SHA1(dc15e47ed78373688c1fab72a9605528068ad702) ) +ROM_END + +ROM_START( sgmastc ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-05c.key", 0x0000, 0x2000, CRC(ae0eabe5) SHA1(692d7565bf9c5b32cc80bb4bd88c9193aa04cbb0) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-05c.img", 0x000000, 0x1c2000, CRC(63a6ef3a) SHA1(f39fe0bf8930de994b1a77e0ba787d249d73c5e5) ) +ROM_END + +ROM_START( sgmastj ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-05b.key", 0x0000, 0x2000, CRC(adc0c83b) SHA1(2328d82d5057062eeb0072fd57f0422218cf24fc) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-05b.img", 0x000000, 0x1c2000, CRC(a136668c) SHA1(7203f9d11023605a0a4b52a4be330785c8f7b623) ) +ROM_END + +ROM_START( qsww ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-08b.key", 0x0000, 0x2000, CRC(fe0a336a) SHA1(f7a5b2c1a057d0bb8c1ae0453c58aa8f5fb731b9) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-08b.img", 0x000000, 0x1c2000, CRC(5a886d38) SHA1(2e974a9ffe3534da4fb117c579b8b0e61a63542c) ) +ROM_END + +ROM_START( gground ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-03d.key", 0x0000, 0x2000, CRC(e1785bbd) SHA1(b4bebb2829299f1c0815d6a5f317a2526b322f63) ) /* Also labeled "rev-A" but is it different? */ + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-03d-rev-a.img", 0x000000, 0x1c2000, CRC(5c5910f2) SHA1(9ed564a03c0d4ca4a207f3ecfb7336c6cbcaa70f) ) +ROM_END + +ROM_START( ggroundj ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-03b.key", 0x0000, 0x2000, CRC(84aecdba) SHA1(ceddf967359a6e76543fe1ab00be53d0a11fe1ab) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-03b.img", 0x000000, 0x1c2000, CRC(7200dac9) SHA1(07cf33bf2a0da36e3852de409959f30128cdbf77) ) +ROM_END + +ROM_START( crkdown ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-04c.key", 0x0000, 0x2000, CRC(16e978cc) SHA1(0e1482b5efa93b732d4cf0990919cb3fc903dca7) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-04c.img", 0x000000, 0x1c2000, CRC(7d97ba5e) SHA1(43f98bd04d031dd435bbd1bf8e6688bc57ce9666) ) +ROM_END + +ROM_START( crkdownu ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-04d.key", 0x0000, 0x2000, CRC(934ac358) SHA1(73418e22c9d201bc3fec5c63284858958c010e05) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-04d.img", 0x000000, 0x1c2000, CRC(8679032c) SHA1(887b245a70652897fbda736b60e81a123866ec12) ) +ROM_END + +ROM_START( crkdownj ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-04b.key", 0x0000, 0x2000, CRC(4a99a202) SHA1(d7375f09e7246ecd60ba0e48f049e9e252af92a8) ) /* Also labeled "rev-A" but is it different? */ + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-04b-rev-a.img", 0x000000, 0x1c2000, CRC(5daa1a9a) SHA1(ce2f07b83b607bbbdb70f1ae344c1d897d601809) ) +ROM_END + +ROM_START( dcclub ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr13948.bin", 0x000000, 0x20000, CRC(d6a031c8) SHA1(45b7e3cd2c7412e24f547cd4185166199d3938d5) ) + ROM_LOAD16_BYTE( "epr13947.bin", 0x000001, 0x20000, CRC(7e3cff5e) SHA1(ff8cb776d2491796feeb8892c7e644e590438945) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "epr-15345.2", 0x000000, 0x80000, CRC(d9e120c2) SHA1(b18b76733078d8534c6f0d8950632ab51e6a10ab) ) + ROM_LOAD16_BYTE( "epr-15344.1", 0x000001, 0x80000, CRC(8f8b9f74) SHA1(de6b923118bea60197547ad016cb5d5e1a8f372b) ) + ROM_LOAD16_BYTE( "mpr-14097-t.4",0x100000, 0x80000, CRC(4bd74cae) SHA1(5aa90bd5d2b8e2338ef0fe41d1f794e8d51321e1) ) + ROM_LOAD16_BYTE( "mpr-14096-t.3",0x100001, 0x80000, CRC(38d96502) SHA1(c68b3c5c83fd0839c3f6f81189c310ec19bdf1c4) ) +ROM_END + +ROM_START( dcclubj ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr13948.bin", 0x000000, 0x20000, CRC(d6a031c8) SHA1(45b7e3cd2c7412e24f547cd4185166199d3938d5) ) + ROM_LOAD16_BYTE( "epr13947.bin", 0x000001, 0x20000, CRC(7e3cff5e) SHA1(ff8cb776d2491796feeb8892c7e644e590438945) ) + + ROM_REGION16_BE( 0x400000, "romboard", 0) + ROM_LOAD16_BYTE( "epr-14095a.2", 0x000000, 0x80000, CRC(88d184e9) SHA1(519f3a22e1619de9d5f13a45b85ebd249ebfa979) ) + ROM_LOAD16_BYTE( "epr-14094a.1", 0x000001, 0x80000, CRC(7dd2b7d4) SHA1(c7eaf9e2700e0c55f7e867f5cd3ffaa5aae97956) ) + ROM_LOAD16_BYTE( "mpr-14097-t.4",0x100000, 0x80000, CRC(4bd74cae) SHA1(5aa90bd5d2b8e2338ef0fe41d1f794e8d51321e1) ) + ROM_LOAD16_BYTE( "mpr-14096-t.3",0x100001, 0x80000, CRC(38d96502) SHA1(c68b3c5c83fd0839c3f6f81189c310ec19bdf1c4) ) +ROM_END + +ROM_START( dcclubfd ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-09d.key", 0x0000, 0x2000, CRC(a91ebffb) SHA1(70b8b4272ca456491f254d115b434bb4ce73f049) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-09d.img", 0x000000, 0x1c2000, CRC(69870887) SHA1(e47a997c2c783bf6670ab213ebe2ee35492eba34) ) +ROM_END + +ROM_START( roughrac ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "epr-12187.ic2", 0x000000, 0x20000, CRC(e83783f3) SHA1(4b3b32df7de85aef9cd77c8a4ffc17e10466b638) ) + ROM_LOAD16_BYTE( "epr-12186.ic1", 0x000001, 0x20000, CRC(ce76319d) SHA1(0ede61f0700f9161285c768fa97636f0e42b96f8) ) + + ROM_REGION( 0x2000, "subcpu:key", 0 ) /* decryption key */ + ROM_LOAD( "317-0058-06b.key", 0x000000, 0x2000, CRC(6a5bf536) SHA1(3fc3e93ce8a47d7ee86da889efad2e7eca6e2ee9) ) + + ROM_REGION( 0x1c2000, "floppy", 0) + ROM_LOAD( "ds3-5000-06b.img", 0x000000, 0x1c2000, CRC(a7fb2149) SHA1(c04266ae31700b085ab45606aed83019a563de70) ) +ROM_END + +/* I think the letter after the disk code is the region + 'b' = Japan + 'c' = Europe? + 'd' = US +*/ + + +/************************************* + * + * Game-specific driver inits + * + *************************************/ + +DRIVER_INIT_MEMBER(segas24_state,qgh) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = segas24_state::qgh_mlt; + track_size = 0; +} + +DRIVER_INIT_MEMBER(segas24_state,dcclub) +{ + io_r = &segas24_state::dcclub_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = segas24_state::dcclub_mlt; + track_size = 0; +} + +DRIVER_INIT_MEMBER(segas24_state,qrouka) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = segas24_state::qrouka_mlt; + track_size = 0; +} + +DRIVER_INIT_MEMBER(segas24_state,quizmeku) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = segas24_state::quizmeku_mlt; + track_size = 0; +} + +DRIVER_INIT_MEMBER(segas24_state,mahmajn) +{ + io_r = &segas24_state::mahmajn_io_r; + io_w = &segas24_state::mahmajn_io_w; + mlatch_table = segas24_state::mahmajn_mlt; + track_size = 0; + cur_input_line = 0; +} + +DRIVER_INIT_MEMBER(segas24_state,mahmajn2) +{ + io_r = &segas24_state::mahmajn_io_r; + io_w = &segas24_state::mahmajn_io_w; + mlatch_table = segas24_state::mahmajn2_mlt; + track_size = 0; + cur_input_line = 0; +} + +DRIVER_INIT_MEMBER(segas24_state,hotrod) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + + // Sector Size + // 1 8192 + // 2 1024 + // 3 1024 + // 4 1024 + // 5 512 + // 6 256 + + track_size = 0x2f00; +} + +DRIVER_INIT_MEMBER(segas24_state,bnzabros) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = segas24_state::bnzabros_mlt; + + // Sector Size + // 1 2048 + // 2 2048 + // 3 2048 + // 4 2048 + // 5 2048 + // 6 1024 + // 7 256 + + track_size = 0x2d00; +} + +DRIVER_INIT_MEMBER(segas24_state,sspirits) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + track_size = 0x2d00; +} + +DRIVER_INIT_MEMBER(segas24_state,sspiritj) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + track_size = 0x2f00; +} + +DRIVER_INIT_MEMBER(segas24_state,dcclubfd) +{ + io_r = &segas24_state::dcclub_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = segas24_state::dcclub_mlt; + track_size = 0x2d00; +} + + +DRIVER_INIT_MEMBER(segas24_state,sgmast) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + track_size = 0x2d00; +} + +DRIVER_INIT_MEMBER(segas24_state,qsww) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + track_size = 0x2d00; +} + +DRIVER_INIT_MEMBER(segas24_state,gground) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + track_size = 0x2d00; +} + +DRIVER_INIT_MEMBER(segas24_state,crkdown) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + track_size = 0x2d00; +} + +DRIVER_INIT_MEMBER(segas24_state,roughrac) +{ + io_r = &segas24_state::hotrod_io_r; + io_w = &segas24_state::hotrod_io_w; + mlatch_table = 0; + track_size = 0x2d00; +} + + +/************************************* + * + * Game driver(s) + * + *************************************/ + +// YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS +/* Disk Based Games */ +/* 01 */GAME( 1988, hotrod, 0, system24_floppy, hotrod, segas24_state, hotrod, ROT0, "Sega", "Hot Rod (World, 3 Players, Turbo set 1, Floppy Based)", 0 ) +/* 01 */GAME( 1988, hotroda, hotrod, system24_floppy, hotrod, segas24_state, hotrod, ROT0, "Sega", "Hot Rod (World, 3 Players, Turbo set 2, Floppy Based)", 0 ) +/* 01 */GAME( 1988, hotrodj, hotrod, system24_floppy, hotrodj, segas24_state, hotrod, ROT0, "Sega", "Hot Rod (Japan, 4 Players, Floppy Based, Rev C)", 0 ) +/* 01 */GAME( 1988, hotrodja, hotrod, system24_floppy, hotrodj, segas24_state, hotrod, ROT0, "Sega", "Hot Rod (Japan, 4 Players, Floppy Based, Rev B)", 0 ) +/* 02 */GAME( 1988, sspirits, 0, system24_floppy, sspirits, segas24_state, sspirits, ROT270, "Sega", "Scramble Spirits (World, Floppy Based)", 0 ) +/* 02 */GAME( 1988, sspiritj, sspirits, system24_floppy, sspirits, segas24_state, sspiritj, ROT270, "Sega", "Scramble Spirits (Japan, Floppy DS3-5000-02-REV-A Based)", 0 ) +/* 02 */GAME( 1988, sspirtfc, sspirits, system24_floppy_fd1094, sspirits, segas24_state, sspirits, ROT270, "Sega", "Scramble Spirits (World, Floppy Based, FD1094 317-0058-02c)", MACHINE_NOT_WORKING ) /* MISSING disk image */ +/* 03 */GAME( 1988, gground, 0, system24_floppy_fd1094, gground, segas24_state, gground, ROT270, "Sega", "Gain Ground (World, 3 Players, Floppy Based, FD1094 317-0058-03d Rev A)", 0 ) +/* 03 */GAME( 1988, ggroundj, gground, system24_floppy_fd1094, gground, segas24_state, gground, ROT270, "Sega", "Gain Ground (Japan, 2 Players, Floppy Based, FD1094 317-0058-03b)", 0 ) +/* 04 */GAME( 1989, crkdown, 0, system24_floppy_fd1094, crkdown, segas24_state, crkdown, ROT0, "Sega", "Crack Down (World, Floppy Based, FD1094 317-0058-04c)", MACHINE_IMPERFECT_GRAPHICS ) // clipping probs / solid layer probs? (radar display) +/* 04 */GAME( 1989, crkdownu, crkdown, system24_floppy_fd1094, crkdown, segas24_state, crkdown, ROT0, "Sega", "Crack Down (US, Floppy Based, FD1094 317-0058-04d)", MACHINE_IMPERFECT_GRAPHICS ) // clipping probs / solid layer probs? (radar display) +/* 04 */GAME( 1989, crkdownj, crkdown, system24_floppy_fd1094, crkdown, segas24_state, crkdown, ROT0, "Sega", "Crack Down (Japan, Floppy Based, FD1094 317-0058-04b Rev A)", MACHINE_IMPERFECT_GRAPHICS ) // clipping probs / solid layer probs? (radar display) +/* 05 */GAME( 1989, sgmast, 0, system24_floppy_fd1094, sgmast, segas24_state, sgmast, ROT0, "Sega", "Super Masters Golf (World?, Floppy Based, FD1094 317-0058-05d?)", 0 ) +/* 05 */GAME( 1989, sgmastc, sgmast, system24_floppy_fd1094, sgmast, segas24_state, sgmast, ROT0, "Sega", "Jumbo Ozaki Super Masters Golf (World, Floppy Based, FD1094 317-0058-05c)", MACHINE_IMPERFECT_GRAPHICS ) // some gfx offset / colour probs? +/* 05 */GAME( 1989, sgmastj, sgmast, system24_floppy_fd1094, sgmastj, segas24_state, sgmast, ROT0, "Sega", "Jumbo Ozaki Super Masters Golf (Japan, Floppy Based, FD1094 317-0058-05b)", MACHINE_IMPERFECT_GRAPHICS ) // some gfx offset / colour probs? +/* 06 */GAME( 1990, roughrac, 0, system24_floppy_fd1094, roughrac, segas24_state, roughrac, ROT0, "Sega", "Rough Racer (Japan, Floppy Based, FD1094 317-0058-06b)", 0 ) +/* 07 */GAME( 1990, bnzabros, 0, system24_floppy, bnzabros, segas24_state, bnzabros, ROT0, "Sega", "Bonanza Bros (US, Floppy DS3-5000-07d? Based)", 0 ) +/* 07 */GAME( 1990, bnzabrosj, bnzabros, system24_floppy, bnzabros, segas24_state, bnzabros, ROT0, "Sega", "Bonanza Bros (Japan, Floppy DS3-5000-07b Based)", 0 ) +/* 08 */GAME( 1991, qsww, 0, system24_floppy_fd1094, qsww, segas24_state, qsww, ROT0, "Sega", "Quiz Syukudai wo Wasuremashita (Japan, Floppy Based, FD1094 317-0058-08b)", MACHINE_IMPERFECT_GRAPHICS ) // wrong bg colour on title +/* 09 */GAME( 1991, dcclubfd, dcclub, system24_floppy_fd1094, dcclub, segas24_state, dcclubfd, ROT0, "Sega", "Dynamic Country Club (US, Floppy Based, FD1094 317-0058-09d)", 0 ) + +// YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS +/* ROM Based */ +GAME( 1991, dcclub, 0, system24, dcclub, segas24_state, dcclub, ROT0, "Sega", "Dynamic Country Club (World, ROM Based)", 0 ) +GAME( 1991, dcclubj, dcclub, system24, dcclub, segas24_state, dcclub, ROT0, "Sega", "Dynamic Country Club (Japan, ROM Based)", 0 ) +GAME( 1991, qrouka, 0, system24, qrouka, segas24_state, qrouka, ROT0, "Sega", "Quiz Rouka Ni Tattenasai (Japan, ROM Based)", 0 ) +GAME( 1992, quizmeku, 0, system24, quizmeku, segas24_state, quizmeku, ROT0, "Sega", "Quiz Mekurumeku Story (Japan, ROM Based)", 0 ) /* Released in 05.1993 */ +GAME( 1992, mahmajn, 0, system24, mahmajn, segas24_state, mahmajn, ROT0, "Sega", "Tokoro San no MahMahjan (Japan, ROM Based)", 0 ) +GAME( 1994, qgh, 0, system24, qgh, segas24_state, qgh, ROT0, "Sega", "Quiz Ghost Hunter (Japan, ROM Based)", 0 ) +GAME( 1994, mahmajn2, 0, system24, mahmajn, segas24_state, mahmajn2, ROT0, "Sega", "Tokoro San no MahMahjan 2 (Japan, ROM Based)", 0 ) |