+#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
-/*typedef unsigned char far *VGA_RAM_PTR;\r
-VGA_RAM_PTR vga_graphics_ram = (VGA_RAM_PTR)MK_FP(0xA000,0x0000);\r
-unsigned char vga_stride = 80; // 80 x 4 = 320 for 320-pixel wide modes\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 inline void vga_write_sequencer(unsigned char i,unsigned char c) {\r
- outp(0x3C4,i);\r
- outp(0x3C5,c);\r
-}*/\r
+static unsigned char palette[768];\r
\r
-void main()\r
-{\r
- printf("pee\n");\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
+\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
+ buffer = NULL;\r
+ free(buffer);\r
+ bufsz = 0;\r
+ return 0;\r
}\r