From 8e7615994bd4f76038484b376fdc67e96a22a313 Mon Sep 17 00:00:00 2001 From: James Date: Sun, 13 Oct 2013 13:44:07 +0100 Subject: fish --- Makefile | 2 +- src/pong.c | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pong3.c | 280 ------------------------------------------------------------ tools/wrap | 8 +- 4 files changed, 287 insertions(+), 283 deletions(-) create mode 100644 src/pong.c delete mode 100644 src/pong3.c diff --git a/Makefile b/Makefile index 61d6b04..eb972b0 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ ans.stamp: source.stamp ${SOPC_FILE}:ans.stamp -source.stamp:${SRC} +source.stamp:${SRCS} touch source.stamp ${ELF}: src/Makefile diff --git a/src/pong.c b/src/pong.c new file mode 100644 index 0000000..aba6ae6 --- /dev/null +++ b/src/pong.c @@ -0,0 +1,280 @@ +#include +#include +#include +#include +#include +#include +#include "system.h" + +#include "GPU.h" + +#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) +{ + IOWR (GPU_0_BASE, reg << 2, data); +} + + +static void +update_gpu (int x, int y, int bat0, int bat1) +{ + // set locations + gpu_write (GPU_REG_SPRITE_X, x + GPU_OFFSET); + gpu_write (GPU_REG_SPRITE_Y, y + GPU_OFFSET); + gpu_write (GPU_REG_BAT0_Y, bat0 + GPU_OFFSET); + gpu_write (GPU_REG_BAT1_Y, bat1 + GPU_OFFSET); + + + // enable video + gpu_write (GPU_REG_BLANK, 0); +} + + +static void +show_score (int score) +{ + // int to seven segment lookup: MSB dp g f e d c b a LSB + const uint8_t lookup[10] = + { 0x3F, 0x6, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F }; + + uint8_t ss = 0; + + // show negative with DP + 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); + unsigned int i; + + gpu_write (GPU_REG_SPRITE_COLOUR, GPU_RGB(7,2,0)); + + // squirt the bromium logo into the sprite + for (i = 0; i < n; ++i) + gpu_write (GPU_REG_SPRITE_BASE + i, sprite[i]); +} + + +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); +} + +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; +} + +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 score = 0; + int serve = 0; + int i; + + printf ("Working...\n"); + + srand (12392184); + + bat0 = GPU_HEIGHT / 2; + bat1 = GPU_HEIGHT / 2; + + load_sprite (); + + for (;;) + { + xd = x_speed (); + yd = y_speed (); + + show_score (score); + + 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; + + + if (squish (&y, 0, GPU_HEIGHT)) + yd = -yd; + + if (squish (&x, 0, GPU_WIDTH)) + { + xd = x_speed (); + if (x) + xd = -xd; + 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); + + } + } + + move_bat (&bat0, dbat0); + move_bat (&bat1, dbat1); + + update_gpu (x, y, bat0, bat1); + + 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); + + update_gpu (x, y, bat0, bat1); + msleep (2); + + } + } +} diff --git a/src/pong3.c b/src/pong3.c deleted file mode 100644 index aba6ae6..0000000 --- a/src/pong3.c +++ /dev/null @@ -1,280 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "system.h" - -#include "GPU.h" - -#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) -{ - IOWR (GPU_0_BASE, reg << 2, data); -} - - -static void -update_gpu (int x, int y, int bat0, int bat1) -{ - // set locations - gpu_write (GPU_REG_SPRITE_X, x + GPU_OFFSET); - gpu_write (GPU_REG_SPRITE_Y, y + GPU_OFFSET); - gpu_write (GPU_REG_BAT0_Y, bat0 + GPU_OFFSET); - gpu_write (GPU_REG_BAT1_Y, bat1 + GPU_OFFSET); - - - // enable video - gpu_write (GPU_REG_BLANK, 0); -} - - -static void -show_score (int score) -{ - // int to seven segment lookup: MSB dp g f e d c b a LSB - const uint8_t lookup[10] = - { 0x3F, 0x6, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F }; - - uint8_t ss = 0; - - // show negative with DP - 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); - unsigned int i; - - gpu_write (GPU_REG_SPRITE_COLOUR, GPU_RGB(7,2,0)); - - // squirt the bromium logo into the sprite - for (i = 0; i < n; ++i) - gpu_write (GPU_REG_SPRITE_BASE + i, sprite[i]); -} - - -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); -} - -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; -} - -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 score = 0; - int serve = 0; - int i; - - printf ("Working...\n"); - - srand (12392184); - - bat0 = GPU_HEIGHT / 2; - bat1 = GPU_HEIGHT / 2; - - load_sprite (); - - for (;;) - { - xd = x_speed (); - yd = y_speed (); - - show_score (score); - - 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; - - - if (squish (&y, 0, GPU_HEIGHT)) - yd = -yd; - - if (squish (&x, 0, GPU_WIDTH)) - { - xd = x_speed (); - if (x) - xd = -xd; - 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); - - } - } - - move_bat (&bat0, dbat0); - move_bat (&bat1, dbat1); - - update_gpu (x, y, bat0, bat1); - - 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); - - update_gpu (x, y, bat0, bat1); - msleep (2); - - } - } -} diff --git a/tools/wrap b/tools/wrap index 5dca448..26a0640 100755 --- a/tools/wrap +++ b/tools/wrap @@ -1,7 +1,11 @@ -#!/bin/sh +#!/bin/bash AD=/software/apps/altera/quartus_ii_13.0sp1 -LL=linux +if [ $(uname -m ) == "x86_64" ]; then + LL=linux64 +else + LL=linux +fi QUARTUS_ROOTDIR="${AD}/quartus" PATH="${AD}/quartus/bin:${AD}/quartus/sopc_builder/bin:${AD}/nios2eds/sdk2/bin:${AD}/nios2eds/bin:${AD}/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin:${PATH}" LD_LIBRARY_PATH="${AD}/quartus/${LL}:${LD_LIBRARY_PATH}" -- cgit v1.2.3