+ static int bank, bankdir, theta, s;
+ int32_t sa, ca;
+ uint16_t *src, *dst;
+ int i;
+
+ if(!nframes) return;
+
+ /* TODO: pre-arrange sprite tiles in gba-native format, so that I can just
+ * DMA them from cartridge easily
+ */
+
+ /*
+ src = (void*)(spr_game_pixels + enemy_frame_offs[1]);
+ dst = (void*)(VRAM_LFB_OBJ_ADDR + SPRID(0, 64));
+ for(i=0; i<64; i++) {
+ dma_copy32(3, dst, src, 32 / 4, 0);
+ dst += 32 / 2;
+ src += 128 / 2;
+ }
+ */
+
+ dma_copy32(3, (void*)(OAM_ADDR + dynspr_base * 8), oam + dynspr_base * 4, dynspr_count * 2, 0);
+
+ theta = -(bank << 3);
+#if 0
+ s = 0x100000 / (MAXBANK + (abs(bank) >> 3));
+ sa = ((SIN(theta) >> 8) * s) >> 12;
+ ca = ((COS(theta) >> 8) * s) >> 12;
+#else
+ s = (MAXBANK + (abs(bank) >> 3));
+ sa = SIN(theta) / s;
+ ca = COS(theta) / s;
+#endif
+
+ REG_BG2X = -ca * 120 - sa * 80 + (120 << 8);
+ REG_BG2Y = sa * 120 - ca * 80 + (80 << 8);
+
+ REG_BG2PA = ca;
+ REG_BG2PB = sa;
+ REG_BG2PC = -sa;
+ REG_BG2PD = ca;
+
+ keystate = ~REG_KEYINPUT;
+
+ if((keystate & (BN_LEFT | BN_RIGHT)) == 0) {
+ if(bank) {
+ bank -= bankdir << 4;
+ }
+ } else if(keystate & BN_LEFT) {
+ bankdir = -1;
+ if(bank > -MAXBANK) bank -= 16;
+ } else if(keystate & BN_RIGHT) {
+ bankdir = 1;
+ if(bank < MAXBANK) bank += 16;
+ }
+}
+
+/*
+static uint16_t skygrad[] __attribute__((section(".data"))) = {
+
+ 0x662a, 0x660a, 0x660a, 0x660b, 0x660b, 0x660b, 0x660b, 0x6a0b, 0x6a0c,
+ 0x6a0c, 0x6a0c, 0x6a0c, 0x6a0c, 0x6a0d, 0x6a0d, 0x6a0d, 0x6a0d, 0x6a0d,
+ 0x6a0d, 0x6a0e, 0x6e0e, 0x6e0e, 0x6e0e, 0x6e0e, 0x6e0f, 0x6e0f, 0x6e0f,
+ 0x6e0f, 0x6e0f, 0x6e0f, 0x6e10, 0x6e10, 0x7210, 0x7210, 0x7210, 0x7211,
+ 0x7211, 0x7211, 0x71f1, 0x71f1, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2,
+ 0x75f2, 0x75f3, 0x75f3, 0x75f3, 0x75f3, 0x75f3, 0x75f4, 0x75f4, 0x75f4,
+ 0x75f4, 0x75f4, 0x75f5, 0x79f5, 0x79f5, 0x79f5, 0x79f5, 0x79f5, 0x79f6,
+ 0x79f6, 0x79f6, 0x79f6, 0x79f6, 0x79f7, 0x79f7, 0x79f7, 0x7df7, 0x7df7,
+ 0x7df7, 0x7df8, 0x7df8, 0x7df8, 0x7dd8, 0x7dd8, 0x7dd9, 0x7dd9,
+
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9,
+ 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9, 0x7dd9
+};
+
+ARM_IWRAM
+static void hblank(void)
+{
+ int vcount = REG_VCOUNT;
+ gba_bgpal[255] = skygrad[vcount];