nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "inttypes.h" nuclear@0: #include "gfx.h" nuclear@0: #include "keyb.h" nuclear@0: #include "mouse.h" nuclear@0: #include "logger.h" nuclear@0: nuclear@0: static void display(); nuclear@0: static void swap_buffers(); nuclear@0: static void handle_keyboard(); nuclear@0: static void handle_mouse(); nuclear@0: static bool parse_args(int argc, char **argv); nuclear@0: nuclear@0: static int xsz = 800; nuclear@0: static int ysz = 600; nuclear@0: static int bpp = 16; nuclear@0: static int bytespp; nuclear@0: static unsigned char *fb; nuclear@0: static unsigned char *backbuf; nuclear@0: static int rbits, gbits, bbits; nuclear@0: static int rshift, gshift, bshift; nuclear@0: static unsigned int rmask, gmask, bmask; nuclear@0: nuclear@0: static bool quit; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: if(!parse_args(argc, argv)) { nuclear@0: return 1; nuclear@0: } nuclear@0: if(kb_init(32) == -1) { nuclear@0: fprintf(stderr, "failed to initialize keyboard driver\n"); nuclear@0: return 1; nuclear@0: } nuclear@0: if(!(fb = (unsigned char*)set_video_mode(xsz, ysz, bpp))) { nuclear@0: set_text_mode(); nuclear@0: fprintf(stderr, "failed to set video mode: %dx%d %dbpp\n", xsz, ysz, bpp); nuclear@0: return 1; nuclear@0: } nuclear@0: bpp = get_color_depth(); nuclear@0: get_color_bits(&rbits, &gbits, &bbits); nuclear@0: get_color_shift(&rshift, &gshift, &bshift); nuclear@0: get_color_mask(&rmask, &gmask, &bmask); nuclear@0: bytespp = (int)ceil(bpp / 8.0); nuclear@0: nuclear@0: printlog("bpp: %d (%d %d %d)\n", bpp, rbits, gbits, bbits); nuclear@0: printlog("shift: %d %d %d\n", rshift, gshift, bshift); nuclear@0: printlog("mask: %x %x %x\n", rmask, gmask, bmask); nuclear@0: nuclear@0: backbuf = new unsigned char[xsz * ysz * 3]; nuclear@0: nuclear@0: // main loop nuclear@0: for(;;) { nuclear@0: handle_keyboard(); nuclear@0: handle_mouse(); nuclear@0: if(quit) break; nuclear@0: nuclear@0: display(); nuclear@0: } nuclear@0: nuclear@0: delete [] backbuf; nuclear@0: nuclear@0: set_text_mode(); nuclear@0: kb_shutdown(); nuclear@0: nuclear@0: printf("Thank you for using Rayzor!\n"); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: static void display() nuclear@0: { nuclear@0: unsigned char *fbptr = backbuf; nuclear@0: nuclear@0: for(int i=0; i> srs, src[1] >> sgs, src[2] >> sbs); nuclear@0: src += 3; nuclear@0: } nuclear@0: } nuclear@0: break; nuclear@0: nuclear@0: default: nuclear@0: break; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static void handle_keyboard() nuclear@0: { nuclear@0: if(!kb_isdown(KB_ANY)) nuclear@0: return; nuclear@0: nuclear@0: int c = kb_getkey(); nuclear@0: switch(c) { nuclear@0: case 27: nuclear@0: quit = true; nuclear@0: return; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static void handle_mouse() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: static struct { nuclear@0: int opt; nuclear@0: const char *lopt; nuclear@0: const char *desc; nuclear@0: } options[] = { nuclear@0: {'s', "size", "resolution x[:bpp]"}, nuclear@0: {'h', "help", "print usage information and exit"}, nuclear@0: {-1, 0, 0} nuclear@0: }; nuclear@0: nuclear@0: static void print_usage(const char *argv0) nuclear@0: { nuclear@0: printf("%s usage\n", argv0); nuclear@0: for(int i=0; options[i].opt != -1; i++) { nuclear@0: printf(" -%c, -%s: %s\n", options[i].opt, options[i].lopt, options[i].desc); nuclear@0: } nuclear@0: exit(0); nuclear@0: } nuclear@0: nuclear@0: static bool parse_args(int argc, char **argv) nuclear@0: { nuclear@0: for(int i=1; i