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 Skimaxx
Preliminary driver by Phil Bennett driver by Phil Bennett and Luca Elia
68030-40 * 2 Top Board:
TMS34010-50
MSM6295 * 4
Video hardware consists of scaling sprites with a Mode 7-style ground? 68EC030-40
TMS34010 seems to draws text, score etc. (MSM6295 + Crystal) * 4
It looks like a bistream for a Xilinx FPGA is stored in ROM. The sub Bottom Board:
CPU bit-bangs 30864 bits worth of data to 0x40000003 twice.
***************************************************************************/ 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 "driver.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "cpu/tms34010/tms34010.h" #include "cpu/tms34010/tms34010.h"
#include "sound/okim6295.h"
/************************************* /*************************************
@ -27,8 +46,8 @@
* *
*************************************/ *************************************/
static UINT32 *sprite_buffer; static UINT32 *bg_buffer; // i.e. background and sprites
static UINT16 *frame_buffer; 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 // TODO: Might not be used
static void skimaxx_to_shiftreg(const address_space *space, UINT32 address, UINT16 *shiftreg) 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) 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) 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! // TODO: This isn't correct. I just hacked it together quickly so I could see something!
if (params->rowaddr >= 0x220) if (params->rowaddr >= 0x220)
{ {
UINT32 rowaddr = (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); UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0);
int coladdr = params->coladdr; int coladdr = params->coladdr;
int x; int x;
coladdr = 0; coladdr = 0;
if (scanline >= 236) dest += params->heblnk;
return; for (x = params->heblnk; x < params->hsblnk; x+=2)
for (x = params->heblnk; x < params->hsblnk; ++x)
{ {
UINT16 tmspix = vram1[coladdr++] & 0x7fff; UINT16 tmspix;
dest[x] = 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 ) static READ32_HANDLER( unk_r )
{
return (*skimaxx_fpga_ctrl & 0x20) ? 0x80 : 0x00;
}
// 0x20000023
static READ32_HANDLER( skimaxx_unk1_r )
{ {
return 0x80; 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 ) static ADDRESS_MAP_START( 68030_1_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_RANGE(0x00000000, 0x001fffff) AM_ROM
AM_RANGE(0x10000000, 0x10000003) AM_RAM AM_RANGE(0x10000000, 0x10000003) AM_WRITE( skimaxx_sub_ctrl_w )
AM_RANGE(0x10100000, 0x1010000f) AM_READWRITE(m68k_tms_r, m68k_tms_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, 0x10187fff) AM_RAM AM_SHARE(1)
AM_RANGE(0x20000000, 0x20000003) AM_RAM AM_RANGE(0x10180000, 0x1018ffff) AM_RAM AM_SHARE(1) // above 10188000 accessed at level end (game bug?)
AM_RANGE(0x20000020, 0x20000023) AM_RAM AM_RANGE(0x20000000, 0x20000003) AM_READNOP // watchdog_r?
AM_RANGE(0x20000024, 0x20000027) AM_RAM
AM_RANGE(0x20000040, 0x20000043) AM_RAM AM_RANGE(0x20000010, 0x20000013) AM_DEVREADWRITE8("oki1", okim6295_r, okim6295_w, 0x00ff) // left
AM_RANGE(0x20000044, 0x20000047) AM_RAM AM_RANGE(0x20000014, 0x20000017) AM_DEVREADWRITE8("oki2", okim6295_r, okim6295_w, 0x00ff) // left
AM_RANGE(0x20000048, 0x2000004b) AM_RAM AM_RANGE(0x20000018, 0x2000001b) AM_DEVREADWRITE8("oki3", okim6295_r, okim6295_w, 0x00ff) // right
AM_RANGE(0x2000004c, 0x2000004f) AM_READ(unk_r) AM_RANGE(0x2000001c, 0x2000001f) AM_DEVREADWRITE8("oki4", okim6295_r, okim6295_w, 0x00ff) // right
AM_RANGE(0x20000050, 0x20000053) AM_RAM
AM_RANGE(0x20000054, 0x20000057) AM_RAM AM_RANGE(0x20000020, 0x20000023) AM_READ ( skimaxx_unk1_r ) // units linking?
AM_RANGE(0xfffc0000, 0xfffdffff) AM_RAM AM_MIRROR(0x00020000) 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 ADDRESS_MAP_END
/************************************* /*************************************
* *
* Sub CPU memory map * Sub CPU memory map (Blitter control)
* *
*************************************/ *************************************/
static ADDRESS_MAP_START( 68030_2_map, ADDRESS_SPACE_PROGRAM, 32 ) static ADDRESS_MAP_START( 68030_2_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000000, 0x003fffff) AM_ROM 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(0x20000000, 0x2007ffff) AM_READ ( skimaxx_blitter_r ) // do blit
AM_RANGE(0xfffc0000, 0xfffc7fff) AM_RAM AM_SHARE(1) AM_RANGE(0x30000000, 0x3000000f) AM_WRITE( skimaxx_blitter_w ) AM_BASE( &skimaxx_blitter_regs )
AM_RANGE(0xfffe0000, 0xffffffff) AM_RAM // I think this is banked with the shared RAM? (see CPU sync routines)
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 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(0x00000000, 0x000100ff) AM_RAM
AM_RANGE(0x00008000, 0x0003ffff) AM_RAM AM_RANGE(0x00008000, 0x0003ffff) AM_RAM
AM_RANGE(0x00050000, 0x0005ffff) 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(0x02000000, 0x0200000f) AM_RAM
AM_RANGE(0x02100000, 0x0210000f) AM_RAM AM_RANGE(0x02100000, 0x0210000f) AM_RAM
AM_RANGE(0x04000000, 0x047fffff) AM_ROM AM_REGION("tmsgfx", 0) 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 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 * Input definitions
@ -185,8 +416,49 @@ ADDRESS_MAP_END
*************************************/ *************************************/
static INPUT_PORTS_START( skimaxx ) static INPUT_PORTS_START( skimaxx )
PORT_START("DSW") PORT_START("DSW") // 20000044.l & 0xff
// TODO 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 INPUT_PORTS_END
@ -206,7 +478,7 @@ static const tms34010_config tms_config =
FALSE, /* halt on reset */ FALSE, /* halt on reset */
"screen", /* the screen operated on */ "screen", /* the screen operated on */
50000000/8, /* pixel clock */ 50000000/8, /* pixel clock */
1, /* pixels per clock */ 2, /* pixels per clock */
skimaxx_scanline_update, /* scanline updater */ skimaxx_scanline_update, /* scanline updater */
skimaxx_tms_irq, /* generate interrupt */ skimaxx_tms_irq, /* generate interrupt */
skimaxx_to_shiftreg, /* write to shiftreg function */ skimaxx_to_shiftreg, /* write to shiftreg function */
@ -225,7 +497,6 @@ static MACHINE_RESET( skimaxx )
} }
/************************************* /*************************************
* *
* Machine driver * Machine driver
@ -233,30 +504,55 @@ static MACHINE_RESET( skimaxx )
*************************************/ *************************************/
static MACHINE_DRIVER_START( 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_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_ADD("subcpu", M68EC030, XTAL_40MHz)
MDRV_CPU_PROGRAM_MAP(68030_2_map) // TODO: Should be a 68030! MDRV_CPU_PROGRAM_MAP(68030_2_map)
MDRV_MACHINE_RESET(skimaxx)
/* video hardware */
MDRV_CPU_ADD("tms", TMS34010, XTAL_50MHz) MDRV_CPU_ADD("tms", TMS34010, XTAL_50MHz)
MDRV_CPU_CONFIG(tms_config) MDRV_CPU_CONFIG(tms_config)
MDRV_CPU_PROGRAM_MAP(tms_program_map) MDRV_CPU_PROGRAM_MAP(tms_program_map)
MDRV_MACHINE_RESET(skimaxx)
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) 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_INIT(RRRRR_GGGGG_BBBBB)
MDRV_PALETTE_LENGTH(32768) MDRV_PALETTE_LENGTH(32768)
MDRV_SPEAKER_STANDARD_MONO("mono") /* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MDRV_VIDEO_START(skimaxx) MDRV_SOUND_ADD("oki1", OKIM6295, XTAL_4MHz) // ?
MDRV_VIDEO_UPDATE(tms340x0) 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 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( "vc8v-2_0", 0x000000, 0x80000, CRC(a6e9ef81) SHA1(59a0fb149e17d3773adb980428a0b107647bd4fa) )
ROM_LOAD16_BYTE( "vc9v-2_0", 0x000001, 0x80000, CRC(b1e8ba65) SHA1(b91cf93ecd9b6067664780ab2c1b69f632c7ae05) ) 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( "vc10v2_0", 0x000000, 0x80000, CRC(433651cd) SHA1(9b9801703d16adbbca2b03e1714490fb166d48a0) )
ROM_LOAD16_BYTE( "vc11v2_0", 0x000001, 0x80000, CRC(a906fc72) SHA1(c61ad560f203c7f507cc7b7dc8834f529a6501a7) ) 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( "ve5v-2_0", 0x000000, 0x100000, CRC(b95544a3) SHA1(1ad49da54d36543229e241887c3dd8411ef5c89a) )
ROM_LOAD16_BYTE( "ve6v-2_0", 0x000001, 0x100000, CRC(d98bf89a) SHA1(f7fd66487f7696b53ee90a4cf45a810ec791df59) ) 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( "ve10v2_0", 0x200000, 0x100000, CRC(c2a16a62) SHA1(3663c19a6517b0a01fb454523b995be3cdf2e4b3) )
ROM_LOAD16_BYTE( "ve8v-2_0", 0x200001, 0x100000, CRC(ad8ed4a4) SHA1(5d1339b3d6ce59fea062273fa2da35988ba94a80) ) ROM_LOAD16_BYTE( "ve9v-2_0", 0x200001, 0x100000, CRC(587b364d) SHA1(b53412bdcc804727990d959e5b2399a7e5e7fbf3) )
ROM_LOAD16_BYTE( "ve9v-2_0", 0x400000, 0x100000, CRC(587b364d) SHA1(b53412bdcc804727990d959e5b2399a7e5e7fbf3) ) ROM_LOAD16_BYTE( "ve7v-2_0", 0x400000, 0x100000, CRC(a927716b) SHA1(0189d7b08b65b6a8a8d4c3e2affe93612db38155) )
ROM_LOAD16_BYTE( "ve10v2_0", 0x400001, 0x100000, CRC(c2a16a62) SHA1(3663c19a6517b0a01fb454523b995be3cdf2e4b3) ) ROM_LOAD16_BYTE( "ve8v-2_0", 0x400001, 0x100000, CRC(ad8ed4a4) SHA1(5d1339b3d6ce59fea062273fa2da35988ba94a80) )
ROM_REGION( 0x80000, "oki1", 0 ) 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_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_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 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 )