diff options
Diffstat (limited to 'src/mame/video/dec8.c')
-rw-r--r-- | src/mame/video/dec8.c | 823 |
1 files changed, 823 insertions, 0 deletions
diff --git a/src/mame/video/dec8.c b/src/mame/video/dec8.c new file mode 100644 index 00000000000..6f3e222bc22 --- /dev/null +++ b/src/mame/video/dec8.c @@ -0,0 +1,823 @@ +/*************************************************************************** + +Cobra Command: + 2 BAC06 background generator chips, same as Dec0. + 1 MXC06 chip for sprites, same as Dec0. + 256 colours, palette generated by ram. + +The Real Ghostbusters: +1 Deco VSC30 (M60348) +1 Deco HMC20 (M60232) + + 1 playfield, same as above, with rowscroll + 1024 colours from 2 proms. + Sprite hardware close to above, there are some unused (unknown) bits per sprite. + +Super Real Darwin: + 1 playfield, x-scroll only + Closer to earlier Darwin 4078 board than above games. + +Last Mission/Shackled: + Has 1 Deco VSC30 (M60348) (From readme file) + Has 1 Deco HMC20 (M60232) (From readme file) + + 1 playfield + Sprite hardware same as Karnov. + (Shackled) Palettes 8-15 for tiles seem to have priority over sprites. + +Gondomania: + Has two large square surface mount chips: [ DRL 40, 8053, 8649a ] + Has 1 Deco VSC30 (M60348) + Has 1 Deco HMC20 (M60232) + Priority - all tiles with *pens* 8-15 appear over sprites with palettes 8-15. + +Oscar: + Uses MXC-06 custom chip for sprites. + Uses BAC-06 custom chip for background. + I can't find what makes the fix chars... + Priority - tiles with palettes 8-15 have their *pens* 8-15 appearing over +sprites. + +***************************************************************************/ + +#include "driver.h" + +//static int scroll1[4]; +static int scroll2[4]; +static tilemap *dec8_pf0_tilemap,*dec8_pf1_tilemap,*dec8_fix_tilemap; +static int dec8_pf0_control[0x20],dec8_pf1_control[0x20]; +static int gfx_mask,game_uses_priority; +UINT8 *dec8_pf0_data,*dec8_pf1_data,*dec8_row; + +/*************************************************************************** + + Convert the color PROMs into a more useable format. + + Real Ghostbusters has two 1024x8 palette PROM. + I don't know the exact values of the resistors between the RAM and the + RGB output. I assumed these values (the same as Commando) + + bit 7 -- 220 ohm resistor -- GREEN + -- 470 ohm resistor -- GREEN + -- 1 kohm resistor -- GREEN + -- 2.2kohm resistor -- GREEN + -- 220 ohm resistor -- RED + -- 470 ohm resistor -- RED + -- 1 kohm resistor -- RED + bit 0 -- 2.2kohm resistor -- RED + + bit 7 -- unused + -- unused + -- unused + -- unused + -- 220 ohm resistor -- BLUE + -- 470 ohm resistor -- BLUE + -- 1 kohm resistor -- BLUE + bit 0 -- 2.2kohm resistor -- BLUE + +***************************************************************************/ +PALETTE_INIT( ghostb ) +{ + int i; + + for (i = 0;i < machine->drv->total_colors;i++) + { + int bit0,bit1,bit2,bit3,r,g,b; + + bit0 = (color_prom[i] >> 0) & 0x01; + bit1 = (color_prom[i] >> 1) & 0x01; + bit2 = (color_prom[i] >> 2) & 0x01; + bit3 = (color_prom[i] >> 3) & 0x01; + r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; + bit0 = (color_prom[i] >> 4) & 0x01; + bit1 = (color_prom[i] >> 5) & 0x01; + bit2 = (color_prom[i] >> 6) & 0x01; + bit3 = (color_prom[i] >> 7) & 0x01; + g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; + bit0 = (color_prom[i + machine->drv->total_colors] >> 0) & 0x01; + bit1 = (color_prom[i + machine->drv->total_colors] >> 1) & 0x01; + bit2 = (color_prom[i + machine->drv->total_colors] >> 2) & 0x01; + bit3 = (color_prom[i + machine->drv->total_colors] >> 3) & 0x01; + b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; + + palette_set_color(machine,i,MAKE_RGB(r,g,b)); + } +} + +WRITE8_HANDLER( dec8_bac06_0_w ) +{ + dec8_pf0_control[offset]=data; +} + +WRITE8_HANDLER( dec8_bac06_1_w ) +{ + dec8_pf1_control[offset]=data; +} + +WRITE8_HANDLER( dec8_pf0_data_w ) +{ + dec8_pf0_data[offset]=data; + tilemap_mark_tile_dirty(dec8_pf0_tilemap,offset/2); +} + +WRITE8_HANDLER( dec8_pf1_data_w ) +{ + dec8_pf1_data[offset]=data; + tilemap_mark_tile_dirty(dec8_pf1_tilemap,offset/2); +} + +READ8_HANDLER( dec8_pf0_data_r ) +{ + return dec8_pf0_data[offset]; +} + +READ8_HANDLER( dec8_pf1_data_r ) +{ + return dec8_pf1_data[offset]; +} + +WRITE8_HANDLER( dec8_videoram_w ) +{ + videoram[offset]=data; + tilemap_mark_tile_dirty( dec8_fix_tilemap,offset/2 ); +} + +WRITE8_HANDLER( srdarwin_videoram_w ) +{ + videoram[offset]=data; + tilemap_mark_tile_dirty( dec8_fix_tilemap,offset ); +} + +#ifdef UNUSED_FUNCTION +WRITE8_HANDLER( dec8_scroll1_w ) +{ + scroll1[offset]=data; +} +#endif + +WRITE8_HANDLER( dec8_scroll2_w ) +{ + scroll2[offset]=data; +} + +WRITE8_HANDLER( srdarwin_control_w ) +{ + int bankaddress; + UINT8 *RAM = memory_region(REGION_CPU1); + + switch (offset) { + case 0: /* Top 3 bits - bank switch, bottom 4 - scroll MSB */ + bankaddress = 0x10000 + (data >> 5) * 0x4000; + memory_set_bankptr(1,&RAM[bankaddress]); + scroll2[0]=data&0xf; + return; + + case 1: + scroll2[1]=data; + return; + } +} + +WRITE8_HANDLER( lastmiss_control_w ) +{ + UINT8 *RAM = memory_region(REGION_CPU1); + + /* + Bit 0x0f - ROM bank switch. + Bit 0x10 - Unused + Bit 0x20 - X scroll MSB + Bit 0x40 - Y scroll MSB + Bit 0x80 - Hold subcpu reset line high if clear, else low + */ + memory_set_bankptr(1,&RAM[0x10000 + (data & 0x0f) * 0x4000]); + + scroll2[0]=(data>>5)&1; + scroll2[2]=(data>>6)&1; + + if (data&0x80) + cpunum_set_input_line(1, INPUT_LINE_RESET, CLEAR_LINE); + else + cpunum_set_input_line(1, INPUT_LINE_RESET, ASSERT_LINE); +} + +WRITE8_HANDLER( shackled_control_w ) +{ + int bankaddress; + UINT8 *RAM = memory_region(REGION_CPU1); + + /* Bottom 4 bits - bank switch, Bits 4 & 5 - Scroll MSBs */ + bankaddress = 0x10000 + (data & 0x0f) * 0x4000; + memory_set_bankptr(1,&RAM[bankaddress]); + + scroll2[0]=(data>>5)&1; + scroll2[2]=(data>>6)&1; +} + +WRITE8_HANDLER( lastmiss_scrollx_w ) +{ + scroll2[1]=data; +} + +WRITE8_HANDLER( lastmiss_scrolly_w ) +{ + scroll2[3]=data; +} + +WRITE8_HANDLER( gondo_scroll_w ) +{ + switch (offset) { + case 0x0: + scroll2[1]=data; /* X LSB */ + break; + case 0x8: + scroll2[3]=data; /* Y LSB */ + break; + case 0x10: + scroll2[0]=(data>>0)&1; /* Bit 0: X MSB */ + scroll2[2]=(data>>1)&1; /* Bit 1: Y MSB */ + /* Bit 2 is also used in Gondo & Garyoret */ + break; + } +} + +/******************************************************************************/ + +/* 'Karnov' sprites, used by Gondomania, Last Mission, Shackled, Ghostbusters */ +static void draw_sprites1(running_machine* machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority) +{ + int offs,x,y,sprite,sprite2,colour,extra,fx,fy; + + for (offs = 0;offs < 0x800;offs += 8) + { + y=buffered_spriteram[offs+1]+(buffered_spriteram[offs]<<8); + if ((y&0x8000) == 0) continue; + + fx=buffered_spriteram[offs+3]; + + if ((fx&0x1) == 0) continue; + + extra=fx&0x10; + fy=fx&0x2; + fx=fx&0x4; + + x = buffered_spriteram[offs+5]+(buffered_spriteram[offs+4]<<8); + colour = buffered_spriteram[offs+6] >> 4; + if (priority==1 && (colour&8)) continue; + if (priority==2 && !(colour&8)) continue; + sprite = buffered_spriteram[offs+7]+(buffered_spriteram[offs+6]<<8); + sprite &= 0x0fff; + + if (extra) {y=y+16;sprite&=0xffe;} + + x = x & 0x01ff; + y = y & 0x01ff; + x=(x+16)%0x200; + y=(y+16)%0x200; + x=256 - x; + y=256 - y; + if (flip_screen) { + y=240-y; + x=240-x; + if (fx) fx=0; else fx=1; + if (fy) fy=0; else fy=1; + if (extra) y=y-16; + } + + /* Y Flip determines order of multi-sprite */ + if (extra && fy) { + sprite2=sprite; + sprite++; + } + else + sprite2=sprite+1; + + drawgfx(bitmap,machine->gfx[1], + sprite, + colour,fx,fy,x,y, + cliprect,TRANSPARENCY_PEN,0); + + /* 1 more sprite drawn underneath */ + if (extra) + drawgfx(bitmap,machine->gfx[1], + sprite2, + colour,fx,fy,x,y+16, + cliprect,TRANSPARENCY_PEN,0); + } +} + +/* 'Dec0' sprites, used by Cobra Command, Oscar */ +static void draw_sprites2(running_machine* machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority) +{ + int offs,x,y,sprite,colour,multi,fx,fy,inc,flash,mult; + + /* Sprites */ + for (offs = 0;offs < 0x800;offs += 8) + { + y =buffered_spriteram[offs+1]+(buffered_spriteram[offs]<<8); + if ((y&0x8000) == 0) continue; + x = buffered_spriteram[offs+5]+(buffered_spriteram[offs+4]<<8); + colour = ((x & 0xf000) >> 12); + flash=x&0x800; + if (flash && (cpu_getcurrentframe() & 1)) continue; + + if (priority==1 && (colour&4)) continue; + if (priority==2 && !(colour&4)) continue; + + fx = y & 0x2000; + fy = y & 0x4000; + multi = (1 << ((y & 0x1800) >> 11)) - 1; /* 1x, 2x, 4x, 8x height */ + + /* multi = 0 1 3 7 */ + sprite = buffered_spriteram[offs+3]+(buffered_spriteram[offs+2]<<8); + sprite &= 0x0fff; + + x = x & 0x01ff; + y = y & 0x01ff; + if (x >= 256) x -= 512; + if (y >= 256) y -= 512; + x = 240 - x; + y = 240 - y; + + sprite &= ~multi; + if (fy) + inc = -1; + else + { + sprite += multi; + inc = 1; + } + + if (flip_screen) { + y=240-y; + x=240-x; + if (fx) fx=0; else fx=1; + if (fy) fy=0; else fy=1; + mult=16; + } + else mult=-16; + + while (multi >= 0) + { + drawgfx(bitmap,machine->gfx[1], + sprite - multi * inc, + colour, + fx,fy, + x,y + mult * multi, + cliprect,TRANSPARENCY_PEN,0); + multi--; + } + } +} + +static void srdarwin_draw_sprites(running_machine* machine, mame_bitmap *bitmap, const rectangle *cliprect, int pri) +{ + int offs; + + /* Sprites */ + for (offs = 0;offs < 0x200;offs += 4) + { + int multi,fx,sx,sy,sy2,code,color; + + color = (buffered_spriteram[offs+1] & 0x03) + ((buffered_spriteram[offs+1] & 0x08) >> 1); + if (pri==0 && color!=0) continue; + if (pri==1 && color==0) continue; + + code = buffered_spriteram[offs+3] + ( ( buffered_spriteram[offs+1] & 0xe0 ) << 3 ); + if (!code) continue; + + sy = buffered_spriteram[offs]; + if (sy == 0xf8) continue; + + sx = (241 - buffered_spriteram[offs+2]); + + fx = buffered_spriteram[offs+1] & 0x04; + multi = buffered_spriteram[offs+1] & 0x10; + + if (flip_screen) { + sy=240-sy; + sx=240-sx; + if (fx) fx=0; else fx=1; + sy2=sy-16; + } + else sy2=sy+16; + + drawgfx(bitmap,machine->gfx[1], + code, + color, + fx,flip_screen, + sx,sy, + cliprect,TRANSPARENCY_PEN,0); + if (multi) + drawgfx(bitmap,machine->gfx[1], + code+1, + color, + fx,flip_screen, + sx,sy2, + cliprect,TRANSPARENCY_PEN,0); + } +} + +/* Draw character tiles, each game has different colour masks */ +#if 0 +static void draw_characters(running_machine* machine, mame_bitmap *bitmap, const rectangle *cliprect, int mask, int shift) +{ + int mx,my,tile,color,offs; + + for (offs = 0x800 - 2;offs >= 0;offs -= 2) { + tile=videoram[offs+1]+((videoram[offs]&0xf)<<8); + + if (!tile) continue; + + color=(videoram[offs]&mask)>>shift; + mx = (offs/2) % 32; + my = (offs/2) / 32; + + drawgfx(bitmap,machine->gfx[0], + tile,color,0,0,8*mx,8*my, + cliprect,TRANSPARENCY_PEN,0); + } +} +#endif + +/******************************************************************************/ + +VIDEO_UPDATE( cobracom ) +{ + tilemap_set_scrollx( dec8_pf0_tilemap,0, (dec8_pf0_control[0x10]<<8)+dec8_pf0_control[0x11] ); + tilemap_set_scrolly( dec8_pf0_tilemap,0, (dec8_pf0_control[0x12]<<8)+dec8_pf0_control[0x13] ); + tilemap_set_scrollx( dec8_pf1_tilemap,0, (dec8_pf1_control[0x10]<<8)+dec8_pf1_control[0x11] ); + tilemap_set_scrolly( dec8_pf1_tilemap,0, (dec8_pf1_control[0x12]<<8)+dec8_pf1_control[0x13] ); + flip_screen_set(dec8_pf0_control[0]>>7); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,0,0); + draw_sprites2(machine,bitmap,cliprect,1); + tilemap_draw(bitmap,cliprect,dec8_pf1_tilemap,0,0); + draw_sprites2(machine,bitmap,cliprect,2); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +/******************************************************************************/ + +static TILE_GET_INFO( get_bac0_tile_info ) +{ + int tile,color,offs=tile_index<<1; + + tile=(dec8_pf0_data[offs]<<8) | dec8_pf0_data[offs+1]; + color=tile >> 12; + if (color>7 && game_uses_priority) tileinfo->category=1; else tileinfo->category=0; + + SET_TILE_INFO( + 2, + tile&0xfff, + color&gfx_mask, + 0); +} + +static TILE_GET_INFO( get_bac1_tile_info ) +{ + int tile,color,offs=tile_index<<1; + + tile=(dec8_pf1_data[offs]<<8) | dec8_pf1_data[offs+1]; + color=tile >> 12; + if (color>7 && game_uses_priority) tileinfo->category=1; else tileinfo->category=0; + + SET_TILE_INFO( + 3, + tile&0xfff, + color&3, + 0); +} + +static TILEMAP_MAPPER( bac0_scan_rows ) +{ + /* logical (col,row) -> memory offset */ + return ((col & 0x0f) + ((row & 0x0f) << 4)) + ((col & 0x10) << 5) + ((row & 0x10) << 4); +} + +static TILE_GET_INFO( get_cobracom_fix_tile_info ) +{ + int offs=tile_index<<1; + int tile=videoram[offs+1]+(videoram[offs]<<8); + int color=(tile&0xe000) >> 13; + + SET_TILE_INFO( + 0, + tile&0xfff, + color, + 0); +} + +VIDEO_START( cobracom ) +{ + dec8_pf0_tilemap = tilemap_create(get_bac0_tile_info,bac0_scan_rows,0,16,16,32,32); + dec8_pf1_tilemap = tilemap_create(get_bac1_tile_info,bac0_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); + dec8_fix_tilemap = tilemap_create(get_cobracom_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + + tilemap_set_transparent_pen(dec8_pf1_tilemap,0); + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + + game_uses_priority=0; + gfx_mask=0x3; +} + +/******************************************************************************/ + +VIDEO_UPDATE( ghostb ) +{ + if (dec8_pf0_control[0]&0x4) { /* Rowscroll */ + int offs; + + tilemap_set_scroll_rows(dec8_pf0_tilemap,512); + for (offs = 0;offs < 512;offs+=2) + tilemap_set_scrollx( dec8_pf0_tilemap,offs/2, (dec8_pf0_control[0x10]<<8)+dec8_pf0_control[0x11] + (dec8_row[offs]<<8)+dec8_row[offs+1] ); + } else { + tilemap_set_scroll_rows(dec8_pf0_tilemap,1); + tilemap_set_scrollx( dec8_pf0_tilemap,0, (dec8_pf0_control[0x10]<<8)+dec8_pf0_control[0x11] ); + } + tilemap_set_scrolly( dec8_pf0_tilemap,0, (dec8_pf0_control[0x12]<<8)+dec8_pf0_control[0x13] ); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,0,0); + draw_sprites1(machine,bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +static TILE_GET_INFO( get_ghostb_fix_tile_info ) +{ + int offs=tile_index<<1; + int tile=videoram[offs+1]+(videoram[offs]<<8); + int color=(tile&0xc00) >> 10; + + SET_TILE_INFO( + 0, + tile&0x3ff, + color, + 0); +} + +VIDEO_START( ghostb ) +{ + dec8_pf0_tilemap = tilemap_create(get_bac0_tile_info,bac0_scan_rows,0,16,16,32,32); + dec8_fix_tilemap = tilemap_create(get_ghostb_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + + game_uses_priority=0; + gfx_mask=0xf; +} + +/******************************************************************************/ + +VIDEO_UPDATE( oscar ) +{ + tilemap_set_scrollx( dec8_pf0_tilemap,0, (dec8_pf0_control[0x10]<<8)+dec8_pf0_control[0x11] ); + tilemap_set_scrolly( dec8_pf0_tilemap,0, (dec8_pf0_control[0x12]<<8)+dec8_pf0_control[0x13] ); + flip_screen_set(dec8_pf0_control[1]>>7); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER1 | 0,0); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER1 | 1,0); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER0 | 0,0); + draw_sprites2(machine,bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER0 | 1,0); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +static TILE_GET_INFO( get_oscar_fix_tile_info ) +{ + int offs=tile_index<<1; + int tile=videoram[offs+1]+(videoram[offs]<<8); + int color=(tile&0xf000) >> 14; + + SET_TILE_INFO( + 0, + tile&0xfff, + color, + 0); +} + +VIDEO_START( oscar ) +{ + dec8_pf0_tilemap = tilemap_create(get_bac0_tile_info,bac0_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); + dec8_fix_tilemap = tilemap_create(get_oscar_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + tilemap_set_transmask(dec8_pf0_tilemap,0,0x00ff,0xff00); /* Bottom 8 pens */ + + game_uses_priority=1; + gfx_mask=0x7; +} + +/******************************************************************************/ + +VIDEO_UPDATE( lastmiss ) +{ + tilemap_set_scrollx( dec8_pf0_tilemap,0, ((scroll2[0]<<8)+scroll2[1]) ); + tilemap_set_scrolly( dec8_pf0_tilemap,0, ((scroll2[2]<<8)+scroll2[3]) ); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,0,0); + draw_sprites1(machine,bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( shackled ) +{ + tilemap_set_scrollx( dec8_pf0_tilemap,0, ((scroll2[0]<<8)+scroll2[1]) ); + tilemap_set_scrolly( dec8_pf0_tilemap,0, ((scroll2[2]<<8)+scroll2[3]) ); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER1 | 0,0); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER1 | 1,0); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER0 | 0,0); + draw_sprites1(machine,bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER0 | 1,0); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +static TILEMAP_MAPPER( lastmiss_scan_rows ) +{ + /* logical (col,row) -> memory offset */ + return ((col & 0x0f) + ((row & 0x0f) << 4)) + ((col & 0x10) << 4) + ((row & 0x10) << 5); +} + +static TILE_GET_INFO( get_lastmiss_tile_info ) +{ + int offs=tile_index*2; + int tile=dec8_pf0_data[offs+1]+(dec8_pf0_data[offs]<<8); + int color=tile >> 12; + + if (color>7 && game_uses_priority) tileinfo->category=1; else tileinfo->category=0; + + SET_TILE_INFO( + 2, + tile&0xfff, + color, + 0); +} + +static TILE_GET_INFO( get_lastmiss_fix_tile_info ) +{ + int offs=tile_index<<1; + int tile=videoram[offs+1]+(videoram[offs]<<8); + int color=(tile&0xc000) >> 14; + + SET_TILE_INFO( + 0, + tile&0xfff, + color, + 0); +} + +VIDEO_START( lastmiss ) +{ + dec8_pf0_tilemap = tilemap_create(get_lastmiss_tile_info,lastmiss_scan_rows,0,16,16,32,32); + dec8_fix_tilemap = tilemap_create(get_lastmiss_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + game_uses_priority=0; +} + +VIDEO_START( shackled ) +{ + dec8_pf0_tilemap = tilemap_create(get_lastmiss_tile_info,lastmiss_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); + dec8_fix_tilemap = tilemap_create(get_lastmiss_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + tilemap_set_transmask(dec8_pf0_tilemap,0,0x000f,0xfff0); /* Bottom 12 pens */ + game_uses_priority=1; +} + +/******************************************************************************/ + +VIDEO_UPDATE( srdarwin ) +{ + tilemap_set_scrollx( dec8_pf0_tilemap,0, (scroll2[0]<<8)+scroll2[1] ); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER1,0); + srdarwin_draw_sprites(machine,bitmap,cliprect,0); //* (srdarwin37b5gre) + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER0,0); + srdarwin_draw_sprites(machine,bitmap,cliprect,1); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +static TILE_GET_INFO( get_srdarwin_fix_tile_info ) +{ + int tile=videoram[tile_index]; + int color=0; /* ? */ + + if (color>1) tileinfo->category=1; else tileinfo->category=0; + + SET_TILE_INFO( + 0, + tile, + color, + 0); +} + +//AT: improved priority and fixed stage 4+ crashes caused by bank overflow +static TILE_GET_INFO( get_srdarwin_tile_info ) +{ + int tile=dec8_pf0_data[2*tile_index+1]+(dec8_pf0_data[2*tile_index]<<8); + int color=tile >> 12 & 3; + int bank; + + tile=tile&0x3ff; + bank=(tile/0x100)+2; + + SET_TILE_INFO( + bank, + tile, + color, + 0); + tileinfo->group = color; +} + +VIDEO_START( srdarwin ) +{ + dec8_pf0_tilemap = tilemap_create(get_srdarwin_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,16); + dec8_fix_tilemap = tilemap_create(get_srdarwin_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + tilemap_set_transmask(dec8_pf0_tilemap,0,0xffff,0x0000); //* draw as background only + tilemap_set_transmask(dec8_pf0_tilemap,1,0x00ff,0xff00); /* Bottom 8 pens */ + tilemap_set_transmask(dec8_pf0_tilemap,2,0x00ff,0xff00); /* Bottom 8 pens */ + tilemap_set_transmask(dec8_pf0_tilemap,3,0x0000,0xffff); //* draw as foreground only +} + +/******************************************************************************/ + +VIDEO_UPDATE( gondo ) +{ + tilemap_set_scrollx( dec8_pf0_tilemap,0, ((scroll2[0]<<8)+scroll2[1]) ); + tilemap_set_scrolly( dec8_pf0_tilemap,0, ((scroll2[2]<<8)+scroll2[3]) ); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER1,0); + draw_sprites1(machine,bitmap,cliprect,2); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,TILEMAP_DRAW_LAYER0,0); + draw_sprites1(machine,bitmap,cliprect,1); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( garyoret ) +{ + tilemap_set_scrollx( dec8_pf0_tilemap,0, ((scroll2[0]<<8)+scroll2[1]) ); + tilemap_set_scrolly( dec8_pf0_tilemap,0, ((scroll2[2]<<8)+scroll2[3]) ); + + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,0,0); + draw_sprites1(machine,bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,dec8_pf0_tilemap,1,0); + tilemap_draw(bitmap,cliprect,dec8_fix_tilemap,0,0); + return 0; +} + +static TILE_GET_INFO( get_gondo_fix_tile_info ) +{ + int offs=tile_index*2; + int tile=videoram[offs+1]+(videoram[offs]<<8); + int color=(tile&0x7000) >> 12; + + SET_TILE_INFO( + 0, + tile&0xfff, + color, + 0); +} + +static TILE_GET_INFO( get_gondo_tile_info ) +{ + int offs=tile_index*2; + int tile=dec8_pf0_data[offs+1]+(dec8_pf0_data[offs]<<8); + int color=tile>> 12; + + if (color>7 && game_uses_priority) tileinfo->category=1; else tileinfo->category=0; + + SET_TILE_INFO( + 2, + tile&0xfff, + color, + 0); +} + +VIDEO_START( gondo ) +{ + dec8_fix_tilemap=tilemap_create(get_gondo_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + dec8_pf0_tilemap=tilemap_create(get_gondo_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); + + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + tilemap_set_transmask(dec8_pf0_tilemap,0,0x00ff,0xff00); /* Bottom 8 pens */ + game_uses_priority=0; +} + +VIDEO_START( garyoret ) +{ + dec8_fix_tilemap=tilemap_create(get_gondo_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + dec8_pf0_tilemap=tilemap_create(get_gondo_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); + + tilemap_set_transparent_pen(dec8_fix_tilemap,0); + game_uses_priority=1; +} + +/******************************************************************************/ |