added rudimentary menu screen
authorJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 26 Oct 2022 23:45:25 +0000 (02:45 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 26 Oct 2022 23:45:25 +0000 (02:45 +0300)
Makefile
src/data.h
src/data.s
src/game.c
src/gamescr.c
src/gba/main.c
src/input.h
src/menuscr.c
src/util.h
src/voxscape.c
src/voxscape.h

index e3a9446..3a2a7e6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,12 +2,12 @@ src = $(wildcard src/*.c) $(wildcard src/gba/*.c)
 ssrc = $(wildcard src/*.s) $(wildcard src/gba/*.s) data/lut.s
 obj = $(src:.c=.arm.o) $(ssrc:.s=.arm.o)
 dep = $(src:.c=.arm.d)
-name = gbajam22
+name = voxelburg
 elf = $(name).elf
 bin = $(name).gba
 
 data = data/color.raw data/color.pal data/height.raw \
-          data/spr_game.raw data/spr_game.pal
+          data/spr_game.raw data/spr_game.pal data/menuscr.555
 
 libs = libs/maxmod/libmm.a
 
@@ -76,6 +76,9 @@ tools/mmutil/mmutil:
 %.pal: %.png tools/pngdump/pngdump
        tools/pngdump/pngdump -o $@ -c $<
 
+%.555: %.png tools/pngdump/pngdump
+       tools/pngdump/pngdump -o $@ -555 $<
+
 data/lut.s: tools/lutgen
        tools/lutgen >$@
 
index dd8cc98..78fc613 100644 (file)
@@ -30,6 +30,7 @@ enum {
        SPRID_HUSK              = SPRID(112, 64)
 };
 
+/* main game data */
 extern unsigned char color_pixels[];
 extern unsigned char color_cmap[];
 extern unsigned char height_pixels[];
@@ -37,4 +38,7 @@ extern unsigned char height_pixels[];
 extern unsigned char spr_game_pixels[];
 extern unsigned char spr_game_cmap[];
 
+/* menu screen assets */
+extern unsigned char menuscr_pixels[];
+
 #endif /* DATA_H_ */
index e18f11a..fd9a5f7 100644 (file)
@@ -5,6 +5,7 @@
        .globl height_pixels
        .globl spr_game_pixels
        .globl spr_game_cmap
+       .globl menuscr_pixels
 
        .align 1
 color_pixels:
@@ -22,3 +23,7 @@ spr_game_pixels:
        .align 1
 spr_game_cmap:
        .incbin "data/spr_game.pal"
+
+       .align 1
+menuscr_pixels:
+       .incbin "data/menuscr.555"
index 38136aa..c203e5b 100644 (file)
@@ -28,12 +28,12 @@ int change_screen(struct screen *scr)
 
        mask(INTR_VBLANK);
 
-       if(scr->start && scr->start() == -1) {
-               return -1;
-       }
        if(curscr && curscr->stop) {
                curscr->stop();
        }
+       if(scr->start && scr->start() == -1) {
+               return -1;
+       }
        curscr = scr;
 
        unmask(INTR_VBLANK);
index 383ea9d..cc089f2 100644 (file)
@@ -68,6 +68,7 @@ static int32_t xform_sa, xform_ca;    /* for viewport bank/zoom */
 static int xform_s;
 
 static short vblcount;
+static void *prev_iwram_top;
 
 
 static inline void xform_pixel(int *xp, int *yp);
@@ -84,6 +85,8 @@ static int gamescr_start(void)
        uint8_t *cptr;
        struct enemy *enemy;
 
+       prev_iwram_top = iwram_sbrk(0);
+
        gba_setmode(4, DISPCNT_BG2 | DISPCNT_OBJ | DISPCNT_FB1);
 
        vblperf_setcolor(0);
@@ -169,6 +172,7 @@ endspawn:
 
 static void gamescr_stop(void)
 {
+       iwram_brk(prev_iwram_top);
 }
 
 static void gamescr_frame(void)
@@ -219,8 +223,9 @@ static void update(void)
 
        update_keyb();
 
-       if(KEYPRESS(BN_SELECT)) {
-               vox_quality ^= 1;
+       if(KEYPRESS(BN_START)) {
+               /* TODO pause menu */
+               change_screen(find_screen("menu"));
        }
 
        if(keystate) {
@@ -386,8 +391,6 @@ static void gamescr_vblank(void)
        REG_BG2PC = -sa;
        REG_BG2PD = ca;
 
-       keystate = ~REG_KEYINPUT;
-
        if((keystate & (BN_LEFT | BN_RIGHT)) == 0) {
                if(bank) {
                        bank -= bankdir << 4;
index a520caf..16c9ec9 100644 (file)
@@ -4,6 +4,7 @@
 #include "debug.h"
 #include "game.h"
 #include "maxmod.h"
+#include "input.h"
 
 static void vblank(void);
 
@@ -36,7 +37,7 @@ int main(void)
                panic(get_pc(), "failed to initialize screens");
        }
 
-       if(change_screen(find_screen("game")) == -1) {
+       if(change_screen(find_screen("menu")) == -1) {
                panic(get_pc(), "failed to find game screen");
        }
 
@@ -53,6 +54,7 @@ static void vblank(void)
 {
        vblperf_count++;
 
+       keyb_vblank();
        curscr->vblank();
 
 #ifndef NOSOUND
index df844b2..55a7f27 100644 (file)
@@ -16,6 +16,10 @@ enum {
        BN_LT           = 0x0200
 };
 
+#ifdef BUILD_GBA
+#define keyb_vblank()  (keystate = ~REG_KEYINPUT)
+#endif
+
 #define KEYPRESS(key)  ((keystate & (key)) && (keydelta & (key)))
 #define KEYRELEASE(key)        ((keystate & (key)) == 0 && (keydelta & (key)))
 
index 2c82d70..53d3b24 100644 (file)
@@ -1,15 +1,22 @@
 #include "game.h"
+#include "data.h"
+#include "gba.h"
+#include "util.h"
+#include "dma.h"
+#include "input.h"
+#include "debug.h"
 
 static int menuscr_start(void);
 static void menuscr_stop(void);
 static void menuscr_frame(void);
+static void menuscr_vblank(void);
 
 static struct screen menuscr = {
        "menu",
        menuscr_start,
        menuscr_stop,
        menuscr_frame,
-       0
+       menuscr_vblank
 };
 
 struct screen *init_menu_screen(void)
@@ -19,6 +26,8 @@ struct screen *init_menu_screen(void)
 
 static int menuscr_start(void)
 {
+       gba_setmode(3, DISPCNT_BG2);
+       dma_copy16(3, gba_vram_lfb0, menuscr_pixels, 240 * 160, 0);
        return 0;
 }
 
@@ -28,4 +37,13 @@ static void menuscr_stop(void)
 
 static void menuscr_frame(void)
 {
+       update_keyb();
+
+       if(KEYPRESS(BN_START)) {
+               change_screen(find_screen("game"));
+       }
+}
+
+static void menuscr_vblank(void)
+{
 }
index 2e5f013..1684524 100644 (file)
@@ -15,7 +15,7 @@
 
 #define present(x) \
        do { \
-               REG_DISPCNT = DISPCNT_BG2 | DISPCNT_OBJ | 4 | ((x) << 4); \
+               REG_DISPCNT = (REG_DISPCNT & ~DISPCNT_FB1) | ((x) << 4); \
        } while(0)
 
 #define ARM_IWRAM      __attribute__((noinline, target("arm"), section(".iwram")))
index 8276a6e..a1e141e 100644 (file)
@@ -51,7 +51,6 @@ static unsigned int vox_valid;
 static struct vox_object *vox_obj;
 static int vox_num_obj, vox_obj_stride;
 
-int vox_quality = 1;
 int *projlut;
 
 int vox_init(int xsz, int ysz, uint8_t *himg, uint8_t *cimg)
@@ -135,17 +134,8 @@ void vox_render(void)
 
        vox_begin();
 
-       if(vox_quality) {
-               for(i=0; i<vox_nslices; i++) {
-                       vox_render_slice(i);
-               }
-       } else {
-               for(i=0; i<vox_nslices; i++) {
-                       if(i >= 10 && (i & 1) == 0) {
-                               continue;
-                       }
-                       vox_render_slice(i);
-               }
+       for(i=0; i<vox_nslices; i++) {
+               vox_render_slice(i);
        }
 }
 
index da726a6..314147c 100644 (file)
@@ -14,8 +14,6 @@ struct vox_object {
        int32_t scale;
 };
 
-extern int vox_quality;
-
 int vox_init(int xsz, int ysz, uint8_t *himg, uint8_t *cimg);
 void vox_destroy(void);