proper screen cleanup and switching back&forth between screens
authorJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 27 Oct 2022 17:17:09 +0000 (20:17 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 27 Oct 2022 17:17:09 +0000 (20:17 +0300)
src/gamescr.c
src/menuscr.c
src/util.h
src/voxscape.c

index cc089f2..fa74c94 100644 (file)
@@ -21,7 +21,7 @@ static void gamescr_stop(void);
 static void gamescr_frame(void);
 static void gamescr_vblank(void);
 
-static void update(void);
+static int update(void);
 static void draw(void);
 
 static struct screen gamescr = {
@@ -88,6 +88,7 @@ static int gamescr_start(void)
        prev_iwram_top = iwram_sbrk(0);
 
        gba_setmode(4, DISPCNT_BG2 | DISPCNT_OBJ | DISPCNT_FB1);
+       fillblock_16byte(gba_vram_lfb1, 0, 240 * 160 / 16);
 
        vblperf_setcolor(0);
 
@@ -125,7 +126,7 @@ static int gamescr_start(void)
        num_enemies = total_enemies = 0;
        energy = 5;
 
-       srand(0);
+       memset(enemies, 0, sizeof enemies);
        cptr = color_pixels;
        for(i=0; i<VOX_SZ; i++) {
                for(j=0; j<VOX_SZ; j++) {
@@ -166,6 +167,12 @@ endspawn:
 
        vox_objects((struct vox_object*)enemies, total_enemies, sizeof *enemies);
 
+       energy = MAX_ENERGY;
+       xform_sa = 0;
+       xform_ca = 0x10000;
+       xform_s = 0x100;
+
+       vblcount = 0;
        nframes = 0;
        return 0;
 }
@@ -173,6 +180,18 @@ endspawn:
 static void gamescr_stop(void)
 {
        iwram_brk(prev_iwram_top);
+
+       wait_vblank();
+       /* clear sprites */
+       spr_clear();
+       /* reset background rot/scale state */
+       REG_BG2X = 0;
+       REG_BG2Y = 0;
+       REG_BG2PA = 0x100;
+       REG_BG2PB = 0;
+       REG_BG2PC = 0;
+       REG_BG2PD = 0x100;
+
 }
 
 static void gamescr_frame(void)
@@ -182,7 +201,9 @@ static void gamescr_frame(void)
 
        vox_framebuf(240, 160, framebuf, horizon);
 
-       update();
+       if(update() == -1) {
+               return;
+       }
        draw();
 
        vblperf_end();
@@ -215,7 +236,7 @@ static int numspr[][2] = {
 #define TURN_SPEED     0x200
 #define ELEV_SPEED     8
 
-static void update(void)
+static int update(void)
 {
        int32_t fwd[2], right[2];
        int i, snum, ledspr;
@@ -226,6 +247,7 @@ static void update(void)
        if(KEYPRESS(BN_START)) {
                /* TODO pause menu */
                change_screen(find_screen("menu"));
+               return -1;
        }
 
        if(keystate) {
@@ -330,6 +352,8 @@ static void update(void)
        mask(INTR_VBLANK);
        dynspr_count = snum;
        unmask(INTR_VBLANK);
+
+       return 0;
 }
 
 static void draw(void)
index 53d3b24..0e0f04a 100644 (file)
@@ -41,6 +41,7 @@ static void menuscr_frame(void)
 
        if(KEYPRESS(BN_START)) {
                change_screen(find_screen("game"));
+               return;
        }
 }
 
index 1684524..3e8ee67 100644 (file)
@@ -15,7 +15,7 @@
 
 #define present(x) \
        do { \
-               REG_DISPCNT = (REG_DISPCNT & ~DISPCNT_FB1) | ((x) << 4); \
+               REG_DISPCNT = (REG_DISPCNT & 0xffef) | ((x) << 4); \
        } while(0)
 
 #define ARM_IWRAM      __attribute__((noinline, target("arm"), section(".iwram")))
index a1e141e..5cd9e0d 100644 (file)
@@ -60,6 +60,17 @@ int vox_init(int xsz, int ysz, uint8_t *himg, uint8_t *cimg)
        vox_height = himg;
        vox_color = cimg;
 
+       vox_fb = 0;
+       vox_coltop = 0;
+       vox_horizon = 0;
+       vox_x = vox_y = vox_angle = 0;
+       vox_fov = 0;
+       vox_znear = vox_zfar = 0;
+       vox_nslices = 0;
+       vox_slicelen = 0;
+       vox_valid = 0;
+       projlut = 0;
+
        vox_vheight = 80;
 
        return 0;
@@ -67,10 +78,7 @@ int vox_init(int xsz, int ysz, uint8_t *himg, uint8_t *cimg)
 
 void vox_destroy(void)
 {
-       free(vox_color);
-       free(vox_height);
-       free(vox_coltop);
-       free(vox_slicelen);
+       /* XXX we rely on the screen to clear up any allocated IWRAM */
 }
 
 #define H(x, y)        \