diff options
Diffstat (limited to 'src/mame/video/mugsmash.c')
-rw-r--r-- | src/mame/video/mugsmash.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/mame/video/mugsmash.c b/src/mame/video/mugsmash.c new file mode 100644 index 00000000000..05906115a0a --- /dev/null +++ b/src/mame/video/mugsmash.c @@ -0,0 +1,155 @@ +/* video/mugsmash.c - see drivers/mugsmash.c for more info */ + +#include "driver.h" + +static tilemap *mugsmash_tilemap1, *mugsmash_tilemap2; + +extern UINT16 *mugsmash_videoram1, *mugsmash_videoram2, *mugs_spriteram; +extern UINT16 *mugsmash_regs1, *mugsmash_regs2; + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect ) +{ + + /* Each Sprite takes 16 bytes, 5 used? */ + + /* ---- ---- xxxx xxxx ---- ---- aaaa aaaa ---- ---- NNNN NNNN ---- ---- nnnn nnnn ---- ---- yyyy yyyy (rest unused?) */ + + /* x = xpos LSB + y = ypos LSB + N = tile number MSB + n = tile number LSB + a = attribute / extra + f?XY cccc + + f = x-flip + ? = unknown, probably y-flip + X = xpos MSB + y = ypos MSB + c = colour + + */ + + const UINT16 *source = mugs_spriteram; + const UINT16 *finish = source+0x2000; + const gfx_element *gfx = machine->gfx[0]; + + while( source<finish ) + { + int xpos = source[0] & 0x00ff; + int ypos = source[4] & 0x00ff; + int num = (source[3] & 0x00ff) | ((source[2] & 0x00ff) << 8); + int attr = source[1]; + int flipx = (attr & 0x0080)>>7; + int colour = (attr & 0x000f); + + xpos += ((attr & 0x0020) >> 5) * 0x100; + ypos += ((attr & 0x0010) >> 4) * 0x100; + + xpos -= 28; + ypos -= 16; + + drawgfx( + bitmap, + gfx, + num, + colour, + flipx,0, + xpos,ypos, + cliprect, + TRANSPARENCY_PEN,0 + ); + + source += 0x8; + } +} + +static TILE_GET_INFO( get_mugsmash_tile_info1 ) +{ + + /* fF-- cccc nnnn nnnn */ + + /* c = colour? + n = number? + F = flip-X + f = flip-Y + */ + + int tileno,colour,fx; + + tileno = mugsmash_videoram1[tile_index *2 +1]; + colour = mugsmash_videoram1[tile_index *2] & 0x000f; + fx = (mugsmash_videoram1[tile_index *2] & 0xc0) >>6; + + SET_TILE_INFO(1,tileno,colour,TILE_FLIPYX(fx)); +} + +WRITE16_HANDLER( mugsmash_videoram1_w ) +{ + mugsmash_videoram1[offset] = data; + tilemap_mark_tile_dirty(mugsmash_tilemap1,offset/2); +} + +static TILE_GET_INFO( get_mugsmash_tile_info2 ) +{ + + /* fF-- cccc nnnn nnnn */ + + /* c = colour? + n = number? + F = flip-X + f = flip-Y + */ + + int tileno,colour,fx; + + tileno = mugsmash_videoram2[tile_index *2 +1]; + colour = mugsmash_videoram2[tile_index *2] & 0x000f; + fx = (mugsmash_videoram2[tile_index *2] & 0xc0) >>6; + + SET_TILE_INFO(1,tileno,16+colour,TILE_FLIPYX(fx)); +} + +WRITE16_HANDLER( mugsmash_videoram2_w ) +{ + mugsmash_videoram2[offset] = data; + tilemap_mark_tile_dirty(mugsmash_tilemap2,offset/2); +} + +WRITE16_HANDLER (mugsmash_reg_w) +{ + mugsmash_regs1[offset] = data; +// popmessage ("Regs %04x, %04x, %04x, %04x", mugsmash_regs1[0], mugsmash_regs1[1],mugsmash_regs1[2], mugsmash_regs1[3]); + + switch (offset) + { + case 0: + tilemap_set_scrollx(mugsmash_tilemap2,0, mugsmash_regs1[2]+7); + break; + case 1: + tilemap_set_scrolly(mugsmash_tilemap2,0, mugsmash_regs1[3]+4); + break; + case 2: + tilemap_set_scrollx(mugsmash_tilemap1,0, mugsmash_regs1[0]+3); + break; + case 3: + tilemap_set_scrolly(mugsmash_tilemap1,0, mugsmash_regs1[1]+4); + break; + } +} + +VIDEO_START( mugsmash ) +{ + + mugsmash_tilemap1 = tilemap_create(get_mugsmash_tile_info1,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,32,32); + tilemap_set_transparent_pen(mugsmash_tilemap1,0); + + mugsmash_tilemap2 = tilemap_create(get_mugsmash_tile_info2,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,32,32); +} + +VIDEO_UPDATE( mugsmash ) +{ + tilemap_draw(bitmap,cliprect,mugsmash_tilemap2,0,0); + tilemap_draw(bitmap,cliprect,mugsmash_tilemap1,0,0); + draw_sprites(machine,bitmap,cliprect); + return 0; +} |