summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/tickee.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/tickee.c')
-rw-r--r--src/mame/video/tickee.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/mame/video/tickee.c b/src/mame/video/tickee.c
new file mode 100644
index 00000000000..f1a043db29c
--- /dev/null
+++ b/src/mame/video/tickee.c
@@ -0,0 +1,121 @@
+/***************************************************************************
+
+ Raster Elite Tickee Tickats hardware
+
+***************************************************************************/
+
+#include "driver.h"
+#include "cpu/tms34010/tms34010.h"
+#include "tickee.h"
+
+
+UINT16 *tickee_vram;
+
+
+/* local variables */
+static emu_timer *setup_gun_timer;
+
+
+
+/*************************************
+ *
+ * Compute X/Y coordinates
+ *
+ *************************************/
+
+INLINE void get_crosshair_xy(int player, int *x, int *y)
+{
+ *x = (((readinputport(4 + player * 2) & 0xff) * (Machine->screen[0].visarea.max_x - Machine->screen[0].visarea.min_x)) >> 8) + Machine->screen[0].visarea.min_x;
+ *y = (((readinputport(5 + player * 2) & 0xff) * (Machine->screen[0].visarea.max_y - Machine->screen[0].visarea.min_y)) >> 8) + Machine->screen[0].visarea.min_y;
+}
+
+
+
+/*************************************
+ *
+ * Light gun interrupts
+ *
+ *************************************/
+
+static TIMER_CALLBACK( trigger_gun_interrupt )
+{
+ /* fire the IRQ at the correct moment */
+ cpunum_set_input_line(0, param, ASSERT_LINE);
+}
+
+
+static TIMER_CALLBACK( clear_gun_interrupt )
+{
+ /* clear the IRQ on the next scanline? */
+ cpunum_set_input_line(0, param, CLEAR_LINE);
+}
+
+
+static TIMER_CALLBACK( setup_gun_interrupts )
+{
+ int beamx, beamy;
+
+ /* set a timer to do this again next frame */
+ timer_adjust(setup_gun_timer, video_screen_get_time_until_pos(0, 0, 0), 0, attotime_zero);
+
+ /* only do work if the palette is flashed */
+ if (!tickee_control[2])
+ return;
+
+ /* generate interrupts for player 1's gun */
+ get_crosshair_xy(0, &beamx, &beamy);
+ timer_set(video_screen_get_time_until_pos(0, beamy, beamx + 50), 0, trigger_gun_interrupt);
+ timer_set(video_screen_get_time_until_pos(0, beamy + 1, beamx + 50), 0, clear_gun_interrupt);
+
+ /* generate interrupts for player 2's gun */
+ get_crosshair_xy(1, &beamx, &beamy);
+ timer_set(video_screen_get_time_until_pos(0, beamy, beamx + 50), 1, trigger_gun_interrupt);
+ timer_set(video_screen_get_time_until_pos(0, beamy + 1, beamx + 50), 1, clear_gun_interrupt);
+}
+
+
+
+/*************************************
+ *
+ * Video startup
+ *
+ *************************************/
+
+VIDEO_START( tickee )
+{
+ /* start a timer going on the first scanline of every frame */
+ setup_gun_timer = timer_alloc(setup_gun_interrupts);
+ timer_adjust(setup_gun_timer, video_screen_get_time_until_pos(0, 0, 0), 0, attotime_zero);
+}
+
+
+
+/*************************************
+ *
+ * Video update
+ *
+ *************************************/
+
+void tickee_scanline_update(running_machine *machine, int screen, mame_bitmap *bitmap, int scanline, const tms34010_display_params *params)
+{
+ UINT16 *src = &tickee_vram[(params->rowaddr << 8) & 0x3ff00];
+ UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0);
+ int coladdr = params->coladdr << 1;
+ int x;
+
+ /* blank palette: fill with pen 255 */
+ if (tickee_control[2])
+ {
+ for (x = params->heblnk; x < params->hsblnk; x++)
+ dest[x] = 0xff;
+ return;
+ }
+
+ /* copy the non-blanked portions of this scanline */
+ for (x = params->heblnk; x < params->hsblnk; x += 2)
+ {
+ UINT16 pixels = src[coladdr++ & 0xff];
+ dest[x + 0] = pixels & 0xff;
+ dest[x + 1] = pixels >> 8;
+ }
+}