From: John Tsiombikas Date: Mon, 12 Apr 2021 04:11:02 +0000 (+0300) Subject: iwram_brk/iwram_sbrk X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=gbajam21;a=commitdiff_plain;h=c8c1b9ddb5ed3e256b086bd0db92589948163e93 iwram_brk/iwram_sbrk --- diff --git a/src/asmutil.s b/src/asmutil.s index 3aa2255..b88a7a1 100644 --- a/src/asmutil.s +++ b/src/asmutil.s @@ -19,6 +19,10 @@ get_pc: mov r0, lr bx lr + .globl get_sp +get_sp: + mov r0, sp + bx lr .arm .extern panic_regs diff --git a/src/debug.c b/src/debug.c index 60dc387..9fd40d3 100644 --- a/src/debug.c +++ b/src/debug.c @@ -39,7 +39,7 @@ void vblperf_stop(void) uint32_t panic_regs[16]; void get_panic_regs(void); -void panic(uint32_t pc, const char *fmt, ...) +void panic(void *pc, const char *fmt, ...) { int y; va_list ap; @@ -56,7 +56,7 @@ void panic(uint32_t pc, const char *fmt, ...) fillblock_16byte((void*)VRAM_LFB_FB0_ADDR, 0, 240 * 160 / 16); fillblock_16byte((unsigned char*)VRAM_LFB_FB0_ADDR + 240 * 3, 0xffffffff, 240 / 16); - dbg_drawstr(44, 0, " Panic at %08x ", pc); + dbg_drawstr(44, 0, " Panic at %p ", pc); va_start(ap, fmt); y = dbg_vdrawstr(0, 12, fmt, ap) + 8; diff --git a/src/debug.h b/src/debug.h index 844b465..5715da8 100644 --- a/src/debug.h +++ b/src/debug.h @@ -25,7 +25,7 @@ void vblperf_stop(void); } while(0) -void panic(uint32_t pc, const char *fmt, ...); +void panic(void *pc, const char *fmt, ...) __attribute__((noreturn)); void dbg_drawglyph(int x, int y, int c); int dbg_drawstr(int x, int y, const char *fmt, ...); diff --git a/src/gamescr.c b/src/gamescr.c index e5dd8e4..3941883 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -7,7 +7,7 @@ #include "intr.h" #include "debug.h" -static unsigned char tex[32 * 32] __attribute__((section(".iwram"))); +static unsigned char *tex;//[32 * 32] __attribute__((section(".iwram"))); void gamescr(void) { @@ -31,6 +31,7 @@ void gamescr(void) fillblock_16byte(vram[0], 0xffffffff, 240 * 160 / 16); fillblock_16byte(vram[1], 0xffffffff, 240 * 160 / 16); + tex = iwram_sbrk(32 * 32); memcpy(tex, tuncross_pixels, 32 * 32); nframes = 0; diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..c52e8af --- /dev/null +++ b/src/util.c @@ -0,0 +1,25 @@ +#include "util.h" +#include "debug.h" + +extern char __data_end__; +static char *top = &__data_end__; + +int iwram_brk(void *addr) +{ + if(addr < &__data_end__) { + addr = &__data_end__; + } + if(addr > get_sp()) { + /*return -1;*/ + panic(get_pc(), "iwram_brk (%p) >= sp", addr); + } + top = addr; + return 0; +} + +void *iwram_sbrk(intptr_t delta) +{ + void *prev = top; + iwram_brk(top + delta); + return prev; +} diff --git a/src/util.h b/src/util.h index bba0ac8..d374aef 100644 --- a/src/util.h +++ b/src/util.h @@ -1,6 +1,8 @@ #ifndef UTIL_H_ #define UTIL_H_ +#include + #define wait_vblank() \ do { \ while(REG_DISPSTAT & DISPSTAT_VBLANK); \ @@ -18,9 +20,12 @@ ((uint16_t*)CRAM_BG_ADDR)[idx] = (uint16_t)(r) | ((uint16_t)(g) << 5) | ((uint16_t)(b) << 10); \ } while(0) +int iwram_brk(void *addr); +void *iwram_sbrk(intptr_t delta); void fillblock_16byte(void *dest, uint32_t val, int count); -uint32_t get_pc(void); +void *get_pc(void); +void *get_sp(void); #endif /* UTIL_H_ */