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