#include #include #include #include #include #include #include "system.h" #include "GPU.h" #define msleep(msec) usleep(1000*msec); static void gpu_write (unsigned int reg, unsigned int data) { IOWR (GPU_0_BASE, reg << 2, data); } static void load_sprite (void) { const uint16_t sprite[16]={ 0x00C0, 0x03E0, 0x0FF8, 0x1FFE, 0x3FC7, 0x3F83, 0x3933, 0x3987, 0x3D37, 0x3D37, 0x3D87, 0x3FFF, 0x1FFE, 0x07F8, 0x01E0, 0x00C0 }; const unsigned int n=sizeof(sprite)/sizeof(uint16_t); unsigned int i; // RRR GGG BBB // set the sprite color 111 010 000 - orange gpu_write (GPU_REG_SPRITE_COLOUR, 0x01D0); // squirt the bromium logo into the sprite for (i=0;i b) return 1; if (a < b) return -1; return 0; } static void move_bat (int *b, int db) { *b += dir (db, *b); } static int squish (int *v, int min, int max) { if (*v < min) { *v = min; return 1; } if (*v >= max) { *v = max - 1; return 1; } return 0; } static int find_intersection (int x, int y, int xd, int yd, int t) { // super lazy - we should use the power of MATHS while (x != t) { x += xd; y += yd; if (squish (&y, 0, GPU_HEIGHT)) yd = -yd; if (squish (&x, 0, GPU_WIDTH)) xd = -xd; } return y; } int main (void) { int x, y, xd, yd; int bat0, dbat0; int bat1, dbat1; int missed = 0; printf ("Working...\n"); msleep (500); srand (12392184); bat0 = 100; bat1 = 200; load_sprite (); while (1) { x = 1; y = 1; xd = 1; yd = 1; dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0); dbat1 = find_intersection (x + xd, y + yd, xd, yd, GPU_WIDTH-1); while (!missed) { x += xd; y += yd; if (squish (&y, 0, GPU_HEIGHT)) yd = -yd; if (squish (&x, 0, GPU_WIDTH)) { xd = (rand () % 3) + 1; if (x) xd = -xd; yd = rand () % 7; yd -= 3; if (x) { dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0); dbat1 = GPU_HEIGHT / 2; } else { dbat0 = GPU_HEIGHT / 2; dbat1 = find_intersection (x + xd, y + yd, xd, yd, GPU_WIDTH-1); } } move_bat (&bat0, dbat0); move_bat (&bat1, dbat1); gpu_write (1, x + GPU_OFFSET); gpu_write (2, y + GPU_OFFSET); gpu_write (3, bat0 + GPU_OFFSET); gpu_write (4, bat1 + GPU_OFFSET); gpu_write (0, 0); msleep (2); } } }