From d32c5f6d4713b445ee9f17df51abb25211ee52d6 Mon Sep 17 00:00:00 2001 From: James Date: Thu, 10 Oct 2013 11:39:07 +0100 Subject: fish --- hardware/software/pong3/pong3.c | 151 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 hardware/software/pong3/pong3.c (limited to 'hardware/software/pong3/pong3.c') diff --git a/hardware/software/pong3/pong3.c b/hardware/software/pong3/pong3.c new file mode 100644 index 0000000..63ae56c --- /dev/null +++ b/hardware/software/pong3/pong3.c @@ -0,0 +1,151 @@ +#include +#include +#include +#include +#include +#include "system.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 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 (y < 0) + y = 0; + if (y > 479) + y = 479; + if ((y == 479) || (y == 0)) + yd = -yd; + + if ((x == 639) || (x == 0)) + xd = -xd; + } + + return y; +} + +static int +dir (int a, int b) +{ + if (a > b) + return 1; + if (a < b) + return -1; + return 0; +} + +static void +move_bat (int *b, int db) +{ + + *b += dir (db, *b); + if (*b < 20) + *b = 20; + if (*b > 459) + *b = 459; + +} + +static void +load_sprite (void) +{ + // RRR GGG BBB + // set the sprite color 111 010 000 - orange + gpu_write (4, 0x01D0); + + // squirt the bromium logo into the sprite + gpu_write (0x10, 0x00C0); + gpu_write (0x11, 0x03E0); + gpu_write (0x12, 0x0FF8); + gpu_write (0x13, 0x1FFE); + gpu_write (0x14, 0x3FC7); + gpu_write (0x15, 0x3F83); + gpu_write (0x16, 0x3933); + gpu_write (0x17, 0x3987); + gpu_write (0x18, 0x3D37); + gpu_write (0x19, 0x3D37); + gpu_write (0x1a, 0x3D87); + gpu_write (0x1b, 0x3FFF); + gpu_write (0x1c, 0x1FFE); + gpu_write (0x1d, 0x07F8); + gpu_write (0x1e, 0x01E0); + gpu_write (0x1f, 0x00C0); +} + +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, 639); + + while (!missed) + { + x += xd; + y += yd; + if (y < 0) + y = 0; + if (y > 479) + y = 479; + if ((y == 479) || (y == 0)) + yd = -yd; + + if ((x == 639) || (x == 0)) + { + xd = -xd; + yd = rand () % 7; + yd -= 3; + dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0); + dbat1 = find_intersection (x + xd, y + yd, xd, yd, 639); + } + + move_bat (&bat0, dbat0); + move_bat (&bat1, dbat1); + + + gpu_write (0, x); + gpu_write (1, y); + + gpu_write (2, bat0); + gpu_write (3, bat1); + + msleep (2); + } + } +} + +//------------------------------------------------------------------------- -- cgit v1.2.3