diff options
Diffstat (limited to 'src/mame/video/tail2nos.c')
-rw-r--r-- | src/mame/video/tail2nos.c | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/src/mame/video/tail2nos.c b/src/mame/video/tail2nos.c new file mode 100644 index 00000000000..261659890de --- /dev/null +++ b/src/mame/video/tail2nos.c @@ -0,0 +1,214 @@ +#include "driver.h" +#include "konamiic.h" + + +UINT16 *tail2nos_bgvideoram; + + +static tilemap *bg_tilemap; + +static int charbank,charpalette,video_enable; +static UINT16 *zoomdata; +static int dirtygfx; +static UINT8 *dirtychar; + +#define TOTAL_CHARS 0x400 + + +/*************************************************************************** + + Callbacks for the TileMap code + +***************************************************************************/ + +static TILE_GET_INFO( get_tile_info ) +{ + UINT16 code = tail2nos_bgvideoram[tile_index]; + SET_TILE_INFO( + 0, + (code & 0x1fff) + (charbank << 13), + ((code & 0xe000) >> 13) + charpalette * 16, + 0); +} + + +/*************************************************************************** + + Callbacks for the K051316 + +***************************************************************************/ + +static void zoom_callback(int *code,int *color,int *flags) +{ + *code |= ((*color & 0x03) << 8); + *color = 32 + ((*color & 0x38) >> 3); +} + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +VIDEO_START( tail2nos ) +{ + bg_tilemap = tilemap_create(get_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,64,32); + + K051316_vh_start_0(machine,REGION_GFX3,4,TRUE,0,zoom_callback); + + dirtychar = auto_malloc(TOTAL_CHARS); + memset(dirtychar,1,TOTAL_CHARS); + + tilemap_set_transparent_pen(bg_tilemap,15); + + K051316_wraparound_enable(0,1); + K051316_set_offset(0,-89,-14); + zoomdata = (UINT16 *)memory_region(REGION_GFX3); +} + + + +/*************************************************************************** + + Memory handlers + +***************************************************************************/ + +WRITE16_HANDLER( tail2nos_bgvideoram_w ) +{ + COMBINE_DATA(&tail2nos_bgvideoram[offset]); + tilemap_mark_tile_dirty(bg_tilemap,offset); +} + +READ16_HANDLER( tail2nos_zoomdata_r ) +{ + return zoomdata[offset]; +} + +WRITE16_HANDLER( tail2nos_zoomdata_w ) +{ + int oldword = zoomdata[offset]; + COMBINE_DATA(&zoomdata[offset]); + if (oldword != zoomdata[offset]) + { + dirtygfx = 1; + dirtychar[offset / 64] = 1; + } +} + +WRITE16_HANDLER( tail2nos_gfxbank_w ) +{ + if (ACCESSING_LSB) + { + int bank; + + /* bits 0 and 2 select char bank */ + if (data & 0x04) bank = 2; + else if (data & 0x01) bank = 1; + else bank = 0; + + if (charbank != bank) + { + charbank = bank; + tilemap_mark_all_tiles_dirty(bg_tilemap); + } + + /* bit 5 seems to select palette bank (used on startup) */ + if (data & 0x20) bank = 7; + else bank = 3; + + if (charpalette != bank) + { + charpalette = bank; + tilemap_mark_all_tiles_dirty(bg_tilemap); + } + + /* bit 4 seems to be video enable */ + video_enable = data & 0x10; + } +} + + +/*************************************************************************** + + Display Refresh + +***************************************************************************/ + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect) +{ + int offs; + + + for (offs = 0;offs < spriteram_size/2;offs += 4) + { + int sx,sy,flipx,flipy,code,color; + + sx = spriteram16[offs + 1]; + if (sx >= 0x8000) sx -= 0x10000; + sy = 0x10000 - spriteram16[offs + 0]; + if (sy >= 0x8000) sy -= 0x10000; + code = spriteram16[offs + 2] & 0x07ff; + color = (spriteram16[offs + 2] & 0xe000) >> 13; + flipx = spriteram16[offs + 2] & 0x1000; + flipy = spriteram16[offs + 2] & 0x0800; + + drawgfx(bitmap,machine->gfx[1], + code, + 40 + color, + flipx,flipy, + sx+3,sy+1, /* placement relative to zoom layer verified on the real thing */ + cliprect,TRANSPARENCY_PEN,15); + } +} + +VIDEO_UPDATE( tail2nos ) +{ + static const gfx_layout tilelayout = + { + 16,16, + TOTAL_CHARS, + 4, + { 0, 1, 2, 3 }, +#ifdef LSB_FIRST + { 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4, + 10*4, 11*4, 8*4, 9*4, 14*4, 15*4, 12*4, 13*4 }, +#else + { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4, + 8*4, 9*4, 10*4, 11*4, 12*4, 13*4, 14*4, 15*4 }, +#endif + { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, + 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 }, + 128*8 + }; + + + if (dirtygfx) + { + int i; + + dirtygfx = 0; + + for (i = 0;i < TOTAL_CHARS;i++) + { + if (dirtychar[i]) + { + dirtychar[i] = 0; + decodechar(machine->gfx[2],i,(UINT8 *)zoomdata,&tilelayout); + } + } + + tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); + } + + + if (video_enable) + { + K051316_zoom_draw_0(bitmap,cliprect,0,0); + draw_sprites(machine, bitmap,cliprect); + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + } + else + fillbitmap(bitmap,machine->pens[0],cliprect); + return 0; +} |