Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
12052 lines (9681 sloc) 759 KB
// license:BSD-3-Clause
// copyright-holders:Bryan McPhail,Ernesto Corvi,Andrew Prime,Zsolt Vasvari
// thanks-to:Fuzz
/***************************************************************************
Neo-Geo hardware
Credits:
* This driver was made possible by the research done by
Charles MacDonald. For a detailed description of the Neo-Geo
hardware, please visit his page at:
http://cgfm2.emuviews.com/txt/mvstech.txt
* Presented to you by the Shin Emu Keikaku team.
* The following people have all spent probably far
too much time on this:
AVDB
Bryan McPhail
Fuzz
Ernesto Corvi
Andrew Prime
Zsolt Vasvari
Known driver issues/to-do's:
============================
* Fatal Fury 3 crashes during the ending - this doesn't occur if
the language is set to Japanese, maybe the English endings
are incomplete / buggy?
* Graphical Glitches caused by incorrect timing?
- Some raster effects are imperfect (off by a couple of lines)
* 68000 waitstates on ROM region access, determined by jumpers on cart
(garou train stage 3 background bug is probably related to this)
Confirmed non-bugs:
* Bad zooming in the Kof2003 bootlegs - this is what happens
if you try and use the normal bios with a PCB set, it
looks like the bootleggers didn't care.
* Glitches at the edges of the screen - the real hardware
can display 320x224 but most of the games seem designed
to work with a width of 304, some less.
* Distorted jumping sound in Nightmare in the Dark
* Ninja Combat sometimes glitches
*****************************************************************************
The Neo-Geo Multi Video System (MVS), is an arcade system board, being
the first product in the Neo-Geo family, designed by Alpha Denshi (ADK)
and released in 1990 by SNK. It was known to the coin-op industry, and
offered arcade operators the ability to put up to 6 different arcade
titles into a single cabinet, a key economic consideration for operators
with limited floorspace (games for the Neo-Geo are cartridge based and are
easily exchangeable). It comes in many different cabinets but basically
consists of an add on board that can be linked to a standard Jamma system.
The system was discontinued in 2004.
Source (modified): http://en.wikipedia.org/wiki/Neo_Geo
MVS motherboards were produced in 1 / 2 / 4 and 6 Slot versions.
Known motherboards:
===================
+---------+------+-------+------------+-----------------------+--------------------------------------------------------------------------+
| Model | Year | Slots | Generation | Video chipset | Notes |
+---------+------+-------+------------+-----------------------+--------------------------------------------------------------------------+
| MV-1 | 1990 | 1 | 1 | PRO-B0/PRO-C0/LSPC-A0 | Original full-featured 1-slot board |
| MV-1F | | 1 | 2 | NEO-B1/LSPC2-A2 | 2nd-generation 1-slot board, no memory card headers |
| MV-1FZ | | 1 | 2 | NEO-B1/LSPC2-A2 | Cost-reduced MV-1F without LED displays/mahjong inputs/stereo output |
| MV-1FZS | | 1 | 2 | NEO-B1/LSPC2-A2 | Spanish MV-1FZ |
| MV-1A | 1995 | 1 | 3 | NEO-MGA/NEO-GRC | 3rd-generation 1-slot board, removes coin lockouts |
| MV-1ACH | 1995 | 1 | 3 | NEO-MGA/NEO-GRC | Chinese MV-1A |
| MV-1AX | | 1 | 3 | NEO-MGA/NEO-GRC | MV-1A with soldered BIOS |
| MV-1B | | 1 | 4 | NEO-GRC2 | 4th-generation 1-slot board, soldered BIOS, no SM1 ROM, 8-pin SIT header |
| MV-1C | 1999 | 1 | 5 | NEO-GRZ | Final iteration, vertical cartridge slot |
+---------+------+-------+------------+-----------------------+--------------------------------------------------------------------------+
| MV-2B | | 2 | 1 | PRO-B0/PRO-C0/LSPC-A0 | Original full-featured 2-slot board |
| MV-2F | | 2 | 2 | NEO-B1/LSPC2-A2 | 2nd-geneation 2-slot board, onboard PCMCIA slot and 3.5mm jacks |
| MV-2FS | | 2 | 2 | NEO-B1/LSPC2-A2 | Spanish MV-2F |
+---------+------+-------+------------+-----------------------+--------------------------------------------------------------------------+
| MV-4 | 1990 | 4 | 1 | PRO-B0/PRO-C0/LSPC-A0 | Original 4-slot board |
| MV-4F | | 4 | 2 | NEO-B1/LSPC2-A2 | 2nd-generation 4-slot board |
| MV-4FS | | 4 | 2 | NEO-B1/LSPC2-A2 | Spanish MV-4 |
+---------+------+-------+------------+-----------------------+--------------------------------------------------------------------------+
| MV-6 | 1990 | 6 | 1 | PRO-B0/PRO-C0/LSPC-A0 | 2-board stack - mainboard and slot board |
+---------+------+-------+------------+-----------------------+--------------------------------------------------------------------------+
Other mainboards:
1 Slot:
NEO-MVH MV1-1
. NEO-MVH MV1A CHX ??
NEO-MVH MV1B (1996.1.19) (miniaturised, 8-pin header for irrmaze/kizuna4p)
. NEO-MVH MV1B CHX (1996.1.19) ??
NEO-MVH MV1B1 (1998.6.17)
NEO-MVH MV1C (1999.4.30)
NEO-MVH MV1FT (cost-reduced MV1T without memory card headers)
NEO-MVH MV1T
2 Slot:
NEO-MVH MV2
NEO-MVH MV2F-01
4 Slot:
NEO-MVH MV4-25 (US MV4?)
NEO-MVH MV4FT
NEO-MVH MV4FT2
6 Slot:
NEO-MVH MV6F
Neo-Geo Motherboard (info - courtesy of Guru):
NEO-MVH MV1
|---------------------------------------------------------------------|
| 4558 |
| HC04 HC32 |
| SP-S2.SP1 NEO-E0 000-L0.L0 LS244 AS04 |
| YM2610 |
| 4558 |
| 4558 5814 HC259 SFIX.SFIX |
| NEO-I0 |
| HA13001 YM3016 5814 |
--| |
| 4558 |
--| SM1.SM1 LS32 |
| |
| LSPC-A0 PRO-C0 LS244 |
| |
|J 68000 |
|A |
|M |
|M NEO-ZMC2 |
|A |
| LS273 NEO-G0 58256 58256 Z80A |
| 58256 58256 58256 58256 6116 |
| LS273 5864 |
--| LS05 5864 PRO-B0 |
| |
--| LS06 HC32 D4990A NEO-F0 24.000MHz |
| DSW1 BATT3.6V 32.768kHz NEO-D0 |
| 2003 2003 |
|---------------------------------------------------------------------|
Mainboard features
==================
+-------+----+-----+-----+-----+--------+--------+-------+-----+-------+-------+------+-----+---+--------+-------+------+
| |Vid |Slots|Edge |Coins|Counters|Lockouts|Mahjong|8-pin|Memcard|Mono/St|Phones|7-seg|EL | BIOS |Data In|Orient|
+-------+----+-----+-----+-----+--------+--------+-------+-----+-------+-------+------+-----+---+--------+-------+------+
|MV-1 | B0 | 1 |JAMMA| 2 | 2 | 2 | 2 | no |header |switch |header| yes |no | socket | yes |horiz |
|MV-1F | B1 | 1 |JAMMA| 2 | 2 | 2 | 2 | no | none |switch |header| yes |no | socket | no |horiz |
|MV-1FZ | B1 | 1 |JAMMA| 2 | 2 | 2 | 0 | no | none | mono | none | no |no | socket | yes |horiz |
|MV-1A |MGA | 1 |JAMMA| 2 | 2 | 0 | 0 | no | none | mono | none | no |no | socket | no |horiz |
|MV-1AX |MGA | 1 |JAMMA| 2 | 2 | 0 | 0 | no | none | mono | none | no |no |soldered| no |horiz |
|MV-1B |GRC2| 1 |JAMMA| 2 | 2 | 0 | 0 | yes | none | mono | none | no |no |soldered| no |horiz |
|MV-1C |GRZ | 1 |JAMMA| 2 | 2 | 0 | 0 | yes | none | mono | none | no |no |soldered| no | vert |
+-------+----+-----+-----+-----+--------+--------+-------+-----+-------+-------+------+-----+---+--------+-------+------+
|MV-2B | B0 | 2 | MVS | 4 | 2 | 2 | 2 | no |header | both |header| yes |yes| socket | no | vert |
|MV-2F | B1 | 2 | MVS | 4 | 2 | 2 | 2 | no |onboard| both |jacks | yes |yes| socket | no | vert |
+-------+----+-----+-----+-----+--------+--------+-------+-----+-------+-------+------+-----+---+--------+-------+------+
|MV-4-25| B0 | 4 | MVS | 4 | 2 | 2 | 2 | no |header | both |header| yes |yes| socket | no | vert |
|MV-4F | B1 | 4 | MVS | 4 | 2 | 2 | 2 | no |header | both |header| yes |yes| socket | no | vert |
+-------+----+-----+-----+-----+--------+--------+-------+-----+-------+-------+------+-----+---+--------+-------+------+
|MV-6 | B0 | 6 | MVS | 4 | 2 | 2 | 2 | no |header | both |header| yes |yes| socket | no | vert |
+-------+----+-----+-----+-----+--------+--------+-------+-----+-------+-------+------+-----+---+--------+-------+------+
* Function of the data input switch is unknown
* MVS connector has high-level single-ended stereo outputs and low-level mono output
* JAMMA connector has high-level balanced mono output
* Single-slot boards with stereo capability have a 4-pin stereo speaker header
* Boards with stereo support have headphone connectors or headers for them
* Newer single-slot boards have an 8-pin header for the trackball or 4-player interface (SIT)
*****************************************************************************
Neo-Geo game PCB infos:
=======================
The Neo-Geo games for AES (home) and MVS (arcade) systems are cartridge based.
Each cartridge consists of two PCBs: CHA and PROG.
.CHA PCB contains gfx data ('C' - rom), text layer data ('S' - rom) and sound driver ('M' - rom).
.PROG PCB contains sample data ('V' - rom) and program code ('P' - rom).
On most PCBs various custom/protection chips can also be found:
(Custom chip detail information (modified) from: http://wiki.neogeodev.org)
CHA:
. NEO-273 (C and S-ROM address latch)
. NEO-CMC 90G06CF7042 (NEO-273 logic / NEO-ZMC logic / C-ROM decryption / C and S-ROM multiplexer / S-ROM bankswitching)
. NEO-CMC 90G06CF7050 (NEO-273 logic / NEO-ZMC logic / C-ROM decryption / M-ROM decryption / C and S-ROM multiplexer / S-ROM bankswitching)
. NEO-ZMC (Z80 memory controller)
. NEO-ZMC2 (Z80 memory controller / Tile serializer)
. PRO-CT0 (C-ROM serializer and multiplexer?; used on early AES-CHA boards)
. SNK-9201 (C-ROM serializer and multiplexer?; used on early AES-CHA boards)
PROG:
. 0103 (QFP144) (Only found on Metal Slug X NEO-MVS PROGEOP board; function unknown)
. ALTERA (EPM7128SQC100-15) (P-ROM protection chip used for KOF98 NEO-MVS PROGSF1 board and Metal Slug X NEO-MVS PROGEOP board)
. NEO-COMA (Microcontroller; used for MULTI PLAY MODE, boards and sets see below)
. NEO-PCM2 (SNK 1999) (PCM functionality / V-ROM decryption / P-ROM decoding and bankswitching)
. NEO-PCM2 (PLAYMORE 2002) (PCM functionality / V-ROM decryption / P-ROM decoding and bankswitching)
. NEO-PVC (P-ROM decryption and bankswitching) / RAM
. NEO-SMA (P-ROM decryption and bankswitching / RNG / Storage of 256kb game data)
. PCM (ADPCM bus latches / V-ROM multiplexer)
. PRO-CT0 (On PROG board used for P-ROM protection -> Fatal Fury 2)
. SNK-9201 (On PROG board used for P-ROM protection -> Fatal Fury 2)
Known PCBs:
============
MVS CHA:
-- SNK --
. NEO-MVS CHA-32
. NEO-MVS CHA-8M
. NEO-MVS CHA42G
. NEO-MVS CHA42G-1
. NEO-MVS CHA 42G-2
. NEO-MVS CHA 42G-3
. NEO-MVS CHA42G-3B
. NEO-MVS CHA256
. NEO-MVS CHA256B
. NEO-MVS CHA512Y
. NEO-MVS CHAFIO (1999.6.14) - used with NEO-CMC 90G06C7042 or NEO-CMC 90G06C7050
. MVS CHAFIO REV1.0 (KOF-2001)
. NEO-MVS CHAFIO (SNK 2002) - MADE IN KOREA
-- SNKPLAYMORE --
. NEO-MVS CHAFIO (2003.7.24) - used only with NEO-CMC 90G06C7050
-- SNK development boards --
. NEO-MVS CHAMC2
MVS PROG:
-- SNK --
. NEO-MVS PROG-NAM
. NEO-MVS PROG-HERO
. NEO-MVS PROG-EP
. NEO-MVS PROG-8MB
. NEO-MVS PROGEP8M
. NEO-MVS PROG8M42
. NEO-MVS PROG16
. NEO-MVS PROG42G
. NEO-MVS PROG42G-COM
. NEO-MVS PROG42G-1
. NEO-MVS PROG-G2
. NEO-MVS PROG 4096
. NEO-MVS PROG 4096 B
. NEO-MVS PROGGSC
. NEO-MVS PROGSM
. NEO-MVS PROGSS3
. NEO-MVS PROGTOP
. NEO-MVS PROGSF1 (1998.6.17)
. NEO-MVS PROGSF1E (1998.6.18)
. NEO-MVS PROGEOP (1999.2.2)
. NEO-MVS PROGLBA (1999.4.12) - LBA-SUB (2000.2.24)
. NEO-MVS PROGBK1 (1994)
. NEO-MVS PROGBK1 (2001)
. NEO-MVS PROGBK2 (2000.3.21) - used with NEO-PCM2 (1999 SNK) or NEO-PCM2 (2002 PLAYMORE)
. MVS PROGBK2 REV1.0 (KOF-2001)
. NEO-MVS PROGBK2 (SNK 2002) - MADE IN KOREA
-- SNKPLAYMORE --
. NEO-MVS PROGBK2R (2003.8.26) - NEO-HYCS (2003.9.29)
. NEO-MVS PROGBK3R (2003.9.2) - NEO-HYCS (2003.9.29)
. NEO-MVS PROGBK3S (2003.10.1)
. NEO-MVS PROGBK2S (2003.10.18)
-- SNK development boards --
. NEO-MVS PROGMC2
AES CHA:
-- SNK --
. NEO-AEG CHA-32
. NEO-AEG CHA-8M
. NEO-AEG CHA42G
. NEO-AEG CHA42G-1
. NEO-AEG CHA42G-2B
. NEO-AEG CHA42G-3
. NEO-AEG CHA42G-4
. NEO-AEG CHA256
. NEO-AEG CHA256 B
. NEO-AEG CHA256[B]
. NEO-AEG CHA256BY
. NEO-AEG CHA256RY
. NEO-AEG CHA512Y
. NEO-AEG CHAFIO (1999.8.10) - used with NEO-CMC 90G06C7042 or NEO-CMC 90G06C7050
-- SNKPLAYMORE --
. NEO-AEG CHAFIO (2003.7.24) - used only with NEO-CMC 90G06C7050
AES PROG:
-- SNK --
. NEO-AEG PROG-NAM
. NEO-AEG PROG-HERO
. NEO-AEG PROG-4A
. NEO-AEG PROG-4B
. NEO-AEG PROG 8M42
. NEO-AEG PROG B
. NEO-AEG PROG16
. NEO-AEG PROG42G
. NEO-AEG PROG42G-COM
. NEO-AEG PROG42G-1
. NEO-AEG PROG-G2
. NEO-AEG PROG4096 B
. NEO-AEG PROGGS
. NEO-AEG PROGTOP2
. NEO-AEG PROGTOP2Y
. NEO-AEG PROGEOP (1999.4.2)
. NEO-AEG PROGLBA (1999.7.6)
. NEO-AEG PROGRK
. NEO-AEG PROGRKB
. NEO-AEG PROGBK1Y
. NEO-AEG PROGBK1F
-- PLAYMORE --
. NEO-AEG PROGBK2 (2002.4.1) - used with NEO-PCM2 (1999 SNK) or NEO-PCM2 (2002 PLAYMORE)
-- SNKPLAYMORE --
. NEO-AEG PROGBK3R (2003.8.29) - NEO-HYCS (2003.9.29)
. NEO-AEG PROGBK3S (2003.10.6)
. NEO-AEG PROGBK2S (2003.10.16)
Cartridge colours:
==================
MVS cartridges were produced in different colours.
Known cartridge colours:
. Black
. Blue
. Green
. Grey
. Red
. Transparent
. Transparent Blue
. Transparent Green
. White
. Yellow
The above listed only covers SNK / PLAYMORE / SNKPLAYMORE PCBs. There also exists a
wide range of 'bootleg' PCBs.
Unofficial pcb's from NG:DEV.TEAM:
MVS CHA:
GIGA CHAR Board 1.0 Rev. A
GIGA CHAR Board 1.5 Rev. 0
GIGA CHAR Board 1.5 Rev. C
MVS PROG:
GIGA PROG Board 1.0 Rev. B
GIGA PROG Board 1.5 Rev. A
GIGA PROG Board 1.5 Rev. C
Unofficial pcb's from NEOBITZ:
MVS CHA:
CHARBITZ1 2013.12.01
MVS PROG:
PROGBITZ1 2013.12.01
Neo-Geo game PCB infos by Johnboy
MVS cart pinout:
================
Kindly submitted by Apollo69 (apollo69@columbus.rr.com)
=================================================================
CTRG1 CTRG2
=================================================================
GND = 01A | 01B = GND GND = 01A | 01B = GND
GND = 02A | 02B = GND GND = 02A | 02B = GND
P0 = 03A | 03B = P1 GND = 03A | 03B = GND
P2 = 04A | 04B = P3 GND = 04A | 04B = GND
P4 = 05A | 05B = P5 D0 = 05A | 05B = A1
P6 = 06A | 06B = P7 D1 = 06A | 06B = A2
P8 = 07A | 07B = P9 D2 = 07A | 07B = A3
P10 = 08A | 08B = P11 D3 = 08A | 08B = A4
P12 = 09A | 09B = P13 D4 = 09A | 09B = A5
P14 = 10A | 10B = P15 D5 = 10A | 10B = A6
P16 = 11A | 11B = P17 D6 = 11A | 11B = A7
P18 = 12A | 12B = P19 D7 = 12A | 12B = A8
P20 = 13A | 13B = P21 D8 = 13A | 13B = A9
P22 = 14A | 14B = P23 D9 = 14A | 14B = A10
PCK1B = 15A | 15B = 24M D10 = 15A | 15B = A11
PCK2B = 16A | 16B = 12M D11 = 16A | 16B = A12
2H1 = 17A | 17B = 8M D12 = 17A | 17B = A13
CA4 = 18A | 18B = RESET D13 = 18A | 18B = A14
CR0 = 19A | 19B = CR1 D14 = 19A | 19B = A15
CR2 = 20A | 20B = CR3 D15 = 20A | 20B = A16
CR4 = 21A | 21B = CR5 R/W = 21A | 21B = A17
CR6 = 22A | 22B = CR7 AS = 22A | 22B = A18
CR8 = 23A | 23B = CR9 ROMOEU = 23A | 23B = A19
CR10 = 24A | 24B = CR11 ROMOEL = 24A | 24B = 68KCLKB
CR12 = 25A | 25B = CR13 PORTOEU = 25A | 25B = ROMWAIT
CR14 = 26A | 26B = CR15 PORTOEL = 26A | 26B = PWAIT0
CR16 = 27A | 27B = CR17 PORTWEU = 27A | 27B = PWAIT1
CR18 = 28A | 28B = CR19 PORTWEL = 28A | 28B = PDTACT
VCC = 29A | 29B = VCC VCC = 29A | 29B = VCC
VCC = 30A | 30B = VCC VCC = 30A | 30B = VCC
VCC = 31A | 31B = VCC VCC = 31A | 31B = VCC
VCC = 32A | 32B = VCC VCC = 32A | 32B = VCC
CR20 = 33A | 33B = CR21 PORTADRS = 33A | 33B = ROMOE
CR22 = 34A | 34B = CR23 NC = 34A | 34B = 4MB
CR24 = 35A | 35B = CR25 NC = 35A | 35B = RESET
CR26 = 36A | 36B = CR27 NC = 36A | 36B = NC
CR28 = 37A | 37B = CR29 NC = 37A | 37B = NC
CR30 = 38A | 38B = CR31 NC = 38A | 38B = NC
NC = 39A | 39B = FIX00 NC = 39A | 39B = NC
NC = 40A | 40B = FIX01 NC = 40A | 40B = NC
NC = 41A | 41B = FIX02 NC = 41A | 41B = SDPAD0
SLOTCS = 42A | 42B = FIX03 SLOTCS = 42A | 42B = SDPAD1
SDA0 = 43A | 43B = FIX04 SDPA8 = 43A | 43B = SDPAD2
SDA1 = 44A | 44B = FIX05 SDPA9 = 44A | 44B = SDPAD3
SDA2 = 45A | 45B = FIX06 SDPA10 = 45A | 45B = SDPAD4
SDA3 = 46A | 46B = FIX07 SDPA11 = 46A | 46B = SDPAD5
SDA4 = 47A | 47B = SDRD0 SDPMPX = 47A | 47B = SDPAD6
SDA5 = 48A | 48B = SDRD1 SDPOE = 48A | 48B = SDPAD7
SDA6 = 49A | 49B = SDROM SDRA8 = 49A | 49B = SDRAD0
SDA7 = 50A | 50B = SDMRD SDRA9 = 50A | 50B = SDRAD1
SDA8 = 51A | 51B = SDD0 SDRA20 = 51A | 51B = SDRAD2
SDA9 = 52A | 52B = SDD1 SDRA21 = 52A | 52B = SDRAD3
SDA10 = 53A | 53B = SDD2 SDRA22 = 53A | 53B = SDRAD4
SDA11 = 54A | 54B = SDD3 SDRA23 = 54A | 54B = SDRAD5
SDA12 = 55A | 55B = SDD4 SDRMPX = 55A | 55B = SDRAD6
SDA13 = 56A | 56B = SDD5 SDROE = 56A | 56B = SDRAD7
SDA14 = 57A | 57B = SDD6 GND = 57A | 57B = GND
SDA15 = 58A | 58B = SDD7 GND = 58A | 58B = GND
GND = 59A | 59B = GND GND = 59A | 59B = GND
GND = 60A | 60B = GND GND = 60A | 60B = GND
CTRG1 (CHA) = Contains gfx data ('C' - rom), text layer data ('S' - rom) and sound driver ('M' - rom)
CTRG2 (PROG) = Contains sample data ('V' - rom) and program code ('P' - rom)
NOTE: On CTRG2-B, The "A" lines start at "A1". If you trace this on an
actual cart, you will see that this is actually "A0" (A0 - A18).
These are from a very hard to read copy of the schematics, so
I hope that I got the pin names correct.
Apollo69 10/19/99
Edge connector pinout:
======================
Kindly submitted by Apollo69 (apollo69@columbus.rr.com)
=================================================================
MVS JAMMA
=================================================================
GND = A | 1 = GND GND = A | 1 = GND
GND = B | 2 = GND GND = B | 2 = GND
+5V = C | 3 = +5V +5V = C | 3 = +5V
+5V = D | 4 = +5V +5V = D | 4 = +5V
N/C = E | 5 = N/C E | 5
+12V = F | 6 = +12V +12V = F | 6 = +12V
key = H | 7 = key key = H | 7 = key
counter 2 = J | 8 = counter 1 counter 2 = J | 8 = counter 1
lockout 2 = K | 9 = lockout 1 lockout 2 = K | 9 = lockout 1
L speaker = L | 10 = R speaker speaker- = L | 10 = speaker+
test = M | 11 = audio+ audio GND = M | 11
green = N | 12 = red green = N | 12 = red
sync = P | 13 = blue sync = P | 13 = blue
service = R | 14 = video GND service = R | 14 = video GND
coin 4 2P = S | 15 = coin 3 1P S | 15 = test
coin 2 2P = T | 16 = coin 1 1P coin 2 2P = T | 16 = coin 1 1P
2P start = U | 17 = 1P start 2P start = U | 17 = 1P start
2P up = V | 18 = 1P up 2P up = V | 18 = 1P up
2P down = W | 19 = 1P down 2P down = W | 19 = 1P down
2P left = X | 20 = 1P left 2P left = X | 20 = 1P left
2P right = Y | 21 = 1P right 2P right = Y | 21 = 1P right
2P A = Z | 22 = 1P A 2P A = Z | 22 = 1P A
2P B = a | 23 = 1P B 2P B = a | 23 = 1P B
2P C = b | 24 = 1P C 2P C = b | 24 = 1P C
2P D = c | 25 = 1P D 2P D = c | 25 = 1P D
sel down = d | 26 = sel up d | 26 = data input
GND = e | 27 = GND GND = e | 27 = GND
GND = f | 28 = GND GND = f | 28 = GND
Later JAMMA systems drop coin lockouts and audio ground.
Some JAMMA systems omit data input switch.
*****************************************************************************
Watchdog:
=========
The watchdog timer will reset the system after ~0.13 seconds.
By cgfm's research, exactly 3,244,030 cycles (based on 24MHz clock).
Newer games force a reset using the following code (this from kof99):
009CDA 203C 0003 0D40 MOVE.L #0x30D40,D0
009CE0 5380 SUBQ.L #1,D0
009CE2 64FC BCC.S *-0x2 [0x9CE0]
Note however that there is a valid code path after this loop.
The watchdog is used as a form of protection on a number of games,
previously this was implemented as a specific hack which locked a single
address of SRAM.
What actually happens is if the game doesn't find valid data in the
backup ram it will initialize it, then sit in a loop. The watchdog
should then reset the system while it is in this loop. If the watchdog
fails to reset the system the code will continue and set a value in
backup ram to indiate that the protection check has failed.
****************************************************************************
Mahjong Panel notes (2009-03 FP):
=================================
* In Service Mode menu with mahjong panel active, controls are as
follows:
A = select / up (for options)
B = down (for options)
C = go to previous menu
E = up (for menu entries)
F = down (for menu entries)
G = left (for options)
H = right (for options)
* These only work with Japanese BIOS, but I think it's not a bug: I
doubt other BIOS were programmed to be compatible with mahjong panels
****************************************************************************
AES driver (home version of MVS)
Current emulation status:
- Cartridges run.
- Riding Hero runs in slow-mo due to the unemulated comm link MCU in the cartridge.
In MAME if dip SW6 is set to ON to enable link play, it runs the same way!
On AES there are no dipswitches, and so it always tries to talk to the MCU.
****************************************************************************/
#include "emu.h"
#include "includes/neogeo.h"
#include "machine/nvram.h"
#include "machine/watchdog.h"
#include "softlist.h"
#include "speaker.h"
#include "irrmaze.lh"
#include "neogeo.lh"
#define LOG_VIDEO_SYSTEM (0)
class mvs_state : public ngarcade_base_state
{
public:
mvs_state(const machine_config &mconfig, device_type type, const char *tag)
: ngarcade_base_state(mconfig, type, tag)
{
}
// mainboard configurations
void cartslot_config(machine_config &config, unsigned count);
void cartslot_fixed(machine_config &config, char const *dflt);
void mv1fz(machine_config &config);
// fixed software configurations
void kizuna4p(machine_config &config);
void irrmaze(machine_config &config);
protected:
virtual void machine_start() override;
virtual void device_post_load() override;
virtual void output_strobe(uint8_t bits, uint8_t data) { }
virtual void set_outputs() { }
virtual DECLARE_WRITE8_MEMBER(io_control_w) override;
private:
uint8_t m_output_data;
uint8_t m_output_latch;
};
class mvs_led_state : public mvs_state
{
public:
mvs_led_state(const machine_config &mconfig, device_type type, const char *tag)
: mvs_state(mconfig, type, tag)
, m_digits(*this, "digit%u", 1U)
{
}
// mainboard configurations
void mv1(machine_config &config);
void mv1f(machine_config &config);
// fixed software configurations
void neobase(machine_config &config);
void fatfur2(machine_config &config);
void kof97oro(machine_config &config);
void kog(machine_config &config);
void kof98(machine_config &config);
void mslugx(machine_config &config);
void kof99(machine_config &config);
void kof99k(machine_config &config);
void garou(machine_config &config);
void garouh(machine_config &config);
void garoubl(machine_config &config);
void mslug3(machine_config &config);
void mslug3a(machine_config &config);
void mslug3h(machine_config &config);
void mslug3b6(machine_config &config);
void kof2000(machine_config &config);
void kof2000n(machine_config &config);
void zupapa(machine_config &config);
void sengoku3(machine_config &config);
void kof2001(machine_config &config);
void cthd2k3(machine_config &config);
void ct2k3sp(machine_config &config);
void ct2k3sa(machine_config &config);
void kof2002(machine_config &config);
void kof2002b(machine_config &config);
void kf2k2pls(machine_config &config);
void kf2k2mp(machine_config &config);
void kf2k2mp2(machine_config &config);
void kof10th(machine_config &config);
void kf10thep(machine_config &config);
void kf2k5uni(machine_config &config);
void kof2k4se(machine_config &config);
void mslug5(machine_config &config);
void ms5plus(machine_config &config);
void svc(machine_config &config);
void svcboot(machine_config &config);
void svcplus(machine_config &config);
void svcplusa(machine_config &config);
void svcsplus(machine_config &config);
void samsho5(machine_config &config);
void samsho5b(machine_config &config);
void kof2003(machine_config &config);
void kof2003h(machine_config &config);
void kf2k3bl(machine_config &config);
void kf2k3pl(machine_config &config);
void kf2k3upl(machine_config &config);
void samsh5sp(machine_config &config);
void neogeo_mj(machine_config &config);
void preisle2(machine_config &config);
void nitd(machine_config &config);
void s1945p(machine_config &config);
void lans2004(machine_config &config);
void pnyaa(machine_config &config);
void popbounc(machine_config &config);
void ganryu(machine_config &config);
void bangbead(machine_config &config);
void mslug4(machine_config &config);
void ms4plus(machine_config &config);
void rotd(machine_config &config);
void matrim(machine_config &config);
void matrimbl(machine_config &config);
void jockeygp(machine_config &config);
void vliner(machine_config &config);
void sbp(machine_config &config);
protected:
virtual void machine_start() override;
virtual void output_strobe(uint8_t bits, uint8_t data) override;
virtual void set_outputs() override;
void mv1_fixed(machine_config &config);
private:
output_finder<4> m_digits;
uint8_t m_led1_value;
uint8_t m_led2_value;
};
class mvs_led_el_state : public mvs_led_state
{
public:
mvs_led_el_state(const machine_config &mconfig, device_type type, const char *tag)
: mvs_led_state(mconfig, type, tag)
, m_lamps(*this, "lamp%u", 1U)
{
}
// mainboard configurations
void mv2f(machine_config &config);
void mv4f(machine_config &config);
void mv6f(machine_config &config);
protected:
virtual void machine_start() override;
virtual void output_strobe(uint8_t bits, uint8_t data) override;
virtual void set_outputs() override;
private:
output_finder<6> m_lamps;
uint8_t m_el_value;
};
class aes_state : public aes_base_state
{
public:
aes_state(const machine_config &mconfig, device_type type, const char *tag)
: aes_base_state(mconfig, type, tag)
{
}
void aes(machine_config &config);
protected:
virtual void machine_start() override;
virtual void device_post_load() override;
void aes_main_map(address_map &map);
};
/*************************************
*
* Main CPU interrupt generation
*
*************************************/
// The display counter is automatically reloaded with the load register contents on scanline 224,
// 1146 mclks from the rising edge of /HSYNC.
#define NEOGEO_VBLANK_RELOAD_HTIM (attotime::from_ticks(1146, NEOGEO_MASTER_CLOCK))
#define IRQ2CTRL_ENABLE (0x10)
#define IRQ2CTRL_LOAD_RELATIVE (0x20)
#define IRQ2CTRL_AUTOLOAD_VBLANK (0x40)
#define IRQ2CTRL_AUTOLOAD_REPEAT (0x80)
void neogeo_base_state::adjust_display_position_interrupt_timer()
{
attotime period = attotime::from_ticks((uint64_t)m_display_counter + 1, NEOGEO_PIXEL_CLOCK);
if (LOG_VIDEO_SYSTEM) logerror("adjust_display_position_interrupt_timer current y: %02x current x: %02x target y: %x target x: %x\n", m_screen->vpos(), m_screen->hpos(), (m_display_counter + 1) / NEOGEO_HTOTAL, (m_display_counter + 1) % NEOGEO_HTOTAL);
m_display_position_interrupt_timer->adjust(period);
}
void neogeo_base_state::set_display_position_interrupt_control(uint16_t data)
{
m_display_position_interrupt_control = data;
}
void neogeo_base_state::set_display_counter_msb(uint16_t data)
{
m_display_counter = (m_display_counter & 0x0000ffff) | ((uint32_t)data << 16);
if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", m_maincpu->pc(), m_display_counter);
}
void neogeo_base_state::set_display_counter_lsb(uint16_t data)
{
m_display_counter = (m_display_counter & 0xffff0000) | data;
if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", m_maincpu->pc(), m_display_counter);
if (m_display_position_interrupt_control & IRQ2CTRL_LOAD_RELATIVE)
{
if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_RELATIVE ");
adjust_display_position_interrupt_timer();
}
}
void neogeo_base_state::update_interrupts()
{
m_maincpu->set_input_line(3, m_irq3_pending ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(m_raster_level, m_display_position_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(m_vblank_level, m_vblank_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
}
void neogeo_base_state::acknowledge_interrupt(uint16_t data)
{
if (data & 0x01)
m_irq3_pending = 0;
if (data & 0x02)
m_display_position_interrupt_pending = 0;
if (data & 0x04)
m_vblank_interrupt_pending = 0;
update_interrupts();
}
TIMER_CALLBACK_MEMBER(neogeo_base_state::display_position_interrupt_callback)
{
if (LOG_VIDEO_SYSTEM) logerror("--- Scanline @ %d,%d\n", m_screen->vpos(), m_screen->hpos());
if (m_display_position_interrupt_control & IRQ2CTRL_ENABLE)
{
if (LOG_VIDEO_SYSTEM) logerror("*** Scanline interrupt (IRQ2) *** y: %02x x: %02x\n", m_screen->vpos(), m_screen->hpos());
m_display_position_interrupt_pending = 1;
update_interrupts();
}
if (m_display_position_interrupt_control & IRQ2CTRL_AUTOLOAD_REPEAT)
{
if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_REPEAT ");
adjust_display_position_interrupt_timer();
}
}
TIMER_CALLBACK_MEMBER(neogeo_base_state::display_position_vblank_callback)
{
if (m_display_position_interrupt_control & IRQ2CTRL_AUTOLOAD_VBLANK)
{
if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_VBLANK ");
adjust_display_position_interrupt_timer();
}
/* set timer for next screen */
m_display_position_vblank_timer->adjust(m_screen->time_until_pos(NEOGEO_VBSTART) + NEOGEO_VBLANK_RELOAD_HTIM);
}
TIMER_CALLBACK_MEMBER(neogeo_base_state::vblank_interrupt_callback)
{
if (LOG_VIDEO_SYSTEM) logerror("+++ VBLANK @ %d,%d\n", m_screen->vpos(), m_screen->hpos());
m_vblank_interrupt_pending = 1;
update_interrupts();
/* set timer for next screen */
m_vblank_interrupt_timer->adjust(m_screen->time_until_pos(NEOGEO_VBSTART) + NEOGEO_VBLANK_IRQ_HTIM);
}
void neogeo_base_state::create_interrupt_timers()
{
m_display_position_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_base_state::display_position_interrupt_callback),this));
m_display_position_vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_base_state::display_position_vblank_callback),this));
m_vblank_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_base_state::vblank_interrupt_callback),this));
}
void neogeo_base_state::start_interrupt_timers()
{
m_vblank_interrupt_timer->adjust(m_screen->time_until_pos(NEOGEO_VBSTART) + NEOGEO_VBLANK_IRQ_HTIM);
m_display_position_vblank_timer->adjust(m_screen->time_until_pos(NEOGEO_VBSTART) + NEOGEO_VBLANK_RELOAD_HTIM);
}
/*************************************
*
* Audio CPU interrupt generation
*
*************************************/
WRITE8_MEMBER(neogeo_base_state::audio_cpu_enable_nmi_w)
{
// out ($08) enables the nmi, out ($18) disables it
m_audionmi->in_w<1>(BIT(~offset, 4));
}
/*************************************
*
* Input ports / Controllers
*
*************************************/
READ16_MEMBER(ngarcade_base_state::in0_edge_r)
{
return (m_edge->in0_r(space, offset) << 8) | m_dsw->read();
}
READ16_MEMBER(ngarcade_base_state::in0_edge_joy_r)
{
return ((m_edge->in0_r(space, offset) & m_ctrl1->ctrl_r(space, offset)) << 8) | m_dsw->read();
}
READ16_MEMBER(ngarcade_base_state::in1_edge_r)
{
return (m_edge->in1_r(space, offset) << 8) | 0xff;
}
READ16_MEMBER(ngarcade_base_state::in1_edge_joy_r)
{
return ((m_edge->in1_r(space, offset) & m_ctrl2->ctrl_r(space, offset)) << 8) | 0xff;
}
CUSTOM_INPUT_MEMBER(ngarcade_base_state::startsel_edge_joy_r)
{
uint32_t ret = m_edge->read_start_sel() | ~0x05;
if (m_ctrl1)
ret &= (m_ctrl1->read_start_sel() << 0) | ~0x03;
if (m_ctrl2)
ret &= (m_ctrl2->read_start_sel() << 2) | ~0x0c;
return ret;
}
WRITE8_MEMBER(neogeo_base_state::io_control_w)
{
if ((offset & 0x38) == 0x00) // TODO: the mask is supposedly less restrictive on AES?
{
if (m_ctrl1) m_ctrl1->write_ctrlsel(data & 0x07);
if (m_ctrl2) m_ctrl2->write_ctrlsel((data >> 3) & 0x07);
if (m_edge) m_edge->write_ctrlsel(data & 0x3f); // FIXME: only MV-1B and MV-1C have this output
}
else
{
logerror("PC: %x Unmapped I/O control write. Offset: %x Data: %x\n", m_maincpu->pc(), offset, data);
}
}
WRITE8_MEMBER(ngarcade_base_state::io_control_w)
{
switch (offset & 0x78)
{
case 0x00:
neogeo_base_state::io_control_w(space, offset, data, mem_mask);
break;
case 0x28:
m_upd4990a->data_in_w(BIT(data, 0));
m_upd4990a->clk_w(BIT(data, 1));
m_upd4990a->stb_w(BIT(data, 2));
break;
case 0x30:
case 0x70:
if (BIT(offset, 1))
machine().bookkeeping().coin_lockout_w(BIT(offset, 0), BIT(offset, 6));
else
machine().bookkeeping().coin_counter_w(BIT(offset, 0), BIT(offset, 6));
break;
default:
logerror("PC: %x Unmapped I/O control write. Offset: %x Data: %x\n", m_maincpu->pc(), offset, data);
}
}
WRITE8_MEMBER(mvs_state::io_control_w)
{
switch (offset & 0x78)
{
case 0x10:
if (m_slots[data])
set_slot_idx(data);
break;
case 0x18:
// strobe on falling edge
output_strobe(m_output_latch & ~data, m_output_data);
m_output_latch = data;
set_outputs();
break;
case 0x20:
m_output_data = data;
break;
default:
ngarcade_base_state::io_control_w(space, offset, data, mem_mask);
}
}
WRITE8_MEMBER(neogeo_base_state::audio_command_w)
{
// glitches in s1945p without the boost_interleave here
m_soundlatch->write(data);
machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(50));
}
/*************************************
*
* Unmapped memory access
*
*************************************/
READ16_MEMBER(neogeo_base_state::unmapped_r)
{
uint16_t ret;
/* unmapped memory returns the last word on the data bus, which is almost always the opcode
of the next instruction due to prefetch */
/* prevent recursion */
if (m_recurse)
ret = 0xffff;
else
{
m_recurse = true;
ret = space.read_word(m_maincpu->pc());
m_recurse = false;
}
return ret;
}
/*************************************
*
* NVRAM (Save RAM)
*
*************************************/
WRITE_LINE_MEMBER(ngarcade_base_state::set_save_ram_unlock)
{
m_save_ram_unlocked = state;
}
WRITE16_MEMBER(ngarcade_base_state::save_ram_w)
{
if (m_save_ram_unlocked)
COMBINE_DATA(&m_save_ram[offset]);
}
/*************************************
*
* Memory card
*
*************************************/
CUSTOM_INPUT_MEMBER(neogeo_base_state::get_memcard_status)
{
// D0 and D1 are memcard 1 and 2 presence indicators, D2 indicates memcard
// write protect status (we are always write enabled)
return (!m_memcard || !m_memcard->present()) ? 0x07 : 0x00;
}
READ16_MEMBER(neogeo_base_state::memcard_r)
{
m_maincpu->eat_cycles(2); // insert waitstate
uint16_t ret;
if (m_memcard->present())
ret = m_memcard->read(space, offset) | 0xff00;
else
ret = 0xffff;
return ret;
}
WRITE16_MEMBER(neogeo_base_state::memcard_w)
{
m_maincpu->eat_cycles(2); // insert waitstate
if (ACCESSING_BITS_0_7)
{
if (m_memcard->present())
m_memcard->write(space, offset, data);
}
}
/*************************************
*
* Inter-CPU communications
*
*************************************/
CUSTOM_INPUT_MEMBER(neogeo_base_state::get_audio_result)
{
uint8_t ret = m_soundlatch2->read();
return ret;
}
/*************************************
*
* Audio CPU banking
*
*************************************/
READ8_MEMBER(neogeo_base_state::audio_cpu_bank_select_r)
{
m_bank_audio_cart[offset & 3]->set_entry(offset >> 8);
return 0;
}
/*************************************
*
* System control register
*
*************************************/
WRITE_LINE_MEMBER(neogeo_base_state::set_use_cart_vectors)
{
m_use_cart_vectors = state;
}
WRITE_LINE_MEMBER(neogeo_base_state::set_use_cart_audio)
{
m_use_cart_audio = state;
m_sprgen->neogeo_set_fixed_layer_source(state);
m_bank_audio_main->set_entry(m_use_cart_audio);
}
WRITE16_MEMBER(neogeo_base_state::write_banksel)
{
uint32_t len = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0) ? m_region_maincpu->bytes() : m_slots[m_curr_slot]->get_rom_size();
if ((len <= 0x100000) && (data & 0x07))
logerror("PC %06x: warning: bankswitch to %02x but no banks available\n", m_maincpu->pc(), data);
else
{
int bank = data & 0x07;
if ((bank + 1) * 0x100000 >= len)
{
logerror("PC %06x: warning: bankswitch to empty bank %02x\n", m_maincpu->pc(), data);
bank = 0;
}
uint8_t *ROM = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0) ? m_region_maincpu->base() : (uint8_t *)m_slots[m_curr_slot]->get_rom_base();
m_bank_base = (bank + 1) * 0x100000;
m_bank_cartridge->set_base(ROM + m_bank_base);
}
}
/*************************************
*
* LEDs
*
*************************************/
void mvs_led_state::set_outputs()
{
static constexpr uint8_t led_map[0x10] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x58,0x4c,0x62,0x69,0x78,0x00 };
// LED1
m_digits[0] = led_map[m_led1_value >> 4];
m_digits[1] = led_map[m_led1_value & 0x0f];
// LED2
m_digits[2] = led_map[m_led2_value >> 4];
m_digits[3] = led_map[m_led2_value & 0x0f];
mvs_state::set_outputs();
}
void mvs_led_el_state::set_outputs()
{
// EL
for (unsigned i = 0; 6U > i; ++i)
m_lamps[i] = m_el_value == i;
mvs_led_state::set_outputs();
}
void mvs_led_state::output_strobe(uint8_t bits, uint8_t data)
{
if (BIT(bits, 4))
m_led1_value = ~data;
if (BIT(bits, 5))
m_led2_value = ~data;
mvs_state::output_strobe(bits, data);
}
void mvs_led_el_state::output_strobe(uint8_t bits, uint8_t data)
{
if (BIT(bits, 3))
m_el_value = ~data & 0x07;
mvs_led_state::output_strobe(bits, data);
}
/*************************************
*
* Bankswitch passthrus for cart-specific
* handling (temporary)
* These are installed in set_slot_idx
*
*************************************/
// FIXME: These are a temporary workaround for slot-driven bankswitch with protected carts.
// A cleaner implementation is in progress.
WRITE16_MEMBER(neogeo_base_state::write_bankprot)
{
m_bank_base = m_slots[m_curr_slot]->get_bank_base(data);
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
WRITE16_MEMBER(neogeo_base_state::write_bankprot_pvc)
{
// write to cart ram
m_slots[m_curr_slot]->protection_w(space, offset, data, mem_mask);
// actual bankswitch
if (offset >= 0xff8)
{
m_bank_base = m_slots[m_curr_slot]->get_bank_base(data);
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
}
WRITE16_MEMBER(neogeo_base_state::write_bankprot_kf2k3bl)
{
// write to cart ram
m_slots[m_curr_slot]->protection_w(space, offset, data, mem_mask);
// actual bankswitch
if (offset == 0x1ff0/2 || offset == 0x1ff2/2)
{
m_bank_base = m_slots[m_curr_slot]->get_bank_base(data);
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
}
WRITE16_MEMBER(neogeo_base_state::write_bankprot_ms5p)
{
logerror("ms5plus bankswitch - offset: %06x PC %06x: set banking %04x\n", offset, m_maincpu->pc(), data);
if ((offset == 0) && (data == 0xa0))
{
m_bank_base = 0xa0;
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
else if (offset == 2)
{
m_bank_base = m_slots[m_curr_slot]->get_bank_base(data);
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
}
WRITE16_MEMBER(neogeo_base_state::write_bankprot_kof10th)
{
m_slots[m_curr_slot]->protection_w(space, offset, data, mem_mask);
if (offset == 0xffff0/2)
{
// Standard bankswitch
m_bank_base = m_slots[m_curr_slot]->get_bank_base(data);
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
}
READ16_MEMBER(neogeo_base_state::read_lorom_kof10th)
{
uint16_t* rom = (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_rom_size() > 0) ? m_slots[m_curr_slot]->get_rom_base() : (uint16_t*)m_region_maincpu->base();
if (offset + 0x80/2 >= 0x10000/2)
offset += m_slots[m_curr_slot]->get_special_bank();
return rom[offset + 0x80/2];
}
/*************************************
*
* Machine initialization
*
*************************************/
void neogeo_base_state::init_cpu()
{
uint8_t *ROM = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0) ? m_region_maincpu->base() : (uint8_t *)m_slots[m_curr_slot]->get_rom_base();
uint32_t len = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0) ? m_region_maincpu->bytes() : m_slots[m_curr_slot]->get_rom_size();
if (len > 0x100000)
m_bank_base = 0x100000;
else
m_bank_base = 0;
m_bank_cartridge->set_base(ROM + m_bank_base);
}
void neogeo_base_state::init_audio()
{
uint8_t *ROM = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_audio_size() == 0) ? m_region_audiocpu->base() : m_slots[m_curr_slot]->get_audio_base();
uint32_t len = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_audio_size() == 0) ? m_region_audiocpu->bytes() : m_slots[m_curr_slot]->get_audio_size();
uint32_t address_mask;
/* audio bios/cartridge selection */
m_bank_audio_main->configure_entry(0, (m_region_audiobios != nullptr) ? m_region_audiobios->base() : ROM); /* on hardware with no SM1 ROM, the cart ROM is always enabled */
m_bank_audio_main->configure_entry(1, ROM);
m_bank_audio_main->set_entry(1);
/* audio banking */
m_bank_audio_cart[0] = membank("audio_f000");
m_bank_audio_cart[1] = membank("audio_e000");
m_bank_audio_cart[2] = membank("audio_c000");
m_bank_audio_cart[3] = membank("audio_8000");
address_mask = (len - 0x10000 - 1) & 0x3ffff;
for (int region = 0; region < 4; region++)
{
for (int bank = 0xff; bank >= 0; bank--)
{
uint32_t bank_address = 0x10000 + ((bank << (11 + region)) & address_mask);
m_bank_audio_cart[region]->configure_entry(bank, &ROM[bank_address]);
}
}
// set initial audio banks - THIS IS A HACK
// Z80 banking is handled by the NEO-ZMC chip in the cartridge
// (in later cartridges, by multifunction banking/protection chips that implement the same bank scheme)
// On the real chip, initial banks are all 0.
// However, early cartridges with less than 64KB of Z80 code and data don't have ROM banking at all.
// These initial bank settings are required so non-banked games will work until we identify them
// and use a different Z80 address map for them.
m_bank_audio_cart[0]->set_entry(0x1e);
m_bank_audio_cart[1]->set_entry(0x0e);
m_bank_audio_cart[2]->set_entry(0x06);
m_bank_audio_cart[3]->set_entry(0x02);
}
void neogeo_base_state::init_ym()
{
// Resetting a sound device causes the core to update() it and generate samples if it's not up to date.
m_ym->reset();
address_space &adpcm_a_space = m_ym->space(0);
adpcm_a_space.unmap_readwrite(0x000000, 0xffffff);
if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ym_size())
adpcm_a_space.install_rom(0, m_slots[m_curr_slot]->get_ym_size() - 1, m_slots[m_curr_slot]->get_ym_base());
address_space &adpcm_b_space = m_ym->space(1);
adpcm_b_space.unmap_readwrite(0x000000, 0xffffff);
if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ymdelta_size())
adpcm_b_space.install_rom(0, m_slots[m_curr_slot]->get_ymdelta_size() - 1, m_slots[m_curr_slot]->get_ymdelta_base());
else if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ym_size())
adpcm_b_space.install_rom(0, m_slots[m_curr_slot]->get_ym_size() - 1, m_slots[m_curr_slot]->get_ym_base());
}
void neogeo_base_state::init_sprites()
{
if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_sprites_size() > 0)
{
m_sprgen->set_sprite_region(m_slots[m_curr_slot]->get_sprites_base(), m_slots[m_curr_slot]->get_sprites_size());
m_sprgen->set_fixed_regions(m_slots[m_curr_slot]->get_fixed_base(), m_slots[m_curr_slot]->get_fixed_size(), m_region_fixedbios);
if (!m_slots[m_curr_slot]->user_loadable())
m_sprgen->optimize_sprite_data();
else
m_sprgen->set_optimized_sprite_data(m_slots[m_curr_slot]->get_sprites_opt_base(), m_slots[m_curr_slot]->get_sprites_opt_size() - 1);
m_sprgen->m_fixed_layer_bank_type = m_slots[m_curr_slot]->get_fixed_bank_type();
}
else
{
m_sprgen->set_sprite_region(m_region_sprites->base(), m_region_sprites->bytes());
m_sprgen->set_fixed_regions(m_region_fixed->base(), m_region_fixed->bytes(), m_region_fixedbios);
}
}
void neogeo_base_state::set_slot_idx(int slot)
{
if (slot != m_curr_slot)
{
address_space &space = m_maincpu->space(AS_PROGRAM);
m_curr_slot = slot;
m_bank_base = 0;
if (!m_slots[m_curr_slot]->user_loadable())
m_slots[m_curr_slot]->late_decrypt_all();
// unmap any handler that previous carts could have installed
space.unmap_readwrite(0x000080, 0x0fffff);
space.unmap_readwrite(0x200000, 0x2fffff);
if (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0)
space.install_rom(0x000080, 0x0fffff, (uint16_t *)m_region_maincpu->base() + 0x80/2);
else
space.install_rom(0x000080, 0x0fffff, (uint16_t *)m_slots[m_curr_slot]->get_rom_base() + 0x80/2);
space.install_read_bank(0x200000, 0x2fffff, "cartridge");
space.install_write_handler(0x2ffff0, 0x2fffff, write16_delegate(FUNC(neogeo_base_state::write_banksel),this));
m_bank_cartridge = membank("cartridge");
init_cpu();
init_audio();
m_audiocpu->reset(); // svc have no sound if in higher slots without this?
init_ym();
init_sprites();
if (!m_slots[m_curr_slot]->user_loadable())
m_slots[m_curr_slot]->set_cart_type(m_slots[m_curr_slot]->default_option());
int type = m_slots[m_curr_slot]->get_type();
switch (type)
{
case NEOGEO_FATFURY2:
space.install_readwrite_handler(0x200000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_cart_slot_device::protection_w),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_KOF98:
space.install_read_handler(0x00100, 0x00103, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_write_handler(0x20aaaa, 0x20aaab, write16_delegate(FUNC(neogeo_cart_slot_device::protection_w),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_MSLUGX:
space.install_readwrite_handler(0x2fffe0, 0x2fffef, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_cart_slot_device::protection_w),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_KOF99:
// addon_r here gives SMA random number
space.install_write_handler(0x2ffff0, 0x2ffff1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this));
space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2ffff8, 0x2ffff9, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2ffffa, 0x2ffffb, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_GAROU:
// addon_r here gives SMA random number
space.install_write_handler(0x2fffc0, 0x2fffc1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this));
space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2fffcc, 0x2fffcd, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2ffff0, 0x2ffff1, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_GAROUH:
// addon_r here gives SMA random number
space.install_write_handler(0x2fffc0, 0x2fffc1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this));
space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2fffcc, 0x2fffcd, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2ffff0, 0x2ffff1, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_MSLUG3:
case NEOGEO_MSLUG3A:
space.install_write_handler(0x2fffe4, 0x2fffe5, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this));
space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
//space.install_read_handler(0x2ffff8, 0x2ffff9, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
//space.install_read_handler(0x2ffffa, 0x2ffffb, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_KOF2K:
// addon_r here gives SMA random number
space.install_write_handler(0x2fffec, 0x2fffed, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this));
space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2fffd8, 0x2fffd9, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2fffda, 0x2fffdb, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_MSLUG5:
case NEOGEO_SVC:
case NEOGEO_KOF2K3:
case NEOGEO_KOF2K3H:
case NEOGEO_SVCBOOT:
case NEOGEO_SVCSPLUS:
space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_pvc),this));
break;
case NEOGEO_CTHD2K3:
case NEOGEO_CT2K3SP:
space.install_write_handler(0x2ffff0, 0x2ffff1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this));
break;
case NEOGEO_MSLUG5P:
space.install_readwrite_handler(0x2ffff0, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_ms5p),this));
break;
case NEOGEO_KOG:
space.install_read_handler(0x0ffffe, 0x0fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_KOF2K3B:
case NEOGEO_KOF2K3UP:
// addon_r here gives m_overlay member from bootleg protection (possibly hack?)
space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_kf2k3bl),this));
space.install_read_handler(0x58196, 0x58197, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_KOF2K3P:
space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_kf2k3bl),this));
break;
case NEOGEO_SBP:
// there seems to be a protection device living around here..
// if you nibble swap the data in the rom the game will boot
// there are also writes to 0x1080..
//
// other stuff going on as well tho, the main overlay is still missing, and p1 inputs don't work
space.install_readwrite_handler(0x00200, 0x001fff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_cart_slot_device::protection_w),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_KOF10TH:
// addon_r here reads from ram2 bank
space.install_read_handler(0x000080, 0x0dffff, read16_delegate(FUNC(neogeo_base_state::read_lorom_kof10th),this));
space.install_read_handler(0x0e0000, 0x0fffff, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
space.install_read_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
// REVIEW ME: we might possibly need to split this, by adding further write handlers
space.install_write_handler(0x200000, 0x2fffff, write16_delegate(FUNC(neogeo_base_state::write_bankprot_kof10th),this));
break;
case NEOGEO_JOCKEYGP:
space.install_readwrite_handler(0x200000, 0x201fff, read16_delegate(FUNC(neogeo_cart_slot_device::ram_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_cart_slot_device::ram_w),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
break;
case NEOGEO_VLINER:
space.install_readwrite_handler(0x200000, 0x201fff, read16_delegate(FUNC(neogeo_cart_slot_device::ram_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_cart_slot_device::ram_w),(neogeo_cart_slot_device*)m_slots[m_curr_slot]));
// custom input handling... install it here for the moment.
space.install_read_port(0x300000, 0x300001, 0x01ff7e, "DSW");
space.install_read_port(0x280000, 0x280001, "IN5");
space.install_read_port(0x2c0000, 0x2c0001, "IN6");
break;
}
}
}
/*************************************
*
* Machine start
*
*************************************/
void neogeo_base_state::machine_start()
{
m_use_cart_vectors = 0;
create_interrupt_timers();
/* irq levels for MVS / AES */
m_vblank_level = 1;
m_raster_level = 2;
/* start with an IRQ3 - but NOT on a reset */
m_irq3_pending = 1;
/* register state save */
save_item(NAME(m_display_position_interrupt_control));
save_item(NAME(m_display_counter));
save_item(NAME(m_vblank_interrupt_pending));
save_item(NAME(m_display_position_interrupt_pending));
save_item(NAME(m_irq3_pending));
save_item(NAME(m_curr_slot));
save_item(NAME(m_bank_base));
save_item(NAME(m_use_cart_vectors));
save_item(NAME(m_use_cart_audio));
}
void ngarcade_base_state::machine_start()
{
neogeo_base_state::machine_start();
address_space &main_program_space(m_maincpu->space(AS_PROGRAM));
if (m_ctrl1)
main_program_space.install_read_handler(0x300000, 0x300001, 0, 0x01ff7e, 0, read16_delegate(FUNC(ngarcade_base_state::in0_edge_joy_r), this));
else if (m_edge)
main_program_space.install_read_handler(0x300000, 0x300001, 0, 0x01ff7e, 0, read16_delegate(FUNC(ngarcade_base_state::in0_edge_r), this));
if (m_ctrl2)
main_program_space.install_read_handler(0x340000, 0x340001, 0, 0x01fffe, 0, read16_delegate(FUNC(ngarcade_base_state::in1_edge_joy_r), this));
else if (m_edge)
main_program_space.install_read_handler(0x340000, 0x340001, 0, 0x01fffe, 0, read16_delegate(FUNC(ngarcade_base_state::in1_edge_r), this));
if (m_memcard)
{
main_program_space.unmap_readwrite(0x800000, 0x800fff);
main_program_space.install_readwrite_handler(0x800000, 0x800fff, read16_delegate(FUNC(ngarcade_base_state::memcard_r), this), write16_delegate(FUNC(ngarcade_base_state::memcard_w), this));
}
// enable rtc and serial mode
m_upd4990a->cs_w(1);
m_upd4990a->oe_w(1);
m_upd4990a->c0_w(1);
m_upd4990a->c1_w(1);
m_upd4990a->c2_w(1);
save_item(NAME(m_save_ram_unlocked));
}
void mvs_state::machine_start()
{
ngarcade_base_state::machine_start();
m_sprgen->m_fixed_layer_bank_type = 0;
m_curr_slot = -1;
set_slot_idx(0);
save_item(NAME(m_output_data));
save_item(NAME(m_output_latch));
}
void mvs_led_state::machine_start()
{
mvs_state::machine_start();
m_digits.resolve();
save_item(NAME(m_led1_value));
save_item(NAME(m_led2_value));
}
void mvs_led_el_state::machine_start()
{
mvs_led_state::machine_start();
m_lamps.resolve();
save_item(NAME(m_el_value));
}
void neogeo_base_state::device_post_load()
{
m_bank_audio_main->set_entry(m_use_cart_audio);
set_pens();
}
void mvs_state::device_post_load()
{
ngarcade_base_state::device_post_load();
set_outputs();
if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_rom_size() > 0)
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
/*************************************
*
* Machine reset
*
*************************************/
void neogeo_base_state::machine_reset()
{
// disable audiocpu NMI
m_audionmi->in_w<1>(0);
m_soundlatch->acknowledge_w();
start_interrupt_timers();
// trigger the IRQ3 that was set by MACHINE_START
update_interrupts();
m_recurse = false;
}
void ngarcade_base_state::machine_reset()
{
neogeo_base_state::machine_reset();
machine().bookkeeping().coin_lockout_w(0, 1);
machine().bookkeeping().coin_lockout_w(1, 1);
}
/*************************************
*
* Main CPU memory handlers
*
*************************************/
READ16_MEMBER(neogeo_base_state::banked_vectors_r)
{
if (!m_use_cart_vectors)
{
uint16_t* bios = (uint16_t*)m_region_mainbios->base();
return bios[offset];
}
else
{
uint16_t* rom = (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_rom_size() > 0) ? m_slots[m_curr_slot]->get_rom_base() : (uint16_t*)m_region_maincpu->base();
return rom[offset];
}
}
/*************************************
*
* Main CPU memory handlers
*
*************************************/
void neogeo_base_state::base_main_map(address_map &map)
{
map(0x320000, 0x320000).mirror(0x01fffe).w(FUNC(neogeo_base_state::audio_command_w));
map(0x360000, 0x37ffff).r(FUNC(neogeo_base_state::unmapped_r));
map(0x380000, 0x3800ff).mirror(0x01ff00).w(FUNC(neogeo_base_state::io_control_w)).umask16(0x00ff);
map(0x3a0000, 0x3a001f).mirror(0x01ffe0).r(FUNC(neogeo_base_state::unmapped_r));
map(0x3a0000, 0x3a001f).mirror(0x01ffe0).w("systemlatch", FUNC(hc259_device::write_a3)).umask16(0x00ff); // BITW1 (system control registers)
map(0x3c0000, 0x3c0007).mirror(0x01fff8).r(FUNC(neogeo_base_state::video_register_r));
map(0x3c0000, 0x3c000f).mirror(0x01fff0).w(FUNC(neogeo_base_state::video_register_w));
map(0x3e0000, 0x3fffff).r(FUNC(neogeo_base_state::unmapped_r));
map(0x400000, 0x401fff).mirror(0x3fe000).rw(FUNC(neogeo_base_state::paletteram_r), FUNC(neogeo_base_state::paletteram_w));
}
void ngarcade_base_state::neogeo_main_map(address_map &map)
{
base_main_map(map);
map(0x000000, 0x00007f).r(FUNC(ngarcade_base_state::banked_vectors_r));
map(0x100000, 0x10ffff).mirror(0x0f0000).ram();
// some games have protection devices in the 0x200000 region, it appears to map to cart space, not surprising, the ROM is read here too
map(0x300001, 0x300001).mirror(0x01fffe).w("watchdog", FUNC(watchdog_timer_device::reset_w));
map(0x300080, 0x300081).mirror(0x01ff7e).portr("TEST");
map(0x320000, 0x320001).mirror(0x01fffe).portr("AUDIO/COIN");
map(0x380000, 0x380001).mirror(0x01fffe).portr("SYSTEM");
map(0x800000, 0x800fff).r(FUNC(ngarcade_base_state::unmapped_r)); // memory card mapped here if present
map(0xc00000, 0xc1ffff).mirror(0x0e0000).rom().region("mainbios", 0);
map(0xd00000, 0xd0ffff).mirror(0x0f0000).ram().w(FUNC(ngarcade_base_state::save_ram_w)).share("saveram");
map(0xe00000, 0xffffff).r(FUNC(ngarcade_base_state::unmapped_r));
}
READ16_MEMBER(aes_base_state::aes_in2_r)
{
uint32_t ret = m_io_in2->read() & 0xf0ff;
ret |= ((m_ctrl1->read_start_sel() & 0x03) << 8) | ((m_ctrl2->read_start_sel() & 0x03) << 10);
return ret;
}
void aes_base_state::aes_base_main_map(address_map &map)
{
base_main_map(map);
map(0x300000, 0x300000).mirror(0x01fffe).r(m_ctrl1, FUNC(neogeo_control_port_device::ctrl_r));
map(0x320000, 0x320001).mirror(0x01fffe).portr("AUDIO");
map(0x340000, 0x340000).mirror(0x01fffe).r(m_ctrl2, FUNC(neogeo_control_port_device::ctrl_r));
map(0x380000, 0x380001).mirror(0x01fffe).r(FUNC(aes_base_state::aes_in2_r));
}
void aes_state::aes_main_map(address_map &map)
{
aes_base_main_map(map);
map(0x000000, 0x00007f).r(FUNC(aes_state::banked_vectors_r));
map(0x100000, 0x10ffff).mirror(0x0f0000).ram();
// some games have protection devices in the 0x200000 region, it appears to map to cart space, not surprising, the ROM is read here too
map(0x800000, 0x800fff).rw(FUNC(aes_state::memcard_r), FUNC(aes_state::memcard_w));
map(0xc00000, 0xc1ffff).mirror(0x0e0000).rom().region("mainbios", 0);
map(0xd00000, 0xffffff).r(FUNC(aes_state::unmapped_r));
}
/*************************************
*
* Audio CPU memory handlers
*
*************************************/
void neogeo_base_state::audio_map(address_map &map)
{
map(0x0000, 0x7fff).bankr("audio_main");
map(0x8000, 0xbfff).bankr("audio_8000");
map(0xc000, 0xdfff).bankr("audio_c000");
map(0xe000, 0xefff).bankr("audio_e000");
map(0xf000, 0xf7ff).bankr("audio_f000");
map(0xf800, 0xffff).ram();
}
/*************************************
*
* Audio CPU port handlers
*
*************************************/
void neogeo_base_state::audio_io_map(address_map &map)
{
map(0x00, 0x00).mirror(0xff00).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::clear_w));
map(0x04, 0x07).mirror(0xff00).rw(m_ym, FUNC(ym2610_device::read), FUNC(ym2610_device::write));
map(0x08, 0x08).mirror(0xff00).select(0x0010).w(FUNC(neogeo_base_state::audio_cpu_enable_nmi_w));
map(0x08, 0x0b).mirror(0x00f0).select(0xff00).r(FUNC(neogeo_base_state::audio_cpu_bank_select_r));
map(0x0c, 0x0c).mirror(0xff00).w(m_soundlatch2, FUNC(generic_latch_8_device::write));
}
/*************************************
*
* Standard Neo-Geo DIPs and
* input port definition
*
*************************************/
INPUT_PORTS_START( neogeo )
PORT_START("DSW")
PORT_DIPNAME( 0x01, 0x01, "Setting Mode" ) PORT_DIPLOCATION("SW:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW:2")
PORT_DIPSETTING( 0x02, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x00, "VS Mode" )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Controller ) ) PORT_DIPLOCATION("SW:3")
PORT_DIPSETTING( 0x04, DEF_STR( Joystick ) )
PORT_DIPSETTING( 0x00, "Mahjong Panel" )
PORT_DIPNAME( 0x18, 0x18, "COMM Setting (Cabinet No.)" ) PORT_DIPLOCATION("SW:4,5")
PORT_DIPSETTING( 0x18, "1" )
PORT_DIPSETTING( 0x10, "2" )
PORT_DIPSETTING( 0x08, "3" )
PORT_DIPSETTING( 0x00, "4" )
PORT_DIPNAME( 0x20, 0x20, "COMM Setting (Link Enable)" ) PORT_DIPLOCATION("SW:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "Freeze" ) PORT_DIPLOCATION("SW:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("SYSTEM")
PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0f00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, ngarcade_base_state, startsel_edge_joy_r, nullptr)
PORT_BIT( 0x7000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state, get_memcard_status, nullptr)
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_CUSTOM ) // Hardware type (AES=0, MVS=1). Some games check this and show a piracy warning screen if the hardware and BIOS don't match
PORT_START("AUDIO/COIN")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) // coin 1 (combined) or P1 coin 1 (separate) for BIOS that supports it
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) // coin 2 (combined) or P2 coin 1 (separate) for BIOS that supports it
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x0018, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_CUSTOM ) // sense: 4-slot
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("upd4990a", upd1990a_device, tp_r)
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("upd4990a", upd1990a_device, data_out_r)
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state,get_audio_result, nullptr)
PORT_START("TEST")
PORT_BIT( 0x003f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_CUSTOM ) // sense: JAMMA
PORT_SERVICE_NO_TOGGLE( 0x0080, IP_ACTIVE_LOW )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
static INPUT_PORTS_START( neogeo_mvs )
PORT_INCLUDE( neogeo )
PORT_MODIFY("SYSTEM")
PORT_BIT( 0x0500, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, ngarcade_base_state, startsel_edge_joy_r, nullptr)
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Next Game") PORT_CODE(KEYCODE_3)
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Previous Game") PORT_CODE(KEYCODE_4)
PORT_MODIFY("AUDIO/COIN")
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN3 ) // P1 coin 2 (separate) for BIOS that supports it
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_COIN4 ) // P2 coin 2 (separate) for BIOS that supports it
PORT_MODIFY("TEST")
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_CUSTOM ) // sense: MVS
INPUT_PORTS_END
static INPUT_PORTS_START( neogeo_mvs6 )
PORT_INCLUDE( neogeo_mvs )
PORT_MODIFY("AUDIO/COIN")
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_CUSTOM ) // sense: 6-slot
INPUT_PORTS_END
INPUT_PORTS_START( aes )
PORT_START("IN2")
PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED )
// Start & Select are read from controller slot device
PORT_BIT( 0x7000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state, get_memcard_status, nullptr)
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) /* Hardware type (AES=0, MVS=1) Some games check this and show a piracy warning screen if the hardware and BIOS don't match */
PORT_START("AUDIO")
PORT_BIT( 0x0007, IP_ACTIVE_HIGH, IPT_UNUSED ) /* AES has no coin slots, it's a console */
PORT_BIT( 0x0018, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* what is this? Universe BIOS uses these bits to detect MVS or AES hardware */
PORT_BIT( 0x00e0, IP_ACTIVE_HIGH, IPT_UNUSED ) /* AES has no upd4990a */
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state, get_audio_result, nullptr)
PORT_START("JP") // JP1 and JP2 are jumpers or solderpads depending on AES board revision, intended for use on the Development BIOS
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Short JP1 (Debug Monitor)") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, aes_base_state, aes_jp1, 0)
// PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) // what is JP2 for? somehow related to system reset, disable watchdog?
INPUT_PORTS_END
INPUT_CHANGED_MEMBER(aes_base_state::aes_jp1)
{
// Shorting JP1 causes a 68000 /BERR (Bus Error). On Dev Bios, this pops up the debug monitor.
if (newval)
m_maincpu->set_input_line(M68K_LINE_BUSERROR, HOLD_LINE);
}
/*************************************
*
* Machine driver
*
*************************************/
void neogeo_base_state::neogeo_base(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, NEOGEO_MAIN_CPU_CLOCK);
Z80(config, m_audiocpu, NEOGEO_AUDIO_CPU_CLOCK);
m_audiocpu->set_addrmap(AS_PROGRAM, &neogeo_base_state::audio_map);
m_audiocpu->set_addrmap(AS_IO, &neogeo_base_state::audio_io_map);
HC259(config, m_systemlatch);
m_systemlatch->q_out_cb<0>().set(FUNC(neogeo_base_state::set_screen_shadow));
m_systemlatch->q_out_cb<1>().set(FUNC(neogeo_base_state::set_use_cart_vectors));
m_systemlatch->q_out_cb<2>().set_nop(); // memory card 1: write enable/disable
m_systemlatch->q_out_cb<3>().set_nop(); // memory card 2: write disable/enable
m_systemlatch->q_out_cb<4>().set_nop(); // memory card: register select enable/set to normal (what does it mean?)
m_systemlatch->q_out_cb<7>().set(FUNC(neogeo_base_state::set_palette_bank));
/* video hardware */
config.set_default_layout(layout_neogeo);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART);
m_screen->set_screen_update(FUNC(neogeo_base_state::screen_update));
/* 4096 colors * two banks * normal and shadow */
PALETTE(config, m_palette, palette_device::BLACK, 4096*2*2);
NEOGEO_SPRITE_OPTIMZIED(config, m_sprgen, 0).set_screen(m_screen);
/* audio hardware */
INPUT_MERGER_ALL_HIGH(config, m_audionmi);
m_audionmi->output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->set_separate_acknowledge(false);
m_soundlatch->data_pending_callback().set(m_audionmi, FUNC(input_merger_device::in_w<0>));
GENERIC_LATCH_8(config, m_soundlatch2);
YM2610(config, m_ym, NEOGEO_YM2610_CLOCK);
m_ym->irq_handler().set_inputline(m_audiocpu, 0);
}
void neogeo_base_state::neogeo_stereo(machine_config &config)
{
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
m_ym->add_route(0, "lspeaker", 0.28);
m_ym->add_route(0, "rspeaker", 0.28);
m_ym->add_route(1, "lspeaker", 0.98);
m_ym->add_route(2, "rspeaker", 0.98);
}
void ngarcade_base_state::neogeo_arcade(machine_config &config)
{
neogeo_base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &ngarcade_base_state::neogeo_main_map);
m_systemlatch->q_out_cb<5>().set(FUNC(ngarcade_base_state::set_use_cart_audio));
m_systemlatch->q_out_cb<6>().set(FUNC(ngarcade_base_state::set_save_ram_unlock));
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_ticks(3244030, NEOGEO_MASTER_CLOCK));
UPD4990A(config, m_upd4990a);
NVRAM(config, "saveram", nvram_device::DEFAULT_ALL_0);
}
void ngarcade_base_state::neogeo_mono(machine_config &config)
{
SPEAKER(config, "speaker").front_center();
m_ym->add_route(0, "speaker", 0.28);
m_ym->add_route(1, "speaker", 0.49);
m_ym->add_route(2, "speaker", 0.49);
}
// configurable slot
void mvs_state::cartslot_config(machine_config &config, unsigned count)
{
for (unsigned i = 0; i < count; i++)
NEOGEO_CART_SLOT(config, m_slots[i], neogeo_cart, nullptr);
}
void mvs_led_state::mv1(machine_config &config)
{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
cartslot_config(config, 1);
SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
}
void mvs_led_state::mv1f(machine_config &config)
{
neogeo_arcade(config);
neogeo_stereo(config);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
cartslot_config(config, 1);
SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
}
void mvs_state::mv1fz(machine_config &config)
{
neogeo_arcade(config);
neogeo_mono(config);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
cartslot_config(config, 1);
SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
}
void mvs_led_el_state::mv2f(machine_config &config)
{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
cartslot_config(config, 2);
SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
}
void mvs_led_el_state::mv4f(machine_config &config)
{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
cartslot_config(config, 4);
SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
}
void mvs_led_el_state::mv6f(machine_config &config)
{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
cartslot_config(config, 6);
SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
}
void mvs_led_state::mv1_fixed(machine_config &config)
{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", true);
NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", true);
NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", true);
}
void aes_base_state::machine_start()
{
neogeo_base_state::machine_start();
m_sprgen->m_fixed_layer_bank_type = 0;
}
void aes_state::machine_start()
{
aes_base_state::machine_start();
m_curr_slot = -1;
set_slot_idx(0);
// AES has no SFIX ROM and always uses the cartridge's
m_sprgen->neogeo_set_fixed_layer_source(1);
}
void aes_state::device_post_load()
{
aes_base_state::device_post_load();
if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_rom_size() > 0)
m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base);
}
void aes_state::aes(machine_config &config)
{
neogeo_base(config);
neogeo_stereo(config);
m_maincpu->set_addrmap(AS_PROGRAM, &aes_state::aes_main_map);
NG_MEMCARD(config, m_memcard, 0);
NEOGEO_CART_SLOT(config, m_slots[0], neogeo_cart, nullptr);
NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_controls, "joy", false);
NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_controls, "joy", false);
SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter("AES");
}
/*************************************
*
* Neo-Geo bios
*
*************************************
These are the known Bios Roms, Set options.bios to the one you want.
The Universe bios roms are supported because they're now used on enough PCBs
to be considered 'in active arcade use' rather than just homebrew hacks.
Some may be missing, there have been multiple CRCs reported for the same
revision in some cases (the Universe bios has an option for entering / displaying
a serial number; these should be noted as such if they're added).
Universe bios prior to version 1.3 was incompatible with AES.
The 'japan-hotel' BIOS is a dump of an MVS which could be found in some japanese
hotels. it is a custom MVS mobo which uses MVS carts but it hasn't jamma
connector and it's similar to a console with a coin mechanism, so it's a sort
of little coin op console installed in hotels.
The sp-45.sp1 bios is the latest 'ASIA' revision. Japan-j3.bin is the latest 'JAPAN'
revision. Both of them are also used in the sp-4x.sp1 bios of the Jamma PCB boards.
The current Neo-Geo MVS system set (SFIX/SM1/000-LO) used is from a NEO-MVH MV1FS board.
Other boards (MV1xx / MV2x / MV4x /MV6x) other system sets?
Zoom ROM (LO) 128K TC531000CP 1x 128Kx8 Zoom look-up table ROM
Fix ROM (SFIX) 128K 27C1000 1x 128Kx8 Text layer graphics ROM
Sound ROM (SM1) 128K 27C1000/23C1000 1x 128Kx8 Z80 program ROM
*/
#define ROM_LOAD16_WORD_SWAP_BIOS(bios,name,offset,length,hash) \
ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(bios))
#define NEOGEO_UNIBIOS(x) \
ROM_SYSTEM_BIOS( x+ 0, "unibios33", "Universe Bios (Hack, Ver. 3.3)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 0, "uni-bios_3_3.rom", 0x00000, 0x020000, CRC(24858466) SHA1(0ad92efb0c2338426635e0159d1f60b4473d0785) ) /* Universe Bios v3.3 (hack) */ \
ROM_SYSTEM_BIOS( x+ 1, "unibios32", "Universe Bios (Hack, Ver. 3.2)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 1, "uni-bios_3_2.rom", 0x00000, 0x020000, CRC(a4e8b9b3) SHA1(c92f18c3f1edda543d264ecd0ea915240e7c8258) ) /* Universe Bios v3.2 (hack) */ \
ROM_SYSTEM_BIOS( x+ 2, "unibios31", "Universe Bios (Hack, Ver. 3.1)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 2, "uni-bios_3_1.rom", 0x00000, 0x020000, CRC(0c58093f) SHA1(29329a3448c2505e1ff45ffa75e61e9693165153) ) /* Universe Bios v3.1 (hack) */ \
ROM_SYSTEM_BIOS( x+ 3, "unibios30", "Universe Bios (Hack, Ver. 3.0)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 3, "uni-bios_3_0.rom", 0x00000, 0x020000, CRC(a97c89a9) SHA1(97a5eff3b119062f10e31ad6f04fe4b90d366e7f) ) /* Universe Bios v3.0 (hack) */ \
ROM_SYSTEM_BIOS( x+ 4, "unibios23", "Universe Bios (Hack, Ver. 2.3)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 4, "uni-bios_2_3.rom", 0x00000, 0x020000, CRC(27664eb5) SHA1(5b02900a3ccf3df168bdcfc98458136fd2b92ac0) ) /* Universe Bios v2.3 (hack) */ \
ROM_SYSTEM_BIOS( x+ 5, "unibios23o", "Universe Bios (Hack, Ver. 2.3, older?)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 5, "uni-bios_2_3o.rom", 0x00000, 0x020000, CRC(601720ae) SHA1(1b8a72c720cdb5ee3f1d735bbcf447b09204b8d9) ) /* Universe Bios v2.3 (hack) alt version, withdrawn? */ \
ROM_SYSTEM_BIOS( x+ 6, "unibios22", "Universe Bios (Hack, Ver. 2.2)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 6, "uni-bios_2_2.rom", 0x00000, 0x020000, CRC(2d50996a) SHA1(5241a4fb0c63b1a23fd1da8efa9c9a9bd3b4279c) ) /* Universe Bios v2.2 (hack) */ \
ROM_SYSTEM_BIOS( x+ 7, "unibios21", "Universe Bios (Hack, Ver. 2.1)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 7, "uni-bios_2_1.rom", 0x00000, 0x020000, CRC(8dabf76b) SHA1(c23732c4491d966cf0373c65c83c7a4e88f0082c) ) /* Universe Bios v2.1 (hack) */ \
ROM_SYSTEM_BIOS( x+ 8, "unibios20", "Universe Bios (Hack, Ver. 2.0)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 8, "uni-bios_2_0.rom", 0x00000, 0x020000, CRC(0c12c2ad) SHA1(37bcd4d30f3892078b46841d895a6eff16dc921e) ) /* Universe Bios v2.0 (hack) */ \
ROM_SYSTEM_BIOS( x+ 9, "unibios13", "Universe Bios (Hack, Ver. 1.3)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+ 9, "uni-bios_1_3.rom", 0x00000, 0x020000, CRC(b24b44a0) SHA1(eca8851d30557b97c309a0d9f4a9d20e5b14af4e) ) /* Universe Bios v1.3 (hack) */
#define NEOGEO_UNIBIOS_1_2_AND_OLDER(x) \
ROM_SYSTEM_BIOS( x+10, "unibios12", "Universe Bios (Hack, Ver. 1.2)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+10, "uni-bios_1_2.rom", 0x00000, 0x020000, CRC(4fa698e9) SHA1(682e13ec1c42beaa2d04473967840c88fd52c75a) ) /* Universe Bios v1.2 (hack) */ \
ROM_SYSTEM_BIOS( x+11, "unibios12o", "Universe Bios (Hack, Ver. 1.2, older)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+11, "uni-bios_1_2o.rom", 0x00000, 0x020000, CRC(e19d3ce9) SHA1(af88ef837f44a3af2d7144bb46a37c8512b67770) ) /* Universe Bios v1.2 (hack) alt version */ \
ROM_SYSTEM_BIOS( x+12, "unibios11", "Universe Bios (Hack, Ver. 1.1)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+12, "uni-bios_1_1.rom", 0x00000, 0x020000, CRC(5dda0d84) SHA1(4153d533c02926a2577e49c32657214781ff29b7) ) /* Universe Bios v1.1 (hack) */ \
ROM_SYSTEM_BIOS( x+13, "unibios10", "Universe Bios (Hack, Ver. 1.0)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( x+13, "uni-bios_1_0.rom", 0x00000, 0x020000, CRC(0ce453a0) SHA1(3b4c0cd26c176fc6b26c3a2f95143dd478f6abf9) ) /* Universe Bios v1.0 (hack) */
/* The number shown in the top right corner (only displayed on the colour test in early versions) should be connected to the revision, the actual numbering / naming here is a mess, possibly due to upgrades where stickers weren't replaced
The colour of the outside of the test grid appears to be connected to the region / cabinet type (most regions have a single colour, but for the US there are multiple colours, which seem to indicate defaults / intended cabinet type)
the Cyan US sets will default to
Game Select: Free
Game Start Compulsion: Without
while all others default to
Game Select: Only When Credited
Game Start Compulsion: 30 seconds
They also allow you to set the continue price, rather than the Coin 2 rate (Coin 2 rate doesn't show up, even if you set Dipswitch to 'VS mode')
The Yellow bios ROM does not show the 'Winners Don't Use Drugs' logo for several earlier games (eg. Metal Slug, Neo Bomberman) but does still show other US specific screens (Parental Advisory)
Later games seem to be unaffected by this and show all screens regardless
*/
#define NEOGEO_BIOS \
ROM_REGION16_BE( 0x80000, "mainbios", 0 ) \
ROM_SYSTEM_BIOS( 0, "euro", "Europe MVS (Ver. 2)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 0, "sp-s2.sp1", 0x00000, 0x020000, CRC(9036d879) SHA1(4f5ed7105b7128794654ce82b51723e16e389543) ) /* 5 Dark Blue - Europe, 1 Slot, has also been found on 2 Slot and 4 Slot (the old hacks were designed for this one) */ \
ROM_SYSTEM_BIOS( 1, "euro-s1", "Europe MVS (Ver. 1)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 1, "sp-s.sp1", 0x00000, 0x020000, CRC(c7f2fa45) SHA1(09576ff20b4d6b365e78e6a5698ea450262697cd) ) /* 3 Dark Blue - Europe, 4 Slot */ \
ROM_SYSTEM_BIOS( 2, "asia-mv1c", "Asia NEO-MVH MV1C" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 2, "sp-45.sp1", 0x00000, 0x080000, CRC(03cc9f6a) SHA1(cdf1f49e3ff2bac528c21ed28449cf35b7957dc1) ) /* 6 Dark Blue - Latest Asia bios (MV1C - mask ROM) */ \
ROM_SYSTEM_BIOS( 3, "asia-mv1b", "Asia MV1B" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 3, "sp-s3.sp1", 0x00000, 0x020000, CRC(91b64be3) SHA1(720a3e20d26818632aedf2c2fd16c54f213543e1) ) /* 6 Dark Blue - Asia (MV1B) */ \
\
ROM_SYSTEM_BIOS( 4, "us", "US MVS (Ver. 2?)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 4, "sp-u2.sp1", 0x00000, 0x020000, CRC(e72943de) SHA1(5c6bba07d2ec8ac95776aa3511109f5e1e2e92eb) ) /* 5 Cyan - US, 2 Slot */ \
ROM_SYSTEM_BIOS( 5, "us-e", "US MVS (Ver. 1)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 5, "sp-e.sp1", 0x00000, 0x020000, CRC(2723a5b5) SHA1(5dbff7531cf04886cde3ef022fb5ca687573dcb8) ) /* 5 Yellow - US, 6 Slot (V5?) */ \
ROM_SYSTEM_BIOS( 6, "us-v2", "US MVS (4 slot, Ver 2)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 6, "sp1-u2", 0x00000, 0x020000, CRC(62f021f4) SHA1(62d372269e1b3161c64ae21123655a0a22ffd1bb) ) /* 3 Cyan - US, 4 slot - also seen with "v2" label*/ \
ROM_SYSTEM_BIOS( 7, "us-u4", "US MVS (U4)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 7, "sp1-u4.bin", 0x00000, 0x020000, CRC(1179a30f) SHA1(866817f47aa84d903d0b819d61f6ef356893d16a) ) /* 3 Green - 4 Slot (MV-4F) */ \
ROM_SYSTEM_BIOS( 8, "us-u3", "US MVS (U3)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 8, "sp1-u3.bin", 0x00000, 0x020000, CRC(2025b7a2) SHA1(73d774746196f377111cd7aa051cc8bb5dd948b3) ) /* 2 Green - 6 Slot */ \
\
ROM_SYSTEM_BIOS( 9, "japan", "Japan MVS (Ver. 3)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 9, "vs-bios.rom", 0x00000, 0x020000, CRC(f0e8f27d) SHA1(ecf01eda815909f1facec62abf3594eaa8d11075) ) /* 6 Red - Japan, Ver 6 VS Bios */ \
ROM_SYSTEM_BIOS( 10, "japan-s2", "Japan MVS (Ver. 2)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 10, "sp-j2.sp1", 0x00000, 0x020000, CRC(acede59c) SHA1(b6f97acd282fd7e94d9426078a90f059b5e9dd91) ) /* 5 Red - Japan, Older */ \
ROM_SYSTEM_BIOS( 11, "japan-s1", "Japan MVS (Ver. 1)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 11, "sp1.jipan.1024", 0x00000, 0x020000, CRC(9fb0abe4) SHA1(18a987ce2229df79a8cf6a84f968f0e42ce4e59d) ) /* 3 Red - Japan, Older */ \
ROM_SYSTEM_BIOS( 12, "japan-mv1b", "Japan MV1B" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 12, "japan-j3.bin", 0x00000, 0x020000, CRC(dff6d41f) SHA1(e92910e20092577a4523a6b39d578a71d4de7085) ) /* 6 Red - Latest Japan bios (MV1B) */ \
ROM_SYSTEM_BIOS( 13, "japan-j3a", "Japan MVS (J3, alt)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 13, "sp1-j3.bin", 0x00000, 0x020000, CRC(fbc6d469) SHA1(46b2b409b5b68869e367b40c846373623edb632a) ) /* 2 Red - 6 Slot */ \
ROM_SYSTEM_BIOS( 14, "japan-mv1c", "Japan NEO-MVH MV1C" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 14, "sp-j3.sp1", 0x00000, 0x080000, CRC(486cb450) SHA1(52c21ea817928904b80745a8c8d15cbad61e1dc1) ) /* 6 Red - Latest Japan bios (MV1C - mask ROM) */ \
\
ROM_SYSTEM_BIOS( 15, "japan-hotel", "Custom Japanese Hotel" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 15, "sp-1v1_3db8c.bin", 0x00000, 0x020000, CRC(162f0ebe) SHA1(fe1c6dd3dfcf97d960065b1bb46c1e11cb7bf271) ) /* 6 Red - 'rare MVS found in japanese hotels' shows v1.3 in test mode */ \
\
NEOGEO_UNIBIOS(16) \
NEOGEO_UNIBIOS_1_2_AND_OLDER(16)
#define NEO_BIOS_AUDIO_64K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x20000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x10000, hash ) \
ROM_RELOAD( 0x10000, 0x10000 )
#define NEO_BIOS_AUDIO_128K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x30000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x20000, hash ) \
ROM_RELOAD( 0x10000, 0x20000 )
#define NEO_BIOS_AUDIO_256K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x50000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x40000, hash ) \
ROM_RELOAD( 0x10000, 0x40000 )
#define NEO_BIOS_AUDIO_512K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x80000, hash ) \
ROM_RELOAD( 0x10000, 0x80000 )
#define NEO_BIOS_AUDIO_ENCRYPTED_128K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \
ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \
ROM_LOAD( name, 0x00000, 0x20000, hash )
#define NEO_BIOS_AUDIO_ENCRYPTED_256K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \
ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \
ROM_LOAD( name, 0x00000, 0x40000, hash )
#define NEO_BIOS_AUDIO_ENCRYPTED_512K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \
ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \
ROM_LOAD( name, 0x00000, 0x80000, hash )
#define NEO_SFIX_64K(name, hash) \
ROM_REGION( 0x20000, "cslot1:fixed", 0 ) \
ROM_LOAD( name, 0x000000, 0x10000, hash ) \
ROM_REGION( 0x20000, "fixedbios", 0 ) \
ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) ) \
ROM_Y_ZOOM
#define NEO_SFIX_128K(name, hash) \
ROM_REGION( 0x20000, "cslot1:fixed", 0 ) \
ROM_LOAD( name, 0x000000, 0x20000, hash ) \
ROM_REGION( 0x20000, "fixedbios", 0 ) \
ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) ) \
ROM_Y_ZOOM
#define ROM_Y_ZOOM \
ROM_REGION( 0x20000, "spritegen:zoomy", 0 ) \
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
// dummy entry for the dummy bios driver
ROM_START( neogeo )
NEOGEO_BIOS
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "audiobios", 0 )
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
ROM_REGION( 0x50000, "audiocpu", 0 )
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
ROM_Y_ZOOM
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "fixedbios", 0 )
ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) )
ROM_REGION( 0x100000, "sprites", ROMREGION_ERASEFF )
ROM_END
#define rom_ng_mv4f rom_neogeo
#define rom_ng_mv2f rom_neogeo
#define rom_ng_mv1 rom_neogeo
#define rom_ng_mv1f rom_neogeo
#define rom_ng_mv1fz rom_neogeo
ROM_START( aes )
ROM_REGION16_BE( 0x20000, "mainbios", 0 )
ROM_SYSTEM_BIOS( 0, "asia", "Asia AES" )
ROM_LOAD16_WORD_SWAP_BIOS( 0, "neo-epo.bin", 0x00000, 0x020000, CRC(d27a71f1) SHA1(1b3b22092f30c4d1b2c15f04d1670eb1e9fbea07) ) // AES Console (Asia?) Bios
ROM_SYSTEM_BIOS( 1, "japan", "Japan AES" )
ROM_LOAD16_WORD_SWAP_BIOS( 1, "neo-po.bin", 0x00000, 0x020000, CRC(16d0c132) SHA1(4e4a440cae46f3889d20234aebd7f8d5f522e22c) ) // AES Console (Japan) Bios
ROM_SYSTEM_BIOS( 2, "devel", "Development System ROM" )
ROM_LOAD16_WORD_SWAP_BIOS( 2, "neodebug.rom", 0x00000, 0x020000, CRC(698ebb7d) SHA1(081c49aa8cc7dad5939833dc1b18338321ea0a07) ) // Official debug (development) ROM, for home-use base board
NEOGEO_UNIBIOS(3)
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x90000, "audiocpu", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "spritegen:zoomy", 0 )
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
ROM_REGION( 0x900000, "sprites", ROMREGION_ERASEFF )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT
CONS( 1990, neogeo, 0, 0, mv6f, neogeo_mvs6, mvs_led_el_state, empty_init, "SNK", "Neo-Geo MV-6F", MACHINE_IS_BIOS_ROOT | MACHINE_SUPPORTS_SAVE )
CONS( 1990, ng_mv4f, neogeo, 0, mv4f, neogeo_mvs, mvs_led_el_state, empty_init, "SNK", "Neo-Geo MV-4F", MACHINE_SUPPORTS_SAVE )
CONS( 1990, ng_mv2f, neogeo, 0, mv2f, neogeo_mvs, mvs_led_el_state, empty_init, "SNK", "Neo-Geo MV-2F", MACHINE_SUPPORTS_SAVE )
CONS( 1990, ng_mv1, neogeo, 0, mv1, neogeo, mvs_led_state, empty_init, "SNK", "Neo-Geo MV-1", MACHINE_SUPPORTS_SAVE )
CONS( 1990, ng_mv1f, ng_mv1, 0, mv1f, neogeo, mvs_led_state, empty_init, "SNK", "Neo-Geo MV-1F", MACHINE_SUPPORTS_SAVE )
CONS( 1990, ng_mv1fz, ng_mv1, 0, mv1fz, neogeo, mvs_state, empty_init, "SNK", "Neo-Geo MV-1FZ", MACHINE_SUPPORTS_SAVE )
CONS( 1990, aes, 0, 0, aes, aes, aes_state, empty_init, "SNK", "Neo-Geo AES", MACHINE_SUPPORTS_SAVE )
// non-configurable slot (to be used for non-softlist sets, until we introduce some 'template' concept)
// a single cart in slot 1, with pre-defined cart type
void mvs_state::cartslot_fixed(machine_config &config, char const *dflt)
{
NEOGEO_CART_SLOT(config, m_slots[0], neogeo_cart, dflt).set_user_loadable(false);
}
// machine config for one-game fixed config, loaded without using softlists
void mvs_led_state::neobase(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "rom");
}
// used by fatfury2 & ssideki
void mvs_led_state::fatfur2(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "rom_fatfur2");
}
void mvs_state::kizuna4p(machine_config &config)
{
neogeo_arcade(config);
neogeo_mono(config);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge_fixed, "kiz4p", true);
cartslot_fixed(config, "rom");
}
void mvs_led_state::kof97oro(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kof97oro");
}
void mvs_led_state::kog(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kog");
}
void mvs_state::irrmaze(machine_config &config)
{
neogeo_arcade(config);
neogeo_mono(config);
NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge_fixed, "irrmaze", true);
config.set_default_layout(layout_irrmaze);
cartslot_fixed(config, "rom");
}
void mvs_led_state::kof98(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "rom_kof98");
}
void mvs_led_state::mslugx(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "rom_mslugx");
}
void mvs_led_state::kof99(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "sma_kof99");
}
void mvs_led_state::kof99k(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_kof99k");
}
void mvs_led_state::garou(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "sma_garou");
}
void mvs_led_state::garouh(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "sma_garouh");
}
void mvs_led_state::garoubl(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_garoubl");
}
void mvs_led_state::mslug3(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "sma_mslug3");
}
void mvs_led_state::mslug3a(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "sma_mslug3a");
}
void mvs_led_state::mslug3h(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_mslug3h");
}
void mvs_led_state::mslug3b6(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_mslug3b6");
}
void mvs_led_state::kof2000(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "sma_kof2k");
}
void mvs_led_state::kof2000n(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc50_kof2000n");
}
void mvs_led_state::zupapa(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_zupapa");
}
void mvs_led_state::sengoku3(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_sengoku3");
}
void mvs_led_state::kof2001(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc50_kof2001");
}
void mvs_led_state::cthd2k3(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_cthd2k3");
}
void mvs_led_state::ct2k3sp(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_ct2k3sp");
}
void mvs_led_state::ct2k3sa(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_ct2k3sa");
}
void mvs_led_state::kof2002(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "k2k2_kof2k2");
}
void mvs_led_state::kof2002b(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k2b");
}
void mvs_led_state::kf2k2pls(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "k2k2_kf2k2p");
}
void mvs_led_state::kf2k2mp(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k2mp");
}
void mvs_led_state::kf2k2mp2(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k2mp2");
}
void mvs_led_state::kof10th(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf10th");
}
void mvs_led_state::kf10thep(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf10thep");
}
void mvs_led_state::kf2k5uni(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k5uni");
}
void mvs_led_state::kof2k4se(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k4se");
}
void mvs_led_state::mslug5(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pvc_mslug5");
}
void mvs_led_state::ms5plus(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_ms5plus");
}
void mvs_led_state::svc(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pvc_svc");
}
void mvs_led_state::svcboot(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_svcboot");
}
void mvs_led_state::svcplus(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_svcplus");
}
void mvs_led_state::svcplusa(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_svcplusa");
}
void mvs_led_state::svcsplus(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_svcsplus");
}
void mvs_led_state::samsho5(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "k2k2_samsh5");
}
void mvs_led_state::samsho5b(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_samsho5b");
}
void mvs_led_state::kof2003(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pvc_kf2k3");
}
void mvs_led_state::kof2003h(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pvc_kf2k3h");
}
void mvs_led_state::kf2k3bl(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k3bl");
}
void mvs_led_state::kf2k3pl(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k3pl");
}
void mvs_led_state::kf2k3upl(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_kf2k3upl");
}
void mvs_led_state::samsh5sp(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "k2k2_sams5s");
}
void mvs_led_state::neogeo_mj(machine_config &config)
{
mv1_fixed(config);
set_default_bios_tag("japan");
// no joystick panel
m_edge->set_default_option("");
m_edge->set_fixed(false);
// P1 mahjong controller
m_ctrl1->set_default_option("mahjong");
m_ctrl1->set_fixed(false);
cartslot_fixed(config, "rom");
}
void mvs_led_state::preisle2(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_preisle2");
}
void mvs_led_state::nitd(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_nitd");
}
void mvs_led_state::s1945p(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_s1945p");
}
void mvs_led_state::lans2004(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_lans2004");
}
void mvs_led_state::pnyaa(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pcm2_pnyaa");
}
void mvs_led_state::popbounc(machine_config &config)
{
mv1_fixed(config);
NEOGEO_CTRL_EDGE_CONNECTOR(config.replace(), m_edge, neogeo_arc_edge_fixed, "dial", true);
cartslot_fixed(config, "rom");
}
void mvs_led_state::ganryu(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_ganryu");
}
void mvs_led_state::bangbead(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc42_bangbead");
}
void mvs_led_state::mslug4(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pcm2_mslug4");
}
void mvs_led_state::ms4plus(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pcm2_ms4p");
}
void mvs_led_state::rotd(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "pcm2_rotd");
}
void mvs_led_state::matrim(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "k2k2_matrim");
}
void mvs_led_state::matrimbl(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_matrimbl");
}
void mvs_led_state::jockeygp(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "cmc50_jockeygp");
}
void mvs_led_state::vliner(machine_config &config)
{
mv1_fixed(config);
// input handlers are installed at DRIVER_INIT...
config.device_remove("edge");
config.device_remove("ctrl1");
config.device_remove("ctrl2");
cartslot_fixed(config, "rom_vliner");
}
void mvs_led_state::sbp(machine_config &config)
{
mv1_fixed(config);
cartslot_fixed(config, "boot_sbp");
}
/*************************************
*
* Official sets
*
*************************************
About supported sets:
=====================
MVS carts (arcade) were released before the AES carts (home)
The actual codepath taken depends entirely on the BIOS rom, not the roms in the cartridge, which (with
a few exceptions) support both codepaths.
The initial AES releases are therefore later revisions of the game, often with bug fixes over the
initial MVS releases. It isn't uncommon for later production runs and bootlegs to use these newer sets,
so all of them are supported in MAME.
Likewise, because the MVS carts were released first (and were produced in higher numbers and generally
have a lower cost) it's not uncommon for AES units to operate with converted MVS carts, so, with the
exception of the sets that specifically lock out the AES mode* these sets are all equally suitable
for MESS.
* nitd, kof2001 (initial release has no AES code), and a number of the hacked bootlegs.
The 'MVS ONLY RELEASE' tagged sets were not officially released for the AES (home) system.
Information about this can be found at 'The NeoGeo Master List' (unofficial) - http://www.neo-geo.com
and the official NeoGeo museum - http://neogeomuseum.snkplaymore.co.jp/english/index.php
Several unofficial 'conversions' of these sets can be found across the internet.
For completeness sake: Some of these have sets have been released for the CD system.
M1 (sound driver) rom information:
==================================
. Many 'M1' roms contain mirrored data (64k mirrored or 128k mirrored).
. Found on several early sets (ID 0001 ~ 0045) and on the last sets (ID 0267 ~ 0272).
. This caused some confusion and incorrect rom sizes.
. Minimum 'M1' size is 1mbit, maximum size 4mbit.
. The remaining 64k 'M1' are marked BAD_DUMP.
S1 (text layer) rom information:
================================
. All 'S1' roms found on prom are 1mbit.
. The remainig 64k 'S1' are marked BAD_DUMP.
MULTI PLAY MODE:
================
The NeoGeo has three games which support MULTI PLAY MODE (Riding Hero / League Bowling / Trash Rally).
This allows you to 'link' 4 games (MVS) / 2 games (AES) using in game 'Multi-Play' option. To establish
a link between the carts you have to connect the carts to each other by a communicator cable. The communicatior
cable is a regular headphone cable with stereo pin jack. It has been reported that you can also 'link' MVS <-> AES.
All three games use a special PROG board for MULTI PLAY MODE support:
. Riding Hero (AES - NEO-AEG PROG-HERO / MVS NEO-MVS PROG-HERO)
. League Bowling (AES - NEO-AEG PROG-HERO / MVS NEO-MVS PROG-HERO)
. Trash Rally (AES - NEO-AEG PROG42G-COM / NEO-MVS PROG42G-COM)
A HD6301V1P MCU on the above boards is used for establishing the 'link'. The MCU has a 4kb internal ROM which
is not dumped.
To use the MULTI PLAY MODE on your MVS you have to set the following hardware dips:
HARD DIP SETTING 4 5 6
CABINET 1: OFF OFF ON
CABINET 2: OFF ON ON
CABINET 3: ON OFF ON
CABINET 4: ON ON ON
SPHERO SYMPHONY:
================
Several early games have a 'feature' called "sphero symphony". None of the games featuring "sphero symphony"
uses special hardware. It is something sound based, but what exactly it is (specially arragend samples,
FM synthesis etc.) is unknown. The AES and MVS releases share the same sound data and driver.
The AES game-inserts and manuals have an eye-shaped logo with the following text (not to be found on MVS sets):
sphero
symphony
STEREOPHONIC SOUND
Experience this "LIVE" 3 dimensional sound coming from all around you.
Games featuring "sphero symphony":
ID-0006 - Riding Hero
ID-0007 - Alpha Mission II / ASO II - Last Guardian
ID-0009 - Ninja Combat
ID-0010 - Cyber-Lip
ID-0011 - The Super Spy
ID-0014 - Mutation Nation
ID-0017 - Sengoku / Sengoku Denshou
ID-0018 - Burning Fight
ID-0020 - Ghost Pilots
ID-0024 - Last Resort
ID-0031 - Soccer Brawl
ID-0033 - Fatal Fury - King of Fighters / Garou Densetsu - shukumei no tatakai
ID-0034 - Football Frenzy
ID-0037 - Crossed Swords
ID-0038 - Thrash Rally
ID-0039 - King of the Monsters 2 - The Next Thing
ID-0041 - Baseball Stars 2
ID-0044 - Art of Fighting / Ryuuko no Ken
ID-0047 - Fatal Fury 2 / Garou Densetsu 2 - arata-naru tatakai
ID-0049 - Andro Dunos
*/
// Game specific input definitions
static INPUT_PORTS_START( neogeo_mj )
PORT_INCLUDE( neogeo )
PORT_MODIFY("DSW")
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Controller ) ) PORT_DIPLOCATION("SW:3")
PORT_DIPSETTING( 0x04, DEF_STR( Joystick ) )
PORT_DIPSETTING( 0x00, "Mahjong Panel" )
INPUT_PORTS_END
static INPUT_PORTS_START( kizuna4p )
PORT_INCLUDE( neogeo )
PORT_MODIFY("DSW")
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Players ) ) PORT_DIPLOCATION("SW:2")
PORT_DIPSETTING( 0x02, "2" )
PORT_DIPSETTING( 0x00, "4" )
INPUT_PORTS_END
static INPUT_PORTS_START( vliner )
PORT_INCLUDE( neogeo )
PORT_MODIFY("DSW")
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("View Payout Table/Big")
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Bet/Small")
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Stop/Double Up")
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Start/Collect")
PORT_MODIFY("SYSTEM")
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* this bit is used.. */
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* this bit is used.. */
PORT_MODIFY("AUDIO/COIN")
PORT_BIT( 0x003f, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN5")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Operator Menu") PORT_CODE(KEYCODE_F1)
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Clear Credit")
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Hopper Out")
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
/* not sure what any of these bits are */
PORT_START("IN6")
PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
INPUT_PORTS_END
static INPUT_PORTS_START( jockeygp )
PORT_INCLUDE( neogeo )
PORT_MODIFY("SYSTEM")
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* game freezes with this bit enabled */
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* game freezes with this bit enabled */
INPUT_PORTS_END
/****************************************
ID-0001
. NGM-001
NEO-MVS PROG-NAM / NEO-MVS CHA-32
. NGH-001
NEO-AEG PROG-NAM / NEO-AEG CHA-32
****************************************/
ROM_START( nam1975 ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "001-p1.p1", 0x000000, 0x080000, CRC(cc9fc951) SHA1(92f4e6ddeeb825077d92dbb70b50afea985f15c0) ) /* MB834200 */
NEO_SFIX_128K( "001-s1.s1", CRC(7988ba51) SHA1(bc2f661f381b06b34ac2fa215dd5689d3bf84832) ) /* MB831000 */
NEO_BIOS_AUDIO_256K( "001-m1.m1", CRC(ba874463) SHA1(a83514f4b20301f84a98699900e2593f1c1b8846) ) /* MB832000 */
ROM_REGION( 0x080000, "cslot1:ymsnd", 0 )
ROM_LOAD( "001-v11.v11", 0x000000, 0x080000, CRC(a7c3d5e5) SHA1(e3efc86940f91c53b7724c4566cfc21ea1a7a465) ) /* MB834200 */
// AES has different label, data is the same: 001-v1.v1
ROM_REGION( 0x180000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "001-v21.v21", 0x000000, 0x080000, CRC(55e670b3) SHA1(a047049646a90b6db2d1882264df9256aa5a85e5) ) /* MB834200 */
// AES has different label, data is the same: 001-v2.v21
ROM_LOAD( "001-v22.v22", 0x080000, 0x080000, CRC(ab0d8368) SHA1(404114db9f3295929080b87a5d0106b40da6223a) ) /* MB834000 */
ROM_LOAD( "001-v23.v23", 0x100000, 0x080000, CRC(df468e28) SHA1(4e5d4a709a4737a87bba4083aeb788f657862f1a) ) /* MB834000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "001-c1.c1", 0x000000, 0x80000, CRC(32ea98e1) SHA1(c2fb3fb7dd14523a4b4b7fbdb81f44cb4cc48239) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "001-c2.c2", 0x000001, 0x80000, CRC(cbc4064c) SHA1(224c970fd060d841fd430c946ef609bb57b6d78c) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "001-c3.c3", 0x100000, 0x80000, CRC(0151054c) SHA1(f24fb501a7845f64833f4e5a461bcf9dc3262557) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "001-c4.c4", 0x100001, 0x80000, CRC(0a32570d) SHA1(f108446ec7844fde25f7a4ab454f76d384bf5e52) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "001-c5.c5", 0x200000, 0x80000, CRC(90b74cc2) SHA1(89898da36db259180e5261ed45eafc99ca13e504) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "001-c6.c6", 0x200001, 0x80000, CRC(e62bed58) SHA1(d05b2903b212a51ee131e52c761b714cb787683e) ) /* Plane 2,3 */ /* MB834200 */
ROM_END
/****************************************
ID-0002
. NGM-002
NEO-MVS PROG-EP / NEO-MVS CHA-32
. NGH-002
NEO-AEG PROG-4A / NEO-AEG CHA-32
****************************************/
ROM_START( bstars ) /* MVS VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "002-pg.p1", 0x000000, 0x080000, CRC(c100b5f5) SHA1(4cea9f29ad67288c3eccfa4cf961ee9782e49165) ) /* MB834200 */
NEO_SFIX_128K( "002-s1.s1", CRC(1a7fd0c6) SHA1(3fc701b7afddab369ddf9dedfbc5e1aaf80b8af3) ) /* MB831000 */
NEO_BIOS_AUDIO_256K( "002-m1.m1", CRC(4ecaa4ee) SHA1(50abfb8eed6cb4887393089f9ccc76f306ef69b5) ) /* MB832000 */
ROM_REGION( 0x200000, "cslot1:ymsnd", 0 )
ROM_LOAD( "002-v11.v11", 0x000000, 0x080000, CRC(b7b925bd) SHA1(644c92fa90e74998e73714f74b1e0680ee372a07) ) /* MB834000 */
ROM_LOAD( "002-v12.v12", 0x080000, 0x080000, CRC(329f26fc) SHA1(2c8009edc88c6b26f7be5beb2b8d260aac394ee1) ) /* MB834000 */
ROM_LOAD( "002-v13.v13", 0x100000, 0x080000, CRC(0c39f3c8) SHA1(db8f8670639601215707d918d4fb93221460446a) ) /* MB834000 */
ROM_LOAD( "002-v14.v14", 0x180000, 0x080000, CRC(c7e11c38) SHA1(5abf2a7877e0162c758a4dcf09f183930fa7ef24) ) /* MB834000 */
ROM_REGION( 0x080000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "002-v21.v21", 0x000000, 0x080000, CRC(04a733d1) SHA1(84159368c0f6de2c3b8121227201cd3422455cf6) ) /* MB834000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "002-c1.c1", 0x000000, 0x080000, CRC(aaff2a45) SHA1(c91ee72d1d74514df8ec44fca703409d92158ae3) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c2.c2", 0x000001, 0x080000, CRC(3ba0f7e4) SHA1(f023b134b9c7994f477867307d2732026033501d) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c3.c3", 0x100000, 0x080000, CRC(96f0fdfa) SHA1(9f779a1ae46aeda54d69382b074392ade687f62f) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c4.c4", 0x100001, 0x080000, CRC(5fd87f2f) SHA1(a5dd6f26f9485f216c2428ae1792c182beb10dbc) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c5.c5", 0x200000, 0x080000, CRC(807ed83b) SHA1(3268e7d4602c3f55f1e0da2c80653d5ae461ef67) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c6.c6", 0x200001, 0x080000, CRC(5a3cad41) SHA1(c620d18f4ff32ed5489c941dfc641030a54f1c14) ) /* Plane 2,3 */ /* MB834200 */
ROM_END
ROM_START( bstarsh ) /* AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "002-p1.p1", 0x000000, 0x080000, CRC(3bc7790e) SHA1(50b2fffb1278151bb4849fbe1f8cb23916019815) ) /* MB834200 */
NEO_SFIX_128K( "002-s1.s1", CRC(1a7fd0c6) SHA1(3fc701b7afddab369ddf9dedfbc5e1aaf80b8af3) ) /* MB831000 */
NEO_BIOS_AUDIO_256K( "002-m1.m1", CRC(4ecaa4ee) SHA1(50abfb8eed6cb4887393089f9ccc76f306ef69b5) ) /* MB832000 */
ROM_REGION( 0x200000, "cslot1:ymsnd", 0 )
ROM_LOAD( "002-v11.v11", 0x000000, 0x080000, CRC(b7b925bd) SHA1(644c92fa90e74998e73714f74b1e0680ee372a07) ) /* MB834000 */
ROM_LOAD( "002-v12.v12", 0x080000, 0x080000, CRC(329f26fc) SHA1(2c8009edc88c6b26f7be5beb2b8d260aac394ee1) ) /* MB834000 */
ROM_LOAD( "002-v13.v13", 0x100000, 0x080000, CRC(0c39f3c8) SHA1(db8f8670639601215707d918d4fb93221460446a) ) /* MB834000 */
ROM_LOAD( "002-v14.v14", 0x180000, 0x080000, CRC(c7e11c38) SHA1(5abf2a7877e0162c758a4dcf09f183930fa7ef24) ) /* MB834000 */
ROM_REGION( 0x080000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "002-v21.v21", 0x000000, 0x080000, CRC(04a733d1) SHA1(84159368c0f6de2c3b8121227201cd3422455cf6) ) /* MB834000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "002-c1.c1", 0x000000, 0x080000, CRC(aaff2a45) SHA1(c91ee72d1d74514df8ec44fca703409d92158ae3) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c2.c2", 0x000001, 0x080000, CRC(3ba0f7e4) SHA1(f023b134b9c7994f477867307d2732026033501d) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c3.c3", 0x100000, 0x080000, CRC(96f0fdfa) SHA1(9f779a1ae46aeda54d69382b074392ade687f62f) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c4.c4", 0x100001, 0x080000, CRC(5fd87f2f) SHA1(a5dd6f26f9485f216c2428ae1792c182beb10dbc) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c5.c5", 0x200000, 0x080000, CRC(807ed83b) SHA1(3268e7d4602c3f55f1e0da2c80653d5ae461ef67) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "002-c6.c6", 0x200001, 0x080000, CRC(5a3cad41) SHA1(c620d18f4ff32ed5489c941dfc641030a54f1c14) ) /* Plane 2,3 */ /* MB834200 */
ROM_END
/****************************************
ID-0003
. NGM-003
NEO-MVS PROG-EP / NEO-MVS CHA-32
. NGH-003
NEO-AEG PROG-4B / NEO-AEG CHA-32
****************************************/
ROM_START( tpgolf ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "003-p1.p1", 0x000000, 0x080000, CRC(f75549ba) SHA1(3f7bdf5e2964e921fe1dd87c51a79a1a501fc73f) ) /* TC534200 */
ROM_LOAD16_WORD_SWAP( "003-p2.p2", 0x080000, 0x080000, CRC(b7809a8f) SHA1(1604c889592c9610668bff296de48a0d6906156d) ) /* TC534200 */
NEO_SFIX_128K( "003-s1.s1", CRC(7b3eb9b1) SHA1(39cd8bad9f8bfdeb8ac681b5b79ae5aa81c8dd5f) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "003-m1.m1", CRC(4cc545e6) SHA1(8e014b8cab3e5b3995756a4ea52ce49c36866377) ) /* TC531001 */
ROM_REGION( 0x080000, "cslot1:ymsnd", 0 )
ROM_LOAD( "003-v11.v11", 0x000000, 0x080000, CRC(ff97f1cb) SHA1(defa249d46ae220f7bfa70746f5202bbbcc3e5fe) ) /* TC534000 */
// AES has different label, data is the same (also found on MVS): 003-v1.v11
ROM_REGION( 0x200000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "003-v21.v21", 0x000000, 0x080000, CRC(d34960c6) SHA1(36d5877d5e42aab943f4d693159f4f3ad8b0addc) ) /* TC534000 */
// AES has different label, data is the same (also found on MVS): 003-v2.v21
ROM_LOAD( "003-v22.v22", 0x080000, 0x080000, CRC(9a5f58d4) SHA1(2b580595e1820430a36f06fd3e0e0b8f7d686889) ) /* TC534000 */
ROM_LOAD( "003-v23.v23", 0x100000, 0x080000, CRC(30f53e54) SHA1(22461f88a56d272b78dbc23204c0c6816200532b) ) /* TC534000 */
ROM_LOAD( "003-v24.v24", 0x180000, 0x080000, CRC(5ba0f501) SHA1(ca02937a611a2c50c9e4b54f8fd4eaea09259894) ) /* TC534000 */
ROM_REGION( 0x400000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "003-c1.c1", 0x000000, 0x80000, CRC(0315fbaf) SHA1(583c9253219c1026d81ee5e0cf5568683adc2633) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "003-c2.c2", 0x000001, 0x80000, CRC(b4c15d59) SHA1(b0d8ec967f9b8e5216301c10b2d36912abce6515) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "003-c3.c3", 0x100000, 0x80000, CRC(8ce3e8da) SHA1(bc6c49b27d498f75a0d1a8c4d0cca75e140b9efc) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "003-c4.c4", 0x100001, 0x80000, CRC(29725969) SHA1(f1407da84919c2b3fe0e8f1fca65934b147c86c7) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "003-c5.c5", 0x200000, 0x80000, CRC(9a7146da) SHA1(2fc83d13e3e9565919aab01bf2a1b028f433b547) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "003-c6.c6", 0x200001, 0x80000, CRC(1e63411a) SHA1(ee397e2f679042e87b37d95837af62bb95a72af9) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "003-c7.c7", 0x300000, 0x80000, CRC(2886710c) SHA1(1533dd935f0a8f92a0a3c47d1d2bc6d035454244) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "003-c8.c8", 0x300001, 0x80000, CRC(422af22d) SHA1(f67c844c34545de6ea187f5bfdf440dec8518532) ) /* Plane 2,3 */ /* TC534200 */
ROM_END
/****************************************
ID-0004
. NGM-004
NEO-MVS PROG-EP / NEO-MVS CHA-32
. NGH-004
NEO-AEG PROG B / NEO-AEG CHA-32
****************************************/
ROM_START( mahretsu ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "004-p1.p1", 0x000000, 0x080000, CRC(fc6f53db) SHA1(64a62ca4c8fb68954e06121399c9402278bd0467) ) /* TC534200 */
NEO_SFIX_128K( "004-s1.s1", CRC(2bd05a06) SHA1(876deadd4645373d82a503154eeddf18f440d743) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "004-m1.m1", CRC(c71fbb3b) SHA1(59c58665b53da61352359d191a0569de5dd1f4b3) ) /* TC531001 */
ROM_REGION( 0x100000, "cslot1:ymsnd", 0 )
ROM_LOAD( "004-v11.v11", 0x000000, 0x080000, CRC(b2fb2153) SHA1(36e0cc8927b11105de40188af46f6cf532794c10) ) /* CXK384001 */
ROM_LOAD( "004-v12.v12", 0x080000, 0x080000, CRC(8503317b) SHA1(ab22f1aba1e977ab234a4f1d73dc6ed789dbeb85) ) /* CXK384001 */
ROM_REGION( 0x180000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "004-v21.v21", 0x000000, 0x080000, CRC(4999fb27) SHA1(2d4926a220ea21bdd5e816bb16f985fff089500a) ) /* CXK384001 */
ROM_LOAD( "004-v22.v22", 0x080000, 0x080000, CRC(776fa2a2) SHA1(e7d5a362ab7806b7b009700a435c815a20e8ec68) ) /* CXK384001 */
ROM_LOAD( "004-v23.v23", 0x100000, 0x080000, CRC(b3e7eeea) SHA1(4d1e97f380702a3a06e7f954b4caddd9c4119d8f) ) /* CXK384001 */
ROM_REGION( 0x200000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "004-c1.c1", 0x000000, 0x80000, CRC(f1ae16bc) SHA1(df68feed4dcba1e1566032b01ebb7b478a1792bf) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "004-c2.c2", 0x000001, 0x80000, CRC(bdc13520) SHA1(2bc4c996d019a4c539f6c3188ef18089e54b7efa) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "004-c3.c3", 0x100000, 0x80000, CRC(9c571a37) SHA1(21388aeb92bb8e15a55a063701ca9df79e292127) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "004-c4.c4", 0x100001, 0x80000, CRC(7e81cb29) SHA1(5036f04df30cf6903bd1a8cc06ff6f015c24a74b) ) /* Plane 2,3 */ /* MB834200 */
ROM_END
/****************************************
ID-0005
. NGM-005
NEO-MVS PROG-EP / NEO-MVS CHA-32
. NGH-005
NEO-AEG PROG-4B / NEO-AEG CHA-32
****************************************/
ROM_START( maglord ) /* MVS VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "005-pg1.p1", 0x000000, 0x080000, CRC(bd0a492d) SHA1(d043d3710cf2b0d2b3798008e65e4c7c3ead1af3) ) /* MB834200 */
NEO_SFIX_128K( "005-s1.s1", CRC(1c5369a2) SHA1(db0dba0a7dced6c9ca929c5abda491b05d84199c) ) /* MB831000 */
NEO_BIOS_AUDIO_256K( "005-m1.m1", CRC(26259f0f) SHA1(4f3e500093d61585048767dbd9fa09b3911a05d6) ) /* MB832000 */
ROM_REGION( 0x080000, "cslot1:ymsnd", 0 )
ROM_LOAD( "005-v11.v11", 0x000000, 0x080000, CRC(cc0455fd) SHA1(a8ff4270e7705e263d25ff0b301f503bccea7e59) ) /* MB834000 */
ROM_REGION( 0x100000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "005-v21.v21", 0x000000, 0x080000, CRC(f94ab5b7) SHA1(2c16985102e3585e08622d8c54ac5c60425b9ff8) ) /* MB834000 */
ROM_LOAD( "005-v22.v22", 0x080000, 0x080000, CRC(232cfd04) SHA1(61b66a9decbbd1f500a8c186615e7fd077c6861e) ) /* MB834000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "005-c1.c1", 0x000000, 0x80000, CRC(806aee34) SHA1(3c32a0edbbddb694495b510c13979c44b83de8bc) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c2.c2", 0x000001, 0x80000, CRC(34aa9a86) SHA1(cec97e1ff7f91158040c629ba75742db82c4ae5e) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c3.c3", 0x100000, 0x80000, CRC(c4c2b926) SHA1(478bfafca21f5a1338808251a06ab405e6a9e65f) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c4.c4", 0x100001, 0x80000, CRC(9c46dcf4) SHA1(4c05f3dc25777a87578ce09a6cefb3a4cebf3266) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c5.c5", 0x200000, 0x80000, CRC(69086dec) SHA1(7fa47f4a765948813ebf366168275dcc3c42e951) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c6.c6", 0x200001, 0x80000, CRC(ab7ac142) SHA1(e6ad2843947d35d8e913d2666f87946c1ba7944f) ) /* Plane 2,3 */ /* MB834200 */
ROM_END
ROM_START( maglordh ) /* AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "005-p1.p1", 0x000000, 0x080000, CRC(599043c5) SHA1(43f234b0f89b72b4c6050c40d9daa5c4e96b94ce) ) /* MB834200 */
NEO_SFIX_128K( "005-s1.s1", CRC(1c5369a2) SHA1(db0dba0a7dced6c9ca929c5abda491b05d84199c) ) /* MB831000 */
NEO_BIOS_AUDIO_256K( "005-m1.m1", CRC(26259f0f) SHA1(4f3e500093d61585048767dbd9fa09b3911a05d6) ) /* MB832000 */
ROM_REGION( 0x080000, "cslot1:ymsnd", 0 )
ROM_LOAD( "005-v11.v11", 0x000000, 0x080000, CRC(cc0455fd) SHA1(a8ff4270e7705e263d25ff0b301f503bccea7e59) ) /* MB834000 */
ROM_REGION( 0x100000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "005-v21.v21", 0x000000, 0x080000, CRC(f94ab5b7) SHA1(2c16985102e3585e08622d8c54ac5c60425b9ff8) ) /* MB834000 */
ROM_LOAD( "005-v22.v22", 0x080000, 0x080000, CRC(232cfd04) SHA1(61b66a9decbbd1f500a8c186615e7fd077c6861e) ) /* MB834000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "005-c1.c1", 0x000000, 0x80000, CRC(806aee34) SHA1(3c32a0edbbddb694495b510c13979c44b83de8bc) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c2.c2", 0x000001, 0x80000, CRC(34aa9a86) SHA1(cec97e1ff7f91158040c629ba75742db82c4ae5e) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c3.c3", 0x100000, 0x80000, CRC(c4c2b926) SHA1(478bfafca21f5a1338808251a06ab405e6a9e65f) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c4.c4", 0x100001, 0x80000, CRC(9c46dcf4) SHA1(4c05f3dc25777a87578ce09a6cefb3a4cebf3266) ) /* Plane 2,3 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c5.c5", 0x200000, 0x80000, CRC(69086dec) SHA1(7fa47f4a765948813ebf366168275dcc3c42e951) ) /* Plane 0,1 */ /* MB834200 */
ROM_LOAD16_BYTE( "005-c6.c6", 0x200001, 0x80000, CRC(ab7ac142) SHA1(e6ad2843947d35d8e913d2666f87946c1ba7944f) ) /* Plane 2,3 */ /* MB834200 */
ROM_END
/****************************************
ID-0006
. NGM-006
NEO-MVS PROG-HERO / NEO-MVS CHA-32
. NGH-006
NEO-AEG PROG-HERO / NEO-AEG CHA-32
****************************************/
ROM_START( ridhero ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "006-p1.p1", 0x000000, 0x080000, CRC(d4aaf597) SHA1(34d35b71adb5bd06f4f1b50ffd9c58ab9c440a84) ) /* MB834200 */
ROM_REGION( 0x2000, "mcu", 0 ) /* Hitachi HD6301V1 MCU */
ROM_LOAD( "rhcom.bin", 0x0000, 0x2000, CRC(e5cd6306) SHA1(f6bbb8ae562804d67e137290c765c3589fa334c0) ) // dumped from a prototype with external ROM, not 100% confirmed as being the same on a final, or other games (lbowling, trally)
NEO_SFIX_128K( "006-s1.s1", CRC(eb5189f0) SHA1(0239c342ea62e73140a2306052f226226461a478) ) /* TC531000 */
NEO_BIOS_AUDIO_256K( "006-m1.m1", CRC(92e7b4fe) SHA1(d240056cd632f92bdfaa5e0492c09aa9bd7b0471) ) /* MB832000 */
ROM_REGION( 0x100000, "cslot1:ymsnd", 0 )
ROM_LOAD( "006-v11.v11", 0x000000, 0x080000, CRC(cdf74a42) SHA1(a17106cc3f9e5c5d52b4def861c0545a98151da2) ) /* MB834000 */
ROM_LOAD( "006-v12.v12", 0x080000, 0x080000, CRC(e2fd2371) SHA1(cc95297bee7ffbdcb24ac4daeb5307cb39a52067) ) /* MB834000 */
ROM_REGION( 0x200000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "006-v21.v21", 0x000000, 0x080000, CRC(94092bce) SHA1(1a2906271fe6bc396898a756153629a5862930eb) ) /* MB834000 */
ROM_LOAD( "006-v22.v22", 0x080000, 0x080000, CRC(4e2cd7c3) SHA1(72fb215a4f208a22a764e801186d1643d3d840ca) ) /* MB834000 */
ROM_LOAD( "006-v23.v23", 0x100000, 0x080000, CRC(069c71ed) SHA1(f450e9f60cd6ef846dbc77993159ec6157fb64e7) ) /* MB834000 */
ROM_LOAD( "006-v24.v24", 0x180000, 0x080000, CRC(89fbb825) SHA1(656a97c6a8832dab3a5e1577d9cd257b561cc356) ) /* MB834000 */
ROM_REGION( 0x200000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "006-c1.c1", 0x000000, 0x080000, CRC(4a5c7f78) SHA1(f8f1e6b7841c74368210d52a84307bb28f722a2d) ) /* Plane 0,1 */ /* CXK384000 */
ROM_LOAD16_BYTE( "006-c2.c2", 0x000001, 0x080000, CRC(e0b70ece) SHA1(e2b750e43cdddcea29d1c9c943a3628117a16a1b) ) /* Plane 2,3 */ /* CXK384000 */
ROM_LOAD16_BYTE( "006-c3.c3", 0x100000, 0x080000, CRC(8acff765) SHA1(11fe89b9d112d0658c9ddf40d928584de6ea9202) ) /* Plane 0,1 */ /* CXK384000 */
ROM_LOAD16_BYTE( "006-c4.c4", 0x100001, 0x080000, CRC(205e3208) SHA1(aa2acf2c6f48ffffdcc0c94ddc031acc9e4a2e68) ) /* Plane 2,3 */ /* CXK384000 */
ROM_END
ROM_START( ridheroh )
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "006-pg1.p1", 0x000000, 0x080000, BAD_DUMP CRC(52445646) SHA1(647bb31f2f68453c1366cb6e2e867e37d1df7a54) )
/* Chip label p1h does not exist, renamed temporarly to pg1, marked BAD_DUMP. This needs to be verified. */
ROM_REGION( 0x2000, "mcu", 0 ) /* Hitachi HD6301V1 MCU */
ROM_LOAD( "rhcom.bin", 0x0000, 0x2000, CRC(e5cd6306) SHA1(f6bbb8ae562804d67e137290c765c3589fa334c0) ) // dumped from a prototype with external ROM, not 100% confirmed as being the same on a final, or other games (lbowling, trally)
NEO_SFIX_128K( "006-s1.s1", CRC(eb5189f0) SHA1(0239c342ea62e73140a2306052f226226461a478) ) /* TC531000 */
NEO_BIOS_AUDIO_256K( "006-m1.m1", CRC(92e7b4fe) SHA1(d240056cd632f92bdfaa5e0492c09aa9bd7b0471) ) /* MB832000 */
ROM_REGION( 0x100000, "cslot1:ymsnd", 0 )
ROM_LOAD( "006-v11.v11", 0x000000, 0x080000, CRC(cdf74a42) SHA1(a17106cc3f9e5c5d52b4def861c0545a98151da2) ) /* MB834000 */
ROM_LOAD( "006-v12.v12", 0x080000, 0x080000, CRC(e2fd2371) SHA1(cc95297bee7ffbdcb24ac4daeb5307cb39a52067) ) /* MB834000 */
ROM_REGION( 0x200000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "006-v21.v21", 0x000000, 0x080000, CRC(94092bce) SHA1(1a2906271fe6bc396898a756153629a5862930eb) ) /* MB834000 */
ROM_LOAD( "006-v22.v22", 0x080000, 0x080000, CRC(4e2cd7c3) SHA1(72fb215a4f208a22a764e801186d1643d3d840ca) ) /* MB834000 */
ROM_LOAD( "006-v23.v23", 0x100000, 0x080000, CRC(069c71ed) SHA1(f450e9f60cd6ef846dbc77993159ec6157fb64e7) ) /* MB834000 */
ROM_LOAD( "006-v24.v24", 0x180000, 0x080000, CRC(89fbb825) SHA1(656a97c6a8832dab3a5e1577d9cd257b561cc356) ) /* MB834000 */
ROM_REGION( 0x200000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "006-c1.c1", 0x000000, 0x080000, CRC(4a5c7f78) SHA1(f8f1e6b7841c74368210d52a84307bb28f722a2d) ) /* Plane 0,1 */ /* CXK384000 */
ROM_LOAD16_BYTE( "006-c2.c2", 0x000001, 0x080000, CRC(e0b70ece) SHA1(e2b750e43cdddcea29d1c9c943a3628117a16a1b) ) /* Plane 2,3 */ /* CXK384000 */
ROM_LOAD16_BYTE( "006-c3.c3", 0x100000, 0x080000, CRC(8acff765) SHA1(11fe89b9d112d0658c9ddf40d928584de6ea9202) ) /* Plane 0,1 */ /* CXK384000 */
ROM_LOAD16_BYTE( "006-c4.c4", 0x100001, 0x080000, CRC(205e3208) SHA1(aa2acf2c6f48ffffdcc0c94ddc031acc9e4a2e68) ) /* Plane 2,3 */ /* CXK384000 */
ROM_END
/****************************************
ID-0007
. NGM-007
NEO-MVS PROG42G / NEO-MVS CHA42G
. NGH-007
NEO-AEG PROG42G / NEO-AEG CHA42G
NEO-AEG PROG42G / NEO-AEG CHA-8M
. prototype
NEO-AEG PROG-EP / NEO-AEG CHA-EP
****************************************/
ROM_START( alpham2 ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "007-p1.p1", 0x000000, 0x080000, CRC(5b266f47) SHA1(8afbf995989f47ad93fea1f31a884afc7228b53a) ) /* TC534200 */
ROM_LOAD16_WORD_SWAP( "007-p2.p2", 0x080000, 0x020000, CRC(eb9c1044) SHA1(65d3416dcd96663bc4e7cefe90ecb7c1eafb2dda) ) /* TC531024 */
NEO_SFIX_128K( "007-s1.s1", CRC(85ec9acf) SHA1(39a11974438ad36a2cc84307151b31474c3c5518) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "007-m1.m1", CRC(28dfe2cd) SHA1(1a1a99fb917c6c8db591e3be695ce03f843ee1df) ) /* TC531001 */
ROM_REGION( 0x200000, "cslot1:ymsnd", 0 )
ROM_LOAD( "007-v1.v1", 0x000000, 0x100000, CRC(cd5db931) SHA1(b59f9f2df29f49470312a6cd20f5669b6aaf51ff) ) /* TC538200 */
ROM_LOAD( "007-v2.v2", 0x100000, 0x100000, CRC(63e9b574) SHA1(1ade4cd0b15c84dd4a0fb7f7abf0885eef3a3f71) ) /* TC538200 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "007-c1.c1", 0x000000, 0x100000, CRC(8fba8ff3) SHA1(1a682292e99eb91b0edb9771c44bc5e762867e98) ) /* Plane 0,1 */ /* TC538200 */
ROM_LOAD16_BYTE( "007-c2.c2", 0x000001, 0x100000, CRC(4dad2945) SHA1(ac85a146276537fed124bda892bb93ff549f1d93) ) /* Plane 2,3 */ /* TC538200 */
ROM_LOAD16_BYTE( "007-c3.c3", 0x200000, 0x080000, CRC(68c2994e) SHA1(4f8dfc6e5188942e03b853a2c9f0ea6138dec791) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "007-c4.c4", 0x200001, 0x080000, CRC(7d588349) SHA1(a5ed789d7bbc25be5c5b2d99883b64d379c103a2) ) /* Plane 2,3 */ /* TC534200 */
ROM_END
ROM_START( alpham2p ) /* early prototype - all roms were hand labeled with CRCs, dumps verified against them */ /* AES VERSION*/
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_BYTE( "007_p1_faac.p1", 0x000001, 0x080000, CRC(c763e52a) SHA1(b24acbac255c5ee1a2e92e77cdde6620a24081cf) )
ROM_LOAD16_BYTE( "007_p2_1813.p2", 0x000000, 0x080000, CRC(7a0b435c) SHA1(40e6f42a92001d9f4e51898dd7489da143b6b74b) )
NEO_SFIX_128K( "007_s1_36f1.s1", CRC(efc9ae2e) SHA1(a594826b0082fe5a13191673e8d9aa42517230f5) )
NEO_BIOS_AUDIO_128K( "007_m1_9384.m1", CRC(5976b464) SHA1(ec824567ecc3579f6d86c9d9385710cbaeef16a3) )
ROM_REGION( 0x200000, "cslot1:ymsnd", 0 )
ROM_LOAD( "007_v11_1bb4.v11", 0x000000, 0x080000, CRC(18eaa9e1) SHA1(85c94d8660f8a32e4ca8e015f0bd704208482d68) )
ROM_LOAD( "007_v12_c8e8.v12", 0x080000, 0x080000, CRC(2487d495) SHA1(49af3c4dc6a38c5158d3641fd8f9a40041b42aa6) )
ROM_LOAD( "007_v13_09fa.v13", 0x100000, 0x080000, CRC(25e60f25) SHA1(d06b0df872372de38fcf90187195070ac5f8c651) )
ROM_LOAD( "007_v21_28c2.v21", 0x180000, 0x080000, CRC(ac44b75a) SHA1(7399a05cd4e2c7ecde4a7323d3e189255afe5fc2) )
ROM_REGION( 0x080000, "cslot1:ymsnd.deltat", 0 )
ROM_COPY( "cslot1:ymsnd", 0x180000, 0x00000, 0x80000 )
ROM_REGION( 0x400000, "cslot1:sprites", 0 ) // note, ROM_LOAD32_BYTE
ROM_LOAD32_BYTE( "007_c1_210e.c11", 0x000000, 0x80000, CRC(24841639) SHA1(fcc2a349121dad86ffefc44b9f0e8ba616ce0d30) ) /* Plane 0 */
ROM_LOAD32_BYTE( "007_c2_29ae.c12", 0x000002, 0x80000, CRC(912763ab) SHA1(cedf26d7d85ad140399ee62813c71f35e65498d6) ) /* Plane 2 */
ROM_LOAD32_BYTE( "007_c3_c873.c13", 0x000001, 0x80000, CRC(0743bde2) SHA1(0d13ad6333909ad3cf10f9ac360f9abf191318de) ) /* Plane 1 */
ROM_LOAD32_BYTE( "007_c4_2462.c14", 0x000003, 0x80000, CRC(61240212) SHA1(dee36f6604adaeb96e0d761a7256241c066b1cd2) ) /* Plane 3 */
ROM_LOAD32_BYTE( "007_c5_5f16.c15", 0x200000, 0x80000, CRC(cf9f4c53) SHA1(f979c85f83d9f76e554c2617f85f6d4efca6799c) ) /* Plane 0 */
ROM_LOAD32_BYTE( "007_c6_8abc.c16", 0x200002, 0x80000, CRC(3d903b19) SHA1(001a8c762336b855fe1df69fe2e605d30a3f00a1) ) /* Plane 2 */
ROM_LOAD32_BYTE( "007_c7_c983.c17", 0x200001, 0x80000, CRC(e41e3875) SHA1(730aceb8a66cb33d0194b096568f053ad7dc000a) ) /* Plane 1 */
ROM_LOAD32_BYTE( "007_c8_b599.c18", 0x200003, 0x80000, CRC(4483e2cf) SHA1(47c3364f5c36ae9dc3a49fe37ca60bcee0e73314) ) /* Plane 3 */
ROM_END
/****************************************
ID-0008
Sun Shine (prototype) 1990 SNK / Alpha
****************************************/
/****************************************
ID-0009
. NGM-009
NEO-MVS PROG-EP / NEO-MVS CHA-32
. NGH-009
NEO-AEG PROG-4A / NEO-AEG CHA-32
****************************************/
ROM_START( ncombat ) /* MVS VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "009-p1.p1", 0x000000, 0x080000, CRC(b45fcfbf) SHA1(3872147dda2d1ba905d35f4571065d87b1958b4a) ) /* TC534200 */
NEO_SFIX_128K( "009-s1.s1", CRC(d49afee8) SHA1(77615f12edf08ae8f1353f7a056a8f3a50d3ebdc) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "009-m1.m1", CRC(b5819863) SHA1(6f2309d51531052dbf7d712993c9e35649db0d84) ) /* TC531001 */
ROM_REGION( 0x180000, "cslot1:ymsnd", 0 )
ROM_LOAD( "009-v11.v11", 0x000000, 0x080000, CRC(cf32a59c) SHA1(af5b7fcd8a4aff1307c0a1d937e5f0460c32de79) ) /* TC534000 */
ROM_LOAD( "009-v12.v12", 0x080000, 0x080000, CRC(7b3588b7) SHA1(a4e6d9d4113ff4ce48b371f65e9187d551821d3b) ) /* TC534000 */
ROM_LOAD( "009-v13.v13", 0x100000, 0x080000, CRC(505a01b5) SHA1(9426a4f5b31e16f74e72e61951c189a878f211c5) ) /* TC534000 */
ROM_REGION( 0x080000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "009-v21.v21", 0x000000, 0x080000, CRC(365f9011) SHA1(aebd292214ab280b05ee9e759b7e9a681a099c4a) ) /* TC534000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "009-c1.c1", 0x000000, 0x80000, CRC(33cc838e) SHA1(c445c891c0ba4190aa0b472786150620e76df5b4) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c2.c2", 0x000001, 0x80000, CRC(26877feb) SHA1(8f48097fb8e4757f50b6d86219122fbf4b6f87ef) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c3.c3", 0x100000, 0x80000, CRC(3b60a05d) SHA1(0a165a17af4834876fcd634599cd2208adc9248f) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c4.c4", 0x100001, 0x80000, CRC(39c2d039) SHA1(8ca6c3f977c43c7abba2a00a0e70f02e2a49f5f2) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c5.c5", 0x200000, 0x80000, CRC(67a4344e) SHA1(b325f152c7b2388fc92c5826e1dc99094b9ea749) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c6.c6", 0x200001, 0x80000, CRC(2eca8b19) SHA1(16764ef10e404325ba0a1a2ad3a4c0af287be21f) ) /* Plane 2,3 */ /* TC534200 */
ROM_END
ROM_START( ncombath ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "009-pg1.p1", 0x000000, 0x080000, CRC(8e9f0add) SHA1(d0b908a86a58f2537eea73a431038f1cd74a5a2f) ) /* TC534200 */
NEO_SFIX_128K( "009-s1.s1", CRC(d49afee8) SHA1(77615f12edf08ae8f1353f7a056a8f3a50d3ebdc) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "009-m1.m1", CRC(b5819863) SHA1(6f2309d51531052dbf7d712993c9e35649db0d84) ) /* TC531001 */
ROM_REGION( 0x180000, "cslot1:ymsnd", 0 )
ROM_LOAD( "009-v11.v11", 0x000000, 0x080000, CRC(cf32a59c) SHA1(af5b7fcd8a4aff1307c0a1d937e5f0460c32de79) ) /* TC534000 */
ROM_LOAD( "009-v12.v12", 0x080000, 0x080000, CRC(7b3588b7) SHA1(a4e6d9d4113ff4ce48b371f65e9187d551821d3b) ) /* TC534000 */
ROM_LOAD( "009-v13.v13", 0x100000, 0x080000, CRC(505a01b5) SHA1(9426a4f5b31e16f74e72e61951c189a878f211c5) ) /* TC534000 */
ROM_REGION( 0x080000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "009-v21.v21", 0x000000, 0x080000, CRC(365f9011) SHA1(aebd292214ab280b05ee9e759b7e9a681a099c4a) ) /* TC534000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "009-c1.c1", 0x000000, 0x80000, CRC(33cc838e) SHA1(c445c891c0ba4190aa0b472786150620e76df5b4) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c2.c2", 0x000001, 0x80000, CRC(26877feb) SHA1(8f48097fb8e4757f50b6d86219122fbf4b6f87ef) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c3.c3", 0x100000, 0x80000, CRC(3b60a05d) SHA1(0a165a17af4834876fcd634599cd2208adc9248f) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c4.c4", 0x100001, 0x80000, CRC(39c2d039) SHA1(8ca6c3f977c43c7abba2a00a0e70f02e2a49f5f2) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c5.c5", 0x200000, 0x80000, CRC(67a4344e) SHA1(b325f152c7b2388fc92c5826e1dc99094b9ea749) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "009-c6.c6", 0x200001, 0x80000, CRC(2eca8b19) SHA1(16764ef10e404325ba0a1a2ad3a4c0af287be21f) ) /* Plane 2,3 */ /* TC534200 */
ROM_END
/****************************************
ID-0010
. NGM-010
NEO-MVS PROG-EP / NEO-MVS CHA-32
. NGH-010
NEO-AEG PROG-B / NEO-AEG CHA-32
****************************************/
ROM_START( cyberlip )
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "010-p1.p1", 0x000000, 0x080000, CRC(69a6b42d) SHA1(6e7cb089de83f1d22cc4a87db5b1a94bf76fb1e8) ) /* TC534200 */
NEO_SFIX_128K( "010-s1.s1", CRC(79a35264) SHA1(c2819a82adbe1f5e489496e0e03477863a5b7665) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "010-m1.m1", CRC(8be3a078) SHA1(054ec6a061fcc88df1ecbb0a01611a31f37a7709) ) /* TC531001 */
ROM_REGION( 0x200000, "cslot1:ymsnd", 0 )
ROM_LOAD( "010-v11.v11", 0x000000, 0x080000, CRC(90224d22) SHA1(5443ee6f90d80d43194cb4b4f0e08851a59e7784) ) /* TC534000 */
ROM_LOAD( "010-v12.v12", 0x080000, 0x080000, CRC(a0cf1834) SHA1(8df57a7941bdae7e446a6056039adb012cdde246) ) /* TC534000 */
ROM_LOAD( "010-v13.v13", 0x100000, 0x080000, CRC(ae38bc84) SHA1(c0937b4f89b8b26c8a0e747b234f44ad6a3bf2ba) ) /* TC534000 */
ROM_LOAD( "010-v14.v14", 0x180000, 0x080000, CRC(70899bd2) SHA1(8cf01144f0bcf59f09777175ae6b71846b09f3a1) ) /* TC534000 */
ROM_REGION( 0x080000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "010-v21.v21", 0x000000, 0x080000, CRC(586f4cb2) SHA1(588460031d84c308e3353ecf714db9986425c21c) ) /* TC534000 */
ROM_REGION( 0x300000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "010-c1.c1", 0x000000, 0x80000, CRC(8bba5113) SHA1(70f0926409ab265da4b8632500d1d32d63cf77cf) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "010-c2.c2", 0x000001, 0x80000, CRC(cbf66432) SHA1(cc529640c475d08330e116ea9c5e5a28b7cd13db) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "010-c3.c3", 0x100000, 0x80000, CRC(e4f86efc) SHA1(fa60863d8a7ed4f21d30f91eb1936d0b8329db7a) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "010-c4.c4", 0x100001, 0x80000, CRC(f7be4674) SHA1(b4ad0432d4bb6d5a98e27015910343c964b73ed4) ) /* Plane 2,3 */ /* TC534200 */
ROM_LOAD16_BYTE( "010-c5.c5", 0x200000, 0x80000, CRC(e8076da0) SHA1(3ec5cc19809dea688041a42b32c13d257576f3da) ) /* Plane 0,1 */ /* TC534200 */
ROM_LOAD16_BYTE( "010-c6.c6", 0x200001, 0x80000, CRC(c495c567) SHA1(2f58475fbb5f1adafce027d396fb05dd71e8fb55) ) /* Plane 2,3 */ /* TC534200 */
ROM_END
/****************************************
ID-0011
. NGM-011
NEO-MVS PROG-8MB / NEO-MVS CHA-8M
. NGH-011
NEO-AEG PROG-8MB / NEO-AEG CHA-8M
****************************************/
ROM_START( superspy ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "011-p1.p1", 0x000000, 0x080000, CRC(c7f944b5) SHA1(da7560e09187c68f1d9f7656218497b4464c56c9) ) /* MB834200 */
ROM_LOAD16_WORD_SWAP( "sp2.p2", 0x080000, 0x020000, CRC(811a4faf) SHA1(8169dfaf79f52d80ecec402ce1b1ab9cafb7ebdd) ) /* TC531024 */
NEO_SFIX_128K( "011-s1.s1", CRC(ec5fdb96) SHA1(8003028025ac7bf531e568add6ba66c02d0b7e84) ) /* MB831000 */
NEO_BIOS_AUDIO_256K( "011-m1.m1", CRC(ca661f1b) SHA1(4e3cb57db716ec48487c1b070c3a55a5faf40856) ) /* MB832000 */
ROM_REGION( 0x180000, "cslot1:ymsnd", 0 )
ROM_LOAD( "011-v11.v11", 0x000000, 0x100000, CRC(5c674d5c) SHA1(d7b9beddeb247b584cea9ca6c43ec6869809b673) ) /* MB838000 */
ROM_LOAD( "011-v12.v12", 0x100000, 0x080000, CRC(9f513d5a) SHA1(37b04962f0b8e2a74abd35c407337a6151dc4e95) ) /* MB834000 */
ROM_REGION( 0x080000, "cslot1:ymsnd.deltat", 0 )
ROM_LOAD( "011-v21.v21", 0x000000, 0x080000, CRC(426cd040) SHA1(b2b45189837c8287223c2b8bd4df9525b72a3f16) ) /* MB834000 */
ROM_REGION( 0x400000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "011-c1.c1", 0x000000, 0x100000, CRC(cae7be57) SHA1(43b35b349594535689c358d9f324adda55e5281a) ) /* Plane 0,1 */ /* MB838200 */
ROM_LOAD16_BYTE( "011-c2.c2", 0x000001, 0x100000, CRC(9e29d986) SHA1(b417763bad1acf76116cd56f4203c2d2677e22e5) ) /* Plane 2,3 */ /* MB838200 */
ROM_LOAD16_BYTE( "011-c3.c3", 0x200000, 0x100000, CRC(14832ff2) SHA1(1179792d773d97d5e45e7d8f009051d362d72e24) ) /* Plane 0,1 */ /* MB838200 */
ROM_LOAD16_BYTE( "011-c4.c4", 0x200001, 0x100000, CRC(b7f63162) SHA1(077a81b2bb0a8f17c9df6945078608f74432877a) ) /* Plane 2,3 */ /* MB838200 */
ROM_END
/****************************************
ID-0012
unknown
****************************************/
/****************************************
ID-0013
unknown
****************************************/
/****************************************
ID-0014
. NGM-014
NEO-MVS PROG42G-1 / NEO-MVS CHA42G-1
. NGH-014
NEO-AEG PROG42G-1 / NEO-AEG CHA42G-1
****************************************/
ROM_START( mutnat ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "014-p1.p1", 0x000000, 0x080000, CRC(6f1699c8) SHA1(87206f67a619dede7959230f9ff3701b8b78957a) ) /* CXK384500 */