summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/airbustr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/airbustr.c')
-rw-r--r--src/mame/video/airbustr.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/mame/video/airbustr.c b/src/mame/video/airbustr.c
new file mode 100644
index 00000000000..735aab07c28
--- /dev/null
+++ b/src/mame/video/airbustr.c
@@ -0,0 +1,151 @@
+/**************************************************************************
+
+ Air Buster
+ (C) 1990 Kaneko
+
+ driver by Luca Elia (l.elia@tin.it)
+
+[Screen]
+ Size: 256 x 256
+ Colors: 256 x 3
+ Color Space: 32R x 32G x 32B
+
+[Scrolling layers]
+ Number: 2
+ Size: 512 x 512
+ Scrolling: X,Y
+ Tiles Size: 16 x 16
+ Tiles Number: 0x1000
+ Colors: 256 x 2 (0-511)
+ Format:
+ Offset: 0x400 0x000
+ Bit: fedc---- -------- Color
+ ----ba98 76543210 Code
+
+[Sprites]
+ On Screen: 256 x 2
+ In ROM: 0x2000
+ Colors: 256 (512-767)
+ Format: See Below
+
+
+**************************************************************************/
+#include "driver.h"
+#include "kan_pand.h"
+
+UINT8 *airbustr_videoram2, *airbustr_colorram2;
+//int airbustr_clear_sprites;
+static tilemap *bg_tilemap, *fg_tilemap;
+static mame_bitmap *sprites_bitmap;
+
+WRITE8_HANDLER( airbustr_videoram_w )
+{
+ videoram[offset] = data;
+ tilemap_mark_tile_dirty(bg_tilemap, offset);
+}
+
+WRITE8_HANDLER( airbustr_colorram_w )
+{
+ colorram[offset] = data;
+ tilemap_mark_tile_dirty(bg_tilemap, offset);
+}
+
+WRITE8_HANDLER( airbustr_videoram2_w )
+{
+ airbustr_videoram2[offset] = data;
+ tilemap_mark_tile_dirty(fg_tilemap, offset);
+}
+
+WRITE8_HANDLER( airbustr_colorram2_w )
+{
+ airbustr_colorram2[offset] = data;
+ tilemap_mark_tile_dirty(fg_tilemap, offset);
+}
+
+/* Scroll Registers
+
+ Port:
+ 4 Bg Y scroll, low 8 bits
+ 6 Bg X scroll, low 8 bits
+ 8 Fg Y scroll, low 8 bits
+ A Fg X scroll, low 8 bits
+
+ C 3 2 1 0 <-Bit
+ Bg Y Bg X Fg Y Fg X <-Scroll High Bits (complemented!)
+*/
+
+WRITE8_HANDLER( airbustr_scrollregs_w )
+{
+ static int bg_scrollx, bg_scrolly, fg_scrollx, fg_scrolly, highbits;
+
+ switch (offset) // offset 0 <-> port 4
+ {
+ case 0x00: fg_scrolly = data; break; // low 8 bits
+ case 0x02: fg_scrollx = data; break;
+ case 0x04: bg_scrolly = data; break;
+ case 0x06: bg_scrollx = data; break;
+ case 0x08: highbits = ~data; break; // complemented high bits
+
+ default: logerror("CPU #2 - port %02X written with %02X - PC = %04X\n", offset, data, activecpu_get_pc());
+ }
+
+ tilemap_set_scrolly(bg_tilemap, 0, ((highbits << 5) & 0x100) + bg_scrolly);
+ tilemap_set_scrollx(bg_tilemap, 0, ((highbits << 6) & 0x100) + bg_scrollx);
+ tilemap_set_scrolly(fg_tilemap, 0, ((highbits << 7) & 0x100) + fg_scrolly);
+ tilemap_set_scrollx(fg_tilemap, 0, ((highbits << 8) & 0x100) + fg_scrollx);
+}
+
+static TILE_GET_INFO( get_fg_tile_info )
+{
+ int attr = airbustr_colorram2[tile_index];
+ int code = airbustr_videoram2[tile_index] + ((attr & 0x0f) << 8);
+ int color = attr >> 4;
+
+ SET_TILE_INFO(0, code, color, 0);
+}
+
+static TILE_GET_INFO( get_bg_tile_info )
+{
+ int attr = colorram[tile_index];
+ int code = videoram[tile_index] + ((attr & 0x0f) << 8);
+ int color = (attr >> 4) + 16;
+
+ SET_TILE_INFO(0, code, color, 0);
+}
+
+VIDEO_START( airbustr )
+{
+ bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 16, 16, 32, 32);
+
+ fg_tilemap = tilemap_create(get_fg_tile_info, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 16, 16, 32, 32);
+
+ sprites_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
+ tilemap_set_transparent_pen(fg_tilemap, 0);
+ pandora_start(1,0,0);
+
+ tilemap_set_scrolldx(bg_tilemap, 0x094, 0x06a);
+ tilemap_set_scrolldy(bg_tilemap, 0x100, 0x1ff);
+ tilemap_set_scrolldx(fg_tilemap, 0x094, 0x06a);
+ tilemap_set_scrolldy(fg_tilemap, 0x100, 0x1ff);
+}
+
+
+VIDEO_UPDATE( airbustr )
+{
+ tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
+ tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0);
+
+ // copy the sprite bitmap to the screen
+ pandora_update(machine, bitmap, cliprect);
+
+ return 0;
+}
+
+VIDEO_EOF( airbustr )
+{
+ // update the sprite bitmap
+ pandora_eof(machine);
+}
+