summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2021-01-16 22:16:19 +0100
committerReiner Herrmann <reiner@reiner-h.de>2021-01-16 22:16:19 +0100
commit070e393b7535937a32c6eb1aec674c0187eab761 (patch)
treeb3b91e45d40fcaaaf2cb580c99eb5119dda45af9
parent8bbbbacb0f2863f8b73a7d8af48559488308ead5 (diff)
Add initial gameHEADtrunk
-rw-r--r--src/main.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..30cd2be
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,147 @@
+#include <conio.h>
+#include <stdio.h>
+#include <c64.h>
+#include <joystick.h>
+#include <stdint.h>
+
+struct screen {
+ unsigned char grid[25][40];
+};
+
+enum direction {
+ UP,
+ DOWN,
+ LEFT,
+ RIGHT,
+};
+
+struct player {
+ char x;
+ char y;
+ enum direction dir;
+ unsigned char joy;
+ unsigned char prev_joy;
+ unsigned char next_char;
+};
+
+#define SCREEN (*(struct screen*) 0x0400)
+#define SCREEN_AT(x, y) (SCREEN.grid[y][x])
+
+#define MAX_PLAYERS 2
+
+#define EMPTY '\x20'
+#define PLAYER '\x71'
+
+#define CHR_V '\x42'+128
+#define CHR_H '\x43'+128
+
+#define CHR_DR '\xed'+128
+#define CHR_RD '\xee'+128
+#define CHR_UR '\xf0'+128
+#define CHR_RU '\xfd'+128
+
+static void update_player(struct player *p) {
+ /* has direction been changed? */
+ if (p->joy == p->prev_joy) {
+ if (p->dir == DOWN || p->dir == UP) {
+ p->next_char = CHR_V;
+ } else if (p->dir == LEFT || p->dir == RIGHT) {
+ p->next_char = CHR_H;
+ }
+ return;
+ }
+
+ if (JOY_UP(p->joy) && p->dir != DOWN) {
+ switch (p->dir) {
+ case RIGHT: p->next_char = CHR_RU; break;
+ case LEFT: p->next_char = CHR_DR; break;
+ }
+ p->dir = UP;
+ } else if (JOY_DOWN(p->joy) && p->dir != UP) {
+ switch (p->dir) {
+ case RIGHT: p->next_char = CHR_RD; break;
+ case LEFT: p->next_char = CHR_UR; break;
+ }
+ p->dir = DOWN;
+ } else if (JOY_LEFT(p->joy) && p->dir != RIGHT) {
+ switch (p->dir) {
+ case UP: p->next_char = CHR_RD; break;
+ case DOWN: p->next_char = CHR_RU; break;
+ }
+ p->dir = LEFT;
+ } else if (JOY_RIGHT(p->joy) && p->dir != LEFT) {
+ switch (p->dir) {
+ case UP: p->next_char = CHR_UR; break;
+ case DOWN: p->next_char = CHR_DR; break;
+ }
+ p->dir = RIGHT;
+ }
+ p->prev_joy = p->joy;
+}
+
+static char move_player(struct player *p) {
+ int res = 1;
+ SCREEN_AT(p->x, p->y) = p->next_char;
+
+ switch (p->dir) {
+ case UP: p->y--; break;
+ case DOWN: p->y++; break;
+ case LEFT: p->x--; break;
+ case RIGHT: p->x++; break;
+ }
+
+ if (SCREEN_AT(p->x, p->y) != EMPTY || p->x < 0 || p->x >= 40 || p->y < 0 || p->y >= 25) {
+ res = 0;
+ }
+ SCREEN_AT(p->x, p->y) = PLAYER;
+
+ return res;
+}
+
+static void play_game(char n_players) {
+ uint16_t busy_wait = 300;
+
+ struct player players[MAX_PLAYERS] = {
+ { 5, 12, RIGHT, 0, 0, CHR_H },
+ { 35, 12, LEFT, 0, 0, CHR_H },
+ };
+
+ clrscr();
+
+ while(1) {
+ char i;
+ uint16_t n;
+
+ for (i=0; i<n_players; i++) {
+ if (!move_player(&players[i])) {
+ return;
+ }
+ }
+
+ /* "sleep" for a bit, but keep reading joystick changes */
+ for (n=0; n<busy_wait; n++) {
+ for (i=0; i<n_players; i++) {
+ char tmp = joy_read(i);
+ if (tmp) {
+ players[i].joy = tmp;
+ }
+ }
+ }
+
+ for (i=0; i<n_players; i++) {
+ update_player(&players[i]);
+ }
+ }
+}
+
+int main() {
+ joy_install(joy_static_stddrv);
+
+ /* use uppercase character set */
+ *((unsigned char*)0xD018) = 0x14;
+
+ while(1) {
+ play_game(2);
+ printf("game over!");
+ }
+}