summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/mermaid.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/mermaid.c')
-rw-r--r--src/mame/video/mermaid.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/mame/video/mermaid.c b/src/mame/video/mermaid.c
new file mode 100644
index 00000000000..6f736e06621
--- /dev/null
+++ b/src/mame/video/mermaid.c
@@ -0,0 +1,197 @@
+#include "driver.h"
+
+static tilemap *bg_tilemap, *fg_tilemap;
+
+UINT8* mermaid_videoram2;
+UINT8* mermaid_bg_scrollram;
+UINT8* mermaid_fg_scrollram;
+
+static int rougien_gfxbank1, rougien_gfxbank2;
+
+static rectangle spritevisiblearea =
+{
+ 0*8, 26*8-1,
+ 2*8, 30*8-1
+};
+
+static rectangle flip_spritevisiblearea =
+{
+ 6*8, 31*8-1,
+ 2*8, 30*8-1
+};
+
+PALETTE_INIT( mermaid )
+{
+ #define TOTAL_COLORS(gfxn) (machine->gfx[gfxn]->total_colors * machine->gfx[gfxn]->color_granularity)
+ #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
+
+ // first, the char actor/sprite palette
+ int i;
+
+ for (i = 0; i < TOTAL_COLORS(0); i++)
+ {
+ int r = 0x21 * BIT(*color_prom, 0) + 0x47 * BIT(*color_prom, 1) + 0x97 * BIT(*color_prom, 2);
+ int g = 0x21 * BIT(*color_prom, 3) + 0x47 * BIT(*color_prom, 4) + 0x97 * BIT(*color_prom, 5);
+ int b = 0x47 * BIT(*color_prom, 6) + 0x97 * BIT(*color_prom, 7);
+
+ palette_set_color(machine, i, MAKE_RGB(r, g, b));
+
+ color_prom++;
+ }
+
+ // blue background
+ palette_set_color(machine, TOTAL_COLORS(0), MAKE_RGB(0, 0, 0xff));
+
+ // set up background palette
+ COLOR(2,0) = 32;
+ COLOR(2,1) = 33;
+
+ COLOR(2,2) = 64;
+ COLOR(2,3) = 33;
+}
+
+WRITE8_HANDLER( mermaid_videoram2_w )
+{
+ mermaid_videoram2[offset] = data;
+ tilemap_mark_tile_dirty(bg_tilemap, offset);
+}
+
+WRITE8_HANDLER( mermaid_videoram_w )
+{
+ videoram[offset] = data;
+ tilemap_mark_tile_dirty(fg_tilemap, offset);
+}
+
+WRITE8_HANDLER( mermaid_colorram_w )
+{
+ colorram[offset] = data;
+ tilemap_mark_tile_dirty(fg_tilemap, offset);
+}
+
+WRITE8_HANDLER( mermaid_flip_screen_x_w )
+{
+ flip_screen_x_set(data & 0x01);
+}
+
+WRITE8_HANDLER( mermaid_flip_screen_y_w )
+{
+ flip_screen_y_set(data & 0x01);
+}
+
+WRITE8_HANDLER( mermaid_bg_scroll_w )
+{
+ mermaid_bg_scrollram[offset] = data;
+ tilemap_set_scrolly(bg_tilemap, offset, data);
+}
+
+WRITE8_HANDLER( mermaid_fg_scroll_w )
+{
+ mermaid_fg_scrollram[offset] = data;
+ tilemap_set_scrolly(fg_tilemap, offset, data);
+}
+
+WRITE8_HANDLER( rougien_gfxbankswitch1_w )
+{
+ rougien_gfxbank1 = data & 0x01;
+}
+
+WRITE8_HANDLER( rougien_gfxbankswitch2_w )
+{
+ rougien_gfxbank2 = data & 0x01;
+}
+
+READ8_HANDLER( mermaid_collision_r )
+{
+ /*
+ collision register active LO
+ Bit 0
+ Bit 1 - Sprite - Foreground
+ Bit 2 - Sprite - Stream
+ Bit 3
+ Bit 4
+ Bit 5
+ Bit 6
+ Bit 7
+ */
+
+ return 0; // not implemented
+}
+
+static TILE_GET_INFO( get_bg_tile_info )
+{
+ int code = mermaid_videoram2[tile_index];
+ int sx = tile_index % 32;
+ int color = (sx >= 26) ? 0 : 1;
+
+ SET_TILE_INFO(2, code, color, 0);
+}
+
+static TILE_GET_INFO( get_fg_tile_info )
+{
+ int attr = colorram[tile_index];
+ int code = videoram[tile_index] + ((attr & 0x30) << 4);
+ int color = attr & 0x0f;
+ int flags = TILE_FLIPYX((attr & 0xc0) >> 6);
+
+ code |= rougien_gfxbank1 * 0x2800;
+ code |= rougien_gfxbank2 * 0x2400;
+
+ SET_TILE_INFO(0, code, color, flags);
+}
+
+VIDEO_START( mermaid )
+{
+ bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 8, 8, 32, 32);
+
+ fg_tilemap = tilemap_create(get_fg_tile_info, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 8, 8, 32, 32);
+
+ tilemap_set_scroll_cols(bg_tilemap, 32);
+ tilemap_set_scroll_cols(fg_tilemap, 32);
+ tilemap_set_transparent_pen(fg_tilemap, 0);
+}
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ int offs;
+
+ for (offs = spriteram_size - 4; offs >= 0; offs -= 4)
+ {
+ int attr = spriteram[offs + 2];
+ int bank = (attr & 0x30) >> 4;
+ int code = (spriteram[offs] & 0x3f) | (bank << 6);
+ int color = attr & 0x0f;
+ int flipx = spriteram[offs] & 0x40;
+ int flipy = spriteram[offs] & 0x80;
+ int sx = spriteram[offs + 3] + 1;
+ int sy = 240 - spriteram[offs + 1];
+
+ code |= rougien_gfxbank1 * 0x2800;
+ code |= rougien_gfxbank2 * 0x2400;
+
+ if (flip_screen_x)
+ {
+ flipx = !flipx;
+ sx = 240 - sx;
+ }
+
+ if (flip_screen_y)
+ {
+ flipy = !flipy;
+ sy = 240 - sy;
+ }
+
+ drawgfx(bitmap, machine->gfx[1], code, color, flipx, flipy, sx, sy,
+ (flip_screen_x ? &flip_spritevisiblearea : &spritevisiblearea),
+ TRANSPARENCY_PEN, 0);
+ }
+}
+
+VIDEO_UPDATE( mermaid )
+{
+ tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
+ tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0);
+ draw_sprites(machine, bitmap, cliprect);
+ return 0;
+}