summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/ginganin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/ginganin.c')
-rw-r--r--src/mame/video/ginganin.c290
1 files changed, 290 insertions, 0 deletions
diff --git a/src/mame/video/ginganin.c b/src/mame/video/ginganin.c
new file mode 100644
index 00000000000..0bdd3328200
--- /dev/null
+++ b/src/mame/video/ginganin.c
@@ -0,0 +1,290 @@
+/**************************************************************************
+
+ Ginga NinkyouDen
+ (C) 1987 Jaleco
+
+ driver by Luca Elia (l.elia@tin.it)
+
+
+Note: if MAME_DEBUG is defined, pressing Z with:
+
+ Q shows background
+ W shows foreground
+ E shows frontmost (text) layer
+ A shows sprites
+
+ Keys can be used togheter!
+
+
+[Screen]
+ Visible Size: 256H x 240V
+ Dynamic Colors: 256 x 4
+ Color Space: 16R x 16G x 16B
+
+[Scrolling layers]
+ Format (all layers): Offset: 0x400 0x000
+ Bit: fedc---- -------- Color
+ ----ba98 76543210 Code
+
+ [Background]
+ Size: 8192 x 512 (static: stored in ROM)
+ Scrolling: X,Y (registers: $60006.w, $60004.w)
+ Tiles Size: 16 x 16
+ Tiles Number: $400
+ Colors: $300-$3ff
+
+ [Foreground]
+ Size: 4096 x 512
+ Scrolling: X,Y (registers: $60002.w, $60000.w)
+ Tiles Size: 16 x 16
+ Tiles Number: $400
+ Colors: $200-$2ff
+
+ [Frontmost]
+ Size: 256 x 256
+ Scrolling: -
+ Tiles Size: 8 x 8
+ Tiles Number: $200
+ Colors: $000-$0ff
+
+
+[Sprites]
+ On Screen: 256
+ In ROM: $a00
+ Colors: $100-$1ff
+ Format: See Below
+
+
+**************************************************************************/
+
+#include "driver.h"
+
+/* Variables only used here */
+static tilemap *bg_tilemap, *fg_tilemap, *tx_tilemap;
+static int layers_ctrl, flipscreen;
+
+/* Variables that driver has access to */
+UINT16 *ginganin_fgram16, *ginganin_txtram16, *ginganin_vregs16;
+
+/* Variables defined in drivers */
+
+
+/***************************************************************************
+
+ Callbacks for the TileMap code
+
+***************************************************************************/
+
+
+/* Background - Resides in ROM */
+
+#define BG_GFX (0)
+#define BG_NX (16*32)
+#define BG_NY (16*2)
+
+static TILE_GET_INFO( get_bg_tile_info )
+{
+ int code = memory_region(REGION_GFX5)[2*tile_index + 0] * 256 + memory_region(REGION_GFX5)[2*tile_index + 1];
+ SET_TILE_INFO(
+ BG_GFX,
+ code,
+ code >> 12,
+ 0);
+}
+
+
+/* Foreground - Resides in RAM */
+
+#define FG_GFX (1)
+#define FG_NX (16*16)
+#define FG_NY (16*2)
+
+static TILE_GET_INFO( get_fg_tile_info )
+{
+ UINT16 code = ginganin_fgram16[tile_index];
+ SET_TILE_INFO(
+ FG_GFX,
+ code,
+ code >> 12,
+ 0);
+}
+
+WRITE16_HANDLER( ginganin_fgram16_w )
+{
+ COMBINE_DATA(&ginganin_fgram16[offset]);
+ tilemap_mark_tile_dirty(fg_tilemap,offset);
+}
+
+
+/* Frontmost (text) Layer - Resides in RAM */
+
+#define TXT_GFX (2)
+#define TXT_NX (32)
+#define TXT_NY (32)
+
+static TILE_GET_INFO( get_txt_tile_info )
+{
+ UINT16 code = ginganin_txtram16[tile_index];
+ SET_TILE_INFO(
+ TXT_GFX,
+ code,
+ code >> 12,
+ 0);
+}
+
+WRITE16_HANDLER( ginganin_txtram16_w )
+{
+ COMBINE_DATA(&ginganin_txtram16[offset]);
+ tilemap_mark_tile_dirty(tx_tilemap,offset);
+}
+
+
+VIDEO_START( ginganin )
+{
+ bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,16,16,BG_NX,BG_NY);
+ fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,16,16,FG_NX,FG_NY);
+ tx_tilemap = tilemap_create(get_txt_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,TXT_NX,TXT_NY);
+
+ tilemap_set_transparent_pen(fg_tilemap,15);
+ tilemap_set_transparent_pen(tx_tilemap,15);
+}
+
+
+WRITE16_HANDLER( ginganin_vregs16_w )
+{
+ COMBINE_DATA(&ginganin_vregs16[offset]);
+ data = ginganin_vregs16[offset];
+
+ switch (offset)
+ {
+ case 0:
+ tilemap_set_scrolly(fg_tilemap, 0, data);
+ break;
+ case 1:
+ tilemap_set_scrollx(fg_tilemap, 0, data);
+ break;
+ case 2:
+ tilemap_set_scrolly(bg_tilemap, 0, data);
+ break;
+ case 3:
+ tilemap_set_scrollx(bg_tilemap, 0, data);
+ break;
+ case 4:
+ layers_ctrl = data;
+ break;
+/* case 5:
+ * break;
+ */
+ case 6:
+ flipscreen = !(data & 1);
+ tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+ break;
+ case 7:
+ soundlatch_w(0,data);
+ cpunum_set_input_line(1, INPUT_LINE_NMI, PULSE_LINE);
+ break;
+ default:
+ logerror("CPU #0 PC %06X : Warning, videoreg %04X <- %04X\n",activecpu_get_pc(),offset,data);
+ }
+}
+
+
+
+/* --------------------------[ Sprites Format ]----------------------------
+
+Offset: Values: Format:
+
+0000.w y position fedc ba9- ---- ---- unused
+ ---- ---8 ---- ---- subtract 256
+ ---- ---- 7654 3210 position
+
+0002.w x position See above
+
+0004.w code f--- ---- ---- ---- y flip
+ -e-- ---- ---- ---- x flip
+ --dc ---- ---- ---- unused?
+ ---- ba98 7654 3210 code
+
+0006.w colour fedc ---- ---- ---- colour code
+ ---- ba98 7654 3210 unused?
+
+------------------------------------------------------------------------ */
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect)
+{
+int offs;
+
+ for ( offs = 0 ; offs < (spriteram_size >> 1); offs += 4 )
+ {
+ int y = spriteram16[offs + 0];
+ int x = spriteram16[offs + 1];
+ int code = spriteram16[offs + 2];
+ int attr = spriteram16[offs + 3];
+ int flipx = code & 0x4000;
+ int flipy = code & 0x8000;
+
+ x = (x & 0xFF) - (x & 0x100);
+ y = (y & 0xFF) - (y & 0x100);
+
+ if (flipscreen)
+ {
+ x = 240 - x; y = 240 - y;
+ flipx = !flipx; flipy = !flipy;
+ }
+
+ drawgfx(bitmap,machine->gfx[3],
+ code & 0x3fff,
+ attr >> 12,
+ flipx, flipy,
+ x,y,
+ cliprect,TRANSPARENCY_PEN,15);
+
+ }
+}
+
+
+VIDEO_UPDATE( ginganin )
+{
+ int layers_ctrl1;
+
+ layers_ctrl1 = layers_ctrl;
+
+#ifdef MAME_DEBUG
+if (input_code_pressed(KEYCODE_Z))
+{
+ int msk = 0;
+ static int posx,posy;
+
+ if (input_code_pressed(KEYCODE_Q)) { msk |= 0xfff1;}
+ if (input_code_pressed(KEYCODE_W)) { msk |= 0xfff2;}
+ if (input_code_pressed(KEYCODE_E)) { msk |= 0xfff4;}
+ if (input_code_pressed(KEYCODE_A)) { msk |= 0xfff8;}
+ if (msk != 0) layers_ctrl1 &= msk;
+
+#define SETSCROLL \
+ tilemap_set_scrollx(bg_tilemap, 0, posx); \
+ tilemap_set_scrolly(bg_tilemap, 0, posy); \
+ tilemap_set_scrollx(fg_tilemap, 0, posx); \
+ tilemap_set_scrolly(fg_tilemap, 0, posy); \
+ popmessage("B>%04X:%04X F>%04X:%04X",posx%(BG_NX*16),posy%(BG_NY*16),posx%(FG_NX*16),posy%(FG_NY*16));
+
+ if (input_code_pressed(KEYCODE_L)) { posx +=8; SETSCROLL }
+ if (input_code_pressed(KEYCODE_J)) { posx -=8; SETSCROLL }
+ if (input_code_pressed(KEYCODE_K)) { posy +=8; SETSCROLL }
+ if (input_code_pressed(KEYCODE_I)) { posy -=8; SETSCROLL }
+ if (input_code_pressed(KEYCODE_H)) { posx = posy = 0; SETSCROLL }
+
+}
+#endif
+
+
+ if (layers_ctrl1 & 1) tilemap_draw(bitmap,cliprect, bg_tilemap, 0,0);
+ else fillbitmap(bitmap,machine->pens[0],cliprect);
+
+ if (layers_ctrl1 & 2) tilemap_draw(bitmap,cliprect, fg_tilemap, 0,0);
+ if (layers_ctrl1 & 8) draw_sprites(machine, bitmap,cliprect);
+ if (layers_ctrl1 & 4) tilemap_draw(bitmap,cliprect, tx_tilemap, 0,0);
+
+ return 0;
+}
+