namcos23 updates: [R. Belmont]

- Documented clocks and syncs measured by Guru
- Added Gorgon JVS I/O board.  Final Furlong now gets farther
This commit is contained in:
R. Belmont 2010-02-21 16:46:38 +00:00
parent caf5e9c464
commit 19256de183

View File

@ -750,6 +750,12 @@ Notes:
#include "cpu/h83002/h8.h" #include "cpu/h83002/h8.h"
#include "sound/c352.h" #include "sound/c352.h"
#define S23_BUSCLOCK (66664460/2) // 33 MHz CPU bus clock / input, somehow derived from 14.31721 MHz crystal
#define S23_VSYNC1 (59.8824)
#define S23_VSYNC2 (59.915)
#define S23_HSYNC (16666150)
#define S23_MODECLOCK (130205)
static int ss23_vstat = 0, hstat = 0, vstate = 0; static int ss23_vstat = 0, hstat = 0, vstate = 0;
static tilemap_t *bgtilemap; static tilemap_t *bgtilemap;
static UINT32 *namcos23_textram, *namcos23_shared_ram; static UINT32 *namcos23_textram, *namcos23_shared_ram;
@ -1030,7 +1036,7 @@ static READ32_HANDLER(sysctl_stat_r)
// as with System 22, we need to halt the MCU while checking shared RAM // as with System 22, we need to halt the MCU while checking shared RAM
static WRITE32_HANDLER( s23_mcuen_w ) static WRITE32_HANDLER( s23_mcuen_w )
{ {
mame_printf_debug("mcuen_w: mask %08x, data %08x\n", mem_mask, data); logerror("mcuen_w: mask %08x, data %08x\n", mem_mask, data);
if (mem_mask == 0x0000ffff) if (mem_mask == 0x0000ffff)
{ {
if (data) if (data)
@ -1059,11 +1065,34 @@ static READ32_HANDLER( gorgon_magic_r )
return 0xffffffff; // must be non-zero (rapidrvr @ 8000229C) return 0xffffffff; // must be non-zero (rapidrvr @ 8000229C)
} }
/*
Final Furlong has a bug: it forgets to halt the H8/3002 before it zeros out the shared RAM
which contains the H8's stack and other working set. This crashes MAME due to the PC going
off into the weeds, so we intercept
*/
static READ32_HANDLER( gorgon_sharedram_r )
{
return namcos23_shared_ram[offset];
}
static WRITE32_HANDLER( gorgon_sharedram_w )
{
COMBINE_DATA(&namcos23_shared_ram[offset]);
// hack for final furlong
if ((offset == 0x8000/4) && (data == 0) && (mem_mask == 0xff000000))
{
logerror("S23: Final Furlong hack stopping H8/3002\n");
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_RESET, ASSERT_LINE);
}
}
static ADDRESS_MAP_START( gorgon_map, ADDRESS_SPACE_PROGRAM, 32 ) static ADDRESS_MAP_START( gorgon_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000000, 0x003fffff) AM_RAM AM_RANGE(0x00000000, 0x003fffff) AM_RAM
AM_RANGE(0x01000000, 0x010000ff) AM_READ( gorgon_magic_r ) AM_RANGE(0x01000000, 0x010000ff) AM_READ( gorgon_magic_r )
AM_RANGE(0x02000000, 0x02000003) AM_READ( gorgon_vbl_r ) AM_RANGE(0x02000000, 0x02000003) AM_READ( gorgon_vbl_r )
AM_RANGE(0x04400000, 0x0440ffff) AM_RAM AM_BASE(&namcos23_shared_ram) AM_RANGE(0x04400000, 0x0440ffff) AM_READWRITE( gorgon_sharedram_r, gorgon_sharedram_w ) AM_BASE(&namcos23_shared_ram)
AM_RANGE(0x04c3ff08, 0x04c3ff0b) AM_WRITE( s23_mcuen_w ) AM_RANGE(0x04c3ff08, 0x04c3ff0b) AM_WRITE( s23_mcuen_w )
AM_RANGE(0x04c3ff0c, 0x04c3ff0f) AM_RAM // 3d FIFO AM_RANGE(0x04c3ff0c, 0x04c3ff0f) AM_RAM // 3d FIFO
@ -1076,7 +1105,7 @@ static ADDRESS_MAP_START( gorgon_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x08000000, 0x087fffff) AM_ROM AM_REGION("data", 0) // data ROMs AM_RANGE(0x08000000, 0x087fffff) AM_ROM AM_REGION("data", 0) // data ROMs
AM_RANGE(0x0d000000, 0x0d000007) AM_READ(sysctl_stat_r) // write for LEDs AM_RANGE(0x0d000000, 0x0d000007) AM_READ(sysctl_stat_r) AM_WRITENOP // write for LEDs at d000000, watchdog at d000004
AM_RANGE(0x0fc00000, 0x0fffffff) AM_WRITENOP AM_ROM AM_REGION("user1", 0) AM_RANGE(0x0fc00000, 0x0fffffff) AM_WRITENOP AM_ROM AM_REGION("user1", 0)
AM_RANGE(0x1fc00000, 0x1fffffff) AM_WRITENOP AM_ROM AM_REGION("user1", 0) AM_RANGE(0x1fc00000, 0x1fffffff) AM_WRITENOP AM_ROM AM_REGION("user1", 0)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -1301,6 +1330,7 @@ static ADDRESS_MAP_START( s23h8iomap, ADDRESS_SPACE_IO, 8 )
AM_RANGE(H8_PORT_6, H8_PORT_6) AM_READWRITE( s23_mcu_p6_r, s23_mcu_p6_w ) AM_RANGE(H8_PORT_6, H8_PORT_6) AM_READWRITE( s23_mcu_p6_r, s23_mcu_p6_w )
AM_RANGE(H8_PORT_7, H8_PORT_7) AM_READ_PORT( "H8PORT" ) AM_RANGE(H8_PORT_7, H8_PORT_7) AM_READ_PORT( "H8PORT" )
AM_RANGE(H8_PORT_8, H8_PORT_8) AM_READ( s23_mcu_p8_r ) AM_WRITENOP AM_RANGE(H8_PORT_8, H8_PORT_8) AM_READ( s23_mcu_p8_r ) AM_WRITENOP
AM_RANGE(H8_PORT_9, H8_PORT_9) AM_NOP // read on Gorgon, purpose unknown
AM_RANGE(H8_PORT_A, H8_PORT_A) AM_READWRITE( s23_mcu_pa_r, s23_mcu_pa_w ) AM_RANGE(H8_PORT_A, H8_PORT_A) AM_READWRITE( s23_mcu_pa_r, s23_mcu_pa_w )
AM_RANGE(H8_PORT_B, H8_PORT_B) AM_READWRITE( s23_mcu_portB_r, s23_mcu_portB_w ) AM_RANGE(H8_PORT_B, H8_PORT_B) AM_READWRITE( s23_mcu_portB_r, s23_mcu_portB_w )
AM_RANGE(H8_SERIAL_0, H8_SERIAL_0) AM_READWRITE( s23_mcu_iob_r, s23_mcu_iob_w ) AM_RANGE(H8_SERIAL_0, H8_SERIAL_0) AM_READWRITE( s23_mcu_iob_r, s23_mcu_iob_w )
@ -1364,10 +1394,10 @@ static WRITE8_HANDLER( s23_iob_p4_w )
/* H8/3334 (Namco C78) I/O board MCU */ /* H8/3334 (Namco C78) I/O board MCU */
static ADDRESS_MAP_START( s23iobrdmap, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( s23iobrdmap, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0fff) AM_ROM AM_RANGE(0x0000, 0x1fff) AM_ROM AM_REGION("ioboard", 0)
AM_RANGE(0x6000, 0x6003) AM_RAM // inputs? AM_RANGE(0x6000, 0x6003) AM_RAM // inputs?
AM_RANGE(0x7000, 0x700f) AM_RAM // probably actually the digital inputs, but ignore for now AM_RANGE(0x7000, 0x700f) AM_RAM // probably actually the digital inputs, but ignore for now
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_RANGE(0xc000, 0xf7ff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
/* /*
@ -1396,6 +1426,8 @@ static DRIVER_INIT(ss23)
if ((!strcmp(machine->gamedrv->name, "motoxgo")) || if ((!strcmp(machine->gamedrv->name, "motoxgo")) ||
(!strcmp(machine->gamedrv->name, "panicprk")) || (!strcmp(machine->gamedrv->name, "panicprk")) ||
(!strcmp(machine->gamedrv->name, "rapidrvr")) ||
(!strcmp(machine->gamedrv->name, "finlflng")) ||
(!strcmp(machine->gamedrv->name, "timecrs2"))) (!strcmp(machine->gamedrv->name, "timecrs2")))
{ {
has_jvsio = 1; has_jvsio = 1;
@ -1454,23 +1486,27 @@ static const mips3_config config =
static MACHINE_DRIVER_START( gorgon ) static MACHINE_DRIVER_START( gorgon )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", R4650BE, 133000000) MDRV_CPU_ADD("maincpu", R4650BE, S23_BUSCLOCK*4)
MDRV_CPU_CONFIG(config) MDRV_CPU_CONFIG(config)
MDRV_CPU_PROGRAM_MAP(gorgon_map) MDRV_CPU_PROGRAM_MAP(gorgon_map)
MDRV_CPU_ADD("audiocpu", H83002, 14745600 ) MDRV_CPU_ADD("audiocpu", H83002, 14745600 )
MDRV_CPU_PROGRAM_MAP( s23h8rwmap ) MDRV_CPU_PROGRAM_MAP( s23h8rwmap )
MDRV_CPU_IO_MAP( s23h8ionoiobmap) MDRV_CPU_IO_MAP( s23h8iomap )
MDRV_CPU_VBLANK_INT("screen", irq1_line_pulse) MDRV_CPU_VBLANK_INT("screen", irq1_line_pulse)
MDRV_CPU_ADD("ioboard", H83334, 14745600 )
MDRV_CPU_PROGRAM_MAP( s23iobrdmap )
MDRV_CPU_IO_MAP( s23iobrdiomap )
MDRV_QUANTUM_TIME(HZ(60000)) MDRV_QUANTUM_TIME(HZ(60000))
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(S23_VSYNC1)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(64*16, 30*16) MDRV_SCREEN_SIZE(48*16, 30*16)
MDRV_SCREEN_VISIBLE_AREA(0, 64*16-1, 0, 30*16-1) MDRV_SCREEN_VISIBLE_AREA(0, 48*16-1, 0, 30*16-1)
MDRV_PALETTE_LENGTH(0x8000) MDRV_PALETTE_LENGTH(0x8000)
@ -1492,7 +1528,7 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( s23 ) static MACHINE_DRIVER_START( s23 )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", R4650BE, 166000000) MDRV_CPU_ADD("maincpu", R4650BE, S23_BUSCLOCK*4)
MDRV_CPU_CONFIG(config) MDRV_CPU_CONFIG(config)
MDRV_CPU_PROGRAM_MAP(ss23_map) MDRV_CPU_PROGRAM_MAP(ss23_map)
MDRV_CPU_VBLANK_INT("screen", s23_interrupt) MDRV_CPU_VBLANK_INT("screen", s23_interrupt)
@ -1509,11 +1545,11 @@ static MACHINE_DRIVER_START( s23 )
MDRV_QUANTUM_TIME(HZ(60*18000)) // higher than 60*20000 causes timecrs2 crash after power-on test $1e MDRV_QUANTUM_TIME(HZ(60*18000)) // higher than 60*20000 causes timecrs2 crash after power-on test $1e
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(S23_VSYNC1)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(64*16, 30*16) MDRV_SCREEN_SIZE(48*16, 30*16)
MDRV_SCREEN_VISIBLE_AREA(0, 64*16-1, 0, 30*16-1) MDRV_SCREEN_VISIBLE_AREA(0, 48*16-1, 0, 30*16-1)
MDRV_PALETTE_LENGTH(0x8000) MDRV_PALETTE_LENGTH(0x8000)
@ -1535,7 +1571,7 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( ss23 ) static MACHINE_DRIVER_START( ss23 )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", R4650BE, 166000000) MDRV_CPU_ADD("maincpu", R4650BE, S23_BUSCLOCK*5)
MDRV_CPU_CONFIG(config) MDRV_CPU_CONFIG(config)
MDRV_CPU_PROGRAM_MAP(ss23_map) MDRV_CPU_PROGRAM_MAP(ss23_map)
MDRV_CPU_VBLANK_INT("screen", s23_interrupt) MDRV_CPU_VBLANK_INT("screen", s23_interrupt)
@ -1548,7 +1584,7 @@ static MACHINE_DRIVER_START( ss23 )
MDRV_QUANTUM_TIME(HZ(60*40000)) MDRV_QUANTUM_TIME(HZ(60*40000))
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(S23_VSYNC1)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(48*16, 30*16) MDRV_SCREEN_SIZE(48*16, 30*16)
@ -1579,6 +1615,9 @@ ROM_START( rapidrvr )
ROM_REGION( 0x80000, "audiocpu", 0 ) /* Hitachi H8/3002 MCU code */ ROM_REGION( 0x80000, "audiocpu", 0 ) /* Hitachi H8/3002 MCU code */
ROM_LOAD16_WORD_SWAP( "rd3verc.ic3", 0x000000, 0x080000, CRC(6e26fbaf) SHA1(4ab6637d22f0d26f7e1d10e9c80059c56f64303d) ) ROM_LOAD16_WORD_SWAP( "rd3verc.ic3", 0x000000, 0x080000, CRC(6e26fbaf) SHA1(4ab6637d22f0d26f7e1d10e9c80059c56f64303d) )
ROM_REGION( 0x40000, "ioboard", 0 ) /* I/O board HD643334 H8/3334 MCU code */
ROM_LOAD( "asca1_io-a.ic2", 0x000000, 0x040000, CRC(77cdf69a) SHA1(497af1059f85c07bea2dd0d303481623f6019dcf) )
ROM_REGION32_BE( 0x800000, "data", 0 ) /* data */ ROM_REGION32_BE( 0x800000, "data", 0 ) /* data */
ROM_LOAD16_BYTE( "rd1mtal.1j", 0x000001, 0x400000, CRC(8f0efa86) SHA1(9953461c258f2a96be275a7b18d6518ddfac3860) ) ROM_LOAD16_BYTE( "rd1mtal.1j", 0x000001, 0x400000, CRC(8f0efa86) SHA1(9953461c258f2a96be275a7b18d6518ddfac3860) )
ROM_LOAD16_BYTE( "rd1mtah.3j", 0x000000, 0x400000, CRC(d8fa0f3d) SHA1(0d5bdb3a2e7be1dffe11b74baa2c10bfe011ae92) ) ROM_LOAD16_BYTE( "rd1mtah.3j", 0x000000, 0x400000, CRC(d8fa0f3d) SHA1(0d5bdb3a2e7be1dffe11b74baa2c10bfe011ae92) )
@ -1638,6 +1677,9 @@ ROM_START( finlflng )
ROM_REGION( 0x80000, "audiocpu", 0 ) /* Hitachi H8/3002 MCU code */ ROM_REGION( 0x80000, "audiocpu", 0 ) /* Hitachi H8/3002 MCU code */
ROM_LOAD16_WORD_SWAP( "ff2vera.ic3", 0x000000, 0x080000, CRC(ab681078) SHA1(ec8367404458a54893ab6bea29c8a2ba3272b816) ) ROM_LOAD16_WORD_SWAP( "ff2vera.ic3", 0x000000, 0x080000, CRC(ab681078) SHA1(ec8367404458a54893ab6bea29c8a2ba3272b816) )
ROM_REGION( 0x40000, "ioboard", 0 ) /* I/O board HD643334 H8/3334 MCU code */
ROM_LOAD( "asca1_io-a.ic2", 0x000000, 0x040000, CRC(77cdf69a) SHA1(497af1059f85c07bea2dd0d303481623f6019dcf) )
ROM_REGION32_BE( 0x800000, "data", 0 ) /* data */ ROM_REGION32_BE( 0x800000, "data", 0 ) /* data */
ROM_LOAD16_BYTE( "ff2mtal.1j", 0x000001, 0x400000, CRC(ed1a5bf2) SHA1(bd05388a125a0201a41af95fb2aa5fe1c8b0f270) ) ROM_LOAD16_BYTE( "ff2mtal.1j", 0x000001, 0x400000, CRC(ed1a5bf2) SHA1(bd05388a125a0201a41af95fb2aa5fe1c8b0f270) )
ROM_LOAD16_BYTE( "ff2mtah.3j", 0x000000, 0x400000, CRC(161003cd) SHA1(04409333a4776b17700fc6d1aa06a39560132e03) ) ROM_LOAD16_BYTE( "ff2mtah.3j", 0x000000, 0x400000, CRC(161003cd) SHA1(04409333a4776b17700fc6d1aa06a39560132e03) )