borgware-2d/src/display_loop.c

389 lines
6.2 KiB
C
Raw Normal View History

2008-12-04 03:34:55 +00:00
#include <setjmp.h>
#include <stdbool.h>
#include <stdio.h>
2008-12-04 03:34:55 +00:00
#include "config.h"
#include "scrolltext/scrolltext.h"
#include "animations/snake.h"
2011-11-07 22:35:57 +00:00
#include "animations/program.h"
2008-12-04 03:34:55 +00:00
#include "animations/matrix.h"
2014-08-14 20:35:03 +00:00
#include "animations/dna.h"
2008-12-04 03:34:55 +00:00
#include "animations/gameoflife.h"
#include "animations/stonefly.h"
2009-12-27 00:51:07 +00:00
#include "animations/flyingdots.h"
2010-04-09 20:41:23 +00:00
#include "animations/breakout_demo.h"
#include "animations/ltn_ant.h"
#include "animations/bitmapscroller/laborlogo.h"
#include "animations/bitmapscroller/amphibian.h"
#include "animations/bitmapscroller/outofspec.h"
#include "animations/bitmapscroller/fairydust.h"
#include "animations/fpmath_patterns.h"
#include "animations/mherweg.h"
#include "animations/moire.h"
#include "animations/blackhole.h"
#include "animations/squares.h"
2011-10-28 20:20:55 +00:00
#ifdef ANIMATION_TIME
#include "animations/borg_time.h"
2011-10-28 20:20:55 +00:00
#endif
2008-12-04 03:34:55 +00:00
#include "borg_hw/borg_hw.h"
#include "can/borg_can.h"
#include "random/prng.h"
#include "random/persistentCounter.h"
#include "mcuf/mcuf.h"
#include "menu/menu.h"
#include "pixel.h"
2011-05-12 20:16:14 +00:00
#ifdef SMALLANIMATION_ROWWALK
# include "smallani/rowwalk.h"
2011-05-12 20:16:14 +00:00
#endif
#ifdef SMALLANIMATION_COLWALK
# include "smallani/colwalk.h"
#endif
2014-03-18 18:51:38 +00:00
#ifdef SMALLANIMATION_ROWBOUNCE
# include "smallani/rowbounce.h"
#endif
#ifdef SMALLANIMATION_COLBOUNCE
# include "smallani/colbounce.h"
2011-05-12 20:16:14 +00:00
#endif
2011-05-09 20:54:01 +00:00
#ifdef JOYSTICK_SUPPORT
# include "joystick/joystick.h"
#endif
2008-12-04 03:34:55 +00:00
volatile unsigned char oldMode, oldOldmode, reverseMode, mode;
2008-12-04 03:34:55 +00:00
jmp_buf newmode_jmpbuf;
#ifndef MENU_SUPPORT
void snake_game(void);
void tetris(void);
void tetris_bastet(void);
void tetris_fp(void);
void borg_invaders(void);
void borg_breakout(unsigned char demomode);
#endif
2008-12-04 03:34:55 +00:00
void display_loop(){
// mcuf_serial_mode();
2009-08-01 22:58:01 +00:00
mode = setjmp(newmode_jmpbuf);
#ifdef JOYSTICK_SUPPORT
// in case we get here via mode jump, we (re)enable joystick queries
waitForFire = 1;
#endif
2008-12-04 03:34:55 +00:00
oldOldmode = oldMode;
2009-02-19 00:54:57 +00:00
2009-08-01 22:58:01 +00:00
#ifdef JOYSTICK_SUPPORT
2008-12-04 03:34:55 +00:00
waitForFire = 1;
2009-01-01 17:06:38 +00:00
#endif
2008-12-04 03:34:55 +00:00
for(;;){
#ifndef MENU_SUPPORT
clear_screen(0);
#endif
2008-12-04 03:34:55 +00:00
oldMode = mode;
2008-12-04 03:34:55 +00:00
switch(mode++) {
#ifdef ANIMATION_SCROLLTEXT
case 1:
scrolltext(scrolltext_text);
2009-08-01 22:58:01 +00:00
#ifdef RANDOM_SUPPORT
{
char a[28];
sprintf(a,"</# counter == %lu ",
(unsigned long)percnt_get(&g_reset_counter, &g_reset_counter_idx));
scrolltext(a);
}
#endif
#endif
#ifdef ANIMATION_TIME
2011-10-28 21:52:17 +00:00
#ifndef ANIMATION_SCROLLTEXT
case 1:
#endif
2011-10-28 21:52:17 +00:00
time_anim();
2008-12-04 03:34:55 +00:00
break;
#else
2011-10-28 21:52:17 +00:00
#ifdef ANIMATION_SCROLLTEXT
break;
#endif
2008-12-04 03:34:55 +00:00
#endif
2011-11-07 22:35:57 +00:00
#ifdef ANIMATION_SPIRAL
# ifndef SPIRAL_DELAY
# define SPIRAL_DELAY 5
# endif
2008-12-04 03:34:55 +00:00
case 2:
spiral(SPIRAL_DELAY);
2008-12-04 03:34:55 +00:00
break;
#endif
#ifdef ANIMATION_JOERN1
case 3:
joern1();
break;
#endif
#ifdef ANIMATION_SNAKE
case 4:
snake_animation();
2008-12-04 03:34:55 +00:00
break;
#endif
#ifdef ANIMATION_CHECKERBOARD
2008-12-04 03:34:55 +00:00
case 5:
checkerboard(20);
2008-12-04 03:34:55 +00:00
break;
2009-08-01 22:58:01 +00:00
#endif
2008-12-04 03:34:55 +00:00
2011-11-07 22:35:57 +00:00
#ifdef ANIMATION_FIRE
2008-12-04 03:34:55 +00:00
case 6:
2011-11-07 22:35:57 +00:00
fire();
2008-12-04 03:34:55 +00:00
break;
#endif
#ifdef ANIMATION_TIME
2008-12-04 03:34:55 +00:00
case 7:
time_anim();
break;
#endif
#ifdef ANIMATION_MATRIX
case 8:
2008-12-04 03:34:55 +00:00
matrix();
break;
#endif
#ifdef ANIMATION_RANDOM_BRIGHT
case 9:
2009-02-25 23:49:59 +00:00
random_bright(30);
2008-12-04 03:34:55 +00:00
break;
#endif
#ifdef ANIMATION_STONEFLY
2009-12-27 00:51:07 +00:00
case 10:
stonefly();
break;
#endif
#ifdef ANIMATION_GAMEOFLIFE
case 11:
2008-12-04 03:34:55 +00:00
gameoflife();
break;
#endif
2009-12-27 00:51:07 +00:00
#ifdef ANIMATION_FLYINGDOTS
case 12:
2009-12-27 00:51:07 +00:00
flyingdots();
break;
#endif
2010-04-09 20:41:23 +00:00
#ifdef ANIMATION_BREAKOUT
case 13:
2010-04-09 20:41:23 +00:00
breakout_demo();
break;
#endif
#ifdef ANIMATION_MHERWEG
case 14:
mherweg();
2009-02-25 23:49:59 +00:00
break;
2009-06-19 21:09:08 +00:00
#endif
2008-12-04 03:34:55 +00:00
#ifdef ANIMATION_MOIRE
case 15:
moire();
break;
#endif
#ifdef ANIMATION_TIME
case 16:
time_anim();
break;
#endif
#ifdef ANIMATION_LTN_ANT
case 17:
ltn_ant();
break;
#endif
2010-04-15 21:49:43 +00:00
#ifdef ANIMATION_LABORLOGO
case 18:
laborlogo();
break;
#endif
#ifdef ANIMATION_AMPHIBIAN
case 19:
amphibian();
2010-04-15 21:49:43 +00:00
break;
#endif
#ifdef ANIMATION_LOGO_OOS
case 20:
logo_OutOfSpec();
break;
#endif
2011-12-19 22:47:24 +00:00
#ifdef ANIMATION_FAIRYDUST
case 21:
2011-12-19 22:47:24 +00:00
fairydust();
2011-11-30 23:45:00 +00:00
break;
#endif
2012-08-11 12:10:28 +00:00
#ifdef ANIMATION_PLASMA
case 22:
2011-03-14 10:34:16 +00:00
plasma();
break;
#endif
#ifdef ANIMATION_PSYCHEDELIC
case 23:
psychedelic();
break;
#endif
#ifdef ANIMATION_BLACKHOLE
case 24:
blackhole();
break;
#endif
2011-03-14 10:34:16 +00:00
#ifdef ANIMATION_SQUARES
case 25:
squares();
break;
#endif
2014-08-14 20:45:34 +00:00
#ifdef ANIMATION_DNA
case 26:
dna();
break;
#endif
2008-12-04 03:34:55 +00:00
#ifdef ANIMATION_TESTS
case 31:
test_level(1, false);
2008-12-04 03:34:55 +00:00
break;
2009-08-01 22:58:01 +00:00
2011-02-25 22:57:49 +00:00
case 32:
test_level(2, false);
2008-12-04 03:34:55 +00:00
break;
2009-02-18 22:26:46 +00:00
2011-02-25 22:57:49 +00:00
case 33:
test_level(3, false);
2008-12-04 03:34:55 +00:00
break;
2011-02-25 22:57:49 +00:00
2008-12-04 03:34:55 +00:00
case 35:
test_palette(false);
test_palette2(false);
2008-12-04 03:34:55 +00:00
break;
#endif
2011-02-25 22:57:49 +00:00
2011-05-12 20:16:14 +00:00
#ifdef SMALLANIMATION_ROWWALK
case 36:
rowwalk(SMALLANIMATION_ROWWALK_COUNT,SMALLANIMATION_ROWWALK_SPEED);
2011-05-12 20:16:14 +00:00
break;
#endif
#ifdef SMALLANIMATION_COLWALK
case 37:
colwalk(SMALLANIMATION_COLWALK_COUNT,SMALLANIMATION_COLWALK_SPEED);
2011-05-12 20:16:14 +00:00
break;
#endif
#ifdef SMALLANIMATION_COLBOUNCE
case 38:
2011-06-11 16:27:44 +00:00
colbounce(SMALLANIMATION_COLBOUNCE_COUNT,SMALLANIMATION_COLBOUNCE_SPEED);
break;
#endif
#ifdef SMALLANIMATION_ROWBOUNCE
case 39:
2011-06-11 16:27:44 +00:00
rowbounce(SMALLANIMATION_ROWBOUNCE_COUNT,SMALLANIMATION_ROWBOUNCE_SPEED);
break;
#endif
2011-05-12 20:16:14 +00:00
#ifdef MENU_SUPPORT
case 0xFDu:
mode = 1;
break;
2008-12-04 03:34:55 +00:00
case 0xFEu:
2008-12-04 03:34:55 +00:00
menu();
mode = oldOldmode;
break;
#else
2011-05-09 20:54:01 +00:00
case 0xFDu:
#ifdef JOYSTICK_SUPPORT
if (JOYISFIRE)
mode = 0xFEu;
else
#endif
mode = 1;
break;
case 0xFEu:
#ifdef JOYSTICK_SUPPORT
waitForFire = 0; // avoid circular jumps
while (JOYISFIRE); // wait until user released the fire button
#endif
wait(25); // wait for button to settle
2011-05-09 20:54:01 +00:00
# ifdef GAME_TETRIS
tetris();
2011-05-09 20:54:01 +00:00
# endif
2011-05-09 20:54:01 +00:00
# ifdef GAME_BASTET
tetris_bastet();
2011-05-09 20:54:01 +00:00
# endif
2011-05-09 20:54:01 +00:00
# ifdef GAME_TETRIS_FP
tetris_fp();
2011-05-09 20:54:01 +00:00
# endif
2011-05-09 20:54:01 +00:00
# ifdef GAME_SPACE_INVADERS
borg_invaders();
2011-05-09 20:54:01 +00:00
# endif
2011-05-09 20:54:01 +00:00
# ifdef GAME_SNAKE
snake_game();
2011-05-09 20:54:01 +00:00
# endif
2011-05-09 20:54:01 +00:00
# ifdef GAME_BREAKOUT
borg_breakout(0);
2011-05-09 20:54:01 +00:00
# endif
#ifdef JOYSTICK_SUPPORT
while (JOYISFIRE); // avoid an unwanted restart of the game loop
#endif
wait(25); // wait for button to settle
mode = oldOldmode; // restore old animation mode
#ifdef JOYSTICK_SUPPORT
waitForFire = 1; // reenable joystick query of the wait() function
#endif
break;
2008-12-04 03:34:55 +00:00
#endif
2009-12-26 23:26:06 +00:00
#ifdef ANIMATION_OFF
case 0xFFu:
2009-12-26 23:26:06 +00:00
off();
break;
#endif
default:
if (reverseMode) {
if (reverseMode-- == (mode - 1)) {
mode -= 2;
} else {
reverseMode = 0;
}
}
break;
2008-12-04 03:34:55 +00:00
}
}
}