#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "game.h"
#include "keyb.h"
#include "timer.h"
#include "logger.h"
#include "cdpmi.h"
-static void draw(void);
-
static struct video_mode *vmode;
+static int quit;
static void *vmem;
int main(int argc, char **argv)
{
+ void *fb_buf;
struct video_mode *vmodes;
- int vmidx;
+ int vmidx, status = 0;
init_logger("game.log");
fb_width = vmode->xsz;
fb_height = vmode->ysz;
- fb_size = (vmode->xsz * vmode->bpp / 8) * vmode->ysz;
+ fb_size = vmode->pitch * vmode->ysz;
+
+ if(!(fb_buf = malloc(fb_size + vmode->pitch * 2))) {
+ fprintf(stderr, "failed to allocate framebuffer\n");
+ status = -1;
+ goto break_evloop;
+ }
+ fb_pixels = (uint16_t*)((char*)fb_buf + vmode->pitch);
+
+ if(init(argc, argv) == -1) {
+ status = -1;
+ goto break_evloop;
+ }
reset_timer();
for(;;) {
int key;
- while((key = kb_getkey()) != -1) {
- if(key == 27) goto break_evloop;
+ if(key_event) {
+ while((key = kb_getkey()) != -1) {
+ key_event(key, 1);
+ }
+ } else {
+ while((key = kb_getkey()) != -1) {
+ if(key == 27) goto break_evloop;
+ }
}
+ if(quit) goto break_evloop;
time_msec = get_msec();
draw();
}
break_evloop:
+ free(fb_buf);
+ cleanup();
set_text_mode();
+ cleanup_video();
kb_shutdown();
- return 0;
-}
-
-static void draw(void)
-{
- int i, j;
- uint16_t *pptr = vmem;
-
- for(i=0; i<fb_height; i++) {
- for(j=0; j<fb_width; j++) {
- int chess = (i >> 2) == (j >> 2);
- *pptr++ = chess ? 0xff00 : 0x00ff;
- }
- }
+ return status;
}
-void swap_buffers(void *pixels)
+void game_quit(void)
{
- wait_vsync();
- memcpy(vmem, pixels, fb_size);
+ quit = 1;
}