jking02, crzybugs - add IGS027A internal ROM dumps [Peter Wilhelmsen] (#12667)

This commit is contained in:
mamehaze 2024-08-19 05:33:48 +01:00 committed by GitHub
parent 1e3ee8b40d
commit f0abb7548d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 779 additions and 615 deletions

View File

@ -831,21 +831,11 @@ private:
// Decrypt // Decrypt
void decrypt_program_rom(int mask, int a7, int a6, int a5, int a4, int a3, int a2, int a1, int a0); void decrypt_program_rom(int mask, int a7, int a6, int a5, int a4, int a3, int a2, int a1, int a0);
void lhzb2_decrypt_sprites();
void lhzb2_decrypt_tiles();
void mgcs_decrypt_program_rom(); void mgcs_decrypt_program_rom();
void mgcs_decrypt_tiles();
void mgcs_flip_sprites();
void mgcs_igs029_run(); void mgcs_igs029_run();
void slqz2_decrypt_tiles();
void spkrform_decrypt_sprites();
void starzan_decrypt_program_rom(); void starzan_decrypt_program_rom();
void starzan_decrypt_sprites();
void tarzan_decrypt_program_rom(); void tarzan_decrypt_program_rom();
void tarzan_decrypt_sprites(size_t max_size);
void tarzan_decrypt_tiles(int address_xor);
void tarzana_decrypt_program_rom(); void tarzana_decrypt_program_rom();
void tjsb_decrypt_sprites();
// ROM Patches // ROM Patches
// void lhzb2_patch_rom(); // void lhzb2_patch_rom();
@ -1046,34 +1036,12 @@ void igs017_state::init_iqblocka()
// tjsb // tjsb
void igs017_state::tjsb_decrypt_sprites()
{
const int rom_size = memregion("igs017_igs031:sprites")->bytes();
u8 * const rom = memregion("igs017_igs031:sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xff) | bitswap<8>(i,7,6,5,2,1,4,3,0);
rom[i] = tmp[addr];
}
// data lines swap
for (int i = 0; i < rom_size; i += 2)
{
u16 data = get_u16le(&rom[i]); // x-22222-11111-00000
data = bitswap<16>(data, 15, 14,13,12,11,10, 9,1,7,6,5, 4,3,2,8,0);
put_u16le(&rom[i], data);
}
}
void igs017_state::init_tjsb() void igs017_state::init_tjsb()
{ {
decrypt_program_rom(0x05, 7, 6, 3, 2, 5, 4, 1, 0); decrypt_program_rom(0x05, 7, 6, 3, 2, 5, 4, 1, 0);
tjsb_decrypt_sprites(); m_igs017_igs031->tjsb_decrypt_sprites();
// m_igs_string->dump("tjsb_string.key", 0x1d24a, 0x1db4, false); // m_igs_string->dump("tjsb_string.key", 0x1d24a, 0x1db4, false);
} }
@ -1129,38 +1097,6 @@ void igs017_state::mgcs_decrypt_program_rom()
} }
} }
void igs017_state::mgcs_decrypt_tiles()
{
const int rom_size = memregion("igs017_igs031:tilemaps")->bytes();
u8 * const rom = memregion("igs017_igs031:tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10,6,7,8,9,5,4,3,2,1,0);
rom[i^1] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7);
}
}
void igs017_state::mgcs_flip_sprites()
{
const int rom_size = memregion("igs017_igs031:sprites")->bytes();
u8 * const rom = memregion("igs017_igs031:sprites")->base();
for (int i = 0; i < rom_size; i+=2)
{
u16 pixels = get_u16le(&rom[i]);
// flip bits
pixels = bitswap<16>(pixels,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
// flip pixels
pixels = bitswap<16>(pixels,15, 0,1,2,3,4, 5,6,7,8,9, 10,11,12,13,14);
put_u16le(&rom[i], pixels);
}
}
#if 0 #if 0
void igs017_state::mgcs_patch_rom() void igs017_state::mgcs_patch_rom()
@ -1181,8 +1117,8 @@ void igs017_state::init_mgcs()
mgcs_decrypt_program_rom(); mgcs_decrypt_program_rom();
// mgcs_patch_rom(); // mgcs_patch_rom();
mgcs_decrypt_tiles(); m_igs017_igs031->mgcs_decrypt_tiles();
mgcs_flip_sprites(); m_igs017_igs031->mgcs_flip_sprites();
// m_igs_string->dump("mgcs_string.key", 0x1424, 0x1338, true); // m_igs_string->dump("mgcs_string.key", 0x1424, 0x1338, true);
} }
@ -1190,19 +1126,6 @@ void igs017_state::init_mgcs()
// tarzan, tarzana // tarzan, tarzana
void igs017_state::tarzan_decrypt_tiles(int address_xor)
{
const int rom_size = memregion("igs017_igs031:tilemaps")->bytes();
u8 * const rom = memregion("igs017_igs031:tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | (bitswap<16>(i,15,14,13,12,11, 7,8,6,10,9, 5,4,3,2,1,0) ^ address_xor);
rom[i] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7);
}
}
void igs017_state::tarzan_decrypt_program_rom() void igs017_state::tarzan_decrypt_program_rom()
{ {
@ -1238,8 +1161,8 @@ void igs017_state::tarzan_decrypt_program_rom()
void igs017_state::init_tarzanc() void igs017_state::init_tarzanc()
{ {
tarzan_decrypt_program_rom(); tarzan_decrypt_program_rom();
tarzan_decrypt_tiles(1); m_igs017_igs031->tarzan_decrypt_tiles(1);
tarzan_decrypt_sprites(0); m_igs017_igs031->tarzan_decrypt_sprites(0);
// m_igs_string->dump("tarzan_string.key", 0xa98a, 0xab01, false); // tarzan / tarzanc (same program rom) // m_igs_string->dump("tarzan_string.key", 0xa98a, 0xab01, false); // tarzan / tarzanc (same program rom)
} }
@ -1283,7 +1206,7 @@ void igs017_state::tarzana_decrypt_program_rom()
void igs017_state::init_tarzan() void igs017_state::init_tarzan()
{ {
tarzan_decrypt_program_rom(); tarzan_decrypt_program_rom();
tarzan_decrypt_tiles(0); m_igs017_igs031->tarzan_decrypt_tiles(0);
// m_igs_string->dump("tarzan_string.key", 0xa98a, 0xab01, false); // tarzan / tarzanc (same program rom) // m_igs_string->dump("tarzan_string.key", 0xa98a, 0xab01, false); // tarzan / tarzanc (same program rom)
} }
@ -1291,7 +1214,7 @@ void igs017_state::init_tarzan()
void igs017_state::init_tarzana() void igs017_state::init_tarzana()
{ {
tarzana_decrypt_program_rom(); tarzana_decrypt_program_rom();
tarzan_decrypt_tiles(0); m_igs017_igs031->tarzan_decrypt_tiles(0);
// m_igs_string->dump("tarzana_string.key", 0xaa64, 0xabdb, false); // same data as tarzan / tarzanc // m_igs_string->dump("tarzana_string.key", 0xaa64, 0xabdb, false); // same data as tarzan / tarzanc
} }
@ -1338,49 +1261,13 @@ void igs017_state::starzan_decrypt_program_rom()
void igs017_state::init_starzan() void igs017_state::init_starzan()
{ {
starzan_decrypt_program_rom(); starzan_decrypt_program_rom();
tarzan_decrypt_tiles(1); m_igs017_igs031->tarzan_decrypt_tiles(1);
starzan_decrypt_sprites(); m_igs017_igs031->starzan_decrypt_sprites(0x200000);
// m_igs_string->dump("starzan_string.key", 0xa86f, 0xa966, false); // m_igs_string->dump("starzan_string.key", 0xa86f, 0xa966, false);
} }
void igs017_state::tarzan_decrypt_sprites(size_t max_size)
{
mgcs_flip_sprites();
const int rom_size = max_size ? max_size : memregion("igs017_igs031:sprites")->bytes();
u8 *rom = memregion("igs017_igs031:sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13, 9,10,11,12, 5,6,7,8, 4,3,2,1,0);
rom[i] = tmp[addr];
}
}
void igs017_state::starzan_decrypt_sprites()
{
tarzan_decrypt_sprites(0x200000);
// Overlay rom:
const int rom_size = 0x80000;
u8 *rom = memregion("igs017_igs031:sprites")->base() + 0x200000;
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10,9, 6,5, 8,7, 1,2,3,4, 0);
rom[i] = tmp[addr];
}
}
void igs017_state::init_happyskl() void igs017_state::init_happyskl()
{ {
const int rom_size = memregion("maincpu")->bytes(); const int rom_size = memregion("maincpu")->bytes();
@ -1416,8 +1303,8 @@ void igs017_state::init_happyskl()
rom[i] = x; rom[i] = x;
} }
tarzan_decrypt_tiles(1); m_igs017_igs031->tarzan_decrypt_tiles(1);
starzan_decrypt_sprites(); m_igs017_igs031->starzan_decrypt_sprites(0x200000);
} }
@ -1441,8 +1328,8 @@ void igs017_state::init_cpoker2()
rom[i] = x; rom[i] = x;
} }
tarzan_decrypt_tiles(1); m_igs017_igs031->tarzan_decrypt_tiles(1);
tarzan_decrypt_sprites(0); m_igs017_igs031->tarzan_decrypt_sprites(0);
} }
@ -1558,7 +1445,7 @@ void igs017_state::init_mgdha()
rom[i] = x; rom[i] = x;
} }
mgcs_flip_sprites(); m_igs017_igs031->mgcs_flip_sprites();
// m_igs_string->dump("mgdh_string.key", 0x7b214, 0x7b128, true); // mgdh, mgdha (0x7c5ba, ???) // m_igs_string->dump("mgdh_string.key", 0x7b214, 0x7b128, true); // mgdh, mgdha (0x7c5ba, ???)
} }
@ -1594,43 +1481,6 @@ void igs017_state::lhzb2_patch_rom()
} }
#endif #endif
void igs017_state::lhzb2_decrypt_tiles()
{
const int rom_size = memregion("igs017_igs031:tilemaps")->bytes();
u8 * const rom = memregion("igs017_igs031:tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,18,17,1,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0);
rom[i] = tmp[addr];
}
}
void igs017_state::lhzb2_decrypt_sprites()
{
const int rom_size = memregion("igs017_igs031:sprites")->bytes();
u8 * const rom = memregion("igs017_igs031:sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,6,7,10,9,8,11,12,5,4,3,2,1,0);
rom[i] = tmp[addr];
}
// data lines swap
for (int i = 0; i < rom_size; i+=2)
{
u16 data = get_u16le(&rom[i]); // x-22222-11111-00000
data = bitswap<16>(data, 15, 7,6,5,4,3, 2,1,0,14,13, 12,11,10,9,8);
put_u16le(&rom[i], data);
}
}
void igs017_state::init_lhzb2() void igs017_state::init_lhzb2()
{ {
const int rom_size = memregion("maincpu")->bytes(); const int rom_size = memregion("maincpu")->bytes();
@ -1714,8 +1564,8 @@ void igs017_state::init_lhzb2()
rom[i] = x; rom[i] = x;
} }
lhzb2_decrypt_tiles(); m_igs017_igs031->lhzb2_decrypt_tiles();
lhzb2_decrypt_sprites(); m_igs017_igs031->lhzb2_decrypt_sprites();
// lhzb2_patch_rom(); // lhzb2_patch_rom();
@ -1780,8 +1630,8 @@ void igs017_state::init_lhzb2a()
rom[i] = x; rom[i] = x;
} }
lhzb2_decrypt_tiles(); m_igs017_igs031->lhzb2_decrypt_tiles();
lhzb2_decrypt_sprites(); m_igs017_igs031->lhzb2_decrypt_sprites();
// m_igs_string->dump("lhzb2a_string.key", 0x6e11c, 0x6e030, true); // same data as lhzb2 // m_igs_string->dump("lhzb2a_string.key", 0x6e11c, 0x6e030, true); // same data as lhzb2
} }
@ -1802,20 +1652,6 @@ void igs017_state::slqz2_patch_rom()
} }
#endif #endif
void igs017_state::slqz2_decrypt_tiles()
{
const int rom_size = memregion("igs017_igs031:tilemaps")->bytes();
u8 * const rom = memregion("igs017_igs031:tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xff) | bitswap<8>(i,7,4,5,6,3,2,1,0);
rom[i] = tmp[addr];
}
}
void igs017_state::init_slqz2() void igs017_state::init_slqz2()
{ {
const int rom_size = memregion("maincpu")->bytes(); const int rom_size = memregion("maincpu")->bytes();
@ -1890,8 +1726,8 @@ void igs017_state::init_slqz2()
rom[i] = x; rom[i] = x;
} }
slqz2_decrypt_tiles(); m_igs017_igs031->slqz2_decrypt_tiles();
lhzb2_decrypt_sprites(); m_igs017_igs031->lhzb2_decrypt_sprites();
// slqz2_patch_rom(); // slqz2_patch_rom();
@ -1901,26 +1737,6 @@ void igs017_state::init_slqz2()
// spkrform // spkrform
void igs017_state::spkrform_decrypt_sprites()
{
const int rom_size = memregion("igs017_igs031:sprites")->bytes();
u8 * const rom = memregion("igs017_igs031:sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr;
if (i & 0x80000)
addr = (i & ~0xff) | bitswap<8>(i,7,6,3,4,5,2,1,0);
else
addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10, 4, 8,7,6,5, 9,3,2,1,0);
rom[i] = tmp[addr];
}
}
void igs017_state::spkrform_patch_rom() void igs017_state::spkrform_patch_rom()
{ {
u8 * const rom = memregion("maincpu")->base(); u8 * const rom = memregion("maincpu")->base();
@ -1933,7 +1749,7 @@ void igs017_state::init_spkrform()
{ {
decrypt_program_rom(0x14, 7, 6, 5, 4, 3, 0, 1, 2); decrypt_program_rom(0x14, 7, 6, 5, 4, 3, 0, 1, 2);
spkrform_decrypt_sprites(); m_igs017_igs031->spkrform_decrypt_sprites();
spkrform_patch_rom(); spkrform_patch_rom();

View File

@ -14,6 +14,8 @@ providing the interface to the 8255, or is it coincidence?
#include "emu.h" #include "emu.h"
#include "igs017_igs031.h" #include "igs017_igs031.h"
#include "multibyte.h"
void igs017_igs031_device::map(address_map &map) void igs017_igs031_device::map(address_map &map)
{ {
map(0x1000, 0x17ff).ram().share("spriteram"); map(0x1000, 0x17ff).ram().share("spriteram");
@ -328,7 +330,8 @@ void igs017_igs031_device::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cl
{ {
const int y = s[0] + (s[1] << 8); const int y = s[0] + (s[1] << 8);
int x = s[2] + (s[3] << 8); int x = s[2] + (s[3] << 8);
u32 addr = (s[4] >> 6) | (s[5] << 2) | (s[6] << 10) | ((s[7] & 0x07) << 18); u32 addr = (s[4] >> 6) | (s[5] << 2) | (s[6] << 10) | ((s[7] & 0x0f) << 18);
addr *= 3; addr *= 3;
const int flipx = s[7] & 0x10; const int flipx = s[7] & 0x10;
@ -439,3 +442,203 @@ void igs017_igs031_device::irq_enable_w(u8 data)
if (data != 0 && data != 1 && data != 0xff) if (data != 0 && data != 1 && data != 0xff)
logerror("%s: irq_enable = %02x\n", machine().describe_context(), data); logerror("%s: irq_enable = %02x\n", machine().describe_context(), data);
} }
// Are these decryption a programmable function of the 031?
void igs017_igs031_device::mgcs_decrypt_tiles()
{
const int rom_size = memregion("tilemaps")->bytes();
u8 * const rom = memregion("tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10,6,7,8,9,5,4,3,2,1,0);
rom[i^1] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7);
}
}
void igs017_igs031_device::slqz2_decrypt_tiles()
{
const int rom_size = memregion("tilemaps")->bytes();
u8 * const rom = memregion("tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xff) | bitswap<8>(i,7,4,5,6,3,2,1,0);
rom[i] = tmp[addr];
}
}
void igs017_igs031_device::tarzan_decrypt_tiles(int address_xor)
{
const int rom_size = memregion("tilemaps")->bytes();
u8 * const rom = memregion("tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | (bitswap<16>(i,15,14,13,12,11, 7,8,6,10,9, 5,4,3,2,1,0) ^ address_xor);
rom[i] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7);
}
}
void igs017_igs031_device::lhzb2_decrypt_tiles()
{
const int rom_size = memregion("tilemaps")->bytes();
u8 * const rom = memregion("tilemaps")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
memcpy(&tmp[0], rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,18,17,1,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0);
rom[i] = tmp[addr];
}
}
void igs017_igs031_device::sdwx_gfx_decrypt()
{
unsigned rom_size = 0x80000;
u8 *src = (u8 *) (memregion("tilemaps")->base());
std::vector<u8> result_data(rom_size);
for (int i = 0; i < rom_size; i++)
result_data[i] = src[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 8, 7, 6, 10, 9, 5, 4, 3, 2, 1, 0)];
for (int i = 0; i < rom_size; i += 0x200)
{
memcpy(src + i + 0x000, &result_data[i + 0x000], 0x80);
memcpy(src + i + 0x080, &result_data[i + 0x100], 0x80);
memcpy(src + i + 0x100, &result_data[i + 0x080], 0x80);
memcpy(src + i + 0x180, &result_data[i + 0x180], 0x80);
}
}
void igs017_igs031_device::mgcs_flip_sprites()
{
const int rom_size = memregion("sprites")->bytes();
u8 * const rom = memregion("sprites")->base();
for (int i = 0; i < rom_size; i+=2)
{
u16 pixels = get_u16le(&rom[i]);
// flip bits
pixels = bitswap<16>(pixels,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
// flip pixels
pixels = bitswap<16>(pixels,15, 0,1,2,3,4, 5,6,7,8,9, 10,11,12,13,14);
put_u16le(&rom[i], pixels);
}
}
void igs017_igs031_device::tjsb_decrypt_sprites()
{
const int rom_size = memregion("sprites")->bytes();
u8 * const rom = memregion("sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xff) | bitswap<8>(i,7,6,5,2,1,4,3,0);
rom[i] = tmp[addr];
}
// data lines swap
for (int i = 0; i < rom_size; i += 2)
{
u16 data = get_u16le(&rom[i]); // x-22222-11111-00000
data = bitswap<16>(data, 15, 14,13,12,11,10, 9,1,7,6,5, 4,3,2,8,0);
put_u16le(&rom[i], data);
}
}
void igs017_igs031_device::tarzan_decrypt_sprites(size_t max_size)
{
mgcs_flip_sprites();
const int rom_size = max_size ? max_size : memregion("sprites")->bytes();
u8 *rom = memregion("sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13, 9,10,11,12, 5,6,7,8, 4,3,2,1,0);
rom[i] = tmp[addr];
}
}
void igs017_igs031_device::starzan_decrypt_sprites(size_t max_size)
{
tarzan_decrypt_sprites(max_size);
// Overlay rom:
const int rom_size = 0x80000;
u8 *rom = memregion("sprites")->base() + max_size;
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10,9, 6,5, 8,7, 1,2,3,4, 0);
rom[i] = tmp[addr];
}
}
void igs017_igs031_device::spkrform_decrypt_sprites()
{
const int rom_size = memregion("sprites")->bytes();
u8 * const rom = memregion("sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr;
if (i & 0x80000)
addr = (i & ~0xff) | bitswap<8>(i,7,6,3,4,5,2,1,0);
else
addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10, 4, 8,7,6,5, 9,3,2,1,0);
rom[i] = tmp[addr];
}
}
void igs017_igs031_device::lhzb2_decrypt_sprites()
{
const int rom_size = memregion("sprites")->bytes();
u8 * const rom = memregion("sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(rom_size);
// address lines swap
memcpy(tmp.get(), rom, rom_size);
for (int i = 0; i < rom_size; i++)
{
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,6,7,10,9,8,11,12,5,4,3,2,1,0);
rom[i] = tmp[addr];
}
// data lines swap
for (int i = 0; i < rom_size; i+=2)
{
u16 data = get_u16le(&rom[i]); // x-22222-11111-00000
data = bitswap<16>(data, 15, 7,6,5,4,3, 2,1,0,14,13, 12,11,10,9,8);
put_u16le(&rom[i], data);
}
}

View File

@ -58,6 +58,20 @@ public:
void irq_enable_w(u8 data); void irq_enable_w(u8 data);
virtual void video_start(); virtual void video_start();
void lhzb2_decrypt_tiles();
void mgcs_decrypt_tiles();
void tarzan_decrypt_tiles(int address_xor);
void slqz2_decrypt_tiles();
void sdwx_gfx_decrypt();
void mgcs_flip_sprites();
void lhzb2_decrypt_sprites();
void tarzan_decrypt_sprites(size_t max_size);
void spkrform_decrypt_sprites();
void starzan_decrypt_sprites(size_t max_size);
void tjsb_decrypt_sprites();
protected: protected:
virtual void device_add_mconfig(machine_config &config) override; virtual void device_add_mconfig(machine_config &config) override;
virtual void device_start() override; virtual void device_start() override;

View File

@ -1,5 +1,5 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders: Xing Xing // copyright-holders: Xing Xing, David Haywood
/* IGS ARM7 (IGS027A) based Mahjong / Gambling platform(s) /* IGS ARM7 (IGS027A) based Mahjong / Gambling platform(s)
Driver by Xing Xing Driver by Xing Xing
@ -15,13 +15,6 @@
To emulate these games the Internal ROM will need dumping To emulate these games the Internal ROM will need dumping
There are at least 20 other games on this and similar platforms. There are at least 20 other games on this and similar platforms.
Many of these also seem to have a 80C51 based MCU, also covered by
a holographic sticker, this appears to be unprotected but has only been
read for a few sets, it probably either acts as a secondary protection
device or as a main CPU instructing the ARM.
For Crazy Bugs, MCUs with stickers J9 and F9 have been dumped and both
contained the same data, despite the different sticker.
*/ */
#include "emu.h" #include "emu.h"
@ -31,13 +24,12 @@
#include "cpu/arm7/arm7.h" #include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h" #include "cpu/arm7/arm7core.h"
#include "cpu/xa/xa.h"
#include "machine/i8255.h"
#include "machine/nvram.h" #include "machine/nvram.h"
#include "screen.h" #include "screen.h"
namespace { namespace {
class igs_m027_state : public driver_device class igs_m027_state : public driver_device
@ -47,12 +39,11 @@ public:
driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_igs_mainram(*this, "igs_mainram"), m_igs_mainram(*this, "igs_mainram"),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_xa(*this, "xa"), m_ppi(*this, "ppi8255"),
m_igs017_igs031(*this, "igs017_igs031") m_igs017_igs031(*this, "igs017_igs031")
{ } { }
void igs_mahjong(machine_config &config); void igs_mahjong(machine_config &config);
void igs_mahjong_xa(machine_config &config);
void init_sdwx(); void init_sdwx();
void init_chessc2(); void init_chessc2();
@ -61,7 +52,6 @@ public:
void init_lhzb3(); void init_lhzb3();
void init_gonefsh2(); void init_gonefsh2();
void init_sddz(); void init_sddz();
void init_hauntedh();
void init_zhongguo(); void init_zhongguo();
void init_klxyj(); void init_klxyj();
void init_slqz3(); void init_slqz3();
@ -72,15 +62,11 @@ public:
void init_qlgs(); void init_qlgs();
void init_mgzz(); void init_mgzz();
void init_mgcs3(); void init_mgcs3();
void init_crzybugs();
void init_crzybugsj();
void init_jking02(); void init_jking02();
void init_lhdmg();
void init_lthy();
void init_luckycrs(); void init_luckycrs();
void init_olympic5(); void init_olympic5();
void init_tripfev();
void init_wldfruit();
void init_lthy();
[[maybe_unused]] void init_no_dec();
protected: protected:
virtual void video_start() override; virtual void video_start() override;
@ -88,68 +74,20 @@ protected:
private: private:
optional_shared_ptr<u32> m_igs_mainram; optional_shared_ptr<u32> m_igs_mainram;
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
optional_device<mx10exa_cpu_device> m_xa; optional_device<i8255_device> m_ppi;
required_device<igs017_igs031_device> m_igs017_igs031; required_device<igs017_igs031_device> m_igs017_igs031;
u32 unk_r()
{
return 0xffffffff;
}
void vblank_irq(int state); void vblank_irq(int state);
void sdwx_gfx_decrypt();
void pgm_create_dummy_internal_arm_region(); void pgm_create_dummy_internal_arm_region();
void igs_mahjong_map(address_map &map); void igs_mahjong_map(address_map &map);
}; };
/***************************************************************************
Video
0x38001000, 0x380017ff CG_CONTROL,8 byte per object, 0x100 in total
0x38001800, 0x380019ff PALETTE RAM,2 byte per color, 0x100 in total
0x38004000, 0x38005FFF TX Video RAM????????1E00??????512x240??????
0x38006000, 0x38007FFF BG Video RAM????????1E00??????512x240??????
***************************************************************************/
// CGLayer
#if 0
void igs_m027_state::igs_cg_videoram_w(offs_t offset, u32_t data, u32_t mem_mask)
{
COMBINE_DATA(&m_igs_cg_videoram[offset]);
// if(data != 0)
logerror("PC(%08X) CG @%x = %x!\n", m_maincpu->pc(), offset , m_igs_cg_videoram[offset]);
/*
ROM:08020520 DCW 0x3E ddd1 y
ROM:08020522 DCW 0x29 ddd2 x
ROM:08020524 DCD 0x190BB6 ddd3 n
ROM:08020528 DCW 0xC ddd4 Y
ROM:0802052A DCW 0xA6 ddd5 X
(ddd5+?)??10bit
ddd2??9bit
(ddd4+?)??11bit
ddd1??8bit
ddd3??10bit
8060a4a6 2642ed8f
A6A46080 8FED4226
XXXX-XXXX
XXxx-xxxx
xxxY-YYYY
YYYY-YYyy
yyyy-yynn
nnnn-nnnn
*/
}
#endif
void igs_m027_state::video_start() void igs_m027_state::video_start()
{ {
m_igs017_igs031->video_start(); m_igs017_igs031->video_start();
@ -169,7 +107,9 @@ void igs_m027_state::igs_mahjong_map(address_map &map)
map(0x10000000, 0x100003ff).ram().share("igs_mainram"); // main RAM for ASIC? map(0x10000000, 0x100003ff).ram().share("igs_mainram"); // main RAM for ASIC?
map(0x18000000, 0x18007fff).ram(); map(0x18000000, 0x18007fff).ram();
map(0x38000000, 0x38007fff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)); // guess based on below map(0x38000000, 0x38007fff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write));
map(0x38008000, 0x38008003).r(FUNC(igs_m027_state::unk_r));
map(0x38009000, 0x38009003).ram(); //?????????????? oki 6295 map(0x38009000, 0x38009003).ram(); //?????????????? oki 6295
@ -215,23 +155,6 @@ static const u8 sdwx_tab[] =
void igs_m027_state::sdwx_gfx_decrypt()
{
unsigned rom_size = 0x80000;
u8 *src = (u8 *) (memregion("igs017_igs031:tilemaps")->base());
std::vector<u8> result_data(rom_size);
for (int i = 0; i < rom_size; i++)
result_data[i] = src[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 8, 7, 6, 10, 9, 5, 4, 3, 2, 1, 0)];
for (int i = 0; i < rom_size; i += 0x200)
{
memcpy(src + i + 0x000, &result_data[i + 0x000], 0x80);
memcpy(src + i + 0x080, &result_data[i + 0x100], 0x80);
memcpy(src + i + 0x100, &result_data[i + 0x080], 0x80);
memcpy(src + i + 0x180, &result_data[i + 0x180], 0x80);
}
}
/*************************************************************************** /***************************************************************************
@ -251,10 +174,22 @@ void igs_m027_state::sdwx_gfx_decrypt()
***************************************************************************/ ***************************************************************************/
static INPUT_PORTS_START( sdwx ) static INPUT_PORTS_START( base )
PORT_START("TEST0")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("TEST1")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("TEST2")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END INPUT_PORTS_END
static INPUT_PORTS_START( amazonia ) static INPUT_PORTS_START( amazonia )
PORT_INCLUDE(base)
PORT_START("DSW1") PORT_START("DSW1")
// Credits proportion // Credits proportion
PORT_DIPNAME( 0x03, 0x03, "Proporcao Credito" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPNAME( 0x03, 0x03, "Proporcao Credito" ) PORT_DIPLOCATION("SW1:1,2")
@ -355,29 +290,25 @@ void igs_m027_state::igs_mahjong(machine_config &config)
screen.set_refresh_hz(60); screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(512, 256); screen.set_size(512, 256);
screen.set_visarea(0, 512-1, 0, 256-1); screen.set_visarea(0, 512-1, 0, 240-1);
screen.set_screen_update("igs017_igs031", FUNC(igs017_igs031_device::screen_update)); screen.set_screen_update("igs017_igs031", FUNC(igs017_igs031_device::screen_update));
screen.set_palette("igs017_igs031:palette"); screen.set_palette("igs017_igs031:palette");
screen.screen_vblank().set(FUNC(igs_m027_state::vblank_irq)); screen.screen_vblank().set(FUNC(igs_m027_state::vblank_irq));
I8255A(config, m_ppi);
m_ppi->in_pa_callback().set_ioport("TEST0");
m_ppi->in_pb_callback().set_ioport("TEST1");
m_ppi->in_pc_callback().set_ioport("TEST2");
IGS017_IGS031(config, m_igs017_igs031, 0); IGS017_IGS031(config, m_igs017_igs031, 0);
m_igs017_igs031->set_text_reverse_bits(); m_igs017_igs031->set_text_reverse_bits();
//m_igs017_igs031->set_i8255_tag("ppi8255"); m_igs017_igs031->set_i8255_tag("ppi8255");
// 82C55? (accessed through igs017/igs031 area like igs017.cpp?)
// sound hardware // sound hardware
// OK6295 // OK6295
} }
void igs_m027_state::igs_mahjong_xa(machine_config &config)
{
igs_mahjong(config);
MX10EXA(config, m_xa, 10000000); // MX10EXAQC (Philips 80C51 XA) unknown frequency
}
/*************************************************************************** /***************************************************************************
ROMs Loading ROMs Loading
@ -633,7 +564,7 @@ ROM_END
ROM_START( jking02 ) // PCB-0367-05-FG-1 ROM_START( jking02 ) // PCB-0367-05-FG-1
ROM_REGION( 0x04000, "maincpu", 0 ) ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A type G ARM based MCU // Internal ROM of IGS027A type G ARM based MCU
ROM_LOAD( "jking02_igs027a", 0x00000, 0x4000, NO_DUMP ) // stickered J6 ROM_LOAD( "j6_027a.bin", 0x0000, 0x4000, CRC(69e241f0) SHA1(1ae0aabb217c67ee6e7126f3f0f90c8b3e051888) ) // J6 holographic sticker
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "j_k_2002_v-209us.u23", 0x00000, 0x80000, CRC(ef6b652b) SHA1(ee5c2cef2c7cbcd4a70e05c01295e964ca5e45d1) ) // 27C4096 ROM_LOAD( "j_k_2002_v-209us.u23", 0x00000, 0x80000, CRC(ef6b652b) SHA1(ee5c2cef2c7cbcd4a70e05c01295e964ca5e45d1) ) // 27C4096
@ -1153,164 +1084,6 @@ ROM_START( chessc2 )
ROM_END ROM_END
// prg at u34
// text at u15
// cg at u32 / u12
// samples at u3
ROM_START( haunthig )
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "haunthig_igs027a", 0x00000, 0x4000, NO_DUMP )
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "hauntedhouse_ver-109us.u34", 0x000000, 0x80000, CRC(300fed78) SHA1(afa4c8855cd780c57d4f92ea6131ed4e77063268) )
ROM_REGION( 0x10000, "xa", 0 )
ROM_LOAD( "hauntedhouse.u17", 0x000000, 0x10000, BAD_DUMP CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) ) // not dumped for this set
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "haunted-h_text.u15", 0x000000, 0x80000, CRC(c23f48c8) SHA1(0cb1b6c61611a081ae4a3c0be51812045ff632fe) )
// are these PGM-like sprites?
ROM_REGION( 0x800000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "haunted-h_cg.u32", 0x000000, 0x400000, BAD_DUMP CRC(e0ea10e6) SHA1(e81be78fea93e72d4b1f4c0b58560bda46cf7948) ) // not dumped for this set, FIXED BITS (xxxxxxx0xxxxxxxx)
ROM_LOAD( "haunted-h_ext.u12", 0x400000, 0x400000, BAD_DUMP CRC(662eb883) SHA1(831ebe29e1e7a8b2c2fff7fbc608975771c3486c) ) // not dumped for this set, FIXED BITS (xxxxxxxx0xxxxxxx)
ROM_REGION( 0x200000, "samples", 0 ) // Oki M6295 samples, missing sample table, bad?
ROM_LOAD( "haunted-h_sp.u3", 0x00000, 0x200000, BAD_DUMP CRC(fe3fcddf) SHA1(ac57ab6d4e4883747c093bd19d0025cf6588cb2c) ) // not dumped for this set
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "hu_u38a.u38", 0x000, 0x117, NO_DUMP ) // ATF16V8B, protected
ROM_LOAD( "hu_u39.u39", 0x200, 0x2dd, CRC(75f58b46) SHA1(7cb136a41899ddd50c95a67ca6353ce5d8d92149) ) // AT22V10
ROM_END
ROM_START( haunthiga ) // IGS PCB-0575-04-HU - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 2x 8-dip banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "haunthig_igs027a", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'H2'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "hauntedhouse_ver-101us.u34", 0x000000, 0x80000, CRC(4bf045d4) SHA1(78c848fd69961df8d9b75f92ad57c3534fbf08db) )
ROM_REGION( 0x10000, "xa", 0 )
ROM_LOAD( "hauntedhouse.u17", 0x000000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) ) // MX10EXAQC (80C51 XA based MCU) marked J9, not read protected?
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "haunted-h_text.u15", 0x000000, 0x80000, CRC(c23f48c8) SHA1(0cb1b6c61611a081ae4a3c0be51812045ff632fe) )
// are these PGM-like sprites?
ROM_REGION( 0x800000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "haunted-h_cg.u32", 0x000000, 0x400000, CRC(e0ea10e6) SHA1(e81be78fea93e72d4b1f4c0b58560bda46cf7948) ) // FIXED BITS (xxxxxxx0xxxxxxxx)
ROM_LOAD( "haunted-h_ext.u12", 0x400000, 0x400000, CRC(662eb883) SHA1(831ebe29e1e7a8b2c2fff7fbc608975771c3486c) ) // FIXED BITS (xxxxxxxx0xxxxxxx)
ROM_REGION( 0x200000, "samples", 0 ) // Oki M6295 samples, missing sample table, bad?
ROM_LOAD( "haunted-h_sp.u3", 0x00000, 0x200000, CRC(fe3fcddf) SHA1(ac57ab6d4e4883747c093bd19d0025cf6588cb2c) )
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "hu_u38a.u38", 0x000, 0x117, NO_DUMP ) // ATF16V8B, protected
ROM_LOAD( "hu_u39.u39", 0x200, 0x2dd, CRC(75f58b46) SHA1(7cb136a41899ddd50c95a67ca6353ce5d8d92149) ) // AT22V10
ROM_END
ROM_START( crzybugs ) // IGS PCB-0447-05-GM - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 3x 8-DIP banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "m7.u37", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'M7'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-204us.u23", 0x000000, 0x80000, CRC(d1232462) SHA1(685a292f39bf57a80d6ef31289cf9f673ba06dd4) ) // MX27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU) marked J9
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 ) // not dumped for this set
ROM_LOAD( "crazy_bugs_text_u10.u10", 0x000000, 0x80000, BAD_DUMP CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) )
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 ) // not dumped for this set
ROM_LOAD( "crazy_bugs_cg.u19", 0x000000, 0x200000, BAD_DUMP CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazy_bugs_sp.u15", 0x000000, 0x200000, CRC(b15974a1) SHA1(82509902bbb33a2120d815e7879b9b8591a29976) ) // M27C160
ROM_END
ROM_START( crzybugsa )
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "crzybugsa.u37", 0x00000, 0x4000, NO_DUMP )
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-202us.u23", 0x000000, 0x80000, CRC(210da1e6) SHA1(c726497bebd25d6a9053e331b4c26acc7e2db0b2) ) // MX27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU)
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "crazy_bugs_text_u10.u10", 0x000000, 0x80000, CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) ) // M27C4002
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "crazy_bugs_cg.u19", 0x000000, 0x200000, CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // M27C160, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazy_bugs_sp.u15", 0x000000, 0x200000, CRC(591b315b) SHA1(fda1816d83e202170dba4afc6e7898b706a76087) ) // M27C160
ROM_END
ROM_START( crzybugsb )
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "crzybugsb.u37", 0x00000, 0x4000, NO_DUMP )
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-202us.u23", 0x000000, 0x80000, CRC(129e36e9) SHA1(53f20bc3792249de8ef276f84283baa9abd30acd) ) // MX27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU)
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "crazy_bugs_text_u10.u10", 0x000000, 0x80000, BAD_DUMP CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) ) // not dumped for this set
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "crazy_bugs_cg.u19", 0x000000, 0x200000, BAD_DUMP CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // not dumped for this set, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazy_bugs_sp.u15", 0x000000, 0x200000, BAD_DUMP CRC(591b315b) SHA1(fda1816d83e202170dba4afc6e7898b706a76087) ) // not dumped for this set
ROM_END
ROM_START( crzybugsj ) // IGS PCB-0575-04-HU - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 2x 8-dip banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "m6.u42", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'M6'
ROM_REGION32_LE( 0x200000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-103jp.u34", 0x000000, 0x200000, CRC(1e35ed79) SHA1(0e4f8b706cdfcaf2aacdc40eec422df9d865b311) )
ROM_REGION( 0x10000, "xa", 0 )
ROM_LOAD( "e9.u17", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) ) // MX10EXAQC (80C51 XA based MCU) marked E9, same as haunthig
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "crazy_bugs_text_u15.u15", 0x000000, 0x80000, CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) )
// u14 not populated
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "crazy_bugs_ani-cg-u32.u32", 0x000000, 0x200000, CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // FIXED BITS (xxxxxxx0xxxxxxxx)
// u12 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazy_bugs_sp_u3.u3", 0x000000, 0x200000, CRC(b15974a1) SHA1(82509902bbb33a2120d815e7879b9b8591a29976) )
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "hu_u38.u38", 0x000, 0x117, NO_DUMP ) // ATF16V8B, protected
ROM_LOAD( "hu_u39.u39", 0x200, 0x2dd, CRC(75f58b46) SHA1(7cb136a41899ddd50c95a67ca6353ce5d8d92149) ) // AT22V10
ROM_END
// Games with prg at u17 // Games with prg at u17
// text at u27 // text at u27
// cg at u28 // cg at u28
@ -1409,50 +1182,6 @@ ROM_START( extradrw ) // IGS PCB 0326-05-DV-1
ROM_LOAD( "igs s3002.u18", 0x00000, 0x200000, CRC(48601c32) SHA1(8ef3bad80931f4b1badf0598463e15508602f104) ) // BADADDR --xxxxxxxxxxxxxxxxxxx ROM_LOAD( "igs s3002.u18", 0x00000, 0x200000, CRC(48601c32) SHA1(8ef3bad80931f4b1badf0598463e15508602f104) ) // BADADDR --xxxxxxxxxxxxxxxxxxx
ROM_END ROM_END
ROM_START( tripfev ) // IGS PCB-0447-05-GM - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 3x 8-DIP banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "w1.u37", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'W1'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "triple_fever_u23_v107_us.u23", 0x000000, 0x80000, CRC(aa56d888) SHA1(0b8b2765079259b76ea803289841d867c33c8cb2) ) // 27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU) marked P7
ROM_LOAD( "p7.u27", 0x00000, 0x10000, NO_DUMP )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "triple_fever_u10_text.u10", 0x000000, 0x80000, CRC(522a1030) SHA1(9a7a5ba9b26bceb0d251be6139c10e4655fc19ec) ) // M27C4002
ROM_REGION( 0x400000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "triple_fever_u19_cg.u19", 0x000000, 0x400000, CRC(cd45bbf2) SHA1(7f1cf270245bbe4604de2cacade279ab13584dbd) ) // M27C322, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "triplef_sp_u15.u15", 0x000000, 0x200000, CRC(98b9cafd) SHA1(3bf3971f0d9520c98fc6b1c2e77ab9c178d21c62) ) // M27C160
ROM_END
ROM_START( wldfruit ) // IGS PCB-0447-05-GM - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 3x 8-DIP banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "w1.u37", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'W1'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "wild_fruit_v-208us.u23", 0x000000, 0x80000, CRC(d43398f1) SHA1(ecc4bd5cb6da16b35c63b843cf7beec1ab84ed9d) ) // M27C4002
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU) marked J9
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "wild_fruit_text.u10", 0x000000, 0x80000, CRC(d6f0fd58) SHA1(5ddae5d4df53504dbb2e0fe9f7caea961c961ef8) ) // 27C4096
ROM_REGION( 0x400000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "wild_fruit_cg.u19", 0x000000, 0x400000, CRC(119686a8) SHA1(22583c1a1018cfdd20f0ef696d91fa1f6e01ab00) ) // M27C322, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "wild_fruit_sp.u15", 0x000000, 0x200000, CRC(9da3e9dd) SHA1(7e447492713549e6be362d4aca6d223dad20771a) ) // M27C160
ROM_END
void igs_m027_state::pgm_create_dummy_internal_arm_region() void igs_m027_state::pgm_create_dummy_internal_arm_region()
{ {
@ -1477,116 +1206,101 @@ void igs_m027_state::pgm_create_dummy_internal_arm_region()
temp16[(0x0092) / 2] = 0x1000; temp16[(0x0092) / 2] = 0x1000;
} }
void igs_m027_state::init_no_dec()
{
pgm_create_dummy_internal_arm_region();
}
void igs_m027_state::init_sdwx() void igs_m027_state::init_sdwx()
{ {
sdwx_decrypt(machine()); sdwx_decrypt(machine());
sdwx_gfx_decrypt(); m_igs017_igs031->sdwx_gfx_decrypt();
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_klxyj() void igs_m027_state::init_klxyj()
{ {
klxyj_decrypt(machine()); klxyj_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_chessc2() void igs_m027_state::init_chessc2()
{ {
chessc2_decrypt(machine()); chessc2_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_hauntedh()
{
hauntedh_decrypt(machine());
//sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027_state::init_lhzb4() void igs_m027_state::init_lhzb4()
{ {
lhzb4_decrypt(machine()); lhzb4_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_mgfx() void igs_m027_state::init_mgfx()
{ {
mgfx_decrypt(machine()); mgfx_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_lhzb3() void igs_m027_state::init_lhzb3()
{ {
lhzb3_decrypt(machine()); lhzb3_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_sddz() void igs_m027_state::init_sddz()
{ {
sddz_decrypt(machine()); sddz_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_gonefsh2() void igs_m027_state::init_gonefsh2()
{ {
gonefsh2_decrypt(machine()); gonefsh2_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_zhongguo() void igs_m027_state::init_zhongguo()
{ {
zhongguo_decrypt(machine()); zhongguo_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_slqz3() void igs_m027_state::init_slqz3()
{ {
slqz3_decrypt(machine()); slqz3_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_fruitpar() void igs_m027_state::init_fruitpar()
{ {
fruitpar_decrypt(machine()); fruitpar_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_oceanpar() void igs_m027_state::init_oceanpar()
{ {
oceanpar_decrypt(machine()); oceanpar_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_amazonia() void igs_m027_state::init_amazonia()
{ {
amazonia_decrypt(machine()); amazonia_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_amazoni2() void igs_m027_state::init_amazoni2()
{ {
amazoni2_decrypt(machine()); amazoni2_decrypt(machine());
//sdwx_gfx_decrypt(machine()); //m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
@ -1611,23 +1325,17 @@ void igs_m027_state::init_mgcs3()
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_crzybugs()
{
crzybugs_decrypt(machine());
//qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027_state::init_crzybugsj()
{
crzybugsj_decrypt(machine());
//qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027_state::init_jking02() void igs_m027_state::init_jking02()
{ {
jking02_decrypt(machine()); jking02_decrypt(machine());
m_igs017_igs031->sdwx_gfx_decrypt();
m_igs017_igs031->tarzan_decrypt_sprites(0x400000); // not 100% correect?
// the ROM at 0x400000 doesn't decrypt with the above?
}
void igs_m027_state::init_lthy()
{
lthy_decrypt(machine());
//qlgs_gfx_decrypt(machine()); //qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
@ -1646,23 +1354,9 @@ void igs_m027_state::init_olympic5()
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
void igs_m027_state::init_tripfev() void igs_m027_state::init_lhdmg()
{ {
tripfev_decrypt(machine()); //lhdmg_decrypt(machine());
//qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027_state::init_wldfruit()
{
wldfruit_decrypt(machine());
//qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027_state::init_lthy()
{
lthy_decrypt(machine());
//qlgs_gfx_decrypt(machine()); //qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region(); pgm_create_dummy_internal_arm_region();
} }
@ -1676,41 +1370,30 @@ void igs_m027_state::init_lthy()
***************************************************************************/ ***************************************************************************/
GAME( 1999, slqz3, 0, igs_mahjong, sdwx, igs_m027_state, init_slqz3, ROT0, "IGS", "Mahjong Shuang Long Qiang Zhu 3 (China, VS107C)", MACHINE_IS_SKELETON ) GAME( 1999, slqz3, 0, igs_mahjong, base, igs_m027_state, init_slqz3, ROT0, "IGS", "Mahjong Shuang Long Qiang Zhu 3 (China, VS107C)", MACHINE_IS_SKELETON )
GAME( 1999, qlgs, 0, igs_mahjong, sdwx, igs_m027_state, init_qlgs, ROT0, "IGS", "Que Long Gao Shou", MACHINE_IS_SKELETON ) GAME( 1999, qlgs, 0, igs_mahjong, base, igs_m027_state, init_qlgs, ROT0, "IGS", "Que Long Gao Shou", MACHINE_IS_SKELETON )
GAME( 1999, amazonia, 0, igs_mahjong, amazonia, igs_m027_state, init_amazonia, ROT0, "IGS", "Amazonia King (V104BR)", MACHINE_IS_SKELETON ) GAME( 1999, amazonia, 0, igs_mahjong, amazonia, igs_m027_state, init_amazonia, ROT0, "IGS", "Amazonia King (V104BR)", MACHINE_IS_SKELETON )
GAME( 1999, amazonkp, amazonia, igs_mahjong, amazonia, igs_m027_state, init_amazonia, ROT0, "IGS", "Amazonia King Plus (V204BR)", MACHINE_IS_SKELETON ) GAME( 1999, amazonkp, amazonia, igs_mahjong, amazonia, igs_m027_state, init_amazonia, ROT0, "IGS", "Amazonia King Plus (V204BR)", MACHINE_IS_SKELETON )
GAME( 1999, fruitpar, 0, igs_mahjong, sdwx, igs_m027_state, init_fruitpar, ROT0, "IGS", "Fruit Paradise (V214)", MACHINE_IS_SKELETON ) GAME( 1999, fruitpar, 0, igs_mahjong, base, igs_m027_state, init_fruitpar, ROT0, "IGS", "Fruit Paradise (V214)", MACHINE_IS_SKELETON )
GAME( 1999, oceanpar, 0, igs_mahjong, sdwx, igs_m027_state, init_oceanpar, ROT0, "IGS", "Ocean Paradise (V105US)", MACHINE_IS_SKELETON ) // 1999 copyright in ROM GAME( 1999, oceanpar, 0, igs_mahjong, base, igs_m027_state, init_oceanpar, ROT0, "IGS", "Ocean Paradise (V105US)", MACHINE_IS_SKELETON ) // 1999 copyright in ROM
GAME( 1999, oceanpara, oceanpar, igs_mahjong, sdwx, igs_m027_state, init_oceanpar, ROT0, "IGS", "Ocean Paradise (V101US)", MACHINE_IS_SKELETON ) // 1999 copyright in ROM GAME( 1999, oceanpara, oceanpar, igs_mahjong, base, igs_m027_state, init_oceanpar, ROT0, "IGS", "Ocean Paradise (V101US)", MACHINE_IS_SKELETON ) // 1999 copyright in ROM
GAME( 1999, lthy, 0, igs_mahjong, sdwx, igs_m027_state, init_lthy, ROT0, "IGS", "Long Teng Hu Yue", MACHINE_IS_SKELETON ) GAME( 1999, lthy, 0, igs_mahjong, base, igs_m027_state, init_lthy, ROT0, "IGS", "Long Teng Hu Yue", MACHINE_IS_SKELETON )
GAME( 1999, lhdmg, 0, igs_mahjong, sdwx, igs_m027_state, init_no_dec, ROT0, "IGS", "Long Hu Da Man Guan", MACHINE_IS_SKELETON ) GAME( 1999, lhdmg, 0, igs_mahjong, base, igs_m027_state, init_lhdmg, ROT0, "IGS", "Long Hu Da Man Guan", MACHINE_IS_SKELETON )
GAME( 1999, lhdmgp, lhdmg, igs_mahjong, sdwx, igs_m027_state, init_no_dec, ROT0, "IGS", "Long Hu Da Man Guan Plus", MACHINE_IS_SKELETON ) GAME( 1999, lhdmgp, lhdmg, igs_mahjong, base, igs_m027_state, init_lhdmg, ROT0, "IGS", "Long Hu Da Man Guan Plus", MACHINE_IS_SKELETON )
GAME( 200?, luckycrs, 0, igs_mahjong, sdwx, igs_m027_state, init_luckycrs, ROT0, "IGS", "Lucky Cross (V106SA)", MACHINE_IS_SKELETON ) GAME( 200?, luckycrs, 0, igs_mahjong, base, igs_m027_state, init_luckycrs, ROT0, "IGS", "Lucky Cross (V106SA)", MACHINE_IS_SKELETON )
GAME( 2002, sdwx, 0, igs_mahjong, sdwx, igs_m027_state, init_sdwx, ROT0, "IGS", "Sheng Dan Wu Xian", MACHINE_IS_SKELETON ) // aka Christmas 5 Line? (or Amazonia King II, shares roms at least?) GAME( 2002, sdwx, 0, igs_mahjong, base, igs_m027_state, init_sdwx, ROT0, "IGS", "Sheng Dan Wu Xian", MACHINE_IS_SKELETON ) // aka Christmas 5 Line? (or Amazonia King II, shares roms at least?)
GAME( 200?, jking02, 0, igs_mahjong, sdwx, igs_m027_state, init_jking02, ROT0, "IGS", "Jungle King 2002 (V209US)", MACHINE_IS_SKELETON ) GAME( 200?, jking02, 0, igs_mahjong, base, igs_m027_state, init_jking02, ROT0, "IGS", "Jungle King 2002 (V209US)", MACHINE_IS_SKELETON )
GAME( 2005, olympic5, 0, igs_mahjong, sdwx, igs_m027_state, init_olympic5, ROT0, "IGS", "Olympic 5 (V112US)", MACHINE_IS_SKELETON ) // IGS FOR V112US 2005 02 14 GAME( 2005, olympic5, 0, igs_mahjong, base, igs_m027_state, init_olympic5, ROT0, "IGS", "Olympic 5 (V112US)", MACHINE_IS_SKELETON ) // IGS FOR V112US 2005 02 14
GAME( 2003, olympic5a, olympic5, igs_mahjong, sdwx, igs_m027_state, init_olympic5, ROT0, "IGS", "Olympic 5 (V107US)", MACHINE_IS_SKELETON ) // IGS FOR V107US 2003 10 2 GAME( 2003, olympic5a, olympic5, igs_mahjong, base, igs_m027_state, init_olympic5, ROT0, "IGS", "Olympic 5 (V107US)", MACHINE_IS_SKELETON ) // IGS FOR V107US 2003 10 2
GAME( 2003, amazoni2, 0, igs_mahjong, sdwx, igs_m027_state, init_amazoni2, ROT0, "IGS", "Amazonia King II (V202BR)", MACHINE_IS_SKELETON ) GAME( 2003, amazoni2, 0, igs_mahjong, base, igs_m027_state, init_amazoni2, ROT0, "IGS", "Amazonia King II (V202BR)", MACHINE_IS_SKELETON )
GAME( 200?, sddz, 0, igs_mahjong, sdwx, igs_m027_state, init_sddz, ROT0, "IGS", "Super Dou Di Zhu", MACHINE_IS_SKELETON ) GAME( 200?, sddz, 0, igs_mahjong, base, igs_m027_state, init_sddz, ROT0, "IGS", "Super Dou Di Zhu", MACHINE_IS_SKELETON )
GAME( 2000, zhongguo, 0, igs_mahjong, sdwx, igs_m027_state, init_zhongguo, ROT0, "IGS", "Zhong Guo Chu Da D", MACHINE_IS_SKELETON ) GAME( 2000, zhongguo, 0, igs_mahjong, base, igs_m027_state, init_zhongguo, ROT0, "IGS", "Zhong Guo Chu Da D", MACHINE_IS_SKELETON )
GAME( 200?, lhzb3, 0, igs_mahjong, sdwx, igs_m027_state, init_lhzb3, ROT0, "IGS", "Long Hu Zhengba III", MACHINE_IS_SKELETON ) // 龙虎争霸Ⅲ GAME( 200?, lhzb3, 0, igs_mahjong, base, igs_m027_state, init_lhzb3, ROT0, "IGS", "Long Hu Zhengba III", MACHINE_IS_SKELETON ) // 龙虎争霸Ⅲ
GAME( 2004, lhzb4, 0, igs_mahjong, sdwx, igs_m027_state, init_lhzb4, ROT0, "IGS", "Long Hu Zhengba 4", MACHINE_IS_SKELETON ) // 龙虎争霸4 GAME( 2004, lhzb4, 0, igs_mahjong, base, igs_m027_state, init_lhzb4, ROT0, "IGS", "Long Hu Zhengba 4", MACHINE_IS_SKELETON ) // 龙虎争霸4
GAME( 200?, klxyj, 0, igs_mahjong, sdwx, igs_m027_state, init_klxyj, ROT0, "IGS", "Kuai Le Xi You Ji", MACHINE_IS_SKELETON ) GAME( 200?, klxyj, 0, igs_mahjong, base, igs_m027_state, init_klxyj, ROT0, "IGS", "Kuai Le Xi You Ji", MACHINE_IS_SKELETON )
GAME( 2000, mgfx, 0, igs_mahjong, sdwx, igs_m027_state, init_mgfx, ROT0, "IGS", "Man Guan Fu Xing", MACHINE_IS_SKELETON ) GAME( 2000, mgfx, 0, igs_mahjong, base, igs_m027_state, init_mgfx, ROT0, "IGS", "Man Guan Fu Xing", MACHINE_IS_SKELETON )
GAME( 200?, gonefsh2, 0, igs_mahjong, sdwx, igs_m027_state, init_gonefsh2, ROT0, "IGS", "Gone Fishing 2", MACHINE_IS_SKELETON ) GAME( 200?, gonefsh2, 0, igs_mahjong, base, igs_m027_state, init_gonefsh2, ROT0, "IGS", "Gone Fishing 2", MACHINE_IS_SKELETON )
GAME( 2002, chessc2, 0, igs_mahjong, sdwx, igs_m027_state, init_chessc2, ROT0, "IGS", "Chess Challenge II", MACHINE_IS_SKELETON ) GAME( 2002, chessc2, 0, igs_mahjong, base, igs_m027_state, init_chessc2, ROT0, "IGS", "Chess Challenge II", MACHINE_IS_SKELETON )
GAME( 200?, extradrw, 0, igs_mahjong, sdwx, igs_m027_state, init_qlgs, ROT0, "IGS", "Extra Draw", MACHINE_IS_SKELETON ) GAME( 200?, extradrw, 0, igs_mahjong, base, igs_m027_state, init_qlgs, ROT0, "IGS", "Extra Draw", MACHINE_IS_SKELETON )
GAME( 2003, mgzz, 0, igs_mahjong, sdwx, igs_m027_state, init_mgzz, ROT0, "IGS", "Man Guan Zhi Zun (V100CN)", MACHINE_IS_SKELETON ) GAME( 2003, mgzz, 0, igs_mahjong, base, igs_m027_state, init_mgzz, ROT0, "IGS", "Man Guan Zhi Zun (V100CN)", MACHINE_IS_SKELETON )
GAME( 2007, mgcs3, 0, igs_mahjong, sdwx, igs_m027_state, init_mgcs3, ROT0, "IGS", "Man Guan Caishen 3 (V101CN)", MACHINE_IS_SKELETON ) GAME( 2007, mgcs3, 0, igs_mahjong, base, igs_m027_state, init_mgcs3, ROT0, "IGS", "Man Guan Caishen 3 (V101CN)", MACHINE_IS_SKELETON )
// These use the MX10EXAQC (80c51XA from Philips) and maybe don't belong in here
// the PCBs are closer to igs_fear.cpp in terms of layout
GAME( 2008, haunthig, 0, igs_mahjong_xa, sdwx, igs_m027_state, init_hauntedh, ROT0, "IGS", "Haunted House (IGS, V109US)", MACHINE_IS_SKELETON ) // IGS FOR V109US 2008 10 14
GAME( 2006, haunthiga, haunthig, igs_mahjong_xa, sdwx, igs_m027_state, init_hauntedh, ROT0, "IGS", "Haunted House (IGS, V101US)", MACHINE_IS_SKELETON ) // IGS FOR V101US 2006 08 23
GAME( 2009, crzybugs, 0, igs_mahjong_xa, sdwx, igs_m027_state, init_crzybugs, ROT0, "IGS", "Crazy Bugs (V204US)", MACHINE_IS_SKELETON ) // IGS FOR V204US 2009 5 19
GAME( 2006, crzybugsa, crzybugs, igs_mahjong_xa, sdwx, igs_m027_state, init_crzybugs, ROT0, "IGS", "Crazy Bugs (V202US)", MACHINE_IS_SKELETON ) // IGS FOR V100US 2006 3 29 but also V202US string
GAME( 2005, crzybugsb, crzybugs, igs_mahjong_xa, sdwx, igs_m027_state, init_crzybugs, ROT0, "IGS", "Crazy Bugs (V200US)", MACHINE_IS_SKELETON ) // FOR V100US 2005 7 20 but also V200US string
GAME( 2007, crzybugsj, crzybugs, igs_mahjong_xa, sdwx, igs_m027_state, init_crzybugsj, ROT0, "IGS", "Crazy Bugs (V103JP)", MACHINE_IS_SKELETON ) // IGS FOR V101JP 2007 06 08
GAME( 2006, tripfev, 0, igs_mahjong_xa, sdwx, igs_m027_state, init_tripfev, ROT0, "IGS", "Triple Fever (V107US)", MACHINE_IS_SKELETON ) // IGS FOR V107US 2006 09 07
GAME( 200?, wldfruit, 0, igs_mahjong_xa, sdwx, igs_m027_state, init_wldfruit, ROT0, "IGS", "Wild Fruit (V208US)", MACHINE_IS_SKELETON ) // IGS-----97----V208US

446
src/mame/igs/igs_m027xa.cpp Normal file
View File

@ -0,0 +1,446 @@
// license:BSD-3-Clause
// copyright-holders: Xing Xing, David Haywood
/*
IGS ARM7 (IGS027A) based Mahjong / Gambling platform(s) with XA sub-cpu
These games use the IGS027A processor.
*/
#include "emu.h"
#include "igs017_igs031.h"
#include "pgmcrypt.h"
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
#include "cpu/xa/xa.h"
#include "machine/i8255.h"
#include "machine/nvram.h"
#include "screen.h"
namespace {
class igs_m027xa_state : public driver_device
{
public:
igs_m027xa_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_igs_mainram(*this, "igs_mainram"),
m_maincpu(*this, "maincpu"),
m_xa(*this, "xa"),
m_ppi(*this, "ppi8255"),
m_igs017_igs031(*this, "igs017_igs031"),
m_screen(*this, "screen")
{ }
void igs_mahjong_xa(machine_config &config);
void init_crzybugs();
void init_crzybugsj();
void init_hauntedh();
void init_tripfev();
void init_wldfruit();
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
optional_shared_ptr<u32> m_igs_mainram;
required_device<cpu_device> m_maincpu;
required_device<mx10exa_cpu_device> m_xa;
required_device<i8255_device> m_ppi;
required_device<igs017_igs031_device> m_igs017_igs031;
required_device<screen_device> m_screen;
void vblank_irq(int state);
void pgm_create_dummy_internal_arm_region();
void igs_mahjong_map(address_map &map);
void igs_70000100_w(u32 data);
u32 m_igs_70000100 = 0;
u32 rand_r()
{
return machine().rand();
}
};
void igs_m027xa_state::machine_start()
{
save_item(NAME(m_igs_70000100));
}
void igs_m027xa_state::video_start()
{
m_igs017_igs031->video_start();
}
void igs_m027xa_state::igs_70000100_w(u32 data)
{
m_igs_70000100 = data;
}
/***************************************************************************
Memory Maps
***************************************************************************/
void igs_m027xa_state::igs_mahjong_map(address_map &map)
{
map(0x00000000, 0x00003fff).rom(); // Internal ROM
map(0x08000000, 0x0807ffff).rom().region("user1", 0); // Game ROM
map(0x10000000, 0x100003ff).ram().share("igs_mainram"); // main RAM for ASIC?
map(0x18000000, 0x18007fff).ram();
map(0x38000000, 0x38007fff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write));
map(0x4000000c, 0x4000000f).r(FUNC(igs_m027xa_state::rand_r));
map(0x58000000, 0x580000ff).ram(); // XA?
map(0x70000100, 0x70000103).w(FUNC(igs_m027xa_state::igs_70000100_w));
map(0x70000200, 0x70000203).ram(); //??????????????
map(0x50000000, 0x500003ff).nopw(); // uploads XOR table to external ROM here
map(0xf0000000, 0xf000000f).nopw(); // magic registers
}
static INPUT_PORTS_START( base )
PORT_START("TEST0")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("TEST1")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("TEST2")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
void igs_m027xa_state::vblank_irq(int state)
{
if (state)
{
// hack
if (m_igs_70000100 == 0x55) // IRQ can't be enabled during RAM check, this might not be the enable flag though
{
if (m_screen->frame_number() & 1)
m_maincpu->pulse_input_line(ARM7_FIRQ_LINE, m_maincpu->minimum_quantum_time());
else
m_maincpu->pulse_input_line(ARM7_IRQ_LINE, m_maincpu->minimum_quantum_time()); // probably from the XA?
}
}
}
void igs_m027xa_state::igs_mahjong_xa(machine_config &config)
{
ARM7(config, m_maincpu, 20000000);
m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027xa_state::igs_mahjong_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MX10EXA(config, m_xa, 10000000); // MX10EXAQC (Philips 80C51 XA) unknown frequency
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(512, 256);
m_screen->set_visarea(0, 512-1, 0, 240-1);
m_screen->set_screen_update("igs017_igs031", FUNC(igs017_igs031_device::screen_update));
m_screen->set_palette("igs017_igs031:palette");
m_screen->screen_vblank().set(FUNC(igs_m027xa_state::vblank_irq));
I8255A(config, m_ppi);
m_ppi->in_pa_callback().set_ioport("TEST0");
m_ppi->in_pb_callback().set_ioport("TEST1");
m_ppi->in_pc_callback().set_ioport("TEST2");
IGS017_IGS031(config, m_igs017_igs031, 0);
m_igs017_igs031->set_text_reverse_bits();
m_igs017_igs031->set_i8255_tag("ppi8255");
// sound hardware
// OK6295
}
// prg at u34
// text at u15
// cg at u32 / u12
// samples at u3
ROM_START( haunthig )
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "haunthig_igs027a", 0x00000, 0x4000, NO_DUMP )
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "hauntedhouse_ver-109us.u34", 0x000000, 0x80000, CRC(300fed78) SHA1(afa4c8855cd780c57d4f92ea6131ed4e77063268) )
ROM_REGION( 0x10000, "xa", 0 )
ROM_LOAD( "hauntedhouse.u17", 0x000000, 0x10000, BAD_DUMP CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) ) // not dumped for this set
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "haunted-h_text.u15", 0x000000, 0x80000, CRC(c23f48c8) SHA1(0cb1b6c61611a081ae4a3c0be51812045ff632fe) )
// are these PGM-like sprites?
ROM_REGION( 0x800000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "haunted-h_cg.u32", 0x000000, 0x400000, BAD_DUMP CRC(e0ea10e6) SHA1(e81be78fea93e72d4b1f4c0b58560bda46cf7948) ) // not dumped for this set, FIXED BITS (xxxxxxx0xxxxxxxx)
ROM_LOAD( "haunted-h_ext.u12", 0x400000, 0x400000, BAD_DUMP CRC(662eb883) SHA1(831ebe29e1e7a8b2c2fff7fbc608975771c3486c) ) // not dumped for this set, FIXED BITS (xxxxxxxx0xxxxxxx)
ROM_REGION( 0x200000, "samples", 0 ) // Oki M6295 samples, missing sample table, bad?
ROM_LOAD( "haunted-h_sp.u3", 0x00000, 0x200000, BAD_DUMP CRC(fe3fcddf) SHA1(ac57ab6d4e4883747c093bd19d0025cf6588cb2c) ) // not dumped for this set
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "hu_u38a.u38", 0x000, 0x117, NO_DUMP ) // ATF16V8B, protected
ROM_LOAD( "hu_u39.u39", 0x200, 0x2dd, CRC(75f58b46) SHA1(7cb136a41899ddd50c95a67ca6353ce5d8d92149) ) // AT22V10
ROM_END
ROM_START( haunthiga ) // IGS PCB-0575-04-HU - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 2x 8-dip banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "haunthig_igs027a", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'H2'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "hauntedhouse_ver-101us.u34", 0x000000, 0x80000, CRC(4bf045d4) SHA1(78c848fd69961df8d9b75f92ad57c3534fbf08db) )
ROM_REGION( 0x10000, "xa", 0 )
ROM_LOAD( "hauntedhouse.u17", 0x000000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) ) // MX10EXAQC (80C51 XA based MCU) marked J9, not read protected?
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "haunted-h_text.u15", 0x000000, 0x80000, CRC(c23f48c8) SHA1(0cb1b6c61611a081ae4a3c0be51812045ff632fe) )
// are these PGM-like sprites?
ROM_REGION( 0x800000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "haunted-h_cg.u32", 0x000000, 0x400000, CRC(e0ea10e6) SHA1(e81be78fea93e72d4b1f4c0b58560bda46cf7948) ) // FIXED BITS (xxxxxxx0xxxxxxxx)
ROM_LOAD( "haunted-h_ext.u12", 0x400000, 0x400000, CRC(662eb883) SHA1(831ebe29e1e7a8b2c2fff7fbc608975771c3486c) ) // FIXED BITS (xxxxxxxx0xxxxxxx)
ROM_REGION( 0x200000, "samples", 0 ) // Oki M6295 samples, missing sample table, bad?
ROM_LOAD( "haunted-h_sp.u3", 0x00000, 0x200000, BAD_DUMP CRC(fe3fcddf) SHA1(ac57ab6d4e4883747c093bd19d0025cf6588cb2c) )
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "hu_u38a.u38", 0x000, 0x117, NO_DUMP ) // ATF16V8B, protected
ROM_LOAD( "hu_u39.u39", 0x200, 0x2dd, CRC(75f58b46) SHA1(7cb136a41899ddd50c95a67ca6353ce5d8d92149) ) // AT22V10
ROM_END
ROM_START( crzybugs ) // IGS PCB-0447-05-GM - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 3x 8-DIP banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "m7_igs27a.u37", 0x00000, 0x4000, CRC(1b20532c) SHA1(e08d0110a843915a8ba8627ae6d3947cccc22048) ) // sticker marked 'M7'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-204us.u23", 0x000000, 0x80000, CRC(d1232462) SHA1(685a292f39bf57a80d6ef31289cf9f673ba06dd4) ) // MX27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU) marked J9
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "crazy_bugs_text_u10.u10", 0x000000, 0x80000, CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) )
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "crazy_bugs_cg.u19", 0x000000, 0x200000, CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazybugs_sp.u15", 0x000000, 0x200000, CRC(591b315b) SHA1(fda1816d83e202170dba4afc6e7898b706a76087) ) // M27C160
ROM_END
ROM_START( crzybugsa )
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "m7_igs27a.u37", 0x00000, 0x4000, CRC(1b20532c) SHA1(e08d0110a843915a8ba8627ae6d3947cccc22048) ) // sticker marked 'M7' (not verified for this set)
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-202us.u23", 0x000000, 0x80000, CRC(210da1e6) SHA1(c726497bebd25d6a9053e331b4c26acc7e2db0b2) ) // MX27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU)
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "crazy_bugs_text_u10.u10", 0x000000, 0x80000, CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) ) // M27C4002
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "crazy_bugs_cg.u19", 0x000000, 0x200000, CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // M27C160, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazy_bugs_sp.u15", 0x000000, 0x200000, CRC(591b315b) SHA1(fda1816d83e202170dba4afc6e7898b706a76087) ) // M27C160
ROM_END
ROM_START( crzybugsb )
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "m7_igs27a.u37", 0x00000, 0x4000, CRC(1b20532c) SHA1(e08d0110a843915a8ba8627ae6d3947cccc22048) ) // sticker marked 'M7' (not verified for this set)
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-202us.u23", 0x000000, 0x80000, CRC(129e36e9) SHA1(53f20bc3792249de8ef276f84283baa9abd30acd) ) // MX27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU)
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "crazy_bugs_text_u10.u10", 0x000000, 0x80000, BAD_DUMP CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) ) // not dumped for this set
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "crazy_bugs_cg.u19", 0x000000, 0x200000, BAD_DUMP CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // not dumped for this set, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazy_bugs_sp.u15", 0x000000, 0x200000, BAD_DUMP CRC(591b315b) SHA1(fda1816d83e202170dba4afc6e7898b706a76087) ) // not dumped for this set
ROM_END
ROM_START( crzybugsj ) // IGS PCB-0575-04-HU - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 2x 8-dip banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "m6.u42", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'M6'
ROM_REGION32_LE( 0x200000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "crazy_bugs_v-103jp.u34", 0x000000, 0x200000, CRC(1e35ed79) SHA1(0e4f8b706cdfcaf2aacdc40eec422df9d865b311) )
ROM_REGION( 0x10000, "xa", 0 )
ROM_LOAD( "e9.u17", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) ) // MX10EXAQC (80C51 XA based MCU) marked E9, same as haunthig
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "crazy_bugs_text_u15.u15", 0x000000, 0x80000, CRC(db0d679a) SHA1(c5d039aa4fa2218b6f574ccb5b6da983b8d4067d) )
// u14 not populated
// are these PGM-like sprites?
ROM_REGION( 0x200000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "crazy_bugs_ani-cg-u32.u32", 0x000000, 0x200000, CRC(9d53ad47) SHA1(46690a37acf8bd88c7fbe973db2faf5ef0cff805) ) // FIXED BITS (xxxxxxx0xxxxxxxx)
// u12 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "crazy_bugs_sp_u3.u3", 0x000000, 0x200000, CRC(b15974a1) SHA1(82509902bbb33a2120d815e7879b9b8591a29976) )
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "hu_u38.u38", 0x000, 0x117, NO_DUMP ) // ATF16V8B, protected
ROM_LOAD( "hu_u39.u39", 0x200, 0x2dd, CRC(75f58b46) SHA1(7cb136a41899ddd50c95a67ca6353ce5d8d92149) ) // AT22V10
ROM_END
ROM_START( tripfev ) // IGS PCB-0447-05-GM - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 3x 8-DIP banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "w1.u37", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'W1'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "triple_fever_u23_v107_us.u23", 0x000000, 0x80000, CRC(aa56d888) SHA1(0b8b2765079259b76ea803289841d867c33c8cb2) ) // 27C4096
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU) marked P7
ROM_LOAD( "p7.u27", 0x00000, 0x10000, NO_DUMP )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "triple_fever_u10_text.u10", 0x000000, 0x80000, CRC(522a1030) SHA1(9a7a5ba9b26bceb0d251be6139c10e4655fc19ec) ) // M27C4002
ROM_REGION( 0x400000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "triple_fever_u19_cg.u19", 0x000000, 0x400000, CRC(cd45bbf2) SHA1(7f1cf270245bbe4604de2cacade279ab13584dbd) ) // M27C322, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "triplef_sp_u15.u15", 0x000000, 0x200000, CRC(98b9cafd) SHA1(3bf3971f0d9520c98fc6b1c2e77ab9c178d21c62) ) // M27C160
ROM_END
ROM_START( wldfruit ) // IGS PCB-0447-05-GM - Has IGS027A, MX10EXAQC, IGS031, Oki M6295, 3x 8-DIP banks
ROM_REGION( 0x04000, "maincpu", 0 )
// Internal ROM of IGS027A ARM based MCU
ROM_LOAD( "w1.u37", 0x00000, 0x4000, NO_DUMP ) // sticker marked 'W1'
ROM_REGION32_LE( 0x80000, "user1", 0 ) // external ARM data / prg
ROM_LOAD( "wild_fruit_v-208us.u23", 0x000000, 0x80000, CRC(d43398f1) SHA1(ecc4bd5cb6da16b35c63b843cf7beec1ab84ed9d) ) // M27C4002
ROM_REGION( 0x10000, "xa", 0 ) // MX10EXAQC (80C51 XA based MCU) marked J9
ROM_LOAD( "j9.u27", 0x00000, 0x10000, CRC(3c76b157) SHA1(d8d3a434fd649577a30d5855e3fb34998041f4e5) )
ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 )
ROM_LOAD( "wild_fruit_text.u10", 0x000000, 0x80000, CRC(d6f0fd58) SHA1(5ddae5d4df53504dbb2e0fe9f7caea961c961ef8) ) // 27C4096
ROM_REGION( 0x400000, "igs017_igs031:sprites", 0 )
ROM_LOAD( "wild_fruit_cg.u19", 0x000000, 0x400000, CRC(119686a8) SHA1(22583c1a1018cfdd20f0ef696d91fa1f6e01ab00) ) // M27C322, FIXED BITS (xxxxxxx0xxxxxxxx)
// u18 not populated
ROM_REGION( 0x200000, "samples", 0 ) // plain Oki M6295 samples
ROM_LOAD( "wild_fruit_sp.u15", 0x000000, 0x200000, CRC(9da3e9dd) SHA1(7e447492713549e6be362d4aca6d223dad20771a) ) // M27C160
ROM_END
void igs_m027xa_state::pgm_create_dummy_internal_arm_region()
{
u16 *temp16 = (u16 *)memregion("maincpu")->base();
// fill with RX 14
for (int i = 0; i < 0x4000 / 2; i += 2)
{
temp16[i] = 0xff1e;
temp16[ i +1] = 0xe12f;
}
// jump straight to external area
temp16[(0x0000) / 2] = 0xd088;
temp16[(0x0002) / 2] = 0xe59f;
temp16[(0x0004) / 2] = 0x0680;
temp16[(0x0006) / 2] = 0xe3a0;
temp16[(0x0008) / 2] = 0xff10;
temp16[(0x000a) / 2] = 0xe12f;
temp16[(0x0090) / 2] = 0x0400;
temp16[(0x0092) / 2] = 0x1000;
}
void igs_m027xa_state::init_hauntedh()
{
hauntedh_decrypt(machine());
//m_igs017_igs031->sdwx_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027xa_state::init_crzybugs()
{
crzybugs_decrypt(machine());
m_igs017_igs031->sdwx_gfx_decrypt();
m_igs017_igs031->tarzan_decrypt_sprites(0); // ok?
}
void igs_m027xa_state::init_crzybugsj()
{
crzybugsj_decrypt(machine());
//qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027xa_state::init_tripfev()
{
tripfev_decrypt(machine());
//qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
void igs_m027xa_state::init_wldfruit()
{
wldfruit_decrypt(machine());
//qlgs_gfx_decrypt(machine());
pgm_create_dummy_internal_arm_region();
}
} // anonymous namespace
// These use the MX10EXAQC (80c51XA from Philips) and maybe don't belong in here
// the PCBs are closer to igs_fear.cpp in terms of layout
GAME( 2008, haunthig, 0, igs_mahjong_xa, base, igs_m027xa_state, init_hauntedh, ROT0, "IGS", "Haunted House (IGS, V109US)", MACHINE_IS_SKELETON ) // IGS FOR V109US 2008 10 14
GAME( 2006, haunthiga, haunthig, igs_mahjong_xa, base, igs_m027xa_state, init_hauntedh, ROT0, "IGS", "Haunted House (IGS, V101US)", MACHINE_IS_SKELETON ) // IGS FOR V101US 2006 08 23
GAME( 2009, crzybugs, 0, igs_mahjong_xa, base, igs_m027xa_state, init_crzybugs, ROT0, "IGS", "Crazy Bugs (V204US)", MACHINE_IS_SKELETON ) // IGS FOR V204US 2009 5 19
GAME( 2006, crzybugsa, crzybugs, igs_mahjong_xa, base, igs_m027xa_state, init_crzybugs, ROT0, "IGS", "Crazy Bugs (V202US)", MACHINE_IS_SKELETON ) // IGS FOR V100US 2006 3 29 but also V202US string
GAME( 2005, crzybugsb, crzybugs, igs_mahjong_xa, base, igs_m027xa_state, init_crzybugs, ROT0, "IGS", "Crazy Bugs (V200US)", MACHINE_IS_SKELETON ) // FOR V100US 2005 7 20 but also V200US string
GAME( 2007, crzybugsj, crzybugs, igs_mahjong_xa, base, igs_m027xa_state, init_crzybugsj, ROT0, "IGS", "Crazy Bugs (V103JP)", MACHINE_IS_SKELETON ) // IGS FOR V101JP 2007 06 08
GAME( 2006, tripfev, 0, igs_mahjong_xa, base, igs_m027xa_state, init_tripfev, ROT0, "IGS", "Triple Fever (V107US)", MACHINE_IS_SKELETON ) // IGS FOR V107US 2006 09 07
GAME( 200?, wldfruit, 0, igs_mahjong_xa, base, igs_m027xa_state, init_wldfruit, ROT0, "IGS", "Wild Fruit (V208US)", MACHINE_IS_SKELETON ) // IGS-----97----V208US

View File

@ -20219,15 +20219,9 @@ amazoni2 // (c) 2002
amazonia // (c) 1999 amazonia // (c) 1999
amazonkp // (c) 1999 amazonkp // (c) 1999
chessc2 // (c) 200? chessc2 // (c) 200?
crzybugs // (c) 2009
crzybugsa // (c) 2006
crzybugsb // (c) 2005
crzybugsj // (c) 2007
extradrw // (c) 200? extradrw // (c) 200?
fruitpar // (c) 200? fruitpar // (c) 200?
gonefsh2 // (c) 200? gonefsh2 // (c) 200?
haunthig // (c) 2008
haunthiga // (c) 2006
jking02 // (c) 200? jking02 // (c) 200?
klxyj // (c) 200? klxyj // (c) 200?
lhdmg // (c) 1999 lhdmg // (c) 1999
@ -20247,9 +20241,17 @@ qlgs // (c) 1999
sddz // (c) 200? sddz // (c) 200?
sdwx // (c) 2002 sdwx // (c) 2002
slqz3 // (c) 1999 slqz3 // (c) 1999
zhongguo // (c) 2000
@source:igs/igs_m027xa.cpp
crzybugs // (c) 2009
crzybugsa // (c) 2006
crzybugsb // (c) 2005
crzybugsj // (c) 2007
haunthig // (c) 2008
haunthiga // (c) 2006
tripfev // (c) 2006 tripfev // (c) 2006
wldfruit // (c) 200? wldfruit // (c) 200?
zhongguo // (c) 2000
@source:igs/igs_m036.cpp @source:igs/igs_m036.cpp
cjddzsp // (c) 200? cjddzsp // (c) 200?