summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/triplhnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/triplhnt.c')
-rw-r--r--src/mame/video/triplhnt.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/mame/video/triplhnt.c b/src/mame/video/triplhnt.c
new file mode 100644
index 00000000000..50df61f7d7b
--- /dev/null
+++ b/src/mame/video/triplhnt.c
@@ -0,0 +1,148 @@
+/***************************************************************************
+
+Atari Triple Hunt video emulation
+
+***************************************************************************/
+
+#include "driver.h"
+#include "triplhnt.h"
+
+
+UINT8* triplhnt_playfield_ram;
+UINT8* triplhnt_hpos_ram;
+UINT8* triplhnt_vpos_ram;
+UINT8* triplhnt_code_ram;
+UINT8* triplhnt_orga_ram;
+
+int triplhnt_sprite_zoom;
+int triplhnt_sprite_bank;
+
+static mame_bitmap* helper;
+static tilemap* bg_tilemap;
+
+
+static TILE_GET_INFO( get_tile_info )
+{
+ int code = triplhnt_playfield_ram[tile_index] & 0x3f;
+
+ SET_TILE_INFO(2, code, code == 0x3f ? 1 : 0, 0);
+}
+
+
+VIDEO_START( triplhnt )
+{
+ helper = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
+
+ bg_tilemap = tilemap_create(get_tile_info, tilemap_scan_rows, 0, 16, 16, 16, 16);
+}
+
+
+static TIMER_CALLBACK( triplhnt_hit_callback )
+{
+ triplhnt_set_collision(param);
+}
+
+
+static void draw_sprites(running_machine *machine, mame_bitmap* bitmap, const rectangle* cliprect)
+{
+ int i;
+
+ int hit_line = 999;
+ int hit_code = 999;
+
+ for (i = 0; i < 16; i++)
+ {
+ rectangle rect;
+
+ int j = (triplhnt_orga_ram[i] & 15) ^ 15;
+
+ /* software sorts sprites by x and stores order in orga RAM */
+
+ int hpos = triplhnt_hpos_ram[j] ^ 255;
+ int vpos = triplhnt_vpos_ram[j] ^ 255;
+ int code = triplhnt_code_ram[j] ^ 255;
+
+ if (hpos == 255)
+ {
+ continue;
+ }
+
+ /* sprite placement might be wrong */
+
+ if (triplhnt_sprite_zoom)
+ {
+ rect.min_x = hpos - 16;
+ rect.min_y = 196 - vpos;
+ rect.max_x = rect.min_x + 63;
+ rect.max_y = rect.min_y + 63;
+ }
+ else
+ {
+ rect.min_x = hpos - 16;
+ rect.min_y = 224 - vpos;
+ rect.max_x = rect.min_x + 31;
+ rect.max_y = rect.min_y + 31;
+ }
+
+ /* render sprite to auxiliary bitmap */
+
+ drawgfx(helper, machine->gfx[triplhnt_sprite_zoom],
+ 2 * code + triplhnt_sprite_bank, 0, code & 8, 0,
+ rect.min_x, rect.min_y, cliprect, TRANSPARENCY_NONE, 0);
+
+ if (rect.min_x < cliprect->min_x)
+ rect.min_x = cliprect->min_x;
+ if (rect.min_y < cliprect->min_y)
+ rect.min_y = cliprect->min_y;
+ if (rect.max_x > cliprect->max_x)
+ rect.max_x = cliprect->max_x;
+ if (rect.max_y > cliprect->max_y)
+ rect.max_y = cliprect->max_y;
+
+ /* check for collisions and copy sprite */
+
+ {
+ int x;
+ int y;
+
+ for (x = rect.min_x; x <= rect.max_x; x++)
+ {
+ for (y = rect.min_y; y <= rect.max_y; y++)
+ {
+ pen_t a = *BITMAP_ADDR16(helper, y, x);
+ pen_t b = *BITMAP_ADDR16(bitmap, y, x);
+
+ if (a == 2 && b == 7)
+ {
+ hit_code = j;
+ hit_line = y;
+ }
+
+ if (a != 1)
+ {
+ *BITMAP_ADDR16(bitmap, y, x) = a;
+ }
+ }
+ }
+ }
+ }
+
+ if (hit_line != 999 && hit_code != 999)
+ {
+ timer_set(video_screen_get_time_until_pos(0, hit_line, 0), hit_code, triplhnt_hit_callback);
+ }
+}
+
+
+VIDEO_UPDATE( triplhnt )
+{
+ tilemap_mark_all_tiles_dirty(bg_tilemap);
+
+ tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
+
+ draw_sprites(machine, bitmap, cliprect);
+
+ discrete_sound_w(TRIPLHNT_BEAR_ROAR_DATA, triplhnt_playfield_ram[0xfa] & 15);
+ discrete_sound_w(TRIPLHNT_SHOT_DATA, triplhnt_playfield_ram[0xfc] & 15);
+ return 0;
+}