/*************************************************************************** -= Yun Sung 16 Bit Games =- driver by Luca Elia (l.elia@tin.it) [ 2 Scrolling Layers ] Tiles are 16 x 16 x 8. The layout of the tilemap is a bit weird: 16 consecutive tile codes define a vertical column. 16 columns form a page (256 x 256). The tilemap is made of 4 x 4 pages (1024 x 1024) [ 512? Sprites ] Sprites are 16 x 16 x 4 in size. There's RAM for 512, but the game just copies 384 entries. ***************************************************************************/ #include "driver.h" /* Variables that driver has access to: */ UINT16 *yunsun16_vram_0, *yunsun16_vram_1; UINT16 *yunsun16_scroll_0, *yunsun16_scroll_1; UINT16 *yunsun16_priority; /*************************************************************************** Tilemaps ***************************************************************************/ static tilemap *tilemap_0, *tilemap_1; #define TMAP_GFX (0) #define TILES_PER_PAGE_X (0x10) #define TILES_PER_PAGE_Y (0x10) #define PAGES_PER_TMAP_X (0x4) #define PAGES_PER_TMAP_Y (0x4) static TILEMAP_MAPPER( yunsun16_tilemap_scan_pages ) { return (row / TILES_PER_PAGE_Y) * TILES_PER_PAGE_X * TILES_PER_PAGE_Y * PAGES_PER_TMAP_X + (row % TILES_PER_PAGE_Y) + (col / TILES_PER_PAGE_X) * TILES_PER_PAGE_X * TILES_PER_PAGE_Y + (col % TILES_PER_PAGE_X) * TILES_PER_PAGE_Y; } static TILE_GET_INFO( get_tile_info_0 ) { UINT16 code = yunsun16_vram_0[ 2 * tile_index + 0 ]; UINT16 attr = yunsun16_vram_0[ 2 * tile_index + 1 ]; SET_TILE_INFO( TMAP_GFX, code, attr & 0xf, (attr & 0x20) ? TILE_FLIPX : 0); } static TILE_GET_INFO( get_tile_info_1 ) { UINT16 code = yunsun16_vram_1[ 2 * tile_index + 0 ]; UINT16 attr = yunsun16_vram_1[ 2 * tile_index + 1 ]; SET_TILE_INFO( TMAP_GFX, code, attr & 0xf, (attr & 0x20) ? TILE_FLIPX : 0); } WRITE16_HANDLER( yunsun16_vram_0_w ) { COMBINE_DATA(&yunsun16_vram_0[offset]); tilemap_mark_tile_dirty(tilemap_0,offset/2); } WRITE16_HANDLER( yunsun16_vram_1_w ) { COMBINE_DATA(&yunsun16_vram_1[offset]); tilemap_mark_tile_dirty(tilemap_1,offset/2); } /*************************************************************************** Video Hardware Init ***************************************************************************/ static int sprites_scrolldx, sprites_scrolldy; VIDEO_START( yunsun16 ) { tilemap_0 = tilemap_create( get_tile_info_0,yunsun16_tilemap_scan_pages, TILEMAP_TYPE_PEN, 16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); tilemap_1 = tilemap_create( get_tile_info_1,yunsun16_tilemap_scan_pages, TILEMAP_TYPE_PEN, 16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); sprites_scrolldx = -0x40; sprites_scrolldy = -0x0f; tilemap_set_scrolldx(tilemap_0,-0x34,0); tilemap_set_scrolldx(tilemap_1,-0x38,0); tilemap_set_scrolldy(tilemap_0,-0x10,0); tilemap_set_scrolldy(tilemap_1,-0x10,0); tilemap_set_transparent_pen(tilemap_0,0xff); tilemap_set_transparent_pen(tilemap_1,0xff); } /*************************************************************************** Sprites Drawing 0.w X 2.w Y 4.w Code 6.w fedc ba98 7--- ---- ---- ---- -6-- ---- Flip Y ---- ---- --5- ---- Flip X ---- ---- ---4 3210 Color ***************************************************************************/ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect) { int offs; int max_x = machine->screen[0].visarea.max_x+1; int max_y = machine->screen[0].visarea.max_y+1; int pri = *yunsun16_priority & 3; int pri_mask; switch( pri ) { case 1: pri_mask = (1<<1)|(1<<2)|(1<<3); break; case 2: pri_mask = (1<<2)|(1<<3); break; case 3: default: pri_mask = 0; } for ( offs = (spriteram_size-8)/2 ; offs >= 0; offs -= 8/2 ) { int x = spriteram16[offs + 0]; int y = spriteram16[offs + 1]; int code = spriteram16[offs + 2]; int attr = spriteram16[offs + 3]; int flipx = attr & 0x20; int flipy = attr & 0x40; x += sprites_scrolldx; y += sprites_scrolldy; if (flip_screen) // not used? { flipx = !flipx; x = max_x - x - 16; flipy = !flipy; y = max_y - y - 16; } pdrawgfx( bitmap,machine->gfx[1], code, attr & 0x1f, flipx, flipy, x,y, cliprect,TRANSPARENCY_PEN,15, pri_mask ); } } /*************************************************************************** Screen Drawing ***************************************************************************/ VIDEO_UPDATE( yunsun16 ) { tilemap_set_scrollx(tilemap_0, 0, yunsun16_scroll_0[ 0 ]); tilemap_set_scrolly(tilemap_0, 0, yunsun16_scroll_0[ 1 ]); tilemap_set_scrollx(tilemap_1, 0, yunsun16_scroll_1[ 0 ]); tilemap_set_scrolly(tilemap_1, 0, yunsun16_scroll_1[ 1 ]); // popmessage("%04X", *yunsun16_priority); fillbitmap(priority_bitmap,0,cliprect); if((*yunsun16_priority & 0x0c) == 4) { /* The color of the this layer's transparent pen goes below everything */ tilemap_draw(bitmap,cliprect,tilemap_0, TILEMAP_DRAW_OPAQUE, 0); tilemap_draw(bitmap,cliprect,tilemap_0, 0, 1); tilemap_draw(bitmap,cliprect,tilemap_1, 0, 2); } else if((*yunsun16_priority & 0x0c) == 8) { /* The color of the this layer's transparent pen goes below everything */ tilemap_draw(bitmap,cliprect,tilemap_1, TILEMAP_DRAW_OPAQUE, 0); tilemap_draw(bitmap,cliprect,tilemap_1, 0, 1); tilemap_draw(bitmap,cliprect,tilemap_0, 0, 2); } draw_sprites(machine, bitmap,cliprect); return 0; }