From 89b183ab600003ff15d1c65daddb6e8971e56e0b Mon Sep 17 00:00:00 2001 From: Yasuhiro Ogawa Date: Tue, 24 Mar 2009 08:00:53 +0000 Subject: [PATCH] New games added or promoted from NOT_WORKING E-Jan Sakurasou [Cs9ph7Rg0] Todo: - fix corrupt gfx after Tsumo with Tenbou item - memory map has some uncertain area --- src/mame/drivers/seibuspi.c | 170 ++++++++++++++++++++++++++++++----- src/mame/includes/seibuspi.h | 3 + src/mame/mamedriv.c | 6 +- src/mame/video/seibuspi.c | 38 +++++++- 4 files changed, 189 insertions(+), 28 deletions(-) diff --git a/src/mame/drivers/seibuspi.c b/src/mame/drivers/seibuspi.c index 2a1ae5eddcf..657ff67e928 100644 --- a/src/mame/drivers/seibuspi.c +++ b/src/mame/drivers/seibuspi.c @@ -676,6 +676,7 @@ Notes: #include "machine/intelfsh.h" #include "sound/okim6295.h" #include "sound/ymf271.h" +#include "sound/ymz280b.h" #include "includes/seibuspi.h" UINT32 *spimainram; @@ -697,6 +698,8 @@ static int fifoout_read_request = 0; static UINT8 sb_coin_latch = 0; +static UINT8 ejsakura_input_port = 0; + static UINT8 z80_fifoout_pop(const address_space *space) { UINT8 r; @@ -910,6 +913,25 @@ static READ32_HANDLER( spi_controls2_r ) return 0xffffffff; } +static CUSTOM_INPUT( ejsakura_keyboard_r ) +{ + switch(ejsakura_input_port) + { + case 0x01: + return input_port_read(field->port->machine, "INPUT01"); + case 0x02: + return input_port_read(field->port->machine, "INPUT02"); + case 0x04: + return input_port_read(field->port->machine, "INPUT04"); + case 0x08: + return input_port_read(field->port->machine, "INPUT08"); + case 0x10: + return input_port_read(field->port->machine, "INPUT10"); + default: + return input_port_read(field->port->machine, "SYSTEM"); + } + return 0xffffffff; +} /********************************************************************/ static READ8_HANDLER( z80_soundfifo_r ) @@ -1063,6 +1085,13 @@ static void irqhandler(const device_config *device, int state) cpu_set_input_line(device->machine->cpu[1], 0, CLEAR_LINE); } +static WRITE32_HANDLER(sys386f2_eeprom_w) +{ + eeprom_write_bit((data & 0x80) ? 1 : 0); + eeprom_set_clock_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE); + eeprom_set_cs_line((data & 0x20) ? CLEAR_LINE : ASSERT_LINE); +} + static const ymf271_interface ymf271_config = { DEVCB_HANDLER(flashrom_read), @@ -1095,22 +1124,25 @@ static ADDRESS_MAP_START( seibu386_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0xffe00000, 0xffffffff) AM_ROM AM_REGION("user1", 0) AM_SHARE(2) /* ROM location in real-mode */ ADDRESS_MAP_END +static WRITE32_HANDLER(input_select_w) +{ + ejsakura_input_port = data; +} + static ADDRESS_MAP_START( sys386f2_map, ADDRESS_SPACE_PROGRAM, 32 ) - AM_RANGE(0x00000000, 0x00000417) AM_RAM - AM_RANGE(0x00000418, 0x0000041b) AM_READWRITE(spi_layer_bank_r, spi_layer_bank_w) - AM_RANGE(0x0000041c, 0x0000041f) AM_READNOP - AM_RANGE(0x0000041c, 0x0000041f) AM_WRITE(spi_layer_enable_w) - AM_RANGE(0x00000420, 0x0000042b) AM_RAM AM_BASE(&spi_scrollram) - AM_RANGE(0x00000480, 0x00000483) AM_WRITE(tilemap_dma_start_w) + AM_RANGE(0x00000000, 0x0000000f) AM_RAM + AM_RANGE(0x00000010, 0x00000013) AM_READ(spi_int_r) /* Unknown */ +// AM_RANGE(0x00000090, 0x00000097) AM_RAM /* Unknown */ + AM_RANGE(0x00000400, 0x00000403) AM_READNOP AM_WRITE(input_select_w) + AM_RANGE(0x00000404, 0x00000407) AM_WRITE(sys386f2_eeprom_w) + AM_RANGE(0x00000408, 0x0000040f) AM_DEVWRITE8("ymz", ymz280b_w, 0x000000ff) AM_RANGE(0x00000484, 0x00000487) AM_WRITE(palette_dma_start_w) AM_RANGE(0x00000490, 0x00000493) AM_WRITE(video_dma_length_w) AM_RANGE(0x00000494, 0x00000497) AM_WRITE(video_dma_address_w) AM_RANGE(0x0000050c, 0x0000050f) AM_WRITE(sprite_dma_start_w) - AM_RANGE(0x00000600, 0x00000603) AM_READ(spi_int_r) /* Unknown */ - AM_RANGE(0x00000604, 0x00000607) AM_READ(spi_controls1_r) /* Player controls */ +// AM_RANGE(0x00000600, 0x00000607) AM_READNOP /* Unknown */ AM_RANGE(0x00000608, 0x0000060b) AM_READ(spi_unknown_r) - AM_RANGE(0x0000060c, 0x0000060f) AM_READ(spi_controls2_r) /* Player controls (start) */ - AM_RANGE(0x0000068c, 0x0000068f) AM_WRITE(eeprom_w) + AM_RANGE(0x0000060c, 0x0000060f) AM_READ(spi_controls1_r) /* Player controls */ AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_BASE(&spimainram) AM_RANGE(0x00200000, 0x003fffff) AM_ROM AM_SHARE(2) AM_RANGE(0xffe00000, 0xffffffff) AM_ROM AM_REGION("user1", 0) AM_SHARE(2) /* ROM location in real-mode */ @@ -1293,6 +1325,62 @@ static INPUT_PORTS_START( spi_ejanhs ) PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_MAHJONG_RON ) PORT_PLAYER(1) INPUT_PORTS_END +static INPUT_PORTS_START( spi_ejsakura ) + PORT_START("INPUTS") + PORT_BIT( 0xffffffff, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM(ejsakura_keyboard_r, NULL) + + PORT_START("INPUT01") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_L ) PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_MAHJONG_H ) PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_MAHJONG_D ) PORT_PLAYER(1) + PORT_BIT( 0xffffffe0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("INPUT02") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_BIG ) PORT_PLAYER(1) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_FLIP_FLOP ) PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP ) PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_MAHJONG_SCORE ) PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE ) PORT_PLAYER(1) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_MAHJONG_SMALL ) PORT_PLAYER(1) + PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("INPUT04") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_PLAYER(1) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_K ) PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_MAHJONG_G ) PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_MAHJONG_C ) PORT_PLAYER(1) + PORT_BIT( 0xffffffe0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("INPUT08") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) PORT_PLAYER(1) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_M ) PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_I ) PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_MAHJONG_E ) PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_MAHJONG_A ) PORT_PLAYER(1) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("INPUT10") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_PLAYER(1) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_N ) PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_J ) PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_MAHJONG_F ) PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_MAHJONG_B ) PORT_PLAYER(1) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) PORT_PLAYER(1) + PORT_SERVICE_NO_TOGGLE( 0x00000200, IP_ACTIVE_LOW) /* Test Button */ + PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Payout") PORT_CODE(KEYCODE_Q) + PORT_BIT( 0xfffff5c0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("SYSTEM") + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x00004000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(eeprom_bit_r, NULL) + PORT_BIT( 0xffffbf3f, IP_ACTIVE_LOW, IPT_UNUSED ) + +INPUT_PORTS_END /********************************************************************/ #define PLANE_CHAR 0 @@ -1643,6 +1731,27 @@ static GFXDECODE_START( spi ) #endif GFXDECODE_END +static const gfx_layout sys386f2_spritelayout = +{ + 16,16, + RGN_FRAC(1,4), + 8, + { 0, 8, RGN_FRAC(1,4)+0, RGN_FRAC(1,4)+8, RGN_FRAC(2,4)+0, RGN_FRAC(2,4)+8, RGN_FRAC(3,4)+0, RGN_FRAC(3,4)+8 }, + { + 7,6,5,4,3,2,1,0,23,22,21,20,19,18,17,16 + }, + { + 0*32,1*32,2*32,3*32,4*32,5*32,6*32,7*32,8*32,9*32,10*32,11*32,12*32,13*32,14*32,15*32 + }, + 16*32 +}; + +static GFXDECODE_START( sys386f2) + GFXDECODE_ENTRY( "gfx1", 0, spi_charlayout, 5632, 16 ) // Not used + GFXDECODE_ENTRY( "gfx2", 0, spi_tilelayout, 4096, 24 ) // Not used + GFXDECODE_ENTRY( "gfx3", 0, sys386f2_spritelayout, 0, 96 ) +GFXDECODE_END + /********************************************************************************/ static NVRAM_HANDLER( spi ) @@ -2093,6 +2202,24 @@ MACHINE_DRIVER_END static DRIVER_INIT( sys386f2 ) { //init_rf2(machine); + memory_install_write32_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x560, 0x563, 0, 0, sprite_dma_start_w); + + { + int i, j; + UINT16 *src = (UINT16 *)memory_region(machine, "gfx3"); + UINT16 tmp[0x40 / 2], Offset; + + for(i = 0; i < memory_region_length(machine, "gfx3") / 0x40; i++) + { + memcpy(tmp, src, 0x40); + + for(j = 0; j < 0x40 / 2; j++) + { + Offset = (j >> 1) | (j << 4 & 0x10); + *src++ = tmp[Offset]; + } + } + } } static MACHINE_DRIVER_START( sys386f2 ) @@ -2115,16 +2242,15 @@ static MACHINE_DRIVER_START( sys386f2 ) MDRV_SCREEN_SIZE(64*8, 32*8) MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MDRV_GFXDECODE(spi) - MDRV_PALETTE_LENGTH(6144) + MDRV_GFXDECODE(sys386f2) + MDRV_PALETTE_LENGTH(8192) - MDRV_VIDEO_START(spi) - MDRV_VIDEO_UPDATE(spi) + MDRV_VIDEO_START(sys386f2) + MDRV_VIDEO_UPDATE(sys386f2) MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MDRV_SOUND_ADD("ymf", YMF271, 16934400) - MDRV_SOUND_CONFIG(ymf271_config) + MDRV_SOUND_ADD("ymz", YMZ280B, 16934400) MDRV_SOUND_ROUTE(0, "lspeaker", 1.0) MDRV_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_DRIVER_END @@ -3267,12 +3393,12 @@ ROM_START(ejsakura) /* SYS386F V2.0 */ ROM_REGION( 0x900000, "gfx2", ROMREGION_ERASEFF) /* background layer roms */ ROM_REGION( 0x1000000, "gfx3", 0) /* sprites */ - ROM_LOAD("chr1.442", 0x000000, 0x400000, CRC(177e3139) SHA1(0385a831c141d59ec4e9c6d6fae9436dca123764) ) - ROM_LOAD("chr2.443", 0x400000, 0x400000, CRC(638dc9ae) SHA1(0c11b1e688733fbaeabf83b33410714c22ae53cd) ) - ROM_LOAD("chr3.444", 0x800000, 0x400000, CRC(8e5d1de5) SHA1(c1ccb6b4341ee1e939958ec9e68280c6faa2ef1f) ) - ROM_LOAD("chr4.445", 0xc00000, 0x400000, CRC(40c6c238) SHA1(0d07b59e25632feb070ce0e572ae75f9bb939893) ) + ROM_LOAD16_WORD_SWAP("chr1.442", 0x000000, 0x400000, CRC(40c6c238) SHA1(0d07b59e25632feb070ce0e572ae75f9bb939893) ) + ROM_LOAD16_WORD_SWAP("chr2.443", 0x400000, 0x400000, CRC(8e5d1de5) SHA1(c1ccb6b4341ee1e939958ec9e68280c6faa2ef1f) ) + ROM_LOAD16_WORD_SWAP("chr3.444", 0x800000, 0x400000, CRC(638dc9ae) SHA1(0c11b1e688733fbaeabf83b33410714c22ae53cd) ) + ROM_LOAD16_WORD_SWAP("chr4.445", 0xc00000, 0x400000, CRC(177e3139) SHA1(0385a831c141d59ec4e9c6d6fae9436dca123764) ) - ROM_REGION(0x1000000, "ymf", ROMREGION_ERASE00) + ROM_REGION(0x1000000, "ymz", ROMREGION_ERASE00) ROM_LOAD("sound1.83", 0x000000, 0x800000, CRC(98783cfc) SHA1(f142429e0658a36e908cc135fe0e01ce853d071d) ) ROM_LOAD("sound2.84", 0x800000, 0x800000, CRC(ff37e769) SHA1(eb6d260cbc4e4a925a5d8f604ec695e567ac6bb5) ) ROM_END @@ -3330,4 +3456,4 @@ GAME( 1999, rfjetus, rfjet, sxx2g, spi_2button, rfjet, ROT270, "Seibu GAME( 2000, rdft22kc, rdft2, seibu386, seibu386_2button, rdft22kc, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - 2000 (China)", GAME_IMPERFECT_GRAPHICS ) /* SYS386F V2.0 */ -GAME( 1999, ejsakura, 0, sys386f2, spi_ejanhs, sys386f2, ROT270, "Seibu Kaihatsu", "E-Jan Sakurasou", GAME_NOT_WORKING ) +GAME( 1999, ejsakura, 0, sys386f2, spi_ejsakura, sys386f2, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) diff --git a/src/mame/includes/seibuspi.h b/src/mame/includes/seibuspi.h index 7e4c9e1de94..4889881286e 100644 --- a/src/mame/includes/seibuspi.h +++ b/src/mame/includes/seibuspi.h @@ -30,6 +30,9 @@ extern UINT32 *spi_scrollram; VIDEO_START( spi ); VIDEO_UPDATE( spi ); +VIDEO_START( sys386f2 ); +VIDEO_UPDATE( sys386f2 ); + READ32_HANDLER( spi_layer_bank_r ); WRITE32_HANDLER( spi_layer_bank_w ); WRITE32_HANDLER( spi_layer_enable_w ); diff --git a/src/mame/mamedriv.c b/src/mame/mamedriv.c index 097f5d8ab86..9b9e5ab205c 100644 --- a/src/mame/mamedriv.c +++ b/src/mame/mamedriv.c @@ -4355,7 +4355,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( ggxx ) /* 2002.05 Guilty Gear XX */ /* 2002.05 Cleopatra Fortune + */ DRIVER( mok ) /* 2002.05 The Maze of the Kings */ - DRIVER( ngdup23a ) /* GD-ROM Firmware Updater */ + DRIVER( ngdup23a ) /* DIMM Firmware Updater */ DRIVER( ngdup23c ) DRIVER( chocomk ) /* 2002.06 Musapy no Choco Marker */ /* 2002.07 Mazan */ @@ -4365,13 +4365,13 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( quizqgd ) /* 2003.01 Quiz Keitai Q mode */ /* 2003.03 Yonin Uchi Mahjong MJ Network Taisen ver. */ DRIVER( usagui ) - DRIVER( tetkiwam ) DRIVER( ggxxrl ) /* 2003.03 Guilty Gear XX # Reload */ DRIVER( shikgam2 ) /* 2003.04 Shikigami no Shiro 2 */ DRIVER( bdrdown ) /* 2003.04 Border Down */ DRIVER( psyvar2 ) /* 2003.11 Psyvariar 2 */ DRIVER( puyofev ) /* 2003.11 Puyopuyo Fever */ DRIVER( cfield ) /* 2004.06 Chaos Field */ + DRIVER( tetkiwam ) /* 2004.06 Tetris Kiwamemichi */ DRIVER( trizeal ) /* 2004.09 Trizeal */ /* 2005.03 Melty Blood Act Cadenza */ DRIVER( ss2005 ) /* 2005.04 Super Shanghai 2005 */ @@ -4380,8 +4380,8 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( meltybld ) /* 2005.08 Melty Blood Act Cadenza ver.A */ DRIVER( ggxxsla ) /* 2005.09 Guilty Gear XX Slash */ DRIVER( radirgy ) /* 2005.10 Radirgy */ - /* 2005.?? Radirgy (Rev. A) */ DRIVER( undefeat ) /* 2005.10 Under Defeat */ + /* 2005.12 Radirgy (Rev. A) */ /* 2006.03 Kurukuru Chameleon */ DRIVER( trgheart ) /* 2006.05 Trigger Heart Exelica */ /* 2006.07 Touch de Zunou */ diff --git a/src/mame/video/seibuspi.c b/src/mame/video/seibuspi.c index d37a9bd69ae..e5adb3ff816 100644 --- a/src/mame/video/seibuspi.c +++ b/src/mame/video/seibuspi.c @@ -24,7 +24,8 @@ static int text_layer_offset; static UINT32 bg_fore_layer_position; -static UINT8 alpha_table[6144]; +static UINT8 alpha_table[8192]; +static UINT8 sprite_bpp; READ32_HANDLER( spi_layer_bank_r ) { @@ -320,15 +321,16 @@ static void draw_blend_gfx(running_machine *machine, bitmap_t *bitmap, const rec for (j=y1; j <= y2; j++) { UINT32 *p = BITMAP_ADDR32(bitmap, j, 0); + UINT8 trans_pen = (1 << sprite_bpp) - 1; int dp_i = (py * width) + px; py += yd; for (i=x1; i <= x2; i++) { UINT8 pen = dp[dp_i]; - if (pen != 0x3f) + if (pen != trans_pen) { - int global_pen = pen + color*64; + int global_pen = pen + (color << sprite_bpp); UINT8 alpha = alpha_table[global_pen]; if (alpha) { @@ -482,6 +484,7 @@ VIDEO_START( spi ) int i; int region_length; + sprite_bpp = 6; text_layer = tilemap_create( machine, get_text_tile_info, tilemap_scan_rows, 8,8,64,32 ); back_layer = tilemap_create( machine, get_back_tile_info, tilemap_scan_cols, 16,16,32,32 ); mid_layer = tilemap_create( machine, get_mid_tile_info, tilemap_scan_cols, 16,16,32,32 ); @@ -652,3 +655,32 @@ VIDEO_UPDATE( spi ) combine_tilemap(screen->machine, bitmap, cliprect, text_layer, 0, 0, 0, NULL); return 0; } + +VIDEO_START( sys386f2 ) +{ + int i; + + palette_ram = auto_malloc(0x4000); + sprite_ram = auto_malloc(0x1000); + + sprite_bpp = 8; + + memset(palette_ram, 0, 0x4000); + memset(sprite_ram, 0, 0x1000); + + for (i=0; i < 8192; i++) { + palette_set_color(machine, i, MAKE_RGB(0, 0, 0)); + } + + memset(alpha_table, 0, 8192 * sizeof(UINT8)); +} + +VIDEO_UPDATE( sys386f2 ) +{ + bitmap_fill(bitmap, cliprect, 0); + draw_sprites(screen->machine, bitmap, cliprect, 0); + draw_sprites(screen->machine, bitmap, cliprect, 1); + draw_sprites(screen->machine, bitmap, cliprect, 2); + draw_sprites(screen->machine, bitmap, cliprect, 3); + return 0; +}