diff options
Diffstat (limited to 'src/mame/drivers/wgp.c')
-rw-r--r-- | src/mame/drivers/wgp.c | 1302 |
1 files changed, 1302 insertions, 0 deletions
diff --git a/src/mame/drivers/wgp.c b/src/mame/drivers/wgp.c new file mode 100644 index 00000000000..cb96098dac2 --- /dev/null +++ b/src/mame/drivers/wgp.c @@ -0,0 +1,1302 @@ +/*************************************************************************** + +World Grand Prix (c) Taito Corporation 1989 +================ + +David Graves + +(Thanks to Richard Bush and the Raine team for their +preliminary driver.) + +It seems likely there are a LOT of undumped versions of this game... +If you have access to a board, please check the rom numbers to see if +any are different from the ones listed below. + + ***** + +World Grand Prix runs on hardware which is pretty different from the +system Taito commonly used for their pseudo-3d racing games of the +time, the Z system. Different screen and sprite hardware is used. +There's also a LAN hookup (for multiple machines). + +As well as a TC0100SCN tilemap generator (two 64x64 layers of 8x8 +tiles and a layer of 8x8 tiles with graphics data taken from RAM) +there's a "piv" tilemap generator, which creates three scrollable +row-scrollable zoomable 64x64 tilemaps composed of 16x16 tiles. + +As well as these six tilemap layers, there is a sprite layer with +individually zoomable / rotatable sprites. Big sprites are created +from 16x16 gfx chunks via a sprite mapping area in RAM. + +The piv and sprite layers are rotatable (but not individually, only +together). + +World Grand Prix has twin 68K CPUs which communicate via $4000 bytes +of shared ram. + +There is a Z80 as well, which takes over sound duties. Commands are +written to it by the one of the 68000s (the same as Taito F2 games). + +Dumper's info (Raine) +------------- + + TC0100SCN - known + TC0140SYT - known + TC0170ABT - ? + TC0220IOC - known + TC0240PBJ - motion objects ?? + TC0250SCR - piv tilemaps ?? [TC0280GRD was a rotatable tilemap chip in DonDokoD, also 1989] + TC0260DAR - color related, paired with TC0360PRI in many F2 games + TC0330CHL - ? (perhaps lan related) +This game has LAN interface board, it uses uPD72105C. + +Video Map +--------- + +400000 area is used for sprites. The game does tile mapping + in ram to create big sprites from the 16x16 tiles of gfx0. + See notes in \video\ for details. + +500000 area is for the "piv" tilemaps. + See notes in \video\ for details. + + +TODO +==== + +Offer fake-dip selectable analogue steer + +Is piv/sprite layers rotation control at 0x600000 ? + +Verify y-zoom is correct on the stages that use it (including Wgp2 +default course). Row zoom may be hard to verify, but Wgp2 course +selection screen is probably a good test. + +Implement proper positioning/zoom/rotation for sprites. + +(The current sprite coord calculations are kludgy and flawed and +ignore four control words. The sprites also seem jerky +and have [int?] timing glitches.) + +DIP coinage + + +Wgp +--- + +Analogue brake pedal works but won't register in service mode. + +$28336 is code that shows brake value in service mode. +$ac3e sub (called off int4) at $ac78 does three calcs to the six + AD values: results are stored at ($d22 / $d24 / $d26,A5) + It is the third one, ($d26,A5) which gets displayed + in service mode as brake. + + +Wgp2 +---- + +Piv y zoom may be imperfect. Check the up/down hill part of the +default course. The road looks a little odd. + +Sprite colors seem ok except smoke after you crash. (And one sign on +first bend of default course doesn't go yellow for a few frames.) + +[Used to die with common ram error. When CPUA enables CPUB, CPUB +writes to $140000/2 - unfortunately while CPUA is in the middle of +testing that ram. We hack prog for CPUB to disable the writes.] + + + ***** + +[Wgp stopped with LAN error. (Looks like CPUB tells CPUA what is wrong +with LAN in shared ram $142048. Examined at $e57c which prints out +relevant lan error message). Ended up at $e57c from $b14e-xx code +section. CPUA does PEA of $e57c which is the fallback if CPUB doesn't +respond in timely fashion to command 0x1 poked by code at $b1a6. + +CPUB $830c-8332 loops waiting for command 1-8 in $140002 from CPUA. +it executes this then clears $140002 to indicate command completed. +It wasn't clearing this fast enough for CPUA, because $142048 wasn't +clear:- and that affects the amount of code command 0x1 runs. + +CPUB code at $104d8 had already detected error on LAN and set $142048 +to 4. We now return correct lan status read from $380000, so +no LAN problem is detected.] + + +Code Documentation +------------------ + +CPUA +---- + +$1064e main game loop starting with a trap#$5 + +Calls $37e78 sub off which spriteram eventually gets updated + +Strangely main loop does not seem to be synced to any interrupt. +This may be why the sprites are so glitchy and don't seem to +update every frame. Maybe trap#$5 should be getting us to a known +point in the frame ?? + +$21f4 copies sprite tilemapping data from data rom to tilemap +area then flows into: + +$223c code that fills a sprite entry in spriteram + +[$12770 - $133cd seems to be an irregular lookup table used to +calculate extra zoom word poked into each sprite entry.] + +$23a8 picks data out of data rom and stores it to sprite tile- +mapping area by heading through to $21f4. (May also enter sprite +details into spriteram.) It uses $a0000 area of data rom. + +(Alternate entry point at $23c2 uses $90000 area of data rom.) + +$25ee routine stores data from rom into sprite tilemapping area +including the bad parts that produce junk sprites. + +It calls interesting sub at $25be which has a table of the number +of sequential words to be pulled out of the data rom, depending +on the first word value in the data rom for that entry ("code"). +Each code will pull out the following multiple of 16 words: + + Code Words Tiles Actual data rom entry + 0 1 4x4 [same] + 1 2 8x4 [same] + 2 4 8x8 [same] + 3 3 12x4 [same, see $98186] + 4 6 12x8 + 5 9 12x12 [same] + 6 2 4x8 [WRONG! says 8x12 in data rom, see $982bf] + 7 6 8x12 [WRONG! says 4x8 in data rom] + 8 1 (2x2)*4 [2x2 in data rom] (copies 12 unwanted + words - causing junk sprites) + +$4083c0-47f in sprite mapping area has junk words - due to code 7 +making it read 6*16 words. 0x60 words are copied from the data rom +when 0x20 would be correct. Careless programming: in the lookup +table Taito got codes 6 and 7 back to front. Enable the patch in +init_wgp to correct this... I can't see what changes. + +I'm guessing sprites may be variable size, and the junk sprites +mapped +0x9b80-9d80 are 2x2 tiles rather than 4x4. + +If we only use the first 4 tilemapping words, then the junk sprites +look fine. But their spacing is bad: they have gaps left between +them. They'll need to be magnified to 2x size - the pixel zoom +value must do this automatically. + +This ties in with the lookup table we need to draw the sprites: +it makes sense if our standard 4x4 tile sprite is actually 4 2x2 +sprites. + +But what tells the sprite hardware if a sprite is 2x2 or 4x4 ?? + + +Data rom entry +-------------- + ++0x00 Control word + (determines how many words copied to tilemapping area) + ++0x01 Sprite X size [tiles] + (2,4,8 or 12) + ++0x02 Sprite Y size [tiles] + (2,4,8 or 12) + ++0x03 sprite tile words, total (X size * Y size) + on... + +The X size and Y size values don't seem to be used by the game, and +may be a hangover from the gfx development system used. + + +Data Rom +-------- + +$80000-$8ffff piv tilemaps, preceded by lookup table +$90000-$9ffff sprite tilemap data, preceded by lookup table +$a0000-$affff sprite tilemap data, preceded by lookup table +$b0000-$cffff TC0100SCN tilemaps, preceded by lookup table + + Note that only just over half this space is used, rest is + 0xff fill. + +$d0000-$dffff is the pivot port data table + + Four separate start points are available, contained in the + first 4 long words. + + (Data words up to $da410 then 0xff fill) + +$e0000-$e7ffe is a logarithmic curve table + + This is used to look up perceived height of an object at + "distance" (offset/2). + + ffff 8000 5555 4000 3333 2aaa etc. + (tapering to value of 4 towards the end) + + The sprite routine shifts this one bit right and subtracts one + before poking into spriteram. Hence 4 => 1 + +$e7fff-$e83fe is an unknown word table +$e83ff-$effff empty (0xff fill) +$f0000-$f03ff unknown lookup table +$f0400-$fcbff series of unknown lookup tables + + Seems to be a series of (zoom/rotate ??) lookup + tables all $400 words long. (Total no. of tables = 25?) + + Each table starts at zero and tends upwards: the first reaches 0xfe7. + The final one reaches 0x3ff (i.e. each successive word is 1 higher + than the last). The values in the tables tend to go up smoothly but + with discontinuities at regular intervals. The intervals change + between tables. + +$fcc00-$fffff empty (0xff fill) + + +Additional notes : + +1) 'wgp' and 'wgpj' + +LAN stuff : + +LAN RAM seems to be 0x4000 bytes wide (0x380000-0x383fff in CPUB) + +Lan tests start at 0x00f86a (CPUB) where a copy of the 256 bytes from +0x00f8d4 is made to 0x383f00. This is text about the version of the LAN +stuff ("1990 VER 1.06") . Note that at least version 1.05 is required. + +Dip Switches : + +To see the effect of the "Communication" Dip Switch you must add the memory +read/write handlers for 0x380000 to 0x383fff instead of using the 'lan_status_r' +one. Of course, there will be an error message, but this might help in +finding the useful addresses in the LAN RAM. + +Note that the first time you run the game with the new handlers (I've put +standard RAM, let me know if you have a better idea), you'll need to reset +the game ! Is it because the tests in CPUB are too late ? + +In the "test mode", if "Communication" Dip Switch is ON, you'll see "NG" +("Not Good") under each machine ID (this is logical). + +Be aware that the "Machine ID" Dip Switch must be set to 1, or the tests are +NOT performed (I can't explain why for the moment) ! + +2) 'wgpjoy*' + +LAN stuff : + +It is very surprising, but you also find the text about the LAN stuff in +the ROMS (still version 1.06), but you can't perform lan tests in the +"test mode". + +As the LAN version is the same, I'll have to look at the code to see where +the differences are. + +3) 'wgp2' + +LAN stuff : + +I haven't tested the LAN stuff for the moment. + + +Stephh's notes (based on the game M68000 code and some tests) : + +1) 'wgp' and 'wgpj' + + - Region stored at 0x03fffe.w and sub-region stored at 0x03fffc.w + - Sets : + * 'wgp' : region = 0x0001 - sub-region = 0x0002 + * 'wgpj' : region = 0x0000 - sub-region = 0x0000 + - Coinage relies on the region (code at 0x00dd10) : + * 0x0000 (Japan) use TAITO_COINAGE_JAPAN_NEW + * 0x0001 (US) use TAITO_COINAGE_US + * 0x0002 (World), 0x0003 (US, licenced to ROMSTAR) and 0x0004 (licenced to PHOENIX ELECTRONICS CO.) + use slighlty different TAITO_COINAGE_WORLD : 1C_7C instead of 1C_6C for Coin B + - GP order relies on the sub-region (code at 0x00bc9c) : + * 0x0000 : 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 + * 0x0001 : 0x01 0x00 0x02 0x03 0x04 0x05 0x06 0x07 + * 0x0002 : 0x02 0x00 0x01 0x02 0x04 0x05 0x06 0x07 + * 0x0003 : 0x03 0x00 0x01 0x03 0x04 0x05 0x06 0x07 + * 0x0004 : 0x04 0x00 0x01 0x02 0x03 0x05 0x06 0x07 + * 0x0005 : 0x05 0x00 0x01 0x02 0x03 0x04 0x06 0x07 + * 0x0006 : 0x06 0x00 0x01 0x02 0x03 0x04 0x05 0x07 + * 0x0007 : 0x07 0x00 0x01 0x02 0x03 0x04 0x05 0x06 + GP country : + * 0x00 : Japan + * 0x01 : Australia + * 0x02 : USA + * 0x03 : Germany + * 0x04 : Netherlands + * 0x05 : Belgium + * 0x06 : France + * 0x07 : England + - Notice screen only if region = 0x0000 or region = 0x0001 + - FBI logo only if region = 0x0001 + - DSWA bit 0 does the following things when set to ON : + * "MACHINE TEST" message and additional tests on startup (code at 0x00b06e) + * alternate "SHIFT PATTERN SELECT" screen (code at 0x00ccdc) + * accel / brake "buttons" have different behaviour (code at 0x029ca0) : + . same as default when selecting "NORMAL" (4 gears, street machines) + . swapped "buttons" when selecting "RACING" (6 gears, racing machines) + * additional value sent to shared memory every frame (code at 0x00afd2) + * additional "MOTOR TEST" in the "test mode" + + +2) 'wgpjoy*' + + - Region stored at 0x03fffe.w and sub-region stored at 0x03fffc.w + - Sets : + * 'wgpjoy' : region = 0x0000 - sub-region = 0x0000 + * 'wgpjoya' : region = 0x0000 - sub-region = 0x0000 + - DSWA bit 0 does the following things when set to ON : + * "MACHINE TEST" message and additional tests on startup (code at 0x00b094) + * alternate "SHIFT PATTERN SELECT" screen (code at 0x00cd02) + * accel / brake "buttons" have different behaviour (code at 0x0298c6) : + . same as default when selecting "NORMAL" (4 gears, street machines) + . swapped "buttons" when selecting "RACING" (6 gears, racing machines) + * additional value sent to shared memory every frame (code at 0x00aff8) + - DSWB bits 4 to 7 ("Communication" and "Machine ID") have no effect + due to "ori.w #$f0ff, D0" instruction at 0x003300 ! + - "Test mode" is completely different + - Same other notes as for 'wgp' (different addresses though) + + +3) 'wgp2' + + - Region stored at 0x03fffe.w and sub-region stored at 0x03fffc.w + - Sets : + * 'wgp2' : region = 0x0000 - sub-region = 0x0000 + - Coinage relies on the region (code at 0x00166e) : + * 0x0000 (Japan) use TAITO_COINAGE_JAPAN_NEW + * 0x0001 (US) use TAITO_COINAGE_US + * 0x0002 (World) use slighlty different TAITO_COINAGE_WORLD : + 1C_7C instead of 1C_6C for Coin B, same settings otherwise + - Notice screen only if region = 0x0000 or region = 0x0001 + - FBI logo only if region = 0x0001 + - Routine at 0x01116c is the same as the one in 'wgp' based on sub-region; + however, as you can partically select your GP at start, and as I suck + at such driving game, I wonder if this routine is still called ! + - DSWA bit 0 does the following things when set to ON : + * unknown effect (code at 0x0126f6) + * accel / brake "buttons" have different behaviour (code at 0x0142d2) : + . same as default when selecting "NORMAL" (4 gears, street machines) + . swapped "buttons" when selecting "RACING" (6 gears, racing machines) + - Always "MOTOR TEST" in the "test mode" + +***************************************************************************/ + +#include "driver.h" +#include "taitoipt.h" +#include "cpu/m68000/m68000.h" +#include "video/taitoic.h" +#include "audio/taitosnd.h" +#include "sound/2610intf.h" + +VIDEO_START( wgp ); +VIDEO_START( wgp2 ); +VIDEO_UPDATE( wgp ); + +extern UINT16 *wgp_spritemap; +extern size_t wgp_spritemap_size; + +extern UINT16 *wgp_pivram; +READ16_HANDLER ( wgp_pivram_word_r ); +WRITE16_HANDLER( wgp_pivram_word_w ); + +extern UINT16 *wgp_piv_ctrlram; +READ16_HANDLER ( wgp_piv_ctrl_word_r ); +WRITE16_HANDLER( wgp_piv_ctrl_word_w ); + +static UINT16 cpua_ctrl = 0xff; +static UINT16 port_sel=0; +extern UINT16 wgp_rotate_ctrl[8]; + +static UINT16 *sharedram; +static size_t sharedram_size; + +static READ16_HANDLER( sharedram_r ) +{ + return sharedram[offset]; +} + +static WRITE16_HANDLER( sharedram_w ) +{ + COMBINE_DATA(&sharedram[offset]); +} + +static void parse_control(void) +{ + /* bit 0 enables cpu B */ + /* however this fails when recovering from a save state + if cpu B is disabled !! */ + cpunum_set_input_line(2, INPUT_LINE_RESET, (cpua_ctrl &0x1) ? CLEAR_LINE : ASSERT_LINE); + + /* bit 1 is "vibration" acc. to test mode */ +} + +static WRITE16_HANDLER( cpua_ctrl_w ) /* assumes Z80 sandwiched between 68Ks */ +{ + if ((data &0xff00) && ((data &0xff) == 0)) + data = data >> 8; /* for Wgp */ + cpua_ctrl = data; + + parse_control(); + + logerror("CPU #0 PC %06x: write %04x to cpu control\n",activecpu_get_pc(),data); +} + + +/*********************************************************** + INTERRUPTS +***********************************************************/ + +/* 68000 A */ + +/* +static TIMER_CALLBACK( wgp_interrupt4 ) +{ + cpunum_set_input_line(0,4,HOLD_LINE); +} +*/ + +static TIMER_CALLBACK( wgp_interrupt6 ) +{ + cpunum_set_input_line(0,6,HOLD_LINE); +} + +/* 68000 B */ + +static TIMER_CALLBACK( wgp_cpub_interrupt6 ) +{ + cpunum_set_input_line(2,6,HOLD_LINE); /* assumes Z80 sandwiched between the 68Ks */ +} + + + +/***** Routines for particular games *****/ + +/* FWIW offset of 10000,10500 on ints can get CPUB obeying the + first CPUA command the same frame; probably not necessary */ + +static INTERRUPT_GEN( wgp_cpub_interrupt ) +{ + timer_set(ATTOTIME_IN_CYCLES(200000-500,0),0, wgp_cpub_interrupt6); + cpunum_set_input_line(2, 4, HOLD_LINE); +} + + +/********************************************************** + GAME INPUTS +**********************************************************/ + +static READ16_HANDLER( lan_status_r ) +{ + logerror("CPU #2 PC %06x: warning - read lan status\n",activecpu_get_pc()); + + return (0x4 << 8); /* CPUB expects this in code at $104d0 (Wgp) */ +} + +static WRITE16_HANDLER( rotate_port_w ) +{ + /* This port may be for piv/sprite layer rotation. + + Wgp2 pokes a single set of values (see 2 routines from + $4e4a), so if this is rotation then Wgp2 *doesn't* use + it. + + Wgp pokes a wide variety of values here, which appear + to move up and down as rotation control words might. + See $ae06-d8 which pokes piv ctrl words, then pokes + values to this port. + + There is a lookup area in the data rom from $d0000-$da400 + which contains sets of 4 words (used for ports 0-3). + NB: port 6 is not written. + */ + + switch (offset) + { + case 0x00: + { +//logerror("CPU #0 PC %06x: warning - port %04x write %04x\n",activecpu_get_pc(),port_sel,data); + + wgp_rotate_ctrl[port_sel] = data; + return; + } + + case 0x01: + { + port_sel = data &0x7; + } + } +} + + +#define STEER_PORT_TAG "STEER" +#define UNKNOWN_PORT_TAG "UNKNOWN" +#define FAKE_PORT_TAG "FAKE" + +static READ16_HANDLER( wgp_adinput_r ) +{ + int steer = 0x40; + int fake = readinputportbytag_safe(FAKE_PORT_TAG,0x00); + + if (!(fake & 0x10)) /* Analogue steer (the real control method) */ + { + /* Reduce span to 0x80 */ + steer = (readinputportbytag_safe(STEER_PORT_TAG,0x00) * 0x80) / 0x100; + } + else /* Digital steer */ + { + if (fake & 0x08) /* pressing down */ + steer = 0x20; + + if (fake & 0x04) /* pressing up */ + steer = 0x60; + + if (fake & 0x02) /* pressing right */ + steer = 0x00; + + if (fake & 0x01) /* pressing left */ + steer = 0x80; + } + + switch (offset) + { + case 0x00: + { + if (fake & 0x40) /* pressing accel */ + return 0xff; + else + return 0x00; + } + + case 0x01: + return steer; + + case 0x02: + return 0xc0; /* steer offset, correct acc. to service mode */ + + case 0x03: + return 0xbf; /* accel offset, correct acc. to service mode */ + + case 0x04: + { + if (fake & 0x80) /* pressing brake */ + return 0xcf; + else + return 0xff; + } + + case 0x05: + return readinputportbytag_safe(UNKNOWN_PORT_TAG,0x00); /* unknown */ + } + +logerror("CPU #0 PC %06x: warning - read unmapped a/d input offset %06x\n",activecpu_get_pc(),offset); + + return 0xff; +} + +static WRITE16_HANDLER( wgp_adinput_w ) +{ + /* Each write invites a new interrupt as soon as the + hardware has got the next a/d conversion ready. We set a token + delay of 10000 cycles although our inputs are always ready. */ + + timer_set(ATTOTIME_IN_CYCLES(10000,0),0, wgp_interrupt6); +} + + +/********************************************************** + SOUND +**********************************************************/ + +static INT32 banknum = -1; + +static void reset_sound_region(void) /* assumes Z80 sandwiched between the 68Ks */ +{ + memory_set_bankptr( 10, memory_region(REGION_CPU2) + (banknum * 0x4000) + 0x10000 ); +} + +static WRITE8_HANDLER( sound_bankswitch_w ) +{ + banknum = (data - 1) & 7; + reset_sound_region(); +} + +static WRITE16_HANDLER( wgp_sound_w ) +{ + if (offset == 0) + taitosound_port_w (0, data & 0xff); + else if (offset == 1) + taitosound_comm_w (0, data & 0xff); +} + +static READ16_HANDLER( wgp_sound_r ) +{ + if (offset == 1) + return ((taitosound_comm_r (0) & 0xff)); + else return 0; +} + + +/***************************************************************** + MEMORY STRUCTURES +*****************************************************************/ + +static ADDRESS_MAP_START( wgp_readmem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x0fffff) AM_READ(MRA16_ROM) + AM_RANGE(0x100000, 0x10ffff) AM_READ(MRA16_RAM) /* main CPUA ram */ + AM_RANGE(0x140000, 0x143fff) AM_READ(MRA16_RAM) + AM_RANGE(0x180000, 0x18000f) AM_READ(TC0220IOC_halfword_byteswap_r) + AM_RANGE(0x200000, 0x20000f) AM_READ(wgp_adinput_r) + AM_RANGE(0x300000, 0x30ffff) AM_READ(TC0100SCN_word_0_r) /* tilemaps */ + AM_RANGE(0x320000, 0x32000f) AM_READ(TC0100SCN_ctrl_word_0_r) + AM_RANGE(0x400000, 0x40bfff) AM_READ(MRA16_RAM) /* sprite tilemaps */ + AM_RANGE(0x40c000, 0x40dfff) AM_READ(MRA16_RAM) /* sprite ram */ + AM_RANGE(0x500000, 0x501fff) AM_READ(MRA16_RAM) /* unknown/unused */ + AM_RANGE(0x502000, 0x517fff) AM_READ(wgp_pivram_word_r) /* piv tilemaps */ + AM_RANGE(0x520000, 0x52001f) AM_READ(wgp_piv_ctrl_word_r) + AM_RANGE(0x700000, 0x701fff) AM_READ(paletteram16_word_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( wgp_writemem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x0fffff) AM_WRITE(MWA16_ROM) + AM_RANGE(0x100000, 0x10ffff) AM_WRITE(MWA16_RAM) + AM_RANGE(0x140000, 0x143fff) AM_WRITE(MWA16_RAM) AM_BASE(&sharedram) AM_SIZE(&sharedram_size) + AM_RANGE(0x180000, 0x18000f) AM_WRITE(TC0220IOC_halfword_byteswap_w) + AM_RANGE(0x1c0000, 0x1c0001) AM_WRITE(cpua_ctrl_w) + AM_RANGE(0x200000, 0x20000f) AM_WRITE(wgp_adinput_w) + AM_RANGE(0x300000, 0x30ffff) AM_WRITE(TC0100SCN_word_0_w) /* tilemaps */ + AM_RANGE(0x320000, 0x32000f) AM_WRITE(TC0100SCN_ctrl_word_0_w) + AM_RANGE(0x400000, 0x40bfff) AM_WRITE(MWA16_RAM) AM_BASE(&wgp_spritemap) AM_SIZE(&wgp_spritemap_size) + AM_RANGE(0x40c000, 0x40dfff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) /* sprite ram */ + AM_RANGE(0x40fff0, 0x40fff1) AM_WRITE(MWA16_NOP) // ?? (writes 0x8000 and 0 alternately - Wgp2 just 0) + AM_RANGE(0x500000, 0x501fff) AM_WRITE(MWA16_RAM) /* unknown/unused */ + AM_RANGE(0x502000, 0x517fff) AM_WRITE(wgp_pivram_word_w) AM_BASE(&wgp_pivram) /* piv tilemaps */ + AM_RANGE(0x520000, 0x52001f) AM_WRITE(wgp_piv_ctrl_word_w) AM_BASE(&wgp_piv_ctrlram) + AM_RANGE(0x600000, 0x600003) AM_WRITE(rotate_port_w) /* rotation control ? */ + AM_RANGE(0x700000, 0x701fff) AM_WRITE(paletteram16_RRRRGGGGBBBBxxxx_word_w) AM_BASE(&paletteram16) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( wgp_cpub_readmem, ADDRESS_SPACE_PROGRAM, 16 ) /* LAN areas not mapped... */ + AM_RANGE(0x000000, 0x03ffff) AM_READ(MRA16_ROM) + AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM) + AM_RANGE(0x140000, 0x143fff) AM_READ(sharedram_r) + AM_RANGE(0x200000, 0x200003) AM_READ(wgp_sound_r) +// AM_RANGE(0x380000, 0x383fff) AM_READ(MRA16_RAM) // LAN RAM + AM_RANGE(0x380000, 0x380001) AM_READ(lan_status_r) // ?? + // a lan input area is read somewhere above the status + // (make the status return 0 and log)... +ADDRESS_MAP_END + +static ADDRESS_MAP_START( wgp_cpub_writemem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x03ffff) AM_WRITE(MWA16_ROM) + AM_RANGE(0x100000, 0x103fff) AM_WRITE(MWA16_RAM) + AM_RANGE(0x140000, 0x143fff) AM_WRITE(sharedram_w) + AM_RANGE(0x200000, 0x200003) AM_WRITE(wgp_sound_w) +// AM_RANGE(0x380000, 0x383fff) AM_WRITE(MWA16_RAM) // LAN RAM +ADDRESS_MAP_END + + +/***************************************************************************/ + +static ADDRESS_MAP_START( z80_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_ROM) + AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK10) + AM_RANGE(0xc000, 0xdfff) AM_READ(MRA8_RAM) + AM_RANGE(0xe000, 0xe000) AM_READ(YM2610_status_port_0_A_r) + AM_RANGE(0xe001, 0xe001) AM_READ(YM2610_read_port_0_r) + AM_RANGE(0xe002, 0xe002) AM_READ(YM2610_status_port_0_B_r) + AM_RANGE(0xe200, 0xe200) AM_READ(MRA8_NOP) + AM_RANGE(0xe201, 0xe201) AM_READ(taitosound_slave_comm_r) + AM_RANGE(0xea00, 0xea00) AM_READ(MRA8_NOP) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( z80_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0xc000, 0xdfff) AM_WRITE(MWA8_RAM) + AM_RANGE(0xe000, 0xe000) AM_WRITE(YM2610_control_port_0_A_w) + AM_RANGE(0xe001, 0xe001) AM_WRITE(YM2610_data_port_0_A_w) + AM_RANGE(0xe002, 0xe002) AM_WRITE(YM2610_control_port_0_B_w) + AM_RANGE(0xe003, 0xe003) AM_WRITE(YM2610_data_port_0_B_w) + AM_RANGE(0xe200, 0xe200) AM_WRITE(taitosound_slave_port_w) + AM_RANGE(0xe201, 0xe201) AM_WRITE(taitosound_slave_comm_w) + AM_RANGE(0xe400, 0xe403) AM_WRITE(MWA8_NOP) /* pan */ + AM_RANGE(0xee00, 0xee00) AM_WRITE(MWA8_NOP) /* ? */ + AM_RANGE(0xf000, 0xf000) AM_WRITE(MWA8_NOP) /* ? */ + AM_RANGE(0xf200, 0xf200) AM_WRITE(sound_bankswitch_w) +ADDRESS_MAP_END + + +/*********************************************************** + INPUT PORTS, DIPs +***********************************************************/ + +static INPUT_PORTS_START( wgp_joy_generic ) + PORT_START_TAG("DSWA") + PORT_DIPNAME( 0x01, 0x01, "Gear Shift" ) /* see notes */ + PORT_DIPSETTING( 0x01, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x00, "Normal / Racing" ) + TAITO_DSWA_BITS_1_TO_3 + /* The 4 following Dip Switches will be filled by TAITO_COINAGE_* macros */ + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START_TAG("DSWB") + TAITO_DIFFICULTY + PORT_DIPNAME( 0x04, 0x04, "Shift Pattern Select" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW ) + PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) /* see notes */ + PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) /* see notes */ + PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) /* see notes */ + PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) /* see notes */ + + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) /* shift up - see notes */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) /* shift down - see notes */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + 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_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + 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_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) /* brake */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* accel */ + 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 ) +INPUT_PORTS_END + +static INPUT_PORTS_START( wgp_no_joy_generic ) + PORT_INCLUDE(wgp_joy_generic) + + PORT_MODIFY("DSWB") + PORT_DIPNAME( 0x10, 0x10, "Communication" ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xe0, 0xe0, "Machine ID" ) + PORT_DIPSETTING( 0xe0, "1" ) + PORT_DIPSETTING( 0xc0, "2" ) + PORT_DIPSETTING( 0xa0, "3" ) + PORT_DIPSETTING( 0x80, "4" ) + PORT_DIPSETTING( 0x60, "5" ) + PORT_DIPSETTING( 0x40, "6" ) + PORT_DIPSETTING( 0x20, "7" ) + PORT_DIPSETTING( 0x00, "8" ) + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Freeze") PORT_CODE(KEYCODE_F1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) /* shift up - see notes */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) /* shift down - see notes */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) + + PORT_MODIFY("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START_TAG(STEER_PORT_TAG) + PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(20) PORT_KEYDELTA(25) PORT_REVERSE PORT_PLAYER(1) + + PORT_START_TAG(UNKNOWN_PORT_TAG) + PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(20) PORT_KEYDELTA(10) PORT_PLAYER(2) + + /* fake inputs, allowing digital steer etc. */ + PORT_START_TAG(FAKE_PORT_TAG) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(1) + PORT_CONFNAME( 0x10, 0x10, "Steering type" ) + PORT_CONFSETTING( 0x10, "Digital" ) + PORT_CONFSETTING( 0x00, "Analogue" ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) /* accel */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) /* brake */ +INPUT_PORTS_END + + +static INPUT_PORTS_START( wgp ) + PORT_INCLUDE(wgp_no_joy_generic) + + /* 0x180000 -> 0x10bf16 and 0x140010 (shared RAM) */ + PORT_MODIFY("DSWA") + TAITO_COINAGE_US + + /* 0x180002 -> 0x10bf18 and 0x140012 (shared RAM) : DSWB */ + + PORT_MODIFY("IN1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) /* "start lump" (lamp?) - test mode only */ + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) /* "brake lump" (lamp?) - test mode only */ +INPUT_PORTS_END + +static INPUT_PORTS_START( wgpj ) + PORT_INCLUDE(wgp) + + PORT_MODIFY("DSWA") + TAITO_COINAGE_JAPAN_NEW +INPUT_PORTS_END + +static INPUT_PORTS_START( wgpjoy ) + PORT_INCLUDE(wgp_joy_generic) + + /* 0x180000 -> 0x10bf1a and 0x140010 (shared RAM) */ + PORT_MODIFY("DSWA") + TAITO_COINAGE_JAPAN_NEW + + /* 0x180002 -> 0x10bf1c and 0x140012 (shared RAM) : DSWB*/ +INPUT_PORTS_END + +static INPUT_PORTS_START( wgp2 ) + PORT_INCLUDE(wgp_no_joy_generic) + + /* 0x180000 -> 0x107d3a.b (-$2c6,A5) and 0x140018 (shared RAM) */ + PORT_MODIFY("DSWA") + TAITO_COINAGE_JAPAN_NEW + + /* 0x180002 -> 0x107d3b.b (-$2c5,A5) and 0x140012 (shared RAM) : DSWB */ +INPUT_PORTS_END + + +/*********************************************************** + GFX DECODING +***********************************************************/ + +static const gfx_layout wgp_tilelayout = +{ + 16,16, /* 16*16 sprites */ + RGN_FRAC(1,1), + 4, /* 4 bits per pixel */ + { 0, 1, 2, 3 }, + { 1*4, 0*4, 5*4, 4*4, 3*4, 2*4, 7*4, 6*4, 9*4, 8*4, 13*4, 12*4, 11*4, 10*4, 15*4, 14*4 }, + { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 }, + 128*8 /* every sprite takes 128 consecutive bytes */ +}; + +static const gfx_layout wgp_tile2layout = +{ + 16,16, /* 16*16 sprites */ + RGN_FRAC(1,1), + 4, /* 4 bits per pixel */ + { 0, 1, 2, 3 }, + { 7*4, 6*4, 15*4, 14*4, 5*4, 4*4, 13*4, 12*4, 3*4, 2*4, 11*4, 10*4, 1*4, 0*4, 9*4, 8*4 }, + { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 }, + 128*8 /* every sprite takes 128 consecutive bytes */ +}; + +static const gfx_layout charlayout = +{ + 8,8, /* 8*8 characters */ + RGN_FRAC(1,1), + 4, /* 4 bits per pixel */ + { 0, 1, 2, 3 }, + { 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, + 32*8 /* every sprite takes 32 consecutive bytes */ +}; + +/* taitoic.c TC0100SCN routines expect scr stuff to be in second gfx + slot */ + +static GFXDECODE_START( wgp ) + GFXDECODE_ENTRY( REGION_GFX3, 0x0, wgp_tilelayout, 0, 256 ) /* sprites */ + GFXDECODE_ENTRY( REGION_GFX1, 0x0, charlayout, 0, 256 ) /* sprites & playfield */ + GFXDECODE_ENTRY( REGION_GFX2, 0x0, wgp_tile2layout, 0, 256 ) /* piv */ +GFXDECODE_END + + +/************************************************************** + YM2610 (SOUND) +**************************************************************/ + +/* handler called by the YM2610 emulator when the internal timers cause an IRQ */ +static void irqhandler(int irq) // assumes Z80 sandwiched between 68Ks +{ + cpunum_set_input_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE); +} + +static struct YM2610interface ym2610_interface = +{ + irqhandler, + REGION_SOUND2, /* Delta-T */ + REGION_SOUND1 /* ADPCM */ +}; + + +/*********************************************************** + MACHINE DRIVERS + +Wgp has high interleaving to prevent "common ram error". +However sync to vblank is lacking, which is causing the +graphics glitches. +***********************************************************/ + +static MACHINE_START( wgp ) +{ + state_save_register_global(cpua_ctrl); + state_save_register_func_postload(parse_control); + + state_save_register_global(banknum); + state_save_register_func_postload(reset_sound_region); +} + +static MACHINE_DRIVER_START( wgp ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68000, 12000000) /* 12 MHz ??? */ + MDRV_CPU_PROGRAM_MAP(wgp_readmem,wgp_writemem) + MDRV_CPU_VBLANK_INT(irq4_line_hold,1) + + MDRV_CPU_ADD(Z80, 16000000/4) /* 4 MHz ??? */ + /* audio CPU */ + MDRV_CPU_PROGRAM_MAP(z80_sound_readmem,z80_sound_writemem) + + MDRV_CPU_ADD(M68000, 12000000) /* 12 MHz ??? */ + MDRV_CPU_PROGRAM_MAP(wgp_cpub_readmem,wgp_cpub_writemem) + MDRV_CPU_VBLANK_INT(wgp_cpub_interrupt,1) + + MDRV_MACHINE_START(wgp) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(250) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(40*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) + MDRV_GFXDECODE(wgp) + MDRV_PALETTE_LENGTH(4096) + + MDRV_VIDEO_START(wgp) + MDRV_VIDEO_UPDATE(wgp) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(YM2610, 16000000/2) + MDRV_SOUND_CONFIG(ym2610_interface) + MDRV_SOUND_ROUTE(0, "left", 0.25) + MDRV_SOUND_ROUTE(0, "right", 0.25) + MDRV_SOUND_ROUTE(1, "left", 1.0) + MDRV_SOUND_ROUTE(2, "right", 1.0) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( wgp2 ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68000, 12000000) /* 12 MHz ??? */ + MDRV_CPU_PROGRAM_MAP(wgp_readmem,wgp_writemem) + MDRV_CPU_VBLANK_INT(irq4_line_hold,1) + + MDRV_CPU_ADD(Z80, 16000000/4) /* 4 MHz ??? */ + /* audio CPU */ + MDRV_CPU_PROGRAM_MAP(z80_sound_readmem,z80_sound_writemem) + + MDRV_CPU_ADD(M68000, 12000000) /* 12 MHz ??? */ + MDRV_CPU_PROGRAM_MAP(wgp_cpub_readmem,wgp_cpub_writemem) + MDRV_CPU_VBLANK_INT(wgp_cpub_interrupt,1) + + MDRV_MACHINE_START(wgp) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(200) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(40*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) + MDRV_GFXDECODE(wgp) + MDRV_PALETTE_LENGTH(4096) + + MDRV_VIDEO_START(wgp2) + MDRV_VIDEO_UPDATE(wgp) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(YM2610, 16000000/2) + MDRV_SOUND_CONFIG(ym2610_interface) + MDRV_SOUND_ROUTE(0, "left", 0.25) + MDRV_SOUND_ROUTE(0, "right", 0.25) + MDRV_SOUND_ROUTE(1, "left", 1.0) + MDRV_SOUND_ROUTE(2, "right", 1.0) +MACHINE_DRIVER_END + + +/*************************************************************************** + DRIVERS +***************************************************************************/ + +ROM_START( wgp ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 256K for 68000 code (CPU A) */ + ROM_LOAD16_BYTE( "c32-25.12", 0x00000, 0x20000, CRC(0cc81e77) SHA1(435190bc24423e1e34134dff3cd4b79e120852d1) ) + ROM_LOAD16_BYTE( "c32-29.13", 0x00001, 0x20000, CRC(fab47cf0) SHA1(c0129c0290b48f24c25e4dd7c6c937675e31842a) ) + ROM_LOAD16_WORD_SWAP( "c32-10.9", 0x80000, 0x80000, CRC(a44c66e9) SHA1(b5fa978e43303003969033b8096fd68885cfc202) ) /* data rom */ + + ROM_REGION( 0x40000, REGION_CPU3, 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "c32-28.64", 0x00000, 0x20000, CRC(38f3c7bf) SHA1(bfcaa036e5ff23f2bbf74d738498eda7d6ccd554) ) + ROM_LOAD16_BYTE( "c32-27.63", 0x00001, 0x20000, CRC(be2397fb) SHA1(605a02d56ae6007b36299a2eceb7ca180cbf6df9) ) + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* Z80 sound cpu */ + ROM_LOAD( "c32-24.34", 0x00000, 0x04000, CRC(e9adb447) SHA1(8b7044b6ea864e4cfd60b87abd28c38caecb147d) ) + ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "c32-09.16", 0x00000, 0x80000, CRC(96495f35) SHA1(ce99b4d8aeb98304e8ae3aa4966289c76ae4ff69) ) /* SCR */ + + ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD32_BYTE( "c32-04.9", 0x000000, 0x80000, CRC(473a19c9) SHA1(4c632f4d5b725790a1be9d1143318d2f682fe9be) ) /* PIV */ + ROM_LOAD32_BYTE( "c32-03.10", 0x000001, 0x80000, CRC(9ec3e134) SHA1(e82a50927e10e551124a3b81399b052974cfba12) ) + ROM_LOAD32_BYTE( "c32-02.11", 0x000002, 0x80000, CRC(c5721f3a) SHA1(4a8e9412de23001b09eb3425ba6006b4c09a907b) ) + ROM_LOAD32_BYTE( "c32-01.12", 0x000003, 0x80000, CRC(d27d7d93) SHA1(82ae5856bbdb49cb8c2ca20eef86f6b617ea2c45) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "c32-05.71", 0x000000, 0x80000, CRC(3698d47a) SHA1(71978f9e1f58fa1259e67d8a7ea68e3ec1314c6b) ) /* OBJ */ + ROM_LOAD16_BYTE( "c32-06.70", 0x000001, 0x80000, CRC(f0267203) SHA1(7fd7b8d7a9efa405fc647c16fb99ffcb1fe985c5) ) + ROM_LOAD16_BYTE( "c32-07.69", 0x100000, 0x80000, CRC(743d46bd) SHA1(6b655b3fbfad8b52e38d7388aab564f5fa3e778c) ) + ROM_LOAD16_BYTE( "c32-08.68", 0x100001, 0x80000, CRC(faab63b0) SHA1(6e1aaf2642bee7d7bc9e21a7bf7f81d9ff766c50) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "c32-11.8", 0x00000, 0x80000, CRC(2b326ff0) SHA1(3c442e3c97234e4514a7bed31644212586869bd0) ) + + ROM_REGION( 0x80000, REGION_SOUND2, 0 ) /* Delta-T samples */ + ROM_LOAD( "c32-12.7", 0x00000, 0x80000, CRC(df48a37b) SHA1(c0c191f4b8a5f55c0f1e52dac9cd3f7d15adace6) ) + +// Pals (Guru dump) +// ROM_LOAD( "c32-13.14", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-14.19", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-15.52", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-16.54", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-17.53", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-18.64", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-19.27", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-20.67", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-21.85", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-22.24", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-23.13", 0x00000, 0x00???, NO_DUMP ) + +// Pals on lan interface board +// ROM_LOAD( "c32-34", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "c32-35", 0x00000, 0x00???, NO_DUMP ) +ROM_END + +ROM_START( wgpj ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 256K for 68000 code (CPU A) */ + ROM_LOAD16_BYTE( "c32-48.12", 0x00000, 0x20000, CRC(819cc134) SHA1(501bb1038979117586f6d8202ca6e1e44191f421) ) + ROM_LOAD16_BYTE( "c32-49.13", 0x00001, 0x20000, CRC(4a515f02) SHA1(d0be52bbb5cc8151b23363092ac04e27b2d20a50) ) + ROM_LOAD16_WORD_SWAP( "c32-10.9", 0x80000, 0x80000, CRC(a44c66e9) SHA1(b5fa978e43303003969033b8096fd68885cfc202) ) /* data rom */ + + ROM_REGION( 0x40000, REGION_CPU3, 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "c32-28.64", 0x00000, 0x20000, CRC(38f3c7bf) SHA1(bfcaa036e5ff23f2bbf74d738498eda7d6ccd554) ) + ROM_LOAD16_BYTE( "c32-27.63", 0x00001, 0x20000, CRC(be2397fb) SHA1(605a02d56ae6007b36299a2eceb7ca180cbf6df9) ) + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* Z80 sound cpu */ + ROM_LOAD( "c32-24.34", 0x00000, 0x04000, CRC(e9adb447) SHA1(8b7044b6ea864e4cfd60b87abd28c38caecb147d) ) + ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "c32-09.16", 0x00000, 0x80000, CRC(96495f35) SHA1(ce99b4d8aeb98304e8ae3aa4966289c76ae4ff69) ) /* SCR */ + + ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD32_BYTE( "c32-04.9", 0x000000, 0x80000, CRC(473a19c9) SHA1(4c632f4d5b725790a1be9d1143318d2f682fe9be) ) /* PIV */ + ROM_LOAD32_BYTE( "c32-03.10", 0x000001, 0x80000, CRC(9ec3e134) SHA1(e82a50927e10e551124a3b81399b052974cfba12) ) + ROM_LOAD32_BYTE( "c32-02.11", 0x000002, 0x80000, CRC(c5721f3a) SHA1(4a8e9412de23001b09eb3425ba6006b4c09a907b) ) + ROM_LOAD32_BYTE( "c32-01.12", 0x000003, 0x80000, CRC(d27d7d93) SHA1(82ae5856bbdb49cb8c2ca20eef86f6b617ea2c45) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "c32-05.71", 0x000000, 0x80000, CRC(3698d47a) SHA1(71978f9e1f58fa1259e67d8a7ea68e3ec1314c6b) ) /* OBJ */ + ROM_LOAD16_BYTE( "c32-06.70", 0x000001, 0x80000, CRC(f0267203) SHA1(7fd7b8d7a9efa405fc647c16fb99ffcb1fe985c5) ) + ROM_LOAD16_BYTE( "c32-07.69", 0x100000, 0x80000, CRC(743d46bd) SHA1(6b655b3fbfad8b52e38d7388aab564f5fa3e778c) ) + ROM_LOAD16_BYTE( "c32-08.68", 0x100001, 0x80000, CRC(faab63b0) SHA1(6e1aaf2642bee7d7bc9e21a7bf7f81d9ff766c50) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "c32-11.8", 0x00000, 0x80000, CRC(2b326ff0) SHA1(3c442e3c97234e4514a7bed31644212586869bd0) ) + + ROM_REGION( 0x80000, REGION_SOUND2, 0 ) /* Delta-T samples */ + ROM_LOAD( "c32-12.7", 0x00000, 0x80000, CRC(df48a37b) SHA1(c0c191f4b8a5f55c0f1e52dac9cd3f7d15adace6) ) +ROM_END + +ROM_START( wgpjoy ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 256K for 68000 code (CPU A) */ + ROM_LOAD16_BYTE( "c32-57.12", 0x00000, 0x20000, CRC(13a78911) SHA1(d3ace25dddce56cc35e93992f4fae01e87693d36) ) + ROM_LOAD16_BYTE( "c32-58.13", 0x00001, 0x20000, CRC(326d367b) SHA1(cbfb15841f61fa856876d4321fbce190f89a5020) ) + ROM_LOAD16_WORD_SWAP( "c32-10.9", 0x80000, 0x80000, CRC(a44c66e9) SHA1(b5fa978e43303003969033b8096fd68885cfc202) ) /* data rom */ + + ROM_REGION( 0x40000, REGION_CPU3, 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "c32-60.64", 0x00000, 0x20000, CRC(7a980312) SHA1(c85beff4c8201061b99d87f8db67e2b85dff00e3) ) + ROM_LOAD16_BYTE( "c32-59.63", 0x00001, 0x20000, CRC(ed75b333) SHA1(fa47ea38f7ba1cb3463065357db9a9b0f0eeab77) ) + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* Z80 sound cpu */ + ROM_LOAD( "c32-61.34", 0x00000, 0x04000, CRC(2fcad5a3) SHA1(f0f658490655b521af631af763c07e37834dc5a0) ) + ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "c32-09.16", 0x00000, 0x80000, CRC(96495f35) SHA1(ce99b4d8aeb98304e8ae3aa4966289c76ae4ff69) ) /* SCR */ + + ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD32_BYTE( "c32-04.9", 0x000000, 0x80000, CRC(473a19c9) SHA1(4c632f4d5b725790a1be9d1143318d2f682fe9be) ) /* PIV */ + ROM_LOAD32_BYTE( "c32-03.10", 0x000001, 0x80000, CRC(9ec3e134) SHA1(e82a50927e10e551124a3b81399b052974cfba12) ) + ROM_LOAD32_BYTE( "c32-02.11", 0x000002, 0x80000, CRC(c5721f3a) SHA1(4a8e9412de23001b09eb3425ba6006b4c09a907b) ) + ROM_LOAD32_BYTE( "c32-01.12", 0x000003, 0x80000, CRC(d27d7d93) SHA1(82ae5856bbdb49cb8c2ca20eef86f6b617ea2c45) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "c32-05.71", 0x000000, 0x80000, CRC(3698d47a) SHA1(71978f9e1f58fa1259e67d8a7ea68e3ec1314c6b) ) /* OBJ */ + ROM_LOAD16_BYTE( "c32-06.70", 0x000001, 0x80000, CRC(f0267203) SHA1(7fd7b8d7a9efa405fc647c16fb99ffcb1fe985c5) ) + ROM_LOAD16_BYTE( "c32-07.69", 0x100000, 0x80000, CRC(743d46bd) SHA1(6b655b3fbfad8b52e38d7388aab564f5fa3e778c) ) + ROM_LOAD16_BYTE( "c32-08.68", 0x100001, 0x80000, CRC(faab63b0) SHA1(6e1aaf2642bee7d7bc9e21a7bf7f81d9ff766c50) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "c32-11.8", 0x00000, 0x80000, CRC(2b326ff0) SHA1(3c442e3c97234e4514a7bed31644212586869bd0) ) + + ROM_REGION( 0x80000, REGION_SOUND2, 0 ) /* delta-t samples */ + ROM_LOAD( "c32-12.7", 0x00000, 0x80000, CRC(df48a37b) SHA1(c0c191f4b8a5f55c0f1e52dac9cd3f7d15adace6) ) +ROM_END + +ROM_START( wgpjoya ) /* Older joystick version ??? */ + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 256K for 68000 code (CPU A) */ + ROM_LOAD16_BYTE( "c32-57.12", 0x00000, 0x20000, CRC(13a78911) SHA1(d3ace25dddce56cc35e93992f4fae01e87693d36) ) + ROM_LOAD16_BYTE( "c32-58.13", 0x00001, 0x20000, CRC(326d367b) SHA1(cbfb15841f61fa856876d4321fbce190f89a5020) ) + ROM_LOAD16_WORD_SWAP( "c32-10.9", 0x80000, 0x80000, CRC(a44c66e9) SHA1(b5fa978e43303003969033b8096fd68885cfc202) ) /* data rom */ + + ROM_REGION( 0x40000, REGION_CPU3, 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "c32-46.64", 0x00000, 0x20000, CRC(64191891) SHA1(91d1d51478f1c2785470de0ac2a048e367f7ea48) ) // older rev? + ROM_LOAD16_BYTE( "c32-45.63", 0x00001, 0x20000, CRC(759b39d5) SHA1(ed4ccd295c5595bdcac965b59293efb3c21ce48a) ) // older rev? + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* Z80 sound cpu */ + ROM_LOAD( "c32-61.34", 0x00000, 0x04000, CRC(2fcad5a3) SHA1(f0f658490655b521af631af763c07e37834dc5a0) ) + ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "c32-09.16", 0x00000, 0x80000, CRC(96495f35) SHA1(ce99b4d8aeb98304e8ae3aa4966289c76ae4ff69) ) /* SCR */ + + ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD32_BYTE( "c32-04.9", 0x000000, 0x80000, CRC(473a19c9) SHA1(4c632f4d5b725790a1be9d1143318d2f682fe9be) ) /* PIV */ + ROM_LOAD32_BYTE( "c32-03.10", 0x000001, 0x80000, CRC(9ec3e134) SHA1(e82a50927e10e551124a3b81399b052974cfba12) ) + ROM_LOAD32_BYTE( "c32-02.11", 0x000002, 0x80000, CRC(c5721f3a) SHA1(4a8e9412de23001b09eb3425ba6006b4c09a907b) ) + ROM_LOAD32_BYTE( "c32-01.12", 0x000003, 0x80000, CRC(d27d7d93) SHA1(82ae5856bbdb49cb8c2ca20eef86f6b617ea2c45) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "c32-05.71", 0x000000, 0x80000, CRC(3698d47a) SHA1(71978f9e1f58fa1259e67d8a7ea68e3ec1314c6b) ) /* OBJ */ + ROM_LOAD16_BYTE( "c32-06.70", 0x000001, 0x80000, CRC(f0267203) SHA1(7fd7b8d7a9efa405fc647c16fb99ffcb1fe985c5) ) + ROM_LOAD16_BYTE( "c32-07.69", 0x100000, 0x80000, CRC(743d46bd) SHA1(6b655b3fbfad8b52e38d7388aab564f5fa3e778c) ) + ROM_LOAD16_BYTE( "c32-08.68", 0x100001, 0x80000, CRC(faab63b0) SHA1(6e1aaf2642bee7d7bc9e21a7bf7f81d9ff766c50) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "c32-11.8", 0x00000, 0x80000, CRC(2b326ff0) SHA1(3c442e3c97234e4514a7bed31644212586869bd0) ) + + ROM_REGION( 0x80000, REGION_SOUND2, 0 ) /* delta-t samples */ + ROM_LOAD( "c32-12.7", 0x00000, 0x80000, CRC(df48a37b) SHA1(c0c191f4b8a5f55c0f1e52dac9cd3f7d15adace6) ) +ROM_END + +ROM_START( wgp2 ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 256K for 68000 code (CPU A) */ + ROM_LOAD16_BYTE( "c73-01.12", 0x00000, 0x20000, CRC(c6434834) SHA1(75b2937a9bf18d268fa7bbfb3e822fba510ec2f1) ) + ROM_LOAD16_BYTE( "c73-02.13", 0x00001, 0x20000, CRC(c67f1ed1) SHA1(c30dc3fd46f103a75aa71f87c1fd6c0e7fed9214) ) + ROM_LOAD16_WORD_SWAP( "c32-10.9", 0x80000, 0x80000, CRC(a44c66e9) SHA1(b5fa978e43303003969033b8096fd68885cfc202) ) /* data rom */ + + ROM_REGION( 0x40000, REGION_CPU3, 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "c73-04.64", 0x00000, 0x20000, CRC(383aa776) SHA1(bad18f0506e99a07d53e50abe7a548ff3d745e09) ) + ROM_LOAD16_BYTE( "c73-03.63", 0x00001, 0x20000, CRC(eb5067ef) SHA1(08d9d921c7a74877d7bb7641ae30c82d4d0653e3) ) + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* Z80 sound cpu */ + ROM_LOAD( "c73-05.34", 0x00000, 0x04000, CRC(7e00a299) SHA1(93696a229f17a15a92a8d9ef3b34d340de5dec44) ) + ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "c32-09.16", 0x00000, 0x80000, CRC(96495f35) SHA1(ce99b4d8aeb98304e8ae3aa4966289c76ae4ff69) ) /* SCR */ + + ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD32_BYTE( "c32-04.9", 0x000000, 0x80000, CRC(473a19c9) SHA1(4c632f4d5b725790a1be9d1143318d2f682fe9be) ) /* PIV */ + ROM_LOAD32_BYTE( "c32-03.10", 0x000001, 0x80000, CRC(9ec3e134) SHA1(e82a50927e10e551124a3b81399b052974cfba12) ) + ROM_LOAD32_BYTE( "c32-02.11", 0x000002, 0x80000, CRC(c5721f3a) SHA1(4a8e9412de23001b09eb3425ba6006b4c09a907b) ) + ROM_LOAD32_BYTE( "c32-01.12", 0x000003, 0x80000, CRC(d27d7d93) SHA1(82ae5856bbdb49cb8c2ca20eef86f6b617ea2c45) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "c32-05.71", 0x000000, 0x80000, CRC(3698d47a) SHA1(71978f9e1f58fa1259e67d8a7ea68e3ec1314c6b) ) /* OBJ */ + ROM_LOAD16_BYTE( "c32-06.70", 0x000001, 0x80000, CRC(f0267203) SHA1(7fd7b8d7a9efa405fc647c16fb99ffcb1fe985c5) ) + ROM_LOAD16_BYTE( "c32-07.69", 0x100000, 0x80000, CRC(743d46bd) SHA1(6b655b3fbfad8b52e38d7388aab564f5fa3e778c) ) + ROM_LOAD16_BYTE( "c32-08.68", 0x100001, 0x80000, CRC(faab63b0) SHA1(6e1aaf2642bee7d7bc9e21a7bf7f81d9ff766c50) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "c32-11.8", 0x00000, 0x80000, CRC(2b326ff0) SHA1(3c442e3c97234e4514a7bed31644212586869bd0) ) + + ROM_REGION( 0x80000, REGION_SOUND2, 0 ) /* delta-t samples */ + ROM_LOAD( "c32-12.7", 0x00000, 0x80000, CRC(df48a37b) SHA1(c0c191f4b8a5f55c0f1e52dac9cd3f7d15adace6) ) + +// WGP2 security board (has TC0190FMC) +// ROM_LOAD( "c73-06", 0x00000, 0x00???, NO_DUMP ) +ROM_END + + +static DRIVER_INIT( wgp ) +{ +#if 0 + /* Patch for coding error that causes corrupt data in + sprite tilemapping area from $4083c0-847f */ + UINT16 *ROM = (UINT16 *)memory_region(REGION_CPU1); + ROM[0x25dc / 2] = 0x0602; // faulty value is 0x0206 +#endif + +// taitosnd_setz80_soundcpu( 2 ); + cpua_ctrl = 0xff; +} + +static DRIVER_INIT( wgp2 ) +{ + /* Code patches to prevent failure in memory checks */ + UINT16 *ROM = (UINT16 *)memory_region(REGION_CPU3); + ROM[0x8008 / 2] = 0x0; + ROM[0x8010 / 2] = 0x0; + + cpua_ctrl = 0xff; +} + +/* Working Games with some graphics problems - e.g. missing rotation */ + +GAME( 1989, wgp, 0, wgp, wgp, wgp, ROT0, "Taito America Corporation", "World Grand Prix (US)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1989, wgpj, wgp, wgp, wgpj, wgp, ROT0, "Taito Corporation", "World Grand Prix (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1989, wgpjoy, wgp, wgp, wgpjoy, wgp, ROT0, "Taito Corporation", "World Grand Prix (joystick version) (Japan, set 1)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1989, wgpjoya, wgp, wgp, wgpjoy, wgp, ROT0, "Taito Corporation", "World Grand Prix (joystick version) (Japan, set 2)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1990, wgp2, wgp, wgp2, wgp2, wgp2, ROT0, "Taito Corporation", "World Grand Prix 2 (Japan)", GAME_IMPERFECT_GRAPHICS ) + |