#include "driver.h" #include "video/konamiic.h" UINT8 *labyrunr_videoram1,*labyrunr_videoram2,*labyrunr_scrollram; static tilemap *layer0, *layer1; static rectangle clip0, clip1; PALETTE_INIT( labyrunr ) { int i,pal; for (pal = 0;pal < 8;pal++) { if (pal & 1) /* chars, no lookup table */ { for (i = 0;i < 256;i++) *(colortable++) = 16 * pal + (i & 0x0f); } else /* sprites */ { for (i = 0;i < 256;i++) if (color_prom[i] == 0) *(colortable++) = 0; else *(colortable++) = 16 * pal + color_prom[i]; } } } /*************************************************************************** Callbacks for the TileMap code ***************************************************************************/ static TILE_GET_INFO( get_tile_info0 ) { int attr = labyrunr_videoram1[tile_index]; int code = labyrunr_videoram1[tile_index + 0x400]; int bit0 = (K007121_ctrlram[0][0x05] >> 0) & 0x03; int bit1 = (K007121_ctrlram[0][0x05] >> 2) & 0x03; int bit2 = (K007121_ctrlram[0][0x05] >> 4) & 0x03; int bit3 = (K007121_ctrlram[0][0x05] >> 6) & 0x03; int bank = ((attr & 0x80) >> 7) | ((attr >> (bit0+2)) & 0x02) | ((attr >> (bit1+1)) & 0x04) | ((attr >> (bit2 )) & 0x08) | ((attr >> (bit3-1)) & 0x10) | ((K007121_ctrlram[0][0x03] & 0x01) << 5); int mask = (K007121_ctrlram[0][0x04] & 0xf0) >> 4; bank = (bank & ~(mask << 1)) | ((K007121_ctrlram[0][0x04] & mask) << 1); SET_TILE_INFO( 0, code+bank*256, ((K007121_ctrlram[0][6]&0x30)*2+16)+(attr&7), 0); } static TILE_GET_INFO( get_tile_info1 ) { int attr = labyrunr_videoram2[tile_index]; int code = labyrunr_videoram2[tile_index + 0x400]; int bit0 = (K007121_ctrlram[0][0x05] >> 0) & 0x03; int bit1 = (K007121_ctrlram[0][0x05] >> 2) & 0x03; int bit2 = (K007121_ctrlram[0][0x05] >> 4) & 0x03; int bit3 = (K007121_ctrlram[0][0x05] >> 6) & 0x03; int bank = ((attr & 0x80) >> 7) | ((attr >> (bit0+2)) & 0x02) | ((attr >> (bit1+1)) & 0x04) | ((attr >> (bit2 )) & 0x08) | ((attr >> (bit3-1)) & 0x10) | ((K007121_ctrlram[0][0x03] & 0x01) << 5); int mask = (K007121_ctrlram[0][0x04] & 0xf0) >> 4; bank = (bank & ~(mask << 1)) | ((K007121_ctrlram[0][0x04] & mask) << 1); SET_TILE_INFO( 0, code+bank*256, ((K007121_ctrlram[0][6]&0x30)*2+16)+(attr&7), 0); } /*************************************************************************** Start the video hardware emulation. ***************************************************************************/ VIDEO_START( labyrunr ) { layer0 = tilemap_create(get_tile_info0,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); layer1 = tilemap_create(get_tile_info1,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); tilemap_set_transparent_pen(layer0,0); tilemap_set_transparent_pen(layer1,0); clip0 = machine->screen[0].visarea; clip0.min_x += 40; clip1 = machine->screen[0].visarea; clip1.max_x = 39; clip1.min_x = 0; tilemap_set_scroll_cols(layer0,32); } /*************************************************************************** Memory Handlers ***************************************************************************/ WRITE8_HANDLER( labyrunr_vram1_w ) { labyrunr_videoram1[offset] = data; tilemap_mark_tile_dirty(layer0,offset & 0x3ff); } WRITE8_HANDLER( labyrunr_vram2_w ) { labyrunr_videoram2[offset] = data; tilemap_mark_tile_dirty(layer1,offset & 0x3ff); } /*************************************************************************** Screen Refresh ***************************************************************************/ VIDEO_UPDATE( labyrunr ) { rectangle finalclip0, finalclip1; fillbitmap(priority_bitmap,0,cliprect); fillbitmap(bitmap,get_black_pen(machine),cliprect); if(~K007121_ctrlram[0][3] & 0x20) { int i; finalclip0 = clip0; finalclip1 = clip1; sect_rect(&finalclip0, cliprect); sect_rect(&finalclip1, cliprect); tilemap_set_scrollx(layer0,0,K007121_ctrlram[0][0x00] - 40); tilemap_set_scrollx(layer1,0,0); for(i = 0; i < 32; i++) { /* enable colscroll */ if((K007121_ctrlram[0][1] & 6) == 6) // it's probably just one bit, but it's only used once in the game so I don't know which it's tilemap_set_scrolly(layer0,(i+2) & 0x1f,K007121_ctrlram[0][0x02] + labyrunr_scrollram[i]); else tilemap_set_scrolly(layer0,(i+2) & 0x1f,K007121_ctrlram[0][0x02]); } tilemap_draw(bitmap,&finalclip0,layer0,TILEMAP_DRAW_OPAQUE,0); K007121_sprites_draw(machine,0,bitmap,cliprect,spriteram,(K007121_ctrlram[0][6]&0x30)*2,40,0,(K007121_ctrlram[0][3] & 0x40) >> 5); /* we ignore the transparency because layer1 is drawn only at the top of the screen also covering sprites */ tilemap_draw(bitmap,&finalclip1,layer1,TILEMAP_DRAW_OPAQUE,0); } else { int use_clip3[2] = { 0, 0 }; rectangle finalclip3; /* custom cliprects needed for the weird effect used in the endinq sequence to hide and show the needed part of text */ finalclip0.min_y = finalclip1.min_y = cliprect->min_y; finalclip0.max_y = finalclip1.max_y = cliprect->max_y; if(K007121_ctrlram[0][1] & 1) { finalclip0.min_x = cliprect->max_x - K007121_ctrlram[0][0x00] + 8; finalclip0.max_x = cliprect->max_x; if(K007121_ctrlram[0][0x00] >= 40) { finalclip1.min_x = cliprect->min_x; } else { use_clip3[0] = 1; finalclip1.min_x = 40 - K007121_ctrlram[0][0x00]; } finalclip1.max_x = cliprect->max_x - K007121_ctrlram[0][0x00] + 8; } else { if(K007121_ctrlram[0][0x00] >= 40) { finalclip0.min_x = cliprect->min_x; } else { use_clip3[1] = 1; finalclip0.min_x = 40 - K007121_ctrlram[0][0x00]; } finalclip0.max_x = cliprect->max_x - K007121_ctrlram[0][0x00] + 8; finalclip1.min_x = cliprect->max_x - K007121_ctrlram[0][0x00] + 8; finalclip1.max_x = cliprect->max_x; } if(use_clip3[0] || use_clip3[1]) { finalclip3.min_y = cliprect->min_y; finalclip3.max_y = cliprect->max_y; finalclip3.min_x = cliprect->min_x; finalclip3.max_x = 40 - K007121_ctrlram[0][0x00] - 8; } tilemap_set_scrollx(layer0,0,K007121_ctrlram[0][0x00] - 40); tilemap_set_scrollx(layer1,0,K007121_ctrlram[0][0x00] - 40); tilemap_draw(bitmap,&finalclip0,layer0,0,1); if(use_clip3[0]) tilemap_draw(bitmap,&finalclip3,layer0,0,1); tilemap_draw(bitmap,&finalclip1,layer1,0,1); if(use_clip3[1]) tilemap_draw(bitmap,&finalclip3,layer1,0,1); K007121_sprites_draw(machine,0,bitmap,cliprect,spriteram,(K007121_ctrlram[0][6]&0x30)*2,40,0,(K007121_ctrlram[0][3] & 0x40) >> 5); } return 0; }