X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Futil.c;h=2d98ee8a3265a37b0aec7447178f8df6e2b36fd8;hb=53c0ee3332822465be7dcf923ca3c6445076b555;hp=9bba42f7bef7ea0cd0edabd931b0df97b627cc3b;hpb=f57fab6afe62f2a476ef4afa1842c81722816451;p=gbajam22 diff --git a/src/util.c b/src/util.c index 9bba42f..2d98ee8 100644 --- a/src/util.c +++ b/src/util.c @@ -1,7 +1,15 @@ +#include +#include #include "util.h" #include "debug.h" +#ifdef BUILD_GBA extern char __iheap_start; +#else +#define IWRAM_POOL_SZ 32768 +#define __iheap_start iwram[0] +static char iwram[IWRAM_POOL_SZ]; +#endif static char *top = &__iheap_start; int iwram_brk(void *addr) @@ -9,6 +17,7 @@ int iwram_brk(void *addr) if((char*)addr < &__iheap_start) { addr = &__iheap_start; } + emuprint("iwram brk: %p (sp: %p)", addr, get_sp()); if(addr > get_sp()) { /*return -1;*/ panic(get_pc(), "iwram_brk (%p) >= sp", addr); @@ -23,3 +32,82 @@ void *iwram_sbrk(intptr_t delta) iwram_brk(top + delta); return prev; } + +int ispow2(unsigned int x) +{ + int cnt = 0; + while(x) { + if(x & 1) cnt++; + x >>= 1; + } + return cnt == 1; +} + + + +void *malloc_nf_impl(size_t sz, const char *file, int line) +{ + void *p; + if(!(p = malloc(sz))) { + panic(get_pc(), "%s:%d malloc %lu\n", file, line, (unsigned long)sz); + } + return p; +} + +void *calloc_nf_impl(size_t num, size_t sz, const char *file, int line) +{ + void *p; + if(!(p = calloc(num, sz))) { + panic(get_pc(), "%s:%d calloc %lu\n", file, line, (unsigned long)(num * sz)); + } + return p; +} + +void *realloc_nf_impl(void *p, size_t sz, const char *file, int line) +{ + if(!(p = realloc(p, sz))) { + panic(get_pc(), "%s:%d realloc %lu\n", file, line, (unsigned long)sz); + } + return p; +} + +char *strdup_nf_impl(const char *s, const char *file, int line) +{ + int len; + char *res; + + len = strlen(s); + if(!(res = malloc(len + 1))) { + panic(get_pc(), "%s:%d strdup\n", file, line); + } + memcpy(res, s, len + 1); + return res; +} + +#ifndef BUILD_GBA +/* utility functions which are implemented in assembly on GBA builds */ + +void fillblock_16byte(void *dest, uint32_t val, int count) +{ + int i; + uint32_t *p = dest; + + for(i=0; i