summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/darius.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/darius.c')
-rw-r--r--src/mame/video/darius.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/mame/video/darius.c b/src/mame/video/darius.c
new file mode 100644
index 00000000000..27edc7c3687
--- /dev/null
+++ b/src/mame/video/darius.c
@@ -0,0 +1,155 @@
+#include "driver.h"
+#include "video/taitoic.h"
+
+
+static tilemap *fg_tilemap;
+UINT16 *darius_fg_ram;
+
+struct tempsprite
+{
+ int gfx;
+ int code,color;
+ int flipx,flipy;
+ int x,y;
+ int zoomx,zoomy;
+ int primask;
+};
+static struct tempsprite *spritelist;
+
+
+/***************************************************************************/
+
+INLINE void actual_get_fg_tile_info(running_machine *machine, tile_data *tileinfo, int tile_index, UINT16 *ram,int gfxnum)
+{
+ UINT16 code = (ram[tile_index + 0x2000] & 0x7ff);
+ UINT16 attr = ram[tile_index];
+
+ SET_TILE_INFO(
+ gfxnum,
+ code,
+ ((attr & 0xff) << 2),
+ TILE_FLIPYX((attr & 0xc000) >> 14));
+}
+
+static TILE_GET_INFO( get_fg_tile_info )
+{
+ actual_get_fg_tile_info(machine, tileinfo, tile_index, darius_fg_ram, 2);
+}
+
+static void dirty_fg_tilemap(void)
+{
+ tilemap_mark_all_tiles_dirty(fg_tilemap);
+}
+
+/***************************************************************************/
+
+VIDEO_START( darius )
+{
+ fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,128,64);
+
+ spritelist = auto_malloc(0x800 * sizeof(*spritelist));
+
+ /* (chips, gfxnum, x_offs, y_offs, y_invert, opaque, dblwidth) */
+ PC080SN_vh_start(1,1,-16,8,0,1,1);
+
+ tilemap_set_transparent_pen(fg_tilemap,0);
+
+ /* colors from saved states are often screwy (and this doesn't help...) */
+ state_save_register_func_postload(dirty_fg_tilemap);
+}
+
+/***************************************************************************/
+
+READ16_HANDLER( darius_fg_layer_r )
+{
+ return darius_fg_ram[offset];
+}
+
+WRITE16_HANDLER( darius_fg_layer_w )
+{
+ COMBINE_DATA(&darius_fg_ram[offset]);
+ if (offset < 0x4000)
+ tilemap_mark_tile_dirty(fg_tilemap,(offset & 0x1fff));
+}
+
+/***************************************************************************/
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int primask, int x_offs, int y_offs)
+{
+ int offs,curx,cury;
+ UINT16 code,data,sx,sy;
+ UINT8 flipx,flipy,color,priority;
+
+ /* pdrawgfx() needs us to draw sprites front to back, so we have to build a list
+ while processing sprite ram and then draw them all at the end */
+ struct tempsprite *sprite_ptr = spritelist;
+
+ for (offs = spriteram_size/2-4; offs >= 0; offs -= 4)
+ {
+ code = spriteram16[offs+2] &0x1fff;
+
+ if (code)
+ {
+ data = spriteram16[offs];
+ sy = (256-data) & 0x1ff;
+
+ data = spriteram16[offs+1];
+ sx = data & 0x3ff;
+
+ data = spriteram16[offs+2];
+ flipx = ((data & 0x4000) >> 14);
+ flipy = ((data & 0x8000) >> 15);
+
+ data = spriteram16[offs+3];
+ priority = (data &0x80) >> 7; // 0 = low
+ if (priority != primask) continue;
+ color = (data & 0x7f);
+
+ curx = sx - x_offs;
+ cury = sy + y_offs;
+
+ if (curx > 900) curx -= 1024;
+ if (cury > 400) cury -= 512;
+
+ sprite_ptr->code = code;
+ sprite_ptr->color = color;
+ sprite_ptr->flipx = flipx;
+ sprite_ptr->flipy = flipy;
+ sprite_ptr->x = curx;
+ sprite_ptr->y = cury;
+
+ drawgfx(bitmap,machine->gfx[0],
+ sprite_ptr->code,
+ sprite_ptr->color,
+ sprite_ptr->flipx,sprite_ptr->flipy,
+ sprite_ptr->x,sprite_ptr->y,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+ }
+}
+
+
+
+VIDEO_UPDATE( darius )
+{
+ int xoffs = 36*8*screen;
+
+ PC080SN_tilemap_update();
+
+ // draw bottom layer(always active)
+ PC080SN_tilemap_draw_offset(bitmap,cliprect,0,0,TILEMAP_DRAW_OPAQUE,0,-xoffs,0);
+
+ /* Sprites can be under/over the layer below text layer */
+ draw_sprites(machine,bitmap,cliprect,0,xoffs,-8); // draw sprites with priority 0 which are under the mid layer
+
+ // draw middle layer
+ PC080SN_tilemap_draw_offset(bitmap,cliprect,0,1,0,0,-xoffs,0);
+
+ draw_sprites(machine,bitmap,cliprect,1,xoffs,-8); // draw sprites with priority 1 which are over the mid layer
+
+ /* top(text) layer is in fixed position */
+ tilemap_set_scrollx(fg_tilemap,0,0+xoffs);
+ tilemap_set_scrolly(fg_tilemap,0,-8);
+ tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
+ return 0;
+}