From 570061a671ec9bb43a69f9965690358f155a796e Mon Sep 17 00:00:00 2001 From: Thomas Cherryhomes Date: Sat, 24 Apr 2021 16:36:58 -0500 Subject: [PATCH 1/5] Add 512 byte sector support to diskTypeATR --- lib/sio/diskTypeAtr.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/sio/diskTypeAtr.cpp b/lib/sio/diskTypeAtr.cpp index 59efff938..3956a10a6 100644 --- a/lib/sio/diskTypeAtr.cpp +++ b/lib/sio/diskTypeAtr.cpp @@ -30,6 +30,8 @@ uint32_t DiskTypeATR::_sector_to_offset(uint16_t sectorNum) default: if (_disk_sector_size == 256) offset=((sectorNum-3)*256)+16+128; + else if (_disk_sector_size == 512) + offset=((sectorNum-3)*512)+16+128; else offset=((sectorNum-1)*128)+16; @@ -127,7 +129,7 @@ void DiskTypeATR::status(uint8_t statusbuff[4]) { statusbuff[0] = DISK_DRIVE_STATUS_CLEAR; - if (_disk_sector_size == 256) + if (_disk_sector_size > 128) statusbuff[0] |= DISK_DRIVE_STATUS_DOUBLE_DENSITY; if (_percomBlock.num_sides == 1) @@ -211,7 +213,7 @@ disktype_t DiskTypeATR::mount(FILE *f, uint32_t disksize) _disk_num_sectors = (num_paragraphs * 16) / num_bytes_sector; // Adjust sector size for the fact that the first three sectors are *always* 128 bytes - if (num_bytes_sector == 256) + if (num_bytes_sector > 128) _disk_num_sectors += 2; derive_percom_block(_disk_num_sectors); From da6548532e0e1ba1529117fe366c1ebf3c2b7634 Mon Sep 17 00:00:00 2001 From: Thomas Cherryhomes Date: Sat, 24 Apr 2021 19:05:49 -0500 Subject: [PATCH 2/5] ensyure 512 byte sectors are always 512 bytes. --- lib/sio/diskType.cpp | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/sio/diskType.cpp b/lib/sio/diskType.cpp index 32ef551af..4da9496e5 100644 --- a/lib/sio/diskType.cpp +++ b/lib/sio/diskType.cpp @@ -15,7 +15,10 @@ // SectorNum is 1-based uint16_t DiskType::sector_size(uint16_t sectornum) { - return sectornum <= 3 ? 128 : _disk_sector_size; + if (_disk_sector_size == 512) + return 512; + else + return sectornum <= 3 ? 128 : _disk_sector_size; } // Default WRITE is not implemented @@ -139,23 +142,36 @@ void DiskType::unmount() disktype_t DiskType::discover_disktype(const char *filename) { int l = strlen(filename); - if(l > 4 && filename[l - 4] == '.') + if (l > 4 && filename[l - 4] == '.') { // Check the last 3 characters of the string const char *ext = filename + l - 3; - if(strcasecmp(ext, "XEX") == 0) { + if (strcasecmp(ext, "XEX") == 0) + { return DISKTYPE_XEX; - } else if(strcasecmp(ext, "COM") == 0) { + } + else if (strcasecmp(ext, "COM") == 0) + { return DISKTYPE_XEX; - } else if(strcasecmp(ext, "BIN") == 0) { + } + else if (strcasecmp(ext, "BIN") == 0) + { return DISKTYPE_XEX; - } else if(strcasecmp(ext, "ATR") == 0) { + } + else if (strcasecmp(ext, "ATR") == 0) + { return DISKTYPE_ATR; - } else if(strcasecmp(ext, "ATX") == 0) { + } + else if (strcasecmp(ext, "ATX") == 0) + { return DISKTYPE_ATX; - } else if(strcasecmp(ext, "CAS") == 0) { + } + else if (strcasecmp(ext, "CAS") == 0) + { return DISKTYPE_CAS; - } else if(strcasecmp(ext, "WAV") == 0) { + } + else if (strcasecmp(ext, "WAV") == 0) + { return DISKTYPE_WAV; } } From 8b875b91ba03dae41c7e784b62e31cc9ac81115c Mon Sep 17 00:00:00 2001 From: Thomas Cherryhomes Date: Sat, 24 Apr 2021 19:06:06 -0500 Subject: [PATCH 3/5] add constant for 512 byte sects. --- lib/sio/diskType.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/sio/diskType.h b/lib/sio/diskType.h index 0bcc6e1fd..006cc3986 100644 --- a/lib/sio/diskType.h +++ b/lib/sio/diskType.h @@ -5,10 +5,11 @@ #define INVALID_SECTOR_VALUE 65536 -#define DISK_SECTORBUF_SIZE 256 +#define DISK_SECTORBUF_SIZE 512 #define DISK_BYTES_PER_SECTOR_SINGLE 128 #define DISK_BYTES_PER_SECTOR_DOUBLE 256 +#define DISK_BYTES_PER_SECTOR_DOUBLE_DOUBLE 512 #define DISK_CTRL_STATUS_CLEAR 0x00 #define DISK_CTRL_STATUS_BUSY 0x01 From 9db7b6ee8dc2325cca7b145e5852f42008d27f5d Mon Sep 17 00:00:00 2001 From: Thomas Cherryhomes Date: Sat, 24 Apr 2021 19:06:55 -0500 Subject: [PATCH 4/5] inhibit 128 byte sectors for sector size 512. --- lib/sio/diskTypeAtr.cpp | 75 +++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/lib/sio/diskTypeAtr.cpp b/lib/sio/diskTypeAtr.cpp index 3956a10a6..9eac4703b 100644 --- a/lib/sio/diskTypeAtr.cpp +++ b/lib/sio/diskTypeAtr.cpp @@ -18,24 +18,29 @@ uint32_t DiskTypeATR::_sector_to_offset(uint16_t sectorNum) switch (sectorNum) { - case 1: - offset=16; - break; - case 2: - offset=144; - break; - case 3: - offset=272; - break; - default: - if (_disk_sector_size == 256) - offset=((sectorNum-3)*256)+16+128; - else if (_disk_sector_size == 512) - offset=((sectorNum-3)*512)+16+128; - else - offset=((sectorNum-1)*128)+16; - - break; + case 1: + offset = 16; + break; + case 2: + if (_disk_sector_size == 512) + offset = 528; + else + offset = 144; + break; + case 3: + if (_disk_sector_size == 512) + offset = 1040; + else + offset = 272; + break; + default: + if (_disk_sector_size == 256) + offset = ((sectorNum - 3) * 256) + 16 + 128; + else if (_disk_sector_size == 512) + offset = (sectorNum * 512) + 16; + else + offset = ((sectorNum - 1) * 128) + 16; + break; } return offset; @@ -49,9 +54,9 @@ bool DiskTypeATR::read(uint16_t sectornum, uint16_t *readcount) *readcount = 0; // Return an error if we're trying to read beyond the end of the disk - if(sectornum > _disk_num_sectors) + if (sectornum > _disk_num_sectors) { - Debug_printf("::read sector %d > %d\n", sectornum, _disk_num_sectors); + Debug_printf("::read sector %d > %d\n", sectornum, _disk_num_sectors); return true; } @@ -86,7 +91,7 @@ bool DiskTypeATR::write(uint16_t sectornum, bool verify) Debug_printf("ATR WRITE\n", sectornum, _disk_num_sectors); // Return an error if we're trying to write beyond the end of the disk - if(sectornum > _disk_num_sectors) + if (sectornum > _disk_num_sectors) { Debug_printf("::write sector %d > %d\n", sectornum, _disk_num_sectors); return true; @@ -138,7 +143,7 @@ void DiskTypeATR::status(uint8_t statusbuff[4]) if (_percomBlock.sectors_per_trackL == 26) statusbuff[0] |= DISK_DRIVE_STATUS_ENHANCED_DENSITY; - statusbuff[1] = ~ _disk_controller_status; // Negate the controller status + statusbuff[1] = ~_disk_controller_status; // Negate the controller status } /* @@ -213,7 +218,7 @@ disktype_t DiskTypeATR::mount(FILE *f, uint32_t disksize) _disk_num_sectors = (num_paragraphs * 16) / num_bytes_sector; // Adjust sector size for the fact that the first three sectors are *always* 128 bytes - if (num_bytes_sector > 128) + if (num_bytes_sector == 256) _disk_num_sectors += 2; derive_percom_block(_disk_num_sectors); @@ -259,7 +264,8 @@ bool DiskTypeATR::create(FILE *f, uint16_t sectorSize, uint16_t numSectors) uint32_t total_size = numSectors * sectorSize; // Adjust for first 3 sectors always being single-density (we lose 384 bytes) - if (sectorSize > 128) + // we don't do this for 512 byte sectors + if (sectorSize == 256) total_size -= 384; // 3 * 128 uint32_t num_paragraphs = total_size / 16; @@ -276,23 +282,26 @@ bool DiskTypeATR::create(FILE *f, uint16_t sectorSize, uint16_t numSectors) atrHeader.secsizeH = HIBYTE_FROM_UINT16(sectorSize); Debug_printf("Write header to ATR: sec_size=%d, sectors=%d, paragraphs=%d, bytes=%d\n", - sectorSize, numSectors, num_paragraphs, total_size); + sectorSize, numSectors, num_paragraphs, total_size); uint32_t offset = fwrite(&atrHeader, 1, sizeof(atrHeader), f); // Write first three 128 uint8_t sectors - uint8_t blank[256] = {0}; + uint8_t blank[512] = {0}; - for (int i = 0; i < 3; i++) + if (sectorSize < 512) { - size_t out = fwrite(blank, 1, 128, f); - if (out != 128) + for (int i = 0; i < 3; i++) { - Debug_printf("Error writing sector %hhu\n", i); - return false; + size_t out = fwrite(blank, 1, 128, f); + if (out != 128) + { + Debug_printf("Error writing sector %hhu\n", i); + return false; + } + offset += 128; + numSectors--; } - offset += 128; - numSectors--; } // Write the rest of the sectors via sparse seek to the last sector From 17982d965db032b30dc7704921bdabe9ed1e06de Mon Sep 17 00:00:00 2001 From: Thomas Cherryhomes Date: Sat, 24 Apr 2021 19:07:21 -0500 Subject: [PATCH 5/5] bump version. --- include/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/version.h b/include/version.h index f201d80c9..21b61083b 100644 --- a/include/version.h +++ b/include/version.h @@ -10,8 +10,8 @@ #define FN_VERSION_MAJOR 0 #define FN_VERSION_MINOR 5 -#define FN_VERSION_BUILD "be0c875e" +#define FN_VERSION_BUILD "570061a6" -#define FN_VERSION_DATE "2021-04-21 04:21:51" +#define FN_VERSION_DATE "2021-04-25 00:00:38" -#define FN_VERSION_FULL "0.5.be0c875e" +#define FN_VERSION_FULL "0.5.570061a6"