/*************************************************************************** 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; } /******************************************************************************/