549ae6d50a49a00e52a0bd627bdad8221b02f6b9
[dos_low3d] / src / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <conio.h>
5 #include <dos.h>
6 #include "video.h"
7 #include "3dgfx.h"
8 #include "util.h"
9
10 void update(void);
11 void handle_key(int key);
12 void interrupt timer_intr();
13
14 static int quit;
15 static unsigned char *fb;
16
17 static volatile unsigned long nticks;
18
19 static void interrupt (*prev_timer_intr)();
20
21 int main(void)
22 {
23         long rate, nframes = 0;
24         long tstart, tdur;
25
26         if(!(fb = malloc(64000))) {
27                 fprintf(stderr, "failed to allocate framebuffer\n");
28                 return 1;
29         }
30
31         init_video();
32
33         g3d_init();
34         g3d_framebuffer(320, 200, fb);
35
36         prev_timer_intr = _dos_getvect(0x1c);
37         _dos_setvect(0x1c, timer_intr);
38         _disable();
39         tstart = nticks;
40         _enable();
41
42         for(;;) {
43                 while(kbhit()) {
44                         int c = getch();
45                         handle_key(c);
46                         if(quit) goto end;
47                 }
48
49                 update();
50                 nframes++;
51         }
52
53 end:
54         _disable();
55         tdur = nticks - tstart;
56         _enable();
57         _dos_setvect(0x1c, prev_timer_intr);
58
59         close_video();
60         free(fb);
61
62         rate = nframes * 100 * 18 / tdur;
63         printf("%ld frames in %ld sec, rate: %ld.%ld\n", nframes, tdur / 18,
64                         rate / 100, rate % 100);
65         return 0;
66 }
67
68 struct g3d_vertex varr[] = {
69         {0, 0x8000, 0, 0x10000},
70         {-0x8f00, -0x8000, 0, 0x10000},
71         {0x8c00, -0x6000, 0, 0x10000}
72 };
73
74 void mat_rotz(int32_t *m, int theta)
75 {
76         m[0] = XCOS(theta);
77         m[1] = XSIN(theta);
78         m[4] = -XSIN(theta);
79         m[5] = XCOS(theta);
80         m[10] = 0x10000;
81         m[15] = 0x10000;
82         m[2] = m[3] = m[6] = m[7] = m[8] = m[9] = m[11] = m[12] = m[13] = m[14] = 0;
83 }
84
85 void update(void)
86 {
87         int32_t xform[16];
88
89         vid_clearfb(fb);
90
91         mat_rotz(xform, nticks);
92         g3d_modelview(xform);
93
94         g3d_color(15);
95         g3d_draw(G3D_TRIANGLES, varr, sizeof varr / sizeof *varr);
96
97         /*wait_vsync();*/
98         vid_copyfb(fb);
99 }
100
101 void handle_key(int key)
102 {
103         switch(key) {
104         case 27:
105                 quit = 1;
106                 break;
107         }
108 }
109
110 void interrupt timer_intr()
111 {
112         nticks++;
113         _chain_intr(prev_timer_intr);
114 }