From a5d9d44c00ad522bb3fea161ffdd06ad907315d2 Mon Sep 17 00:00:00 2001 From: Luca Elia Date: Sat, 3 Jan 2009 14:16:25 +0000 Subject: [PATCH] Improved mgcs. It now runs through attract mode. [Luca Elia] It still locks up as soon as one coins up though, due to the unemulated IGS029 protection. --- .gitattributes | 2 +- src/mame/drivers/{igs_180.c => igs017.c} | 636 +++++++++++++++++++++-- src/mame/drivers/igs_m68.c | 107 ---- src/mame/mame.mak | 2 +- 4 files changed, 588 insertions(+), 159 deletions(-) rename src/mame/drivers/{igs_180.c => igs017.c} (56%) diff --git a/.gitattributes b/.gitattributes index aea4e89c442..7aa7fa0d7be 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1572,7 +1572,7 @@ src/mame/drivers/hyhoo.c svneol=native#text/plain src/mame/drivers/hyperspt.c svneol=native#text/plain src/mame/drivers/hyprduel.c svneol=native#text/plain src/mame/drivers/igs009.c svneol=native#text/plain -src/mame/drivers/igs_180.c svneol=native#text/plain +src/mame/drivers/igs017.c svneol=native#text/plain src/mame/drivers/igs_blit.c svneol=native#text/plain src/mame/drivers/igs_m027.c svneol=native#text/plain src/mame/drivers/igs_m68.c svneol=native#text/plain diff --git a/src/mame/drivers/igs_180.c b/src/mame/drivers/igs017.c similarity index 56% rename from src/mame/drivers/igs_180.c rename to src/mame/drivers/igs017.c index a6bf9423226..daef5370309 100644 --- a/src/mame/drivers/igs_180.c +++ b/src/mame/drivers/igs017.c @@ -1,13 +1,18 @@ -/*************************************************************************** +/************************************************************************************************************ - -= IGS017 Based Hardware =- + -= IGS017 Based Hardware =- - driver by Pierpaolo Prazzoli, Luca Elia (l.elia@tin.it) + driver by Pierpaolo Prazzoli, Luca Elia (l.elia@tin.it) -CPU: Z180 (HD64180) -GFX: IGS017 (2 tilemaps, variable size sprites, protection) -SOUND: M6295, YM2413 -OTHER: IGS025 +IGS017: 2 tilemaps, variable size sprites, protection. + +------------------------------------------------------------------------------------------------------------- +Year + Game PCB CPU Sound Custom Other +------------------------------------------------------------------------------------------------------------- +96 Shu Zi Le Yuan N0-0131-4 HD64180 M6295 YM2413 IGS017 8255 Battery +97 Mahjong Tian Jiang Shen Bing N0-0157-2 HD64180 M6295 YM2413 IGS017 IGS025 Battery +98 Mahjong Man Guan Cai Shen N0-0192-1 M68000 M6295 IGS017 IGS025 IGS029 Battery +------------------------------------------------------------------------------------------------------------- To Do: @@ -20,10 +25,11 @@ Notes: - iqblocka: keep start or test pressed during boot to enter test mode A or B. -***************************************************************************/ +************************************************************************************************************/ #include "driver.h" #include "deprecat.h" +#include "cpu/m68000/m68000.h" #include "cpu/z180/z180.h" #include "machine/8255ppi.h" #include "sound/2413intf.h" @@ -56,13 +62,47 @@ static WRITE8_HANDLER( fg_w ) fg_videoram[offset] = data; tilemap_mark_tile_dirty(fg_tilemap,offset/4); } + static WRITE8_HANDLER( bg_w ) { bg_videoram[offset] = data; tilemap_mark_tile_dirty(bg_tilemap,offset/4); } -static VIDEO_START(igs_180) +// 16-bit handlers for an 8-bit chip + +static READ16_HANDLER( fg_lsb_r ) +{ + return fg_videoram[offset]; +} +static WRITE16_HANDLER( fg_lsb_w ) +{ + if (ACCESSING_BITS_0_7) + fg_w(space,offset,data); +} + +static READ16_HANDLER( bg_lsb_r ) +{ + return bg_videoram[offset]; +} +static WRITE16_HANDLER( bg_lsb_w ) +{ + if (ACCESSING_BITS_0_7) + bg_w(space,offset,data); +} + +static READ16_HANDLER( spriteram_lsb_r ) +{ + return spriteram[offset]; +} +static WRITE16_HANDLER( spriteram_lsb_w ) +{ + if (ACCESSING_BITS_0_7) + spriteram[offset] = data; +} + + +static VIDEO_START( igs017 ) { fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,64,32); bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,64,32); @@ -79,8 +119,8 @@ static int sprites_gfx_size; // This routine expands each word into three bytes. static void expand_sprites(running_machine *machine) { - UINT8 *rom = memory_region(machine, "gfx1"); - int size = memory_region_length(machine, "gfx1"); + UINT8 *rom = memory_region(machine, "sprites"); + int size = memory_region_length(machine, "sprites"); int i; sprites_gfx_size = size / 2 * 3; @@ -122,7 +162,8 @@ static void expand_sprites(running_machine *machine) 7.b 765- ---- Color ---4 ---- Flip X - ---- 3210 Code (high) + ---- 3--- + ---- -210 Code (high) Code = ROM Address / 2 = Pixel / 3 @@ -169,7 +210,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan y = s[0] + (s[1] << 8); x = s[2] + (s[3] << 8); - addr = (s[4] >> 6) | (s[5] << 2) | (s[6] << 10) | ((s[7] & 0x03) << 18); + addr = (s[4] >> 6) | (s[5] << 2) | (s[6] << 10) | ((s[7] & 0x07) << 18); addr *= 3; flipx = s[7] & 0x10; @@ -231,7 +272,7 @@ static int debug_viewer(running_machine *machine, bitmap_t *bitmap,const rectang return 0; } -static VIDEO_UPDATE(igs_180) +static VIDEO_UPDATE( igs017 ) { int layers_ctrl = -1; @@ -363,8 +404,8 @@ static DRIVER_INIT( iqblockf ) static void tjsb_decrypt_sprites(running_machine *machine) { - int length = memory_region_length(machine, "gfx1"); - UINT8 *rom = memory_region(machine, "gfx1"); + int length = memory_region_length(machine, "sprites"); + UINT8 *rom = memory_region(machine, "sprites"); UINT8 *tmp = auto_malloc(length); int i; @@ -406,11 +447,126 @@ static DRIVER_INIT( tjsb ) expand_sprites(machine); } +// mgcs + +static void mgcs_decrypt_program_rom(running_machine *machine) +{ + int i; + UINT16 *src = (UINT16 *)memory_region(machine, "main"); + + int rom_size = 0x80000; + + for (i=0; i> 8; + } +} + +static void mgcs_patch_rom(running_machine *machine) +{ + UINT16 *rom = (UINT16 *)memory_region(machine, "main"); + + rom[0x4e036/2] = 0x6006; + + // IGS029 reads the dips? + rom[0x4e00e/2] = 0x4e75; + + rom[0x4dfce/2] = 0x6010; // 04DFCE: 6610 bne $4dfe0 + rom[0x20666/2] = 0x601e; // 020666: 671E beq $20686 (rom check) +} + +static DRIVER_INIT( mgcs ) +{ + mgcs_decrypt_program_rom(machine); + mgcs_patch_rom(machine); + + mgcs_decrypt_tiles(machine); + mgcs_flip_sprites(machine); + + expand_sprites(machine); +} + + /*************************************************************************** Memory Maps ***************************************************************************/ -static ADDRESS_MAP_START( igs_180_map, ADDRESS_SPACE_PROGRAM, 8 ) +static ADDRESS_MAP_START( iqblocka_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE( 0x00000, 0x0dfff ) AM_ROM AM_RANGE( 0x0e000, 0x0efff ) AM_RAM AM_RANGE( 0x0f000, 0x0ffff ) AM_RAM @@ -477,7 +633,7 @@ static READ8_HANDLER( input_r ) } } -static ADDRESS_MAP_START( igs_180_portmap, ADDRESS_SPACE_IO, 8 ) +static ADDRESS_MAP_START( iqblocka_io, ADDRESS_SPACE_IO, 8 ) AM_RANGE( 0x0000, 0x003f ) AM_RAM // internal regs AM_RANGE( 0x1000, 0x17ff ) AM_RAM AM_BASE( &spriteram ) @@ -491,8 +647,8 @@ static ADDRESS_MAP_START( igs_180_portmap, ADDRESS_SPACE_IO, 8 ) AM_RANGE( 0x2014, 0x2014 ) AM_WRITE( nmi_enable_w ) AM_RANGE( 0x2015, 0x2015 ) AM_WRITE( irq_enable_w ) - AM_RANGE( 0x4000, 0x5fff ) AM_READWRITE( SMH_RAM, fg_w ) AM_BASE( &fg_videoram ) - AM_RANGE( 0x6000, 0x7fff ) AM_READWRITE( SMH_RAM, bg_w ) AM_BASE( &bg_videoram ) + AM_RANGE( 0x4000, 0x5fff ) AM_RAM_WRITE( fg_w ) AM_BASE( &fg_videoram ) + AM_RANGE( 0x6000, 0x7fff ) AM_RAM_WRITE( bg_w ) AM_BASE( &bg_videoram ) AM_RANGE( 0x8000, 0x8000 ) AM_WRITE( input_select_w ) AM_RANGE( 0x8001, 0x8001 ) AM_READ ( input_r ) @@ -506,6 +662,129 @@ static ADDRESS_MAP_START( igs_180_portmap, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_END +// mgcs + +static UINT16 igs_magic[2]; +static UINT8 scramble_data; + +static WRITE16_HANDLER( mgcs_magic_w ) +{ + COMBINE_DATA(&igs_magic[offset]); + + if (offset == 0) + return; + + switch(igs_magic[0]) + { + case 0x00: + if (ACCESSING_BITS_0_7) + { + input_select = data & 0xff; + } + + if ( input_select & ~0xfc ) + logerror("%06x: warning, unknown bits written in input_select = %02x\n", cpu_get_pc(space->cpu), input_select); + break; + + case 0x01: + if (ACCESSING_BITS_0_7) + { + scramble_data = data & 0xff; + } + break; + + default: + logerror("%06x: warning, writing to igs_magic %02x = %02x\n", cpu_get_pc(space->cpu), igs_magic[0], data); + } +} + +static READ16_HANDLER( mgcs_magic_r ) +{ + switch(igs_magic[0]) + { + case 0x01: + return BITSWAP8(scramble_data, 4,5,6,7, 0,1,2,3); + + default: + logerror("%06x: warning, reading with igs_magic = %02x\n", cpu_get_pc(space->cpu), igs_magic[0]); + break; + } + + return 0xffff; +} + +static READ8_DEVICE_HANDLER( mgcs_keys_r ) +{ + if (~input_select & 0x08) return input_port_read(device->machine, "KEY0"); + if (~input_select & 0x10) return input_port_read(device->machine, "KEY1"); + if (~input_select & 0x20) return input_port_read(device->machine, "KEY2"); + if (~input_select & 0x40) return input_port_read(device->machine, "KEY3"); + if (~input_select & 0x80) return input_port_read(device->machine, "KEY4"); + + logerror("%s: warning, reading key with input_select = %02x\n", cpuexec_describe_context(device->machine), input_select); + return 0xff; +} + +static int irq1_enable; +static WRITE16_HANDLER( irq1_enable_w ) +{ + if (ACCESSING_BITS_0_7) + irq1_enable = data & 1; + + if (data != 0 && data != 0xff) + logerror("PC %06X: irq1_enable = %04x\n",cpu_get_pc(space->cpu),data); +} + +static int irq2_enable; +static WRITE16_HANDLER( irq2_enable_w ) +{ + if (ACCESSING_BITS_0_7) + irq2_enable = data & 1; + + if (data != 0 && data != 0xff) + logerror("PC %06X: irq2_enable = %04x\n",cpu_get_pc(space->cpu),data); +} + +static WRITE16_HANDLER( mgcs_paletteram_xRRRRRGGGGGBBBBB_w ) +{ + int rgb; + + COMBINE_DATA(&paletteram16[offset]); + + rgb = ((paletteram16[offset/2*2+0] & 0xff) << 8) | (paletteram16[offset/2*2+1] & 0xff); + + // bitswap + rgb = BITSWAP16(rgb,7,8,9,2,14,3,13,15,12,11,10,0,1,4,5,6); + + palette_set_color_rgb(space->machine, offset/2, pal5bit(rgb >> 0), pal5bit(rgb >> 5), pal5bit(rgb >> 10)); +} + +static READ16_DEVICE_HANDLER ( mgcs_ppi8255_r ) { return ppi8255_r(device, offset); } +static WRITE16_DEVICE_HANDLER( mgcs_ppi8255_w ) { if (ACCESSING_BITS_0_7) ppi8255_w(device, offset, data); } + +static ADDRESS_MAP_START( mgcs, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE( 0x000000, 0x07ffff ) AM_ROM + AM_RANGE( 0x300000, 0x303fff ) AM_RAM + + AM_RANGE( 0x49c000, 0x49c003 ) AM_WRITE( mgcs_magic_w ) + AM_RANGE( 0x49c002, 0x49c003 ) AM_READ ( mgcs_magic_r ) + + AM_RANGE( 0xa02000, 0xa02fff ) AM_READWRITE( spriteram_lsb_r, spriteram_lsb_w ) AM_BASE( (UINT16**)&spriteram ) + AM_RANGE( 0xa03000, 0xa037ff ) AM_RAM_WRITE( mgcs_paletteram_xRRRRRGGGGGBBBBB_w ) AM_BASE( &paletteram16 ) + + AM_RANGE( 0xa04020, 0xa04027 ) AM_DEVREADWRITE(PPI8255, "ppi8255", mgcs_ppi8255_r, mgcs_ppi8255_w) + + AM_RANGE( 0xa04028, 0xa04029 ) AM_WRITE( irq2_enable_w ) + AM_RANGE( 0xa0402a, 0xa0402b ) AM_WRITE( irq1_enable_w ) + + AM_RANGE( 0xa08000, 0xa0bfff ) AM_READWRITE( fg_lsb_r, fg_lsb_w ) AM_BASE( (UINT16**)&fg_videoram ) + AM_RANGE( 0xa0c000, 0xa0ffff ) AM_READWRITE( bg_lsb_r, bg_lsb_w ) AM_BASE( (UINT16**)&bg_videoram ) + + // oki banking? + AM_RANGE( 0xa12000, 0xa12001 ) AM_READWRITE( okim6295_status_0_lsb_r, okim6295_data_0_lsb_w ) +ADDRESS_MAP_END + + /*************************************************************************** Input Ports ***************************************************************************/ @@ -628,6 +907,120 @@ static INPUT_PORTS_START( iqblocka ) INPUT_PORTS_END +static INPUT_PORTS_START( mgcs ) + + // DSWs don't work: they are read through a protection device (IGS029? see code at 1CF16) + + 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_4C ) ) + 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, "500" ) + PORT_DIPSETTING( 0x00, "1000" ) + 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, "Double Up Limit" ) + PORT_DIPSETTING( 0x80, "1000" ) + PORT_DIPSETTING( 0x00, "2000" ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x03, 0x03, "Min Bet" ) + PORT_DIPSETTING( 0x03, "1" ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x04, 0x04, "Double Up" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Double Up Type" ) + PORT_DIPSETTING( 0x10, "Double" ) + PORT_DIPSETTING( 0x00, DEF_STR( Single ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Controls ) ) + PORT_DIPSETTING( 0x20, "Keyboard" ) + PORT_DIPSETTING( 0x00, DEF_STR( Joystick ) ) + PORT_DIPNAME( 0x40, 0x40, "Number Type" ) + PORT_DIPSETTING( 0x40, "Number" ) + PORT_DIPSETTING( 0x00, "Tile" ) + PORT_DIPNAME( 0x80, 0x80, "Bet Number" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + // the top 2 bits of COINS and KEYx are read and combined (see code at 1C83A) + + PORT_START("COINS") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) // ? (shown in service mode) + 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) + 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 + /*************************************************************************** Graphics Layout @@ -644,8 +1037,23 @@ static const gfx_layout layout_8x8x4 = 8*8*4 }; -static GFXDECODE_START( igs_180 ) - GFXDECODE_ENTRY( "gfx2", 0, layout_8x8x4, 0, 16 ) +static const gfx_layout layout_8x8x4_flipped = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { 8*2,8*3,8*0,8*1 }, + { STEP8(7, -1) }, + { STEP8(0, 8*4) }, + 8*8*4 +}; + +static GFXDECODE_START( igs017_flipped ) + GFXDECODE_ENTRY( "tilemaps", 0, layout_8x8x4_flipped, 0, 16 ) +GFXDECODE_END + +static GFXDECODE_START( igs017 ) + GFXDECODE_ENTRY( "tilemaps", 0, layout_8x8x4, 0, 16 ) GFXDECODE_END @@ -653,7 +1061,7 @@ GFXDECODE_END Machine Drivers ***************************************************************************/ -static INTERRUPT_GEN( igs_180_interrupt ) +static INTERRUPT_GEN( iqblocka_interrupt ) { if (cpu_getiloops(device) & 1) { @@ -668,33 +1076,34 @@ static INTERRUPT_GEN( igs_180_interrupt ) } // Dips are read through the 8255 -static const ppi8255_interface ppi8255_intf = +static const ppi8255_interface iqblocka_ppi8255_intf = { - DEVICE8_PORT("DSW0"), // Port A read - DEVICE8_PORT("DSW1"), // Port B read - DEVICE8_PORT("DSW2"), // Port C read - 0, // Port A write - 0, // Port B write - 0, // Port C write + DEVICE8_PORT("DSW0"), // Port A read + DEVICE8_PORT("DSW1"), // Port B read + DEVICE8_PORT("DSW2"), // Port C read + + 0, // Port A write + 0, // Port B write + 0, // Port C write }; -static MACHINE_RESET( igs_180 ) +static MACHINE_RESET( iqblocka ) { nmi_enable = 0; irq_enable = 0; } -static MACHINE_DRIVER_START( igs_180 ) +static MACHINE_DRIVER_START( iqblocka ) /* basic machine hardware */ MDRV_CPU_ADD("main", Z180, XTAL_16MHz / 2) - MDRV_CPU_PROGRAM_MAP(igs_180_map,0) - MDRV_CPU_IO_MAP(igs_180_portmap,0) - MDRV_CPU_VBLANK_INT_HACK(igs_180_interrupt,2) + MDRV_CPU_PROGRAM_MAP(iqblocka_map,0) + MDRV_CPU_IO_MAP(iqblocka_io,0) + MDRV_CPU_VBLANK_INT_HACK(iqblocka_interrupt,2) - MDRV_PPI8255_ADD( "ppi8255", ppi8255_intf ) + MDRV_PPI8255_ADD( "ppi8255", iqblocka_ppi8255_intf ) - MDRV_MACHINE_RESET(igs_180) + MDRV_MACHINE_RESET(iqblocka) /* video hardware */ MDRV_SCREEN_ADD("main", RASTER) @@ -704,11 +1113,11 @@ static MACHINE_DRIVER_START( igs_180 ) MDRV_SCREEN_SIZE(512, 256) MDRV_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1) - MDRV_GFXDECODE(igs_180) + MDRV_GFXDECODE(igs017) MDRV_PALETTE_LENGTH(0x100*2) - MDRV_VIDEO_START(igs_180) - MDRV_VIDEO_UPDATE(igs_180) + MDRV_VIDEO_START(igs017) + MDRV_VIDEO_UPDATE(igs017) /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") @@ -721,6 +1130,75 @@ static MACHINE_DRIVER_START( igs_180 ) MACHINE_DRIVER_END + +// mgcs + +static INTERRUPT_GEN( mgcs_interrupt ) +{ + if (cpu_getiloops(device) & 1) + { + if (irq2_enable) + cpu_set_input_line(device, 2, HOLD_LINE); + } + else + { + if (irq1_enable) + cpu_set_input_line(device, 1, HOLD_LINE); + } +} + +static MACHINE_RESET( mgcs ) +{ + irq1_enable = 0; + irq2_enable = 0; +} + +static const ppi8255_interface mgcs_ppi8255_intf = +{ + DEVICE8_PORT("COINS"), // Port A read + mgcs_keys_r, // Port B read + 0, // Port C read (see code at 1C83A) + + 0, // Port A write + 0, // Port B write + 0, // Port C write (with 0/1) +}; + +static MACHINE_DRIVER_START( mgcs ) + MDRV_CPU_ADD("main", M68000, XTAL_22MHz / 2) + MDRV_CPU_PROGRAM_MAP(mgcs,0) + MDRV_CPU_VBLANK_INT_HACK(mgcs_interrupt,2) + + MDRV_MACHINE_RESET(mgcs) + + MDRV_PPI8255_ADD( "ppi8255", mgcs_ppi8255_intf ) + + /* video hardware */ + MDRV_SCREEN_ADD("main", RASTER) + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(512, 256) + MDRV_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1) + + MDRV_GFXDECODE(igs017_flipped) + MDRV_PALETTE_LENGTH(0x100*2) + + MDRV_VIDEO_START(igs017) + MDRV_VIDEO_UPDATE(igs017) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + MDRV_SOUND_ADD("oki", OKIM6295, XTAL_8MHz / 8) + MDRV_SOUND_CONFIG(okim6295_interface_pin7high) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) +MACHINE_DRIVER_END + + +/*************************************************************************** + ROMs Loading +***************************************************************************/ + /* IQ Block (alt hardware) @@ -769,10 +1247,10 @@ ROM_START( iqblocka ) ROM_REGION( 0x40000, "main", 0 ) ROM_LOAD( "v.u18", 0x00000, 0x40000, CRC(2e2b7d43) SHA1(cc73f4c8f9a6e2219ee04c9910725558a80b4eb2) ) - ROM_REGION( 0x80000, "gfx1", ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, "sprites", ROMREGION_DISPOSE ) ROM_LOAD( "cg.u7", 0x000000, 0x080000, CRC(cb48a66e) SHA1(6d597193d1333a97957d5ceec8179a24bedfd928) ) // FIXED BITS (xxxxxxxx0xxxxxxx) - ROM_REGION( 0x80000, "gfx2", ROMREGION_DISPOSE) + ROM_REGION( 0x80000, "tilemaps", ROMREGION_DISPOSE) ROM_LOAD( "text.u8", 0x000000, 0x080000, CRC(48c4f4e6) SHA1(b1e1ca62cf6a99c11a5cc56705eef7e22a3b2740) ) ROM_REGION( 0x40000, "oki", 0 ) @@ -783,10 +1261,10 @@ ROM_START( iqblockf ) ROM_REGION( 0x40000, "main", 0 ) ROM_LOAD( "v113fr.u18", 0x00000, 0x40000, CRC(346c68af) SHA1(ceae4c0143c288dc9c1dd1e8a51f1e3371ffa439) ) - ROM_REGION( 0x80000, "gfx1", ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, "sprites", ROMREGION_DISPOSE ) ROM_LOAD( "cg.u7", 0x000000, 0x080000, CRC(cb48a66e) SHA1(6d597193d1333a97957d5ceec8179a24bedfd928) ) // FIXED BITS (xxxxxxxx0xxxxxxx) - ROM_REGION( 0x80000, "gfx2", ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, "tilemaps", ROMREGION_DISPOSE ) ROM_LOAD( "text.u8", 0x000000, 0x080000, CRC(48c4f4e6) SHA1(b1e1ca62cf6a99c11a5cc56705eef7e22a3b2740) ) ROM_REGION( 0x40000, "oki", 0 ) @@ -845,17 +1323,75 @@ ROM_START( tjsb ) ROM_REGION( 0x40000, "main", 0 ) ROM_LOAD( "p0700.u16", 0x00000, 0x40000,CRC(1b2a50df) SHA1(95a272e624f727df9523667864f933118d9e633c) ) - ROM_REGION( 0x200000, "gfx1", ROMREGION_DISPOSE ) + ROM_REGION( 0x200000, "sprites", ROMREGION_DISPOSE ) ROM_LOAD( "a0701.u3", 0x000000, 0x200000, CRC(aa182140) SHA1(37c2053386c183ff726ba417d13f2063cf9a22df) ) // FIXED BITS (xxxxxxxx0xxxxxxx) - ROM_REGION( 0x80000, "gfx2", ROMREGION_DISPOSE ) - ROM_LOAD( "text.u6", 0x000000, 0x080000, CRC(3be886b8) SHA1(15b3624ed076640c1828d065b01306a8656f5a9b) ) // BADADDR --xxxxxxxxxxxxxxxxx + ROM_REGION( 0x80000, "tilemaps", ROMREGION_DISPOSE ) + ROM_LOAD( "text.u6", 0x00000, 0x80000, CRC(3be886b8) SHA1(15b3624ed076640c1828d065b01306a8656f5a9b) ) // BADADDR --xxxxxxxxxxxxxxxxx ROM_REGION( 0x80000, "oki", 0 ) ROM_LOAD( "s0703.u15", 0x00000, 0x80000, CRC(c6f94d29) SHA1(ec413580240711fc4977dd3c96c288501aa7ef6c) ) ROM_END +/* -GAME( 1996, iqblocka, iqblock, igs_180, iqblocka, iqblocka, ROT0, "IGS", "Shu Zi Le Yuan (V127M)", GAME_NOT_WORKING ) -GAME( 1996, iqblockf, iqblock, igs_180, iqblocka, iqblockf, ROT0, "IGS", "Shu Zi Le Yuan (V113FR)", GAME_NOT_WORKING ) -GAME( 1997, tjsb, 0, igs_180, iqblocka, tjsb, ROT0, "IGS", "Mahjong Tian Jiang Shen Bing", GAME_NOT_WORKING ) +Mahjong Man Guan Cai Shen +IGS, 1998 + + +PCB Layout +---------- + +IGS PCB NO-0192-1 +|---------------------------------------| +| JAMMA UPC1242 | +| | +| S1502.U10 | +| K668 VOL | +| | +| | +| 22MHz | +|1 61256 | +|8 |-------| TEXT.U25 | +|W PAL | | | +|A |IGS017 | | +|Y | | M1501.U23| +| |-------| | +| |-------| | +| | | | +| |IGS025 | P1500.U8 | +| | | PAL 6264 | +|1 |-------| | +|0 |----| PAL 6264 | +|W |IGS | PAL | +|A |029 | 8MHz SPDT_SW| +|Y |----| 68000 | +|T DSW1 DSW2 BATTERY | +|---------------------------------------| +Notes: + Uses JAMMA & common 10-way/18-way Mahjong pinout + 68000 clock 11.000MHz [22/2] + K668 == Oki M6295 (QFP44). Clock 1MHz [8/8]. pin7 = High + VSync - 60Hz + HSync - 15.3kHz + +*/ + +ROM_START( mgcs ) + ROM_REGION( 0x80000, "main", 0 ) + ROM_LOAD16_WORD_SWAP( "p1500.u8", 0x00000, 0x80000, CRC(a8cb5905) SHA1(37be7d926a1352869632d43943763accd4dec4b7) ) + + ROM_REGION( 0x400000, "sprites", ROMREGION_DISPOSE ) + ROM_LOAD( "m1501.u23", 0x000000, 0x400000, CRC(96fce058) SHA1(6b87f47d646bad9b3061bdc8a9af65467fdbbc9f) ) // FIXED BITS (xxxxxxx0xxxxxxxx) + + ROM_REGION( 0x80000, "tilemaps", ROMREGION_DISPOSE ) + ROM_LOAD( "text.u25", 0x00000, 0x80000, CRC(a37f9613) SHA1(812f060ca98a34540c48a180c359c3d0f1c0b5bb) ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "s1502.u10", 0x00000, 0x80000, CRC(a8a6ba58) SHA1(59276a8ab4a31812600816c2a43b74bd71394419) ) +ROM_END + +GAME( 1996, iqblocka, iqblock, iqblocka, iqblocka, iqblocka, ROT0, "IGS", "Shu Zi Le Yuan (V127M)", GAME_NOT_WORKING ) +GAME( 1996, iqblockf, iqblock, iqblocka, iqblocka, iqblockf, ROT0, "IGS", "Shu Zi Le Yuan (V113FR)", GAME_NOT_WORKING ) +GAME( 1997, tjsb, 0, iqblocka, iqblocka, tjsb, ROT0, "IGS", "Mahjong Tian Jiang Shen Bing", GAME_NOT_WORKING ) +GAME( 1998, mgcs, 0, mgcs, mgcs, mgcs, ROT0, "IGS", "Mahjong Man Guan Cai Shen (V103CS)", GAME_NOT_WORKING ) diff --git a/src/mame/drivers/igs_m68.c b/src/mame/drivers/igs_m68.c index 341c47af7b4..7d2ce7ef55b 100644 --- a/src/mame/drivers/igs_m68.c +++ b/src/mame/drivers/igs_m68.c @@ -139,62 +139,6 @@ ROM_START( lhzb2a ) ROM_LOAD( "m1103", 0x000000, 0x080000, CRC(4d3776b4) SHA1(fa9b311b1a6ad56e136b66d090bc62ed5003b2f2) ) ROM_END -/* - -Mahjong Man Guan Cai Shen -IGS, 1998 - - -PCB Layout ----------- - -IGS PCB NO-0192-1 -|---------------------------------------| -| JAMMA UPC1242 | -| | -| S1502.U10 | -| K668 VOL | -| | -| | -| 22MHz | -|1 61256 | -|8 |-------| TEXT.U25 | -|W PAL | | | -|A |IGS017 | | -|Y | | M1501.U23| -| |-------| | -| |-------| | -| | | | -| |IGS025 | P1500.U8 | -| | | PAL 6264 | -|1 |-------| | -|0 |----| PAL 6264 | -|W |IGS | PAL | -|A |029 | 8MHz SPDT_SW| -|Y |----| 68000 | -|T DSW1 DSW2 BATTERY | -|---------------------------------------| -Notes: - Uses JAMMA & common 10-way/18-way Mahjong pinout - 68000 clock 11.000MHz [22/2] - K668 == Oki M6295 (QFP44). Clock 1MHz [8/8]. pin7 = High - VSync - 60Hz - HSync - 15.3kHz - -*/ - - -ROM_START( mgcs ) - ROM_REGION( 0x80000, "main", 0 ) /* 68000 Code */ - ROM_LOAD16_WORD_SWAP( "p1500.u8", 0x00000, 0x80000, CRC(a8cb5905) SHA1(37be7d926a1352869632d43943763accd4dec4b7) ) - - ROM_REGION( 0x80000, "oki", 0 ) /* Samples */ - ROM_LOAD( "s1502.u10", 0x00000, 0x80000, CRC(a8a6ba58) SHA1(59276a8ab4a31812600816c2a43b74bd71394419) ) - - ROM_REGION( 0x200000, "gfx1", 0 ) - ROM_LOAD( "m1501.u23", 0x000000, 0x200000, CRC(7a876bcc) SHA1(581740f39cfac56324f483a24aece6957645378a) ) - ROM_LOAD( "text.u25", 0x000000, 0x080000, CRC(a37f9613) SHA1(812f060ca98a34540c48a180c359c3d0f1c0b5bb) ) -ROM_END /* @@ -460,56 +404,6 @@ static DRIVER_INIT( lhzb2a ) } -static DRIVER_INIT( mgcs ) -{ - int i; - UINT16 *src = (UINT16 *) (memory_region(machine, "main")); - - int rom_size = 0x80000; - - for (i=0; i