From 4ae63a9782068bb84d166e4c62e7dea777197b37 Mon Sep 17 00:00:00 2001 From: Luca Elia Date: Sat, 7 Nov 2009 14:43:44 +0000 Subject: [PATCH] Added emulation of background graphics (blitter), sound and inputs to skimaxx.c [Luca Elia] New games added or promoted from NOT_WORKING status --------------------------------------------------- Skimaxx [Luca Elia, Phil Bennett] Note: 68EC030 disassembler is busted --- src/mame/drivers/skimaxx.c | 438 +++++++++++++++++++++++++++++++------ 1 file changed, 367 insertions(+), 71 deletions(-) diff --git a/src/mame/drivers/skimaxx.c b/src/mame/drivers/skimaxx.c index 91be96c3ccd..55e865ac0d1 100644 --- a/src/mame/drivers/skimaxx.c +++ b/src/mame/drivers/skimaxx.c @@ -1,24 +1,43 @@ -/*************************************************************************** +/***************************************************************************************************** Skimaxx - Preliminary driver by Phil Bennett + driver by Phil Bennett and Luca Elia - 68030-40 * 2 - TMS34010-50 - MSM6295 * 4 + Top Board: - Video hardware consists of scaling sprites with a Mode 7-style ground? - TMS34010 seems to draws text, score etc. + 68EC030-40 + (MSM6295 + Crystal) * 4 - It looks like a bistream for a Xilinx FPGA is stored in ROM. The sub - CPU bit-bangs 30864 bits worth of data to 0x40000003 twice. + Bottom Board: -***************************************************************************/ + 68EC030-40 + TMS34010-50 + + Video hardware: + + - Blitter that supports rotation and zoom (background and sprites) + - TMS34010 (text, score) + + Notes: + + - It looks like a bistream for a Xilinx FPGA is stored in ROM. + The sub CPU bit-bangs 30864 bits worth of data to 0x40000003 twice. + + - There seems to be a bug in the game code drawing routines, causing objects to have some pixels + chopped off. This is most noticeable for distant thin objects (falgs, poles of the start banner). + See maincpu routine at 387B8, specifically the jump at 3880E throws 4 horizontal pixels away. + + - The player often disappears (when she's too slow?). Is this normal ? + + - Are button 2 and analog input "Y" used ? + +*****************************************************************************************************/ #include "driver.h" #include "cpu/m68000/m68000.h" #include "cpu/tms34010/tms34010.h" +#include "sound/okim6295.h" /************************************* @@ -27,8 +46,8 @@ * *************************************/ -static UINT32 *sprite_buffer; -static UINT16 *frame_buffer; +static UINT32 *bg_buffer; // i.e. background and sprites +static UINT16 *fg_buffer; // i.e. text /************************************* @@ -37,11 +56,92 @@ static UINT16 *frame_buffer; * *************************************/ -static VIDEO_START( skimaxx ) -{ +UINT32 *skimaxx_bg_buffer_front; +UINT32 *skimaxx_bg_buffer_back; +UINT32 *skimaxx_blitter_regs; +UINT16 *skimaxx_blitter_gfx; + +UINT32 skimaxx_blitter_gfx_len; + +UINT32 skimaxx_blitter_src_x, skimaxx_blitter_src_dx; +UINT32 skimaxx_blitter_src_y, skimaxx_blitter_src_dy; + +// Set up blit parameters +static WRITE32_HANDLER( skimaxx_blitter_w ) +{ + UINT32 newdata = COMBINE_DATA( &skimaxx_blitter_regs[offset] ); + + switch (offset) + { + case 0: + skimaxx_blitter_src_dy = (newdata & 0x7fff) - (newdata & 0x8000); + break; + + case 1: + skimaxx_blitter_src_x = (newdata & 0x1ff) << 8; + skimaxx_blitter_src_y = (newdata >> 9) << 8; + break; + + case 2: + if (ACCESSING_BITS_16_31) + skimaxx_blitter_src_dx = (newdata >> 16) & 0xffff; + if (ACCESSING_BITS_0_15) + skimaxx_blitter_src_dx = newdata & 0xffff; + + skimaxx_blitter_src_dx = (skimaxx_blitter_src_dx & 0x7fff) - (skimaxx_blitter_src_dx & 0x8000); + break; + + case 3: + // Usually 0. Set to 10 for water/sand near the horizon + break; + } } +// A read by the 68030 from this area blits one pixel to the back buffer (at the same offset) +static READ32_HANDLER( skimaxx_blitter_r ) +{ + UINT32 penaddr = ((skimaxx_blitter_src_x >> 8) & 0x1ff) + ((skimaxx_blitter_src_y >> 8) << 9); + UINT16 *src = skimaxx_blitter_gfx + (penaddr % skimaxx_blitter_gfx_len); + UINT32 *dst = skimaxx_bg_buffer_back + offset; + + UINT16 pen = (*src) & 0x7fff; + + if (pen) + { + if (ACCESSING_BITS_16_31) + *dst = (*dst & 0x0000ffff) | (pen << 16); + else + *dst = (*dst & 0xffff0000) | pen; + } + + skimaxx_blitter_src_x = (skimaxx_blitter_src_x & 0x10000) | ((skimaxx_blitter_src_x + skimaxx_blitter_src_dx) & 0xffff); + skimaxx_blitter_src_y = (skimaxx_blitter_src_y & 0xffff0000) | ((skimaxx_blitter_src_y + skimaxx_blitter_src_dy) & 0xffff); + + return 0; +} + + +static VIDEO_START( skimaxx ) +{ + skimaxx_blitter_gfx = (UINT16 *) memory_region( machine, "blitter" ); + skimaxx_blitter_gfx_len = memory_region_length( machine, "blitter" ) / 2; + + bg_buffer = auto_alloc_array(machine, UINT32, 0x400 * 0x100 * sizeof(UINT16) / sizeof(UINT32) * 2); // 2 buffers + skimaxx_bg_buffer_back = bg_buffer + 0x400 * 0x100 * sizeof(UINT16) / sizeof(UINT32) * 0; + skimaxx_bg_buffer_front = bg_buffer + 0x400 * 0x100 * sizeof(UINT16) / sizeof(UINT32) * 1; + memory_configure_bank(machine, 1, 0, 1, skimaxx_bg_buffer_back, 0); + memory_configure_bank(machine, 1, 1, 1, skimaxx_bg_buffer_front, 0); +} + +static VIDEO_UPDATE( skimaxx ) +{ +// popmessage("%02x %02x", input_port_read(screen->machine, "X"), input_port_read(screen->machine, "Y") ); + + VIDEO_UPDATE_CALL(tms340x0); + + return 0; +} /************************************* * @@ -52,12 +152,12 @@ static VIDEO_START( skimaxx ) // TODO: Might not be used static void skimaxx_to_shiftreg(const address_space *space, UINT32 address, UINT16 *shiftreg) { - memcpy(shiftreg, &frame_buffer[TOWORD(address)], 512 * sizeof(UINT16)); + memcpy(shiftreg, &fg_buffer[TOWORD(address)], 512 * sizeof(UINT16)); } static void skimaxx_from_shiftreg(const address_space *space, UINT32 address, UINT16 *shiftreg) { - memcpy(&frame_buffer[TOWORD(address)], shiftreg, 512 * sizeof(UINT16)); + memcpy(&fg_buffer[TOWORD(address)], shiftreg, 512 * sizeof(UINT16)); } @@ -70,22 +170,35 @@ static void skimaxx_from_shiftreg(const address_space *space, UINT32 address, UI static void skimaxx_scanline_update(const device_config *screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) { // TODO: This isn't correct. I just hacked it together quickly so I could see something! + if (params->rowaddr >= 0x220) { UINT32 rowaddr = (params->rowaddr - 0x220); - UINT16 *vram1 = &frame_buffer[rowaddr << 8]; + UINT16 *fg = &fg_buffer[rowaddr << 8]; + UINT32 *bg = &skimaxx_bg_buffer_front[rowaddr/2 * 1024/2]; UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); int coladdr = params->coladdr; int x; coladdr = 0; - if (scanline >= 236) - return; - - for (x = params->heblnk; x < params->hsblnk; ++x) + dest += params->heblnk; + for (x = params->heblnk; x < params->hsblnk; x+=2) { - UINT16 tmspix = vram1[coladdr++] & 0x7fff; - dest[x] = tmspix; + UINT16 tmspix; + tmspix = *fg & 0x7fff; + if (tmspix) + { + *dest++ = tmspix; + *dest++ = tmspix; + } + else + { + UINT32 data = *bg & 0x7fff7fff; + *dest++ = data >> 16; + *dest++ = data; + } + fg++; + bg++; } } } @@ -114,11 +227,73 @@ static READ32_HANDLER( m68k_tms_r ) * *************************************/ +/* + bit 7: 0->1 at the start, and before bit banging to 40000003 (Xilinx FPGA configuration write port?) + bit 6: double buffering + bit 5: 0/1 less oftenly + bit 4: 0->1 clocks bit banging + bit 3-1: 1? + bit 0: bit banging data +*/ + +UINT32 *skimaxx_fpga_ctrl; +static WRITE32_HANDLER( skimaxx_fpga_ctrl_w ) +{ + UINT32 newdata = COMBINE_DATA( skimaxx_fpga_ctrl ); + + if (ACCESSING_BITS_0_7) + { + // double buffering + UINT8 bank_bg_buffer = (newdata & 0x40) ? 1 : 0; + + skimaxx_bg_buffer_back = bg_buffer + 0x400 * 0x100 * sizeof(UINT16) / sizeof(UINT32) * bank_bg_buffer; + skimaxx_bg_buffer_front = bg_buffer + 0x400 * 0x100 * sizeof(UINT16) / sizeof(UINT32) * (1 - bank_bg_buffer); + + memory_set_bank(space->machine, 1, bank_bg_buffer); + } +} + +// 0x2000004c: bit 7, bit 0 static READ32_HANDLER( unk_r ) +{ + return (*skimaxx_fpga_ctrl & 0x20) ? 0x80 : 0x00; +} + +// 0x20000023 +static READ32_HANDLER( skimaxx_unk1_r ) { return 0x80; } +static WRITE32_HANDLER( skimaxx_unk1_w ) +{ +} + +static WRITE32_HANDLER( skimaxx_sub_ctrl_w ) +{ + // 7e/7f at the start. 3f/7f, related to reads from 1018xxxx + if (ACCESSING_BITS_0_7) + { + const device_config *subcpu = devtag_get_device(space->machine, "subcpu"); + + cpu_set_input_line(subcpu, INPUT_LINE_RESET, (data & 0x01) ? CLEAR_LINE : ASSERT_LINE); + cpu_set_input_line(subcpu, INPUT_LINE_HALT, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); + } +} + +/* + 00 left max again + + 01 right max + .. + 10 center + .. + 1f left max +*/ +static READ32_HANDLER( skimaxx_analog_r ) +{ + return BITSWAP8(input_port_read(space->machine, offset ? "Y" : "X"), 0,1,2,3,4,5,6,7); +} /************************************* * @@ -128,40 +303,58 @@ static READ32_HANDLER( unk_r ) static ADDRESS_MAP_START( 68030_1_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x001fffff) AM_ROM - AM_RANGE(0x10000000, 0x10000003) AM_RAM - AM_RANGE(0x10100000, 0x1010000f) AM_READWRITE(m68k_tms_r, m68k_tms_w) - AM_RANGE(0x10180000, 0x10187fff) AM_RAM AM_SHARE(1) - AM_RANGE(0x20000000, 0x20000003) AM_RAM - AM_RANGE(0x20000020, 0x20000023) AM_RAM - AM_RANGE(0x20000024, 0x20000027) AM_RAM - AM_RANGE(0x20000040, 0x20000043) AM_RAM - AM_RANGE(0x20000044, 0x20000047) AM_RAM - AM_RANGE(0x20000048, 0x2000004b) AM_RAM - AM_RANGE(0x2000004c, 0x2000004f) AM_READ(unk_r) - AM_RANGE(0x20000050, 0x20000053) AM_RAM - AM_RANGE(0x20000054, 0x20000057) AM_RAM - AM_RANGE(0xfffc0000, 0xfffdffff) AM_RAM AM_MIRROR(0x00020000) + AM_RANGE(0x10000000, 0x10000003) AM_WRITE( skimaxx_sub_ctrl_w ) + AM_RANGE(0x10100000, 0x1010000f) AM_READWRITE(m68k_tms_r, m68k_tms_w)//AM_NOP +// AM_RANGE(0x10180000, 0x10187fff) AM_RAM AM_SHARE(1) + AM_RANGE(0x10180000, 0x1018ffff) AM_RAM AM_SHARE(1) // above 10188000 accessed at level end (game bug?) + AM_RANGE(0x20000000, 0x20000003) AM_READNOP // watchdog_r? + + AM_RANGE(0x20000010, 0x20000013) AM_DEVREADWRITE8("oki1", okim6295_r, okim6295_w, 0x00ff) // left + AM_RANGE(0x20000014, 0x20000017) AM_DEVREADWRITE8("oki2", okim6295_r, okim6295_w, 0x00ff) // left + AM_RANGE(0x20000018, 0x2000001b) AM_DEVREADWRITE8("oki3", okim6295_r, okim6295_w, 0x00ff) // right + AM_RANGE(0x2000001c, 0x2000001f) AM_DEVREADWRITE8("oki4", okim6295_r, okim6295_w, 0x00ff) // right + + AM_RANGE(0x20000020, 0x20000023) AM_READ ( skimaxx_unk1_r ) // units linking? + AM_RANGE(0x20000024, 0x20000027) AM_WRITE( skimaxx_unk1_w ) // "" + + AM_RANGE(0x20000040, 0x20000043) AM_RAM // write + AM_RANGE(0x20000044, 0x20000047) AM_READ_PORT( "DSW" ) + AM_RANGE(0x20000048, 0x2000004b) AM_READ_PORT( "COIN" ) + AM_RANGE(0x2000004c, 0x2000004f) AM_READ(unk_r) // bit 7, bit 0 + + AM_RANGE(0x20000050, 0x20000057) AM_READ( skimaxx_analog_r ) AM_WRITENOP // read (0-1f), write motor? + + AM_RANGE(0xfffc0000, 0xffffffff) AM_RAM AM_MIRROR(0x00020000) ADDRESS_MAP_END /************************************* * - * Sub CPU memory map + * Sub CPU memory map (Blitter control) * *************************************/ static ADDRESS_MAP_START( 68030_2_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x003fffff) AM_ROM - AM_RANGE(0x40000000, 0x40000003) AM_RAM // Xilinx FPGA configuration write port? - AM_RANGE(0x50000000, 0x5007ffff) AM_RAM AM_BASE(&sprite_buffer) // Part of this is mixed with the TMS frame buffer - AM_RANGE(0xfffc0000, 0xfffc7fff) AM_RAM AM_SHARE(1) - AM_RANGE(0xfffe0000, 0xffffffff) AM_RAM // I think this is banked with the shared RAM? (see CPU sync routines) + + AM_RANGE(0x20000000, 0x2007ffff) AM_READ ( skimaxx_blitter_r ) // do blit + AM_RANGE(0x30000000, 0x3000000f) AM_WRITE( skimaxx_blitter_w ) AM_BASE( &skimaxx_blitter_regs ) + + AM_RANGE(0x40000000, 0x40000003) AM_WRITE( skimaxx_fpga_ctrl_w ) AM_BASE( &skimaxx_fpga_ctrl ) + + AM_RANGE(0x50000000, 0x5007ffff) AM_RAMBANK(1) // background ram allocated here at video_start (skimaxx_bg_buffer_back/front) +// AM_RANGE(0xfffc0000, 0xfffc7fff) AM_RAM AM_SHARE(1) + AM_RANGE(0xfffc0000, 0xfffcffff) AM_RAM AM_SHARE(1) +// AM_RANGE(0xfffe0000, 0xffffffff) AM_RAM // I think this is banked with the shared RAM? (see CPU sync routines) + AM_RANGE(0xfffe0010, 0xfffeffff) AM_RAM // HACK + AM_RANGE(0xfffe0000, 0xfffeffff) AM_RAM AM_SHARE(1) // HACK + AM_RANGE(0xffff0000, 0xffffffff) AM_RAM ADDRESS_MAP_END /************************************* * - * Video CPU memory map + * Video CPU memory map (Text layer) * *************************************/ @@ -169,7 +362,7 @@ static ADDRESS_MAP_START( tms_program_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x00000000, 0x000100ff) AM_RAM AM_RANGE(0x00008000, 0x0003ffff) AM_RAM AM_RANGE(0x00050000, 0x0005ffff) AM_RAM - AM_RANGE(0x00220000, 0x003fffff) AM_RAM AM_BASE(&frame_buffer) + AM_RANGE(0x00220000, 0x003fffff) AM_RAM AM_BASE(&fg_buffer) AM_RANGE(0x02000000, 0x0200000f) AM_RAM AM_RANGE(0x02100000, 0x0210000f) AM_RAM AM_RANGE(0x04000000, 0x047fffff) AM_ROM AM_REGION("tmsgfx", 0) @@ -178,6 +371,44 @@ static ADDRESS_MAP_START( tms_program_map, ADDRESS_SPACE_PROGRAM, 16 ) ADDRESS_MAP_END +/************************************* + * + * Graphics decoding (for debug) + * + *************************************/ + +#if 0 + +static const UINT32 texlayout_xoffset[512] = +{ + STEP512(0,16) +}; + +static const UINT32 texlayout_yoffset[128] = +{ + STEP128(0,512*16) +}; + +static const gfx_layout texlayout = +{ + 512, 128, + RGN_FRAC(1,1), + 5, + { 9,10,11,12,13 }, + EXTENDED_XOFFS, + EXTENDED_YOFFS, + 512*128*16, + texlayout_xoffset, + texlayout_yoffset +}; + +static GFXDECODE_START( skimaxx ) + GFXDECODE_ENTRY( "blitter", 0, texlayout, 0, 1 ) +GFXDECODE_END + +#endif + + /************************************* * * Input definitions @@ -185,8 +416,49 @@ ADDRESS_MAP_END *************************************/ static INPUT_PORTS_START( skimaxx ) - PORT_START("DSW") - // TODO + PORT_START("DSW") // 20000044.l & 0xff + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x05, "12" ) + PORT_DIPSETTING( 0x04, "17" ) + PORT_DIPSETTING( 0x03, "25" ) + PORT_DIPSETTING( 0x02, "33" ) + PORT_DIPSETTING( 0x01, "50" ) + PORT_DIPSETTING( 0x07, "100" ) + PORT_DIPSETTING( 0x06, "200" ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, "0" ) + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPNAME( 0x70, 0x70, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPSETTING( 0x10, "4" ) + PORT_DIPSETTING( 0x20, "8" ) + PORT_DIPSETTING( 0x30, "10" ) + PORT_DIPSETTING( 0x40, "12" ) + PORT_DIPSETTING( 0x50, "15" ) + PORT_DIPSETTING( 0x60, "20" ) + PORT_DIPSETTING( 0x70, "30" ) + PORT_DIPNAME( 0x80, 0x80, "Time For Super Course" ) + PORT_DIPSETTING( 0x80, "50 s" ) // 3000 + PORT_DIPSETTING( 0x00, "60 s" ) // 3600 + + PORT_START("COIN") // 20000048.l & 0xff + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) // ? + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) // coin + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) // coin + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) // start + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) // change course / letter + + PORT_START("X") + PORT_BIT( 0x1f, 0x10, IPT_AD_STICK_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_MINMAX(0x00,0x1e) PORT_INVERT + + PORT_START("Y") + PORT_BIT( 0x1f, 0x10, IPT_AD_STICK_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_MINMAX(0x00,0x1e) PORT_INVERT +// PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(35) PORT_KEYDELTA(5) + INPUT_PORTS_END @@ -206,7 +478,7 @@ static const tms34010_config tms_config = FALSE, /* halt on reset */ "screen", /* the screen operated on */ 50000000/8, /* pixel clock */ - 1, /* pixels per clock */ + 2, /* pixels per clock */ skimaxx_scanline_update, /* scanline updater */ skimaxx_tms_irq, /* generate interrupt */ skimaxx_to_shiftreg, /* write to shiftreg function */ @@ -225,7 +497,6 @@ static MACHINE_RESET( skimaxx ) } - /************************************* * * Machine driver @@ -233,30 +504,55 @@ static MACHINE_RESET( skimaxx ) *************************************/ static MACHINE_DRIVER_START( skimaxx ) - MDRV_CPU_ADD("maincpu", M68020, XTAL_40MHz) // TODO: Should be a 68030! + MDRV_CPU_ADD("maincpu", M68EC030, XTAL_40MHz) MDRV_CPU_PROGRAM_MAP(68030_1_map) -// MDRV_CPU_VBLANK_INT("screen", irq3_line_hold) + MDRV_CPU_VBLANK_INT("screen", irq3_line_hold) // 1,3,7 are identical, rest is RTE - MDRV_CPU_ADD("subcpu", M68020, XTAL_40MHz) - MDRV_CPU_PROGRAM_MAP(68030_2_map) // TODO: Should be a 68030! + MDRV_CPU_ADD("subcpu", M68EC030, XTAL_40MHz) + MDRV_CPU_PROGRAM_MAP(68030_2_map) + MDRV_MACHINE_RESET(skimaxx) + + /* video hardware */ MDRV_CPU_ADD("tms", TMS34010, XTAL_50MHz) MDRV_CPU_CONFIG(tms_config) MDRV_CPU_PROGRAM_MAP(tms_program_map) - MDRV_MACHINE_RESET(skimaxx) - MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MDRV_SCREEN_RAW_PARAMS(40000000/4, 156*4, 0, 100*4, 328, 0, 300) // TODO - Wrong but TMS overrides it anyway +// MDRV_SCREEN_RAW_PARAMS(40000000/4, 156*4, 0, 100*4, 328, 0, 300) // TODO - Wrong but TMS overrides it anyway + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MDRV_SCREEN_SIZE(0x400, 0x100) + MDRV_SCREEN_VISIBLE_AREA(0, 0x280-1, 0, 0xf0-1) + + MDRV_VIDEO_START(skimaxx) +// MDRV_VIDEO_UPDATE(tms340x0) + MDRV_VIDEO_UPDATE(skimaxx) + +// MDRV_GFXDECODE( skimaxx ) MDRV_PALETTE_INIT(RRRRR_GGGGG_BBBBB) MDRV_PALETTE_LENGTH(32768) - MDRV_SPEAKER_STANDARD_MONO("mono") + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MDRV_VIDEO_START(skimaxx) - MDRV_VIDEO_UPDATE(tms340x0) + MDRV_SOUND_ADD("oki1", OKIM6295, XTAL_4MHz) // ? + MDRV_SOUND_CONFIG(okim6295_interface_pin7low) // ? + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) + + MDRV_SOUND_ADD("oki2", OKIM6295, XTAL_4MHz/2) // ? + MDRV_SOUND_CONFIG(okim6295_interface_pin7high) // ? + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) + + MDRV_SOUND_ADD("oki3", OKIM6295, XTAL_4MHz) // ? + MDRV_SOUND_CONFIG(okim6295_interface_pin7low) // ? + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) + + MDRV_SOUND_ADD("oki4", OKIM6295, XTAL_4MHz/2) // ? + MDRV_SOUND_CONFIG(okim6295_interface_pin7high) // ? + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MACHINE_DRIVER_END @@ -283,29 +579,29 @@ ROM_START( skimaxx ) ROM_LOAD16_BYTE( "vc8v-2_0", 0x000000, 0x80000, CRC(a6e9ef81) SHA1(59a0fb149e17d3773adb980428a0b107647bd4fa) ) ROM_LOAD16_BYTE( "vc9v-2_0", 0x000001, 0x80000, CRC(b1e8ba65) SHA1(b91cf93ecd9b6067664780ab2c1b69f632c7ae05) ) - ROM_REGION( 0x600000, "tmsgfx", 0 ) + ROM_REGION( 0x100000, "tmsgfx", 0 ) ROM_LOAD16_BYTE( "vc10v2_0", 0x000000, 0x80000, CRC(433651cd) SHA1(9b9801703d16adbbca2b03e1714490fb166d48a0) ) ROM_LOAD16_BYTE( "vc11v2_0", 0x000001, 0x80000, CRC(a906fc72) SHA1(c61ad560f203c7f507cc7b7dc8834f529a6501a7) ) - ROM_REGION( 0x600000, "gfx", 0 ) + ROM_REGION16_LE( 0x600000, "blitter", 0 ) ROM_LOAD16_BYTE( "ve5v-2_0", 0x000000, 0x100000, CRC(b95544a3) SHA1(1ad49da54d36543229e241887c3dd8411ef5c89a) ) ROM_LOAD16_BYTE( "ve6v-2_0", 0x000001, 0x100000, CRC(d98bf89a) SHA1(f7fd66487f7696b53ee90a4cf45a810ec791df59) ) - ROM_LOAD16_BYTE( "ve7v-2_0", 0x200000, 0x100000, CRC(a927716b) SHA1(0189d7b08b65b6a8a8d4c3e2affe93612db38155) ) - ROM_LOAD16_BYTE( "ve8v-2_0", 0x200001, 0x100000, CRC(ad8ed4a4) SHA1(5d1339b3d6ce59fea062273fa2da35988ba94a80) ) - ROM_LOAD16_BYTE( "ve9v-2_0", 0x400000, 0x100000, CRC(587b364d) SHA1(b53412bdcc804727990d959e5b2399a7e5e7fbf3) ) - ROM_LOAD16_BYTE( "ve10v2_0", 0x400001, 0x100000, CRC(c2a16a62) SHA1(3663c19a6517b0a01fb454523b995be3cdf2e4b3) ) + ROM_LOAD16_BYTE( "ve10v2_0", 0x200000, 0x100000, CRC(c2a16a62) SHA1(3663c19a6517b0a01fb454523b995be3cdf2e4b3) ) + ROM_LOAD16_BYTE( "ve9v-2_0", 0x200001, 0x100000, CRC(587b364d) SHA1(b53412bdcc804727990d959e5b2399a7e5e7fbf3) ) + ROM_LOAD16_BYTE( "ve7v-2_0", 0x400000, 0x100000, CRC(a927716b) SHA1(0189d7b08b65b6a8a8d4c3e2affe93612db38155) ) + ROM_LOAD16_BYTE( "ve8v-2_0", 0x400001, 0x100000, CRC(ad8ed4a4) SHA1(5d1339b3d6ce59fea062273fa2da35988ba94a80) ) ROM_REGION( 0x80000, "oki1", 0 ) - ROM_LOAD( "main2_0.u2", 0x000000, 0x80000, CRC(c84b3c46) SHA1(b956358518495aa822a5b699cbad1abac212dd09) ) - - ROM_REGION( 0x80000, "oki2", 0 ) - ROM_LOAD( "main2_0.u4", 0x000000, 0x80000, CRC(c84b3c46) SHA1(b956358518495aa822a5b699cbad1abac212dd09) ) - - ROM_REGION( 0x80000, "oki3", 0 ) ROM_LOAD( "main2_0.u3", 0x000000, 0x80000, CRC(24d8c6ad) SHA1(06f51a4c380c91c930d646826246f62c4e1f9cda) ) - ROM_REGION( 0x80000, "oki4", 0 ) + ROM_REGION( 0x80000, "oki2", 0 ) + ROM_LOAD( "main2_0.u2", 0x000000, 0x80000, CRC(c84b3c46) SHA1(b956358518495aa822a5b699cbad1abac212dd09) ) // identical to main2_0.u4 + + ROM_REGION( 0x80000, "oki3", 0 ) ROM_LOAD( "main2_0.u5", 0x000000, 0x80000, CRC(e2ba07ad) SHA1(cf82753975f7b6756cca4e10b5372e00135440bf) ) + + ROM_REGION( 0x80000, "oki4", 0 ) + ROM_LOAD( "main2_0.u4", 0x000000, 0x80000, CRC(c84b3c46) SHA1(b956358518495aa822a5b699cbad1abac212dd09) ) // identical to main2_0.u2 ROM_END @@ -315,4 +611,4 @@ ROM_END * *************************************/ -GAME( 1996, skimaxx, 0, skimaxx, skimaxx, 0, ROT0, "Kyle Hodgetts/ICE", "Skimaxx", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 1996, skimaxx, 0, skimaxx, skimaxx, 0, ROT0, "Kyle Hodgetts / ICE", "Skimaxx", GAME_IMPERFECT_GRAPHICS )