gba-trycatch

annotate src/logger.c @ 8:fb0a0d6a8b52

sortof works
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 19 Jun 2014 05:53:46 +0300
parents b7130fe3f073
children
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@1 2 #include <string.h>
nuclear@0 3 #include <stdarg.h>
nuclear@0 4 #include <ctype.h>
nuclear@0 5 #include <alloca.h>
nuclear@1 6 #include "gbasys.h"
nuclear@0 7 #include "logger.h"
nuclear@0 8
nuclear@0 9 static void putchr(char c);
nuclear@0 10 static void putstr(const char *str);
nuclear@1 11 static void agbprint(const char *str);
nuclear@0 12
nuclear@0 13 static int curx, cury;
nuclear@0 14 static int font_width = 8, font_height = 8;
nuclear@0 15 static int ncols = 20, nrows = 16;
nuclear@0 16
nuclear@1 17 void logmsg(unsigned short where, const char *fmt, ...)
nuclear@0 18 {
nuclear@0 19 va_list ap;
nuclear@0 20 int sz;
nuclear@0 21 char *buf;
nuclear@0 22
nuclear@0 23 va_start(ap, fmt);
nuclear@0 24 sz = vsnprintf(0, 0, fmt, ap);
nuclear@0 25 va_end(ap);
nuclear@0 26
nuclear@0 27 buf = alloca(sz + 1);
nuclear@0 28 va_start(ap, fmt);
nuclear@1 29 vsnprintf(buf, sz + 1, fmt, ap);
nuclear@0 30 va_end(ap);
nuclear@0 31
nuclear@1 32 if(where & LOG_SCREEN) {
nuclear@1 33 putstr(buf);
nuclear@1 34 }
nuclear@1 35 if(where & LOG_DBG) {
nuclear@1 36 agbprint(buf);
nuclear@1 37 }
nuclear@0 38 }
nuclear@0 39
nuclear@0 40 static void putchr(char c)
nuclear@0 41 {
nuclear@0 42 switch(c) {
nuclear@0 43 case '\n':
nuclear@1 44 curx = 0;
nuclear@1 45 if(cury >= nrows - 1) {
nuclear@1 46 int row_size = font_height * 160 * 2;
nuclear@1 47 memmove(front_buffer->pixels, (char*)front_buffer->pixels + row_size,
nuclear@1 48 (nrows - 1) * row_size);
nuclear@1 49 memset((char*)front_buffer->pixels + (nrows - 1) * row_size, 0, row_size);
nuclear@1 50 } else {
nuclear@1 51 ++cury;
nuclear@1 52 }
nuclear@1 53 break;
nuclear@1 54
nuclear@0 55 case '\r':
nuclear@0 56 curx = 0;
nuclear@0 57 break;
nuclear@0 58
nuclear@0 59 default:
nuclear@1 60 if(isprint((int)c)) {
nuclear@1 61 draw_glyph(c, curx * font_width, cury * font_height, front_buffer);
nuclear@1 62 if(++curx >= ncols) {
nuclear@1 63 putchr('\n');
nuclear@1 64 }
nuclear@0 65 }
nuclear@0 66 }
nuclear@0 67 }
nuclear@0 68
nuclear@0 69 static void putstr(const char *str)
nuclear@0 70 {
nuclear@0 71 while(*str) putchr(*str++);
nuclear@0 72 }
nuclear@1 73
nuclear@5 74 #ifdef __ARM__
nuclear@1 75 static void agbprint(const char *str)
nuclear@1 76 {
nuclear@1 77 asm volatile (
nuclear@1 78 "\n\tmov r0, %0"
nuclear@1 79 "\n\tswi 0xff0000"
nuclear@1 80 :
nuclear@1 81 : "r" (str)
nuclear@1 82 : "r0");
nuclear@1 83 }
nuclear@5 84 #else
nuclear@5 85 /* fake version */
nuclear@5 86 static void agbprint(const char *str)
nuclear@5 87 {
nuclear@5 88 fputs(str, stdout);
nuclear@5 89 fflush(stdout);
nuclear@5 90 }
nuclear@5 91 #endif