diff options
Diffstat (limited to 'src/mame/drivers/sliver.c')
-rw-r--r-- | src/mame/drivers/sliver.c | 594 |
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 ) |