summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2023-04-06 23:50:00 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2023-04-06 23:50:00 +1000
commit43f877ca1ec2de69f560f271d74ad75d6a85bf8b (patch)
tree2d01776718a4ac1fe72e593526ef92bfaaeeaa74
parent96898a1c636ad7b0bca468513f286fbcb5735712 (diff)
Added preliminary support for MultiMVS games.
-rw-r--r--docs/release/docs/hbnew.txt2
-rw-r--r--hash/mvs_quik.xml24
-rw-r--r--src/hbmame/drivers/neogeo.cpp527
-rw-r--r--src/hbmame/drivers/neogeohb.cpp6
-rw-r--r--src/hbmame/hbmame.lst1
-rw-r--r--src/hbmame/includes/neogeo.h5
6 files changed, 177 insertions, 388 deletions
diff --git a/docs/release/docs/hbnew.txt b/docs/release/docs/hbnew.txt
index 85f4360e8e1..25fec428295 100644
--- a/docs/release/docs/hbnew.txt
+++ b/docs/release/docs/hbnew.txt
@@ -5,12 +5,14 @@
- Fixed bad graphics in Rally Chase (trallycd)
- Added preliminary support for .neo files used in NeoSD and Mister.
+- Added preliminary support for .7z files used in Darksoft's MultiMVS.
New Games
---------------------------------
- [chuckie] Chuckie Egg
- [dktrain2] Donkey Kong Trainer 1.01 (bugfix)
- [neo2048] Neo 2048
+- [ngmvs] Neo-Geo MultiMVS support
- [ngneo] Neo Geo support of .neo files
- [pacjrz80] Pac-Jr on Pacman Hardware
- [sbpf] Super Bubble Pop (fixed)
diff --git a/hash/mvs_quik.xml b/hash/mvs_quik.xml
new file mode 100644
index 00000000000..9643f0deb1c
--- /dev/null
+++ b/hash/mvs_quik.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0
+
+Quickloads for ngmvs. These extensions are supported: 7Z. Files must be at the archival root, no directories allowed.
+
+Currently the software list doesn't work.
+
+-->
+<softwarelist name="mvs_quik" description="MultiMVS quickload">
+
+ <software name="eightman">
+ <description>Eight Man</description>
+ <year>1991</year>
+ <publisher>SNK</publisher>
+ <part name="quik" interface="mvs_quik">
+ <dataarea name="quik" size="2592768">
+ <rom name="eightman.7z" size="2592768" crc="D1209720" sha1="42339b27dc6b23ee135c5ea66f9a974c72dca5e2"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/src/hbmame/drivers/neogeo.cpp b/src/hbmame/drivers/neogeo.cpp
index 3bbc99a1a2d..a34c9e17c10 100644
--- a/src/hbmame/drivers/neogeo.cpp
+++ b/src/hbmame/drivers/neogeo.cpp
@@ -5,283 +5,6 @@
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)
- * Multi-cart support not implemented - the MVS can take up to
- 6 cartridges depending on the board being used
- * 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:
- ===================
-
- 1 Slot:
- NEO-MVH MV1
- NEO-MVH MV1-1
- NEO-MVH MV1A
- . NEO-MVH MV1A CHX ??
- NEO-MVH MV1B (1996.1.19)
- . NEO-MVH MV1B CHX (1996.1.19) ??
- NEO-MVH MV1B1 (1998.6.17)
- NEO-MVH MV1C (1999.4.30)
- NEO-MVH MV1F
- NEO-MVH MV1FS
- NEO-MVH MV1FT
- NEO-MVH MV1FZ
- NEO-MVH MV1FZS
-
- 2 Slot:
- NEO-MVH MV2
- NEO-MVH MV2F
- NEO-MVH MV2F-01
-
- 4 Slot:
- NEO-MVH MV4
- NEO-MVH MV4F
- NEO-MVH MV4FS
- NEO-MVH MV4FT
- NEO-MVH MV4FT2
-
- 6 Slot:
- NEO-MVH MV6
- 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 |
- |---------------------------------------------------------------------|
-
-
-*****************************************************************************
-
- 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:
==================
@@ -302,113 +25,6 @@
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 = 4MB
- CR22 = 34A | 34B = CR23 NC = 34A | 34B = ROMOE
- 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
- SYSTEMB = 42A | 42B = FIX03 SYSTEMB = 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 = SDRA00
- SDA7 = 50A | 50B = SDMRD SDRA9 = 50A | 50B = SDRA01
- SDA8 = 51A | 51B = SDDO SDRA20 = 51A | 51B = SDRA02
- SDA9 = 52A | 52B = SDD1 SDRA21 = 52A | 52B = SDRA03
- SDA10 = 53A | 53B = SDD2 SDRA22 = 53A | 53B = SDRA04
- SDA11 = 54A | 54B = SDD3 SDRA23 = 54A | 54B = SDRA05
- SDA12 = 55A | 55B = SDD4 SDRMPX = 55A | 55B = SDRA06
- SDA13 = 56A | 56B = SDD5 SDROE = 56A | 56B = SDRA07
- 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
-
-
*****************************************************************************
Watchdog:
@@ -454,6 +70,7 @@
****************************************************************************/
#include "includes/neogeo.h"
+#include "unzip.h"
#include "softlist_dev.h"
#include "neogeo.lh"
@@ -1482,11 +1099,23 @@ void neogeo_state::ngneo(machine_config &config)
// quickload
quickload_image_device &quickload(QUICKLOAD(config, "quickload", "neo", attotime::from_seconds(1)));
- quickload.set_load_callback(FUNC(neogeo_state::quickload_cb));
+ quickload.set_load_callback(FUNC(neogeo_state::neo_q_cb));
quickload.set_interface("neo_quik");
SOFTWARE_LIST(config, "quik_list").set_original("neo_quik");
}
+void neogeo_state::ngmvs(machine_config &config)
+{
+ mvs(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &neogeo_state::main_map_noslot);
+
+ // quickload
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload", "7z", attotime::from_seconds(1)));
+ quickload.set_load_callback(FUNC(neogeo_state::mvs_q_cb));
+ quickload.set_interface("mvs_quik");
+ //SOFTWARE_LIST(config, "quik_list").set_original("mvs_quik"); // not working
+}
+
void neogeo_state::gsc_map(address_map &map)
{
main_map_noslot(map);
@@ -2305,7 +1934,7 @@ void neogeo_state::init_cmc42sfix()
}
-QUICKLOAD_LOAD_MEMBER(neogeo_state::quickload_cb)
+QUICKLOAD_LOAD_MEMBER(neogeo_state::neo_q_cb)
{
if (image.length() < 0x60000)
{
@@ -2453,6 +2082,104 @@ QUICKLOAD_LOAD_MEMBER(neogeo_state::quickload_cb)
return image_init_result::PASS;
}
+std::error_condition neogeo_state::mvs_open7z(std::string zip_name, std::string filename, uint8_t *region_name, u32 region_size, u32 *file_size)
+{
+ util::archive_file::ptr zip;
+ std::error_condition ziperr{};
+
+ // look into 7z file
+ ziperr = util::archive_file::open_7z(zip_name, zip);
+
+ if (!ziperr)
+ {
+ int found = zip->search(filename, false);
+
+ if (found >= 0)
+ {
+ ziperr = zip->decompress(&region_name[0], region_size);
+
+ if (!ziperr)
+ *file_size = zip->current_uncompressed_length();
+ }
+
+ zip.reset();
+ }
+
+ return ziperr;
+}
+
+QUICKLOAD_LOAD_MEMBER(neogeo_state::mvs_q_cb)
+{
+ // assuming that .7z is the only occurence
+ std::string sstr = ".7z";
+ std::string zipname = image.filename();
+ std::size_t found = zipname.find(sstr);
+ zipname.erase(found+3);
+ //printf("%s\n",zipname.c_str());fflush(stdout);
+ std::error_condition filerr = std::errc::no_such_file_or_directory;
+ u32 psize = 0, ssize = 0, msize = 0, vsize = 0, csize = 0, fsize = 0;
+
+ std::string fname = "prom";
+ filerr = mvs_open7z(zipname, fname, &cpuregion[0], cpuregion_size, &psize);
+ // The protected sets also have "prom1", but we don't support it.
+ if (filerr)
+ {
+ image.seterror(image_error::INVALIDIMAGE, "File is corrupt");
+ printf("File is corrupt.\n");
+ image.message("File is corrupt");
+ return image_init_result::FAIL;
+ }
+
+ fname = "srom";
+ filerr = mvs_open7z(zipname, fname, &fix_region[0], fix_region_size, &ssize);
+
+ fname = "m1rom";
+ filerr = mvs_open7z(zipname, fname, &audiocpu_region[0x10000], audio_region_size - 0x10000, &msize);
+ if (msize)
+ std::copy(&audiocpu_region[0x10000], &audiocpu_region[0x1ffff], &audiocpu_region[0]);
+
+ fname = "vroma0";
+ filerr = mvs_open7z(zipname, fname, &ym_region[0], ym_region_size, &vsize);
+ if (vsize)
+ std::copy(&ym_region[0], &ym_region[ym_region_size-1], &memregion("ymsnd:adpcmb")->base()[0]);
+ // Assume that the ADPCMB rom would be called "vromb0", but no current sets use it.
+
+ fname = "crom0";
+ filerr = mvs_open7z(zipname, fname, &spr_region[0], spr_region_size, &csize);
+ if (csize)
+ for (u32 i = 0; i < csize; i+=4)
+ std::swap(spr_region[i+1], spr_region[i+2]);
+
+ init_neogeo();
+ m_sprgen->set_sprite_region(m_region_sprites->base(), csize);
+ m_sprgen->set_fixed_regions(m_region_fixed->base(), ssize, m_region_fixedbios);
+ m_sprgen->optimize_sprite_data();
+
+ // Fix the 512k text with horrible game-specific stuff
+ if (ssize > 0x20000)
+ {
+ u16 game = cpuregion[0x109] * 256 + cpuregion[0x108];
+ // identify kof2000, matrim, svc, kof2003
+ if ((game == 0x257) || (game == 0x266) || (game == 0x269) || (game == 0x271))
+ m_sprgen->m_fixed_layer_bank_type = 2;
+ else
+ m_sprgen->m_fixed_layer_bank_type = 1;
+ }
+
+ // This file is optionally included, perhaps to signify how to handle protection?
+ // The contents are an ascii number, so for now just print it out.
+ fname = "fpga";
+ unsigned char buffer[8] = {};
+ filerr = mvs_open7z(zipname, fname, &buffer[0], 4, &fsize);
+ if (fsize)
+ printf("FPGA code = %s\n",buffer);
+
+ m_audiocpu->reset();
+ machine_reset();
+
+ return image_init_result::PASS;
+}
+
/* dummy entry for the dummy bios driver */
ROM_START( neogeo )
@@ -2501,8 +2228,34 @@ ROM_START( ngneo )
ROM_REGION( 0x4000000, "sprites", ROMREGION_ERASEFF )
ROM_END
+ROM_START( ngmvs )
+ NEOGEO_BIOS
+
+ ROM_REGION( 0x900000, "maincpu", ROMREGION_ERASEFF )
+
+ ROM_REGION( 0x20000, "audiobios", 0 )
+ ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
+
+ ROM_REGION( 0x90000, "audiocpu", 0 )
+ ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
+
+ ROM_Y_ZOOM
+
+ ROM_REGION( 0x80000, "fixed", ROMREGION_ERASEFF )
+
+ ROM_REGION( 0x20000, "fixedbios", 0 )
+ ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) )
+
+ ROM_REGION( 0x1000000, "ymsnd:adpcma", ROMREGION_ERASEFF )
+
+ ROM_REGION( 0x1000000, "ymsnd:adpcmb", ROMREGION_ERASEFF )
+
+ ROM_REGION( 0x4000000, "sprites", ROMREGION_ERASEFF )
+ROM_END
+
/* YEAR NAME PARENT MACHINE INPUT CLASS INIT */
GAME( 1990, neogeo, 0, mvs, neogeo_6slot, neogeo_state, init_neogeo, ROT0, "SNK", "Neo-Geo", MACHINE_IS_BIOS_ROOT | MACHINE_SUPPORTS_SAVE )
-GAME( 1990, ngneo, neogeo, ngneo, neogeo, neogeo_state, empty_init, ROT0, "SNK", "Neo-Geo .neo support", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, ngneo, neogeo, ngneo, neogeo, neogeo_state, empty_init, ROT0, "SNK", "Neo-Geo .neo support", 0 )
+GAME( 1990, ngmvs, neogeo, ngmvs, neogeo, neogeo_state, empty_init, ROT0, "SNK", "Neo-Geo MultiMVS support", 0 )
diff --git a/src/hbmame/drivers/neogeohb.cpp b/src/hbmame/drivers/neogeohb.cpp
index 89a068dc649..5ae438cfde6 100644
--- a/src/hbmame/drivers/neogeohb.cpp
+++ b/src/hbmame/drivers/neogeohb.cpp
@@ -318,12 +318,18 @@ YEAR COMPANY TITLE
2018 Blastar Neo No Panepon 2 Sunnyland Edition (CD) (video on youtube)
2018 NeoHomeBrew (aka M.Priewe) Pseudo 3D Racing Game Engine Demo (video on youtube)
2019 Hine62/SAOH (aka Steven Hine) Neo Geo Space Invaders (video on youtube)
+2020 Chips on Steroids Galaxy Guns (demo on youtube)
2022 Tigerskunk Inviyya II / Hyperblaster (video on youtube)
2022 Frogbull Neo Mania (video on youtube)
2022 Geezer Games / Raster Wizards Alien Warhead (demos on youtube) (https://www.facebook.com/RasterWizards)
2023 Kimera Gamesoft Operation Killmeister (www.kimera.gs)
2023 Cote Gamers/LudoScience Yo-Yo Shuriken (NGCD) (cotegamers.com) (demo on youtube)
2023 Neo Byte Force Cyborg Force (https://ozzyouzo.itch.io/cyborg-force) (trailer on youtube)
+2023 Bitmap Bureau Final Vendetta (there's talk of a NeoGeo release, but...?)
+2023 NeoHomeBrew Flippers Demo (on youtube)
+2023 NeoHomeBrew Pinball Game Playfield Demo (on youtube)
+2023 NeoHomeBrew Bouncing Ball Demo (on youtube)
+
*********************************************************************************************************/
diff --git a/src/hbmame/hbmame.lst b/src/hbmame/hbmame.lst
index c5754eb9436..ddd349a7045 100644
--- a/src/hbmame/hbmame.lst
+++ b/src/hbmame/hbmame.lst
@@ -5840,6 +5840,7 @@ spcloneo // v0.7.2.2
// These are the parents of our hacks
neogeo
ngneo // .neo support
+ngmvs // multimvs support
2020bb // 030
3countb // 043
alpham2 // 007
diff --git a/src/hbmame/includes/neogeo.h b/src/hbmame/includes/neogeo.h
index f76107c633b..5dabb423f8a 100644
--- a/src/hbmame/includes/neogeo.h
+++ b/src/hbmame/includes/neogeo.h
@@ -99,6 +99,7 @@ public:
void neogeo_mj(machine_config &config);
void neogeo_noctrl(machine_config &config);
void neogeo_noslot(machine_config &config);
+ void ngmvs(machine_config &config);
void ngneo(machine_config &config);
void no_watchdog(machine_config &config);
void gsc(machine_config &config);
@@ -213,6 +214,7 @@ public:
private:
+ std::error_condition mvs_open7z(std::string zip_name, std::string filename, uint8_t *region_name, u32 region_size, u32 *file_size);
void io_control_w(offs_t offset, u8 data);
u16 memcard_r(offs_t offset);
void memcard_w(offs_t offset, u16 data, u16 mem_mask = ~0);
@@ -234,7 +236,8 @@ private:
TIMER_CALLBACK_MEMBER(display_position_interrupt_callback);
TIMER_CALLBACK_MEMBER(display_position_vblank_callback);
TIMER_CALLBACK_MEMBER(vblank_interrupt_callback);
- DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
+ DECLARE_QUICKLOAD_LOAD_MEMBER(mvs_q_cb);
+ DECLARE_QUICKLOAD_LOAD_MEMBER(neo_q_cb);
u32 screen_update_neogeo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);