diff options
Diffstat (limited to 'src/mame/video/tickee.c')
-rw-r--r-- | src/mame/video/tickee.c | 121 |
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; + } +} |