diff options
| author | 2012-04-06 17:57:36 +0000 | |
|---|---|---|
| committer | 2012-04-06 17:57:36 +0000 | |
| commit | bf1bb6201a82e8127e9ecccc4448a52d8ee17a48 (patch) | |
| tree | a346e746c19f811f2897e25047a4406c06c08336 /src | |
| parent | cc78fc268489df9b324ebdbf40b3055f697525de (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.c | 961 |
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 ) |
