pulled in and adapted the dos code from eradicate
[retrobench] / src / dos / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <conio.h>
4 #include "rbench.h"
5 #include "timer.h"
6 #include "gfx.h"
7 #include "logger.h"
8 #include "cdpmi.h"
9
10 static int parse_args(int argc, char **argv);
11
12 static struct video_mode *vidmode;
13
14 int main(int argc, char **argv)
15 {
16         int vmidx;
17         int num_frames = 0;
18         void *vmem;
19
20         read_config("rbench.cfg");
21
22         if(parse_args(argc, argv) == -1) {
23                 return 1;
24         }
25
26 #ifdef __DJGPP__
27         __djgpp_nearptr_enable();
28 #endif
29
30         init_logger("rbench.log");
31
32         if(init_video() == -1) {
33                 return 1;
34         }
35
36         if((vmidx = match_video_mode(opt.width, opt.height, opt.bpp)) == -1) {
37                 return 1;
38         }
39         if(!(vmem = set_video_mode(vmidx, 1))) {
40                 return 1;
41         }
42         vidmode = get_video_mode(vmidx);
43
44         fb_rmask = vidmode->rmask;
45         fb_gmask = vidmode->gmask;
46         fb_bmask = vidmode->bmask;
47         fb_rshift = vidmode->rshift;
48         fb_gshift = vidmode->gshift;
49         fb_bshift = vidmode->bshift;
50
51         init_timer(100);
52
53         for(;;) {
54                 while(kbhit()) {
55                         int c = getch();
56                         if(c == 27) goto end;
57                         key_event(c, 1);
58                 }
59
60                 time_msec = get_msec();
61                 num_frames++;
62                 redraw();
63
64                 blit_frame(framebuf, 0);
65         }
66
67 end:
68         set_text_mode();
69         cleanup_video();
70
71         if(num_frames) {
72                 printf("avg framerate: %.1f fps\n", (10000 * num_frames / time_msec) / 10.0f);
73         }
74         return 0;
75 }
76
77 int resizefb(int x, int y, int bpp)
78 {
79         free(framebuf);
80
81         fb_width = x;
82         fb_height = y;
83         fb_bpp = bpp;
84         fb_pitch = x * bpp / 8;
85
86         if(!(framebuf = malloc(fb_pitch * fb_height))) {
87                 fprintf(stderr, "failed to allocate %dx%d (%dbpp) framebuffer\n",
88                                 fb_width, fb_height, fb_bpp);
89                 return -1;
90         }
91         return 0;
92 }
93
94 static const char *usage_str =
95         "Usage: %s [options]\n"
96         "Options:\n"
97         "  -s <WxH>: resolution\n"
98         "  -b <bpp>: color depth\n"
99         "  -h: print usage and exit\n";
100
101 static int parse_args(int argc, char **argv)
102 {
103         int i;
104
105         for(i=1; i<argc; i++) {
106                 if(argv[i][0] == '-') {
107                         if(argv[i][2]) {
108                                 goto inval_arg;
109                         }
110                         switch(argv[i][1]) {
111                         case 's':
112                                 if(!argv[++i] || sscanf(argv[i], "%dx%d", &opt.width, &opt.height) != 2) {
113                                         fprintf(stderr, "-s must be followed by WxH\n");
114                                         return -1;
115                                 }
116                                 break;
117
118                         case 'b':
119                                 if(!argv[++i] || !(opt.bpp = atoi(argv[i]))) {
120                                         fprintf(stderr, "-b must be followed by the color depth\n");
121                                         return -1;
122                                 }
123                                 break;
124
125                         case 'h':
126                                 printf(usage_str, argv[0]);
127                                 exit(0);
128
129                         default:
130                                 goto inval_arg;
131                         }
132                 } else {
133 inval_arg:      fprintf(stderr, "invalid argument: %s\n", argv[i]);
134                         return -1;
135                 }
136         }
137         return 0;
138 }
139