#include "data.h"
#include "util.h"
#include "intr.h"
+#include "input.h"
#include "debug.h"
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)
{
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();
__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;
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;
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;
--- /dev/null
+#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;
+}