summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <hazemamewip@hotmail.com>2018-05-28 01:15:53 +0100
committer ajrhacker <ajrhacker@users.noreply.github.com>2018-05-27 20:15:53 -0400
commitda7ae02b43b1d455b1a633b72fe4db5a05e971b8 (patch)
tree3ee489a47af3e7d00343ef781366edf0c7e77563
parentc412f39ec8714be3eff20ece0e109f665607a738 (diff)
new WORKING clones (#3616)
* new WORKING clones Metal Slug 3 (NGM-2560, earlier) [Razoola] * consistency (nw) * date note
-rw-r--r--hash/neogeo.xml50
-rw-r--r--src/devices/bus/neogeo/carts.cpp1
-rw-r--r--src/devices/bus/neogeo/prot_sma.cpp73
-rw-r--r--src/devices/bus/neogeo/prot_sma.h2
-rw-r--r--src/devices/bus/neogeo/slot.cpp1
-rw-r--r--src/devices/bus/neogeo/slot.h1
-rw-r--r--src/devices/bus/neogeo/sma.cpp15
-rw-r--r--src/devices/bus/neogeo/sma.h11
-rw-r--r--src/mame/drivers/neogeo.cpp64
-rw-r--r--src/mame/mame.lst1
10 files changed, 200 insertions, 19 deletions
diff --git a/hash/neogeo.xml b/hash/neogeo.xml
index 7e5feec7d24..9397dd7b20f 100644
--- a/hash/neogeo.xml
+++ b/hash/neogeo.xml
@@ -8186,9 +8186,9 @@
<!-- revision 2000.4.1 -->
<feature name="slot" value="sma_mslug3" />
<dataarea name="maincpu" width="16" endianness="big" size="0x900000">
- <rom loadflag="load16_word_swap" name="neo-sma" offset="0x0c0000" size="0x040000" crc="9cd55736" sha1="d6efb2b313127c2911d47d9324626b3f1e7c6ccb" />
+ <rom loadflag="load16_word_swap" name="green.neo-sma" offset="0x0c0000" size="0x040000" crc="9cd55736" sha1="d6efb2b313127c2911d47d9324626b3f1e7c6ccb" />
<!-- stored in the custom chip -->
- <!-- The SMA for this release has a green colour marking; the older revision has a white colour marking -->
+ <!-- The SMA has a green colour marking -->
<rom loadflag="load16_word_swap" name="256-pg1.p1" offset="0x100000" size="0x400000" crc="b07edfd5" sha1="dcbd9e500bfae98d754e55cdbbbbf9401013f8ee" /> <!-- TC5332202 -->
<rom loadflag="load16_word_swap" name="256-pg2.p2" offset="0x500000" size="0x400000" crc="6097c26b" sha1="248ec29d21216f29dc6f5f3f0e1ad1601b3501b6" /> <!-- TC5332202 -->
</dataarea>
@@ -8218,6 +8218,52 @@
</dataarea>
</part>
</software>
+
+<software name="mslug3a" cloneof="mslug3"> <!-- see neogeo.cpp for notes on this set -->
+ <description>Metal Slug 3 (NGM-2560, earlier)</description>
+ <year>2000</year>
+ <publisher>SNK</publisher>
+ <info name="serial" value="NGM-2560"/>
+ <info name="release" value="20000323"/>
+ <info name="alt_title" value="メタルスラッグ 3"/>
+ <sharedfeat name="release" value="MVS" />
+ <sharedfeat name="compatibility" value="MVS,AES" />
+ <part name="cart" interface="neo_cart">
+ <!-- revision Mar/17/2000 1:36 (from SMA rom) -->
+ <feature name="slot" value="sma_mslug3a" />
+ <dataarea name="maincpu" width="16" endianness="big" size="0x900000">
+ <rom loadflag="load16_word_swap" name="white.neo-sma" offset="0x0c0000" size="0x040000" crc="c60d29b2" sha1="1647260ccbda833b35005608ef1fdc82fba02f04" />
+ <!-- stored in the custom chip -->
+ <!-- The SMA has a white colour marking -->
+ <rom loadflag="load16_word_swap" name="256.p1" offset="0x100000" size="0x400000" crc="a1177628" sha1="4c4c379d9fc3a83265b7f32fbfce9d16b7d0f0fd" /> <!-- TC5332202 -->
+ <rom loadflag="load16_word_swap" name="256.p2" offset="0x500000" size="0x400000" crc="9b659826" sha1="d6bd03cf61879217922c18db4d3bd77095c0fe19" /> <!-- TC5332202 -->
+ </dataarea>
+ <dataarea name="fixed" size="0x80000">
+ <!-- The Encrypted Boards do _not_ have an s1 rom, data for it comes from the Cx ROMs -->
+ <rom value="0" size="0x80000" offset="0x000000" loadflag="fill" />
+ </dataarea>
+ <dataarea name="audiocpu" size="0x080000">
+ <rom offset="0x000000" size="0x080000" name="256-m1.m1" crc="eaeec116" sha1="54419dbb21edc8c4b37eaac2e7ad9496d2de037a" /> <!-- mask rom TC534000 -->
+ </dataarea>
+ <dataarea name="ymsnd" size="0x1000000">
+ <rom name="256-v1.v1" offset="0x000000" size="0x400000" crc="f2690241" sha1="fd56babc1934d10e0d27c32f032f9edda7ca8ce9" /> <!-- TC5332204 -->
+ <rom name="256-v2.v2" offset="0x400000" size="0x400000" crc="7e2a10bd" sha1="0d587fb9f64cba0315ce2d8a03e2b8fe34936dff" /> <!-- TC5332204 -->
+ <rom name="256-v3.v3" offset="0x800000" size="0x400000" crc="0eaec17c" sha1="c3ed613cc6993edd6fc0d62a90bcd85de8e21915" /> <!-- TC5332204 -->
+ <rom name="256-v4.v4" offset="0xc00000" size="0x400000" crc="9b4b22d4" sha1="9764fbf8453e52f80aa97a46fb9cf5937ef15a31" /> <!-- TC5332204 -->
+ </dataarea>
+ <dataarea name="sprites" size="0x4000000">
+ <!-- Encrypted -->
+ <rom loadflag="load16_byte" name="256-c1.c1" offset="0x000000" size="0x800000" crc="5a79c34e" sha1="b8aa51fa50935cae62ab3d125b723ab888691e60" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="256-c2.c2" offset="0x000001" size="0x800000" crc="944c362c" sha1="3843ab300f956280475469caee70135658f67089" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="256-c3.c3" offset="0x1000000" size="0x800000" crc="6e69d36f" sha1="94e8cf42e999114b4bd8b30e0aa2f365578c4c9a" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="256-c4.c4" offset="0x1000001" size="0x800000" crc="b755b4eb" sha1="804700a0966a48f130c434ede3f970792ea74fa5" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="256-c5.c5" offset="0x2000000" size="0x800000" crc="7aacab47" sha1="312c1c9846175fe1a3cad51d5ae230cf674fc93d" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="256-c6.c6" offset="0x2000001" size="0x800000" crc="c698fd5d" sha1="16818883b06849ba2f8d61bdd5e21aaf99bd8408" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="256-c7.c7" offset="0x3000000" size="0x800000" crc="cfceddd2" sha1="7def666adf8bd1703f40c61f182fc040b6362dc9" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="256-c8.c8" offset="0x3000001" size="0x800000" crc="4d9be34c" sha1="a737bdfa2b815aea7067e7af2636e83a9409c414" /> <!-- TC5364205 -->
+ </dataarea>
+ </part>
+ </software>
<software name="mslug3h" cloneof="mslug3">
<description>Metal Slug 3 (NGH-2560)</description>
diff --git a/src/devices/bus/neogeo/carts.cpp b/src/devices/bus/neogeo/carts.cpp
index 356ddf60340..94fbb70c34e 100644
--- a/src/devices/bus/neogeo/carts.cpp
+++ b/src/devices/bus/neogeo/carts.cpp
@@ -54,6 +54,7 @@ void neogeo_cart(device_slot_interface &device)
device.option_add_internal("sma_garou", NEOGEO_SMA_GAROU_CART);
device.option_add_internal("sma_garouh", NEOGEO_SMA_GAROUH_CART);
device.option_add_internal("sma_mslug3", NEOGEO_SMA_MSLUG3_CART);
+ device.option_add_internal("sma_mslug3a", NEOGEO_SMA_MSLUG3A_CART);
// These use SMA for prg & CMC50 for gfx + audiocpu
device.option_add_internal("sma_kof2k", NEOGEO_SMA_KOF2000_CART);
diff --git a/src/devices/bus/neogeo/prot_sma.cpp b/src/devices/bus/neogeo/prot_sma.cpp
index bfd15ab208a..0b81939d957 100644
--- a/src/devices/bus/neogeo/prot_sma.cpp
+++ b/src/devices/bus/neogeo/prot_sma.cpp
@@ -1,5 +1,6 @@
// license:BSD-3-Clause
-// copyright-holders:S. Smith,David Haywood,Fabio Priuli
+// copyright-holders:S. Smith,David Haywood,Fabio Priuli, Razoola, Mr.K
+// thanks to Razoola and Mr K for the decode and banking information
#include "emu.h"
#include "prot_sma.h"
@@ -64,7 +65,6 @@ WRITE16_MEMBER( sma_prot_device::kof99_bankswitch_w )
WRITE16_MEMBER( sma_prot_device::garou_bankswitch_w )
{
- // thanks to Razoola and Mr K for the info
int bankaddress;
static const int bankoffset[64] =
{
@@ -100,7 +100,6 @@ WRITE16_MEMBER( sma_prot_device::garou_bankswitch_w )
WRITE16_MEMBER( sma_prot_device::garouh_bankswitch_w )
{
- // thanks to Razoola and Mr K for the info
int bankaddress;
static const int bankoffset[64] =
{
@@ -138,7 +137,6 @@ WRITE16_MEMBER( sma_prot_device::garouh_bankswitch_w )
WRITE16_MEMBER( sma_prot_device::mslug3_bankswitch_w )
{
- // thanks to Razoola and Mr K for the info
int bankaddress;
static const int bankoffset[64] =
{
@@ -173,7 +171,6 @@ WRITE16_MEMBER( sma_prot_device::mslug3_bankswitch_w )
WRITE16_MEMBER( sma_prot_device::kof2000_bankswitch_w )
{
- // thanks to Razoola and Mr K for the info
int bankaddress;
static const int bankoffset[64] =
{
@@ -232,7 +229,6 @@ uint32_t sma_prot_device::kof99_bank_base(uint16_t sel)
uint32_t sma_prot_device::garou_bank_base(uint16_t sel)
{
- // thanks to Razoola and Mr K for the info
static const int bankoffset[64] =
{
0x000000, 0x100000, 0x200000, 0x300000, // 00
@@ -266,7 +262,6 @@ uint32_t sma_prot_device::garou_bank_base(uint16_t sel)
uint32_t sma_prot_device::garouh_bank_base(uint16_t sel)
{
- // thanks to Razoola and Mr K for the info
static const int bankoffset[64] =
{
0x000000, 0x100000, 0x200000, 0x300000, // 00
@@ -302,7 +297,6 @@ uint32_t sma_prot_device::garouh_bank_base(uint16_t sel)
uint32_t sma_prot_device::mslug3_bank_base(uint16_t sel)
{
- // thanks to Razoola and Mr K for the info
static const int bankoffset[64] =
{
0x000000, 0x020000, 0x040000, 0x060000, // 00
@@ -333,9 +327,40 @@ uint32_t sma_prot_device::mslug3_bank_base(uint16_t sel)
return bankaddress;
}
+uint32_t sma_prot_device::mslug3a_bank_base(uint16_t sel)
+{
+ static const int bankoffset[64] =
+ {
+ 0x000000, 0x030000, 0x040000, 0x070000, // 00
+ 0x080000, 0x0a0000, 0x0c0000, 0x0e0000, // 04
+ 0x0f0000, 0x100000, 0x130000, 0x140000, // 08
+ 0x150000, 0x160000, 0x190000, 0x1a0000, // 12
+ 0x1B0000, 0x1C0000, 0x1F0000, 0x200000, // 16
+ 0x210000, 0x220000, 0x250000, 0x260000, // 20
+ 0x270000, 0x280000, 0x2B0000, 0x2C0000, // 24
+ 0x2D0000, 0x2E0000, 0x310000, 0x320000, // 28
+ 0x330000, 0x340000, 0x370000, 0x380000, // 32
+ 0x390000, 0x3A0000, 0x3D0000, 0x3E0000, // 36
+ 0x400000, 0x410000, 0x440000, 0x450000, // 40
+ 0x460000, 0x470000, 0x4A0000, 0x4B0000, // 44
+ 0x4C0000, /* rest not used? */
+ };
+
+ // unscramble bank number
+ int data =
+ (BIT(sel, 15) << 0)+
+ (BIT(sel, 3) << 1)+
+ (BIT(sel, 1) << 2)+
+ (BIT(sel, 6) << 3)+
+ (BIT(sel, 12) << 4)+
+ (BIT(sel, 11) << 5);
+
+ int bankaddress = 0x100000 + bankoffset[data];
+ return bankaddress;
+}
+
uint32_t sma_prot_device::kof2000_bank_base(uint16_t sel)
{
- // thanks to Razoola and Mr K for the info
static const int bankoffset[64] =
{
0x000000, 0x100000, 0x200000, 0x300000, // 00
@@ -391,7 +416,7 @@ READ16_MEMBER( sma_prot_device::random_r )
-// kof99, garou, garouh, mslug3 and kof2000 have an SMA chip which contains program code and decrypts the 68k roms
+// kof99, garou, garouh, mslug3, mslug3a and kof2000 have an SMA chip which contains program code and decrypts the 68k roms
void sma_prot_device::kof99_decrypt_68k(uint8_t* base)
{
uint16_t *rom = (uint16_t *)(base + 0x100000);
@@ -418,7 +443,6 @@ void sma_prot_device::kof99_decrypt_68k(uint8_t* base)
void sma_prot_device::garou_decrypt_68k(uint8_t* base)
{
- // thanks to Razoola and Mr K for the info
uint16_t *rom = (uint16_t *)(base + 0x100000);
// swap data lines on the whole ROMs
@@ -444,7 +468,6 @@ void sma_prot_device::garou_decrypt_68k(uint8_t* base)
void sma_prot_device::garouh_decrypt_68k(uint8_t* base)
{
- // thanks to Razoola and Mr K for the info
uint16_t *rom = (uint16_t *)(base + 0x100000);
// swap data lines on the whole ROMs
@@ -470,7 +493,6 @@ void sma_prot_device::garouh_decrypt_68k(uint8_t* base)
void sma_prot_device::mslug3_decrypt_68k(uint8_t* base)
{
- // thanks to Razoola and Mr K for the info
uint16_t *rom = (uint16_t *)(base + 0x100000);
// swap data lines on the whole ROMs
@@ -493,10 +515,33 @@ void sma_prot_device::mslug3_decrypt_68k(uint8_t* base)
}
}
+void sma_prot_device::mslug3a_decrypt_68k(uint8_t* base)
+{
+ uint16_t *rom = (uint16_t *)(base + 0x100000);
+
+ /* swap data lines on the whole ROMs */
+ for (int i = 0;i < 0x800000/2;i++)
+ rom[i] = bitswap<16>(rom[i],2,11,12,14,9,3,1,4,13,7,6,8,10,15,0,5);
+
+ /* swap address lines & relocate fixed part */
+ rom = (uint16_t *)base;
+ for (int i = 0; i < 0x0c0000/2; i++)
+ rom[i] = rom[0x5d0000/2 + bitswap<24>(i,23,22,21,20,19,18,1,16,14,7,17,5,8,4,15,6,3,2,0,13,10,12,9,11)];
+
+ rom = (uint16_t *)(base + 0x100000);
+ /* swap address lines for the banked part */
+ for (int i = 0;i < 0x800000/2; i += 0x10000/2)
+ {
+ uint16_t buffer[0x10000/2];
+ memcpy(buffer,&rom[i],0x10000);
+ for (int j = 0;j < 0x10000/2;j++)
+ rom[i+j] = buffer[bitswap<24>(j,23,22,21,20,19,18,17,16,15,12,0,11,3,4,13,6,8,14,7,5,2,10,9,1)];
+ }
+}
+
void sma_prot_device::kof2000_decrypt_68k(uint8_t* base)
{
- // thanks to Razoola and Mr K for the info
uint16_t *rom = (uint16_t *)(base + 0x100000);
// swap data lines on the whole ROMs
diff --git a/src/devices/bus/neogeo/prot_sma.h b/src/devices/bus/neogeo/prot_sma.h
index 040d03a08d9..f0ee9733bd0 100644
--- a/src/devices/bus/neogeo/prot_sma.h
+++ b/src/devices/bus/neogeo/prot_sma.h
@@ -30,11 +30,13 @@ public:
uint32_t garou_bank_base(uint16_t sel);
uint32_t garouh_bank_base(uint16_t sel);
uint32_t mslug3_bank_base(uint16_t sel);
+ uint32_t mslug3a_bank_base(uint16_t sel);
uint32_t kof2000_bank_base(uint16_t sel);
void kof99_decrypt_68k(uint8_t* base);
void garou_decrypt_68k(uint8_t* base);
void garouh_decrypt_68k(uint8_t* base);
void mslug3_decrypt_68k(uint8_t* base);
+ void mslug3a_decrypt_68k(uint8_t* base);
void kof2000_decrypt_68k(uint8_t* base);
protected:
diff --git a/src/devices/bus/neogeo/slot.cpp b/src/devices/bus/neogeo/slot.cpp
index df57d410ea7..9a01c1b1196 100644
--- a/src/devices/bus/neogeo/slot.cpp
+++ b/src/devices/bus/neogeo/slot.cpp
@@ -158,6 +158,7 @@ static const neogeo_slot slot_list[] =
{ NEOGEO_GAROU, "sma_garou" },
{ NEOGEO_GAROUH, "sma_garouh" },
{ NEOGEO_MSLUG3, "sma_mslug3" },
+ { NEOGEO_MSLUG3A, "sma_mslug3a" },
{ NEOGEO_KOF2K, "sma_kof2k" },
{ NEOGEO_MSLUG4, "pcm2_mslug4" },
{ NEOGEO_MSLUG4P, "pcm2_ms4p" },
diff --git a/src/devices/bus/neogeo/slot.h b/src/devices/bus/neogeo/slot.h
index a90c529eea9..edeb2452a1d 100644
--- a/src/devices/bus/neogeo/slot.h
+++ b/src/devices/bus/neogeo/slot.h
@@ -30,6 +30,7 @@ enum
NEOGEO_GAROU,
NEOGEO_GAROUH,
NEOGEO_MSLUG3,
+ NEOGEO_MSLUG3A,
NEOGEO_KOF2K,
NEOGEO_MSLUG4,
NEOGEO_MSLUG4P,
diff --git a/src/devices/bus/neogeo/sma.cpp b/src/devices/bus/neogeo/sma.cpp
index 500b88eb7a1..70b03aa0a28 100644
--- a/src/devices/bus/neogeo/sma.cpp
+++ b/src/devices/bus/neogeo/sma.cpp
@@ -16,7 +16,8 @@ DEFINE_DEVICE_TYPE(NEOGEO_SMA_CART, neogeo_sma_cart_device, "neo
DEFINE_DEVICE_TYPE(NEOGEO_SMA_KOF99_CART, neogeo_sma_kof99_cart_device, "neocart_kof99", "Neo Geo KoF 99 SMA Cart")
DEFINE_DEVICE_TYPE(NEOGEO_SMA_GAROU_CART, neogeo_sma_garou_cart_device, "neocart_garou", "Neo Geo Garou SMA Cart")
DEFINE_DEVICE_TYPE(NEOGEO_SMA_GAROUH_CART, neogeo_sma_garouh_cart_device, "neocart_garouh", "Neo Geo Garou AES SMA Cart")
-DEFINE_DEVICE_TYPE(NEOGEO_SMA_MSLUG3_CART, neogeo_sma_mslug3_cart_device, "neocart_mslug3", "Neo Geo Metal Slug 3 SMA Cart")
+DEFINE_DEVICE_TYPE(NEOGEO_SMA_MSLUG3_CART, neogeo_sma_mslug3_cart_device, "neocart_mslug3", "Neo Geo Metal Slug 3 SMA Cart (green)")
+DEFINE_DEVICE_TYPE(NEOGEO_SMA_MSLUG3A_CART, neogeo_sma_mslug3a_cart_device, "neocart_mslug3a", "Neo Geo Metal Slug 3 SMA Cart (white)")
DEFINE_DEVICE_TYPE(NEOGEO_SMA_KOF2000_CART, neogeo_sma_kof2000_cart_device, "neocart_kof2000", "Neo Geo KoF 2000 SMA Cart")
@@ -127,6 +128,18 @@ void neogeo_sma_mslug3_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
m_cmc_prot->sfix_decrypt(spr_region, spr_region_size, fix_region, fix_region_size);
}
+neogeo_sma_mslug3a_cart_device::neogeo_sma_mslug3a_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ neogeo_sma_cart_device(mconfig, NEOGEO_SMA_MSLUG3A_CART, tag, owner, clock)
+{
+}
+
+void neogeo_sma_mslug3a_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
+{
+ m_sma_prot->mslug3a_decrypt_68k(cpuregion);
+ m_cmc_prot->cmc42_gfx_decrypt(spr_region, spr_region_size, MSLUG3_GFX_KEY);
+ m_cmc_prot->sfix_decrypt(spr_region, spr_region_size, fix_region, fix_region_size);
+}
+
/*************************************************
kof2000
diff --git a/src/devices/bus/neogeo/sma.h b/src/devices/bus/neogeo/sma.h
index 60b003f4c56..b4b72b3b5b5 100644
--- a/src/devices/bus/neogeo/sma.h
+++ b/src/devices/bus/neogeo/sma.h
@@ -104,6 +104,17 @@ public:
DECLARE_DEVICE_TYPE(NEOGEO_SMA_MSLUG3_CART, neogeo_sma_mslug3_cart_device)
+class neogeo_sma_mslug3a_cart_device : public neogeo_sma_cart_device
+{
+public:
+ neogeo_sma_mslug3a_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual void decrypt_all(DECRYPT_ALL_PARAMS) override;
+ virtual int get_fixed_bank_type() override { return 1; }
+ virtual uint32_t get_bank_base(uint16_t sel) override { return m_sma_prot->mslug3a_bank_base(sel); }
+};
+
+DECLARE_DEVICE_TYPE(NEOGEO_SMA_MSLUG3A_CART, neogeo_sma_mslug3a_cart_device)
+
/*************************************************
kof2000
diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp
index 007bb234c3c..b70499a203a 100644
--- a/src/mame/drivers/neogeo.cpp
+++ b/src/mame/drivers/neogeo.cpp
@@ -601,6 +601,7 @@ public:
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);
@@ -1434,6 +1435,7 @@ void neogeo_base_state::set_slot_idx(int 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]));
@@ -2497,6 +2499,11 @@ MACHINE_CONFIG_START(mvs_led_state::mslug3)
NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_mslug3")
MACHINE_CONFIG_END
+MACHINE_CONFIG_START(mvs_led_state::mslug3a)
+ mv1_fixed(config);
+ NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_mslug3a")
+MACHINE_CONFIG_END
+
MACHINE_CONFIG_START(mvs_led_state::mslug3h)
mv1_fixed(config);
NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_mslug3h")
@@ -8756,8 +8763,7 @@ ROM_END
ROM_START( mslug3 ) /* Original Version - Encrypted Code & GFX */ /* revision 2000.4.1 */ /* MVS VERSION */
ROM_REGION( 0x900000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
- ROM_LOAD16_WORD_SWAP( "neo-sma", 0x0c0000, 0x040000, CRC(9cd55736) SHA1(d6efb2b313127c2911d47d9324626b3f1e7c6ccb) ) /* stored in the custom chip */
- /* The SMA for this release has a green colour marking; the older revision has a white colour marking */
+ ROM_LOAD16_WORD_SWAP( "green.neo-sma", 0x0c0000, 0x040000, CRC(9cd55736) SHA1(d6efb2b313127c2911d47d9324626b3f1e7c6ccb) ) /* stored in the custom SMA chip, the SMA has a green colour marking */
ROM_LOAD16_WORD_SWAP( "256-pg1.p1", 0x100000, 0x400000, CRC(b07edfd5) SHA1(dcbd9e500bfae98d754e55cdbbbbf9401013f8ee) ) /* TC5332202 */
ROM_LOAD16_WORD_SWAP( "256-pg2.p2", 0x500000, 0x400000, CRC(6097c26b) SHA1(248ec29d21216f29dc6f5f3f0e1ad1601b3501b6) ) /* TC5332202 */
@@ -8789,6 +8795,59 @@ ROM_START( mslug3 ) /* Original Version - Encrypted Code & GFX */ /* revision 20
ROM_LOAD16_BYTE( "256-c8.c8", 0x3000001, 0x800000, CRC(4d9be34c) SHA1(a737bdfa2b815aea7067e7af2636e83a9409c414) ) /* Plane 2,3 */ /* TC5364205 */
ROM_END
+/*
+ The Program roms for the set below are actually 4 ROMs contained on a recycled NeoGeo Pocket card and marked
+
+ SNK48249Q
+ JAPAN9948HAK
+ T8V12A
+ (two of these)
+
+ SNK48327V
+ JAPAN9948HAK
+ T8V12A
+ (two of these)
+
+ KOF2000 and Garou boards have been found with the same setup (data verified to match existing sets)
+ The roms were dumped via the NGPC cartridge edge connector, so the exact way they should be split into 4 is unknown.
+ As a result the ROM has been split to match the usual configuration as it likely exists like this too anyway.
+*/
+
+ROM_START( mslug3a ) /* Original Version - Encrypted Code & GFX */ /* MVS VERSION */
+ ROM_REGION( 0x900000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
+ ROM_LOAD16_WORD_SWAP( "white.neo-sma", 0x0c0000, 0x040000, CRC(c60d29b2) SHA1(1647260ccbda833b35005608ef1fdc82fba02f04) ) /* stored in the custom SMA chip, the SMA has a white colour marking */
+ ROM_LOAD16_WORD_SWAP( "256.p1", 0x100000, 0x400000, CRC(a1177628) SHA1(4c4c379d9fc3a83265b7f32fbfce9d16b7d0f0fd) )
+ ROM_LOAD16_WORD_SWAP( "256.p2", 0x500000, 0x400000, CRC(9b659826) SHA1(d6bd03cf61879217922c18db4d3bd77095c0fe19) )
+
+ ROM_Y_ZOOM
+
+ /* The Encrypted Boards do not have an s1 rom, data for it comes from the Cx ROMs */
+ ROM_REGION( 0x80000, "cslot1:fixed", 0 ) /* larger char set */
+ ROM_FILL( 0x000000, 0x20000, 0x000000 )
+ ROM_REGION( 0x20000, "fixedbios", 0 )
+ ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) )
+
+ NEO_BIOS_AUDIO_512K( "256-m1.m1", CRC(eaeec116) SHA1(54419dbb21edc8c4b37eaac2e7ad9496d2de037a) ) /* mask rom TC534000 */
+
+ ROM_REGION( 0x1000000, "cslot1:ymsnd", 0 )
+ ROM_LOAD( "256-v1.v1", 0x000000, 0x400000, CRC(f2690241) SHA1(fd56babc1934d10e0d27c32f032f9edda7ca8ce9) ) /* TC5332204 */
+ ROM_LOAD( "256-v2.v2", 0x400000, 0x400000, CRC(7e2a10bd) SHA1(0d587fb9f64cba0315ce2d8a03e2b8fe34936dff) ) /* TC5332204 */
+ ROM_LOAD( "256-v3.v3", 0x800000, 0x400000, CRC(0eaec17c) SHA1(c3ed613cc6993edd6fc0d62a90bcd85de8e21915) ) /* TC5332204 */
+ ROM_LOAD( "256-v4.v4", 0xc00000, 0x400000, CRC(9b4b22d4) SHA1(9764fbf8453e52f80aa97a46fb9cf5937ef15a31) ) /* TC5332204 */
+
+ ROM_REGION( 0x4000000, "cslot1:sprites", 0 )
+ /* Encrypted */
+ ROM_LOAD16_BYTE( "256-c1.c1", 0x0000000, 0x800000, CRC(5a79c34e) SHA1(b8aa51fa50935cae62ab3d125b723ab888691e60) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "256-c2.c2", 0x0000001, 0x800000, CRC(944c362c) SHA1(3843ab300f956280475469caee70135658f67089) ) /* Plane 2,3 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "256-c3.c3", 0x1000000, 0x800000, CRC(6e69d36f) SHA1(94e8cf42e999114b4bd8b30e0aa2f365578c4c9a) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "256-c4.c4", 0x1000001, 0x800000, CRC(b755b4eb) SHA1(804700a0966a48f130c434ede3f970792ea74fa5) ) /* Plane 2,3 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "256-c5.c5", 0x2000000, 0x800000, CRC(7aacab47) SHA1(312c1c9846175fe1a3cad51d5ae230cf674fc93d) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "256-c6.c6", 0x2000001, 0x800000, CRC(c698fd5d) SHA1(16818883b06849ba2f8d61bdd5e21aaf99bd8408) ) /* Plane 2,3 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "256-c7.c7", 0x3000000, 0x800000, CRC(cfceddd2) SHA1(7def666adf8bd1703f40c61f182fc040b6362dc9) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "256-c8.c8", 0x3000001, 0x800000, CRC(4d9be34c) SHA1(a737bdfa2b815aea7067e7af2636e83a9409c414) ) /* Plane 2,3 */ /* TC5364205 */
+ROM_END
+
+
ROM_START( mslug3h ) /* Original Version - Encrypted GFX */ /* revision 2000.3.17 */ /* AES VERSION */
ROM_REGION( 0x500000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "256-ph1.p1", 0x000000, 0x100000, CRC(9c42ca85) SHA1(7a8f77a89867b889295ae9b9dfd4ba28f02d234d) )
@@ -11563,6 +11622,7 @@ GAME( 1999, garouha, garou, garou, neogeo, mvs_led_state, empty_ini
GAME( 1999, garoup, garou, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Garou - Mark of the Wolves (prototype)", MACHINE_SUPPORTS_SAVE )
GAME( 1999, garoubl, garou, garoubl, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "Garou - Mark of the Wolves (bootleg)", MACHINE_SUPPORTS_SAVE ) /* Bootleg of garoup */
GAME( 2000, mslug3, neogeo, mslug3, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Metal Slug 3 (NGM-2560)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
+GAME( 2000, mslug3a, mslug3, mslug3a, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Metal Slug 3 (NGM-2560, earlier)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX - revision Mar/17/2000 1:36 (from SMA rom) */
GAME( 2000, mslug3h, mslug3, mslug3h, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Metal Slug 3 (NGH-2560)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
GAME( 2000, mslug3b6, mslug3, mslug3b6, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "Metal Slug 6 (Metal Slug 3 bootleg)", MACHINE_SUPPORTS_SAVE ) /* real Metal Slug 6 is an Atomiswave HW game, see naomi.c ;-) */
GAME( 2000, kof2000, neogeo, kof2000, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "The King of Fighters 2000 (NGM-2570 ~ NGH-2570)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 757df79d532..4d9e7117261 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -29795,6 +29795,7 @@ mslug // 0201 (c) 1996 Nazca
mslug2 // 0241 (c) 1998 SNK
mslug2t // bootleg
mslug3 // 0256 (c) 2000 SNK
+mslug3a // 0256 (c) 2000 SNK
mslug3b6 // bootleg
mslug3h // 0256 (c) 2000 SNK
mslug4 // 0263 (c) 2002 Mega Enterprise