diff options
Diffstat (limited to 'src/mame/drivers/wecleman.cpp')
-rw-r--r-- | src/mame/drivers/wecleman.cpp | 1695 |
1 files changed, 1695 insertions, 0 deletions
diff --git a/src/mame/drivers/wecleman.cpp b/src/mame/drivers/wecleman.cpp new file mode 100644 index 00000000000..5f46efda43c --- /dev/null +++ b/src/mame/drivers/wecleman.cpp @@ -0,0 +1,1695 @@ +// license:BSD-3-Clause +// copyright-holders:Luca Elia +/*************************************************************************** + WEC Le Mans 24 & Hot Chase + + (C) 1986 & 1988 Konami + + driver by Luca Elia (l.elia@tin.it) + +- Note: press F2 to enter service mode - + +--------------------------------------------------------------------------- + TODO list +--------------------------------------------------------------------------- +WEC Le Mans 24: +- The parallactic scrolling is sometimes wrong +Hot Chase: +- gameplay speed is VERY erratic +- Samples pitch is too low +- No zoom and rotation of the layers +Common Issues: +- One ROM unused (32K in hotchase, 16K in wecleman) +- Incomplete DSWs +- Sprite ram is not cleared by the game and no sprite list end-marker + is written. We cope with that with an hack in the Blitter but there + must be a register to do the trick + + + +---------------------------------------------------------------------- +Hardware Main Sub Sound Sound Chips +---------------------------------------------------------------------- +[WEC Le Mans 24] 68000 68000 Z-80 YM2151 YM3012 1x007232 + +[Hot Chase] 68000 68000 68B09E 3x007232 + +[CPU PCB GX763 350861B] + 007641 007770 3x007232 051550 + +[VID PCB GX763 350860A AI AM-1] + 007634 007635 3x051316 007558 007557 +---------------------------------------------------------------------- + + +---------------------------------------------------------------- +Main CPU [WEC Le Mans 24] [Hot Chase] +---------------------------------------------------------------- +ROM R 000000-03ffff < +Work RAM RW 040000-043fff 040000-063fff* +? RW 060000-060007 - +Blitter W 080000-080011 < +Page RAM RW 100000-103fff - +Text RAM RW 108000-108fff - +Palette RAM RW 110000-110fff 110000-111fff** +Shared RAM RW 124000-127fff 120000-123fff +Sprites RAM RW 130000-130fff < +Input Ports RW 1400xx-1400xx < +Background RW 100000-100fff +Background Ctrl W - 101000-10101f +Foreground RW - 102000-102fff +Foreground Ctrl W - 103000-10301f + +* weird ** only half used + + +---------------------------------------------------------------- +Sub CPU [WEC Le Mans 24] [Hot Chase] +---------------------------------------------------------------- + +ROM R 000000-00ffff 000000-01ffff +Work RAM RW - 060000-060fff +Road RAM RW 060000-060fff 020000-020fff +Shared RAM RW 070000-073fff 040000-043fff + + +--------------------------------------------------------------------------- + Game code + [WEC Le Mans 24] +--------------------------------------------------------------------------- + + Interesting locations (main cpu) + -------------------------------- + +There's some 68000 assembly code in ASCII around d88 :-) + +040000+ +7-9 *** hi score/10 (BCD 3 bytes) *** +b-d *** score/10 (BCD 3 bytes) *** +1a,127806 <- 140011.b +1b,127807 <- 140013.b +1c,127808 <- 140013.b +1d,127809 <- 140015.b +1e,12780a <- 140017.b +1f <- 140013.b +30 *** credits *** +3a,3b,3c,3d <-140021.b +3a = accelerator 3b = ?? 3c = steering 3d = table + +d2.w -> 108f24 fg y scroll +112.w -> 108f26 bg y scroll + +16c influences 140031.b +174 screen address +180 input port selection (->140003.b ->140021.b) +181 ->140005.b +185 bit 7 high -> must copy sprite data to 130000 +1dc+(1da).w ->140001.b + +40a.w,c.w *** time (BCD) *** +411 EF if brake, 0 otherwise +416 ? +419 gear: 0=lo,1=hi +41e.w speed related ->127880 +424.w speed BCD +43c.w accel? +440.w level? + +806.w scrollx related +80e.w scrolly related + +c08.b routine select: 1>1e1a4 2>1e1ec 3>1e19e other>1e288 (map screen) + +117a.b selected letter when entering name in hi-scores +117e.w cycling color in hi-scores + +12c0.w ?time,pos,len related? +12c2.w +12c4.w +12c6.w + +1400-1bff color data (0000-1023 chars) +1c00-23ff color data (1024-2047 sprites?) + +2400 Sprite data: 40 entries x 4 bytes = 100 +2800 Sprite data: 40 entries x 40 bytes = 1000 +3800 Sprite data: 40 entries x 10 bytes = 400 + + Interesting routines (main cpu) + ------------------------------- + +804 mem test +818 end mem test (cksums at 100, addresses at A90) +82c other cpu test +a0c rom test +c1a prints string (a1) +1028 end test +204c print 4*3 box of chars to a1, made up from 2 2*6 (a0)=0xLR (Left,Righ index) +4e62 raws in the fourth page of chars +6020 test screen (print) +60d6 test screen +62c4 motor test? +6640 print input port values ( 6698 = scr_disp.w,ip.b,bit.b[+/-] ) + +819c prepares sprite data +8526 blitter: 42400->130000 +800c 8580 sprites setup on map screen + +1833a cycle cols on hi-scores +18514 hiscores: main loop +185e8 hiscores: wheel selects letter + +TRAP#0 prints string: A0-> addr.l, attr.w, (char.b)*, 0 + +IRQs [1,3,6] 602 +IRQs [2,7] 1008->12dc ORI.W #$2700,(A7) RTE +IRQs [4] 1004->124c +IRQs [5] 106c->1222 calls sequence: $3d24 $1984 $28ca $36d2 $3e78 + + + Interesting locations (sub cpu) + ------------------------------- + + Interesting routines (sub cpu) + ------------------------------ + +1028 'wait for command' loop. +1138 lev4 irq +1192 copies E0*4 bytes: (a1)+ -> (a0)+ + + +--------------------------------------------------------------------------- + Game code + [Hot Chase] +--------------------------------------------------------------------------- + +This game has been probably coded by the same programmers of WEC Le Mans 24 +It shares some routines and there is the (hidden?) string "WEC 2" somewhere + + Main CPU Sub CPU + +Interrupts: [1, 7] FFFFFFFF FFFFFFFF +Interrupts: [2,3,4,5,6] 221c 1288 + +Self Test: + 0] pause,120002==55,pause,120002==AA,pause,120002==CC, (on error set bit d7.0) + 6] 60000-63fff(d7.1),40000-41fff(d7.2) + 8] 40000/2<-chksum 0-20000(e/o);40004/6<-chksum 20000-2ffff(e/o) (d7.3456) + 9] chksums from sub cpu: even->40004 odd->(40006) (d7.78) + A] 110000-111fff(even)(d7.9),102000-102fff(odd)(d7.a) + C] 100000-100fff(odd)(d7.b),pause,pause,pause +10] 120004==0(d7.c),120006==0(d7.d),130000-1307ff(first $A of every $10 bytes only)(d7.e),pause +14] 102000<-hw screen+(d7==0)? jmp 1934/1000 +15] 195c start of game + + + Interesting locations (main cpu) + -------------------------------- + +60024.b <- !140017.b (DSW 1 - coinage) +60025.b <- !140015.b (DSW 2 - options) +6102c.w *** time *** + + Interesting routines (main cpu) + ------------------------------- + +18d2 (d7.d6)?print BAD/OK to (a5)+, jmp(D0) +1d58 print d2.w to (a4)+, jmp(a6) +580c writes at 60000 +61fc print test strings +18cbe print "game over" + +Revisions: + +05-05-2002 David Haywood(Haze) +- improved Wec Le Mans steering + +05-01-2002 Hiromitsu Shioya(Shica) +- fixed Hot Chase volume and sound interrupt + +xx-xx-2003 Acho A. Tang +[Wec Le Mans 24] +- generalized blitter to support Wec Le Mans +- emulated custom alpha blending chip used for protection +- fixed game color and sound volume +- added shadows and sprite-to-sprite priority +- added curbs effect +- modified zoom equation to close tile gaps +- fixed a few tile glitches +- converted driver to use RGB direct +- cloud transition(needs verification from board owners) +- fixed sound banking +- source clean-up + +TODO: +- check dust color on title screen(I don't think it should be black) +- check brake light(LED) support +- check occational off-pitch music and samples(sound interrupt related?) + +* Sprite, road and sky drawings do not support 32-bit color depth. + Certain sprites with incorrect z-value still pop in front of closer + billboards and some appear a few pixels off the ground. They could be + the game's intrinsic flaws. (reference: www.system16.com) + +[Hot Chase] +- shared changes with Wec Le Mans +- removed junk tiles during introduction(needs verification) + +* Special thanks to Luca Elia for bringing us so many enjoyable games. + +***************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "cpu/m68000/m68000.h" +#include "cpu/m6809/m6809.h" +#include "sound/2151intf.h" +#include "wecleman.lh" +#include "includes/wecleman.h" + + +/*************************************************************************** + Common Routines +***************************************************************************/ + +READ16_MEMBER(wecleman_state::wecleman_protection_r) +{ + int blend, data0, data1, r0, g0, b0, r1, g1, b1; + + data0 = m_protection_ram[0]; + blend = m_protection_ram[2]; + data1 = m_protection_ram[1]; + blend &= 0x3ff; + + // a precalculated table will take an astronomical 4096^2(colors) x 1024(steps) x 2(word) bytes + r0 = data0; g0 = data0; b0 = data0; + r0 &= 0xf; g0 &= 0xf0; b0 &= 0xf00; + r1 = data1; g1 = data1; b1 = data1; + r1 &= 0xf; g1 &= 0xf0; b1 &= 0xf00; + r1 -= r0; g1 -= g0; b1 -= b0; + r1 *= blend; g1 *= blend; b1 *= blend; + r1 >>= 10; g1 >>= 10; b1 >>= 10; + r0 += r1; g0 += g1; b0 += b1; + g0 &= 0xf0; b0 &= 0xf00; + + r0 |= g0; + r0 |= b0; + + return(r0); +} + +WRITE16_MEMBER(wecleman_state::wecleman_protection_w) +{ + if (offset == 2) m_prot_state = data & 0x2000; + if (!m_prot_state) COMBINE_DATA(m_protection_ram + offset); +} + + + +/* 140005.b (WEC Le Mans 24 Schematics) + + COMMAND + ___|____ +| CK 8|--/ 7 +| LS273 7| TV-KILL 6 +| 6| SCR-VCNT 5 +| 5| SCR-HCNT 4 +| 5H 4| SOUND-RST 3 +| 3| SOUND-ON 2 +| 2| NSUBRST 1 +| 1| SUBINT 0 +|__CLR___| + | + NEXRES + + Schems: SUBRESET does a RST+HALT + Sub CPU IRQ 4 generated by SUBINT, no other IRQs +*/ +WRITE16_MEMBER(wecleman_state::irqctrl_w) +{ + if (ACCESSING_BITS_0_7) + { + // logerror("CPU #0 - PC = %06X - $140005 <- %02X (old value: %02X)\n",space.device().safe_pc(), data&0xFF, old_data&0xFF); + + // Bit 0 : SUBINT + if ( (m_irqctrl & 1) && (!(data & 1)) ) // 1->0 transition + m_subcpu->set_input_line(4, HOLD_LINE); + + // Bit 1 : NSUBRST + if (data & 2) + m_subcpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + else + m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + + // Bit 2 : SOUND-ON + // Bit 3 : SOUNDRST + // Bit 4 : SCR-HCNT + // Bit 5 : SCR-VCNT + // Bit 6 : TV-KILL + m_irqctrl = data; // latch the value + } +} + +/* 140003.b (usually paired with a write to 140021.b) + + Bit: + + 7------- ? + -65----- input selection (0-3) + ---43--- ? + -----2-- start light + ------10 ? out 1/2 + +*/ +WRITE16_MEMBER(wecleman_state::selected_ip_w) +{ + if (ACCESSING_BITS_0_7) m_selected_ip = data & 0xff; // latch the value +} + +/* $140021.b - Return the previously selected input port's value */ +READ16_MEMBER(wecleman_state::selected_ip_r) +{ + switch ( (m_selected_ip >> 5) & 3 ) + { // From WEC Le Mans Schems: + case 0: return ioport("ACCEL")->read(); // Accel - Schems: Accelevr + case 1: return ~0; // ????? - Schems: Not Used + case 2: return ioport("STEER")->read(); // Wheel - Schems: Handlevr + case 3: return ~0; // Table - Schems: Turnvr + + default: return ~0; + } +} + +/* Word Blitter - Copies data around (Work RAM, Sprite RAM etc.) + It's fed with a list of blits to do + + Offset: + + 00.b ? Number of words - 1 to add to address per transfer + 01.b ? logic function / blit mode + 02.w ? (always 0) + 04.l Source address (Base address of source data) + 08.l List of blits address + 0c.l Destination address + 01.b ? Number of transfers + 10.b Triggers the blit + 11.b Number of words per transfer + + The list contains 4 bytes per blit: + + + Offset: + + 00.w ? + 02.w offset from Base address + + + Note: + + Hot Chase explicitly copies color information from sprite parameters back to list[4n+1](byte ptr) + and that tips me off where the colors are actually encoded. List[4n+0] is believed to hold the + sprites' depth value. Wec Le Mans will z-sort the sprites before writing them to video RAM but + the order is not always right. It is possible the video hardware performs additional sorting. + + The color code in the original sprite encoding has special meanings on the other hand. I'll take + a shortcut by manually copying list[0] and list[1] to sprite RAM for further process. +*/ +WRITE16_MEMBER(wecleman_state::blitter_w) +{ + COMBINE_DATA(&m_blitter_regs[offset]); + + /* do a blit if $80010.b has been written */ + if ( (offset == 0x10/2) && (ACCESSING_BITS_8_15) ) + { + /* 80000.b = ?? usually 0 - other values: 02 ; 00 - ? logic function ? */ + /* 80001.b = ?? usually 0 - other values: 3f ; 01 - ? height ? */ + int minterm = ( m_blitter_regs[0x0/2] & 0xFF00 ) >> 8; + int list_len = ( m_blitter_regs[0x0/2] & 0x00FF ) >> 0; + + /* 80002.w = ?? always 0 - ? increment per horizontal line ? */ + /* no proof at all, it's always 0 */ + //int srcdisp = m_blitter_regs[0x2/2] & 0xFF00; + //int destdisp = m_blitter_regs[0x2/2] & 0x00FF; + + /* 80004.l = source data address */ + int src = ( m_blitter_regs[0x4/2] << 16 ) + m_blitter_regs[0x6/2]; + + /* 80008.l = list of blits address */ + int list = ( m_blitter_regs[0x8/2] << 16 ) + m_blitter_regs[0xA/2]; + + /* 8000C.l = destination address */ + int dest = ( m_blitter_regs[0xC/2] << 16 ) + m_blitter_regs[0xE/2]; + + /* 80010.b = number of words to move */ + int size = ( m_blitter_regs[0x10/2] ) & 0x00FF; + + /* Word aligned transfers only ?? */ + src &= (~1); list &= (~1); dest &= (~1); + + /* Two minterms / blit modes are used */ + if (minterm != 2) + { + /* One single blit */ + for ( ; size > 0 ; size--) + { + /* maybe slower than a memcpy but safer (and errors are logged) */ + space.write_word(dest, space.read_word(src)); + src += 2; + dest += 2; + } + } + else + { + /* Number of blits in the list */ + for ( ; list_len > 0 ; list_len-- ) + { + int i, j, destptr; + + /* Read offset of source from the list of blits */ + i = src + space.read_word(list+2); + j = i + (size<<1); + destptr = dest; + + for (; i<j; destptr+=2, i+=2) + space.write_word(destptr, space.read_word(i)); + + destptr = dest + 14; + i = space.read_word(list) + m_spr_color_offs; + space.write_word(destptr, i); + + dest += 16; + list += 4; + } + + /* hack for the blit to Sprites RAM - Sprite list end-marker */ + space.write_word(dest, 0xFFFF); + } + } +} + + +/*************************************************************************** + WEC Le Mans 24 Main CPU Handlers +***************************************************************************/ + +static ADDRESS_MAP_START( wecleman_map, AS_PROGRAM, 16, wecleman_state ) + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM (03c000-03ffff used as RAM sometimes!) + AM_RANGE(0x040494, 0x040495) AM_WRITE(wecleman_videostatus_w) AM_SHARE("videostatus") // cloud blending control (HACK) + AM_RANGE(0x040000, 0x043fff) AM_RAM // RAM + AM_RANGE(0x060000, 0x060005) AM_WRITE(wecleman_protection_w) AM_SHARE("protection_ram") + AM_RANGE(0x060006, 0x060007) AM_READ(wecleman_protection_r) // MCU read + AM_RANGE(0x080000, 0x080011) AM_RAM_WRITE(blitter_w) AM_SHARE("blitter_regs") // Blitter + AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(wecleman_pageram_w) AM_SHARE("pageram") // Background Layers + AM_RANGE(0x108000, 0x108fff) AM_RAM_WRITE(wecleman_txtram_w) AM_SHARE("txtram") // Text Layer + AM_RANGE(0x110000, 0x110fff) AM_RAM_WRITE(wecleman_paletteram16_SSSSBBBBGGGGRRRR_word_w) AM_SHARE("paletteram") + AM_RANGE(0x124000, 0x127fff) AM_RAM AM_SHARE("share1") // Shared with main CPU + AM_RANGE(0x130000, 0x130fff) AM_RAM AM_SHARE("spriteram") // Sprites + AM_RANGE(0x140000, 0x140001) AM_WRITE(wecleman_soundlatch_w) // To sound CPU + AM_RANGE(0x140002, 0x140003) AM_WRITE(selected_ip_w) // Selects accelerator / wheel / .. + AM_RANGE(0x140004, 0x140005) AM_WRITE(irqctrl_w) // Main CPU controls the other CPUs + AM_RANGE(0x140006, 0x140007) AM_WRITENOP // Watchdog reset + AM_RANGE(0x140010, 0x140011) AM_READ_PORT("IN0") // Coins + brake + gear + AM_RANGE(0x140012, 0x140013) AM_READ_PORT("IN1") // ?? + AM_RANGE(0x140014, 0x140015) AM_READ_PORT("DSWA") // DSW 2 + AM_RANGE(0x140016, 0x140017) AM_READ_PORT("DSWB") // DSW 1 + AM_RANGE(0x140020, 0x140021) AM_WRITEONLY // Paired with writes to $140003 + AM_RANGE(0x140020, 0x140021) AM_READ(selected_ip_r) // Accelerator or Wheel or .. + AM_RANGE(0x140030, 0x140031) AM_WRITENOP // toggles between 0 & 1 on hitting bumps and crashes (vibration?) +ADDRESS_MAP_END + + +/*************************************************************************** + Hot Chase Main CPU Handlers +***************************************************************************/ + + + +static ADDRESS_MAP_START( hotchase_map, AS_PROGRAM, 16, wecleman_state ) + AM_RANGE(0x000000, 0x03ffff) AM_ROM + AM_RANGE(0x040000, 0x041fff) AM_RAM // RAM + AM_RANGE(0x060000, 0x063fff) AM_RAM // RAM + AM_RANGE(0x080000, 0x080011) AM_RAM_WRITE(blitter_w) AM_SHARE("blitter_regs") // Blitter + AM_RANGE(0x100000, 0x100fff) AM_DEVREADWRITE8("k051316_1", k051316_device, read, write, 0x00ff) // Background + AM_RANGE(0x101000, 0x10101f) AM_DEVWRITE8("k051316_1", k051316_device, ctrl_w, 0x00ff) // Background Ctrl + AM_RANGE(0x102000, 0x102fff) AM_DEVREADWRITE8("k051316_2", k051316_device, read, write, 0x00ff) // Foreground + AM_RANGE(0x103000, 0x10301f) AM_DEVWRITE8("k051316_2", k051316_device, ctrl_w, 0x00ff) // Foreground Ctrl + AM_RANGE(0x110000, 0x111fff) AM_RAM_WRITE(hotchase_paletteram16_SBGRBBBBGGGGRRRR_word_w) AM_SHARE("paletteram") + AM_RANGE(0x120000, 0x123fff) AM_RAM AM_SHARE("share1") // Shared with sub CPU + AM_RANGE(0x130000, 0x130fff) AM_RAM AM_SHARE("spriteram") // Sprites + AM_RANGE(0x140000, 0x140001) AM_WRITE(hotchase_soundlatch_w) // To sound CPU + AM_RANGE(0x140002, 0x140003) AM_WRITE(selected_ip_w) // Selects accelerator / wheel / + AM_RANGE(0x140004, 0x140005) AM_WRITE(irqctrl_w) // Main CPU controls the other CPUs + AM_RANGE(0x140006, 0x140007) AM_READNOP // Watchdog reset + AM_RANGE(0x140010, 0x140011) AM_READ_PORT("IN0") // Coins + brake + gear + AM_RANGE(0x140012, 0x140013) AM_READ_PORT("IN1") // ?? bit 4 from sound cpu + AM_RANGE(0x140014, 0x140015) AM_READ_PORT("DSW2") // DSW 2 + AM_RANGE(0x140016, 0x140017) AM_READ_PORT("DSW1") // DSW 1 + AM_RANGE(0x140020, 0x140021) AM_READ(selected_ip_r) AM_WRITENOP // Paired with writes to $140003 + AM_RANGE(0x140022, 0x140023) AM_READNOP // ?? + AM_RANGE(0x140030, 0x140031) AM_WRITENOP // signal to cabinet vibration motors? +ADDRESS_MAP_END + + +/*************************************************************************** + WEC Le Mans 24 Sub CPU Handlers +***************************************************************************/ + +static ADDRESS_MAP_START( wecleman_sub_map, AS_PROGRAM, 16, wecleman_state ) + AM_RANGE(0x000000, 0x00ffff) AM_ROM // ROM + AM_RANGE(0x060000, 0x060fff) AM_RAM AM_SHARE("roadram") // Road + AM_RANGE(0x070000, 0x073fff) AM_RAM AM_SHARE("share1") // RAM (Shared with main CPU) +ADDRESS_MAP_END + + +/*************************************************************************** + Hot Chase Sub CPU Handlers +***************************************************************************/ + +static ADDRESS_MAP_START( hotchase_sub_map, AS_PROGRAM, 16, wecleman_state ) + AM_RANGE(0x000000, 0x01ffff) AM_ROM // ROM + AM_RANGE(0x020000, 0x020fff) AM_RAM AM_SHARE("roadram") // Road + AM_RANGE(0x040000, 0x043fff) AM_RAM AM_SHARE("share1") // Shared with main CPU + AM_RANGE(0x060000, 0x060fff) AM_RAM // a table, presumably road related + AM_RANGE(0x061000, 0x06101f) AM_RAM // road vregs? +ADDRESS_MAP_END + + +/*************************************************************************** + WEC Le Mans 24 Sound CPU Handlers +***************************************************************************/ + +/* 140001.b */ +WRITE16_MEMBER(wecleman_state::wecleman_soundlatch_w) +{ + if (ACCESSING_BITS_0_7) + { + soundlatch_byte_w(space, 0, data & 0xFF); + m_audiocpu->set_input_line(0, HOLD_LINE); + } +} + +/* Protection - an external multiplyer connected to the sound CPU */ +READ8_MEMBER(wecleman_state::multiply_r) +{ + return (m_multiply_reg[0] * m_multiply_reg[1]) & 0xFF; +} + +WRITE8_MEMBER(wecleman_state::multiply_w) +{ + m_multiply_reg[offset] = data; +} + +/* K007232 registers reminder: + +[Ch A] [Ch B] [Meaning] +00 06 address step (low byte) +01 07 address step (high byte, max 1) +02 08 sample address (low byte) +03 09 sample address (mid byte) +04 0a sample address (high byte, max 1 -> max rom size: $20000) +05 0b Reading this byte triggers the sample + +[Ch A & B] +0c volume +0d play sample once or looped (2 channels -> 2 bits (0&1)) + +** sample playing ends when a byte with bit 7 set is reached **/ + +WRITE8_MEMBER(wecleman_state::wecleman_volume_callback) +{ + m_k007232->set_volume(0, (data >> 4) * 0x11, 0); + m_k007232->set_volume(1, 0, (data & 0x0f) * 0x11); +} + +WRITE8_MEMBER(wecleman_state::wecleman_K00723216_bank_w) +{ + m_k007232->set_bank(0, ~data&1 ); //* (wecleman062gre) +} + +static ADDRESS_MAP_START( wecleman_sound_map, AS_PROGRAM, 8, wecleman_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x83ff) AM_RAM + AM_RANGE(0x8500, 0x8500) AM_WRITENOP // incresed with speed (global volume)? + AM_RANGE(0x9000, 0x9000) AM_READ(multiply_r) // Protection + AM_RANGE(0x9000, 0x9001) AM_WRITE(multiply_w) // Protection + AM_RANGE(0x9006, 0x9006) AM_WRITENOP // ? + AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r) // From main CPU + AM_RANGE(0xb000, 0xb00d) AM_DEVREADWRITE("k007232", k007232_device, read, write) // K007232 (Reading offset 5/b triggers the sample) + AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) + AM_RANGE(0xf000, 0xf000) AM_WRITE(wecleman_K00723216_bank_w) // Samples banking +ADDRESS_MAP_END + + +/*************************************************************************** + Hot Chase Sound CPU Handlers +***************************************************************************/ + +/* 140001.b */ +WRITE16_MEMBER(wecleman_state::hotchase_soundlatch_w) +{ + if (ACCESSING_BITS_0_7) + { + soundlatch_byte_w(space, 0, data & 0xFF); + m_audiocpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE); + } +} + +WRITE8_MEMBER(wecleman_state::hotchase_sound_control_w) +{ +// int reg[8]; + + +// reg[offset] = data; + + switch (offset) + { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + /* change volume + offset 00000xxx----- channel select (0:channel 0, 1:channel 1) + ++------ chip select ( 0:chip 1, 1:chip2, 2:chip3) + data&0x0f left volume (data>>4)&0x0f right volume + */ + m_k007232_1->set_volume( offset&1, (data&0x0f) * 0x08, (data>>4) * 0x08 ); + m_k007232_2->set_volume( offset&1, (data&0x0f) * 0x08, (data>>4) * 0x08 ); + m_k007232_3->set_volume( offset&1, (data&0x0f) * 0x08, (data>>4) * 0x08 ); + break; + + case 0x06: /* Bankswitch for chips 0 & 1 */ + { + int bank0_a = (data >> 1) & 1; + int bank1_a = (data >> 2) & 1; + int bank0_b = (data >> 3) & 1; + int bank1_b = (data >> 4) & 1; + // bit 6: chip 2 - ch0 ? + // bit 7: chip 2 - ch1 ? + + m_k007232_1->set_bank( bank0_a, bank0_b ); + m_k007232_2->set_bank( bank1_a, bank1_b ); + } + break; + + case 0x07: /* Bankswitch for chip 2 */ + { + int bank2_a = (data >> 0) & 7; + int bank2_b = (data >> 3) & 7; + + m_k007232_3->set_bank( bank2_a, bank2_b ); + } + break; + } +} + +/* Read and write handlers for one K007232 chip: + even and odd register are mapped swapped */ +READ8_MEMBER(wecleman_state::hotchase_1_k007232_r) +{ + return m_k007232_1->read(space, offset ^ 1); +} + +WRITE8_MEMBER(wecleman_state::hotchase_1_k007232_w) +{ + m_k007232_1->write(space, offset ^ 1, data); +} + +READ8_MEMBER(wecleman_state::hotchase_2_k007232_r) +{ + return m_k007232_2->read(space, offset ^ 1); +} + +WRITE8_MEMBER(wecleman_state::hotchase_2_k007232_w) +{ + m_k007232_2->write(space, offset ^ 1, data); +} + +READ8_MEMBER(wecleman_state::hotchase_3_k007232_r) +{ + return m_k007232_3->read(space, offset ^ 1); +} + +WRITE8_MEMBER(wecleman_state::hotchase_3_k007232_w) +{ + m_k007232_3->write(space, offset ^ 1, data); +} + +static ADDRESS_MAP_START( hotchase_sound_map, AS_PROGRAM, 8, wecleman_state ) + AM_RANGE(0x0000, 0x07ff) AM_RAM + AM_RANGE(0x1000, 0x100d) AM_READWRITE(hotchase_1_k007232_r, hotchase_1_k007232_w) // 3 x K007232 + AM_RANGE(0x2000, 0x200d) AM_READWRITE(hotchase_2_k007232_r, hotchase_2_k007232_w) + AM_RANGE(0x3000, 0x300d) AM_READWRITE(hotchase_3_k007232_r, hotchase_3_k007232_w) + AM_RANGE(0x4000, 0x4007) AM_WRITE(hotchase_sound_control_w) // Sound volume, banking, etc. + AM_RANGE(0x5000, 0x5000) AM_WRITENOP // ? (written with 0 on IRQ, 1 on FIRQ) + AM_RANGE(0x6000, 0x6000) AM_READ(soundlatch_byte_r) // From main CPU (Read on IRQ) + AM_RANGE(0x7000, 0x7000) AM_WRITENOP // Command acknowledge ? + AM_RANGE(0x8000, 0xffff) AM_ROM +ADDRESS_MAP_END + + +/*************************************************************************** + WEC Le Mans 24 Input Ports +***************************************************************************/ + +static INPUT_PORTS_START( wecleman ) + PORT_START("IN0") /* $140011.b */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) + PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_HIGH ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shift") PORT_TOGGLE + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Brake") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN1") /* Motor? - $140013.b */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) // right sw + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) // left sw + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE4 ) // thermo + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) // from sound cpu ? + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSWA") /* $140015.b */ + PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x50, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x40, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x70, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0x00, "No Coin B" ) + /* "No Coin B" = coins produce sound, but no effect on coin counter */ + + PORT_START("DSWB") /* $140017.b */ + PORT_DIPNAME( 0x01, 0x01, "Speed Unit" ) + PORT_DIPSETTING( 0x01, "km/h" ) + PORT_DIPSETTING( 0x00, "mph" ) + PORT_DIPNAME( 0x02, 0x02, "Unknown B-1" ) // single + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "Unknown B-2" ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x18, DEF_STR( Easy ) ) // 66 seconds at the start + PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) // 64 + PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // 62 + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // 60 + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "Unknown B-6" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Unknown B-7" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACCEL") /* Accelerator - $140021.b (0) */ + PORT_BIT( 0xff, 0, IPT_PEDAL ) PORT_MINMAX(0,0x80) PORT_SENSITIVITY(30) PORT_KEYDELTA(10) + + PORT_START("STEER") /* Steering Wheel - $140021.b (2) */ + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(5) +INPUT_PORTS_END + + +/*************************************************************************** + Hot Chase Input Ports +***************************************************************************/ + +static INPUT_PORTS_START( hotchase ) + PORT_START("IN0") /* $140011.b */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_LOW ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shift") PORT_TOGGLE + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Brake") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN1") /* Motor? - $140013.b */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) // right sw + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) // left sw + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE4 ) // thermo + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) // from sound cpu ? + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW2") /* $140015.b */ + PORT_DIPNAME( 0x01, 0x01, "Speed Unit" ) + PORT_DIPSETTING( 0x01, "KM" ) + PORT_DIPSETTING( 0x00, "M.P.H." ) + PORT_DIPNAME( 0x02, 0x02, "Unknown 2-1" ) // single (wheel related) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "Unknown 2-2" ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x18, 0x18, "Unknown 2-3&4" ) // Most likely Difficulty + PORT_DIPSETTING( 0x18, "0" ) + PORT_DIPSETTING( 0x10, "4" ) + PORT_DIPSETTING( 0x08, "8" ) + PORT_DIPSETTING( 0x00, "c" ) + PORT_DIPNAME( 0x20, 0x20, "Unknown 2-5" ) // single + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + /* wheel <-> brake ; accel -> start */ + PORT_DIPNAME( 0x40, 0x40, "Unknown 2-6" ) // single (wheel<->brake) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW1") /* $140017.b */ + PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 5C_3C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x09, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x70, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0xa0, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 5C_3C ) ) + PORT_DIPSETTING( 0x60, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x50, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x90, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x00, "1 Coin/99 Credits" ) + + PORT_START("ACCEL") /* Accelerator - $140021.b (0) */ + PORT_BIT( 0xff, 0, IPT_PEDAL ) PORT_MINMAX(0,0x80) PORT_SENSITIVITY(30) PORT_KEYDELTA(10) + + PORT_START("STEER") /* Steering Wheel - $140021.b (2) */ + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(5) +INPUT_PORTS_END + + +/*************************************************************************** + WEC Le Mans 24 Graphics Layout +***************************************************************************/ + +static const gfx_layout wecleman_bg_layout = +{ + 8,8, + 8*0x8000*3/(8*8*3), + 3, + { 0,0x8000*8,0x8000*8*2 }, + {0,7,6,5,4,3,2,1}, + {0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8}, + 8*8 +}; + +static const UINT32 wecleman_road_layout_xoffset[64] = +{ + 0,7,6,5,4,3,2,1, + 8,15,14,13,12,11,10,9, + 16,23,22,21,20,19,18,17, + 24,31,30,29,28,27,26,25, + + 0+32,7+32,6+32,5+32,4+32,3+32,2+32,1+32, + 8+32,15+32,14+32,13+32,12+32,11+32,10+32,9+32, + 16+32,23+32,22+32,21+32,20+32,19+32,18+32,17+32, + 24+32,31+32,30+32,29+32,28+32,27+32,26+32,25+32 +}; + +/* We draw the road, made of 512 pixel lines, using 64x1 tiles */ +static const gfx_layout wecleman_road_layout = +{ + 64,1, + 8*0x4000*3/(64*1*3), + 3, + { 0x4000*8*2,0x4000*8*1,0x4000*8*0 }, + EXTENDED_XOFFS, + {0}, + 64*1, + wecleman_road_layout_xoffset, + NULL +}; + +static GFXDECODE_START( wecleman ) + // "gfx1" holds sprite, which are not decoded here + GFXDECODE_ENTRY( "gfx2", 0, wecleman_bg_layout, 0, 2048/8 ) // [0] bg + fg + txt + GFXDECODE_ENTRY( "gfx3", 0, wecleman_road_layout, 0, 2048/8 ) // [1] road +GFXDECODE_END + + +/*************************************************************************** + Hot Chase Graphics Layout +***************************************************************************/ + +static const UINT32 hotchase_road_layout_xoffset[64] = +{ + 0*4,0*4,1*4,1*4,2*4,2*4,3*4,3*4,4*4,4*4,5*4,5*4,6*4,6*4,7*4,7*4, + 8*4,8*4,9*4,9*4,10*4,10*4,11*4,11*4,12*4,12*4,13*4,13*4,14*4,14*4,15*4,15*4, + 16*4,16*4,17*4,17*4,18*4,18*4,19*4,19*4,20*4,20*4,21*4,21*4,22*4,22*4,23*4,23*4, + 24*4,24*4,25*4,25*4,26*4,26*4,27*4,27*4,28*4,28*4,29*4,29*4,30*4,30*4,31*4,31*4 +}; + +/* We draw the road, made of 512 pixel lines, using 64x1 tiles */ +/* tiles are doubled horizontally */ +static const gfx_layout hotchase_road_layout = +{ + 64,1, + RGN_FRAC(1,1), + 4, + { 0, 1, 2, 3 }, + EXTENDED_XOFFS, + {0}, + 32*4, + hotchase_road_layout_xoffset, + NULL +}; + +static GFXDECODE_START( hotchase ) + // "gfx1" holds sprite, which are not decoded here + // "gfx2" and 3 are for the 051316 + GFXDECODE_ENTRY( "gfx4", 0, hotchase_road_layout, 0x70*16, 16 ) // road +GFXDECODE_END + + +/*************************************************************************** + WEC Le Mans 24 Hardware Definitions +***************************************************************************/ + + +TIMER_DEVICE_CALLBACK_MEMBER(wecleman_state::wecleman_scanline) +{ + int scanline = param; + + if(scanline == 232) // vblank irq + m_maincpu->set_input_line(4, HOLD_LINE); + else if(((scanline % 64) == 0)) // timer irq TODO: timings + m_maincpu->set_input_line(5, HOLD_LINE); +} + +TIMER_DEVICE_CALLBACK_MEMBER(wecleman_state::hotchase_scanline) +{ + int scanline = param; + + if(scanline == 224) // vblank irq + m_maincpu->set_input_line(4, HOLD_LINE); + else if(((scanline % 64) == 0)) // timer irq TODO: timings + m_maincpu->set_input_line(5, HOLD_LINE); +} + + +MACHINE_RESET_MEMBER(wecleman_state,wecleman) +{ + m_k007232->set_bank( 0, 1 ); +} + +static MACHINE_CONFIG_START( wecleman, wecleman_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", M68000, 10000000) /* Schems show 10MHz */ + MCFG_CPU_PROGRAM_MAP(wecleman_map) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", wecleman_state, wecleman_scanline, "screen", 0, 1) + + MCFG_CPU_ADD("sub", M68000, 10000000) /* Schems show 10MHz */ + MCFG_CPU_PROGRAM_MAP(wecleman_sub_map) + + /* Schems: can be reset, no nmi, soundlatch, 3.58MHz */ + MCFG_CPU_ADD("audiocpu", Z80, 3579545) + MCFG_CPU_PROGRAM_MAP(wecleman_sound_map) + + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + + MCFG_MACHINE_RESET_OVERRIDE(wecleman_state,wecleman) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(320 +16, 256) + MCFG_SCREEN_VISIBLE_AREA(0 +8, 320-1 +8, 0 +8, 224-1 +8) + MCFG_SCREEN_UPDATE_DRIVER(wecleman_state, screen_update_wecleman) + + MCFG_GFXDECODE_ADD("gfxdecode", "palette", wecleman) + + MCFG_PALETTE_ADD("palette", 2048) + + MCFG_VIDEO_START_OVERRIDE(wecleman_state,wecleman) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_YM2151_ADD("ymsnd", 3579545) + MCFG_SOUND_ROUTE(0, "mono", 0.85) + MCFG_SOUND_ROUTE(1, "mono", 0.85) + + MCFG_SOUND_ADD("k007232", K007232, 3579545) + MCFG_K007232_PORT_WRITE_HANDLER(WRITE8(wecleman_state, wecleman_volume_callback)) + MCFG_SOUND_ROUTE(0, "mono", 0.20) + MCFG_SOUND_ROUTE(1, "mono", 0.20) +MACHINE_CONFIG_END + + +/*************************************************************************** + Hot Chase Hardware Definitions +***************************************************************************/ + +INTERRUPT_GEN_MEMBER(wecleman_state::hotchase_sound_timer) +{ + device.execute().set_input_line(M6809_FIRQ_LINE, HOLD_LINE); +} + +MACHINE_RESET_MEMBER(wecleman_state,hotchase) +{ + int i; + + /* TODO: PCB reference clearly shows that the POST has random/filled data on the paletteram. + For now let's fill everything with white colors until we have better info about it */ + for(i=0;i<0x2000/2;i++) + { + m_generic_paletteram_16[i] = 0xffff; + m_palette->set_pen_color(i,0xff,0xff,0xff); + } +} + + +static MACHINE_CONFIG_START( hotchase, wecleman_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", M68000, 10000000) /* 10 MHz - PCB is drawn in one set's readme */ + MCFG_CPU_PROGRAM_MAP(hotchase_map) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", wecleman_state, hotchase_scanline, "screen", 0, 1) + + MCFG_CPU_ADD("sub", M68000, 10000000) /* 10 MHz - PCB is drawn in one set's readme */ + MCFG_CPU_PROGRAM_MAP(hotchase_sub_map) + + MCFG_CPU_ADD("audiocpu", M6809, 3579545 / 2) /* 3.579/2 MHz - PCB is drawn in one set's readme */ + MCFG_CPU_PROGRAM_MAP(hotchase_sound_map) + MCFG_CPU_PERIODIC_INT_DRIVER(wecleman_state, hotchase_sound_timer, 496) + + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + + MCFG_MACHINE_RESET_OVERRIDE(wecleman_state,hotchase) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(320 +16, 256) + MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) + MCFG_SCREEN_UPDATE_DRIVER(wecleman_state, screen_update_hotchase) + MCFG_SCREEN_PALETTE("palette") + + MCFG_GFXDECODE_ADD("gfxdecode", "palette", hotchase) + MCFG_PALETTE_ADD("palette", 2048*2) + + MCFG_VIDEO_START_OVERRIDE(wecleman_state, hotchase) + + MCFG_DEVICE_ADD("k051316_1", K051316, 0) + MCFG_GFX_PALETTE("palette") + MCFG_K051316_OFFSETS(-0xb0 / 2, -16) + MCFG_K051316_WRAP(1) + MCFG_K051316_CB(wecleman_state, hotchase_zoom_callback_1) + + MCFG_DEVICE_ADD("k051316_2", K051316, 0) + MCFG_GFX_PALETTE("palette") + MCFG_K051316_OFFSETS(-0xb0 / 2, -16) + MCFG_K051316_CB(wecleman_state, hotchase_zoom_callback_2) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_SOUND_ADD("k007232_1", K007232, 3579545) + // SLEV not used, volume control is elsewhere + MCFG_SOUND_ROUTE(0, "mono", 0.20) + MCFG_SOUND_ROUTE(1, "mono", 0.20) + + MCFG_SOUND_ADD("k007232_2", K007232, 3579545) + // SLEV not used, volume control is elsewhere + MCFG_SOUND_ROUTE(0, "mono", 0.20) + MCFG_SOUND_ROUTE(1, "mono", 0.20) + + MCFG_SOUND_ADD("k007232_3", K007232, 3579545) + // SLEV not used, volume control is elsewhere + MCFG_SOUND_ROUTE(0, "mono", 0.20) + MCFG_SOUND_ROUTE(1, "mono", 0.20) +MACHINE_CONFIG_END + + +/*************************************************************************** + WEC Le Mans 24 ROM Definitions +***************************************************************************/ + +ROM_START( wecleman ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* Main CPU Code */ + ROM_LOAD16_BYTE( "602f08.17h", 0x00000, 0x10000, CRC(493b79d3) SHA1(9625e3b65c211d5081d8ed8977de287eff100842) ) + ROM_LOAD16_BYTE( "602f11.23h", 0x00001, 0x10000, CRC(6bb4f1fa) SHA1(2cfb7885b42b49dab9892e8dfd54914b64eeab06) ) + ROM_LOAD16_BYTE( "602a09.18h", 0x20000, 0x10000, CRC(8a9d756f) SHA1(12605e86ce29e6300b5400720baac7b0293d9e66) ) + ROM_LOAD16_BYTE( "602a10.22h", 0x20001, 0x10000, CRC(569f5001) SHA1(ec2dd331a279083cf847fbbe71c017038a1d562a) ) + + ROM_REGION( 0x10000, "sub", 0 ) /* Sub CPU Code */ + ROM_LOAD16_BYTE( "602a06.18a", 0x00000, 0x08000, CRC(e12c0d11) SHA1(991afd48bf1b2c303b975ce80c754e5972c39111) ) + ROM_LOAD16_BYTE( "602a07.20a", 0x00001, 0x08000, CRC(47968e51) SHA1(9b01b2c6a14dd80327a8f66a7f1994471a4bc38e) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU Code */ + ROM_LOAD( "602a01.6d", 0x00000, 0x08000, CRC(deafe5f1) SHA1(4cfbe2841233b1222c22160af7287b7a7821c3a0) ) + + ROM_REGION( 0x200000 * 2, "gfx1", 0 ) /* x2, do not dispose, zooming sprites */ + ROM_LOAD( "602a25.12e", 0x000000, 0x20000, CRC(0eacf1f9) SHA1(b4dcd457e68175ffee3da4aff23a241fe33eb500) ) + ROM_LOAD( "602a26.14e", 0x020000, 0x20000, CRC(2182edaf) SHA1(5ae4223a76b3c0be8f66458707f2e6f63fba0b13) ) + ROM_LOAD( "602a27.15e", 0x040000, 0x20000, CRC(b22f08e9) SHA1(1ba99bc4e00e206507e9bfafc989208d6ae6f8a3) ) + ROM_LOAD( "602a28.17e", 0x060000, 0x20000, CRC(5f6741fa) SHA1(9c81634f502da8682673b3b87efe0497af8abbd7) ) + ROM_LOAD( "602a21.6e", 0x080000, 0x20000, CRC(8cab34f1) SHA1(264df01460f44cd5ccdf3c8bd2d3f327874b69ea) ) + ROM_LOAD( "602a22.7e", 0x0a0000, 0x20000, CRC(e40303cb) SHA1(da943437ea2e208ea477f35bb05f77412ecdf9ac) ) + ROM_LOAD( "602a23.9e", 0x0c0000, 0x20000, CRC(75077681) SHA1(32ad10e9e32779c36bb50b402f5c6d941e293942) ) + ROM_LOAD( "602a24.10e", 0x0e0000, 0x20000, CRC(583dadad) SHA1(181ebe87095d739a5903c17ec851864e2275f571) ) + ROM_LOAD( "602a17.12c", 0x100000, 0x20000, CRC(31612199) SHA1(dff58ec3f7d98bfa7e9405f0f23647ff4ecfee62) ) + ROM_LOAD( "602a18.14c", 0x120000, 0x20000, CRC(3f061a67) SHA1(be57c38410c5635311d26afc44b3065e42fa12b7) ) + ROM_LOAD( "602a19.15c", 0x140000, 0x20000, CRC(5915dbc5) SHA1(61ab123c8a4128a18d7eb2cae99ad58203f03ffc) ) + ROM_LOAD( "602a20.17c", 0x160000, 0x20000, CRC(f87e4ef5) SHA1(4c2f0d036925a7ccd32aef3ca12b960a27247bc3) ) + ROM_LOAD( "602a13.6c", 0x180000, 0x20000, CRC(5d3589b8) SHA1(d146cb8511cfe825bdfe8296c7758545542a0faa) ) + ROM_LOAD( "602a14.7c", 0x1a0000, 0x20000, CRC(e3a75f6c) SHA1(80b20323e3560316ffbdafe4fd2f81326e103045) ) + ROM_LOAD( "602a15.9c", 0x1c0000, 0x20000, CRC(0d493c9f) SHA1(02690a1963cadd469bd67cb362384923916900a1) ) + ROM_LOAD( "602a16.10c", 0x1e0000, 0x20000, CRC(b08770b3) SHA1(41871e9261d08fd372b7deb72d939973fb694b54) ) + + ROM_REGION( 0x18000, "gfx2", 0 ) + ROM_LOAD( "602a31.26g", 0x000000, 0x08000, CRC(01fa40dd) SHA1(2b8aa97f5116f39ae6a8e46f109853d70e370884) ) // layers + ROM_LOAD( "602a30.24g", 0x008000, 0x08000, CRC(be5c4138) SHA1(7aee2ee17ef3e37399a60d9b019cfa733acbf07b) ) + ROM_LOAD( "602a29.23g", 0x010000, 0x08000, CRC(f1a8d33e) SHA1(ed6531f2fd4ad6835a879e9a5600387d8cad6d17) ) + + ROM_REGION( 0x0c000, "gfx3", 0 ) /* road */ + ROM_LOAD( "602a04.11e", 0x000000, 0x08000, CRC(ade9f359) SHA1(58db6be6217ed697827015e50e99e58602042a4c) ) + ROM_LOAD( "602a05.13e", 0x008000, 0x04000, CRC(f22b7f2b) SHA1(857389c57552c4e2237cb599f4c68c381430475e) ) // may also exist as 32KB with one half empty + + ROM_REGION( 0x40000, "k007232", 0 ) /* Samples (Channel A 0x20000=Channel B) */ + ROM_LOAD( "602a03.10a", 0x00000, 0x20000, CRC(31392b01) SHA1(0424747bc2015c9c93afd20e6a23083c0dcc4fb7) ) + ROM_LOAD( "602a02.8a", 0x20000, 0x20000, CRC(e2be10ae) SHA1(109c31bf7252c83a062d259143cd8299681db778) ) + + ROM_REGION( 0x04000, "user1", 0 ) /* extra data for road effects? */ + ROM_LOAD( "602a12.1a", 0x000000, 0x04000, CRC(77b9383d) SHA1(7cb970889677704d6324bb64aafc05326c4503ad) ) +ROM_END + +ROM_START( weclemana ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* Main CPU Code */ + // I doubt these labels are correct, or one set of roms is bad. + ROM_LOAD16_BYTE( "602f08.17h", 0x00000, 0x10000, CRC(43241265) SHA1(3da1ed0d15b03845c07f07ec6838ce160d81633d) ) // only 17h and 23h differ slightly from parent + ROM_LOAD16_BYTE( "602f11.23h", 0x00001, 0x10000, CRC(3ea7dae0) SHA1(d33d67f4cc65a7680e5f43407136b75512a10230) ) // " + ROM_LOAD16_BYTE( "602a09.18h", 0x20000, 0x10000, CRC(8a9d756f) SHA1(12605e86ce29e6300b5400720baac7b0293d9e66) ) + ROM_LOAD16_BYTE( "602a10.22h", 0x20001, 0x10000, CRC(569f5001) SHA1(ec2dd331a279083cf847fbbe71c017038a1d562a) ) + + ROM_REGION( 0x10000, "sub", 0 ) /* Sub CPU Code */ + ROM_LOAD16_BYTE( "602a06.18a", 0x00000, 0x08000, CRC(e12c0d11) SHA1(991afd48bf1b2c303b975ce80c754e5972c39111) ) + ROM_LOAD16_BYTE( "602a07.20a", 0x00001, 0x08000, CRC(47968e51) SHA1(9b01b2c6a14dd80327a8f66a7f1994471a4bc38e) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU Code */ + ROM_LOAD( "602a01.6d", 0x00000, 0x08000, CRC(deafe5f1) SHA1(4cfbe2841233b1222c22160af7287b7a7821c3a0) ) + + ROM_REGION( 0x200000 * 2, "gfx1", 0 ) /* x2, do not dispose, zooming sprites */ + ROM_LOAD( "602a25.12e", 0x000000, 0x20000, CRC(0eacf1f9) SHA1(b4dcd457e68175ffee3da4aff23a241fe33eb500) ) + ROM_LOAD( "602a26.14e", 0x020000, 0x20000, CRC(2182edaf) SHA1(5ae4223a76b3c0be8f66458707f2e6f63fba0b13) ) + ROM_LOAD( "602a27.15e", 0x040000, 0x20000, CRC(b22f08e9) SHA1(1ba99bc4e00e206507e9bfafc989208d6ae6f8a3) ) + ROM_LOAD( "602a28.17e", 0x060000, 0x20000, CRC(5f6741fa) SHA1(9c81634f502da8682673b3b87efe0497af8abbd7) ) + ROM_LOAD( "602a21.6e", 0x080000, 0x20000, CRC(8cab34f1) SHA1(264df01460f44cd5ccdf3c8bd2d3f327874b69ea) ) + ROM_LOAD( "602a22.7e", 0x0a0000, 0x20000, CRC(e40303cb) SHA1(da943437ea2e208ea477f35bb05f77412ecdf9ac) ) + ROM_LOAD( "602a23.9e", 0x0c0000, 0x20000, CRC(75077681) SHA1(32ad10e9e32779c36bb50b402f5c6d941e293942) ) + ROM_LOAD( "602a24.10e", 0x0e0000, 0x20000, CRC(583dadad) SHA1(181ebe87095d739a5903c17ec851864e2275f571) ) + ROM_LOAD( "602a17.12c", 0x100000, 0x20000, CRC(31612199) SHA1(dff58ec3f7d98bfa7e9405f0f23647ff4ecfee62) ) + ROM_LOAD( "602a18.14c", 0x120000, 0x20000, CRC(3f061a67) SHA1(be57c38410c5635311d26afc44b3065e42fa12b7) ) + ROM_LOAD( "602a19.15c", 0x140000, 0x20000, CRC(5915dbc5) SHA1(61ab123c8a4128a18d7eb2cae99ad58203f03ffc) ) + ROM_LOAD( "602a20.17c", 0x160000, 0x20000, CRC(f87e4ef5) SHA1(4c2f0d036925a7ccd32aef3ca12b960a27247bc3) ) + ROM_LOAD( "602a13.6c", 0x180000, 0x20000, CRC(5d3589b8) SHA1(d146cb8511cfe825bdfe8296c7758545542a0faa) ) + ROM_LOAD( "602a14.7c", 0x1a0000, 0x20000, CRC(e3a75f6c) SHA1(80b20323e3560316ffbdafe4fd2f81326e103045) ) + ROM_LOAD( "602a15.9c", 0x1c0000, 0x20000, CRC(0d493c9f) SHA1(02690a1963cadd469bd67cb362384923916900a1) ) + ROM_LOAD( "602a16.10c", 0x1e0000, 0x20000, CRC(b08770b3) SHA1(41871e9261d08fd372b7deb72d939973fb694b54) ) + + ROM_REGION( 0x18000, "gfx2", 0 ) + ROM_LOAD( "602a31.26g", 0x000000, 0x08000, CRC(01fa40dd) SHA1(2b8aa97f5116f39ae6a8e46f109853d70e370884) ) // layers + ROM_LOAD( "602a30.24g", 0x008000, 0x08000, CRC(be5c4138) SHA1(7aee2ee17ef3e37399a60d9b019cfa733acbf07b) ) + ROM_LOAD( "602a29.23g", 0x010000, 0x08000, CRC(f1a8d33e) SHA1(ed6531f2fd4ad6835a879e9a5600387d8cad6d17) ) + + ROM_REGION( 0x0c000, "gfx3", 0 ) /* road */ + ROM_LOAD( "602a04.11e", 0x000000, 0x08000, CRC(ade9f359) SHA1(58db6be6217ed697827015e50e99e58602042a4c) ) + ROM_LOAD( "602a05.13e", 0x008000, 0x04000, CRC(f22b7f2b) SHA1(857389c57552c4e2237cb599f4c68c381430475e) ) // may also exist as 32KB with one half empty + + ROM_REGION( 0x40000, "k007232", 0 ) /* Samples (Channel A 0x20000=Channel B) */ + ROM_LOAD( "602a03.10a", 0x00000, 0x20000, CRC(31392b01) SHA1(0424747bc2015c9c93afd20e6a23083c0dcc4fb7) ) + ROM_LOAD( "602a02.8a", 0x20000, 0x20000, CRC(e2be10ae) SHA1(109c31bf7252c83a062d259143cd8299681db778) ) + + ROM_REGION( 0x04000, "user1", 0 ) /* extra data for road effects? */ + ROM_LOAD( "602a12.1a", 0x000000, 0x04000, CRC(77b9383d) SHA1(7cb970889677704d6324bb64aafc05326c4503ad) ) +ROM_END +/* +early set V.1.26 +rom labels faded out, all other roms match +*/ +ROM_START( weclemanb ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* Main CPU Code */ + ROM_LOAD16_BYTE( "17h", 0x00000, 0x10000, CRC(66901326) SHA1(672aab497e9b94843451e016de6ca6d3c358362e) ) + ROM_LOAD16_BYTE( "23h", 0x00001, 0x10000, CRC(d9d492f4) SHA1(12c177fa5cc541be86431f314e96a4f3a74f95c6) ) + ROM_LOAD16_BYTE( "602a09.18h", 0x20000, 0x10000, CRC(8a9d756f) SHA1(12605e86ce29e6300b5400720baac7b0293d9e66) ) + ROM_LOAD16_BYTE( "602a10.22h", 0x20001, 0x10000, CRC(569f5001) SHA1(ec2dd331a279083cf847fbbe71c017038a1d562a) ) + + ROM_REGION( 0x10000, "sub", 0 ) /* Sub CPU Code */ + ROM_LOAD16_BYTE( "602a06.18a", 0x00000, 0x08000, CRC(e12c0d11) SHA1(991afd48bf1b2c303b975ce80c754e5972c39111) ) + ROM_LOAD16_BYTE( "602a07.20a", 0x00001, 0x08000, CRC(47968e51) SHA1(9b01b2c6a14dd80327a8f66a7f1994471a4bc38e) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU Code */ + ROM_LOAD( "602a01.6d", 0x00000, 0x08000, CRC(deafe5f1) SHA1(4cfbe2841233b1222c22160af7287b7a7821c3a0) ) + + ROM_REGION( 0x200000 * 2, "gfx1", 0 ) /* x2, do not dispose, zooming sprites */ + ROM_LOAD( "602a25.12e", 0x000000, 0x20000, CRC(0eacf1f9) SHA1(b4dcd457e68175ffee3da4aff23a241fe33eb500) ) + ROM_LOAD( "602a26.14e", 0x020000, 0x20000, CRC(2182edaf) SHA1(5ae4223a76b3c0be8f66458707f2e6f63fba0b13) ) + ROM_LOAD( "602a27.15e", 0x040000, 0x20000, CRC(b22f08e9) SHA1(1ba99bc4e00e206507e9bfafc989208d6ae6f8a3) ) + ROM_LOAD( "602a28.17e", 0x060000, 0x20000, CRC(5f6741fa) SHA1(9c81634f502da8682673b3b87efe0497af8abbd7) ) + ROM_LOAD( "602a21.6e", 0x080000, 0x20000, CRC(8cab34f1) SHA1(264df01460f44cd5ccdf3c8bd2d3f327874b69ea) ) + ROM_LOAD( "602a22.7e", 0x0a0000, 0x20000, CRC(e40303cb) SHA1(da943437ea2e208ea477f35bb05f77412ecdf9ac) ) + ROM_LOAD( "602a23.9e", 0x0c0000, 0x20000, CRC(75077681) SHA1(32ad10e9e32779c36bb50b402f5c6d941e293942) ) + ROM_LOAD( "602a24.10e", 0x0e0000, 0x20000, CRC(583dadad) SHA1(181ebe87095d739a5903c17ec851864e2275f571) ) + ROM_LOAD( "602a17.12c", 0x100000, 0x20000, CRC(31612199) SHA1(dff58ec3f7d98bfa7e9405f0f23647ff4ecfee62) ) + ROM_LOAD( "602a18.14c", 0x120000, 0x20000, CRC(3f061a67) SHA1(be57c38410c5635311d26afc44b3065e42fa12b7) ) + ROM_LOAD( "602a19.15c", 0x140000, 0x20000, CRC(5915dbc5) SHA1(61ab123c8a4128a18d7eb2cae99ad58203f03ffc) ) + ROM_LOAD( "602a20.17c", 0x160000, 0x20000, CRC(f87e4ef5) SHA1(4c2f0d036925a7ccd32aef3ca12b960a27247bc3) ) + ROM_LOAD( "602a13.6c", 0x180000, 0x20000, CRC(5d3589b8) SHA1(d146cb8511cfe825bdfe8296c7758545542a0faa) ) + ROM_LOAD( "602a14.7c", 0x1a0000, 0x20000, CRC(e3a75f6c) SHA1(80b20323e3560316ffbdafe4fd2f81326e103045) ) + ROM_LOAD( "602a15.9c", 0x1c0000, 0x20000, CRC(0d493c9f) SHA1(02690a1963cadd469bd67cb362384923916900a1) ) + ROM_LOAD( "602a16.10c", 0x1e0000, 0x20000, CRC(b08770b3) SHA1(41871e9261d08fd372b7deb72d939973fb694b54) ) + + ROM_REGION( 0x18000, "gfx2", 0 ) + ROM_LOAD( "602a31.26g", 0x000000, 0x08000, CRC(01fa40dd) SHA1(2b8aa97f5116f39ae6a8e46f109853d70e370884) ) // layers + ROM_LOAD( "602a30.24g", 0x008000, 0x08000, CRC(be5c4138) SHA1(7aee2ee17ef3e37399a60d9b019cfa733acbf07b) ) + ROM_LOAD( "602a29.23g", 0x010000, 0x08000, CRC(f1a8d33e) SHA1(ed6531f2fd4ad6835a879e9a5600387d8cad6d17) ) + + ROM_REGION( 0x0c000, "gfx3", 0 ) /* road */ + ROM_LOAD( "602a04.11e", 0x000000, 0x08000, CRC(ade9f359) SHA1(58db6be6217ed697827015e50e99e58602042a4c) ) + ROM_LOAD( "602a05.13e", 0x008000, 0x04000, CRC(f22b7f2b) SHA1(857389c57552c4e2237cb599f4c68c381430475e) ) // may also exist as 32KB with one half empty + + ROM_REGION( 0x40000, "k007232", 0 ) /* Samples (Channel A 0x20000=Channel B) */ + ROM_LOAD( "602a03.10a", 0x00000, 0x20000, CRC(31392b01) SHA1(0424747bc2015c9c93afd20e6a23083c0dcc4fb7) ) + ROM_LOAD( "602a02.8a", 0x20000, 0x20000, CRC(e2be10ae) SHA1(109c31bf7252c83a062d259143cd8299681db778) ) + + ROM_REGION( 0x04000, "user1", 0 ) /* extra data for road effects? */ + ROM_LOAD( "602a12.1a", 0x000000, 0x04000, CRC(77b9383d) SHA1(7cb970889677704d6324bb64aafc05326c4503ad) ) +ROM_END + +void wecleman_state::wecleman_unpack_sprites() +{ + const char *region = "gfx1"; // sprites + + const UINT32 len = memregion(region)->bytes(); + UINT8 *src = memregion(region)->base() + len / 2 - 1; + UINT8 *dst = memregion(region)->base() + len - 1; + + while(dst > src) + { + UINT8 data = *src--; + if( (data&0xf0) == 0xf0 ) data &= 0x0f; + if( (data&0x0f) == 0x0f ) data &= 0xf0; + *dst-- = data & 0xF; *dst-- = data >> 4; + } +} + +void wecleman_state::bitswap(UINT8 *src,size_t len,int _14,int _13,int _12,int _11,int _10,int _f,int _e,int _d,int _c,int _b,int _a,int _9,int _8,int _7,int _6,int _5,int _4,int _3,int _2,int _1,int _0) +{ + dynamic_buffer buffer(len); + int i; + + memcpy(&buffer[0],src,len); + for (i = 0;i < len;i++) + { + src[i] = + buffer[BITSWAP24(i,23,22,21,_14,_13,_12,_11,_10,_f,_e,_d,_c,_b,_a,_9,_8,_7,_6,_5,_4,_3,_2,_1,_0)]; + } +} + +/* Unpack sprites data and do some patching */ +DRIVER_INIT_MEMBER(wecleman_state,wecleman) +{ + int i, len; + UINT8 *RAM; +// UINT16 *RAM1 = (UINT16 *) memregion("maincpu")->base(); /* Main CPU patches */ +// RAM1[0x08c2/2] = 0x601e; // faster self test + + /* Decode GFX Roms - Compensate for the address lines scrambling */ + + /* Sprites - decrypting the sprites nearly KILLED ME! + It's been the main cause of the delay of this driver ... + I hope you'll appreciate this effort! */ + + /* let's swap even and odd *pixels* of the sprites */ + RAM = memregion("gfx1")->base(); + len = memregion("gfx1")->bytes(); + for (i = 0; i < len; i ++) + { + /* TODO: could be wrong, colors have to be fixed. */ + /* The only certain thing is that 87 must convert to f0 */ + /* otherwise stray lines appear, made of pens 7 & 8 */ + RAM[i] = BITSWAP8(RAM[i],7,0,1,2,3,4,5,6); + } + + bitswap(memregion("gfx1")->base(), memregion("gfx1")->bytes(), + 0,1,20,19,18,17,14,9,16,6,4,7,8,15,10,11,13,5,12,3,2); + + /* Now we can unpack each nibble of the sprites into a pixel (one byte) */ + wecleman_unpack_sprites(); + + /* Bg & Fg & Txt */ + bitswap(memregion("gfx2")->base(), memregion("gfx2")->bytes(), + 20,19,18,17,16,15,12,7,14,4,2,5,6,13,8,9,11,3,10,1,0); + + /* Road */ + bitswap(memregion("gfx3")->base(), memregion("gfx3")->bytes(), + 20,19,18,17,16,15,14,7,12,4,2,5,6,13,8,9,11,3,10,1,0); + + m_spr_color_offs = 0x40; +} + + +/*************************************************************************** + Hot Chase ROM Definitions +***************************************************************************/ + +ROM_START( hotchase ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* Main Code */ + ROM_LOAD16_BYTE( "763k05", 0x000000, 0x010000, CRC(f34fef0b) SHA1(9edaf6da988348cb32d5686fe7a67fb92b1c9777) ) + ROM_LOAD16_BYTE( "763k04", 0x000001, 0x010000, CRC(60f73178) SHA1(49c919d09fa464b205d7eccce337349e3a633a14) ) + ROM_LOAD16_BYTE( "763k03", 0x020000, 0x010000, CRC(28e3a444) SHA1(106b22a3cbe8301eac2e46674a267b96e72ac72f) ) + ROM_LOAD16_BYTE( "763k02", 0x020001, 0x010000, CRC(9510f961) SHA1(45b1920cab08a0dacd044c851d4e7f0cb5772b46) ) + + ROM_REGION( 0x20000, "sub", 0 ) /* Sub Code */ + ROM_LOAD16_BYTE( "763k07", 0x000000, 0x010000, CRC(ae12fa90) SHA1(7f76f09916fe152411b5af3c504ee7be07497ef4) ) + ROM_LOAD16_BYTE( "763k06", 0x000001, 0x010000, CRC(b77e0c07) SHA1(98bf492ac889d31419df706029fdf3d51b85c936) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound Code */ + ROM_LOAD( "763f01", 0x8000, 0x8000, CRC(4fddd061) SHA1(ff0aa18605612f6102107a6be1f93ae4c5edc84f) ) + + ROM_REGION( 0x300000 * 2, "gfx1", 0 ) /* x2, do not dispose, zooming sprites */ + ROM_LOAD16_WORD_SWAP( "763e17", 0x000000, 0x080000, CRC(8db4e0aa) SHA1(376cb3cae110998f2f9df7e6cdd35c06732fea69) ) + ROM_LOAD16_WORD_SWAP( "763e20", 0x080000, 0x080000, CRC(a22c6fce) SHA1(174fb9c1706c092947bcce386831acd33a237046) ) + ROM_LOAD16_WORD_SWAP( "763e18", 0x100000, 0x080000, CRC(50920d01) SHA1(313c7ecbd154b3f4c96f25c29a7734a9b3facea4) ) + ROM_LOAD16_WORD_SWAP( "763e21", 0x180000, 0x080000, CRC(77e0e93e) SHA1(c8e415438a1f5ad79b10fd3ad5cb22de0d562e5d) ) + ROM_LOAD16_WORD_SWAP( "763e19", 0x200000, 0x080000, CRC(a2622e56) SHA1(0a0ed9713882b987518e6f06a02dba417c1f4f32) ) + ROM_LOAD16_WORD_SWAP( "763e22", 0x280000, 0x080000, CRC(967c49d1) SHA1(01979d216a9fd8085298445ac5f7870d1598db74) ) + + ROM_REGION( 0x20000, "k051316_1", 0 ) /* bg */ + ROM_LOAD( "763e14", 0x000000, 0x020000, CRC(60392aa1) SHA1(8499eb40a246587e24f6fd00af2eaa6d75ee6363) ) + + ROM_REGION( 0x08000, "k051316_2", 0 ) /* fg */ + /* first half empty - PCB silkscreen reads "27256/27512" */ + ROM_LOAD( "763a13", 0x000000, 0x008000, CRC(8bed8e0d) SHA1(ccff330abc23fe499e76c16cab5783c3daf155dd) ) + ROM_CONTINUE( 0x000000, 0x008000 ) + + ROM_REGION( 0x20000, "gfx4", 0 ) /* road */ + ROM_LOAD( "763e15", 0x000000, 0x020000, CRC(7110aa43) SHA1(639dc002cc1580f0530bb5bb17f574e2258d5954) ) + + ROM_REGION( 0x40000, "k007232_1", 0 ) /* Samples, 2 banks */ + ROM_LOAD( "763e11", 0x000000, 0x040000, CRC(9d99a5a7) SHA1(96e37bbb259e0a91d124c26b6b1a9b70de2e19a4) ) + + ROM_REGION( 0x40000, "k007232_2", 0 ) /* Samples, 2 banks */ + ROM_LOAD( "763e10", 0x000000, 0x040000, CRC(ca409210) SHA1(703d7619c4bd33d2ff5fad127d98c82906fede33) ) + + ROM_REGION( 0x100000, "k007232_3", 0 ) /* Samples, 4 banks for each ROM */ + ROM_LOAD( "763e08", 0x000000, 0x080000, CRC(054a9a63) SHA1(45d7926c9e7af47c041ba9b733e334bccd730a6d) ) + ROM_LOAD( "763e09", 0x080000, 0x080000, CRC(c39857db) SHA1(64b135a9ccf9e1dd50789cdd5c6bc03da8decfd0) ) + + ROM_REGION( 0x08000, "user1", 0 ) /* extra data for road effects? */ + ROM_LOAD( "763a12", 0x000000, 0x008000, CRC(05f1e553) SHA1(8aaeb7374bd93038c24e6470398936f22cabb0fe) ) +ROM_END + +/* + +Hot Chase +Konami 1988 + + + + E08D E08B E09D E09B E10D E10B + E08A E08C E09A E09C E10A E10C + +GX763 350861 + + E09 E10 E11 + E08 07232 07232 + 07232 3.579MHz 2128 + 6809 P01.R10 + SW1 + SW2 2128 2128 + 6264 6264 6264 6264 + R02.P14 R03.R14 + 07770 R04.P16 R05.R16 + 2018-45 D06.E18 D07.H18 10MHz + 2018-45 68000-10 07641 68000-10 + +GX763 350860 + + 051316 PSAC 051316 PSAC A13.H5 A14.J5 + 2018-45 2018-R6 + 2018-45 + 2018-45 07558 + 051316 PSAC 2018-45 A12.R13 + + A15.H14 + + A23.B17 07634 + 07635 + 2018-45 2018-45 + 2018-45 2018-45 07557 + 2018-45 2018-45 25.2MHz + 2018-45 2018-45 + + +Left EPROM board + + E19A.A8 E19B.A7 E19C.A6 E19D.A5 +E22E.B12 E22F.B11 E22G.B10 E22H.B9 E19E.B8 E19F.B7 E19G.B6 E19H.B5 + E22A.D9 E22B.D7 E22C.D6 E22D.D5 + +Right EPROM board + +E21E E21F E21G E21H E17A E17B E17C E17D E18A E18B E18C E18D +E20E E20F E20G E20H E17E E17F E17G E17H E18E E18F E18G E18H + E20A E20B E20C E20D E21A E21B E21C E21D + +*/ + +// uses EPROM sub-boards in place of some of the MASK roms, different program too +ROM_START( hotchasea ) + ROM_REGION( 0x40000, "maincpu", 0 ) /* Main Code */ + ROM_LOAD16_BYTE( "763r05.r16", 0x000000, 0x010000, CRC(c880d5e4) SHA1(3c3ab3ad5496cfbc8de76620eedc06601ee7a8c7) ) + ROM_LOAD16_BYTE( "763r04.p16", 0x000001, 0x010000, CRC(b732ee2c) SHA1(b3d73cf5039980ac74927eef656326515fd2026b) ) + ROM_LOAD16_BYTE( "763r03.r14", 0x020000, 0x010000, CRC(13dd71de) SHA1(4b86b81ef79e0e92a1e458010b0b9574183a9c29) ) + ROM_LOAD16_BYTE( "763r02.p14", 0x020001, 0x010000, CRC(6cd1a18e) SHA1(0ddfe6a46e95052534325f228b7f0faba121950e) ) + + ROM_REGION( 0x20000, "sub", 0 ) /* Sub Code */ + ROM_LOAD16_BYTE( "763d07.h18", 0x000000, 0x010000, CRC(ae12fa90) SHA1(7f76f09916fe152411b5af3c504ee7be07497ef4) ) + ROM_LOAD16_BYTE( "763d06.e18", 0x000001, 0x010000, CRC(b77e0c07) SHA1(98bf492ac889d31419df706029fdf3d51b85c936) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound Code */ + ROM_LOAD( "763p01.r10", 0x8000, 0x8000, CRC(15dbca7b) SHA1(ac0c965b72a8579a3b60dbadfb942248d2cff2d8) ) + + ROM_REGION( 0x300000 * 2, "gfx1", 0 ) /* x2, do not dispose, zooming sprites */ + ROM_LOAD16_BYTE( "763e17a", 0x000000, 0x010000, CRC(8542d7d7) SHA1(a7c8aa7d8e0cabdc5269eb7adff944aaa0f819b6) ) + ROM_LOAD16_BYTE( "763e17e", 0x000001, 0x010000, CRC(4b4d919c) SHA1(0364eb74da8db7238888274d12011de876662d5a) ) + ROM_LOAD16_BYTE( "763e17b", 0x020000, 0x010000, CRC(ba9d7e72) SHA1(3af618087dcc66552ffabaf655f97b20e597122c) ) + ROM_LOAD16_BYTE( "763e17f", 0x020001, 0x010000, CRC(582400bb) SHA1(9479e45087d908c9b20392dba2a752a7ec1482e2) ) + ROM_LOAD16_BYTE( "763e17c", 0x040000, 0x010000, CRC(0ed292f8) SHA1(8c161e73c7f27925377799f67585b888bade6d82) ) + ROM_LOAD16_BYTE( "763e17g", 0x040001, 0x010000, CRC(35b27ed7) SHA1(e17e7674ee210ff340482a16dce3439b55c29f72) ) + ROM_LOAD16_BYTE( "763e17d", 0x060000, 0x010000, CRC(0166d00d) SHA1(e58f6deabc5743f6610252242f97bd5e973316ae) ) + ROM_LOAD16_BYTE( "763e17h", 0x060001, 0x010000, CRC(e5b8e8e6) SHA1(ae1349977559ff24dcd1678d6fd3a3e118612d07) ) + ROM_LOAD16_BYTE( "763e20a", 0x080000, 0x010000, CRC(256fe63c) SHA1(414325f2ff9abc411e2401dddd216e1a4de8a01e) ) + ROM_LOAD16_BYTE( "763e20e", 0x080001, 0x010000, CRC(ee8ca7e1) SHA1(fee544d6508f4106176f39e3765961e9f80fe620) ) + ROM_LOAD16_BYTE( "763e20b", 0x0a0000, 0x010000, CRC(b6714c24) SHA1(88f6437e181f36b7e44f1c70872314d8c0cc30e7) ) + ROM_LOAD16_BYTE( "763e20f", 0x0a0001, 0x010000, CRC(9dbc4b21) SHA1(31559903707a4f8ba3b044e8aad928de38403dcf) ) + ROM_LOAD16_BYTE( "763e20c", 0x0c0000, 0x010000, CRC(5173ad9b) SHA1(afe82c69f7036c7595f1a56b22176ba202b00b5c) ) + ROM_LOAD16_BYTE( "763e20g", 0x0c0001, 0x010000, CRC(b8c77f99) SHA1(e3bea1481c5b1c4733130651f9cf18587d3efc46) ) + ROM_LOAD16_BYTE( "763e20d", 0x0e0000, 0x010000, CRC(4ebdba32) SHA1(ac7daa291c82f75b09faf7bc5f6257870cc46061) ) + ROM_LOAD16_BYTE( "763e20h", 0x0e0001, 0x010000, CRC(0a428654) SHA1(551026f6f57d38aedd3498cce33af7bb2cf07184) ) + ROM_LOAD16_BYTE( "763e18a", 0x100000, 0x010000, CRC(09748099) SHA1(1821e2067b9a50a0638c8d105c617f4030d61877) ) + ROM_LOAD16_BYTE( "763e18e", 0x100001, 0x010000, CRC(049d4fcf) SHA1(aed18297677a3bb0b7197f59ea329aef9b678c01) ) + ROM_LOAD16_BYTE( "763e18b", 0x120000, 0x010000, CRC(ed0c3369) SHA1(84f336546dee01fec31c9c256ee00a9f8448cea4) ) + ROM_LOAD16_BYTE( "763e18f", 0x120001, 0x010000, CRC(b596a9ce) SHA1(dea0fe1c3386b5f0d19df4467f42d077678ae220) ) + ROM_LOAD16_BYTE( "763e18c", 0x140000, 0x010000, CRC(5a278291) SHA1(05c529baa68ef5877a28901c6f221e3d3593735f) ) + ROM_LOAD16_BYTE( "763e18g", 0x140001, 0x010000, CRC(aa7263cd) SHA1(b2acf66c02faf7777c5cb947aaf8e038f29c0f2e) ) + ROM_LOAD16_BYTE( "763e18d", 0x160000, 0x010000, CRC(b0b79a71) SHA1(46d0f17b7a6e4fb94ac9b8335bc598339d7707a5) ) + ROM_LOAD16_BYTE( "763e18h", 0x160001, 0x010000, CRC(a18b9127) SHA1(890971d2922a59ff4beea00238e710c8d3e0f19d) ) + ROM_LOAD16_BYTE( "763e21a", 0x180000, 0x010000, CRC(60788c29) SHA1(4faaa192d07f6acac0e7d11676146ecd0e71541f) ) + ROM_LOAD16_BYTE( "763e21e", 0x180001, 0x010000, CRC(844799ff) SHA1(8dc3ae3bb30ecb4e921a5b2068d3cd9421577844) ) + ROM_LOAD16_BYTE( "763e21b", 0x1a0000, 0x010000, CRC(1eefed61) SHA1(9c09dbff073d63384bf1ec9df4db4833afa33826) ) + ROM_LOAD16_BYTE( "763e21f", 0x1a0001, 0x010000, CRC(3aacfb10) SHA1(fb3eebf1f0850ed2f8f02cd4b5b564524e391afd) ) + ROM_LOAD16_BYTE( "763e21c", 0x1c0000, 0x010000, CRC(97e48b37) SHA1(864c73f48d839c2afeecec99605be6111f450ddd) ) + ROM_LOAD16_BYTE( "763e21g", 0x1c0001, 0x010000, CRC(74fefb12) SHA1(7746918c3ea8981c9cb2ead79a252939ba8bde3f) ) + ROM_LOAD16_BYTE( "763e21d", 0x1e0000, 0x010000, CRC(dd41569e) SHA1(065ee2de9ad6980788807cb563feccef1c3d1b9d) ) + ROM_LOAD16_BYTE( "763e21h", 0x1e0001, 0x010000, CRC(7ea52bf6) SHA1(2be93f88ccdea989b05beca13ebbfb77626ea41f) ) + ROM_LOAD16_BYTE( "763e19a", 0x200000, 0x010000, CRC(8c912c46) SHA1(e314edc39c32471c6fa2969e7c5c771c19fda88c) ) + ROM_LOAD16_BYTE( "763e19e", 0x200001, 0x010000, CRC(0eb34787) SHA1(9b8145dae210a177585e672fce30339b39c3c0f3) ) + ROM_LOAD16_BYTE( "763e19b", 0x220000, 0x010000, CRC(79960729) SHA1(f5c20ed7683aad8a435c292fbd5a1acc2a97ecee) ) + ROM_LOAD16_BYTE( "763e19f", 0x220001, 0x010000, CRC(1764ec5f) SHA1(4f7a0a3667087523a1ccdfc2d0e54a520f1216b3) ) + ROM_LOAD16_BYTE( "763e19c", 0x240000, 0x010000, CRC(f13377ac) SHA1(89f8d730cb457cc9cf55049b7002514302b2b04f) ) + ROM_LOAD16_BYTE( "763e19g", 0x240001, 0x010000, CRC(f2102e89) SHA1(41ff5d8904618a77c7c3c78c52c6f1b9c5a318fd) ) + ROM_LOAD16_BYTE( "763e19d", 0x260000, 0x010000, CRC(0b2a19f4) SHA1(3689b2c1f6227224fbcecc0d2470048a99510794) ) + ROM_LOAD16_BYTE( "763e19h", 0x260001, 0x010000, CRC(cd6d08a5) SHA1(ce13a8bba84f24e7d1fb25254e2e95f591fe1d67) ) + ROM_LOAD16_BYTE( "763e22a", 0x280000, 0x010000, CRC(16eec250) SHA1(f50375f207575e9d280285aca493902afbb7d729) ) + ROM_LOAD16_BYTE( "763e22e", 0x280001, 0x010000, CRC(c184b1c0) SHA1(d765e6eb2631b77dff5331840ac2a99cf1250362) ) + ROM_LOAD16_BYTE( "763e22b", 0x2a0000, 0x010000, CRC(1afe4b0c) SHA1(ce5a855291b443c1e16dbf54730960600c754fee) ) + ROM_LOAD16_BYTE( "763e22f", 0x2a0001, 0x010000, CRC(61f27c98) SHA1(d80af1a3e424c8dbab4fd21d494a0580ab96cd8d) ) + ROM_LOAD16_BYTE( "763e22c", 0x2c0000, 0x010000, CRC(c19b4b63) SHA1(93708b8769c44d5b93dcd2928a0d1120cc52c6ee) ) + ROM_LOAD16_BYTE( "763e22g", 0x2c0001, 0x010000, CRC(5bcbaf29) SHA1(621aa19606a15abb1539c07a033b32fc374a2d6a) ) + ROM_LOAD16_BYTE( "763e22d", 0x2e0000, 0x010000, CRC(fd5b669d) SHA1(fd5d82886708187e53c204c574ee252fc8a793af) ) + ROM_LOAD16_BYTE( "763e22h", 0x2e0001, 0x010000, CRC(9a9f45d8) SHA1(24fa9425b00441fff124eae7b40df7e65c920323) ) + + ROM_REGION( 0x20000, "k051316_1", 0 ) /* bg */ + ROM_LOAD( "763a14", 0x000000, 0x020000, CRC(60392aa1) SHA1(8499eb40a246587e24f6fd00af2eaa6d75ee6363) ) + + ROM_REGION( 0x08000, "k051316_2", 0 ) /* fg */ + /* first half empty - PCB silkscreen reads "27256/27512" */ + ROM_LOAD( "763a13", 0x000000, 0x008000, CRC(8bed8e0d) SHA1(ccff330abc23fe499e76c16cab5783c3daf155dd) ) + ROM_CONTINUE( 0x000000, 0x008000 ) + + ROM_REGION( 0x20000, "gfx4", 0 ) /* road */ + ROM_LOAD( "763a15", 0x000000, 0x020000, CRC(7110aa43) SHA1(639dc002cc1580f0530bb5bb17f574e2258d5954) ) + + ROM_REGION( 0x40000, "k007232_1", 0 ) /* Samples, 2 banks */ + ROM_LOAD( "763e11a", 0x000000, 0x010000, CRC(a60a93c8) SHA1(ce319f2b30c82f66fee0bab65d091ef4bef58a89) ) + ROM_LOAD( "763e11b", 0x010000, 0x010000, CRC(7750feb5) SHA1(e0900b8af400a50a22907ffa514847003cef342d) ) + ROM_LOAD( "763e11c", 0x020000, 0x010000, CRC(78b89bf8) SHA1(b74427e363a486d4be003df39f4ca8d10b9d5fc9) ) + ROM_LOAD( "763e11d", 0x030000, 0x010000, CRC(5f38d054) SHA1(ce0c87a7b7c0806e09cce5d48a651f12f790dd27) ) + + ROM_REGION( 0x40000, "k007232_2", 0 ) /* Samples, 2 banks */ + ROM_LOAD( "763e10a", 0x000000, 0x010000, CRC(2b1cbefc) SHA1(f23fb943c277a05f2aa4d25de692d1fb3bb752ac) ) + ROM_LOAD( "763e10b", 0x010000, 0x010000, CRC(8209c950) SHA1(944c2afb4cfc67bd243de499f5ca6a7982980f45) ) + ROM_LOAD( "763e10c", 0x020000, 0x010000, CRC(b91d6c07) SHA1(ef90457cb495750c5793cd1716d0dc44d33d0a95) ) + ROM_LOAD( "763e10d", 0x030000, 0x010000, CRC(5b465d20) SHA1(66f10b58873e738f5539b960468c7f92d07c28bc) ) + + ROM_REGION( 0x100000, "k007232_3", 0 ) /* Samples, 4 banks for each ROM */ + ROM_LOAD( "763e08a", 0x000000, 0x020000, CRC(02e4e7ef) SHA1(1622e4d85a333acae6e5f9304a037389bfeb71dc) ) + ROM_LOAD( "763e08b", 0x020000, 0x020000, CRC(94edde2f) SHA1(b124f83f271dab710d5ecb67a70cac7b4b41931c) ) + ROM_LOAD( "763e08c", 0x040000, 0x020000, CRC(b1ab1529) SHA1(962ad45fdccf6431e05eaec65d1b2f7842bddc02) ) + ROM_LOAD( "763e08d", 0x060000, 0x020000, CRC(ee8d14db) SHA1(098ba4f27b8cbb0ce017b28e5b69d6a3d2efa1df) ) + + ROM_LOAD( "763e09a", 0x080000, 0x020000, CRC(1e6628ec) SHA1(9d24da1d32cb39dcbe3d0633045054d398ca8eb8) ) + ROM_LOAD( "763e09b", 0x0a0000, 0x020000, CRC(f0c2feb8) SHA1(9454d45a97dc2e823baf68dce85acce8e82a18f2) ) + ROM_LOAD( "763e09c", 0x0c0000, 0x020000, CRC(a0ade3e4) SHA1(1c94cede76f9350769a589625fadaee855c38866) ) + ROM_LOAD( "763e09d", 0x0e0000, 0x020000, CRC(c74e484d) SHA1(dd7ef64c30443847c638291f6cd2b45a5f0b2310) ) + + ROM_REGION( 0x08000, "user1", 0 ) /* extra data for road effects? */ + ROM_LOAD( "763a12", 0x000000, 0x008000, CRC(05f1e553) SHA1(8aaeb7374bd93038c24e6470398936f22cabb0fe) ) + + ROM_REGION( 0x200, "user2", 0 ) + ROM_LOAD( "763a23.b17", 0x00000, 0x200, CRC(81c30352) SHA1(20700aed065929835ef5c3b564a6f531f0a8fedf) ) +ROM_END + + +/* Important: you must leave extra space when listing sprite ROMs + in a ROM module definition. This routine unpacks each sprite nibble + into a byte, doubling the memory consumption. */ + +void wecleman_state::hotchase_sprite_decode( int num16_banks, int bank_size ) +{ + UINT8 *base; + int i; + + base = memregion("gfx1")->base(); // sprites + dynamic_buffer temp( bank_size ); + + for( i = num16_banks; i >0; i-- ){ + UINT8 *finish = base + 2*bank_size*i; + UINT8 *dest = finish - 2*bank_size; + + UINT8 *p1 = &temp[0]; + UINT8 *p2 = &temp[bank_size/2]; + + UINT8 data; + + memcpy (&temp[0], base+bank_size*(i-1), bank_size); + + do { + data = *p1++; + if( (data&0xf0) == 0xf0 ) data &= 0x0f; + if( (data&0x0f) == 0x0f ) data &= 0xf0; + *dest++ = data >> 4; + *dest++ = data & 0xF; + data = *p1++; + if( (data&0xf0) == 0xf0 ) data &= 0x0f; + if( (data&0x0f) == 0x0f ) data &= 0xf0; + *dest++ = data >> 4; + *dest++ = data & 0xF; + + + data = *p2++; + if( (data&0xf0) == 0xf0 ) data &= 0x0f; + if( (data&0x0f) == 0x0f ) data &= 0xf0; + *dest++ = data >> 4; + *dest++ = data & 0xF; + data = *p2++; + if( (data&0xf0) == 0xf0 ) data &= 0x0f; + if( (data&0x0f) == 0x0f ) data &= 0xf0; + *dest++ = data >> 4; + *dest++ = data & 0xF; + } while( dest<finish ); + } +} + +/* Unpack sprites data and do some patching */ +DRIVER_INIT_MEMBER(wecleman_state,hotchase) +{ +// UINT16 *RAM1 = (UINT16) memregion("maincpu")->base(); /* Main CPU patches */ +// RAM[0x1140/2] = 0x0015; RAM[0x195c/2] = 0x601A; // faster self test + + /* Now we can unpack each nibble of the sprites into a pixel (one byte) */ + hotchase_sprite_decode(3,0x80000*2); // num banks, bank len + + m_spr_color_offs = 0; +} + + +/*************************************************************************** + Game driver(s) +***************************************************************************/ + +GAMEL( 1986, wecleman, 0, wecleman, wecleman, wecleman_state, wecleman, ROT0, "Konami", "WEC Le Mans 24 (v2.00, set 1)", 0, layout_wecleman ) +GAMEL( 1986, weclemana, wecleman, wecleman, wecleman, wecleman_state, wecleman, ROT0, "Konami", "WEC Le Mans 24 (v2.00, set 2)", 0, layout_wecleman ) // 1988 release (maybe date hacked?) +GAMEL( 1986, weclemanb, wecleman, wecleman, wecleman, wecleman_state, wecleman, ROT0, "Konami", "WEC Le Mans 24 (v1.26)", 0, layout_wecleman ) + +GAMEL( 1988, hotchase, 0, hotchase, hotchase, wecleman_state, hotchase, ROT0, "Konami", "Hot Chase (set 1)", 0, layout_wecleman ) +GAMEL( 1988, hotchasea, hotchase, hotchase, hotchase, wecleman_state, hotchase, ROT0, "Konami", "Hot Chase (set 2)", 0, layout_wecleman ) |