diff options
Diffstat (limited to 'src/mame/video/nmk16.c')
-rw-r--r-- | src/mame/video/nmk16.c | 884 |
1 files changed, 884 insertions, 0 deletions
diff --git a/src/mame/video/nmk16.c b/src/mame/video/nmk16.c new file mode 100644 index 00000000000..bd8260466ec --- /dev/null +++ b/src/mame/video/nmk16.c @@ -0,0 +1,884 @@ +#include "driver.h" + +UINT16 *nmk_bgvideoram,*nmk_fgvideoram,*nmk_txvideoram; +UINT16 *gunnail_scrollram; +static UINT16 gunnail_scrolly; +UINT16 tharrier_scroll; + +static int redraw_bitmap; + +static UINT16 *spriteram_old,*spriteram_old2; +static int bgbank; +static int videoshift; +static int bioship_background_bank; +static UINT8 bioship_scroll[4]; + +static tilemap *bg_tilemap,*fg_tilemap,*tx_tilemap; +static mame_bitmap *background_bitmap; + +/*************************************************************************** + + Callbacks for the TileMap code + +***************************************************************************/ + +//not 100% right yet (check attract mode in raphero) +static TILEMAP_MAPPER( bg_scan ) +{ + /* logical (col,row) -> memory offset */ + + col = (col & 0xff) | ((col & 0x300)<<1); + + return (row & 0x0f) + ((col & 0x6ff) << 4) + ((row & 0x70) << 8); +} + +static TILEMAP_MAPPER( bg_scan_td2 ) +{ + /* logical (col,row) -> memory offset */ + return (row & 0x0f) + ((col & 0x3ff) << 4) + ((row & 0x70) << 10); +} + + +static TILE_GET_INFO( macross_get_bg_tile_info ) +{ + int code = nmk_bgvideoram[tile_index]; + SET_TILE_INFO( + 1, + (code & 0xfff) + (bgbank << 12), + code >> 12, + 0); +} + +static TILE_GET_INFO( strahl_get_fg_tile_info ) +{ + int code = nmk_fgvideoram[tile_index]; + SET_TILE_INFO( + 3, + (code & 0xfff), + code >> 12, + 0); +} + +static TILE_GET_INFO( macross_get_tx_tile_info ) +{ + int code = nmk_txvideoram[tile_index]; + SET_TILE_INFO( + 0, + code & 0xfff, + code >> 12, + 0); +} + +static TILE_GET_INFO( bjtwin_get_bg_tile_info ) +{ + int code = nmk_bgvideoram[tile_index]; + int bank = (code & 0x800) ? 1 : 0; + SET_TILE_INFO( + bank, + (code & 0x7ff) + ((bank) ? (bgbank << 11) : 0), + code >> 12, + 0); +} + + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +VIDEO_START( bioship ) +{ + bg_tilemap = tilemap_create(macross_get_bg_tile_info,bg_scan,TILEMAP_TYPE_PEN,16,16,256,32); + tx_tilemap = tilemap_create(macross_get_tx_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,32,32); + spriteram_old = auto_malloc(spriteram_size); + spriteram_old2 = auto_malloc(spriteram_size); + background_bitmap = auto_bitmap_alloc(8192,512,machine->screen[0].format); + + tilemap_set_transparent_pen(bg_tilemap,15); + tilemap_set_transparent_pen(tx_tilemap,15); + bioship_background_bank=0; + redraw_bitmap = 1; + + memset(spriteram_old,0,spriteram_size); + memset(spriteram_old2,0,spriteram_size); + + videoshift = 0; /* 256x224 screen, no shift */ +} + +VIDEO_START( strahl ) +{ + bg_tilemap = tilemap_create(macross_get_bg_tile_info,bg_scan,TILEMAP_TYPE_PEN,16,16,256,32); + fg_tilemap = tilemap_create(strahl_get_fg_tile_info, bg_scan,TILEMAP_TYPE_PEN,16,16,256,32); + tx_tilemap = tilemap_create(macross_get_tx_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,32,32); + spriteram_old = auto_malloc(spriteram_size); + spriteram_old2 = auto_malloc(spriteram_size); + + tilemap_set_transparent_pen(fg_tilemap,15); + tilemap_set_transparent_pen(tx_tilemap,15); + + memset(spriteram_old,0,spriteram_size); + memset(spriteram_old2,0,spriteram_size); + + videoshift = 0; /* 256x224 screen, no shift */ + background_bitmap = NULL; +} + +VIDEO_START( macross ) +{ + bg_tilemap = tilemap_create(macross_get_bg_tile_info,bg_scan,TILEMAP_TYPE_PEN,16,16,256,32); + tx_tilemap = tilemap_create(macross_get_tx_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,32,32); + spriteram_old = auto_malloc(spriteram_size); + spriteram_old2 = auto_malloc(spriteram_size); + + tilemap_set_transparent_pen(tx_tilemap,15); + + memset(spriteram_old,0,spriteram_size); + memset(spriteram_old2,0,spriteram_size); + + videoshift = 0; /* 256x224 screen, no shift */ + background_bitmap = NULL; +} + +VIDEO_START( gunnail ) +{ + bg_tilemap = tilemap_create(macross_get_bg_tile_info,bg_scan,TILEMAP_TYPE_PEN,16,16,256,32); + tx_tilemap = tilemap_create(macross_get_tx_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,64,32); + spriteram_old = auto_malloc(spriteram_size); + spriteram_old2 = auto_malloc(spriteram_size); + + tilemap_set_transparent_pen(tx_tilemap,15); + tilemap_set_scroll_rows(bg_tilemap,512); + + memset(spriteram_old,0,spriteram_size); + memset(spriteram_old2,0,spriteram_size); + + videoshift = 64; /* 384x224 screen, leftmost 64 pixels have to be retrieved */ + /* from the other side of the tilemap (!) */ + background_bitmap = NULL; +} + +VIDEO_START( macross2 ) +{ + bg_tilemap = tilemap_create(macross_get_bg_tile_info,bg_scan,TILEMAP_TYPE_PEN,16,16,1024,128); + tx_tilemap = tilemap_create(macross_get_tx_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,64,32); + spriteram_old = auto_malloc(spriteram_size); + spriteram_old2 = auto_malloc(spriteram_size); + + tilemap_set_transparent_pen(tx_tilemap,15); + + memset(spriteram_old,0,spriteram_size); + memset(spriteram_old2,0,spriteram_size); + + videoshift = 64; /* 384x224 screen, leftmost 64 pixels have to be retrieved */ + /* from the other side of the tilemap (!) */ + background_bitmap = NULL; +} + +VIDEO_START( tdragon2 ) +{ + bg_tilemap = tilemap_create(macross_get_bg_tile_info,bg_scan_td2,TILEMAP_TYPE_PEN,16,16,1024,32); + tx_tilemap = tilemap_create(macross_get_tx_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,64,32); + spriteram_old = auto_malloc(spriteram_size); + spriteram_old2 = auto_malloc(spriteram_size); + + tilemap_set_transparent_pen(tx_tilemap,15); + + memset(spriteram_old,0,spriteram_size); + memset(spriteram_old2,0,spriteram_size); + + videoshift = 64; /* 384x224 screen, leftmost 64 pixels have to be retrieved */ + /* from the other side of the tilemap (!) */ + background_bitmap = NULL; +} + +VIDEO_START( bjtwin ) +{ + bg_tilemap = tilemap_create(bjtwin_get_bg_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,64,32); + spriteram_old = auto_malloc(spriteram_size); + spriteram_old2 = auto_malloc(spriteram_size); + + memset(spriteram_old,0,spriteram_size); + memset(spriteram_old2,0,spriteram_size); + + videoshift = 64; /* 384x224 screen, leftmost 64 pixels have to be retrieved */ + /* from the other side of the tilemap (!) */ + background_bitmap = NULL; +} + + + +/*************************************************************************** + + Memory handlers + +***************************************************************************/ + +READ16_HANDLER( nmk_bgvideoram_r ) +{ + return nmk_bgvideoram[offset]; +} + +WRITE16_HANDLER( nmk_bgvideoram_w ) +{ + COMBINE_DATA(&nmk_bgvideoram[offset]); + tilemap_mark_tile_dirty(bg_tilemap,offset); +} + +READ16_HANDLER( nmk_fgvideoram_r ) +{ + return nmk_fgvideoram[offset]; +} + +WRITE16_HANDLER( nmk_fgvideoram_w ) +{ + int oldword = nmk_fgvideoram[offset]; + int newword = oldword; + COMBINE_DATA(&newword); + + if (oldword != newword) + { + nmk_fgvideoram[offset] = newword; + tilemap_mark_tile_dirty(fg_tilemap,offset); + } +} + +READ16_HANDLER( nmk_txvideoram_r ) +{ + return nmk_txvideoram[offset]; +} + +WRITE16_HANDLER( nmk_txvideoram_w ) +{ + COMBINE_DATA(&nmk_txvideoram[offset]); + tilemap_mark_tile_dirty(tx_tilemap,offset); +} + +static int mustang_bg_xscroll; + +WRITE16_HANDLER( mustang_scroll_w ) +{ +// mame_printf_debug("mustang %04x %04x %04x\n",offset,data,mem_mask); + + switch (data & 0xff00) + { + case 0x0000: + mustang_bg_xscroll = (mustang_bg_xscroll & 0x00ff) | ((data & 0x00ff)<<8); + break; + + case 0x0100: + mustang_bg_xscroll = (mustang_bg_xscroll & 0xff00) | (data & 0x00ff); + break; + + case 0x0200: + break; + + case 0x0300: + break; + + default: + break; + } + + tilemap_set_scrollx(bg_tilemap,0,mustang_bg_xscroll - videoshift); +} + +WRITE16_HANDLER( bioshipbg_scroll_w ) +{ + static UINT8 scroll[4]; + + if (ACCESSING_MSB) + { + scroll[offset] = (data >> 8) & 0xff; + + if (offset & 2) + tilemap_set_scrolly(bg_tilemap,0,scroll[2] * 256 + scroll[3]); + else + tilemap_set_scrollx(bg_tilemap,0,scroll[0] * 256 + scroll[1] - videoshift); + } +} + +WRITE16_HANDLER( nmk_scroll_w ) +{ + if (ACCESSING_LSB) + { + static UINT8 scroll[4]; + + scroll[offset] = data & 0xff; + + if (offset & 2) + tilemap_set_scrolly(bg_tilemap,0,scroll[2] * 256 + scroll[3]); + else + tilemap_set_scrollx(bg_tilemap,0,scroll[0] * 256 + scroll[1] - videoshift); + } +} + +WRITE16_HANDLER( nmk_scroll_2_w ) +{ + if (ACCESSING_LSB) + { + static UINT8 scroll[4]; + + scroll[offset] = data & 0xff; + + if (offset & 2) + tilemap_set_scrolly(fg_tilemap,0,scroll[2] * 256 + scroll[3]); + else + tilemap_set_scrollx(fg_tilemap,0,scroll[0] * 256 + scroll[1] - videoshift); + } +} + +WRITE16_HANDLER( nmk_scroll_3_w ) +{ + COMBINE_DATA(&gunnail_scrollram[offset]); + +// popmessage( "scroll %04x, %04x", gunnail_scrollram[0], gunnail_scrollram[0x100]); + + tilemap_set_scrollx(bg_tilemap,0,gunnail_scrollram[0]-videoshift); + tilemap_set_scrolly(bg_tilemap,0,gunnail_scrollram[0x100]); +} + + +WRITE16_HANDLER( vandyke_scroll_w ) +{ + static UINT16 scroll[4]; + + scroll[offset] = data; + + tilemap_set_scrollx(bg_tilemap,0,scroll[0] * 256 + (scroll[1] >> 8)); + tilemap_set_scrolly(bg_tilemap,0,scroll[2] * 256 + (scroll[3] >> 8)); +} + +WRITE16_HANDLER( manybloc_scroll_w ) +{ + COMBINE_DATA(&gunnail_scrollram[offset]); + + tilemap_set_scrollx(bg_tilemap,0,gunnail_scrollram[0x82/2]-videoshift); + tilemap_set_scrolly(bg_tilemap,0,gunnail_scrollram[0xc2/2]); +} + +WRITE16_HANDLER( nmk_flipscreen_w ) +{ + if (ACCESSING_LSB) + flip_screen_set(data & 0x01); +} + +WRITE16_HANDLER( nmk_tilebank_w ) +{ + if (ACCESSING_LSB) + { + if (bgbank != (data & 0xff)) + { + bgbank = data & 0xff; + tilemap_mark_all_tiles_dirty(bg_tilemap); + } + } +} + +WRITE16_HANDLER( bioship_scroll_w ) +{ + if (ACCESSING_MSB) + bioship_scroll[offset]=data>>8; +} + +WRITE16_HANDLER( bioship_bank_w ) +{ + if (ACCESSING_LSB) + { + if (bioship_background_bank != data) + { + bioship_background_bank = data; + redraw_bitmap=1; + } + } +} + +WRITE16_HANDLER( gunnail_scrollx_w ) +{ + COMBINE_DATA(&gunnail_scrollram[offset]); +} + +WRITE16_HANDLER( gunnail_scrolly_w ) +{ + COMBINE_DATA(&gunnail_scrolly); +} + +/*************************************************************************** + + Display refresh + +***************************************************************************/ + +extern int is_blkheart; + +// manybloc uses extra flip bits on the sprites, but these break other games + +static void nmk16_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority) +{ + int offs; + + for (offs = 0;offs < spriteram_size/2;offs += 8) + { + if ((spriteram_old2[offs] & 0x0001) || (spriteram_old2[offs] && is_blkheart)) + { + int sx = (spriteram_old2[offs+4] & 0x1ff) + videoshift; + int sy = (spriteram_old2[offs+6] & 0x1ff); + int code = spriteram_old2[offs+3]; + int color = spriteram_old2[offs+7]; + int w = (spriteram_old2[offs+1] & 0x0f); + int h = ((spriteram_old2[offs+1] & 0xf0) >> 4); + int pri = (spriteram_old2[offs] & 0xc0) >> 6; + int xx,yy,x; + int delta = 16; + + if(pri != priority) + continue; + + if (flip_screen) + { + sx = 368 - sx; + sy = 240 - sy; + delta = -16; + } + + yy = h; + do + { + x = sx; + xx = w; + do + { + drawgfx(bitmap,machine->gfx[2], + code, + color, + flip_screen, flip_screen, + ((x + 16) & 0x1ff) - 16,sy & 0x1ff, + cliprect,TRANSPARENCY_PEN,15); + code++; + x += delta; + } while (--xx >= 0); + + sy += delta; + } while (--yy >= 0); + } + } +} + +/* sprites have flipping and are not delayed 2 frames */ +static void manybloc_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority) +{ + int offs; + + for (offs = 0;offs < spriteram_size/2;offs += 8) + { + if ((spriteram16[offs] & 0x0001) || (spriteram16[offs] && is_blkheart)) + { + int sx = (spriteram16[offs+4] & 0x1ff) + videoshift; + int sy = (spriteram16[offs+6] & 0x1ff); + int code = spriteram16[offs+3]; + int color = spriteram16[offs+7]; + int w = (spriteram16[offs+1] & 0x0f); + int h = ((spriteram16[offs+1] & 0xf0) >> 4); + int pri = (spriteram16[offs] & 0xc0) >> 6; + /* these would break some of the nmk games ... */ + int flipy= ((spriteram16[offs+1] & 0x0200) >> 9); + int flipx = ((spriteram16[offs+1] & 0x0100) >> 8); + + int xx,yy,x; + int delta = 16; + + if(pri != priority) + continue; + + flipx ^= flip_screen; + flipy ^= flip_screen; + + if (flip_screen) + { + sx = 368 - sx; + sy = 240 - sy; + delta = -16; + } + + yy = h; + do + { + x = sx; + xx = w; + do + { + drawgfx(bitmap,machine->gfx[2], + code, + color, + flipx, flipy, + ((x + 16) & 0x1ff) - 16,sy & 0x1ff, + cliprect,TRANSPARENCY_PEN,15); + + code++; + x += delta; + } while (--xx >= 0); + + sy += delta; + } while (--yy >= 0); + } + } +} + +static void tharrier_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority) +{ + int offs; + + for (offs = 0;offs < spriteram_size/2;offs += 8) + { + if ((spriteram16[offs] & 0x0001) || (spriteram16[offs] && is_blkheart)) + { + int sx = (spriteram16[offs+4] & 0x1ff) + videoshift; + int sy = (spriteram16[offs+6] & 0x1ff); + int code = spriteram16[offs+3]; + int color = spriteram16[offs+7]; + int w = (spriteram16[offs+1] & 0x0f); + int h = ((spriteram16[offs+1] & 0xf0) >> 4); + int pri = (spriteram16[offs] & 0xc0) >> 6; + int flipy= ((spriteram16[offs+1] & 0x0200) >> 9); + int flipx = ((spriteram16[offs+1] & 0x0100) >> 8); + + int xx,yy,x; + int delta = 16; + + if(pri != priority) + continue; + + flipx ^= flip_screen; + flipy ^= flip_screen; + + if (flip_screen) + { + sx = 368 - sx; + sy = 240 - sy; + delta = -16; + } + + yy = h; + sy+=flipy?(delta*h):0; + do + { + x = sx+(flipx?(delta*w):0); + + + xx = w; + do + { + drawgfx(bitmap,machine->gfx[2], + code, + color, + flipx, flipy, + ((x + 16) & 0x1ff) - 16,sy & 0x1ff, + cliprect,TRANSPARENCY_PEN,15); + + code++; + x +=delta * ( flipx?-1:1 ); + + + } while (--xx >= 0); + sy += delta * ( flipy?-1:1); + + } while (--yy >= 0); + } + } +} + +VIDEO_UPDATE( macross ) +{ + tilemap_set_scrollx(tx_tilemap,0,-videoshift); + + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + nmk16_draw_sprites(machine, bitmap,cliprect,3); + nmk16_draw_sprites(machine, bitmap,cliprect,2); + nmk16_draw_sprites(machine, bitmap,cliprect,1); + nmk16_draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + return 0; +} + +extern UINT16 *nmk16_mcu_shared_ram; +extern UINT16 *nmk16_mcu_work_ram; + +/*coin setting MCU simulation*/ +static void mcu_run(UINT8 dsw_setting) +{ + static UINT8 read_coin; + static UINT8 old_value; + static UINT8 coina,coinb; + UINT8 dsw_a,dsw_b; + /*needed because of the uncompatibility of the dsw settings.*/ + if(dsw_setting) + { + dsw_a = (readinputport(2+dsw_setting) & 0x7); + dsw_b = (readinputport(2+dsw_setting) & 0x38) >> 3; + } + else + { + dsw_a = (readinputport(2) & 0x0700) >> 8; + dsw_b = (readinputport(2) & 0x3800) >> 11; + } + + read_coin = old_value; + old_value = readinputport(0); + + if(dsw_a == 0 || dsw_b == 0) + nmk16_mcu_work_ram[0x000/2]|=0x4000; //free_play + + if(read_coin != old_value) + { + if(!(readinputport(0) & 0x01))//COIN1 + { + switch(dsw_a & 7) + { + case 1: nmk16_mcu_shared_ram[0xf00/2]+=4; break; + case 2: nmk16_mcu_shared_ram[0xf00/2]+=3; break; + case 3: nmk16_mcu_shared_ram[0xf00/2]+=2; break; + case 4: + coina++; + if(coina >= 4) + { + coina = 0; + nmk16_mcu_shared_ram[0xf00/2]++; + } + break; + case 5: + coina++; + if(coina >= 3) + { + coina = 0; + nmk16_mcu_shared_ram[0xf00/2]++; + } + break; + case 6: + coina++; + if(coina >= 2) + { + coina = 0; + nmk16_mcu_shared_ram[0xf00/2]++; + } + break; + case 7: nmk16_mcu_shared_ram[0xf00/2]++; break; + } + } + + if(!(readinputport(0) & 0x02))//COIN2 + { + switch(dsw_b & 7) + { + case 1: nmk16_mcu_shared_ram[0xf00/2]+=4; break; + case 2: nmk16_mcu_shared_ram[0xf00/2]+=3; break; + case 3: nmk16_mcu_shared_ram[0xf00/2]+=2; break; + case 4: + coinb++; + if(coinb >= 4) + { + coinb = 0; + nmk16_mcu_shared_ram[0xf00/2]++; + } + break; + case 5: + coinb++; + if(coinb >= 3) + { + coinb = 0; + nmk16_mcu_shared_ram[0xf00/2]++; + } + break; + case 6: + coinb++; + if(coinb >= 2) + { + coinb = 0; + nmk16_mcu_shared_ram[0xf00/2]++; + } + break; + case 7: nmk16_mcu_shared_ram[0xf00/2]++; break; + } + } + + if(!(readinputport(0) & 0x04))//SERVICE_COIN + nmk16_mcu_shared_ram[0xf00/2]++; + + if(nmk16_mcu_shared_ram[0xf00/2] >= 1 && (nmk16_mcu_work_ram[0x000/2] & 0x8000))/*enable start button*/ + { + /*Start a 1-player game,but don't decrement if the player 1 is already playing*/ + if((!(readinputport(0) & 0x08)) /*START1*/ + && (!(nmk16_mcu_work_ram[0x000/2] & 0x0200)) /*PLAYER-1 playing*/ + ) + nmk16_mcu_shared_ram[0xf00/2]--; + + /*Start a 2-players game,but don't decrement if the player 2 is already playing*/ + if((!(readinputport(0) & 0x10)) + && (!(nmk16_mcu_work_ram[0x000/2] & 0x0100)) + ) + { + if(!(nmk16_mcu_work_ram[0x000/2] & 0x0200) && nmk16_mcu_shared_ram[0xf00/2] >= 2) + nmk16_mcu_shared_ram[0xf00/2]-=2; + else + nmk16_mcu_shared_ram[0xf00/2]--; + } + } + + if(nmk16_mcu_shared_ram[0xf00/2] > 99) nmk16_mcu_shared_ram[0xf00/2] = 99; + } +} + +VIDEO_UPDATE( tdragon ) +{ + mcu_run(1); + + tilemap_set_scrollx(tx_tilemap,0,-videoshift); + + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + nmk16_draw_sprites(machine, bitmap,cliprect,3); + nmk16_draw_sprites(machine, bitmap,cliprect,2); + nmk16_draw_sprites(machine, bitmap,cliprect,1); + nmk16_draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( hachamf ) +{ + mcu_run(0); + + tilemap_set_scrollx(tx_tilemap,0,-videoshift); + + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + nmk16_draw_sprites(machine, bitmap,cliprect,3); + nmk16_draw_sprites(machine, bitmap,cliprect,2); + nmk16_draw_sprites(machine, bitmap,cliprect,1); + nmk16_draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( manybloc ) +{ + tilemap_set_scrollx(tx_tilemap,0,-videoshift); + + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + manybloc_draw_sprites(machine, bitmap,cliprect,3); + manybloc_draw_sprites(machine, bitmap,cliprect,2); + manybloc_draw_sprites(machine, bitmap,cliprect,1); + manybloc_draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( tharrier ) +{ + tilemap_set_scrollx(tx_tilemap,0,-videoshift); + tilemap_set_scrollx(bg_tilemap,0,tharrier_scroll); + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + tharrier_draw_sprites(machine, bitmap,cliprect,3); + tharrier_draw_sprites(machine, bitmap,cliprect,2); + tharrier_draw_sprites(machine, bitmap,cliprect,1); + tharrier_draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( gunnail ) +{ + int i; + + for (i = 0;i < 256;i++) + { + tilemap_set_scrollx(bg_tilemap,(i+gunnail_scrolly) & 0x1ff,gunnail_scrollram[0] + gunnail_scrollram[i] - videoshift); + } + tilemap_set_scrolly(bg_tilemap,0,gunnail_scrolly); + + video_update_macross(machine,screen,bitmap,cliprect); + return 0; +} + +VIDEO_UPDATE( bioship ) +{ + UINT16 *tilerom = (UINT16 *)memory_region(REGION_GFX5); + int scrollx=-(bioship_scroll[1] + bioship_scroll[0]*256); + int scrolly=-(bioship_scroll[3] + bioship_scroll[2]*256); + + tilemap_set_scrollx(tx_tilemap,0,-videoshift); + + if (redraw_bitmap) + { + int bank = bioship_background_bank * 0x2000; + int sx=0, sy=0, offs; + redraw_bitmap=0; + + /* Draw background from tile rom */ + for (offs = 0;offs <0x1000;offs++) { + UINT16 data = tilerom[offs+bank]; + int numtile = data&0xfff; + int color = (data&0xf000)>>12; + + drawgfx(background_bitmap,machine->gfx[3], + numtile, + color, + 0,0, /* no flip */ + 16*sx,16*sy, + 0,TRANSPARENCY_NONE,0); + + data = tilerom[offs+0x1000+bank]; + numtile = data&0xfff; + color = (data&0xf000)>>12; + drawgfx(background_bitmap,machine->gfx[3], + numtile, + color, + 0,0, /* no flip */ + 16*sx,(16*sy)+256, + 0,TRANSPARENCY_NONE,0); + + sy++; + if (sy==16) {sy=0; sx++;} + } + } + + copyscrollbitmap(bitmap,background_bitmap,1,&scrollx,1,&scrolly,cliprect,TRANSPARENCY_NONE,0); + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + nmk16_draw_sprites(machine, bitmap,cliprect,3); + nmk16_draw_sprites(machine, bitmap,cliprect,2); + nmk16_draw_sprites(machine, bitmap,cliprect,1); + nmk16_draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( strahl ) +{ + tilemap_set_scrollx(tx_tilemap,0,-videoshift); + + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + tilemap_draw(bitmap,cliprect,fg_tilemap,0,0); + nmk16_draw_sprites(machine, bitmap,cliprect,3); + nmk16_draw_sprites(machine, bitmap,cliprect,2); + nmk16_draw_sprites(machine, bitmap,cliprect,1); + nmk16_draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + return 0; +} + +VIDEO_UPDATE( bjtwin ) +{ + tilemap_set_scrollx(bg_tilemap,0,-videoshift); + + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + nmk16_draw_sprites(machine, bitmap,cliprect,3); + nmk16_draw_sprites(machine, bitmap,cliprect,2); + nmk16_draw_sprites(machine, bitmap,cliprect,1); + nmk16_draw_sprites(machine, bitmap,cliprect,0); + return 0; +} + +VIDEO_EOF( nmk ) +{ + /* looks like sprites are *two* frames ahead */ + memcpy(spriteram_old2,spriteram_old,spriteram_size); + memcpy(spriteram_old,spriteram16,spriteram_size); +} |