/* Super Cross II (JPN Ver.) (c)1986 GM Shoji */ #include "driver.h" static tilemap *sprcros2_bgtilemap, *sprcros2_fgtilemap; UINT8 *sprcros2_fgvideoram, *sprcros2_spriteram, *sprcros2_bgvideoram; size_t sprcros2_spriteram_size; extern UINT8 sprcros2_m_port7; PALETTE_INIT( sprcros2 ) { int i,bit0,bit1,bit2,r,g,b; for (i = 0;i < machine->drv->total_colors; i++) { /* red component */ bit0 = (color_prom[i] >> 0) & 0x01; bit1 = (color_prom[i] >> 1) & 0x01; bit2 = (color_prom[i] >> 2) & 0x01; r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* green component */ bit0 = (color_prom[i] >> 3) & 0x01; bit1 = (color_prom[i] >> 4) & 0x01; bit2 = (color_prom[i] >> 5) & 0x01; g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* blue component */ bit1 = (color_prom[i] >> 6) & 0x01; bit2 = (color_prom[i] >> 7) & 0x01; b = 0x47 * bit1 + 0xb8 * bit2; palette_set_color(machine,i,MAKE_RGB(r,g,b)); } //cluts for (i = 0;i < 0x100; i++) { colortable[i]=color_prom[i+0x20]+(color_prom[i+0x120]<<4); //bg colortable[i+0x100]=color_prom[i+0x220]; //sprites colortable[i+0x200]=color_prom[i+0x320]; //fg } } WRITE8_HANDLER( sprcros2_fgvideoram_w ) { sprcros2_fgvideoram[offset] = data; tilemap_mark_tile_dirty(sprcros2_fgtilemap,offset&0x3ff); } WRITE8_HANDLER( sprcros2_bgvideoram_w ) { sprcros2_bgvideoram[offset] = data; tilemap_mark_tile_dirty(sprcros2_bgtilemap,offset&0x3ff); } WRITE8_HANDLER( sprcros2_bgscrollx_w ) { if(sprcros2_m_port7&0x02) tilemap_set_scrollx(sprcros2_bgtilemap,0,0x100-data); else tilemap_set_scrollx(sprcros2_bgtilemap,0,data); } WRITE8_HANDLER( sprcros2_bgscrolly_w ) { tilemap_set_scrolly(sprcros2_bgtilemap,0,data); } static TILE_GET_INFO( get_sprcros2_bgtile_info ) { UINT32 tile_number = sprcros2_bgvideoram[tile_index]; UINT8 attr = sprcros2_bgvideoram[tile_index+0x400]; //attr //76543210 //xxxx---- colour //----x--- flipx //-----xxx tile bank tile_number += (attr&0x07)<<8; SET_TILE_INFO( 0, tile_number, (attr&0xf0)>>4, (attr&0x08)?TILE_FLIPX:0); } static TILE_GET_INFO( get_sprcros2_fgtile_info ) { UINT32 tile_number = sprcros2_fgvideoram[tile_index]; UINT8 attr = sprcros2_fgvideoram[tile_index+0x400]; //attr //76543210 //xxxxxx-- colour //------xx tile bank tile_number += (attr&0x03)<<8; SET_TILE_INFO( 2, tile_number, (attr&0xfc)>>2, 0); } VIDEO_START( sprcros2 ) { sprcros2_bgtilemap = tilemap_create( get_sprcros2_bgtile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32 ); sprcros2_fgtilemap = tilemap_create( get_sprcros2_fgtile_info,tilemap_scan_rows,TILEMAP_TYPE_COLORTABLE,8,8,32,32 ); tilemap_set_transparent_pen(sprcros2_fgtilemap,0); } static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect) { int offs,sx,sy,flipx,flipy; for (offs = sprcros2_spriteram_size-4; offs >= 0; offs -= 4) { if(sprcros2_spriteram[offs]) { //offs //76543210 //x------- unused //-xxxxxxx sprite number //offs+1 //76543210 //xx------ unused //--xxx--- colour (6/7 unused and blank in prom) //-----x-- unused //------x- flipx //-------x unused //offs+2 y pos //offs+3 x pos sx = ((sprcros2_spriteram[offs+3]+0x10)%0x100)-0x10; sy = 225-(((sprcros2_spriteram[offs+2]+0x10)%0x100)-0x10); flipx = sprcros2_spriteram[offs+1]&0x02; flipy = 0; if (sprcros2_m_port7&0x02) { sx = 224-sx; sy = 224-sy; flipx = !flipx; flipy = !flipy; } drawgfx(bitmap,machine->gfx[1], sprcros2_spriteram[offs], (sprcros2_spriteram[offs+1]&0x38)>>3, flipx,flipy, sx,sy, cliprect,TRANSPARENCY_COLOR,0); } } } VIDEO_UPDATE( sprcros2 ) { tilemap_draw( bitmap,cliprect,sprcros2_bgtilemap,0,0 ); draw_sprites(machine, bitmap,cliprect); tilemap_draw( bitmap,cliprect,sprcros2_fgtilemap,0,0 ); return 0; }