From 6a650e3e08da161fcebeb9181da60e110893fa8b Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sun, 18 Apr 2021 09:15:38 +0300 Subject: [PATCH] added input handling --- src/debug.h | 6 +++++- src/gamescr.c | 22 ++++++++++++++++++---- src/input.c | 39 +++++++++++++++++++++++++++++++++++++++ src/input.h | 24 ++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 src/input.c create mode 100644 src/input.h diff --git a/src/debug.h b/src/debug.h index 45cc067..921fd12 100644 --- a/src/debug.h +++ b/src/debug.h @@ -12,6 +12,7 @@ volatile int vblperf_count; void vblperf_setcolor(int palidx); +#ifdef VBLBAR #define vblperf_begin() \ do { \ *vblperf_palptr = 0; \ @@ -22,7 +23,10 @@ void vblperf_setcolor(int palidx); do { \ *vblperf_palptr = vblperf_color[vblperf_count]; \ } while(0) - +#else +#define vblperf_begin() +#define vblperf_end() +#endif void panic(void *pc, const char *fmt, ...) __attribute__((noreturn)); diff --git a/src/gamescr.c b/src/gamescr.c index 30ae380..f927cee 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -5,6 +5,7 @@ #include "data.h" #include "util.h" #include "intr.h" +#include "input.h" #include "debug.h" static void draw_tunnel(void); @@ -12,6 +13,7 @@ static void draw_tunnel(void); static int nframes, backbuf; static uint16_t *vram[] = { (uint16_t*)VRAM_LFB_FB0_ADDR, (uint16_t*)VRAM_LFB_FB1_ADDR }; static unsigned char *tex; +static uint16_t bnstate; void gamescr(void) { @@ -36,10 +38,14 @@ void gamescr(void) tex = iwram_sbrk(32 * 32); memcpy(tex, tuncross_pixels, 32 * 32); + select_input(BN_DPAD); + nframes = 0; for(;;) { backbuf = ++nframes & 1; + bnstate = get_input(); + draw_tunnel(); vblperf_end(); @@ -52,22 +58,30 @@ void gamescr(void) __attribute__((noinline, target("arm"), section(".iwram"))) static void draw_tunnel(void) { - int i, j, tx, ty, angle, depth, zoffs, uoffs; + static int uoffs; + int i, j, tx, ty, angle, depth, zoffs; uint16_t pptop, ppbot; uint16_t *top, *bot; uint32_t tun, *tunptr; zoffs = nframes; - uoffs = 0; + + if(bnstate & BN_LEFT) uoffs++; + if(bnstate & BN_RIGHT) uoffs--; top = vram[backbuf]; bot = vram[backbuf] + 159 * 240 / 2; tunptr = tunmap; for(i=0; i<80; i++) { +#ifdef VBLBAR top++; bot++; tunptr++; + for(j=1; j<240/2; j++) { +#else + for(j=0; j<240/2; j++) { +#endif tun = *tunptr++; angle = tun & 0xff; @@ -75,7 +89,7 @@ static void draw_tunnel(void) tx = ((angle >> 1) + uoffs) & 0x1f; ty = ((depth >> 1) + zoffs) & 0x1f; pptop = tex[(ty << 5) + tx]; - tx = ((angle >> 1) - uoffs) & 0x1f; + tx = ~((angle >> 1) - uoffs) & 0x1f; ppbot = tex[(ty << 5) + tx]; angle = (tun >> 16) & 0xff; @@ -83,7 +97,7 @@ static void draw_tunnel(void) tx = ((angle >> 1) + uoffs) & 0x1f; ty = ((depth >> 1) + zoffs) & 0x1f; pptop |= (uint16_t)tex[(ty << 5) + tx] << 8; - tx = ((angle >> 1) - uoffs) & 0x1f; + tx = ~((angle >> 1) - uoffs) & 0x1f; ppbot |= (uint16_t)tex[(ty << 5) + tx] << 8; *top++ = pptop; diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..6a66dd1 --- /dev/null +++ b/src/input.c @@ -0,0 +1,39 @@ +#include "input.h" +#include "gbaregs.h" +#include "intr.h" + +static void keyintr(void); + +static uint16_t bnstate; + +void select_input(uint16_t bmask) +{ + bnstate = 0; + + mask(INTR_KEY); + if(bmask) { + REG_KEYCNT = bmask | KEYCNT_IE; + interrupt(INTR_KEY, keyintr); + unmask(INTR_KEY); + } else { + REG_KEYCNT = 0; + interrupt(INTR_KEY, 0); + } +} + +uint16_t get_input(void) +{ + uint16_t s; + + mask(INTR_KEY); + s = bnstate; + bnstate = 0; + unmask(INTR_KEY); + + return s; +} + +static void keyintr(void) +{ + bnstate |= ~REG_KEYINPUT; +} diff --git a/src/input.h b/src/input.h new file mode 100644 index 0000000..3ed22a0 --- /dev/null +++ b/src/input.h @@ -0,0 +1,24 @@ +#ifndef INPUT_H_ +#define INPUT_H_ + +#include + +enum { + BN_A = 0x0001, + BN_B = 0x0002, + BN_SELECT = 0x0004, + BN_START = 0x0008, + BN_RIGHT = 0x0010, + BN_LEFT = 0x0020, + BN_UP = 0x0040, + BN_DOWN = 0x0080, + BN_RT = 0x0100, + BN_LT = 0x0200 +}; + +#define BN_DPAD (BN_RIGHT | BN_LEFT | BN_UP | BN_DOWN) + +void select_input(uint16_t bmask); +uint16_t get_input(void); + +#endif /* INPUT_H_ */ -- 1.7.10.4