gba-trycatch

changeset 1:b7130fe3f073

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 13 Jun 2014 19:10:11 +0300
parents 0d2602a1b851
children 5143908d0220
files .clang_complete Makefile src/logger.c src/logger.h src/main.c
diffstat 5 files changed, 101 insertions(+), 15 deletions(-) [+]
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/.clang_complete	Fri Jun 13 19:10:11 2014 +0300
     1.3 @@ -0,0 +1,2 @@
     1.4 +-Isrc
     1.5 +-I../gbasys/src
     2.1 --- a/Makefile	Thu Jun 12 05:37:18 2014 +0300
     2.2 +++ b/Makefile	Fri Jun 13 19:10:11 2014 +0300
     2.3 @@ -13,11 +13,14 @@
     2.4  CC = $(ARCH)-gcc
     2.5  AS = $(ARCH)-as
     2.6  OBJCOPY = $(ARCH)-objcopy
     2.7 +EMU = vbam
     2.8  
     2.9 -opt = -O3 -fomit-frame-pointer -marm -mcpu=arm7tdmi -mtune=arm7tdmi
    2.10 +#opt = -O3 -fomit-frame-pointer -mcpu=arm7tdmi -mtune=arm7tdmi
    2.11 +dbg = -g
    2.12  
    2.13 -CFLAGS = $(opt) -pedantic -Wall -I../gbasys/src -I.
    2.14 +CFLAGS = $(opt) $(dbg) -pedantic -Wall -I../gbasys/src -I.
    2.15  LDFLAGS = ../gbasys/libgbasys.a -lm
    2.16 +EMUFLAGS = -T 100 -f 1
    2.17  
    2.18  .PHONY: all
    2.19  all: $(bin) $(bin_mb)
    2.20 @@ -56,4 +59,4 @@
    2.21  
    2.22  .PHONY: simrun
    2.23  simrun: $(bin)
    2.24 -	VisualBoyAdvance -T 100 -2 $(bin)
    2.25 +	$(EMU) $(EMUFLAGS) $(bin)
     3.1 --- a/src/logger.c	Thu Jun 12 05:37:18 2014 +0300
     3.2 +++ b/src/logger.c	Fri Jun 13 19:10:11 2014 +0300
     3.3 @@ -1,17 +1,20 @@
     3.4  #include <stdio.h>
     3.5 +#include <string.h>
     3.6  #include <stdarg.h>
     3.7  #include <ctype.h>
     3.8  #include <alloca.h>
     3.9 +#include "gbasys.h"
    3.10  #include "logger.h"
    3.11  
    3.12  static void putchr(char c);
    3.13  static void putstr(const char *str);
    3.14 +static void agbprint(const char *str);
    3.15  
    3.16  static int curx, cury;
    3.17  static int font_width = 8, font_height = 8;
    3.18  static int ncols = 20, nrows = 16;
    3.19  
    3.20 -void logmsg(const char *fmt, ...)
    3.21 +void logmsg(unsigned short where, const char *fmt, ...)
    3.22  {
    3.23  	va_list ap;
    3.24  	int sz;
    3.25 @@ -23,24 +26,42 @@
    3.26  
    3.27  	buf = alloca(sz + 1);
    3.28  	va_start(ap, fmt);
    3.29 -	vsnprintf(buf, sz, fmt, ap);
    3.30 +	vsnprintf(buf, sz + 1, fmt, ap);
    3.31  	va_end(ap);
    3.32  
    3.33 -	putstr(buf);
    3.34 +	if(where & LOG_SCREEN) {
    3.35 +		putstr(buf);
    3.36 +	}
    3.37 +	if(where & LOG_DBG) {
    3.38 +		agbprint(buf);
    3.39 +	}
    3.40  }
    3.41  
    3.42  static void putchr(char c)
    3.43  {
    3.44  	switch(c) {
    3.45  	case '\n':
    3.46 +		curx = 0;
    3.47 +		if(cury >= nrows - 1) {
    3.48 +			int row_size = font_height * 160 * 2;
    3.49 +			memmove(front_buffer->pixels, (char*)front_buffer->pixels + row_size,
    3.50 +					(nrows - 1) * row_size);
    3.51 +			memset((char*)front_buffer->pixels + (nrows - 1) * row_size, 0, row_size);
    3.52 +		} else {
    3.53 +			++cury;
    3.54 +		}
    3.55 +		break;
    3.56 +
    3.57  	case '\r':
    3.58  		curx = 0;
    3.59 -		cury += font_height;
    3.60  		break;
    3.61  
    3.62  	default:
    3.63 -		if(isprint(c)) {
    3.64 -			draw_glyph(c, curx, cury, front_buffer);
    3.65 +		if(isprint((int)c)) {
    3.66 +			draw_glyph(c, curx * font_width, cury * font_height, front_buffer);
    3.67 +			if(++curx >= ncols) {
    3.68 +				putchr('\n');
    3.69 +			}
    3.70  		}
    3.71  	}
    3.72  }
    3.73 @@ -49,3 +70,13 @@
    3.74  {
    3.75  	while(*str) putchr(*str++);
    3.76  }
    3.77 +
    3.78 +static void agbprint(const char *str)
    3.79 +{
    3.80 +	asm volatile (
    3.81 +		"\n\tmov r0, %0"
    3.82 +		"\n\tswi 0xff0000"
    3.83 +		:
    3.84 +		: "r" (str)
    3.85 +		: "r0");
    3.86 +}
     4.1 --- a/src/logger.h	Thu Jun 12 05:37:18 2014 +0300
     4.2 +++ b/src/logger.h	Fri Jun 13 19:10:11 2014 +0300
     4.3 @@ -1,6 +1,12 @@
     4.4  #ifndef LOGGER_H_
     4.5  #define LOGGER_H_
     4.6  
     4.7 -void logmsg(const char *fmt, ...);
     4.8 +enum {
     4.9 +	LOG_SCREEN = 1,
    4.10 +	LOG_DBG = 2
    4.11 +};
    4.12 +#define LOG_ALL		0xffff
    4.13 +
    4.14 +void logmsg(unsigned short where, const char *fmt, ...);
    4.15  
    4.16  #endif	/* LOGGER_H_ */
     5.1 --- a/src/main.c	Thu Jun 12 05:37:18 2014 +0300
     5.2 +++ b/src/main.c	Fri Jun 13 19:10:11 2014 +0300
     5.3 @@ -1,21 +1,34 @@
     5.4  #include "gbasys.h"
     5.5 +#include "logger.h"
     5.6  
     5.7  static void draw(void);
     5.8 -static void keyb_handler(void);
     5.9 +static void keyb(int key, int pressed);
    5.10 +static void keyb_intr(void);
    5.11  
    5.12 -static unsigned int keystate;
    5.13 +static unsigned short keystate;
    5.14 +
    5.15 +#define EVQ_SIZE	8
    5.16 +volatile static unsigned short evhead, evtail;
    5.17 +static unsigned short events[EVQ_SIZE];
    5.18  
    5.19  int main(void)
    5.20  {
    5.21  	gba_init();
    5.22 -	//interrupt(INTR_KEY, keyb_handler);
    5.23 +	interrupt(INTR_KEY, keyb_intr);
    5.24  
    5.25  	set_video_mode(VMODE_LFB_160x128_16, 1);
    5.26  
    5.27  	clear_buffer(front_buffer, 0);
    5.28 -	draw_string("please wait...", 0, 0, front_buffer);
    5.29 +	set_text_writebg(1);
    5.30 +	logmsg(LOG_ALL, "please wait...\n");
    5.31  
    5.32  	for(;;) {
    5.33 +		/* process events */
    5.34 +		while(evhead != evtail) {
    5.35 +			unsigned short ev = events[evhead];
    5.36 +			evhead = (evhead + 1) % EVQ_SIZE;
    5.37 +			keyb(ev, 1);
    5.38 +		}
    5.39  		draw();
    5.40  	}
    5.41  	return 0;
    5.42 @@ -25,6 +38,37 @@
    5.43  {
    5.44  }
    5.45  
    5.46 -static void keyb_handler(void)
    5.47 +static void keyb(int key, int pressed)
    5.48  {
    5.49 +	static const char *keyname[] = {
    5.50 +		"A", "B", "select", "start", "right", "left", "up", "down", "RT", "LT"
    5.51 +	};
    5.52 +	int i;
    5.53 +	for(i=0; i<32; i++) {
    5.54 +		if(key & 1) {
    5.55 +			break;
    5.56 +		}
    5.57 +		key >>= 1;
    5.58 +	}
    5.59 +	if(i < sizeof keyname / sizeof *keyname) {
    5.60 +		logmsg(LOG_ALL, "key %s %s\n", keyname[i], pressed ? "pressed" : "released");
    5.61 +	}
    5.62  }
    5.63 +
    5.64 +static void keyb_intr(void)
    5.65 +{
    5.66 +	int i;
    5.67 +	unsigned short prev_keystate = keystate;
    5.68 +	unsigned short diff;
    5.69 +	keystate = get_key_state(KEY_ALL);
    5.70 +	diff = keystate ^ prev_keystate;
    5.71 +
    5.72 +	for(i=0; i<32; i++) {
    5.73 +		int key = 1 << i;
    5.74 +
    5.75 +		if(diff & key) {
    5.76 +			events[evtail] = key;
    5.77 +			evtail = (evtail + 1) % EVQ_SIZE;
    5.78 +		}
    5.79 +	}
    5.80 +}