summaryrefslogtreecommitdiffstats
path: root/software/pong3/pong3.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/pong3/pong3.c')
-rw-r--r--software/pong3/pong3.c167
1 files changed, 146 insertions, 21 deletions
diff --git a/software/pong3/pong3.c b/software/pong3/pong3.c
index 39ee99c..09240ff 100644
--- a/software/pong3/pong3.c
+++ b/software/pong3/pong3.c
@@ -10,7 +10,14 @@
#define msleep(msec) usleep(1000*msec);
-
+
+static void
+pio_write (unsigned int data)
+{
+ IOWR (PIO_0_BASE, 0, data);
+}
+
+
static void
gpu_write (unsigned int reg, unsigned int data)
{
@@ -18,10 +25,32 @@ gpu_write (unsigned int reg, unsigned int data)
}
static void
+show_score (int score)
+{
+ const uint8_t lookup[10] =
+ { 0x3F, 0x6, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F };
+ uint8_t ss = 0;
+
+ if (score < 0)
+ {
+ ss |= 0x80;
+ score = -score;
+ }
+ if (score > 9)
+ score = 9;
+ ss |= lookup[score];
+
+ pio_write (ss);
+}
+
+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);
+ 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
@@ -29,8 +58,8 @@ load_sprite (void)
gpu_write (GPU_REG_SPRITE_COLOUR, 0x01D0);
// squirt the bromium logo into the sprite
- for (i=0;i<n;++i)
- gpu_write (GPU_REG_SPRITE_BASE+i,sprite[i]);
+ for (i = 0; i < n; ++i)
+ gpu_write (GPU_REG_SPRITE_BASE + i, sprite[i]);
}
@@ -87,34 +116,87 @@ find_intersection (int x, int y, int xd, int yd, int t)
return y;
}
+static int
+has_missed (int y1, int y2)
+{
+ y1 = y1 - y2;
+ if (y1 < 0)
+ y1 = -y1;
+ if (y1 > 20)
+ return 1;
+ return 0;
+}
+
+static int
+x_speed (void)
+{
+ return (rand () % 10) + 1;
+}
+
+static int
+y_speed (void)
+{
+ return (rand () % 9) - 4;
+}
+
+
int
main (void)
{
int x, y, xd, yd;
int bat0, dbat0;
int bat1, dbat1;
- int missed = 0;
+ int score = 0;
+ int serve = 0;
+ int i;
printf ("Working...\n");
msleep (500);
+
+#if 0
+ while (1)
+ {
+ for (i = -10; i < 10; ++i)
+ {
+ show_score (i);
+ msleep (500);
+ }
+
+ }
+#endif
+
srand (12392184);
- bat0 = 100;
- bat1 = 200;
+ bat0 = GPU_HEIGHT / 2;
+ bat1 = GPU_HEIGHT / 2;
load_sprite ();
- while (1)
+ for (;;)
{
- x = 1;
- y = 1;
- xd = 1;
- yd = 1;
+ xd = x_speed ();
+ yd = y_speed ();
- dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0);
- dbat1 = find_intersection (x + xd, y + yd, xd, yd, GPU_WIDTH-1);
+ show_score (score);
- while (!missed)
+ if (!serve)
+ {
+ x = 1;
+ y = bat0;
+ dbat0 = GPU_HEIGHT / 2;
+ dbat1 = find_intersection (x + xd, y + yd, xd, yd, GPU_WIDTH - 1);
+ }
+ else
+ {
+ x = GPU_WIDTH - 2;
+ y = bat1;
+ yd = -yd;
+ dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0);
+ dbat1 = GPU_HEIGHT / 2;
+ }
+ serve = !serve;
+
+ for (;;)
{
x += xd;
y += yd;
@@ -125,22 +207,35 @@ main (void)
if (squish (&x, 0, GPU_WIDTH))
{
- xd = (rand () % 3) + 1;
+ xd = x_speed ();
if (x)
xd = -xd;
- yd = rand () % 7;
- yd -= 3;
+ yd = y_speed ();
if (x)
{
+
+ if (has_missed (y, bat1))
+ {
+ score++;
+ break;
+ }
dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0);
dbat1 = GPU_HEIGHT / 2;
+
}
else
{
+
+ if (has_missed (y, bat0))
+ {
+ score--;
+ break;
+ }
dbat0 = GPU_HEIGHT / 2;
+ dbat1 =
+ find_intersection (x + xd, y + yd, xd, yd, GPU_WIDTH - 1);
- dbat1 = find_intersection (x + xd, y + yd, xd, yd, GPU_WIDTH-1);
}
}
@@ -157,6 +252,36 @@ main (void)
msleep (2);
}
+
+ if (!serve)
+ {
+ dbat1 = GPU_HEIGHT / 2;
+ dbat0 = bat0;
+ }
+ else
+ {
+ dbat0 = GPU_HEIGHT / 2;
+ dbat1 = bat1;
+ }
+
+ for (i = 0; i < 200; ++i)
+ {
+ if (i == 100)
+ show_score (score);
+
+ 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);
+
+ }
}
}
-