summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/sengokmj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/sengokmj.c')
-rw-r--r--src/mame/video/sengokmj.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/mame/video/sengokmj.c b/src/mame/video/sengokmj.c
new file mode 100644
index 00000000000..c89cc38dc79
--- /dev/null
+++ b/src/mame/video/sengokmj.c
@@ -0,0 +1,129 @@
+/******************************************************************************************
+
+Sengoku Mahjong Video Hardware section
+
+*******************************************************************************************/
+
+#include "driver.h"
+
+static tilemap *bg_tilemap,*md_tilemap,*fg_tilemap,*tx_tilemap;
+UINT16 *sengokmj_bgvram,*sengokmj_mdvram,*sengokmj_fgvram,*sengokmj_txvram;
+
+WRITE16_HANDLER( sengokmj_bgvram_w )
+{
+ COMBINE_DATA(&sengokmj_bgvram[offset]);
+ tilemap_mark_tile_dirty(bg_tilemap,offset);
+}
+
+WRITE16_HANDLER( sengokmj_mdvram_w )
+{
+ COMBINE_DATA(&sengokmj_mdvram[offset]);
+ tilemap_mark_tile_dirty(md_tilemap,offset);
+}
+
+WRITE16_HANDLER( sengokmj_fgvram_w )
+{
+ COMBINE_DATA(&sengokmj_fgvram[offset]);
+ tilemap_mark_tile_dirty(fg_tilemap,offset);
+}
+
+WRITE16_HANDLER( sengokmj_txvram_w )
+{
+ COMBINE_DATA(&sengokmj_txvram[offset]);
+ tilemap_mark_tile_dirty(tx_tilemap,offset);
+}
+
+static TILE_GET_INFO( sengoku_bg_tile_info )
+{
+ int tile = sengokmj_bgvram[tile_index];
+ int color = (tile >> 12) & 0x0f;
+ SET_TILE_INFO(1, tile & 0xfff, color, 0);
+}
+
+static TILE_GET_INFO( sengoku_md_tile_info )
+{
+ int tile = sengokmj_mdvram[tile_index];
+ int color = (tile >> 12) & 0x0f;
+ SET_TILE_INFO(1, (tile & 0xfff) + 0x1000, color + 0x10, 0);
+}
+
+static TILE_GET_INFO( sengoku_fg_tile_info )
+{
+ int tile = sengokmj_fgvram[tile_index];
+ int color = (tile >> 12) & 0x0f;
+ SET_TILE_INFO(1, (tile & 0xfff) + 0x2000, color + 0x20, 0);
+}
+
+static TILE_GET_INFO( sengoku_tx_tile_info )
+{
+ int tile = sengokmj_txvram[tile_index];
+ int color = (tile >> 12) & 0x0f;
+ SET_TILE_INFO(2, (tile & 0xfff) + 0x3000, color, 0);
+}
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int pri)
+{
+ int offs,fx,fy,x,y,color,sprite;
+ int dx,dy,ax,ay;
+
+ for (offs = 0x400-4;offs >= 0;offs -= 4)
+ {
+ if ((spriteram16[offs+0]&0x8000)!=0x8000) continue;
+ sprite = spriteram16[offs+1];
+ if ((sprite>>14)!=pri) continue;
+ sprite &= 0x1fff;
+
+ y = spriteram16[offs+3];
+ x = 128 + spriteram16[offs+2];
+
+ if (x&0x8000) x=0-(0x200-(x&0x1ff));
+ //else x&=0x1ff;
+ if (y&0x8000) y=0-(0x200-(y&0x1ff));
+ //else y&=0x1ff;
+
+ color = spriteram16[offs+0]&0x3f;
+ fx = spriteram16[offs+0]&0x40;
+ fy = 0; /* To do - probably 0x2000 */
+ dy = ((spriteram16[offs+0]&0x0380)>>7) + 1;
+ dx = ((spriteram16[offs+0]&0x1c00)>>10) + 1;
+
+ for (ax=0; ax<dx; ax++)
+ for (ay=0; ay<dy; ay++) {
+ if (!fx)
+ drawgfx(bitmap,machine->gfx[0],
+ sprite++,
+ color,fx,fy,x+ax*16,y+ay*16,
+ cliprect,TRANSPARENCY_PEN,15);
+ else
+ drawgfx(bitmap,machine->gfx[0],
+ sprite++,
+ color,fx,fy,x+(dx-1-ax)*16,y+ay*16,
+ cliprect,TRANSPARENCY_PEN,15);
+ }
+ }
+}
+
+VIDEO_START( sengokmj )
+{
+ bg_tilemap = tilemap_create(sengoku_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16,32,16);
+ md_tilemap = tilemap_create(sengoku_md_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,16);
+ fg_tilemap = tilemap_create(sengoku_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,16,16,32,16);
+ tx_tilemap = tilemap_create(sengoku_tx_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,32);
+
+ tilemap_set_transparent_pen(md_tilemap,15);
+ tilemap_set_transparent_pen(fg_tilemap,15);
+ tilemap_set_transparent_pen(tx_tilemap,15);
+}
+
+VIDEO_UPDATE( sengokmj )
+{
+ tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
+ draw_sprites(machine, bitmap,cliprect, 2);
+ draw_sprites(machine, bitmap,cliprect, 1);
+ tilemap_draw(bitmap,cliprect,md_tilemap,0,0);
+ tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
+ draw_sprites(machine, bitmap,cliprect, 0);
+ draw_sprites(machine, bitmap,cliprect, 3);
+ tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
+ return 0;
+}