/* Cross Pang video hardware emulation -- this seems to be the same as the tumblepop bootleg based hardware in tumbleb.c */ #include "driver.h" static int xsproff, ysproff; // sprite offsets static tilemap *bg_layer,*fg_layer; UINT16 *crospang_bg_videoram,*crospang_fg_videoram; static int bestri_tilebank; WRITE16_HANDLER( bestri_tilebank_w) { bestri_tilebank = (data>>10) & 0xf; //printf("bestri %04x\n", data); tilemap_mark_all_tiles_dirty(fg_layer); tilemap_mark_all_tiles_dirty(bg_layer); } WRITE16_HANDLER ( bestri_bg_scrolly_w ) { /* Very Strange */ int scroll = (data&0x3ff)^ 0x0155; tilemap_set_scrolly(bg_layer,0,-scroll+7); } WRITE16_HANDLER ( bestri_fg_scrolly_w ) { /* Very Strange */ int scroll = (data&0x3ff)^ 0x00ab; tilemap_set_scrolly(fg_layer,0,-scroll+7); } WRITE16_HANDLER ( bestri_fg_scrollx_w ) { // printf("fg_layer x %04x\n",data); tilemap_set_scrollx(fg_layer,0,data+32); } WRITE16_HANDLER ( bestri_bg_scrollx_w ) { // printf("bg_layer x %04x\n",data); tilemap_set_scrollx(bg_layer,0,data-60); } WRITE16_HANDLER ( crospang_fg_scrolly_w ) { tilemap_set_scrolly(fg_layer,0,data+8); } WRITE16_HANDLER ( crospang_bg_scrolly_w ) { tilemap_set_scrolly(bg_layer,0,data+8); } WRITE16_HANDLER ( crospang_fg_scrollx_w ) { tilemap_set_scrollx(fg_layer,0,data); } WRITE16_HANDLER ( crospang_bg_scrollx_w ) { tilemap_set_scrollx(bg_layer,0,data+4); } WRITE16_HANDLER ( crospang_fg_videoram_w ) { COMBINE_DATA(&crospang_fg_videoram[offset]); tilemap_mark_tile_dirty(fg_layer,offset); } WRITE16_HANDLER ( crospang_bg_videoram_w ) { COMBINE_DATA(&crospang_bg_videoram[offset]); tilemap_mark_tile_dirty(bg_layer,offset); } static TILE_GET_INFO( get_bg_tile_info ) { int data = crospang_bg_videoram[tile_index]; int tile = data & 0xfff; int color = (data >> 12) & 0x0f; SET_TILE_INFO(1,tile+ bestri_tilebank * 0x1000,color + 0x20,0); } static TILE_GET_INFO( get_fg_tile_info ) { int data = crospang_fg_videoram[tile_index]; int tile = data & 0xfff; int color = (data >> 12) & 0x0f; SET_TILE_INFO(1,tile+ bestri_tilebank * 0x1000,color + 0x10,0); } /* offset 0 -------yyyyyyyyy y offset -----hh--------- sprite height ---a------------ alpha blending enable f--------------- flip x -??-?----------- unused 1 --ssssssssssssss sprite code ??-------------- unused 2 -------xxxxxxxxx x offset ---cccc--------- colors ???------------- unused 3 ---------------- unused */ /* jumpkids / tumbleb.c! */ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect) { int offs; int flipscreen = 0; for (offs = 0;offs < spriteram_size/2;offs += 4) { int x,y,sprite,colour,multi,fx,fy,inc,flash,mult; sprite = spriteram16[offs+1] & 0x7fff; if (!sprite) continue; y = spriteram16[offs]; flash=y&0x1000; if (flash && (cpu_getcurrentframe() & 1)) continue; x = spriteram16[offs+2]; colour = (x >>9) & 0xf; fx = y & 0x2000; fy = y & 0x4000; multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ x = x & 0x01ff; y = y & 0x01ff; if (x >= 320) x -= 512; if (y >= 256) y -= 512; y = 240 - y; x = 304 - x; // sprite &= ~multi; /* Todo: I bet TumblePop bootleg doesn't do this either */ if (fy) inc = -1; else { sprite += multi; inc = 1; } if (flipscreen) { y=240-y; x=304-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[0], sprite - multi * inc, colour, fx,fy, x-xsproff,y-ysproff + mult * multi, cliprect,TRANSPARENCY_PEN,0); multi--; } } } VIDEO_START( crospang ) { bg_layer = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); fg_layer = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); tilemap_set_transparent_pen(fg_layer,0); bestri_tilebank = 0; // xsproff = 4; // ysproff = 7; xsproff = 5; ysproff = 7; } VIDEO_UPDATE( crospang ) { tilemap_draw(bitmap,cliprect,bg_layer,0,0); tilemap_draw(bitmap,cliprect,fg_layer,0,0); draw_sprites(machine,bitmap,cliprect); return 0; }