diff options
Diffstat (limited to 'src/mame/video/sprcros2.c')
-rw-r--r-- | src/mame/video/sprcros2.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/mame/video/sprcros2.c b/src/mame/video/sprcros2.c new file mode 100644 index 00000000000..60994007e25 --- /dev/null +++ b/src/mame/video/sprcros2.c @@ -0,0 +1,169 @@ +/* +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; +} |