nuclear@0: #include nuclear@1: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@1: #include "gbasys.h" nuclear@0: #include "logger.h" nuclear@0: nuclear@0: static void putchr(char c); nuclear@0: static void putstr(const char *str); nuclear@1: static void agbprint(const char *str); nuclear@0: nuclear@0: static int curx, cury; nuclear@0: static int font_width = 8, font_height = 8; nuclear@0: static int ncols = 20, nrows = 16; nuclear@0: nuclear@1: void logmsg(unsigned short where, const char *fmt, ...) nuclear@0: { nuclear@0: va_list ap; nuclear@0: int sz; nuclear@0: char *buf; nuclear@0: nuclear@0: va_start(ap, fmt); nuclear@0: sz = vsnprintf(0, 0, fmt, ap); nuclear@0: va_end(ap); nuclear@0: nuclear@0: buf = alloca(sz + 1); nuclear@0: va_start(ap, fmt); nuclear@1: vsnprintf(buf, sz + 1, fmt, ap); nuclear@0: va_end(ap); nuclear@0: nuclear@1: if(where & LOG_SCREEN) { nuclear@1: putstr(buf); nuclear@1: } nuclear@1: if(where & LOG_DBG) { nuclear@1: agbprint(buf); nuclear@1: } nuclear@0: } nuclear@0: nuclear@0: static void putchr(char c) nuclear@0: { nuclear@0: switch(c) { nuclear@0: case '\n': nuclear@1: curx = 0; nuclear@1: if(cury >= nrows - 1) { nuclear@1: int row_size = font_height * 160 * 2; nuclear@1: memmove(front_buffer->pixels, (char*)front_buffer->pixels + row_size, nuclear@1: (nrows - 1) * row_size); nuclear@1: memset((char*)front_buffer->pixels + (nrows - 1) * row_size, 0, row_size); nuclear@1: } else { nuclear@1: ++cury; nuclear@1: } nuclear@1: break; nuclear@1: nuclear@0: case '\r': nuclear@0: curx = 0; nuclear@0: break; nuclear@0: nuclear@0: default: nuclear@1: if(isprint((int)c)) { nuclear@1: draw_glyph(c, curx * font_width, cury * font_height, front_buffer); nuclear@1: if(++curx >= ncols) { nuclear@1: putchr('\n'); nuclear@1: } nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static void putstr(const char *str) nuclear@0: { nuclear@0: while(*str) putchr(*str++); nuclear@0: } nuclear@1: nuclear@1: static void agbprint(const char *str) nuclear@1: { nuclear@1: asm volatile ( nuclear@1: "\n\tmov r0, %0" nuclear@1: "\n\tswi 0xff0000" nuclear@1: : nuclear@1: : "r" (str) nuclear@1: : "r0"); nuclear@1: }