diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2011-10-10 06:33:16 +0000 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2011-10-10 06:33:16 +0000 |
commit | c09e033298c426d2b4b4549bf98f4f71d796627b (patch) | |
tree | 37ba53416241007a2c92bce235b725016e924bc4 | |
parent | 7583f527f71472707ab667ec681d573660c29d57 (diff) |
Latest patch from Haze (no whatsnew)
-rw-r--r-- | src/emu/cpu/sh4/sh3comn.c | 17 | ||||
-rw-r--r-- | src/emu/cpu/sh4/sh3comn.h | 1 | ||||
-rw-r--r-- | src/mame/drivers/cavesh3.c | 123 |
3 files changed, 121 insertions, 20 deletions
diff --git a/src/emu/cpu/sh4/sh3comn.c b/src/emu/cpu/sh4/sh3comn.c index 8e3372c4f8d..1116ad3d567 100644 --- a/src/emu/cpu/sh4/sh3comn.c +++ b/src/emu/cpu/sh4/sh3comn.c @@ -279,6 +279,23 @@ READ32_HANDLER( sh3_internal_r ) } break; + case PLDR_SCPDR: + { + if (mem_mask & 0xffff0000) + { + //logerror("'%s' (%08x): unmapped internal read from %08x mask %08x (PLDR)\n",sh4->device->tag(), sh4->pc & AM,(offset *4)+0x4000000,mem_mask); + return sh4->io->read_qword(SH3_PORT_L)<<24; + } + + if (mem_mask & 0x0000ffff) + { + logerror("'%s' (%08x): unmapped internal read from %08x mask %08x (SCPDR)\n",sh4->device->tag(), sh4->pc & AM,(offset *4)+0x4000000,mem_mask); + //return sh4->io->read_qword(SH3_PORT_K)<<8; + } + } + break; + + default: { logerror("'%s' (%08x): unmapped internal read from %08x mask %08x\n", diff --git a/src/emu/cpu/sh4/sh3comn.h b/src/emu/cpu/sh4/sh3comn.h index 85220ed95dd..e4613985a72 100644 --- a/src/emu/cpu/sh4/sh3comn.h +++ b/src/emu/cpu/sh4/sh3comn.h @@ -59,6 +59,7 @@ #define PEDR_PFDR ((0x4000128 - SH3_LOWER_REGBASE)/4) #define PGDR_PHDR ((0x400012c - SH3_LOWER_REGBASE)/4) #define PJDR_PKDR ((0x4000130 - SH3_LOWER_REGBASE)/4) +#define PLDR_SCPDR ((0x4000134 - SH3_LOWER_REGBASE)/4) /* SH3 upper area */ diff --git a/src/mame/drivers/cavesh3.c b/src/mame/drivers/cavesh3.c index 9513bc522f1..1111e4873dc 100644 --- a/src/mame/drivers/cavesh3.c +++ b/src/mame/drivers/cavesh3.c @@ -8,8 +8,11 @@ Eeprom NAND/Flash Writing and Saving! (DeathSmiles uses it for Unlock data) Improve Blending precision? Sound -Make mmmbnk boot -General SH3 cleanups +Why does mmmbnk write to 0 on startup, is it related to the broken GFX you see? +What is mmpork checking when it reports 'ERROR' +General SH3 cleanups, verify dividers and such +Speedups? (without breaking overall timing) +Missing GFX in Death Smiles? */ @@ -217,7 +220,7 @@ INLINE void draw_sprite( ) { - logerror("draw sprite %04x %04x - %04x %04x\n", dst_x, dst_y, dimx, dimy); + //logerror("draw sprite %04x %04x - %04x %04x\n", dst_x, dst_y, dimx, dimy); int x,y, xf,yf; clr_t s_clr, d_clr, clr0, clr1; @@ -474,7 +477,7 @@ static SCREEN_UPDATE( cavesh3 ) scroll_1_x = -cavesh_gfx_scroll_1_x; scroll_1_y = -cavesh_gfx_scroll_1_y; - logerror("SCREEN UPDATE\n"); + //logerror("SCREEN UPDATE\n"); copyscrollbitmap_trans(bitmap, cavesh_bitmaps[0], 1,&scroll_0_x, 1,&scroll_0_y, cliprect, 0x8000); @@ -495,6 +498,9 @@ static READ32_HANDLER( cavesh3_blitter_r ) case 0x28: return 0xffffffff; + case 0x50: + return input_port_read(space->machine(), "DSW"); + default: logerror("unknowncavesh3_blitter_r %08x %08x\n", offset*4, mem_mask); break; @@ -555,8 +561,8 @@ static WRITE64_HANDLER( ymz2770c_z_w ) UINT8 flash_page_data[FLASH_PAGE_SIZE]; -typedef enum { STATE_IDLE = 0, STATE_READ, STATE_READ_ID, STATE_READ_STATUS } flash_state_t; -static const char *flash_state_name[] = { "IDLE", "READ", "READ_ID", "READ_STATUS" }; +typedef enum { STATE_IDLE = 0, STATE_READ, STATE_READ_ID, STATE_READ_STATUS, STATE_BLOCK_ERASE, STATE_PAGE_PROGRAM } flash_state_t; +static const char *flash_state_name[] = { "IDLE", "READ", "READ_ID", "READ_STATUS", "BLOCK ERASE", "PAGE PROGRAM" }; static flash_state_t flash_state; @@ -629,10 +635,22 @@ static WRITE8_HANDLER( flash_cmd_w ) flash_addr_seq = 0; break; + case 0x60: // BLOCK ERASE + flash_addr_seq = 0; + break; + case 0x70: // READ STATUS flash_change_state( space->machine(), STATE_READ_STATUS ); break; + case 0x80: // PAGE / CACHE PROGRAM + flash_addr_seq = 0; + flash_page_addr = 0;// flash_col; + //flash_page_index = flash_row; + + + break; + case 0x90: // READ ID flash_change_state( space->machine(), STATE_READ_ID ); break; @@ -666,6 +684,36 @@ static WRITE8_HANDLER( flash_cmd_w ) } break; + case 0x60: // BLOCK ERASE + if (data==0xd0) + { + + flash_change_state( space->machine(), STATE_BLOCK_ERASE ); + //logerror("%08x FLASH: caching page = %04X\n", cpu_get_pc(&space->device()), flash_row); + } + else + { + logerror("unexpected 2nd command after BLOCK ERASE\n"); + } + break; + case 0x80: + if (data==0x10) + { + // UINT8 *region = space->machine().region( "game" )->base(); + flash_change_state( space->machine(), STATE_PAGE_PROGRAM ); + flash_page_addr = flash_col; + flash_page_index = flash_row; + // don't do this until it's verified as OK + //memcpy(region + flash_row * FLASH_PAGE_SIZE, flash_page_data, FLASH_PAGE_SIZE); + + } + else + { + logerror("unexpected 2nd command after SPAGE PROGRAM\n"); + } + break; + + default: { logerror("%08x FLASH: unknown cmd2 = %02X (cmd1 = %02X)\n", cpu_get_pc(&space->device()), data, flash_cmd_prev); @@ -674,6 +722,16 @@ static WRITE8_HANDLER( flash_cmd_w ) } } +static WRITE8_HANDLER( flash_data_w ) // death smiles +{ + if (!flash_enab) + return; + + logerror("flash data write %04x\n", flash_page_addr); + flash_page_data[flash_page_addr] = data; + flash_page_addr++; +} + static WRITE8_HANDLER( flash_addr_w ) { if (!flash_enab) @@ -798,11 +856,14 @@ static WRITE8_HANDLER( ibara_flash_io_w ) switch (offset) { default: - case 0x00: case 0x03: logerror("unknown ibara_flash_io_w offset %04x data %02x\n", offset, data); // 03 enable/disable fgpa access? break; + case 0x00: + flash_data_w(space, offset, data); + break; + case 0x01: flash_cmd_w(space, offset, data); break; @@ -821,7 +882,7 @@ static READ8_HANDLER( serial_rtc_eeprom_r ) switch (offset) { default: - logerror("unknown serial_rtc_eeprom_r access offset %02x\n", offset); + //logerror("unknown serial_rtc_eeprom_r access offset %02x\n", offset); return 0xff; } } @@ -849,14 +910,19 @@ static WRITE8_HANDLER( serial_rtc_eeprom_w ) static UINT64*cavesh3_ram; +static WRITE64_HANDLER( cavesh3_nop_write ) +{ + +} + static ADDRESS_MAP_START( cavesh3_map, AS_PROGRAM, 64 ) - AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("maincpu", 0) + AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE(cavesh3_nop_write) // mmmbnk writes here on startup for some reason.. AM_RANGE(0x00200000, 0x003fffff) AM_ROM AM_REGION("maincpu", 0) /* 0x04000000, 0x07ffffff SH3 Internal Regs (including ports) */ - AM_RANGE(0x0c000000, 0x0c7fffff) AM_RAM AM_BASE(&cavesh3_ram)// work RAM - AM_RANGE(0x0c800000, 0x0cffffff) AM_RAM // mirror of above on type B boards, extra ram on type D + AM_RANGE(0x0c000000, 0x0c7fffff) AM_RAM AM_BASE(&cavesh3_ram)// AM_SHARE("mainram")// work RAM + AM_RANGE(0x0c800000, 0x0cffffff) AM_RAM// AM_SHARE("mainram") // mirror of above on type B boards, extra ram on type D AM_RANGE(0x10000000, 0x10000007) AM_READWRITE8(ibara_flash_io_r, ibara_flash_io_w, U64(0xffffffffffffffff)) AM_RANGE(0x10400000, 0x10400007) AM_READWRITE(ymz2770c_z_r, ymz2770c_z_w) @@ -1211,6 +1277,23 @@ DRIVER_INIT( mushisama ) machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0xc0024d8, 0xc0024df, FUNC(mushisama_speedup_r) ); } +static READ64_HANDLER( espgal2_speedup_r ) +{ + int pc = cpu_get_pc(&space->device()); + + if ( pc == 0xc05177a ) device_spin_until_time(&space->device(), attotime::from_usec(10)); // espgal2 + if ( pc == 0xc05176a ) device_spin_until_time(&space->device(), attotime::from_usec(10)); // futari15 / futari15a / futari10 / futariblk / ibarablk / ibarablka / mmpork + if ( pc == 0xc0519a2 ) device_spin_until_time(&space->device(), attotime::from_usec(10)); // deathsml + //else printf("read %08x\n", cpu_get_pc(&space->device())); + return cavesh3_ram[0x002310/8]; +} + +DRIVER_INIT( espgal2 ) +{ + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0xc002310, 0xc002317, FUNC(espgal2_speedup_r) ); +} + + /* espgal2 c002310 @@ -1227,17 +1310,17 @@ mmpork c002310 GAME( 2004, mushisam, 0, cavesh3, cavesh3, mushisam, ROT270, "Cave", "Mushihime Sama (2004/10/12 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) GAME( 2004, mushisama, mushisam, cavesh3, cavesh3, mushisama, ROT270, "Cave", "Mushihime Sama (2004/10/12 MASTER VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2005, espgal2, 0, cavesh3, cavesh3, 0, ROT270, "Cave", "EspGaluda II (2005/11/14 MASTER VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2005, espgal2, 0, cavesh3, cavesh3, espgal2, ROT270, "Cave", "EspGaluda II (2005/11/14 MASTER VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) GAME( 2005, mushitam, 0, cavesh3, cavesh3, mushisam, ROT0, "Cave", "Mushihime Tama (2005/09/09 MASTER VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2006, futari15, 0, cavesh3, cavesh3, 0, ROT270, "Cave", "Mushihime Sama Futari Ver 1.5 (2006/12/8.MASTER VER. 1.54.)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2006, futari15a, futari15, cavesh3, cavesh3, 0, ROT270, "Cave", "Mushihime Sama Futari Ver 1.5 (2006/12/8 MASTER VER 1.54)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2006, futari10, futari15, cavesh3, cavesh3, 0, ROT270, "Cave", "Mushihime Sama Futari Ver 1.0 (2006/10/23 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2007, futariblk, futari15, cavesh3, cavesh3, 0, ROT270, "Cave", "Mushihime Sama Futari Black Label (2007/12/11 BLACK LABEL VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2006, futari15, 0, cavesh3, cavesh3, espgal2, ROT270, "Cave", "Mushihime Sama Futari Ver 1.5 (2006/12/8.MASTER VER. 1.54.)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2006, futari15a, futari15, cavesh3, cavesh3, espgal2, ROT270, "Cave", "Mushihime Sama Futari Ver 1.5 (2006/12/8 MASTER VER 1.54)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2006, futari10, futari15, cavesh3, cavesh3, espgal2, ROT270, "Cave", "Mushihime Sama Futari Ver 1.0 (2006/10/23 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2007, futariblk, futari15, cavesh3, cavesh3, espgal2, ROT270, "Cave", "Mushihime Sama Futari Black Label (2007/12/11 BLACK LABEL VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) GAME( 2006, ibara, 0, cavesh3, cavesh3, 0, ROT270, "Cave", "Ibara (2005/03/22 MASTER VER..)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2006, ibarablk, 0, cavesh3, cavesh3, 0, ROT270, "Cave", "Ibara Kuro - Black Label (2006/02/06. MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2006, ibarablka, ibarablk, cavesh3, cavesh3, 0, ROT270, "Cave", "Ibara Kuro - Black Label (2006/02/06 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2007, deathsml, 0, cavesh3, cavesh3, 0, ROT0, "Cave", "Death Smiles (2007/10/09 MASTER VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2007, mmpork, 0, cavesh3, cavesh3, 0, ROT270, "Cave", "Muchi Muchi Pork (2007/ 4/17 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2006, ibarablk, 0, cavesh3, cavesh3, espgal2, ROT270, "Cave", "Ibara Kuro - Black Label (2006/02/06. MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2006, ibarablka, ibarablk, cavesh3, cavesh3, espgal2, ROT270, "Cave", "Ibara Kuro - Black Label (2006/02/06 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2007, deathsml, 0, cavesh3, cavesh3, espgal2, ROT0, "Cave", "Death Smiles (2007/10/09 MASTER VER)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2007, mmpork, 0, cavesh3, cavesh3, espgal2, ROT270, "Cave", "Muchi Muchi Pork (2007/ 4/17 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) GAME( 2007, mmmbnk, 0, cavesh3, cavesh3, 0, ROT0, "Cave", "Medal Mahjong Moukari Bancho no Kiban (2007/06/05 MASTER VER.)", GAME_NOT_WORKING | GAME_NO_SOUND ) /* |