Blob Blame History Raw
From c84df7b7e4528911bf286ce5e40ffe72afacd013 Mon Sep 17 00:00:00 2001
From: Claus <claus@protovision.games>
Date: Mon, 14 Jan 2019 18:49:00 +0100
Subject: [PATCH 01/30] Added -B switch to specify DIR block size. Also made
 the actual block size the default for loop files (was always 0 before).

---
 cc1541.c                  | 43 +++++++++++++++++++++++---------
 test_cc1541/test_cc1541.c | 52 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 11 deletions(-)

diff --git a/cc1541.c b/cc1541.c
index 8bf507f..1e45275 100644
--- a/cc1541.c
+++ b/cc1541.c
@@ -71,6 +71,7 @@ typedef struct
     int track;
     int sector;
     int nrSectors;
+    int nrSectorsShown;
     int mode;
 } imagefile;
 
@@ -97,7 +98,7 @@ void
 usage()
 {
     printf("\n*** This is cc1541 version " VERSION " built on " __DATE__ " ***\n\n");
-    printf("Usage: cc1541 -niFSsfeErbcwlxtdu45q image.[d64|g64|d71]\n\n");
+    printf("Usage: cc1541 -niFSsfeErbcwlBxtdu45q image.[d64|g64|d71]\n\n");
     printf("-n diskname   Disk name, default='DEFAULT'.\n");
     printf("-i id         Disk ID, default='LODIS'.\n");
     printf("-F            Next file first sector on a new track (default=3).\n");
@@ -124,6 +125,8 @@ usage()
     printf("              local name is used. After file written, the filename is unset.\n");
     printf("-l filename   Write loop file (an additional dir entry) to existing file to\n");
     printf("              disk, set filename with -f.\n");
+    printf("-B numblocks  Write the given value as file size in blocks to the directory for\n");
+    printf("              the next file.\n");    
     printf("-x            Don't split files over dirtrack hole (default split files).\n");
     printf("-t            Use dirtrack to also store files (makes -x useless) (default no).\n");
     printf("-d track      Maintain a shadow directory (copy of the actual directory).\n");
@@ -558,7 +561,7 @@ wipe_file(image_type type, unsigned char* image, unsigned int track, unsigned in
 }
 
 static int
-find_file(image_type type, unsigned char* image, char* filename, unsigned char *track, unsigned char *sector)
+find_file(image_type type, unsigned char* image, char* filename, unsigned char *track, unsigned char *sector, unsigned int *numblocks)
 {
     int direntryindex = 0;
 
@@ -575,7 +578,7 @@ find_file(image_type type, unsigned char* image, char* filename, unsigned char *
                     if (dirstrcmp((char *) image + dirblock + entryOffset + FILENAMEOFFSET, filename) == 0) {
                         *track = image[dirblock + entryOffset + FILETRACKOFFSET];
                         *sector = image[dirblock + entryOffset + FILESECTOROFFSET];
-
+						*numblocks = image[dirblock + entryOffset + FILEBLOCKSLOOFFSET] + 256*image[dirblock + entryOffset + FILEBLOCKSHIOFFSET];
                         return direntryindex;
                     }
                     break;
@@ -852,7 +855,7 @@ write_files(image_type type, unsigned char* image, imagefile* files, int num_fil
 
         if (file->mode & MODE_LOOPFILE) {
             /* find loopfile source files */
-            int direntryindex = find_file(type, image, file->localname, &track, &sector);
+            int direntryindex = find_file(type, image, file->localname, &track, &sector, &file->nrSectors);
             if (direntryindex >= 0) {
                 file->track = track;
                 file->sector = sector;
@@ -862,16 +865,19 @@ write_files(image_type type, unsigned char* image, imagefile* files, int num_fil
                 image[entryOffset + FILETRACKOFFSET] = file->track;
                 image[entryOffset + FILESECTOROFFSET] = file->sector;
 
-                image[entryOffset + FILEBLOCKSLOOFFSET] = 0;
-                image[entryOffset + FILEBLOCKSHIOFFSET] = 0;
+				if (file->nrSectorsShown == -1) {
+					file->nrSectorsShown = file->nrSectors;
+				}
+                image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectorsShown % 256;
+                image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectorsShown / 256;
 
                 if (shadowdirtrack > 0) {
                     entryOffset = linear_sector(type, shadowdirtrack, file->direntrysector) * BLOCKSIZE + file->direntryoffset;
                     image[entryOffset + FILETRACKOFFSET] = file->track;
                     image[entryOffset + FILESECTOROFFSET] = file->sector;
 
-                    image[entryOffset + FILEBLOCKSLOOFFSET] = 0;
-                    image[entryOffset + FILEBLOCKSHIOFFSET] = 0;
+                    image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectors;
+                    image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectors;
                 }
 
                 continue;
@@ -1155,8 +1161,11 @@ write_files(image_type type, unsigned char* image, imagefile* files, int num_fil
         image[entryOffset + FILETRACKOFFSET] = file->track;
         image[entryOffset + FILESECTOROFFSET] = file->sector;
 
-        image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectors & 255;
-        image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectors >> 8;
+		if (file->nrSectorsShown < 0) {
+			file->nrSectorsShown = file->nrSectors;
+		}
+        image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectorsShown & 255;
+        image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectorsShown >> 8;
 
         if (shadowdirtrack > 0) {
             entryOffset = linear_sector(type, shadowdirtrack, file->direntrysector) * BLOCKSIZE + file->direntryoffset;
@@ -1372,6 +1381,7 @@ main(int argc, char* argv[])
     int sectorInterleave = 0;
     int dir_sector_interleave = 3;
     int numdirblocks = 2;
+    int nrSectorsShown = -1;
     char* filename = NULL;
     int set_header = 0;
 
@@ -1468,6 +1478,7 @@ main(int argc, char* argv[])
                 files[nrFiles].sectorInterleave = sectorInterleave ? sectorInterleave : defaultSectorInterleave;
                 files[nrFiles].first_sector_new_track = first_sector_new_track;
                 files[nrFiles].nrSectors = 0;
+                files[nrFiles].nrSectorsShown = nrSectorsShown;                
                 nrFiles++;
             } else {
                 fprintf(stderr, "File '%s' (%d) not found\n", argv[j + 1], nrFiles + 1);
@@ -1477,6 +1488,7 @@ main(int argc, char* argv[])
             filename = NULL;
             first_sector_new_track = default_first_sector_new_track;
             sectorInterleave = 0;
+            nrSectorsShown = -1;
             j++;
         } else if (strcmp(argv[j], "-x") == 0) {
             dirtracksplit = 0;
@@ -1492,7 +1504,16 @@ main(int argc, char* argv[])
                 printf("Error parsing argument for -u\n");
                 return -1;
             }
-        } else if (strcmp(argv[j], "-4") == 0) {
+		} else if (strcmp(argv[j], "-B") == 0) {
+			if ((argc < j + 2) || !sscanf(argv[++j], "%d", &nrSectorsShown)) {
+				printf("Error parsing argument for -B\n");
+				return -1;
+			}
+			if (nrSectorsShown < 0 || nrSectorsShown > 65535) {
+				printf("Argument must be between 0 and 65535 for -B\n");
+				return -1;
+			}
+		} else if (strcmp(argv[j], "-4") == 0) {
             type = IMAGE_D64_EXTENDED_SPEED_DOS;
         } else if (strcmp(argv[j], "-5") == 0) {
             type = IMAGE_D64_EXTENDED_DOLPHIN_DOS;
diff --git a/test_cc1541/test_cc1541.c b/test_cc1541/test_cc1541.c
index c6b6a93..f541add 100644
--- a/test_cc1541/test_cc1541.c
+++ b/test_cc1541/test_cc1541.c
@@ -557,6 +557,58 @@ main(int argc, char* argv[]) {
     remove("1.prg");
     remove("2.prg");
 
+	description = "File should have DIR block size 0 for -B";
+	test++;
+	create_value_file("1.prg", 3 * 254, 1);
+	if (run_binary_cleanup(binary, "-B 0 -w 1.prg", "image.d64", &image, &size) != NO_ERROR) {
+		printf("UNRESOLVED: %s\n", description);
+	}
+	else if (image[track_offset[17] + 256 + 30] == 0 && image[track_offset[17] + 256 + 31] == 0) {
+		passed++;
+	}
+	else {
+		printf("FAIL: %s\n", description);
+	}
+	remove("1.prg");
+
+	description = "File should have DIR block size 65535 for -B";
+	test++;
+	create_value_file("1.prg", 3 * 254, 1);
+	if (run_binary_cleanup(binary, "-B 65535 -w 1.prg", "image.d64", &image, &size) != NO_ERROR) {
+		printf("UNRESOLVED: %s\n", description);
+	}
+	else if (image[track_offset[17] + 256 + 30] == (char)255 && image[track_offset[17] + 256 + 31] == (char)255) {
+		passed++;
+	}
+	else {
+		printf("FAIL: %s\n", description);
+	}
+	remove("1.prg");
+
+    description = "Loop file should have actual DIR block size per default";
+    test++;
+    create_value_file("1.prg", 258 * 254, 1);
+    if (run_binary_cleanup(binary, "-w 1.prg -f LOOP.PRG -l 1.PRG", "image.d64", &image, &size) != NO_ERROR) {
+        printf("UNRESOLVED: %s\n", description);
+    } else if (image[track_offset[17] + 256 + 32 + 30] == 2 && image[track_offset[17] + 256 + 32 + 31] == 1) {
+        passed++;
+    } else {
+        printf("FAIL: %s\n", description);
+    }
+    remove("1.prg");
+   
+    description = "Loop file should have DIR block size 258 for -B";
+    test++;
+    create_value_file("1.prg", 39 * 254, 1);
+    if (run_binary/*_cleanup*/(binary, "-w 1.prg -f LOOP.PRG -B 258 -l 1.PRG", "image.d64", &image, &size) != NO_ERROR) {
+        printf("UNRESOLVED: %s\n", description);
+    } else if (image[track_offset[17] + 256 + 32 + 30] == 2 && image[track_offset[17] + 256 + 32 + 31] == 1) {
+        passed++;
+    } else {
+        printf("FAIL: %s\n", description);
+    }
+    remove("1.prg");
+
     /* clean up */
     if (image != NULL) {
         free(image);
-- 
2.21.0