+
+__attribute__((noinline, target("arm"), section(".iwram")))
+static void vblank(void)
+{
+ uint16_t bnstate;
+ int16_t mat[4];
+ static short gate_speed;
+
+ bnstate = ~REG_KEYINPUT;
+ if(bnstate & BN_DPAD) {
+ if(gate_speed < 5) {
+ gate_speed++;
+ }
+
+ if(bnstate & BN_LEFT) x -= gate_speed;
+ if(bnstate & BN_RIGHT) x += gate_speed;
+ if(bnstate & BN_UP) y -= gate_speed;
+ if(bnstate & BN_DOWN) y += gate_speed;
+
+ if(x < 0) x = 0;
+ if(x > 239) x = 239;
+ if(y < 0) y = 0;
+ if(y > 159) y = 159;
+ } else {
+ gate_speed = 0;
+ }
+
+ if(bnstate & BN_A) rot--;
+ if(bnstate & BN_B) rot++;
+
+ spr_oam(oam, 0, 512 + 256, x - 64, y - 64, SPR_256COL | SPR_SZ64 | SPR_DBLSZ |
+ SPR_ROTSCL | SPR_ROTSCL_SEL(0));
+
+ mat[0] = COS(rot) << 1;
+ mat[1] = -SIN(rot) << 1;
+ mat[2] = SIN(rot) << 1;
+ mat[3] = COS(rot) << 1;
+ spr_transform(oam, 0, mat);
+
+
+ dma_copy16(3, (void*)OAM_ADDR, oam, sizeof oam / 2, 0);
+}