diff options
Diffstat (limited to 'src/mame/video/ginganin.c')
-rw-r--r-- | src/mame/video/ginganin.c | 290 |
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; +} + |