iwram_brk/iwram_sbrk
authorJohn Tsiombikas <nuclear@member.fsf.org>
Mon, 12 Apr 2021 04:11:02 +0000 (07:11 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Mon, 12 Apr 2021 04:11:02 +0000 (07:11 +0300)
src/asmutil.s
src/debug.c
src/debug.h
src/gamescr.c
src/util.c [new file with mode: 0644]
src/util.h

index 3aa2255..b88a7a1 100644 (file)
@@ -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
index 60dc387..9fd40d3 100644 (file)
@@ -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;
index 844b465..5715da8 100644 (file)
@@ -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, ...);
index e5dd8e4..3941883 100644 (file)
@@ -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 (file)
index 0000000..c52e8af
--- /dev/null
@@ -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;
+}
index bba0ac8..d374aef 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef UTIL_H_
 #define UTIL_H_
 
+#include <stdint.h>
+
 #define wait_vblank() \
        do { \
                while(REG_DISPSTAT & DISPSTAT_VBLANK); \
                ((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_ */