summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/sliver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/sliver.c')
-rw-r--r--src/mame/drivers/sliver.c594
1 files changed, 594 insertions, 0 deletions
diff --git a/src/mame/drivers/sliver.c b/src/mame/drivers/sliver.c
new file mode 100644
index 00000000000..49299332cad
--- /dev/null
+++ b/src/mame/drivers/sliver.c
@@ -0,0 +1,594 @@
+/*
+Sliver - Hollow Corp.1996
+driver by Tomasz Slanina
+
+Custom blitter + background framebuffer + oki for sound.
+
+The background images on this hardware are in JPEG format, the Zoran chips are
+hardware JPEG decompression chips.
+Driver (temporary) uses fake rom with decompressed images (gfx.bin)
+
+TODO:
+- verify OKI rom banking (bank num inverted or not)
+- DIPS
+- add jpeg decompression
+- fix transparency problems in some stages
+
+
+PCB Layout
+----------
+
+WS16-AJ-940820
+|---------|-----------|------------------------------------|
+| TL084 | i8031 | KA-1 |
+| |-----------||--------| |
+| AD-65 KA-2 |ACTEL | KA-6 KA-7 KA-8 KA-9 |
+| |A1020B | |
+| KA-3 |PL84C | |
+| PAL | | |
+| |--------| |
+| AT76C176 62256 62256 |
+| |
+|J KM75C02 62256 62256 |
+|A |
+|M PAL 62256 62256 |
+|M |
+|A 62256 62256 |
+| HY534256|
+| DSW1 PAL |-------| HY534256|
+| PAL PAL |ZORAN | HY534256|
+| |-------| |ZR36011| HY534256|
+| DSW2 62256 62256 |ZORAN | |-------| |
+| KA-4 KA-5 |ZR36050| |
+| |-------| |-------| |
+| |------------------|16MHz |FUJI | |
+| | | |MD0204 | |
+| | MC68000P10 | |-------| |
+| | | KA-12 KA-11 KA-10|
+|24MHz |------------------| |
+|----------------------------------------------------------|
+Notes:
+ i8031 - Intel 8031 CPU, clock 8.000MHz (DIP40)
+ 68000 - Motorola MC68000 CPU, clock 12.000MHz (DIP64)
+ AT76C176 - Atmel AT76C176 1-Channel 6-Bit AD/DA Convertor with Clamp Circuit (DIP28).
+ When removed, text and _some_ graphics turn black (palette related use)
+ This chip is compatible to Fujitsu MB40176
+ A1020B - Actel A1020B FPGA (PLCC84)
+ ZR36050 - Zoran ZR36050PQC-21 DF4B9423G (QFP100)
+ ZR36011 - Zoran ZR36011PQC JAPAN 079414 (QFP100)
+ MD0204 - Fuji MD0204 JAPAN F39D110 (QFP128) - Memory controller
+ 62256 - 32K x8 SRAM (DIP28)
+ HY534256 - Hyundai 256K x4 (1MBit) DRAM (DIP20)
+ KM75C02 - Samsung KM75C02 FIFO RAM (DIP28)
+ AD-65 - Clone OKI M6295 (QFP44), clock 1.000MHz, sample rate = 1000000Hz / 132
+ VSync - 60Hz
+*/
+
+#include "driver.h"
+#include "sound/okim6295.h"
+#include "cpu/i8051/i8051.h"
+
+#define FIFO_SIZE 1024
+#define IO_SIZE 0x100
+#define COMMAND_SIZE 8
+#define x_offset 0x45
+#define y_offset 0x0d
+
+static UINT16 io_offset;
+static UINT16 io_reg[IO_SIZE];
+static UINT16 fifo[FIFO_SIZE];
+static UINT16 fptr;
+
+static int jpeg_addr=-1;
+static UINT16 jpeg1,jpeg2;
+static int jpeg_h=0;
+static int jpeg_w=0;
+static int jpeg_x=0;
+static int jpeg_y=0;
+static int tmp_counter;
+static int clr_offset=0;
+
+static mame_bitmap *sliver_bitmap_fg;
+static mame_bitmap *sliver_bitmap_bg;
+
+static UINT16 tempbuf[8];
+
+static int gfxlookup[][4]=
+{
+ { 0x0000000, 0x0000000, 512, 256 },
+ { 0x0060000, 0x0007fa5, 512, 256 },
+ { 0x00c0000, 0x0008c04, 512, 512 },
+ { 0x0180000, 0x001642b, 512, 512 },
+ { 0x0240000, 0x00240fb, 512, 512 },
+ { 0x0300000, 0x0033494, 512, 256 },
+ { 0x0360000, 0x003ad9a, 512, 256 },
+ { 0x03c0000, 0x003cab3, 512, 256 },
+ { 0x0420000, 0x003e50c, 512, 256 },
+ { 0x0480000, 0x003fd94, 512, 256 },
+ { 0x04e0000, 0x004166e, 512, 256 },
+ { 0x0540000, 0x004306a, 512, 256 },
+ { 0x05a0000, 0x0044c65, 512, 256 },
+ { 0x0600000, 0x0046aeb, 512, 256 },
+ { 0x0660000, 0x0048a86, 512, 512 },
+ { 0x0720000, 0x00527c7, 512, 512 },
+ { 0x07e0000, 0x005a789, 512, 256 },
+ { 0x0840000, 0x005f9b0, 512, 256 },
+ { 0x08a0000, 0x0065621, 512, 512 },
+ { 0x0960000, 0x006fbd6, 512, 512 },
+ { 0x0a20000, 0x0077b98, 512, 512 },
+ { 0x0ae0000, 0x007fa6e, 512, 512 },
+ { 0x0ba0000, 0x0087a42, 512, 512 },
+ { 0x0c60000, 0x008f996, 512, 256 },
+ { 0x0cc0000, 0x0094b82, 512, 512 },
+ { 0x0d80000, 0x009e27a, 512, 512 },
+ { 0x0e40000, 0x00a6157, 512, 256 },
+ { 0x0ea0000, 0x00ab417, 512, 512 },
+ { 0x0f60000, 0x00b33c1, 512, 512 },
+ { 0x1020000, 0x00bd7f1, 512, 256 },
+ { 0x1080000, 0x00c1679, 512, 512 },
+ { 0x1140000, 0x00cbc8a, 512, 256 },
+ { 0x11a0000, 0x00d0ee2, 512, 256 },
+ { 0x1200000, 0x00d4d76, 512, 256 },
+ { 0x1260000, 0x00d8a4f, 512, 256 },
+ { 0x12c0000, 0x00dc980, 512, 256 },
+ { 0x1320000, 0x00e07ba, 512, 256 },
+ { 0x1380000, 0x00e45a2, 512, 256 },
+ { 0x13e0000, 0x00e842e, 512, 256 },
+ { 0x1440000, 0x00ec0db, 512, 256 },
+ { 0x14a0000, 0x00efdae, 512, 256 },
+ { 0x1500000, 0x00f3c99, 512, 256 },
+ { 0x1560000, 0x00f794f, 512, 256 },
+ { 0x15c0000, 0x00fb5db, 512, 256 },
+ { 0x1620000, 0x00ff2e6, 512, 256 },
+ { 0x1680000, 0x0103156, 512, 256 },
+ { 0x16e0000, 0x0106fcf, 512, 256 },
+ { 0x1740000, 0x010ae0c, 512, 256 },
+ { 0x17a0000, 0x010edaf, 512, 256 },
+ { 0x1800000, 0x0112bac, 512, 256 },
+ { 0x1860000, 0x01169c1, 128, 128 },
+ { 0x186c000, 0x0119b95, 128, 128 },
+ { 0x1878000, 0x011d0dc, 128, 128 },
+ { 0x1884000, 0x01205ca, 128, 128 },
+ { 0x1890000, 0x01236b2, 128, 128 },
+ { 0x189c000, 0x01268ff, 128, 128 },
+ { 0x18a8000, 0x0129bef, 128, 128 },
+ { 0x18b4000, 0x012cf51, 128, 128 },
+ { 0x18c0000, 0x0130331, 128, 128 },
+ { 0x18cc000, 0x013370d, 128, 128 },
+ { 0x18d8000, 0x0136a80, 128, 128 },
+ { 0x18e4000, 0x0139d2a, 128, 128 },
+ { 0x18f0000, 0x013ce39, 128, 128 },
+ { 0x18fc000, 0x0140236, 128, 128 },
+ { 0x1908000, 0x0143701, 128, 128 },
+ { 0x1914000, 0x0146cb3, 128, 128 },
+ { 0x1920000, 0x014a40d, 128, 128 },
+ { 0x192c000, 0x014da18, 128, 128 },
+ { 0x1938000, 0x0150ea4, 512, 256 },
+ { 0x1998000, 0x0154e17, 512, 256 },
+ { 0x19f8000, 0x0158ddf, 512, 256 },
+ { 0x1a58000, 0x015cd80, 512, 256 },
+ { 0x1ab8000, 0x0160d5b, 512, 256 },
+ { 0x1b18000, 0x0164d2f, 512, 256 },
+ { 0x1b78000, 0x017b5db, 512, 256 },
+ { 0x1bd8000, 0x017f2e6, 512, 256 },
+ { -1,-1,-1,-1}
+ };
+
+static WRITE16_HANDLER( sliver_RAMDAC_offset_w )
+{
+ clr_offset=data*3;
+}
+
+static WRITE16_HANDLER( sliver_RAMDAC_color_w )
+{
+ colorram[clr_offset]=data;
+ clr_offset=(clr_offset+1)%768;
+}
+
+static void plot_pixel_rgb(int x, int y, UINT32 r, UINT32 g, UINT32 b)
+{
+ UINT16 color;
+
+ if(y<0 ||x<0 || x>383 || y> 255) return;
+
+ if (sliver_bitmap_bg->bpp == 32)
+ {
+ *BITMAP_ADDR32(sliver_bitmap_bg, y, x) = r | (g<<8) | (b<<16);
+ }
+ else
+ {
+ r>>=3;
+ g>>=3;
+ b>>=3;
+ color = r|(g<<5)|(b<<10);
+ *BITMAP_ADDR16(sliver_bitmap_bg, y, x) = color;
+ }
+}
+
+static void plot_pixel_pal(int x, int y, int addr)
+{
+ UINT32 r,g,b;
+ UINT16 color;
+ if(y<0 ||x<0 || x>383 || y> 255) return;
+ addr*=3;
+
+ b=colorram[addr]<<2;
+ g=colorram[addr+1]<<2;
+ r=colorram[addr+2]<<2;
+
+ if (sliver_bitmap_fg->bpp == 32)
+ {
+
+ *BITMAP_ADDR32(sliver_bitmap_fg, y, x) = r | (g<<8) | (b<<16);
+ }
+ else
+ {
+ r>>=3;
+ g>>=3;
+ b>>=3;
+ color = r|(g<<5)|(b<<10);
+ *BITMAP_ADDR16(sliver_bitmap_fg, y, x) = color;
+ }
+}
+
+static WRITE16_HANDLER( fifo_data_w )
+{
+ if(tmp_counter<8)
+ {
+ COMBINE_DATA(&tempbuf[tmp_counter]);
+ tmp_counter++;
+ if(tmp_counter==8) // copy 8 bytes to fifo, every byte should be copied directly, but it's easier to copy whole commands
+ {
+ do
+ {
+ fifo[fptr++]=tempbuf[8-tmp_counter];
+ if(fptr>(FIFO_SIZE-1))
+ {
+ fptr=FIFO_SIZE-1;
+ }
+ }
+ while(--tmp_counter>0);
+ }
+ }
+}
+
+static void blit_gfx(void)
+{
+ int tmpptr=0;
+ while(tmpptr<fptr)
+ {
+ int x,y,romdata;
+ int w,h;
+ int romoffs=fifo[tmpptr+0]+(fifo[tmpptr+1]<<8)+(fifo[tmpptr+2]<<16);
+
+ w=fifo[tmpptr+3]+1;
+ h=fifo[tmpptr+4]+1;
+
+ if( fifo[tmpptr+7]==0)
+ {
+ for (y=0;y<h;y++)
+ {
+ for (x=0;x<w;x++)
+ {
+ romdata = memory_region(REGION_USER1)[romoffs&0x1fffff];
+ if(romdata)
+ {
+ plot_pixel_pal(fifo[tmpptr+5]+fifo[tmpptr+3]-x, fifo[tmpptr+6]+fifo[tmpptr+4]-y, romdata);
+ }
+ romoffs++;
+ }
+ }
+ }
+ tmpptr+=COMMAND_SIZE;
+ }
+}
+
+static WRITE16_HANDLER( fifo_clear_w )
+{
+ fillbitmap(sliver_bitmap_fg, 0,0);
+ fptr=0;
+ tmp_counter=0;
+}
+
+static WRITE16_HANDLER( fifo_flush_w )
+{
+ blit_gfx();
+}
+
+
+static WRITE16_HANDLER( jpeg1_w )
+{
+ COMBINE_DATA(&jpeg1);
+}
+
+static void render_jpeg(void)
+{
+ int x,y;
+ int addr=jpeg_addr;
+ fillbitmap(sliver_bitmap_bg, 0,0);
+ if(jpeg_addr<0)
+ {
+ return;
+ }
+ for (y=0;y<jpeg_h;y++)
+ {
+ for (x=0;x<jpeg_w;x++)
+ {
+ plot_pixel_rgb(x-x_offset+jpeg_x,jpeg_h-y-y_offset-jpeg_y,memory_region(REGION_USER3)[addr],memory_region(REGION_USER3)[addr+1],memory_region(REGION_USER3)[addr+2]);
+ addr+=3;
+ }
+ }
+}
+
+static int find_data(int offset)
+{
+ int idx=0;
+ while(gfxlookup[idx][0]>=0)
+ {
+ if(offset==gfxlookup[idx][1])
+ {
+ return idx;
+ }
+ ++idx;
+ }
+ return -1;
+}
+
+static WRITE16_HANDLER( jpeg2_w )
+{
+ COMBINE_DATA(&jpeg2);
+
+ {
+ int idx=find_data((int)jpeg2+(((int)jpeg1)<<16));
+ if(idx>=0)
+ {
+ jpeg_addr=gfxlookup[idx][0];
+ jpeg_w=gfxlookup[idx][2];
+ jpeg_h=gfxlookup[idx][3];
+ render_jpeg();
+ }
+ else
+ {
+ jpeg_addr=-1;
+ }
+ }
+}
+
+static WRITE16_HANDLER(io_offset_w)
+{
+ COMBINE_DATA(&io_offset);
+}
+
+static WRITE16_HANDLER(io_data_w)
+{
+ if(io_offset<IO_SIZE)
+ {
+ int tmpx,tmpy;
+ COMBINE_DATA(&io_reg[io_offset]);
+
+ tmpy=io_reg[0x1a]+(io_reg[0x1b]<<8)-io_reg[0x20]; //0x20 ???
+ tmpx=io_reg[0x1e]+(io_reg[0x1f]<<8);
+
+ if(tmpy!=jpeg_y || tmpx!=jpeg_x)
+ {
+ jpeg_x=tmpx;
+ jpeg_y=tmpy;
+ render_jpeg();
+ }
+ }
+ else
+ {
+ logerror("I/O access out of range: %x\n", io_offset);
+ }
+}
+
+static WRITE16_HANDLER(sound_w)
+{
+ soundlatch_w(0,data & 0xff);
+ cpunum_set_input_line(1, I8051_INT0_LINE, HOLD_LINE);
+}
+
+static ADDRESS_MAP_START( sliver_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x0fffff) AM_ROM
+
+ AM_RANGE(0x100000, 0x100001) AM_WRITE(sliver_RAMDAC_offset_w)
+ AM_RANGE(0x100002, 0x100003) AM_WRITE(sliver_RAMDAC_color_w)
+ AM_RANGE(0x100004, 0x100005) AM_WRITE(MWA16_NOP)//RAMDAC
+
+ AM_RANGE(0x300002, 0x300003) AM_NOP // bit 0 tested, writes 0xe0 and 0xc0 - both r and w at the end of interrupt code
+
+ AM_RANGE(0x300004, 0x300005) AM_WRITE(io_offset_w) //unknown i/o device
+ AM_RANGE(0x300006, 0x300007) AM_WRITE(io_data_w)
+
+ AM_RANGE(0x400000, 0x400001) AM_READ(input_port_0_word_r)
+ AM_RANGE(0x400002, 0x400003) AM_READ(input_port_1_word_r)
+ AM_RANGE(0x400004, 0x400005) AM_READ(input_port_2_word_r)
+ AM_RANGE(0x400006, 0x400007) AM_WRITE(fifo_data_w)
+ AM_RANGE(0x400008, 0x400009) AM_WRITE(fifo_clear_w)
+ AM_RANGE(0x40000a, 0x40000b) AM_WRITE(fifo_flush_w)
+ AM_RANGE(0x40000c, 0x40000d) AM_WRITE(jpeg1_w)
+ AM_RANGE(0x40000e, 0x40000f) AM_WRITE(jpeg2_w)
+
+ AM_RANGE(0x400010, 0x400015) AM_WRITENOP //unknown
+ AM_RANGE(0x400016, 0x400017) AM_WRITE(sound_w)
+ AM_RANGE(0x400018, 0x400019) AM_WRITENOP //unknown
+
+ AM_RANGE(0xff0000, 0xffffff) AM_RAM
+ADDRESS_MAP_END
+
+// Sound CPU
+
+static WRITE8_HANDLER(oki_setbank)
+{
+ UINT8 *sound = memory_region(REGION_SOUND1);
+ int bank=(data^0xff)&3; //xor or not ?
+ memcpy(sound+0x20000, sound+0x100000+0x20000*bank, 0x20000);
+}
+
+static ADDRESS_MAP_START( soundmem_prg, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0xffff) AM_ROM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( soundmem_data, ADDRESS_SPACE_DATA, 8 )
+ AM_RANGE(0x0100, 0x0100) AM_READWRITE( OKIM6295_status_0_r, OKIM6295_data_0_w )
+ AM_RANGE(0x0101, 0x0101) AM_READ(soundlatch_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( soundmem_io, ADDRESS_SPACE_IO, 8 )
+ AM_RANGE(0x0001, 0x0001) AM_WRITE( oki_setbank )
+ADDRESS_MAP_END
+
+static VIDEO_START(sliver)
+{
+ sliver_bitmap_bg = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
+ sliver_bitmap_fg = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
+}
+
+static VIDEO_UPDATE(sliver)
+{
+ copybitmap(bitmap, sliver_bitmap_bg, 0, 0, 0, 0, cliprect, TRANSPARENCY_NONE, 0);
+ copybitmap(bitmap, sliver_bitmap_fg, 0, 0, 0, 0, cliprect, TRANSPARENCY_PEN, 0);
+ return 0;
+}
+
+static INPUT_PORTS_START( sliver )
+
+ PORT_START
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) //jpeg ready flag
+ PORT_BIT( 0xffa4, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_DIPNAME( 0x000f, 0x000f, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x000f, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x000e, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x000d, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x000c, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x000b, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x0030, 0x0020, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x0030, "2" )
+ PORT_DIPSETTING( 0x0020, "3" )
+ PORT_DIPSETTING( 0x0010, "4" )
+ PORT_DIPSETTING( 0x0000, "5" )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, "Demo_Sounds" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // unknown
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+INPUT_PORTS_END
+
+static INTERRUPT_GEN( sliver_int )
+{
+ //valid interrupts are 2,3,4
+ cpunum_set_input_line(0, 2+cpu_getiloops(), HOLD_LINE);
+}
+
+static MACHINE_DRIVER_START( sliver )
+ MDRV_CPU_ADD_TAG("main", M68000, 12000000)
+ MDRV_CPU_PROGRAM_MAP(sliver_map,0)
+ MDRV_CPU_VBLANK_INT(sliver_int,3)
+
+ MDRV_CPU_ADD(I8051, 8000000)
+ MDRV_CPU_PROGRAM_MAP(soundmem_prg,0)
+ MDRV_CPU_DATA_MAP(soundmem_data,0)
+ MDRV_CPU_IO_MAP(soundmem_io,0)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+
+ MDRV_SCREEN_SIZE(64*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 384-1-16, 0*8, 240-1)
+
+ MDRV_VIDEO_START(sliver)
+ MDRV_VIDEO_UPDATE(sliver)
+
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(OKIM6295, 1000000)
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.6)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.6)
+MACHINE_DRIVER_END
+
+ROM_START( sliver )
+ ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "ka-4.bin", 0x00001, 0x20000, CRC(4906367f) SHA1(cc030930ffe7018ba6c362cab136798d027db7d8) )
+ ROM_LOAD16_BYTE( "ka-5.bin", 0x00000, 0x20000, CRC(f260dabc) SHA1(3727cb8aa652809386075b39a1d85d5b20973702) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 8031 */
+ ROM_LOAD( "ka-1.bin", 0x000000, 0x10000, CRC(56e616a2) SHA1(f8952aba62ae0410e300d99e95dc8b752543af1e) )
+
+ ROM_REGION( 0x180000, REGION_SOUND1, 0 ) /* Samples */
+ ROM_LOAD( "ka-2.bin", 0x000000, 0x20000, CRC(3df96eb0) SHA1(ec3dfc29da08f6525a1c708839f83094a6784f72) )
+ ROM_LOAD( "ka-3.bin", 0x100000, 0x80000, CRC(33ee929c) SHA1(a652ad68c547248ef5fa1ed8006b7ac7aef76383) )
+
+ ROM_REGION( 0x200000, REGION_USER1, 0 ) /* Graphics (not tiles) */
+ ROM_LOAD16_BYTE( "ka-8.bin", 0x000000, 0x80000, CRC(dbfd7489) SHA1(4a7b07d041dce04a8d8d6688698164f988baefc9) )
+ ROM_LOAD16_BYTE( "ka-6.bin", 0x000001, 0x80000, CRC(bd182316) SHA1(a22db9f73a2865f59630183c14201aeede821642) )
+ ROM_LOAD16_BYTE( "ka-9.bin", 0x100000, 0x40000, CRC(71f044ba) SHA1(bd88bfaa0249de9fd8eb8bd25eae0126744a9046) )
+ ROM_LOAD16_BYTE( "ka-7.bin", 0x100001, 0x40000, CRC(1c5d6fb9) SHA1(372533264eb41a5f57b2a59eb039adb6334f36c5) )
+
+ ROM_REGION( 0x180000, REGION_USER2, 0 ) /* JPEG(!) compressed GFX */
+ ROM_LOAD( "ka-10.bin", 0x000000, 0x80000, CRC(a6824271) SHA1(2eefa4e61491f7b72ccde744fa6f88a1a3c60c92) )
+ ROM_LOAD( "ka-11.bin", 0x080000, 0x80000, CRC(4ae121ff) SHA1(ece7cc07483801a0d436def977d72dc7b1a07c8f) )
+ ROM_LOAD( "ka-12.bin", 0x100000, 0x80000, CRC(0901e142) SHA1(68ebd38beeedf53414a831c01813881feee33446) )
+
+ ROM_REGION( 0x2000000, REGION_USER3, 0 ) /* decompressed GFX - temporary!*/
+ ROM_LOAD( "gfx.bin", 0x000000, 0x2000000, BAD_DUMP CRC(706f264e) SHA1(dbcc8dbf30bd65d86bcde7d6db1b08af4242a253) )
+ROM_END
+
+static DRIVER_INIT(sliver)
+{
+ colorram=auto_malloc(256*3);
+}
+
+GAME( 1996, sliver, 0, sliver, sliver, sliver, ROT0, "Hollow Corp", "Sliver", GAME_IMPERFECT_GRAPHICS )