summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/ksayakyu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/ksayakyu.c')
-rw-r--r--src/mame/video/ksayakyu.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/mame/video/ksayakyu.c b/src/mame/video/ksayakyu.c
new file mode 100644
index 00000000000..5746535ba51
--- /dev/null
+++ b/src/mame/video/ksayakyu.c
@@ -0,0 +1,116 @@
+#include "driver.h"
+
+static tilemap *ksayakyu_tilemap;
+static tilemap *ksayakyu_textmap;
+
+static int video_ctrl;
+static int flipscreen;
+
+WRITE8_HANDLER(ksayakyu_videoram_w)
+{
+ videoram[offset]=data;
+ tilemap_mark_tile_dirty(ksayakyu_textmap,offset>>1);
+}
+
+WRITE8_HANDLER(ksayakyu_videoctrl_w)
+{
+ /*
+ bits:
+ 76543210
+ xx - ?? layers enable ?
+ x - screen flip
+ xx - ??
+ xxx - scroll offset
+
+ */
+ video_ctrl=data;
+
+ flipscreen = (data&4)?(TILEMAP_FLIPX|TILEMAP_FLIPY):0;
+ tilemap_set_flip( ALL_TILEMAPS,flipscreen );
+ tilemap_set_scrolly( ksayakyu_tilemap, 0, (data&0xe0)<<3 );
+}
+
+PALETTE_INIT( ksayakyu )
+{
+ int i,j,b1,b2;
+ for(j=0;j<16;j++)
+ for(i=0;i<8;i++)
+ {
+ b1=memory_region(REGION_PROMS)[j*16+i];
+ b2=memory_region(REGION_PROMS)[j*16+i+8];
+
+ b1=b2|(b1<<8);
+ palette_set_color_rgb(machine,j*8+i,pal5bit(b1 >> 10),pal5bit(b1 >> 0),pal5bit(b1 >> 5));
+ }
+}
+
+static TILE_GET_INFO( get_ksayakyu_tile_info )
+{
+ int code = memory_region(REGION_USER1)[tile_index];
+ int attr = memory_region(REGION_USER1)[tile_index+0x2000];
+ code+=(attr&3)<<8;
+ SET_TILE_INFO(1,code,((attr>>2)&0x07)*2,(attr&0x80) ? TILE_FLIPX : 0);
+}
+
+static TILE_GET_INFO( get_text_tile_info )
+{
+ int code = videoram[tile_index*2+1];
+ int attr = videoram[tile_index*2];
+ int flags=((attr&0x80) ? TILE_FLIPX : 0) | ((attr&0x40) ? TILE_FLIPY : 0);
+
+ code|=(attr&3)<<8;
+
+ SET_TILE_INFO(0,code,((attr>>2)&7),flags);
+}
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect )
+{
+ const UINT8 *source = spriteram+spriteram_size-4;
+ const UINT8 *finish = spriteram;
+
+ while( source>=finish ) /* is order correct ? */
+ {
+ int sx=source[2];
+ int sy=240-source[1];
+ int attributes=source[3];
+ int tile=source[0];
+ int flipx=(tile&0x80)?1:0;
+ int flipy=0;
+
+ gfx_element *gfx = machine->gfx[2];
+
+ if (flipscreen)
+ {
+ sx = 240-sx;
+ sy = 240-sy;
+ flipx^=1;
+ flipy^=1;
+ }
+
+ drawgfx(bitmap,gfx,
+ tile&0x7f,
+ (attributes) & 7,
+ flipx,flipy,
+ sx,sy,
+ cliprect,TRANSPARENCY_PEN,0 );
+
+ source -= 4;
+ }
+}
+
+VIDEO_START(ksayakyu)
+{
+ ksayakyu_tilemap = tilemap_create(get_ksayakyu_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,32,32*8);
+ ksayakyu_textmap = tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,32,32);
+ tilemap_set_transparent_pen(ksayakyu_textmap,0);
+}
+
+VIDEO_UPDATE(ksayakyu)
+{
+ fillbitmap(bitmap,machine->pens[0],cliprect);
+ if(video_ctrl&1)
+ tilemap_draw(bitmap,cliprect,ksayakyu_tilemap,0,0);
+ draw_sprites(machine,bitmap,cliprect);
+ tilemap_draw(bitmap,cliprect,ksayakyu_textmap, 0,0);
+ return 0;
+}