diff options
Diffstat (limited to 'src/mame/video/gcpinbal.c')
-rw-r--r-- | src/mame/video/gcpinbal.c | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/src/mame/video/gcpinbal.c b/src/mame/video/gcpinbal.c new file mode 100644 index 00000000000..8e2c47e0f8e --- /dev/null +++ b/src/mame/video/gcpinbal.c @@ -0,0 +1,356 @@ +#include "driver.h" +#include "includes/gcpinbal.h" + + +static tilemap *gcpinbal_tilemap[3]; + +UINT16 *gcpinbal_tilemapram; +UINT16 *gcpinbal_ioc_ram; + +//UINT16 *gcpinbal_ctrlram; +//static UINT16 gcpinbal_ctrl_reg; + +static UINT16 gcpinbal_scrollx[3],gcpinbal_scrolly[3]; + +static UINT16 bg0_gfxset = 0; +static UINT16 bg1_gfxset = 0; + + + +/*******************************************************************/ + + +static TILE_GET_INFO( get_bg0_tile_info ) +{ + UINT16 tilenum = gcpinbal_tilemapram[0 + tile_index*2]; + UINT16 attr = gcpinbal_tilemapram[1 + tile_index*2]; + + SET_TILE_INFO( + 1, + (tilenum & 0xfff) + bg0_gfxset, + (attr & 0x1f), + TILE_FLIPYX( (attr & 0x300) >> 8)); +} + +static TILE_GET_INFO( get_bg1_tile_info ) +{ + UINT16 tilenum = gcpinbal_tilemapram[0x800 + tile_index*2]; + UINT16 attr = gcpinbal_tilemapram[0x801 + tile_index*2]; + + SET_TILE_INFO( + 1, + (tilenum & 0xfff) + 0x2000 + bg1_gfxset, + (attr & 0x1f) + 0x30, + TILE_FLIPYX( (attr & 0x300) >> 8)); +} + +static TILE_GET_INFO( get_fg_tile_info ) +{ + UINT16 tilenum = gcpinbal_tilemapram[0x1000 + tile_index]; + + SET_TILE_INFO( + 2, + (tilenum & 0xfff), + (tilenum >> 12) | 0x70, + 0); +} + +#if 0 +static void dirty_tilemaps(void) // will be used for save states +{ + tilemap_mark_all_tiles_dirty(gcpinbal_tilemap[0]); + tilemap_mark_all_tiles_dirty(gcpinbal_tilemap[1]); + tilemap_mark_all_tiles_dirty(gcpinbal_tilemap[2]); +} +#endif + +static void gcpinbal_core_vh_start (void) +{ + int xoffs = 0; + int yoffs = 0; + + gcpinbal_tilemap[0] = tilemap_create(get_bg0_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); + gcpinbal_tilemap[1] = tilemap_create(get_bg1_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,32); + gcpinbal_tilemap[2] = tilemap_create(get_fg_tile_info, tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,64,64); + + tilemap_set_transparent_pen( gcpinbal_tilemap[0],0 ); + tilemap_set_transparent_pen( gcpinbal_tilemap[1],0 ); + tilemap_set_transparent_pen( gcpinbal_tilemap[2],0 ); + + /* flipscreen n/a */ + tilemap_set_scrolldx( gcpinbal_tilemap[0],-xoffs,0 ); + tilemap_set_scrolldx( gcpinbal_tilemap[1],-xoffs,0 ); + tilemap_set_scrolldx( gcpinbal_tilemap[2],-xoffs,0 ); + tilemap_set_scrolldy( gcpinbal_tilemap[0],-yoffs,0 ); + tilemap_set_scrolldy( gcpinbal_tilemap[1],-yoffs,0 ); + tilemap_set_scrolldy( gcpinbal_tilemap[2],-yoffs,0 ); +} + +VIDEO_START( gcpinbal ) +{ + gcpinbal_core_vh_start(); +} + + +/****************************************************************** + TILEMAP READ AND WRITE HANDLERS +*******************************************************************/ + +READ16_HANDLER( gcpinbal_tilemaps_word_r ) +{ + return gcpinbal_tilemapram[offset]; +} + +WRITE16_HANDLER( gcpinbal_tilemaps_word_w ) +{ + COMBINE_DATA(&gcpinbal_tilemapram[offset]); + + if (offset<0x800) /* BG0 */ + { + tilemap_mark_tile_dirty(gcpinbal_tilemap[0],offset/2); + } + else if ((offset<0x1000)) /* BG1 */ + { + tilemap_mark_tile_dirty(gcpinbal_tilemap[1],(offset%0x800)/2); + } + else if ((offset<0x1800)) /* FG */ + { + tilemap_mark_tile_dirty(gcpinbal_tilemap[2],(offset%0x800)); + } +} + + +/* + +READ16_HANDLER( gcpinbal_ctrl_word_r ) +{ + // ***** NOT HOOKED UP ***** + + return gcpinbal_piv_ctrlram[offset]; +} + + +WRITE16_HANDLER( gcpinbal_ctrl_word_w ) +{ + // ***** NOT HOOKED UP ***** + + COMBINE_DATA(&gcpinbal_piv_ctrlram[offset]); + data = gcpinbal_piv_ctrlram[offset]; + + switch (offset) + { + case 0x00: + gcpinbal_scrollx[0] = -data; + break; + + case 0x01: + gcpinbal_scrollx[1] = -data; + break; + + case 0x02: + gcpinbal_scrollx[2] = -data; + break; + + case 0x03: + gcpinbal_scrolly[0] = data; + break; + + case 0x04: + gcpinbal_scrolly[1] = data; + break; + + case 0x05: + gcpinbal_scrolly[2] = data; + break; + + case 0x06: + gcpinbal_ctrl_reg = data; + break; + } +} + +*/ + + +/**************************************************************** + SPRITE DRAW ROUTINE + + Word | Bit(s) | Use + -----+-----------------+----------------- + 0 |........ xxxxxxxx| X lo + 1 |........ xxxxxxxx| X hi + 2 |........ xxxxxxxx| Y lo + 3 |........ xxxxxxxx| Y hi + 4 |........ x.......| Disable + 4 |........ ...x....| Flip Y + 4 |........ ....x...| 1 = Y chain, 0 = X chain + 4 |........ .....xxx| Chain size + 5 |........ ??xxxxxx| Tile (low) + 6 |........ xxxxxxxx| Tile (high) + 7 |........ ....xxxx| Color Bank + + Modified table from Raine + +****************************************************************/ + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int y_offs) +{ + int offs,chain_pos; + int x,y,curx,cury; + int priority=0; + UINT8 col,flipx,flipy,chain; + UINT16 code; + + /* According to Raine, word in ioc_ram determines sprite/tile priority... */ + priority = (gcpinbal_ioc_ram[0x68/2] & 0x8800) ? 0 : 1; + + for (offs = spriteram_size/2-8;offs >= 0;offs -= 8) + { + code = ((spriteram16[offs+5])&0xff) + (((spriteram16[offs+6]) &0xff) << 8); + code &= 0x3fff; + + if (!(spriteram16[offs+4] &0x80)) /* active sprite ? */ + { + x = ((spriteram16[offs+0]) &0xff) + (((spriteram16[offs+1]) &0xff) << 8); + y = ((spriteram16[offs+2]) &0xff) + (((spriteram16[offs+3]) &0xff) << 8); + + /* Treat coords as signed */ + if (x & 0x8000) x -= 0x10000; + if (y & 0x8000) y -= 0x10000; + + col = ((spriteram16[offs+7]) &0x0f) | 0x60; + chain = (spriteram16[offs+4]) &0x07; + flipy = (spriteram16[offs+4]) &0x10; + flipx = 0; + + curx = x; + cury = y; + + if (((spriteram16[offs+4]) &0x08) && flipy) + cury += (chain * 16); + + for (chain_pos = chain;chain_pos >= 0;chain_pos--) + { + pdrawgfx(bitmap, machine->gfx[0], + code, + col, + flipx, flipy, + curx,cury, + cliprect,TRANSPARENCY_PEN,0, + priority ? 0xfc : 0xf0); + + code++; + + if ((spriteram16[offs+4]) &0x08) /* Y chain */ + { + if (flipy) cury -= 16; + else cury += 16; + } + else /* X chain */ + { + curx += 16; + } + } + } + } +#if 0 + if (rotate) + { + char buf[80]; + sprintf(buf,"sprite rotate offs %04x ?",rotate); + popmessage(buf); + } +#endif +} + + + + +/************************************************************** + SCREEN REFRESH +**************************************************************/ + +VIDEO_UPDATE( gcpinbal ) +{ + static UINT16 tile_sets = 0; + int i; + UINT8 layer[3]; + +#ifdef MAME_DEBUG + static UINT8 dislayer[4]; +#endif + +#ifdef MAME_DEBUG + if (input_code_pressed_once (KEYCODE_V)) + { + dislayer[0] ^= 1; + popmessage("bg0: %01x",dislayer[0]); + } + + if (input_code_pressed_once (KEYCODE_B)) + { + dislayer[1] ^= 1; + popmessage("bg1: %01x",dislayer[1]); + } + + if (input_code_pressed_once (KEYCODE_N)) + { + dislayer[2] ^= 1; + popmessage("fg: %01x",dislayer[2]); + } +#endif + + gcpinbal_scrollx[0] = gcpinbal_ioc_ram[0x14/2]; + gcpinbal_scrolly[0] = gcpinbal_ioc_ram[0x16/2]; + gcpinbal_scrollx[1] = gcpinbal_ioc_ram[0x18/2]; + gcpinbal_scrolly[1] = gcpinbal_ioc_ram[0x1a/2]; + gcpinbal_scrollx[2] = gcpinbal_ioc_ram[0x1c/2]; + gcpinbal_scrolly[2] = gcpinbal_ioc_ram[0x1e/2]; + + tile_sets = gcpinbal_ioc_ram[0x88/2]; + bg0_gfxset = (tile_sets & 0x400) ? 0x1000 : 0; + bg1_gfxset = (tile_sets & 0x800) ? 0x1000 : 0; + + for (i=0;i<3;i++) + { + tilemap_set_scrollx(gcpinbal_tilemap[i], 0, gcpinbal_scrollx[i]); + tilemap_set_scrolly(gcpinbal_tilemap[i], 0, gcpinbal_scrolly[i]); + } + + fillbitmap(priority_bitmap,0,cliprect); + fillbitmap(bitmap, machine->pens[0], cliprect); + + layer[0] = 0; + layer[1] = 1; + layer[2] = 2; + + +#ifdef MAME_DEBUG + if (dislayer[layer[0]]==0) +#endif + tilemap_draw(bitmap,cliprect,gcpinbal_tilemap[layer[0]],TILEMAP_DRAW_OPAQUE,1); + +#ifdef MAME_DEBUG + if (dislayer[layer[1]]==0) +#endif + tilemap_draw(bitmap,cliprect,gcpinbal_tilemap[layer[1]],0,2); + +#ifdef MAME_DEBUG + if (dislayer[layer[2]]==0) +#endif + tilemap_draw(bitmap,cliprect,gcpinbal_tilemap[layer[2]],0,4); + + + draw_sprites(machine, bitmap,cliprect,16); + +#if 0 + { +// char buf[80]; + sprintf(buf,"bg0_gfx: %04x bg1_gfx: %04x ",bg0_gfxset,bg1_gfxset); + popmessage(buf); + } +#endif + + return 0; +} + |