fixed video mode bugs
[eradicate] / src / dos / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "game.h"
5 #include "keyb.h"
6 #include "timer.h"
7 #include "gfx.h"
8 #include "logger.h"
9 #include "cdpmi.h"
10
11 static void draw(void);
12
13 static struct video_mode *vmode;
14
15
16 int main(int argc, char **argv)
17 {
18         struct video_mode *vmodes;
19         int vmidx;
20
21         init_logger("game.log");
22
23         init_timer(100);
24         kb_init(32);
25
26         if(init_video() == -1) {
27                 return 1;
28         }
29         vmodes = video_modes();
30
31         if((vmidx = match_video_mode(640, 480, 16)) == -1) {
32                 return 1;
33         }
34         if(!(vmem = set_video_mode(vmidx, 1))) {
35                 return 1;
36         }
37         vmode = vmodes + vmidx;
38
39         fb_width = vmode->xsz;
40         fb_height = vmode->ysz;
41         fb_size = (vmode->xsz * vmode->bpp / 8) * vmode->ysz;
42
43         reset_timer();
44
45         for(;;) {
46                 int key;
47                 while((key = kb_getkey()) != -1) {
48                         if(key == 27) goto break_evloop;
49                 }
50
51                 time_msec = get_msec();
52                 draw();
53         }
54
55 break_evloop:
56         set_text_mode();
57         cleanup_video();
58         kb_shutdown();
59         return 0;
60 }
61
62 static void draw(void)
63 {
64         int i, j;
65         uint16_t *pptr = vmem;
66
67         for(i=0; i<fb_height; i++) {
68                 for(j=0; j<fb_width; j++) {
69                         int chess = ((i >> 4) & 1) == ((j >> 4) & 1);
70                         *pptr++ = chess ? 0xff00 : 0x00ff;
71                 }
72         }
73 }
74
75 void swap_buffers(void *pixels)
76 {
77         wait_vsync();
78         memcpy(vmem, pixels, fb_size);
79 }