gba-trycatch

diff src/logger.c @ 1:b7130fe3f073

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 13 Jun 2014 19:10:11 +0300
parents 0d2602a1b851
children 850be43b3135
line diff
     1.1 --- a/src/logger.c	Thu Jun 12 05:37:18 2014 +0300
     1.2 +++ b/src/logger.c	Fri Jun 13 19:10:11 2014 +0300
     1.3 @@ -1,17 +1,20 @@
     1.4  #include <stdio.h>
     1.5 +#include <string.h>
     1.6  #include <stdarg.h>
     1.7  #include <ctype.h>
     1.8  #include <alloca.h>
     1.9 +#include "gbasys.h"
    1.10  #include "logger.h"
    1.11  
    1.12  static void putchr(char c);
    1.13  static void putstr(const char *str);
    1.14 +static void agbprint(const char *str);
    1.15  
    1.16  static int curx, cury;
    1.17  static int font_width = 8, font_height = 8;
    1.18  static int ncols = 20, nrows = 16;
    1.19  
    1.20 -void logmsg(const char *fmt, ...)
    1.21 +void logmsg(unsigned short where, const char *fmt, ...)
    1.22  {
    1.23  	va_list ap;
    1.24  	int sz;
    1.25 @@ -23,24 +26,42 @@
    1.26  
    1.27  	buf = alloca(sz + 1);
    1.28  	va_start(ap, fmt);
    1.29 -	vsnprintf(buf, sz, fmt, ap);
    1.30 +	vsnprintf(buf, sz + 1, fmt, ap);
    1.31  	va_end(ap);
    1.32  
    1.33 -	putstr(buf);
    1.34 +	if(where & LOG_SCREEN) {
    1.35 +		putstr(buf);
    1.36 +	}
    1.37 +	if(where & LOG_DBG) {
    1.38 +		agbprint(buf);
    1.39 +	}
    1.40  }
    1.41  
    1.42  static void putchr(char c)
    1.43  {
    1.44  	switch(c) {
    1.45  	case '\n':
    1.46 +		curx = 0;
    1.47 +		if(cury >= nrows - 1) {
    1.48 +			int row_size = font_height * 160 * 2;
    1.49 +			memmove(front_buffer->pixels, (char*)front_buffer->pixels + row_size,
    1.50 +					(nrows - 1) * row_size);
    1.51 +			memset((char*)front_buffer->pixels + (nrows - 1) * row_size, 0, row_size);
    1.52 +		} else {
    1.53 +			++cury;
    1.54 +		}
    1.55 +		break;
    1.56 +
    1.57  	case '\r':
    1.58  		curx = 0;
    1.59 -		cury += font_height;
    1.60  		break;
    1.61  
    1.62  	default:
    1.63 -		if(isprint(c)) {
    1.64 -			draw_glyph(c, curx, cury, front_buffer);
    1.65 +		if(isprint((int)c)) {
    1.66 +			draw_glyph(c, curx * font_width, cury * font_height, front_buffer);
    1.67 +			if(++curx >= ncols) {
    1.68 +				putchr('\n');
    1.69 +			}
    1.70  		}
    1.71  	}
    1.72  }
    1.73 @@ -49,3 +70,13 @@
    1.74  {
    1.75  	while(*str) putchr(*str++);
    1.76  }
    1.77 +
    1.78 +static void agbprint(const char *str)
    1.79 +{
    1.80 +	asm volatile (
    1.81 +		"\n\tmov r0, %0"
    1.82 +		"\n\tswi 0xff0000"
    1.83 +		:
    1.84 +		: "r" (str)
    1.85 +		: "r0");
    1.86 +}