summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/moo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/moo.c')
-rw-r--r--src/mame/video/moo.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/mame/video/moo.c b/src/mame/video/moo.c
new file mode 100644
index 00000000000..87acfab2d1b
--- /dev/null
+++ b/src/mame/video/moo.c
@@ -0,0 +1,169 @@
+/***************************************************************************
+
+ Wild West C.O.W.boys of Moo Mesa
+ Bucky O'Hare
+ (c) 1992 Konami
+
+ Video hardware emulation.
+
+***************************************************************************/
+
+#include "driver.h"
+#include "video/konamiic.h"
+
+static int sprite_colorbase;
+static int layer_colorbase[4], layerpri[3];
+static int alpha_enabled;
+
+#ifdef UNUSED_FUNCTION
+void moo_set_alpha(int on)
+{
+ alpha_enabled = on;
+}
+#endif
+
+static void moo_sprite_callback(int *code, int *color, int *priority_mask)
+{
+ int pri = (*color & 0x03e0) >> 4;
+
+ if (pri <= layerpri[2]) *priority_mask = 0;
+ else if (pri <= layerpri[1]) *priority_mask = 0xf0;
+ else if (pri <= layerpri[0]) *priority_mask = 0xf0|0xcc;
+ else *priority_mask = 0xf0|0xcc|0xaa;
+
+ *color = sprite_colorbase | (*color & 0x001f);
+}
+
+static void moo_tile_callback(int layer, int *code, int *color, int *flags)
+{
+ *color = layer_colorbase[layer] | (*color>>2 & 0x0f);
+}
+
+VIDEO_START(moo)
+{
+ int offsx, offsy;
+
+ assert(machine->screen[0].format == BITMAP_FORMAT_RGB32);
+
+ alpha_enabled = 0;
+
+ K053251_vh_start();
+ K054338_vh_start();
+
+ K056832_vh_start(machine, REGION_GFX1, K056832_BPP_4, 1, NULL, moo_tile_callback, 0);
+
+ if (!strcmp(machine->gamedrv->name, "bucky") || !strcmp(machine->gamedrv->name, "buckyua"))
+ {
+ // Bucky doesn't chain tilemaps
+ K056832_set_LayerAssociation(0);
+
+ K056832_set_LayerOffset(0, -2, 0);
+ K056832_set_LayerOffset(1, 2, 0);
+ K056832_set_LayerOffset(2, 4, 0);
+ K056832_set_LayerOffset(3, 6, 0);
+
+ offsx = -48;
+ offsy = 23;
+ }
+ else
+ {
+ // other than the intro showing one blank line alignment is good through the game
+ K056832_set_LayerOffset(0, -2+1, 0);
+ K056832_set_LayerOffset(1, 2+1, 0);
+ K056832_set_LayerOffset(2, 4+1, 0);
+ K056832_set_LayerOffset(3, 6+1, 0);
+
+ offsx = -48+1;
+ offsy = 23;
+ }
+
+ K053247_vh_start(machine, REGION_GFX2, offsx, offsy, NORMAL_PLANE_ORDER, moo_sprite_callback);
+
+ K054338_invert_alpha(0);
+}
+
+/* useful function to sort the three tile layers by priority order */
+static void sortlayers(int *layer,int *pri)
+{
+#define SWAP(a,b) \
+ if (pri[a] < pri[b]) \
+ { \
+ int t; \
+ t = pri[a]; pri[a] = pri[b]; pri[b] = t; \
+ t = layer[a]; layer[a] = layer[b]; layer[b] = t; \
+ }
+
+ SWAP(0,1)
+ SWAP(0,2)
+ SWAP(1,2)
+}
+
+VIDEO_UPDATE(moo)
+{
+ static const int K053251_CI[4] = { K053251_CI1, K053251_CI2, K053251_CI3, K053251_CI4 };
+ int layers[3];
+ int bg_colorbase, new_colorbase, plane, dirty, alpha;
+
+ bg_colorbase = K053251_get_palette_index(K053251_CI1);
+ sprite_colorbase = K053251_get_palette_index(K053251_CI0);
+ layer_colorbase[0] = 0x70;
+
+ if (K056832_get_LayerAssociation())
+ {
+ for (plane=1; plane<4; plane++)
+ {
+ new_colorbase = K053251_get_palette_index(K053251_CI[plane]);
+ if (layer_colorbase[plane] != new_colorbase)
+ {
+ layer_colorbase[plane] = new_colorbase;
+ K056832_mark_plane_dirty(plane);
+ }
+ }
+ }
+ else
+ {
+ for (dirty=0, plane=1; plane<4; plane++)
+ {
+ new_colorbase = K053251_get_palette_index(K053251_CI[plane]);
+ if (layer_colorbase[plane] != new_colorbase)
+ {
+ layer_colorbase[plane] = new_colorbase;
+ dirty = 1;
+ }
+ }
+ if (dirty) K056832_MarkAllTilemapsDirty();
+ }
+
+ layers[0] = 1;
+ layerpri[0] = K053251_get_priority(K053251_CI2);
+ layers[1] = 2;
+ layerpri[1] = K053251_get_priority(K053251_CI3);
+ layers[2] = 3;
+ layerpri[2] = K053251_get_priority(K053251_CI4);
+
+ sortlayers(layers, layerpri);
+
+ K054338_update_all_shadows(machine);
+ K054338_fill_backcolor(machine, bitmap, 0);
+
+ fillbitmap(priority_bitmap,0,cliprect);
+
+ if (layerpri[0] < K053251_get_priority(K053251_CI1)) /* bucky hides back layer behind background */
+ K056832_tilemap_draw(machine, bitmap, cliprect, layers[0], 0, 1);
+
+ K056832_tilemap_draw(machine, bitmap, cliprect, layers[1], 0, 2);
+
+ // Enabling alpha improves fog and fading in Moo but causes other things to disappear.
+ // There is probably a control bit somewhere to turn off alpha blending.
+ alpha_enabled = K054338_read_register(K338_REG_CONTROL) & K338_CTL_MIXPRI; // DUMMY
+
+ alpha = (alpha_enabled) ? K054338_set_alpha_level(1) : 255;
+
+ if (alpha > 0)
+ K056832_tilemap_draw(machine, bitmap, cliprect, layers[2], (alpha >= 255) ? 0 : TILEMAP_DRAW_ALPHA, 4);
+
+ K053247_sprites_draw(machine, bitmap,cliprect);
+
+ K056832_tilemap_draw(machine, bitmap, cliprect, 0, 0, 0);
+ return 0;
+}