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
This commit is contained in:
Luca Elia 2009-11-07 14:43:44 +00:00
parent 479de012c4
commit 4ae63a9782

View File

@ -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 )