From 53c0ee3332822465be7dcf923ca3c6445076b555 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Thu, 27 Oct 2022 02:45:25 +0300 Subject: [PATCH] added rudimentary menu screen --- Makefile | 7 +++++-- src/data.h | 4 ++++ src/data.s | 5 +++++ src/game.c | 6 +++--- src/gamescr.c | 11 +++++++---- src/gba/main.c | 4 +++- src/input.h | 4 ++++ src/menuscr.c | 20 +++++++++++++++++++- src/util.h | 2 +- src/voxscape.c | 14 ++------------ src/voxscape.h | 2 -- 11 files changed, 53 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index e3a9446..3a2a7e6 100644 --- 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 >$@ diff --git a/src/data.h b/src/data.h index dd8cc98..78fc613 100644 --- a/src/data.h +++ b/src/data.h @@ -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_ */ diff --git a/src/data.s b/src/data.s index e18f11a..fd9a5f7 100644 --- a/src/data.s +++ b/src/data.s @@ -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" diff --git a/src/game.c b/src/game.c index 38136aa..c203e5b 100644 --- a/src/game.c +++ b/src/game.c @@ -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); diff --git a/src/gamescr.c b/src/gamescr.c index 383ea9d..cc089f2 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -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; diff --git a/src/gba/main.c b/src/gba/main.c index a520caf..16c9ec9 100644 --- a/src/gba/main.c +++ b/src/gba/main.c @@ -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 diff --git a/src/input.h b/src/input.h index df844b2..55a7f27 100644 --- a/src/input.h +++ b/src/input.h @@ -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))) diff --git a/src/menuscr.c b/src/menuscr.c index 2c82d70..53d3b24 100644 --- a/src/menuscr.c +++ b/src/menuscr.c @@ -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) +{ } diff --git a/src/util.h b/src/util.h index 2e5f013..1684524 100644 --- a/src/util.h +++ b/src/util.h @@ -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"))) diff --git a/src/voxscape.c b/src/voxscape.c index 8276a6e..a1e141e 100644 --- a/src/voxscape.c +++ b/src/voxscape.c @@ -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= 10 && (i & 1) == 0) { - continue; - } - vox_render_slice(i); - } + for(i=0; i