From ccbcf911d8e66a85004d95856b717038666fb77d Mon Sep 17 00:00:00 2001 From: sparky4 <sparky4@cock.li> Date: Thu, 15 Jun 2017 18:27:18 -0500 Subject: [PATCH] 16_ca needs huge amounts of work and I should remember what needs to be done soon[going to port rest of code to borland c some time so we can use the core components of id engine here ][going to add 16_us.c eventually but the debug system and CA_ PM_ and MM_ usage is priority now]older zcroll renamed to xcroll][zcroll is now the pre menu game loop system with PROPER data usage with CAMMPM] added 1st scroll back [i work on CA] palette debug show values added wwww and i need to know how to see vrs/vrl imaage data palette index numbers [i am trying to find out how the hell you get the index number values of VRL/VRS] [CA_CacheMap added seems to be used in start a new game] what is mapsegs? bcexmm reports normally again... it acts funny with a unsigned long being assigned coreleft()'s value[vrldbg.exe added for a dirivative of vrldbg thanks johncampbell321\!] --- makefile | 8 ++- src/lib/doslib | 2 +- src/vrldbg.c | 169 +++++++++++++++++++++++++++++++++++++++++++++++++ vrldbg | Bin 0 -> 6276 bytes 4 files changed, 176 insertions(+), 3 deletions(-) create mode 100755 src/vrldbg.c create mode 100755 vrldbg diff --git a/makefile b/makefile index 75c1241f..e8313efe 100755 --- a/makefile +++ b/makefile @@ -210,7 +210,8 @@ TESTEXEC = & tesuto.exe & 0tesuto.exe & maptest.exe & - imfplay.exe + imfplay.exe & + vrldbg.exe #zcroll.exe & TESTEXEC2 = & pcxtest.exe & @@ -232,7 +233,8 @@ SPRIUTILEXEC = & pcx2vrl & pcxsscut & vrl2vrs & - vrsdump + vrsdump & + vrldbg #UTILEXEC += $(SPRIUTILEXEC) !endif @@ -285,6 +287,7 @@ inputest.exe: inputest.$(OBJ) $(16LIB) $(DOSLIB) gfx.lib #inntest.exe: inntest.$(OBJ) $(16LIBNOINOBJS) 16_in_1.$(OBJ) $(DOSLIB) gfx.lib sountest.exe: sountest.$(OBJ) $(16LIB) $(DOSLIB) gfx.lib imfplay.exe: imfplay.$(OBJ) $(16LIB) $(DOSLIB) gfx.lib +vrldbg.exe: vrldbg.$(OBJ) #gfx.lib $(DOSLIB) pcxtest.exe: pcxtest.$(OBJ) gfx.lib $(DOSLIB) $(16LIB) vrstest.exe: vrstest.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) #vgacamm.exe: vgacamm.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) @@ -332,6 +335,7 @@ inputest.$(OBJ):$(SRC)/inputest.c #inntest.$(OBJ):$(SRC)/inntest.c sountest.$(OBJ): $(SRC)/sountest.c imfplay.$(OBJ): $(SRC)/imfplay.c +vrldbg.$(OBJ): $(SRC)/vrldbg.c #miditest.$(OBJ): $(SRC)/miditest.c #testemm.$(OBJ):$(SRC)/testemm.c #testemm0.$(OBJ): $(SRC)/testemm0.c diff --git a/src/lib/doslib b/src/lib/doslib index 2849e7c5..970fddf7 160000 --- a/src/lib/doslib +++ b/src/lib/doslib @@ -1 +1 @@ -Subproject commit 2849e7c5cd4c6647f57445b5f9cfa48c403077e6 +Subproject commit 970fddf745e08149bf4625052c4ea1e6dc42909e diff --git a/src/vrldbg.c b/src/vrldbg.c new file mode 100755 index 00000000..e6a409fc --- /dev/null +++ b/src/vrldbg.c @@ -0,0 +1,169 @@ +/* VRL run-length debugging tool. + * + * For sparky4 / Project 16 and anyone else needing to debug the VRL structure */ + +#include <stdio.h> +#include <fcntl.h> +#include <ctype.h> +#include <errno.h> +#include <assert.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "src/lib/doslib/hw/vga/vrl.h" +#include "src/lib/doslib/hw/vga/vrs.h" +#include "src/lib/doslib/hw/vga/pcxfmt.h" +#include "src/lib/doslib/hw/vga/comshtps.h" + +#ifndef O_BINARY +#define O_BINARY (0) +#endif + +static void help() { + fprintf(stderr,"VRLDBG (C) 2016 Jonathan Campbell\n"); + fprintf(stderr,"\n"); + fprintf(stderr,"vrldbg file\n"); +} + +int main(int argc,char **argv) { + unsigned char *base,*raw,*fence; + struct vrl1_vgax_header *hdr; + unsigned int x,y,cc; + size_t rawlen; + long l; + int fd; + + if (argc < 2) { + help(); + return 1; + } + + fd = open(argv[1],O_RDONLY|O_BINARY); + if (fd < 0) return 1; + l = (long)lseek(fd,0,SEEK_END); + if (l < 16 || l > VRL_MAX_SIZE) return 1; + rawlen = (size_t)l; + + base = raw = malloc(rawlen); + if (raw == NULL) return 1; + if (lseek(fd,0,SEEK_SET) != 0) return 1; + if (read(fd,raw,rawlen) != rawlen) return 1; + close(fd); + fence = raw + rawlen; + + hdr = (struct vrl1_vgax_header*)raw; + if (memcmp(hdr->vrl_sig,"VRL1",4)) return 1; + if (memcmp(hdr->fmt_sig,"VGAX",4)) return 1; + +#if 0 +#pragma pack(push,1) +struct vrl1_vgax_header { + uint8_t vrl_sig[4]; // +0x00 "VRL1" + uint8_t fmt_sig[4]; // +0x04 "VGAX" + uint16_t height; // +0x08 Sprite height + uint16_t width; // +0x0A Sprite width + int16_t hotspot_x; // +0x0C Hotspot offset (X) for programmer's reference + int16_t hotspot_y; // +0x0E Hotspot offset (Y) for programmer's reference +}; // =0x10 +#pragma pack(pop) +#endif + printf("VRL header:\n"); + printf(" vrl_sig: \"VRL1\"\n"); // already validated + printf(" fmt_sig: \"VGAX\"\n"); // already validated + printf(" height: %u pixels\n",hdr->height); + printf(" width: %u pixels\n",hdr->width); + printf(" hotspot_x: %d pixels\n",hdr->hotspot_x); + printf(" hotspot_y: %d pixels\n",hdr->hotspot_y); + + /* strips are encoded in column order, top to bottom. + * each column ends with a special code, which is a cue to begin the next column and decode more. + * each strip has a length and a skip count. the skip count is there to allow for sprite + * transparency by skipping pixels. + * + * the organization of this format is optimized for display on VGA hardware in "mode x" + * unchained 256-color mode (where the planar memory organization of the VGA is exposed) */ + raw = base + sizeof(*hdr); + for (x=0;x < hdr->width;x++) {/* for each column */ + printf("Begin column x=%u\n",x); + y=0; + + if (raw >= fence) { + printf("* unexpected end of data\n"); + break; + } + + /* each column is a series of vertical strips with a two byte header, until + * the first occurrence where the first byte is 0xFF. */ + do { + if (raw >= fence) { + printf("* unexpected end of data in column x=%u at y=%u\n",x,y); + break; + } + + if (*raw == 0xFF) {/* end of column */ + raw++; + break; + } + + if (*raw >= 0x80) { /* single-color run */ + if ((raw+3) > fence) { + printf("* unexpected end of data in column x=%u at y=%u with %u byte(s) left\n",x,y,(unsigned int)(fence-raw)); + break; + } + + { + /* <run length + 0x80)> <skip length> <color value> */ + unsigned char strip_len = (*raw++) - 0x80; + unsigned char skip_len = (*raw++); + unsigned char color = (*raw++); + + printf(" y=%u. after skip, y=%u. single-color strip length=%u + skip=%u with color=0x%02x\n", + y,y+skip_len,strip_len,skip_len,color); + + y += strip_len + skip_len; + } + } + else { /* copy strip */ + if ((raw+2) > fence) { + printf("* unexpected end of data in column x=%u at y=%u with %u byte(s) left\n",x,y,(unsigned int)(fence-raw)); + break; + } + + { + /* <run length> <skip length> [strip of pixels] */ + unsigned char strip_len = (*raw++); + unsigned char skip_len = (*raw++); + + printf(" y=%u. after skip, y=%u. strip length=%u + skip=%u\n", + y,y+skip_len,strip_len,skip_len); + + if ((raw+strip_len) > fence) { + printf("* unexpected end of data in strip x=%u at y=%u with %u byte(s) left\n",x,y,(unsigned int)(fence-raw)); + break; + } + + if (strip_len != 0) { + printf(" pixels: "); + for (cc=0;cc < strip_len;cc++) printf("0x%02x ",raw[cc]); + printf("\n"); + } + + y += strip_len + skip_len; + raw += strip_len; + } + } + } while(1); + + if (y > hdr->height) + printf("* warning: y coordinate y=%u overruns height of VRL height=%u\n",(unsigned int)y,(unsigned int)hdr->height); + } + + if (raw < fence) { + printf("* warning: %u bytes remain after decoding\n",(unsigned int)(fence-raw)); + } + + free(base); + return 0; +} diff --git a/vrldbg b/vrldbg new file mode 100755 index 0000000000000000000000000000000000000000..770288d0e42555377113e086ccb1273ea1bdc401 GIT binary patch literal 6276 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 R{dHE%)a_B&PPl-M`yX_Pk8l70 literal 0 HcmV?d00001 -- 2.39.5