/*************************************************************************** video.c Functions to emulate the video hardware of the machine. ***************************************************************************/ #include "driver.h" #ifdef MAME_DEBUG int nycaptor_mask=0; #endif static tilemap *bg_tilemap; static int char_bank,palette_bank,gfxctrl; UINT8 *nycaptor_scrlram; static UINT8 *nycaptor_spriteram; extern UINT8 *nycaptor_sharedram; extern int nyc_gametype; /* 298 (e298) - spot (0-3) , 299 (e299) - lives spot number isn't set to 0 in main menu ; lives - yes sprites in main menu req priority 'type' 0 */ static int nycaptor_spot(void) { if(nyc_gametype==0 || nyc_gametype==2) return nycaptor_sharedram[0x299]?nycaptor_sharedram[0x298]:0; else return 0; } WRITE8_HANDLER(nycaptor_spriteram_w) { nycaptor_spriteram[offset]=data; } READ8_HANDLER(nycaptor_spriteram_r) { return nycaptor_spriteram[offset]; } static TILE_GET_INFO( get_tile_info ) { int pal; tileinfo->category = (videoram[tile_index*2 + 1] & 0x30)>>4; pal=videoram[tile_index*2+1]&0x0f; tileinfo->group=0; if((!nycaptor_spot())&&(pal==6))tileinfo->group=1; if(((nycaptor_spot()==3)&&(pal==8))||((nycaptor_spot()==1)&&(pal==0xc)))tileinfo->group=2; if((nycaptor_spot()==1)&&(tileinfo->category==2))tileinfo->group=3; #ifdef MAME_DEBUG if(nycaptor_mask&(1<category)) { if(nycaptor_spot())pal=0xe;else pal=4; } #endif SET_TILE_INFO( 0, videoram[tile_index*2] + ((videoram[tile_index*2+1] & 0xc0) << 2) +0x400 * char_bank, pal,0 ); } VIDEO_START( nycaptor ) { nycaptor_spriteram = auto_malloc (160); bg_tilemap = tilemap_create( get_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32 ); tilemap_set_transmask(bg_tilemap,0,0xf800,0x7ff); //split 0 tilemap_set_transmask(bg_tilemap,1,0xfe00,0x01ff);//split 1 tilemap_set_transmask(bg_tilemap,2,0xfffc,0x0003);//split 2 tilemap_set_transmask(bg_tilemap,3,0xfff0,0x000f);//split 3 paletteram = auto_malloc(0x200); paletteram_2 = auto_malloc(0x200); tilemap_set_scroll_cols(bg_tilemap,32); video_start_generic(machine); } WRITE8_HANDLER( nycaptor_videoram_w ) { videoram[offset] = data; tilemap_mark_tile_dirty(bg_tilemap,offset>>1); } READ8_HANDLER( nycaptor_videoram_r ) { return videoram[offset]; } WRITE8_HANDLER( nycaptor_palette_w ) { if(nyc_gametype==2) //colt return; if (offset & 0x100) paletteram_xxxxBBBBGGGGRRRR_split2_w((offset & 0xff) + (palette_bank << 8),data); else paletteram_xxxxBBBBGGGGRRRR_split1_w((offset & 0xff) + (palette_bank << 8),data); } READ8_HANDLER( nycaptor_palette_r ) { if (offset & 0x100) return paletteram_2[ (offset & 0xff) + (palette_bank << 8) ]; else return paletteram [ (offset & 0xff) + (palette_bank << 8) ]; } WRITE8_HANDLER( nycaptor_gfxctrl_w ) { if (gfxctrl == data) return; gfxctrl = data; if(char_bank != ((data & 0x18) >> 3)) { char_bank=((data & 0x18) >> 3); tilemap_mark_all_tiles_dirty( bg_tilemap ); } palette_bank = (data & 0x20) >> 5; } READ8_HANDLER( nycaptor_gfxctrl_r ) { return gfxctrl; } READ8_HANDLER( nycaptor_scrlram_r ) { return nycaptor_scrlram[offset]; } WRITE8_HANDLER( nycaptor_scrlram_w ) { nycaptor_scrlram[offset] = data; tilemap_set_scrolly(bg_tilemap, offset, data ); } static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect,int pri) { int i; for (i=0;i<0x20;i++) { int pr = nycaptor_spriteram[0x9f-i]; int offs = (pr & 0x1f) * 4; { int code,sx,sy,flipx,flipy,pal,priori; code = nycaptor_spriteram[offs+2] + ((nycaptor_spriteram[offs+1] & 0x10) << 4);//1 bit wolny = 0x20 pal=nycaptor_spriteram[offs+1] & 0x0f; sx = nycaptor_spriteram[offs+3]; sy = 240-nycaptor_spriteram[offs+0]; priori=(pr&0xe0)>>5; if(priori==pri) { #ifdef MAME_DEBUG if(nycaptor_mask&(1<<(pri+4)))pal=0xd; #endif flipx = ((nycaptor_spriteram[offs+1]&0x40)>>6); flipy = ((nycaptor_spriteram[offs+1]&0x80)>>7); drawgfx(bitmap,machine->gfx[1], code, pal, flipx,flipy, sx,sy, cliprect,TRANSPARENCY_PEN,15); if(nycaptor_spriteram[offs+3]>240) { sx = (nycaptor_spriteram[offs+3]-256); drawgfx(bitmap,machine->gfx[1], code, pal, flipx,flipy, sx,sy, cliprect,TRANSPARENCY_PEN,15); } } } } } #ifdef MAME_DEBUG /* Keys : q/w/e/r - bg priority display select a/s/d/f/g/h/j/k - sprite priority display select z - clear x - no bg/sprite pri. */ #define mKEY_MASK(x,y) if (input_code_pressed_once(x)){nycaptor_mask|=y;tilemap_mark_all_tiles_dirty( bg_tilemap );} void nycaptor_setmask(void) { mKEY_MASK(KEYCODE_Q,1); /* bg */ mKEY_MASK(KEYCODE_W,2); mKEY_MASK(KEYCODE_E,4); mKEY_MASK(KEYCODE_R,8); mKEY_MASK(KEYCODE_A,0x10); /* sprites */ mKEY_MASK(KEYCODE_S,0x20); mKEY_MASK(KEYCODE_D,0x40); mKEY_MASK(KEYCODE_F,0x80); mKEY_MASK(KEYCODE_G,0x100); mKEY_MASK(KEYCODE_H,0x200); mKEY_MASK(KEYCODE_J,0x400); mKEY_MASK(KEYCODE_K,0x800); if (input_code_pressed_once(KEYCODE_Z)){nycaptor_mask=0;tilemap_mark_all_tiles_dirty( bg_tilemap );} /* disable */ if (input_code_pressed_once(KEYCODE_X)){nycaptor_mask|=0x1000;tilemap_mark_all_tiles_dirty( bg_tilemap );} /* no layers */ } #endif VIDEO_UPDATE( nycaptor ) { #ifdef MAME_DEBUG nycaptor_setmask(); if(nycaptor_mask&0x1000) { tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|3,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|3,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|2,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|2,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|1,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|1,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|0,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|0,0); draw_sprites(machine, bitmap,cliprect,0); draw_sprites(machine, bitmap,cliprect,1); draw_sprites(machine, bitmap,cliprect,2); draw_sprites(machine, bitmap,cliprect,3); draw_sprites(machine, bitmap,cliprect,4); draw_sprites(machine, bitmap,cliprect,5); draw_sprites(machine, bitmap,cliprect,6); draw_sprites(machine, bitmap,cliprect,7); } else #endif switch (nycaptor_spot()&3) { case 0: tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|3,0); draw_sprites(machine, bitmap,cliprect,6); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|3,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|2,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|2,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|1,0); draw_sprites(machine, bitmap,cliprect,3); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|1,0); draw_sprites(machine, bitmap,cliprect,0); draw_sprites(machine, bitmap,cliprect,2); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|0,0); draw_sprites(machine, bitmap,cliprect,1); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|0,0); break; case 1: tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|3,0); draw_sprites(machine, bitmap,cliprect,3); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|3,0); draw_sprites(machine, bitmap,cliprect,2); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|2,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|1,0); draw_sprites(machine, bitmap,cliprect,1); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|1,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|2,0); draw_sprites(machine, bitmap,cliprect,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|0,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|0,0); break; case 2: tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|3,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|3,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|1,0); draw_sprites(machine, bitmap,cliprect,1); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|1,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|2,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|2,0); draw_sprites(machine, bitmap,cliprect,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|0,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|0,0); break; case 3: tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|1,0); draw_sprites(machine, bitmap,cliprect,1); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|1,0); draw_sprites(machine, bitmap,cliprect,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1|0,0); tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0|0,0); break; } return 0; }