summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/fgoal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/fgoal.c')
-rw-r--r--src/mame/video/fgoal.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/mame/video/fgoal.c b/src/mame/video/fgoal.c
new file mode 100644
index 00000000000..f5839bc811e
--- /dev/null
+++ b/src/mame/video/fgoal.c
@@ -0,0 +1,131 @@
+/***************************************************************************
+
+ Taito Field Goal video emulation
+
+***************************************************************************/
+
+#include "driver.h"
+#include "includes/fgoal.h"
+
+static mame_bitmap *fgbitmap;
+static mame_bitmap *bgbitmap;
+
+static UINT8 xpos;
+static UINT8 ypos;
+
+static int current_color;
+
+
+WRITE8_HANDLER( fgoal_color_w )
+{
+ current_color = data & 3;
+}
+
+
+WRITE8_HANDLER( fgoal_ypos_w )
+{
+ ypos = data;
+}
+
+
+WRITE8_HANDLER( fgoal_xpos_w )
+{
+ xpos = data;
+}
+
+
+VIDEO_START( fgoal )
+{
+ fgbitmap = auto_bitmap_alloc(256, 256, machine->screen[0].format);
+ bgbitmap = auto_bitmap_alloc(256, 256, machine->screen[0].format);
+}
+
+
+VIDEO_UPDATE( fgoal )
+{
+ const UINT8* VRAM = fgoal_video_ram;
+
+ int x;
+ int y;
+ int n;
+
+ /* draw color overlay foreground and background */
+
+ if (fgoal_player == 1 && (readinputport(1) & 0x40))
+ {
+ drawgfxzoom(fgbitmap, machine->gfx[0],
+ 0, (fgoal_player << 2) | current_color,
+ 1, 1,
+ 0, 16,
+ cliprect, TRANSPARENCY_NONE, 0,
+ 0x40000,
+ 0x40000);
+
+ drawgfxzoom(bgbitmap, machine->gfx[1],
+ 0, 0,
+ 1, 1,
+ 0, 16,
+ cliprect, TRANSPARENCY_NONE, 0,
+ 0x40000,
+ 0x40000);
+ }
+ else
+ {
+ drawgfxzoom(fgbitmap, machine->gfx[0],
+ 0, (fgoal_player << 2) | current_color,
+ 0, 0,
+ 0, 0,
+ cliprect, TRANSPARENCY_NONE, 0,
+ 0x40000,
+ 0x40000);
+
+ drawgfxzoom(bgbitmap, machine->gfx[1],
+ 0, 0,
+ 0, 0,
+ 0, 0,
+ cliprect, TRANSPARENCY_NONE, 0,
+ 0x40000,
+ 0x40000);
+ }
+
+ /* the ball has a fixed color */
+
+ for (y = ypos; y < ypos + 8; y++)
+ {
+ for (x = xpos; x < xpos + 8; x++)
+ {
+ if (y < 256 && x < 256)
+ {
+ *BITMAP_ADDR16(fgbitmap, y, x) = 0x38;
+ }
+ }
+ }
+
+ /* draw bitmap layer */
+
+ for (y = 0; y < 256; y++)
+ {
+ UINT16* p = BITMAP_ADDR16(bitmap, y, 0);
+
+ const UINT16* FG = BITMAP_ADDR16(fgbitmap, y, 0);
+ const UINT16* BG = BITMAP_ADDR16(bgbitmap, y, 0);
+
+ for (x = 0; x < 256; x += 8)
+ {
+ UINT8 v = *VRAM++;
+
+ for (n = 0; n < 8; n++)
+ {
+ if (v & (1 << n))
+ {
+ p[x + n] = FG[x + n];
+ }
+ else
+ {
+ p[x + n] = BG[x + n];
+ }
+ }
+ }
+ }
+ return 0;
+}