diff options
Diffstat (limited to 'src/mame/video/silkroad.c')
-rw-r--r-- | src/mame/video/silkroad.c | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/mame/video/silkroad.c b/src/mame/video/silkroad.c new file mode 100644 index 00000000000..233757a49a2 --- /dev/null +++ b/src/mame/video/silkroad.c @@ -0,0 +1,189 @@ +#include "driver.h" + +/* Sprites probably need to be delayed */ +/* Some scroll layers may need to be offset slightly? */ +/* Check Sprite Colours after redump */ +/* Clean Up */ +/* is theres a bg colour register? */ + +static tilemap *fg_tilemap,*fg2_tilemap,*fg3_tilemap; +extern UINT32 *silkroad_vidram,*silkroad_vidram2,*silkroad_vidram3, *silkroad_sprram, *silkroad_regs; + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int pri ) +{ + const gfx_element *gfx = machine->gfx[0]; + UINT32 *source = silkroad_sprram; + UINT32 *finish = source + 0x1000/4; + UINT32 *maxspr = source; + + while( maxspr<finish ) + { + int attr = (maxspr[1] & 0x0000ffff); + + if ( (attr & 0xff00) == 0xff00 ) break; + maxspr+=2; + } + + finish = maxspr-2; + + while( finish>=source ) + { + + int xpos = (finish[0] & 0x01ff0000) >> 16; + int ypos = (finish[0] & 0x0000ffff); + int tileno = (finish[1] & 0xffff0000) >> 16; + int attr = (finish[1] & 0x0000ffff); + + int flipx = (attr & 0x0080); + + int width = (attr & 0x0f00) >> 8; + int wcount; + int color = (attr & 0x003f) ; + + int priority = (attr & 0x1000) >> 12; + + if ( (attr & 0x8000) == 0x8000 ) tileno+=0x10000; + + width += 1; + + + if (priority == pri){ + + if (!flipx) { + for (wcount=0;wcount<width;wcount++) { + drawgfx(bitmap,gfx,tileno+wcount,color,0,0,xpos+wcount*16+8,ypos,cliprect,TRANSPARENCY_PEN,0); + } + + } else { + + for (wcount=width;wcount>0;wcount--) { + drawgfx(bitmap,gfx,tileno+(width-wcount),color,1,0,xpos+wcount*16-16+8,ypos,cliprect,TRANSPARENCY_PEN,0); + } + + } + } + finish-=2; + } +} + + +static TILE_GET_INFO( get_fg_tile_info ) +{ + + int code = ((silkroad_vidram[tile_index] & 0xffff0000) >> 16 ); + int color = ((silkroad_vidram[tile_index] & 0x000001f)); + int flipx = ((silkroad_vidram[tile_index] & 0x0000080) >> 7); + + code += 0x18000; + + SET_TILE_INFO( + 0, + code, + color, + TILE_FLIPYX(flipx)); +} + + + +WRITE32_HANDLER( silkroad_fgram_w ) +{ + COMBINE_DATA(&silkroad_vidram[offset]); + tilemap_mark_tile_dirty(fg_tilemap,offset); +} + +static TILE_GET_INFO( get_fg2_tile_info ) +{ + int code = ((silkroad_vidram2[tile_index] & 0xffff0000) >> 16 ); + int color = ((silkroad_vidram2[tile_index] & 0x000001f)); + int flipx = ((silkroad_vidram2[tile_index] & 0x0000080) >> 7); + code += 0x18000; + SET_TILE_INFO( + 0, + code, + color, + TILE_FLIPYX(flipx)); +} + + + +WRITE32_HANDLER( silkroad_fgram2_w ) +{ + COMBINE_DATA(&silkroad_vidram2[offset]); + tilemap_mark_tile_dirty(fg2_tilemap,offset); +} + +static TILE_GET_INFO( get_fg3_tile_info ) +{ + int code = ((silkroad_vidram3[tile_index] & 0xffff0000) >> 16 ); + int color = ((silkroad_vidram3[tile_index] & 0x000001f)); + int flipx = ((silkroad_vidram3[tile_index] & 0x0000080) >> 7); + code += 0x18000; + SET_TILE_INFO( + 0, + code, + color, + TILE_FLIPYX(flipx)); +} + + + +WRITE32_HANDLER( silkroad_fgram3_w ) +{ + COMBINE_DATA(&silkroad_vidram3[offset]); + tilemap_mark_tile_dirty(fg3_tilemap,offset); +} + + + +VIDEO_START(silkroad) +{ + fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,64, 64); + tilemap_set_transparent_pen(fg_tilemap,0); + + fg2_tilemap = tilemap_create(get_fg2_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,64, 64); + tilemap_set_transparent_pen(fg2_tilemap,0); + + fg3_tilemap = tilemap_create(get_fg3_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,64, 64); + tilemap_set_transparent_pen(fg3_tilemap,0); +} + +static int enable1=1,enable2=1,enable3=1; + +VIDEO_UPDATE(silkroad) +{ + fillbitmap(bitmap,0x7c0,&machine->screen[0].visarea); + + tilemap_set_scrollx( fg_tilemap, 0, ((silkroad_regs[0] & 0xffff0000) >> 16) ); + tilemap_set_scrolly( fg_tilemap, 0, (silkroad_regs[0] & 0x0000ffff) >> 0 ); + + tilemap_set_scrolly( fg3_tilemap, 0, (silkroad_regs[1] & 0xffff0000) >> 16 ); + tilemap_set_scrollx( fg3_tilemap, 0, (silkroad_regs[2] & 0xffff0000) >> 16 ); + + tilemap_set_scrolly( fg2_tilemap, 0, ((silkroad_regs[5] & 0xffff0000) >> 16)); + tilemap_set_scrollx( fg2_tilemap, 0, (silkroad_regs[2] & 0x0000ffff) >> 0 ); + +/* + if (input_code_pressed(KEYCODE_A)) enable1 ^= 1; + if (input_code_pressed(KEYCODE_S)) enable2 ^= 1; + if (input_code_pressed(KEYCODE_D)) enable3 ^= 1; +*/ + + if(enable1) tilemap_draw(bitmap,cliprect,fg_tilemap,0,0); + + draw_sprites(machine, bitmap,cliprect,0); + if(enable2) tilemap_draw(bitmap,cliprect,fg2_tilemap,0,0); + + draw_sprites(machine, bitmap,cliprect,1); + if(enable3) tilemap_draw(bitmap,cliprect,fg3_tilemap,0,0); + +/* + popmessage ("Regs %08x %08x %08x %08x %08x", + silkroad_regs[0], + silkroad_regs[1], + silkroad_regs[2], + silkroad_regs[4], + silkroad_regs[5] + ); +*/ + return 0; +} |