From c84df7b7e4528911bf286ce5e40ffe72afacd013 Mon Sep 17 00:00:00 2001 From: Claus 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, §or); + int direntryindex = find_file(type, image, file->localname, &track, §or, &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