summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Luca Elia <lucaelia@mamedev.org>2012-04-06 17:57:36 +0000
committer Luca Elia <lucaelia@mamedev.org>2012-04-06 17:57:36 +0000
commitbf1bb6201a82e8127e9ecccc4448a52d8ee17a48 (patch)
treea346e746c19f811f2897e25047a4406c06c08336 /src
parentcc78fc268489df9b324ebdbf40b3055f697525de (diff)
Redumped sprites rom of lhzb2 [Guru]
Decrypted sprites in lhzb. Decrypted tiles and palette in lhzb2 and slqz2. Added inputs and memory maps in these games, pending protection simulation [Luca Elia]
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/igs017.c961
1 files changed, 900 insertions, 61 deletions
diff --git a/src/mame/drivers/igs017.c b/src/mame/drivers/igs017.c
index b01a0040441..5da1cc6275f 100644
--- a/src/mame/drivers/igs017.c
+++ b/src/mame/drivers/igs017.c
@@ -34,7 +34,7 @@ To Do:
Notes:
- iqblocka: keep start or test pressed during boot to enter test mode A or B.
-- mgcs, tjsb: press service + stats during test mode for sound test.
+- lhzb2, mgcs, tjsb: press service + stats during test mode for sound test.
- mgdh: press A + B during test mode for sound test (B1+B2+B3 when using a joystick).
- mgdh: test mode is accessed by keeping test pressed during boot (as usual), but pressing F2+F3 in MAME
does not actually work. It does work if F2 is pressed in the debug window at boot, and held while closing it.
@@ -54,6 +54,7 @@ class igs017_state : public driver_device
public:
igs017_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
+ m_input_addr(-1),
m_maincpu(*this, "maincpu")
{ }
@@ -70,9 +71,11 @@ public:
int m_nmi_enable;
int m_irq_enable;
UINT8 m_input_select;
+ int m_input_addr;
UINT8 m_hopper;
UINT16 m_igs_magic[2];
UINT8 m_scramble_data;
+ UINT8 m_prot[2];
int m_irq1_enable;
int m_irq2_enable;
UINT8 *m_spriteram;
@@ -107,6 +110,17 @@ public:
DECLARE_WRITE8_MEMBER(tjsb_paletteram_w);
DECLARE_WRITE8_MEMBER(tjsb_output_w);
DECLARE_READ8_MEMBER(tjsb_input_r);
+ DECLARE_WRITE16_MEMBER(lhzb2a_paletteram_w);
+ DECLARE_READ16_MEMBER(lhzb2a_input_r);
+ DECLARE_WRITE16_MEMBER(lhzb2a_input_addr_w);
+ DECLARE_WRITE16_MEMBER(lhzb2a_input_select_w);
+ DECLARE_WRITE16_MEMBER(lhzb2a_magic_w);
+ DECLARE_READ16_MEMBER(lhzb2a_magic_r);
+ DECLARE_WRITE16_MEMBER(lhzb2_magic_w);
+ DECLARE_READ16_MEMBER(lhzb2_magic_r);
+ DECLARE_WRITE16_MEMBER(slqz2_paletteram_w);
+ DECLARE_WRITE16_MEMBER(slqz2_magic_w);
+ DECLARE_READ16_MEMBER(slqz2_magic_r);
};
@@ -119,7 +133,7 @@ WRITE8_MEMBER(igs017_state::video_disable_w)
{
m_video_disable = data & 1;
if (data & (~1))
- logerror("PC %06X: unknown bits of video_disable written = %02x\n",cpu_get_pc(&space.device()),data);
+ logerror("%s: unknown bits of video_disable written = %02x\n", machine().describe_context(), data);
// popmessage("VIDEO %02X",data);
}
WRITE16_MEMBER(igs017_state::video_disable_lsb_w)
@@ -198,7 +212,7 @@ WRITE16_MEMBER(igs017_state::spriteram_lsb_w)
-// Eeach 16 bit word in the sprites gfx roms contains three 5 bit pens: x-22222-11111-00000.
+// Eeach 16 bit word in the sprites gfx roms contains three 5 bit pens: x-22222-11111-00000 (little endian!).
// This routine expands each word into three bytes.
static void expand_sprites(running_machine &machine)
{
@@ -338,13 +352,13 @@ static int debug_viewer(running_machine &machine, bitmap_ind16 &bitmap,const rec
if (machine.input().code_pressed(KEYCODE_Y)) w -= 8;
if (machine.input().code_pressed(KEYCODE_RIGHT)) a += 1;
- if (machine.input().code_pressed(KEYCODE_LEFT)) a -= 1;
+ if (machine.input().code_pressed(KEYCODE_LEFT)) a -= 1;
- if (machine.input().code_pressed(KEYCODE_DOWN)) a += w;
+ if (machine.input().code_pressed(KEYCODE_DOWN)) a += w;
if (machine.input().code_pressed(KEYCODE_UP)) a -= w;
- if (machine.input().code_pressed(KEYCODE_PGDN)) a += w * h;
- if (machine.input().code_pressed(KEYCODE_PGUP)) a -= w * h;
+ if (machine.input().code_pressed(KEYCODE_PGDN)) a += w * h;
+ if (machine.input().code_pressed(KEYCODE_PGUP)) a -= w * h;
if (a < 0) a = 0;
if (a > state->m_sprites_gfx_size) a = state->m_sprites_gfx_size;
@@ -356,7 +370,7 @@ static int debug_viewer(running_machine &machine, bitmap_ind16 &bitmap,const rec
draw_sprite(machine, bitmap, cliprect, 0,0, w,h, 0,0, 0, a);
- popmessage("a: %08X w: %03X p: %02X-%02x-%02x",a,w,state->m_sprites_gfx[a/3*3+0],state->m_sprites_gfx[a/3*3+1],state->m_sprites_gfx[a/3*3+2]);
+ popmessage("a: %08X w: %03X p: %02x-%02x-%02x",a,w,state->m_sprites_gfx[a/3*3+0],state->m_sprites_gfx[a/3*3+1],state->m_sprites_gfx[a/3*3+2]);
state->m_debug_addr = a;
state->m_debug_width = w;
osd_sleep(200000);
@@ -504,36 +518,21 @@ static void tjsb_decrypt_sprites(running_machine &machine)
UINT8 *tmp = auto_alloc_array(machine, UINT8, length);
int i, addr;
- // address lines swap (to do: collapse into one bitswap)
- memcpy(tmp, rom, length);
- for (i = 0; i < length; i++)
- {
- addr = (i & ~0xff) | BITSWAP8(i,7,6,5,4,1,2,3,0);
- rom[i] = tmp[addr];
- }
-
- memcpy(tmp, rom, length);
- for (i = 0; i < length; i++)
- {
- addr = (i & ~0xff) | BITSWAP8(i,7,6,5,2,4,3,1,0);
- rom[i] = tmp[addr];
- }
-
+ // address lines swap
memcpy(tmp, rom, length);
for (i = 0; i < length; i++)
{
- addr = (i & ~0xff) | BITSWAP8(i,7,6,5,3,4,2,1,0);
+ addr = (i & ~0xff) | BITSWAP8(i,7,6,5,2,1,4,3,0);
rom[i] = tmp[addr];
}
// data lines swap
for (i = 0; i < length; i += 2)
{
- // x-22222-11111-00000
- UINT16 data = (rom[i+1] << 8) | rom[i+0];
+ UINT16 data = (rom[i+1] << 8) | rom[i+0]; // x-22222-11111-00000
data = BITSWAP16(data, 15, 14,13,12,11,10, 9,1,7,6,5, 4,3,2,8,0);
- rom[i+1] = data >> 8;
rom[i+0] = data;
+ rom[i+1] = data >> 8;
}
}
@@ -708,7 +707,7 @@ static DRIVER_INIT( tarzana )
// starzan
-// decryption is incomplete, data encryption is correct but opcodes are encrypted differently.
+// decryption is incomplete: data decryption is correct but opcodes are encrypted differently.
static void starzan_decrypt(UINT8 *ROM, int size, bool isOpcode)
{
@@ -881,6 +880,61 @@ static DRIVER_INIT( mgdh )
// lhzb2
+
+static void lhzb2_patch_rom(running_machine &machine)
+{
+ UINT16 *rom = (UINT16 *)machine.region("maincpu")->base();
+
+ // Prot. checks:
+ rom[0x14786/2] = 0x6044; // 014786: 6744 beq $147cc
+
+ // ROM check:
+ rom[0x0b48a/2] = 0x604e; // 00B48A: 674E beq $b4da
+}
+
+static void lhzb2_decrypt_tiles(running_machine &machine)
+{
+ int length = machine.region("tilemaps")->bytes();
+ UINT8 *rom = machine.region("tilemaps")->base();
+ UINT8 *tmp = auto_alloc_array(machine, UINT8, length);
+ int i;
+
+ int addr;
+ memcpy(tmp, rom, length);
+ for (i = 0; i < length; i++)
+ {
+ addr = (i & ~0xffffff) | BITSWAP24(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];
+ }
+
+ auto_free(machine, tmp);
+}
+
+static void lhzb2_decrypt_sprites(running_machine &machine)
+{
+ int length = machine.region("sprites")->bytes();
+ UINT8 *rom = machine.region("sprites")->base();
+ UINT8 *tmp = auto_alloc_array(machine, UINT8, length);
+ int i, addr;
+
+ // address lines swap
+ memcpy(tmp, rom, length);
+ for (i = 0; i < length; i++)
+ {
+ addr = (i & ~0xffff) | BITSWAP16(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 (i = 0;i < length;i+=2)
+ {
+ UINT16 data = (rom[i+1] << 8) | rom[i+0]; // x-22222-11111-00000
+ data = BITSWAP16(data, 15, 7,6,5,4,3, 2,1,0,14,13, 12,11,10,9,8);
+ rom[i+0] = data;
+ rom[i+1] = data >> 8;
+ }
+}
+
static DRIVER_INIT( lhzb2 )
{
int i;
@@ -966,11 +1020,30 @@ static DRIVER_INIT( lhzb2 )
src[i] = x;
}
+
+ lhzb2_decrypt_tiles(machine);
+ lhzb2_decrypt_sprites(machine);
+ lhzb2_patch_rom(machine);
}
//lhzb2a
+static void lhzb2a_patch_rom(running_machine &machine)
+{
+ UINT16 *rom = (UINT16 *)machine.region("maincpu")->base();
+
+ // Prot. checks:
+ rom[0x09c52/2] = 0x6026; // 009C52: 6726 beq $9c7a
+ rom[0x0c62c/2] = 0x6026; // 00C62C: 6726 beq $c654
+ rom[0x0ea10/2] = 0x6030; // 00EA10: 6730 beq $ea42
+ rom[0x23472/2] = 0x6026; // 023472: 6726 beq $2349a
+ rom[0x6601a/2] = 0x6024; // 06601A: 6724 beq $66040
+
+ // ROM check:
+ rom[0x32ab6/2] = 0x604e; // 032AB6: 674E beq $32b06
+}
+
static DRIVER_INIT( lhzb2a )
{
int i;
@@ -1028,11 +1101,43 @@ static DRIVER_INIT( lhzb2a )
src[i] = x;
}
+
+ lhzb2_decrypt_tiles(machine);
+ lhzb2_decrypt_sprites(machine);
+ lhzb2a_patch_rom(machine);
}
//slqz2
+static void slqz2_patch_rom(running_machine &machine)
+{
+ UINT16 *rom = (UINT16 *)machine.region("maincpu")->base();
+
+ // Prot. checks:
+ rom[0x1489c/2] = 0x6044; // 01489C: 6744 beq $148e2
+
+ // ROM check:
+ rom[0x0b77a/2] = 0x604e; // 00B77A: 674E beq $b7ca
+}
+
+static void slqz2_decrypt_tiles(running_machine &machine)
+{
+ int length = machine.region("tilemaps")->bytes();
+ UINT8 *rom = machine.region("tilemaps")->base();
+ UINT8 *tmp = auto_alloc_array(machine, UINT8, length);
+ int i;
+
+ memcpy(tmp,rom,length);
+ for (i = 0;i < length;i++)
+ {
+ int addr = (i & ~0xff) | BITSWAP8(i,7,4,5,6,3,2,1,0);
+ rom[i] = tmp[addr];
+ }
+
+ auto_free(machine, tmp);
+}
+
static DRIVER_INIT( slqz2 )
{
int i;
@@ -1108,12 +1213,20 @@ static DRIVER_INIT( slqz2 )
src[i] = x;
}
+
+ slqz2_decrypt_tiles(machine);
+ lhzb2_decrypt_sprites(machine);
+ slqz2_patch_rom(machine);
}
/***************************************************************************
Memory Maps
***************************************************************************/
+
+// iqblocka
+
+
static ADDRESS_MAP_START( iqblocka_map, AS_PROGRAM, 8, igs017_state )
AM_RANGE( 0x00000, 0x0dfff ) AM_ROM
AM_RANGE( 0x0e000, 0x0efff ) AM_RAM
@@ -1125,14 +1238,14 @@ WRITE8_MEMBER(igs017_state::nmi_enable_w)
{
m_nmi_enable = data & 1;
if (data & (~1))
- logerror("PC %06X: nmi_enable = %02x\n",cpu_get_pc(&space.device()),data);
+ logerror("%s: nmi_enable = %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(igs017_state::irq_enable_w)
{
m_irq_enable = data & 1;
if (data & (~1))
- logerror("PC %06X: irq_enable = %02x\n",cpu_get_pc(&space.device()),data);
+ logerror("%s: irq_enable = %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(igs017_state::input_select_w)
@@ -1173,7 +1286,7 @@ READ8_MEMBER(igs017_state::input_r)
case 0x34: return 0x32;
default:
- logerror("PC %06X: input %02x read\n",cpu_get_pc(&space.device()),m_input_select);
+ logerror("%s: input %02x read\n", machine().describe_context(), m_input_select);
return 0xff;
}
}
@@ -1226,7 +1339,7 @@ WRITE16_MEMBER(igs017_state::mgcs_magic_w)
}
if ( m_input_select & ~0xf8 )
- logerror("%06x: warning, unknown bits written in input_select = %02x\n", cpu_get_pc(&space.device()), m_input_select);
+ logerror("%s: warning, unknown bits written in input_select = %02x\n", machine().describe_context(), m_input_select);
break;
case 0x01:
@@ -1240,7 +1353,7 @@ WRITE16_MEMBER(igs017_state::mgcs_magic_w)
// case 0x03: ?
default:
- logerror("%06x: warning, writing to igs_magic %02x = %02x\n", cpu_get_pc(&space.device()), m_igs_magic[0], data);
+ logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data);
}
}
@@ -1252,7 +1365,7 @@ READ16_MEMBER(igs017_state::mgcs_magic_r)
return BITSWAP8(m_scramble_data, 4,5,6,7, 0,1,2,3);
default:
- logerror("%06x: warning, reading with igs_magic = %02x\n", cpu_get_pc(&space.device()), m_igs_magic[0]);
+ logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]);
break;
}
@@ -1278,7 +1391,7 @@ WRITE16_MEMBER(igs017_state::irq1_enable_w)
m_irq1_enable = data & 1;
if (data != 0 && data != 0xff)
- logerror("PC %06X: irq1_enable = %04x\n",cpu_get_pc(&space.device()),data);
+ logerror("%s: irq1_enable = %04x\n", machine().describe_context(), data);
}
WRITE16_MEMBER(igs017_state::irq2_enable_w)
@@ -1287,7 +1400,7 @@ WRITE16_MEMBER(igs017_state::irq2_enable_w)
m_irq2_enable = data & 1;
if (data != 0 && data != 0xff)
- logerror("PC %06X: irq2_enable = %04x\n",cpu_get_pc(&space.device()),data);
+ logerror("%s: irq2_enable = %04x\n", machine().describe_context(), data);
}
WRITE16_MEMBER(igs017_state::mgcs_paletteram_w)
@@ -1322,6 +1435,7 @@ ADDRESS_MAP_END
// sdmg2
+
WRITE16_MEMBER(igs017_state::sdmg2_paletteram_w)
{
COMBINE_DATA(&m_generic_paletteram_16[offset]);
@@ -1375,7 +1489,7 @@ WRITE16_MEMBER(igs017_state::sdmg2_magic_w)
break;
default:
- logerror("%06x: warning, writing to igs_magic %02x = %02x\n", cpu_get_pc(&space.device()), m_igs_magic[0], data);
+ logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data);
}
}
@@ -1393,7 +1507,7 @@ READ16_MEMBER(igs017_state::sdmg2_magic_r)
return sdmg2_keys_r(space, 0);
default:
- logerror("%06x: warning, reading with igs_magic = %02x\n", cpu_get_pc(&space.device()), m_igs_magic[0]);
+ logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]);
break;
}
@@ -1419,6 +1533,7 @@ ADDRESS_MAP_END
// mgdh, mgdha
+
READ8_MEMBER(igs017_state::mgdh_keys_r)
{
if (~m_input_select & 0x04) return input_port_read(machine(), "KEY0");
@@ -1450,7 +1565,7 @@ WRITE16_MEMBER(igs017_state::mgdha_magic_w)
}
if ( data & ~0xc0 )
- logerror("%06x: warning, unknown bits written to igs_magic 00 = %02x\n", cpu_get_pc(&space.device()), data);
+ logerror("%s: warning, unknown bits written to igs_magic 00 = %02x\n", machine().describe_context(), data);
break;
@@ -1462,7 +1577,7 @@ WRITE16_MEMBER(igs017_state::mgdha_magic_w)
}
if ( m_input_select & ~0xfd )
- logerror("%06x: warning, unknown bits written in input_select = %02x\n", cpu_get_pc(&space.device()), m_input_select);
+ logerror("%s: warning, unknown bits written in input_select = %02x\n", machine().describe_context(), m_input_select);
break;
@@ -1487,7 +1602,7 @@ WRITE16_MEMBER(igs017_state::mgdha_magic_w)
04ac10: warning, writing to igs_magic 06 = ff
04ac20: warning, writing to igs_magic 07 = 3f
*/
- logerror("%06x: warning, writing to igs_magic %02x = %02x\n", cpu_get_pc(&space.device()), m_igs_magic[0], data);
+ logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data);
}
}
@@ -1511,7 +1626,7 @@ READ16_MEMBER(igs017_state::mgdha_magic_r)
}
default:
- logerror("%06x: warning, reading with igs_magic = %02x\n", cpu_get_pc(&space.device()), m_igs_magic[0]);
+ logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]);
break;
}
@@ -1538,13 +1653,14 @@ ADDRESS_MAP_END
// tjsb
+
WRITE8_MEMBER(igs017_state::tjsb_paletteram_w)
{
m_generic_paletteram_8[offset] = data;
int bgr = (m_generic_paletteram_8[offset/2*2+1] << 8) | m_generic_paletteram_8[offset/2*2+0];
// bitswap
- bgr = BITSWAP16(bgr, 15, 12,3,6,10,5, 4,2,9,13,8, 7,11,1,0,14);
+ bgr = BITSWAP16(bgr, 15,12,3,6,10,5,4,2,9,13,8,7,11,1,0,14);
palette_set_color_rgb(machine(), offset/2, pal5bit(bgr >> 0), pal5bit(bgr >> 5), pal5bit(bgr >> 10));
}
@@ -1577,7 +1693,7 @@ WRITE8_MEMBER(igs017_state::tjsb_output_w)
return;
break;
}
- logerror("%06x: warning, writing to igs_magic %02x = %02x\n", cpu_get_pc(&space.device()), m_input_select, data);
+ logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_input_select, data);
}
READ8_MEMBER(igs017_state::tjsb_input_r)
@@ -1594,7 +1710,7 @@ READ8_MEMBER(igs017_state::tjsb_input_r)
}
default:
- logerror("PC %06X: input %02x read\n",cpu_get_pc(&space.device()),m_input_select);
+ logerror("%s: input %02x read\n", machine().describe_context(), m_input_select);
return 0xff;
}
}
@@ -1632,6 +1748,298 @@ static ADDRESS_MAP_START( tjsb_io, AS_IO, 8, igs017_state )
ADDRESS_MAP_END
+// lhzb2
+
+
+WRITE16_MEMBER(igs017_state::lhzb2_magic_w)
+{
+ COMBINE_DATA(&m_igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(m_igs_magic[0])
+ {
+ case 0x00:
+ if (ACCESSING_BITS_0_7)
+ {
+ m_input_select = data & 0xff;
+ }
+
+ if ( m_input_select & ~0x1f )
+ logerror("%s: warning, unknown bits written in input_select = %02x\n", machine().describe_context(), m_input_select);
+ break;
+
+ case 0x01:
+ if (ACCESSING_BITS_0_7)
+ {
+ okim6295_device *oki = machine().device<okim6295_device>("oki");
+ oki->set_bank_base((data & 0x80) ? 0x40000 : 0);
+
+ if ( data & 0x7f )
+ logerror("%s: warning, unknown bits written in oki bank = %04x\n", machine().describe_context(), data);
+ }
+ break;
+
+ default:
+ logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data);
+ }
+}
+
+READ16_MEMBER(igs017_state::lhzb2_magic_r)
+{
+ switch(m_igs_magic[0])
+ {
+ case 0x01:
+ {
+ if (~m_input_select & 0x01) return input_port_read(machine(), "KEY0");
+ if (~m_input_select & 0x02) return input_port_read(machine(), "KEY1");
+ if (~m_input_select & 0x04) return input_port_read(machine(), "KEY2");
+ if (~m_input_select & 0x08) return input_port_read(machine(), "KEY3");
+ if (~m_input_select & 0x10) return input_port_read(machine(), "KEY4");
+
+ logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select);
+ return 0xffff;
+ }
+
+ default:
+ logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]);
+ break;
+ }
+
+ return 0xffff;
+}
+
+static ADDRESS_MAP_START( lhzb2, AS_PROGRAM, 16, igs017_state )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM
+ AM_RANGE(0x500000, 0x503fff) AM_RAM
+ AM_RANGE(0x910000, 0x910003) AM_WRITE( lhzb2_magic_w )
+ AM_RANGE(0x910002, 0x910003) AM_READ( lhzb2_magic_r )
+ AM_RANGE(0xb02000, 0xb02fff) AM_READWRITE( spriteram_lsb_r, spriteram_lsb_w ) AM_BASE( m_spriteram )
+ AM_RANGE(0xb03000, 0xb037ff) AM_RAM_WRITE( lhzb2a_paletteram_w ) AM_SHARE("paletteram")
+ AM_RANGE(0xb04020, 0xb04027) AM_DEVREAD8_LEGACY( "ppi8255", ppi8255_r, 0x00ff )
+ AM_RANGE(0xb04024, 0xb04025) AM_WRITE( video_disable_lsb_w )
+ AM_RANGE(0xb04028, 0xb04029) AM_WRITE( irq2_enable_w )
+ AM_RANGE(0xb0402a, 0xb0402b) AM_WRITE( irq1_enable_w )
+ AM_RANGE(0xb08000, 0xb0bfff) AM_READWRITE( fg_lsb_r, fg_lsb_w ) AM_BASE( m_fg_videoram )
+ AM_RANGE(0xb0c000, 0xb0ffff) AM_READWRITE( bg_lsb_r, bg_lsb_w ) AM_BASE( m_bg_videoram )
+ AM_RANGE(0xb10000, 0xb10001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff )
+ADDRESS_MAP_END
+
+
+// lhzb2a
+// To do: what devices are on this PCB?
+
+
+WRITE16_MEMBER(igs017_state::lhzb2a_magic_w)
+{
+ COMBINE_DATA(&m_igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(m_igs_magic[0])
+ {
+ // to do: m_prot values
+ default:
+ logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data);
+ }
+}
+
+READ16_MEMBER(igs017_state::lhzb2a_magic_r)
+{
+ switch(m_igs_magic[0])
+ {
+ case 0x03:
+ {
+ UINT8 a = BITSWAP8(m_prot[0], 9,9,1,9,2,5,4,7); // 9 means 0 value
+ UINT8 b = BITSWAP8(m_prot[1], 5,2,9,7,9,9,9,9);
+ return a | b;
+ }
+
+ default:
+ logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]);
+ break;
+ }
+
+ return 0xffff;
+}
+
+WRITE16_MEMBER(igs017_state::lhzb2a_paletteram_w)
+{
+ COMBINE_DATA(&m_generic_paletteram_16[offset]);
+
+ int bgr = ((m_generic_paletteram_16[offset/2*2+1] & 0xff) << 8) | (m_generic_paletteram_16[offset/2*2+0] & 0xff);
+
+ // bitswap
+ bgr = BITSWAP16(bgr, 15,9,13,12,11,5,4,8,7,6,0,14,3,2,1,10);
+
+ palette_set_color_rgb(machine(), offset/2, pal5bit(bgr >> 0), pal5bit(bgr >> 5), pal5bit(bgr >> 10));
+}
+
+READ16_MEMBER(igs017_state::lhzb2a_input_r)
+{
+ switch (offset*2)
+ {
+ case 0x00: // Keys
+ {
+ if (~m_input_select & 0x01) return input_port_read(machine(), "KEY0") << 8;
+ if (~m_input_select & 0x02) return input_port_read(machine(), "KEY1") << 8;
+ if (~m_input_select & 0x04) return input_port_read(machine(), "KEY2") << 8;
+ if (~m_input_select & 0x08) return input_port_read(machine(), "KEY3") << 8;
+ if (~m_input_select & 0x10) return input_port_read(machine(), "KEY4") << 8;
+
+ logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select);
+ return 0xffff;
+ }
+
+ case 0x02:
+ {
+ UINT16 hopper_bit = (m_hopper && ((machine().primary_screen->frame_number()/10)&1)) ? 0x0000 : 0x0002;
+ return (input_port_read(machine(), "DSW1") << 8) | input_port_read(machine(), "COINS") | hopper_bit;
+ }
+
+ case 0x04:
+ return input_port_read(machine(), "DSW2");
+ }
+
+ return 0xffff;
+}
+
+WRITE16_MEMBER(igs017_state::lhzb2a_input_addr_w)
+{
+ // Unmap previous address ranges
+ if (m_input_addr != -1)
+ {
+ space.unmap_readwrite(m_input_addr * 0x10000 + 0x4000, m_input_addr * 0x10000 + 0x4003);
+ space.unmap_read (m_input_addr * 0x10000 + 0x8000, m_input_addr * 0x10000 + 0x8005);
+ space.unmap_write (m_input_addr * 0x10000 + 0xc000, m_input_addr * 0x10000 + 0xc001);
+ }
+
+ m_input_addr = data & 0xff;
+
+ // Add new memory ranges
+ space.install_readwrite_handler (m_input_addr * 0x10000 + 0x4000, m_input_addr * 0x10000 + 0x4003, read16_delegate (FUNC(igs017_state::lhzb2a_magic_r), this), write16_delegate (FUNC(igs017_state::lhzb2a_magic_w), this));
+ space.install_read_handler (m_input_addr * 0x10000 + 0x8000, m_input_addr * 0x10000 + 0x8005, read16_delegate (FUNC(igs017_state::lhzb2a_input_r), this));
+ space.install_write_handler (m_input_addr * 0x10000 + 0xc000, m_input_addr * 0x10000 + 0xc001, write16_delegate(FUNC(igs017_state::lhzb2a_input_addr_w), this));
+}
+
+WRITE16_MEMBER(igs017_state::lhzb2a_input_select_w)
+{
+ if (ACCESSING_BITS_0_7)
+ {
+ m_input_select = data & 0x1f; // keys
+ m_hopper = data & 0x20; // hopper motor
+ coin_counter_w(machine(), 1, data & 0x40); // coin out counter
+ coin_counter_w(machine(), 0, data & 0x80); // coin in counter
+ }
+ if (ACCESSING_BITS_8_15)
+ {
+ okim6295_device *oki = machine().device<okim6295_device>("oki");
+ oki->set_bank_base((data & 0x0100) ? 0x40000 : 0);
+
+ if ( data & 0x0fe00 )
+ logerror("%s: warning, unknown bits written in input_select = %04x\n", machine().describe_context(), data);
+ }
+}
+
+static ADDRESS_MAP_START( lhzb2a, AS_PROGRAM, 16, igs017_state )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM
+ AM_RANGE(0x500000, 0x503fff) AM_RAM
+// AM_RANGE(0x910000, 0x910003) protection
+ AM_RANGE(0xb02000, 0xb02fff) AM_READWRITE( spriteram_lsb_r, spriteram_lsb_w ) AM_BASE( m_spriteram )
+ AM_RANGE(0xb03000, 0xb037ff) AM_RAM_WRITE( lhzb2a_paletteram_w ) AM_SHARE("paletteram")
+ AM_RANGE(0xb04024, 0xb04025) AM_WRITE( video_disable_lsb_w )
+ AM_RANGE(0xb04028, 0xb04029) AM_WRITE( irq2_enable_w )
+ AM_RANGE(0xb0402a, 0xb0402b) AM_WRITE( irq1_enable_w )
+ AM_RANGE(0xb08000, 0xb0bfff) AM_READWRITE( fg_lsb_r, fg_lsb_w ) AM_BASE( m_fg_videoram )
+ AM_RANGE(0xb0c000, 0xb0ffff) AM_READWRITE( bg_lsb_r, bg_lsb_w ) AM_BASE( m_bg_videoram )
+ AM_RANGE(0xb10000, 0xb10001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff )
+ AM_RANGE(0xb12000, 0xb12001) AM_WRITE( lhzb2a_input_select_w )
+// Inputs dynamically mapped at xx8000, protection at xx4000 (xx = f0 initially). xx written to xxc000
+ADDRESS_MAP_END
+
+
+// slqz2
+
+
+WRITE16_MEMBER(igs017_state::slqz2_paletteram_w)
+{
+ COMBINE_DATA(&m_generic_paletteram_16[offset]);
+
+ int bgr = ((m_generic_paletteram_16[offset/2*2+1] & 0xff) << 8) | (m_generic_paletteram_16[offset/2*2+0] & 0xff);
+
+ // bitswap
+ bgr = BITSWAP16(bgr, 15,14,9,4,11,10,12,3,7,6,5,8,13,2,1,0);
+
+ palette_set_color_rgb(machine(), offset/2, pal5bit(bgr >> 0), pal5bit(bgr >> 5), pal5bit(bgr >> 10));
+}
+
+WRITE16_MEMBER(igs017_state::slqz2_magic_w)
+{
+ COMBINE_DATA(&m_igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(m_igs_magic[0])
+ {
+ case 0x00:
+ if (ACCESSING_BITS_0_7)
+ {
+ okim6295_device *oki = machine().device<okim6295_device>("oki");
+ oki->set_bank_base((data & 0x01) ? 0x40000 : 0);
+
+// m_hopper = data & 0x20; // hopper motor
+// coin_counter_w(machine(), 1, data & 0x40); // coin out counter
+ coin_counter_w(machine(), 0, data & 0x80); // coin in counter
+
+ if ( data & 0x7e )
+ logerror("%s: warning, unknown bits written in oki bank = %04x\n", machine().describe_context(), data);
+ }
+ break;
+
+ default:
+ logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data);
+ }
+}
+
+READ16_MEMBER(igs017_state::slqz2_magic_r)
+{
+ switch(m_igs_magic[0])
+ {
+ case 0x00:
+ return input_port_read(machine(), "PLAYER2");
+ case 0x01:
+ return input_port_read(machine(), "PLAYER1");
+ case 0x02:
+ return input_port_read(machine(), "BUTTONS");
+
+ default:
+ logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]);
+ break;
+ }
+
+ return 0xffff;
+}
+
+static ADDRESS_MAP_START( slqz2, AS_PROGRAM, 16, igs017_state )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM
+ AM_RANGE(0x100000, 0x103fff) AM_RAM
+ AM_RANGE(0x602000, 0x602003) AM_WRITE( slqz2_magic_w )
+ AM_RANGE(0x602002, 0x602003) AM_READ( slqz2_magic_r )
+ AM_RANGE(0x902000, 0x902fff) AM_READWRITE( spriteram_lsb_r, spriteram_lsb_w ) AM_BASE( m_spriteram )
+ AM_RANGE(0x903000, 0x9037ff) AM_RAM_WRITE( slqz2_paletteram_w ) AM_SHARE("paletteram")
+ AM_RANGE(0x904020, 0x904027) AM_DEVREAD8_LEGACY( "ppi8255", ppi8255_r, 0x00ff )
+ AM_RANGE(0x904024, 0x904025) AM_WRITE( video_disable_lsb_w )
+ AM_RANGE(0x904028, 0x904029) AM_WRITE( irq2_enable_w )
+ AM_RANGE(0x90402a, 0x90402b) AM_WRITE( irq1_enable_w )
+ AM_RANGE(0x908000, 0x90bfff) AM_READWRITE( fg_lsb_r, fg_lsb_w ) AM_BASE( m_fg_videoram )
+ AM_RANGE(0x90c000, 0x90ffff) AM_READWRITE( bg_lsb_r, bg_lsb_w ) AM_BASE( m_bg_videoram )
+ AM_RANGE(0x910000, 0x910001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff )
+ADDRESS_MAP_END
+
+
/***************************************************************************
Input Ports
***************************************************************************/
@@ -1754,6 +2162,228 @@ static INPUT_PORTS_START( iqblocka )
INPUT_PORTS_END
+static INPUT_PORTS_START( lhzb2 )
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Credits Per Note" )
+ PORT_DIPSETTING( 0x0c, "10" )
+ PORT_DIPSETTING( 0x08, "20" )
+ PORT_DIPSETTING( 0x04, "50" )
+ PORT_DIPSETTING( 0x00, "100" )
+ PORT_DIPNAME( 0x10, 0x10, "Max Note Credits" )
+ PORT_DIPSETTING( 0x10, "1000" )
+ PORT_DIPSETTING( 0x00, "2000" )
+ PORT_DIPNAME( 0x20, 0x20, "Money Type" )
+ PORT_DIPSETTING( 0x20, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0x40, 0x40, "Pay Out Type" )
+ PORT_DIPSETTING( 0x40, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x03, 0x03, "Min Bet" )
+ PORT_DIPSETTING( 0x03, "500" )
+ PORT_DIPSETTING( 0x02, "1000" )
+ PORT_DIPSETTING( 0x01, "1500" )
+ PORT_DIPSETTING( 0x00, "2000" )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x10, 0x10, "Bonus Round" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x20, 0x20, "Number Type" )
+ PORT_DIPSETTING( 0x20, "Number" )
+ PORT_DIPSETTING( 0x00, "Dice" )
+ PORT_DIPNAME( 0x40, 0x40, "Symbols" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // pigs, apples
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("COINS")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) // hopper switch (unimplemented)
+ PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) // service mode (keep pressed during boot too)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Statistics") // press with the above for sound test
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(5) // coin error otherwise
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Pay Out") PORT_CODE(KEYCODE_O)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 ) // ? (shown in service mode)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_BET )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_SCORE )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_BIG )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_SMALL )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( lhzb2a )
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Credits Per Note" )
+ PORT_DIPSETTING( 0x0c, "10" )
+ PORT_DIPSETTING( 0x08, "20" )
+ PORT_DIPSETTING( 0x04, "50" )
+ PORT_DIPSETTING( 0x00, "100" )
+ PORT_DIPNAME( 0x10, 0x10, "Max Note Credits" )
+ PORT_DIPSETTING( 0x10, "1000" )
+ PORT_DIPSETTING( 0x00, "2000" )
+ PORT_DIPNAME( 0x20, 0x20, "Money Type" )
+ PORT_DIPSETTING( 0x20, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0x40, 0x40, "Pay Out Type" )
+ PORT_DIPSETTING( 0x40, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x03, 0x03, "Min Bet" )
+ PORT_DIPSETTING( 0x03, "500" )
+ PORT_DIPSETTING( 0x02, "1000" )
+ PORT_DIPSETTING( 0x01, "1500" )
+ PORT_DIPSETTING( 0x00, "2000" )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x10, 0x10, "Bonus Round" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x20, 0x20, "Number Type" )
+ PORT_DIPSETTING( 0x20, "Number" )
+ PORT_DIPSETTING( 0x00, "Dice" )
+ PORT_DIPNAME( 0x40, 0x40, "Symbols" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // pigs, apples
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("COINS")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) // shown in test mode
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SPECIAL ) // hopper switch
+ PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_LOW ) // keep pressed while booting
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Statistics") // press with the above for sound test
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Pay Out") PORT_CODE(KEYCODE_O)
+
+ PORT_START("KEY0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_BET )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_SCORE )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_BIG )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_SMALL )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+INPUT_PORTS_END
+
static INPUT_PORTS_START( mgcs )
// DSWs don't work: they are read through a protection device (IGS029? see code at 1CF16)
@@ -2128,6 +2758,98 @@ static INPUT_PORTS_START( mgdh )
INPUT_PORTS_END
+static INPUT_PORTS_START( slqz2 )
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Credits Per Note" )
+ PORT_DIPSETTING( 0x0c, "10" )
+ PORT_DIPSETTING( 0x08, "20" )
+ PORT_DIPSETTING( 0x04, "50" )
+ PORT_DIPSETTING( 0x00, "100" )
+ PORT_DIPNAME( 0x10, 0x10, "Max Note Credits" )
+ PORT_DIPSETTING( 0x10, "1000" )
+ PORT_DIPSETTING( 0x00, "2000" )
+ PORT_DIPNAME( 0x20, 0x20, "Money Type" )
+ PORT_DIPSETTING( 0x20, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0x40, 0x40, "Pay Out Type" )
+ PORT_DIPSETTING( 0x40, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x03, 0x03, "Min Bet" )
+ PORT_DIPSETTING( 0x03, "500" )
+ PORT_DIPSETTING( 0x02, "1000" )
+ PORT_DIPSETTING( 0x01, "1500" )
+ PORT_DIPSETTING( 0x00, "2000" )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x10, 0x10, "Bonus Round" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x20, 0x20, "Number Type" )
+ PORT_DIPSETTING( 0x20, "Number" )
+ PORT_DIPSETTING( 0x00, "Dice" )
+ PORT_DIPNAME( 0x40, 0x40, "Symbols" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // pigs, apples
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("COINS")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) // hopper switch (unimplemented)
+ PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) // service mode (keep pressed during boot too)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Statistics") // press with the above for sound test
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(5) // coin error otherwise
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Pay Out") PORT_CODE(KEYCODE_O)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 )
+
+ PORT_START("PLAYER1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Don Den")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Help / Big" )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("PLAYER2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME( "Bet" )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
+ PORT_START("BUTTONS")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0") PORT_CODE(KEYCODE_8_PAD)
+
+INPUT_PORTS_END
+
static INPUT_PORTS_START( tjsb )
PORT_START("DSW1")
@@ -2414,6 +3136,123 @@ MACHINE_CONFIG_END
+// lhzb2
+
+static const ppi8255_interface lhzb2_ppi8255_intf =
+{
+ DEVCB_INPUT_PORT("COINS"), // Port A read
+ DEVCB_INPUT_PORT("DSW1"), // Port B read
+ DEVCB_INPUT_PORT("DSW2"), // Port C read
+
+ DEVCB_NULL, // Port A write
+ DEVCB_NULL, // Port B write
+ DEVCB_NULL // Port C write
+};
+
+static MACHINE_CONFIG_START( lhzb2, igs017_state )
+ MCFG_CPU_ADD("maincpu", M68000, XTAL_22MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(lhzb2)
+ MCFG_TIMER_ADD_SCANLINE("scantimer", mgcs_interrupt, "screen", 0, 1)
+
+ MCFG_MACHINE_RESET(mgcs)
+
+ MCFG_PPI8255_ADD( "ppi8255", lhzb2_ppi8255_intf )
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
+ MCFG_SCREEN_UPDATE_STATIC(igs017)
+
+ MCFG_GFXDECODE(igs017_swapped)
+ MCFG_PALETTE_LENGTH(0x100*2)
+
+ MCFG_VIDEO_START(igs017)
+ MCFG_VIDEO_RESET(igs017)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_OKIM6295_ADD("oki", XTAL_8MHz / 8, OKIM6295_PIN7_HIGH)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
+
+
+
+// lhzb2a
+
+static MACHINE_RESET( lhzb2a )
+{
+ igs017_state *state = machine.driver_data<igs017_state>();
+ MACHINE_RESET_CALL( mgcs );
+ state->lhzb2a_input_addr_w(*state->m_maincpu->memory().space(AS_PROGRAM), 0, 0xf0);
+}
+
+static MACHINE_CONFIG_START( lhzb2a, igs017_state )
+ MCFG_CPU_ADD("maincpu", M68000, XTAL_22MHz/2)
+ MCFG_CPU_PROGRAM_MAP(lhzb2a)
+ MCFG_TIMER_ADD_SCANLINE("scantimer", mgcs_interrupt, "screen", 0, 1)
+
+ MCFG_MACHINE_RESET(lhzb2a)
+
+// MCFG_PPI8255_ADD( "ppi8255", sdmg2_ppi8255_intf )
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60) // VSync 60Hz, HSync 15.3kHz
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1)
+ MCFG_SCREEN_UPDATE_STATIC(igs017)
+
+ MCFG_GFXDECODE(igs017_swapped)
+ MCFG_PALETTE_LENGTH(0x100*2)
+
+ MCFG_VIDEO_START(igs017)
+ MCFG_VIDEO_RESET(igs017)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_OKIM6295_ADD("oki", XTAL_22MHz / 22, OKIM6295_PIN7_HIGH)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
+
+
+
+// slqz2
+
+static MACHINE_CONFIG_START( slqz2, igs017_state )
+ MCFG_CPU_ADD("maincpu", M68000, XTAL_22MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(slqz2)
+ MCFG_TIMER_ADD_SCANLINE("scantimer", mgcs_interrupt, "screen", 0, 1)
+
+ MCFG_MACHINE_RESET(mgcs)
+
+ MCFG_PPI8255_ADD( "ppi8255", lhzb2_ppi8255_intf )
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
+ MCFG_SCREEN_UPDATE_STATIC(igs017)
+
+ MCFG_GFXDECODE(igs017)
+ MCFG_PALETTE_LENGTH(0x100*2)
+
+ MCFG_VIDEO_START(igs017)
+ MCFG_VIDEO_RESET(igs017)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_OKIM6295_ADD("oki", XTAL_8MHz / 8, OKIM6295_PIN7_HIGH)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
+
+
+
// sdmg2
static const ppi8255_interface sdmg2_ppi8255_intf =
@@ -2793,8 +3632,8 @@ ROM_START( sdmg2 )
ROM_LOAD16_WORD_SWAP( "p0900.u25", 0x00000, 0x80000,CRC(43366f51) SHA1(48dd965dceff7de15b43c2140226a8b17a792dbc) )
ROM_REGION( 0x280000, "sprites", 0 )
- ROM_LOAD( "m0901.u5", 0x000000, 0x200000, CRC(9699db24) SHA1(50fc2f173c20b48d10595f01f1e9545f1b13a61b) )
- ROM_LOAD( "m0902.u4", 0x200000, 0x080000, CRC(3298b13b) SHA1(13b21ddeed368b7f4fea1408c8fc511244342faf) )
+ ROM_LOAD( "m0901.u5", 0x000000, 0x200000, CRC(9699db24) SHA1(50fc2f173c20b48d10595f01f1e9545f1b13a61b) ) // FIXED BITS (xxxxxxxx0xxxxxxx)
+ ROM_LOAD( "m0902.u4", 0x200000, 0x080000, CRC(3298b13b) SHA1(13b21ddeed368b7f4fea1408c8fc511244342faf) ) // FIXED BITS (xxxxxxxx0xxxxxxx)
ROM_REGION( 0x20000, "tilemaps", 0 )
ROM_LOAD( "text.u6", 0x000000, 0x020000, CRC(cb34cbc0) SHA1(ceedbdda085fd1acc9a575502bdf7cf998f54f05) )
@@ -2853,11 +3692,11 @@ ROM_START( lhzb2 )
ROM_REGION( 0x10000, "igs022", 0 ) // INTERNATIONAL GAMES SYSTEM CO.,LTD
ROM_LOAD( "m1104.u11",0x0000, 0x10000, CRC(794d0276) SHA1(ac903d2faa3fb315438dc8da22c5337611a8790d) )
- ROM_REGION( 0x200000, "sprites", 0 ) // adddress scrambling
- ROM_LOAD16_WORD_SWAP( "m1101.u6", 0x000000, 0x200000, CRC(fed09cd6) SHA1(0658a97983f8ba408126e79889cc58323f2d99ba) )
+ ROM_REGION( 0x400000, "sprites", 0 ) // adddress scrambling
+ ROM_LOAD16_WORD_SWAP( "m1101.u6", 0x000000, 0x400000, CRC(0114e9d1) SHA1(5b16170d3cd8b8e1662c949b7234fbdd2ca927f7) ) // FIXED BITS (0xxxxxxxxxxxxxxx)
- ROM_REGION( 0x40000, "tilemaps", 0 ) // adddress scrambling
- ROM_LOAD( "m1103.u8", 0x00000, 0x40000, CRC(89d0b81c) SHA1(b8d294a143e5cc9466b544cb70e43a7ce3450ace) )
+ ROM_REGION( 0x80000, "tilemaps", 0 ) // adddress scrambling
+ ROM_LOAD( "m1103.u8", 0x00000, 0x80000, CRC(4d3776b4) SHA1(fa9b311b1a6ad56e136b66d090bc62ed5003b2f2) )
ROM_REGION( 0x80000, "oki", 0 )
ROM_LOAD( "s1102.u23", 0x00000, 0x80000, CRC(51ffe245) SHA1(849011b186096add657ab20d49d260ec23363ef3) )
@@ -2869,11 +3708,11 @@ ROM_START( lhzb2a )
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "p-4096", 0x00000, 0x80000, CRC(41293f32) SHA1(df4e993f4a458729ade13981e58f32d8116c0082) )
- ROM_REGION( 0x200000, "sprites", 0 ) // adddress scrambling
- ROM_LOAD16_WORD_SWAP( "m1101.u6", 0x000000, 0x200000, CRC(fed09cd6) SHA1(0658a97983f8ba408126e79889cc58323f2d99ba) )
+ ROM_REGION( 0x400000, "sprites", 0 ) // adddress scrambling
+ ROM_LOAD16_WORD_SWAP( "m1101.u6", 0x000000, 0x400000, CRC(0114e9d1) SHA1(5b16170d3cd8b8e1662c949b7234fbdd2ca927f7) ) // FIXED BITS (0xxxxxxxxxxxxxxx)
ROM_REGION( 0x80000, "tilemaps", 0 ) // adddress scrambling
- ROM_LOAD( "m1103", 0x000000, 0x080000, CRC(4d3776b4) SHA1(fa9b311b1a6ad56e136b66d090bc62ed5003b2f2) )
+ ROM_LOAD( "m1103.u8", 0x00000, 0x80000, CRC(4d3776b4) SHA1(fa9b311b1a6ad56e136b66d090bc62ed5003b2f2) )
ROM_REGION( 0x80000, "oki", 0 )
ROM_LOAD( "s1102.u23", 0x00000, 0x80000, CRC(51ffe245) SHA1(849011b186096add657ab20d49d260ec23363ef3) )
@@ -2928,8 +3767,8 @@ ROM_START( slqz2 )
ROM_REGION( 0x10000, "igs022", 0 ) // INTERNATIONAL GAMES SYSTEM CO.,LTD
ROM_LOAD( "m1103.u12", 0x00000, 0x10000, CRC(9f3b8d65) SHA1(5ee1ad025474399c2826f21d970e76f25d0fa1fd) )
- ROM_REGION( 0x200000, "sprites", 0 ) // adddress scrambling
- ROM_LOAD16_WORD_SWAP( "m1101.u4", 0x000000, 0x200000, CRC(fed09cd6) SHA1(0658a97983f8ba408126e79889cc58323f2d99ba) ) // = m1101.u6 Mahjong Long Hu Zheng Ba 2
+ ROM_REGION( 0x400000, "sprites", 0 ) // adddress scrambling
+ ROM_LOAD16_WORD_SWAP( "m1101.u4", 0x000000, 0x400000, CRC(0114e9d1) SHA1(5b16170d3cd8b8e1662c949b7234fbdd2ca927f7) ) // FIXED BITS (0xxxxxxxxxxxxxxx)
ROM_REGION( 0x80000, "tilemaps", 0 ) // light adddress scrambling
ROM_LOAD( "text.u6", 0x00000, 0x80000, CRC(40d21adf) SHA1(18b202d6330ac89026bec2c9c8224b52540dd48d) )
@@ -3132,14 +3971,14 @@ ROM_END
GAME( 1996, iqblocka, iqblock, iqblocka, iqblocka, iqblocka, ROT0, "IGS", "Shu Zi Le Yuan (V127M)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
GAME( 1996, iqblockf, iqblock, iqblocka, iqblocka, iqblockf, ROT0, "IGS", "Shu Zi Le Yuan (V113FR)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
-GAME( 1997, tjsb, 0, tjsb, tjsb, tjsb, ROT0, "IGS", "Mahjong Tian Jiang Shen Bing (V137C)", GAME_UNEMULATED_PROTECTION )
-GAME( 1997, sdmg2, 0, sdmg2, sdmg2, sdmg2, ROT0, "IGS", "Mahjong Super Da Man Guan II (China, V754C)", 0 )
GAME( 1997, mgdh, 0, mgdha, mgdh, mgdh, ROT0, "IGS", "Mahjong Man Guan Da Heng (Taiwan, V125T1)", 0 )
GAME( 1997, mgdha, mgdh, mgdha, mgdh , mgdha, ROT0, "IGS", "Mahjong Man Guan Da Heng (Taiwan, V123T1)", 0 )
+GAME( 1997, sdmg2, 0, sdmg2, sdmg2, sdmg2, ROT0, "IGS", "Mahjong Super Da Man Guan II (China, V754C)", 0 )
+GAME( 1997, tjsb, 0, tjsb, tjsb, tjsb, ROT0, "IGS", "Mahjong Tian Jiang Shen Bing (V137C)", GAME_UNEMULATED_PROTECTION )
GAME( 1998, mgcs, 0, mgcs, mgcs, mgcs, ROT0, "IGS", "Mahjong Man Guan Cai Shen (V103CS)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND )
-GAME( 1998, lhzb2, 0, sdmg2, sdmg2, lhzb2, ROT0, "IGS", "Mahjong Long Hu Zheng Ba 2 (set 1)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
-GAME( 1998, lhzb2a, lhzb2, sdmg2, sdmg2, lhzb2a, ROT0, "IGS", "Mahjong Long Hu Zheng Ba 2 (set 2)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
-GAME( 1998, slqz2, 0, sdmg2, sdmg2, slqz2, ROT0, "IGS", "Mahjong Shuang Long Qiang Zhu 2", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
+GAME( 1998, lhzb2, 0, lhzb2, lhzb2, lhzb2, ROT0, "IGS", "Mahjong Long Hu Zheng Ba 2 (set 1)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
+GAME( 1998, lhzb2a, lhzb2, lhzb2a, lhzb2a, lhzb2a, ROT0, "IGS", "Mahjong Long Hu Zheng Ba 2 (VS221M)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
+GAME( 1998, slqz2, 0, slqz2, slqz2, slqz2, ROT0, "IGS", "Mahjong Shuang Long Qiang Zhu 2 (VS203J)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
GAME( 1999?, tarzan, 0, iqblocka, iqblocka, tarzan, ROT0, "IGS", "Tarzan (V109C)", GAME_NOT_WORKING )
GAME( 1999?, tarzana, tarzan, iqblocka, iqblocka, tarzana, ROT0, "IGS", "Tarzan (V107)", GAME_NOT_WORKING )
GAME( 2000?, starzan, 0, iqblocka, iqblocka, starzan, ROT0, "IGS / G.F. Gioca", "Super Tarzan (Italy, V100I)", GAME_NOT_WORKING )