diff options
Diffstat (limited to 'src/mame/video/flower.c')
-rw-r--r-- | src/mame/video/flower.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/src/mame/video/flower.c b/src/mame/video/flower.c new file mode 100644 index 00000000000..2d48e14e854 --- /dev/null +++ b/src/mame/video/flower.c @@ -0,0 +1,204 @@ +/* Flower Video Hardware */ + +#include "driver.h" + +static tilemap *flower_bg0_tilemap, *flower_bg1_tilemap, *flower_text_tilemap, *flower_text_right_tilemap; +UINT8 *flower_textram, *flower_bg0ram, *flower_bg1ram, *flower_bg0_scroll, *flower_bg1_scroll; + + +PALETTE_INIT( flower ) +{ + int i; + + for (i=0; i<256; i++) + { + palette_set_color_rgb(machine, i, pal4bit(color_prom[i]), pal4bit(color_prom[i+0x100]), pal4bit(color_prom[i+0x200])); + colortable[i] = i; + } +} + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect ) +{ + const gfx_element *gfx = machine->gfx[1]; + UINT8 *source = spriteram + 0x200; + UINT8 *finish = source - 0x200; + + source -= 8; + + while( source>=finish ) + { + int xblock,yblock; + int sy = 256-32-source[0]+1; + int sx = (source[4]|(source[5]<<8))-55; + int code = source[1] & 0x3f; + int color = (source[6]>>4); + + /* + Byte 0: Y + Byte 1: + 0x80 - FlipY + 0x40 - FlipX + 0x3f - Tile + Byte 2: + 0x08 - Tile MSB + 0x01 - Tile MSB + Byte 3: + 0x07 - X Zoom + 0x08 - X Size + 0x70 - Y Zoom + 0x80 - Y Size + Byte 4: X LSB + Byte 5: X MSB + Byte 6: + 0xf0 - Colour + */ + + int flipy = source[1] & 0x80; + int flipx = source[1] & 0x40; + + int size = source[3]; + + int xsize = ((size & 0x08)>>3); + int ysize = ((size & 0x80)>>7); + + xsize++; + ysize++; + + if (ysize==2) sy -= 16; + + code |= ((source[2] & 0x01) << 6); + code |= ((source[2] & 0x08) << 4); + + if(flip_screen) + { + flipx = !flipx; + flipy = !flipy; + sx = sx+16; + sy = 250-sy; + + if (ysize==2) sy += 16; + } + + for (xblock = 0; xblock<xsize; xblock++) + { + int xoffs=!flipx ? (xblock*8) : ((xsize-xblock-1)*8); + int zoomx=((size&7)+1)<<13; + int zoomy=((size&0x70)+0x10)<<9; + int xblocksizeinpixels=(zoomx*16)>>16; + int yblocksizeinpixels=(zoomy*16)>>16; + + for (yblock = 0; yblock<ysize; yblock++) + { + int yoffs=!flipy ? yblock : (ysize-yblock-1); + int sxoffs=(16-xblocksizeinpixels)/2; + int syoffs=(16-yblocksizeinpixels)/2; + if (xblock) sxoffs+=xblocksizeinpixels; + if (yblock) syoffs+=yblocksizeinpixels; + + drawgfxzoom(bitmap,gfx, + code+yoffs+xoffs, + color, + flipx,flipy, + sx+sxoffs,sy+syoffs, + cliprect,TRANSPARENCY_PEN,15, + zoomx,zoomy); + } + } + source -= 8; + } + +} + +static TILE_GET_INFO( get_bg0_tile_info ) +{ + int code = flower_bg0ram[tile_index]; + int color = flower_bg0ram[tile_index+0x100]; + /* Todo - may be tile flip bits? */ + + SET_TILE_INFO(2, code, color>>4, 0); +} + +static TILE_GET_INFO( get_bg1_tile_info ) +{ + int code = flower_bg1ram[tile_index]; + int color = flower_bg1ram[tile_index+0x100]; + /* Todo - may be tile flip bits? */ + + SET_TILE_INFO(2, code, color>>4, 0); +} + +static TILE_GET_INFO( get_text_tile_info ) +{ + int code = flower_textram[tile_index]; + int color = flower_textram[tile_index+0x400]; + /* Todo - may be tile flip bits? */ + + SET_TILE_INFO(0, code, color>>2, 0); +} + +VIDEO_START(flower) +{ + flower_bg0_tilemap = tilemap_create(get_bg0_tile_info, tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16,16,16); + flower_bg1_tilemap = tilemap_create(get_bg1_tile_info, tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,16,16); + flower_text_tilemap = tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,32,32); + flower_text_right_tilemap = tilemap_create(get_text_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN, 8, 8, 2,32); + + tilemap_set_transparent_pen(flower_bg1_tilemap,15); + tilemap_set_transparent_pen(flower_text_tilemap,3); + tilemap_set_transparent_pen(flower_text_right_tilemap,3); + + tilemap_set_scrolly(flower_text_tilemap, 0, 16); + tilemap_set_scrolly(flower_text_right_tilemap, 0, 16); +} + +VIDEO_UPDATE( flower ) +{ + rectangle myclip = *cliprect; + + tilemap_set_scrolly(flower_bg0_tilemap,0, flower_bg0_scroll[0]+16); + tilemap_set_scrolly(flower_bg1_tilemap,0, flower_bg1_scroll[0]+16); + + tilemap_draw(bitmap,cliprect,flower_bg0_tilemap,0,0); + tilemap_draw(bitmap,cliprect,flower_bg1_tilemap,0,0); + + draw_sprites(machine,bitmap,cliprect); + + if(flip_screen) + { + myclip.min_x = cliprect->min_x; + myclip.max_x = cliprect->min_x + 15; + } + else + { + myclip.min_x = cliprect->max_x - 15; + myclip.max_x = cliprect->max_x; + } + + tilemap_draw(bitmap,cliprect,flower_text_tilemap,0,0); + tilemap_draw(bitmap,&myclip,flower_text_right_tilemap,0,0); + return 0; +} + +WRITE8_HANDLER( flower_textram_w ) +{ + flower_textram[offset] = data; + tilemap_mark_tile_dirty(flower_text_tilemap, offset); + tilemap_mark_all_tiles_dirty(flower_text_right_tilemap); +} + +WRITE8_HANDLER( flower_bg0ram_w ) +{ + flower_bg0ram[offset] = data; + tilemap_mark_tile_dirty(flower_bg0_tilemap, offset & 0x1ff); +} + +WRITE8_HANDLER( flower_bg1ram_w ) +{ + flower_bg1ram[offset] = data; + tilemap_mark_tile_dirty(flower_bg1_tilemap, offset & 0x1ff); +} + +WRITE8_HANDLER( flower_flipscreen_w ) +{ + flip_screen_set(data); +} |