logo
[eradicate] / src / dos / main.c
index c344df1..8c3096b 100644 (file)
@@ -8,13 +8,8 @@
 #include "logger.h"
 #include "cdpmi.h"
 
-static void draw(void);
-
 static struct video_mode *vmode;
-
-static void swap_lfb(void *pixels);
-static void swap_banked(void *pixels);
-
+static int quit;
 
 int main(int argc, char **argv)
 {
@@ -40,12 +35,6 @@ int main(int argc, char **argv)
        }
        vmode = vmodes + vmidx;
 
-       if(vmode->fb_addr) {
-               swap_buffers = swap_lfb;
-       } else {
-               swap_buffers = swap_banked;
-       }
-
        fb_width = vmode->xsz;
        fb_height = vmode->ysz;
        fb_size = vmode->pitch * vmode->ysz;
@@ -57,13 +46,25 @@ int main(int argc, char **argv)
        }
        fb_pixels = (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();
@@ -71,51 +72,14 @@ int main(int argc, char **argv)
 
 break_evloop:
        free(fb_buf);
+       cleanup();
        set_text_mode();
        cleanup_video();
        kb_shutdown();
        return status;
 }
 
-static void draw(void)
+void game_quit(void)
 {
-       int i, j;
-       uint16_t *pptr = fb_pixels;
-
-       for(i=0; i<fb_height; i++) {
-               for(j=0; j<fb_width; j++) {
-                       int chess = ((i >> 4) & 1) == ((j >> 4) & 1);
-                       *pptr++ = chess ? 0xff00 : 0x00ff;
-               }
-       }
-
-       swap_buffers(fb_pixels);
-}
-
-static void swap_lfb(void *pixels)
-{
-       wait_vsync();
-       memcpy(vmem, pixels, fb_size);
-}
-
-static void swap_banked(void *pixels)
-{
-       int i, sz;
-       unsigned int pending;
-       unsigned char *pptr = pixels;
-       uint32_t offs = 0;
-
-       wait_vsync();
-
-       /* assume window is always at 0 at the beginning */
-       pending = fb_size;
-       while(pending > 0) {
-               sz = pending > vmode->bank_size ? vmode->bank_size : pending;
-               memcpy(vmem, pptr, sz);
-               pptr += sz;
-               pending -= sz;
-               vbe_setwin(0, ++offs);
-       }
-
-       vbe_setwin(0, 0);
+       quit = 1;
 }