-#include "src/tesuto.h"\r
-/*\r
-#include <stdio.h>\r
-#include <conio.h> // this is where Open Watcom hides the outp() etc. functions\r
-#include <ctype.h>\r
-#include <stdlib.h>\r
-#include <unistd.h>\r
-#include <assert.h>\r
-#include <fcntl.h>\r
-#include <math.h>\r
-#include <dos.h>\r
-*/\r
-\r
-global_game_variables_t gvar;\r
-\r
-#pragma pack(push,1)\r
-struct vrl_header {\r
- uint8_t vrl_sig[4]; // +0x00 "VRL1"\r
- uint8_t fmt_sig[4]; // +0x04 "VGAX"\r
- uint16_t height; // +0x08 Sprite height\r
- uint16_t width; // +0x0A Sprite width\r
- int16_t hotspot_x; // +0x0C Hotspot offset (X) for programmer's reference\r
- int16_t hotspot_y; // +0x0E Hotspot offset (Y) for programmer's reference\r
-}; // =0x10\r
-#pragma pack(pop)\r
-\r
-static unsigned char palette[768];\r
-\r
-void draw_vrl_modex(unsigned int x,unsigned int y,struct vrl_header *hdr,unsigned char *data,unsigned int datasz) {\r
- unsigned int vram_offset = (y * vga_stride) + (x >> 2);\r
- unsigned char *fence = data + datasz;\r
- unsigned char vga_plane = (x & 3);\r
- unsigned char run,skip,b;\r
- unsigned char far *draw;\r
-\r
- while (data < fence) {\r
- /* start of another vertical strip */\r
- draw = vga_graphics_ram + vram_offset;\r
- vga_write_sequencer(0x02/*map mask*/,1 << vga_plane);\r
-\r
- while (data < fence) {\r
- run = *data++;\r
- if (run == 0xFF) break;\r
- skip = *data++;\r
- draw += skip * vga_stride;\r
- if (run & 0x80) {\r
- b = *data++;\r
- while (run > 0x80) {\r
- *draw = b;\r
- draw += vga_stride;\r
- run--;\r
- }\r
- }\r
- else {\r
- while (run > 0) {\r
- *draw = *data++;\r
- draw += vga_stride;\r
- run--;\r
- }\r
- }\r
- }\r
-\r
- /* end of a vertical strip. next line? */\r
- if ((++vga_plane) == 4) {\r
- vram_offset++;\r
- vga_plane = 0;\r
- }\r
- }\r
-\r
- vga_write_sequencer(0x02/*map mask*/,0xF);\r
-}\r
-\r
-int main(int argc,char **argv) {\r
- struct vrl_header *vrl_header;\r
- unsigned char *buffer;\r
- unsigned int bufsz;\r
- int fd;\r
-\r
- if (argc < 3) {\r
- fprintf(stderr,"drawvrl <VRL file> <palette file>\n");\r
- return 1;\r
- }\r
-\r
- fd = open(argv[1],O_RDONLY|O_BINARY);\r
- if (fd < 0) {\r
- fprintf(stderr,"Unable to open '%s'\n",argv[1]);\r
- return 1;\r
- }\r
- {\r
- unsigned long sz = lseek(fd,0,SEEK_END);\r
- if (sz < sizeof(vrl_header)) return 1;\r
- if (sz >= 65535UL) return 1;\r
-\r
- bufsz = (unsigned int)sz;\r
- buffer = malloc(bufsz);\r
- if (buffer == NULL) return 1;\r
-\r
- lseek(fd,0,SEEK_SET);\r
- if ((unsigned int)read(fd,buffer,bufsz) < bufsz) return 1;\r
-\r
- vrl_header = (struct vrl_header*)buffer;\r
- if (memcmp(vrl_header->vrl_sig,"VRL1",4) || memcmp(vrl_header->fmt_sig,"VGAX",4)) return 1;\r
- if (vrl_header->width == 0 || vrl_header->height == 0) return 1;\r
- }\r
- close(fd);\r
-\r
- probe_dos();\r
- if (!probe_vga()) {\r
- printf("VGA probe failed\n");\r
- return 1;\r
- }\r
- int10_setmode(19);\r
- update_state_from_vga();\r
- //vga_enable_256color_modex(); // VGA mode X\r
- VGAmodeX(1, &gvar);\r
-\r
- /* load color palette */\r
- fd = open(argv[2],O_RDONLY|O_BINARY);\r
- if (fd >= 0) {\r
- unsigned int i;\r
-\r
- read(fd,palette,768);\r
- close(fd);\r
-\r
- vga_palette_lseek(0);\r
- 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
- }\r
-\r
- draw_vrl_modex(0,0,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
- while (getch() != 13);\r
-\r
- {\r
- unsigned int i;\r
-\r
- for (i=1;i < 320;i++)\r
- draw_vrl_modex(i,0,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
- }\r
- while (getch() != 13);\r
-\r
- {\r
- unsigned int i;\r
-\r
- for (i=1;i < 200;i++)\r
- draw_vrl_modex(i,i,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
- }\r
- while (getch() != 13);\r
-\r
- int10_setmode(3);\r
- //VGAmodeX(0, &gvar);\r
- buffer = NULL;\r
- free(buffer);\r
- bufsz = 0;\r
- return 0;\r
-}\r
+#include "src/tesuto.h"
+
+static unsigned char palette[768];
+global_game_variables_t gvar;
+
+int main(int argc,char **argv) {
+ struct vrl1_vgax_header *vrl_header;
+ vrl1_vgax_offset_t *vrl_lineoffs;
+ unsigned char *buffer;
+ unsigned int bufsz;
+ int fd;
+
+ if (argc < 3) {
+ fprintf(stderr,"drawvrl <VRL file> <palette file>\n");
+ return 1;
+ }
+
+ fd = open(argv[1],O_RDONLY|O_BINARY);
+ if (fd < 0) {
+ fprintf(stderr,"Unable to open '%s'\n",argv[1]);
+ return 1;
+ }
+ {
+ unsigned long sz = lseek(fd,0,SEEK_END);
+ if (sz < sizeof(*vrl_header)) return 1;
+ if (sz >= 65535UL) return 1;
+
+ bufsz = (unsigned int)sz;
+ buffer = malloc(bufsz);
+ if (buffer == NULL) return 1;
+
+ lseek(fd,0,SEEK_SET);
+ if ((unsigned int)read(fd,buffer,bufsz) < bufsz) return 1;
+
+ vrl_header = (struct vrl1_vgax_header*)buffer;
+ if (memcmp(vrl_header->vrl_sig,"VRL1",4) || memcmp(vrl_header->fmt_sig,"VGAX",4)) return 1;
+ if (vrl_header->width == 0 || vrl_header->height == 0) return 1;
+ }
+ close(fd);
+
+ probe_dos();
+ if (!probe_vga()) {
+ printf("VGA probe failed\n");
+ return 1;
+ }
+ int10_setmode(19);
+ update_state_from_vga();
+ VGAmodeX(1, &gvar);
+ //vga_enable_256color_modex(); // VGA mode X
+
+
+ /* load color palette */
+ fd = open(argv[2],O_RDONLY|O_BINARY);
+ if (fd >= 0) {
+ unsigned int i;
+
+ read(fd,palette,768);
+ close(fd);
+
+ vga_palette_lseek(0);
+ for (i=0;i < 256;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2);
+ }
+
+ /* preprocess the sprite to generate line offsets */
+ vrl_lineoffs = vrl1_vgax_genlineoffsets(vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));
+ if (vrl_lineoffs == NULL) return 1;
+
+ draw_vrl1_vgax_modex(0,0,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));
+ while (getch() != 13);
+
+ {
+ unsigned int i;
+
+ for (i=1;i < 320;i++)
+ draw_vrl1_vgax_modex(i,0,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));
+ }
+ while (getch() != 13);
+
+ {
+ unsigned int i;
+
+ for (i=1;i < 200;i++)
+ draw_vrl1_vgax_modex(i,i,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));
+ }
+ while (getch() != 13);
+
+ {
+ unsigned int i;
+
+ for (i=(2 << 6)/*200%*/;i >= (1 << 4)/*25%*/;i--)
+ draw_vrl1_vgax_modexstretch(0,0,i,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));
+ }
+ while (getch() != 13);
+ {
+ unsigned int i;
+
+ for (i=(2 << 6)/*200%*/;i >= (1 << 4)/*25%*/;i--)
+ draw_vrl1_vgax_modexystretch(0,0,i,i,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));
+ }
+ while (getch() != 13);
+
+ int10_setmode(3);
+ //VGAmodeX(0, &gvar);
+ free(vrl_lineoffs);
+ buffer = NULL;
+ free(buffer);
+ bufsz = 0;
+ return 0;
+}
+