]> 4ch.mooo.com Git - 16.git/blob - src/tesuto.c
wwwwwwwwwwwwwwwwww
[16.git] / src / tesuto.c
1 #include "src/tesuto.h"\r
2 /*\r
3 #include <stdio.h>\r
4 #include <conio.h> // this is where Open Watcom hides the outp() etc. functions\r
5 #include <ctype.h>\r
6 #include <stdlib.h>\r
7 #include <unistd.h>\r
8 #include <assert.h>\r
9 #include <fcntl.h>\r
10 #include <math.h>\r
11 #include <dos.h>\r
12 */\r
13 \r
14 global_game_variables_t gvar;\r
15 \r
16 #pragma pack(push,1)\r
17 struct vrl_header {\r
18         uint8_t                 vrl_sig[4];             // +0x00  "VRL1"\r
19         uint8_t                 fmt_sig[4];             // +0x04  "VGAX"\r
20         uint16_t                height;                 // +0x08  Sprite height\r
21         uint16_t                width;                  // +0x0A  Sprite width\r
22         int16_t                 hotspot_x;              // +0x0C  Hotspot offset (X) for programmer's reference\r
23         int16_t                 hotspot_y;              // +0x0E  Hotspot offset (Y) for programmer's reference\r
24 };                                                      // =0x10\r
25 #pragma pack(pop)\r
26 \r
27 static unsigned char palette[768];\r
28 \r
29 void draw_vrl_modex(unsigned int x,unsigned int y,struct vrl_header *hdr,unsigned char *data,unsigned int datasz) {\r
30         unsigned int vram_offset = (y * vga_stride) + (x >> 2);\r
31         unsigned char *fence = data + datasz;\r
32         unsigned char vga_plane = (x & 3);\r
33         unsigned char run,skip,b;\r
34         unsigned char far *draw;\r
35 \r
36         while (data < fence) {\r
37                 /* start of another vertical strip */\r
38                 draw = vga_graphics_ram + vram_offset;\r
39                 vga_write_sequencer(0x02/*map mask*/,1 << vga_plane);\r
40 \r
41                 while (data < fence) {\r
42                         run = *data++;\r
43                         if (run == 0xFF) break;\r
44                         skip = *data++;\r
45                         draw += skip * vga_stride;\r
46                         if (run & 0x80) {\r
47                                 b = *data++;\r
48                                 while (run > 0x80) {\r
49                                         *draw = b;\r
50                                         draw += vga_stride;\r
51                                         run--;\r
52                                 }\r
53                         }\r
54                         else {\r
55                                 while (run > 0) {\r
56                                         *draw = *data++;\r
57                                         draw += vga_stride;\r
58                                         run--;\r
59                                 }\r
60                         }\r
61                 }\r
62 \r
63                 /* end of a vertical strip. next line? */\r
64                 if ((++vga_plane) == 4) {\r
65                         vram_offset++;\r
66                         vga_plane = 0;\r
67                 }\r
68         }\r
69 \r
70         vga_write_sequencer(0x02/*map mask*/,0xF);\r
71 }\r
72 \r
73 int main(int argc,char **argv) {\r
74         struct vrl_header *vrl_header;\r
75         unsigned char *buffer;\r
76         unsigned int bufsz;\r
77         int fd;\r
78 \r
79         if (argc < 3) {\r
80                 fprintf(stderr,"drawvrl <VRL file> <palette file>\n");\r
81                 return 1;\r
82         }\r
83 \r
84         fd = open(argv[1],O_RDONLY|O_BINARY);\r
85         if (fd < 0) {\r
86                 fprintf(stderr,"Unable to open '%s'\n",argv[1]);\r
87                 return 1;\r
88         }\r
89         {\r
90                 unsigned long sz = lseek(fd,0,SEEK_END);\r
91                 if (sz < sizeof(vrl_header)) return 1;\r
92                 if (sz >= 65535UL) return 1;\r
93 \r
94                 bufsz = (unsigned int)sz;\r
95                 buffer = malloc(bufsz);\r
96                 if (buffer == NULL) return 1;\r
97 \r
98                 lseek(fd,0,SEEK_SET);\r
99                 if ((unsigned int)read(fd,buffer,bufsz) < bufsz) return 1;\r
100 \r
101                 vrl_header = (struct vrl_header*)buffer;\r
102                 if (memcmp(vrl_header->vrl_sig,"VRL1",4) || memcmp(vrl_header->fmt_sig,"VGAX",4)) return 1;\r
103                 if (vrl_header->width == 0 || vrl_header->height == 0) return 1;\r
104         }\r
105         close(fd);\r
106 \r
107         probe_dos();\r
108         if (!probe_vga()) {\r
109                 printf("VGA probe failed\n");\r
110                 return 1;\r
111         }\r
112         int10_setmode(19);\r
113         update_state_from_vga();\r
114         //vga_enable_256color_modex(); // VGA mode X\r
115         VGAmodeX(1, &gvar);\r
116 \r
117         /* load color palette */\r
118         fd = open(argv[2],O_RDONLY|O_BINARY);\r
119         if (fd >= 0) {\r
120                 unsigned int i;\r
121 \r
122                 read(fd,palette,768);\r
123                 close(fd);\r
124 \r
125                 vga_palette_lseek(0);\r
126                 for (i=0;i < 256;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2);\r
127         }\r
128 \r
129         draw_vrl_modex(0,0,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
130         while (getch() != 13);\r
131 \r
132         {\r
133                 unsigned int i;\r
134 \r
135                 for (i=1;i < 320;i++)\r
136                         draw_vrl_modex(i,0,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
137         }\r
138         while (getch() != 13);\r
139 \r
140         {\r
141                 unsigned int i;\r
142 \r
143                 for (i=1;i < 200;i++)\r
144                         draw_vrl_modex(i,i,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
145         }\r
146         while (getch() != 13);\r
147 \r
148         int10_setmode(3);\r
149         //VGAmodeX(0, &gvar);\r
150         buffer = NULL;\r
151         free(buffer);\r
152         bufsz = 0;\r
153         return 0;\r
154 }\r