diff --git a/DIST/with-mdc.deploy b/DIST/with-mdc.deploy index f6fd29d..57193f2 100644 --- a/DIST/with-mdc.deploy +++ b/DIST/with-mdc.deploy @@ -5,9 +5,9 @@ http://www.faddensoft.com/ CiderPress http://ciderpress.sourceforge.net/ 3.0.1 -39815 +39816 C:\DATA\faddenSoft\fs.ico -Copyright © 2009 faddenSoft, LLC. All rights reserved. +Copyright © 2009 CiderPress project authors. All rights reserved. C:\Src\CiderPress\DIST\ReadMe.txt C:\Src\CiderPress\DIST\License.txt diff --git a/LICENSE.txt b/LICENSE.txt index e08f947..e7adc74 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2007, FaddenSoft, LLC +Copyright (c) 2009, CiderPress project authors All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/app/CiderPress.rc b/app/CiderPress.rc index 233d568..2378fb7 100644 --- a/app/CiderPress.rc +++ b/app/CiderPress.rc @@ -217,27 +217,27 @@ END // Dialog // -IDD_ABOUTDLG DIALOGEX 0, 0, 212, 154 +IDD_ABOUTDLG DIALOGEX 0, 0, 237, 154 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "About CiderPress" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,7,132,50,14 - PUSHBUTTON "Credits",IDC_ABOUT_CREDITS,63,132,50,14,0,0, + PUSHBUTTON "Credits",IDC_ABOUT_CREDITS,77,132,50,14,0,0, HIDC_ABOUT_CREDITS - PUSHBUTTON "Enter registration code",IDC_ABOUT_ENTER_REG,119,132,86, + PUSHBUTTON "Enter registration code",IDC_ABOUT_ENTER_REG,144,132,86, 14 CONTROL 106,IDC_STATIC,"Static",SS_BITMAP,7,6,64,59 LTEXT "CiderPress v%d.%d.%d%s%s",IDC_CIDERPRESS_VERS_TEXT,77,7, - 128,9 - LTEXT "Copyright © 2009 by FaddenSoft, LLC.\rAll Rights Reserved.", - IDC_STATIC,77,20,128,19 - ICON IDR_MAINFRAME,IDC_STATIC,77,45,20,20 - ICON IDI_FILE_NUFX,IDC_STATIC,106,45,20,20 - ICON IDI_FILE_BINARY2,IDC_STATIC,136,45,20,20 - ICON IDI_FILE_DISKIMAGE,IDC_STATIC,166,45,20,20 - GROUPBOX "Libraries",IDC_STATIC,7,71,198,56 + 153,9 + LTEXT "Copyright © 2009 by CiderPress project authors\rAll Rights Reserved.", + IDC_STATIC,77,20,153,19 + ICON IDR_MAINFRAME,IDC_STATIC,77,45,21,20 + ICON IDI_FILE_NUFX,IDC_STATIC,106,45,21,20 + ICON IDI_FILE_BINARY2,IDC_STATIC,136,45,21,20 + ICON IDI_FILE_DISKIMAGE,IDC_STATIC,166,45,21,20 + GROUPBOX "Libraries",IDC_STATIC,7,71,223,56 LTEXT "Using NufxLib DLL v%d.%d.%d",IDC_NUFXLIB_VERS_TEXT,16, 82,170,10 LTEXT "Using DiskImg DLL v%d.%d.%d",IDC_DISKIMG_VERS_TEXT,16, @@ -1577,16 +1577,16 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "The end is nigh.\0" - VALUE "CompanyName", "FaddenSoft, LLC\0" + VALUE "CompanyName", "CiderPress Project\0" VALUE "FileDescription", "CiderPress\0" - VALUE "FileVersion", "2, 4, 6, 0\0" + VALUE "FileVersion", "3, 0, 1, 0\0" VALUE "InternalName", "CiderPress\0" - VALUE "LegalCopyright", "Copyright © 2007 FaddenSoft, LLC\0" + VALUE "LegalCopyright", "Copyright © 2009 CiderPress project authors\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "CiderPress.exe\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "CiderPress\0" - VALUE "ProductVersion", "2, 4, 6, 0\0" + VALUE "ProductVersion", "3, 0, 1, 0\0" VALUE "SpecialBuild", "\0" END END @@ -1609,7 +1609,7 @@ GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_ABOUTDLG, DIALOG BEGIN - RIGHTMARGIN, 205 + RIGHTMARGIN, 230 VERTGUIDE, 7 VERTGUIDE, 16 VERTGUIDE, 77 diff --git a/app/Help/CIDERPRESS.HLP b/app/Help/CIDERPRESS.HLP index 206bc16..27173d2 100644 Binary files a/app/Help/CIDERPRESS.HLP and b/app/Help/CIDERPRESS.HLP differ diff --git a/app/Help/CiderPress.hmp b/app/Help/CiderPress.hmp index be26d30..88ed4ca 100644 Binary files a/app/Help/CiderPress.hmp and b/app/Help/CiderPress.hmp differ diff --git a/app/MyApp.h b/app/MyApp.h index affe210..65c80d7 100644 --- a/app/MyApp.h +++ b/app/MyApp.h @@ -20,7 +20,7 @@ #define kAppMajorVersion 3 #define kAppMinorVersion 0 #define kAppBugVersion 1 -#define kAppDevString "a1" +#define kAppDevString "a2" /* * Windows application object. diff --git a/diskimg/CPM.cpp b/diskimg/CPM.cpp index 01e7566..6f970f9 100644 --- a/diskimg/CPM.cpp +++ b/diskimg/CPM.cpp @@ -12,6 +12,8 @@ * - Rumor has it that "sparse" files are possible. Not handled. * - I'm currently treating the directory as fixed-length. This may * not be correct. + * - Not handling special entries (volume label, date stamps, + * password control). * * As I have no practical experience with CP/M, this is the weakest of the * filesystem implementations. @@ -31,6 +33,7 @@ const int kVolDirBlock = 24; // track 3 sector 0 const int kVolDirCount = 4; // 4 prodos blocks const int kNoDataByte = 0xe5; const int kMaxUserNumber = 31; // 0-15 on some systems, 0-31 on others +const int kMaxSpecialUserNumber = 0x21; // 0x20 and 0x21 have special meanings const int kMaxExtent = 31; // extent counter, 0-31 /* @@ -59,8 +62,12 @@ TestImage(DiskImg* pImg, DiskImg::SectorOrder imageOrder) for (i = 0; i < DiskFSCPM::kFullDirSize/DiskFSCPM::kDirectoryEntryLen; i++) { if (*dptr != kNoDataByte) { - /* usually userNumber == 0, but sometimes not; must be <= 31 */ - if (*dptr > kMaxUserNumber) { + /* + * Usually userNumber is 0, but sometimes not. It's expected to + * be < 0x20 for a normal file, may be 0x21 or 0x22 for special + * entries (volume label, date stamps). + */ + if (*dptr > kMaxSpecialUserNumber) { dierr = kDIErrFilesystemNotFound; break; } @@ -70,11 +77,6 @@ TestImage(DiskImg* pImg, DiskImg::SectorOrder imageOrder) dierr = kDIErrFilesystemNotFound; break; } - /* value in S1 must be zero */ - if (dptr[13] != 0) { - dierr = kDIErrFilesystemNotFound; - break; - } /* check for a valid filename here; high bit may be set on some bytes */ unsigned char firstLet = *(dptr+1) & 0x7f; @@ -214,6 +216,11 @@ DiskFSCPM::ReadCatalog(void) if (fDirEntry[i].userNumber == kNoDataByte || fDirEntry[i].extent != 0) continue; + if (fDirEntry[i].userNumber > kMaxUserNumber) { + /* skip over volume label, date stamps, etc */ + WMSG1("Skipping entry with userNumber=0x%02x\n", + fDirEntry[i].userNumber); + } pFile = new A2FileCPM(this, fDirEntry); FormatName(pFile->fFileName, (char*)fDirEntry[i].fileName); @@ -620,8 +627,13 @@ A2FDCPM::Read(void* buf, size_t len, size_t* pActual) /* * Read one CP/M block (two ProDOS blocks) and pull out the * set of data that the user wants. + * + * On some Microsoft Softcard disks, the first three tracks hold + * file data rather than the system image. */ prodosBlock = DiskFSCPM::CPMToProDOSBlock(fBlockList[blkIndex]); + if (prodosBlock >= 280) + prodosBlock -= 280; dierr = fpFile->GetDiskFS()->GetDiskImg()->ReadBlock(prodosBlock, blkBuf); diff --git a/diskimg/DiskImg.h b/diskimg/DiskImg.h index 462a93e..151cc80 100644 --- a/diskimg/DiskImg.h +++ b/diskimg/DiskImg.h @@ -42,8 +42,8 @@ namespace DiskImgLib { /* compiled-against versions; call DiskImg::GetVersion for linked-against */ #define kDiskImgVersionMajor 4 -#define kDiskImgVersionMinor 5 -#define kDiskImgVersionBug 2 +#define kDiskImgVersionMinor 6 +#define kDiskImgVersionBug 0 /* diff --git a/diskimg/DiskImgDetail.h b/diskimg/DiskImgDetail.h index 44d02b7..8e6e336 100644 --- a/diskimg/DiskImgDetail.h +++ b/diskimg/DiskImgDetail.h @@ -2217,7 +2217,7 @@ public: }; // Contents of the raw 32-byte directory entry. // - // From http://www.seasip.demon.co.uk/Cpm/format22.html + // From http://www.seasip.demon.co.uk/Cpm/format31.html // // UU F1 F2 F3 F4 F5 F6 F7 F8 T1 T2 T3 EX S1 S2 RC .FILENAMETYP.... // AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL ................ @@ -2225,13 +2225,16 @@ public: // If the high bit of T1 is set, the file is read-only. If the high // bit of T2 is set, the file is a "system" file. // + // An entry with UU=0x20 indicates a CP/M 3.1 disk label entry. + // An entry with UU=0x21 indicates a time stamp entry (2.x or 3.x). + // // Files larger than (1024 * 16) have multiple "extent" entries, i.e. // entries with the same user number and file name. typedef struct DirEntry { unsigned char userNumber; // 0-15 or 0-31 (usually 0), e5=unused unsigned char fileName[kDirFileNameLen+1]; unsigned short extent; // extent (EX + S2 * 32) - unsigned char S1; // reserved, should be zero + unsigned char S1; // Last Record Byte Count (app-specific) unsigned char records; // #of 128-byte records in this extent unsigned char blocks[kDirEntryBlockCount]; bool readOnly; diff --git a/mdc/mdc.clw b/mdc/mdc.clw index a2992f9..aed7367 100644 --- a/mdc/mdc.clw +++ b/mdc/mdc.clw @@ -11,10 +11,10 @@ LastPage=0 ClassCount=2 ResourceCount=4 -Resource1=IDC_MDC +Resource1=IDD_ABOUTBOX Class1=AboutDlg Resource2="IDD_CHOOSE_FILES" -Resource3=IDD_ABOUTBOX +Resource3=IDC_MDC Class2=ProgressDlg Resource4=IDD_PROGRESS diff --git a/mdc/mdc.rc b/mdc/mdc.rc index 8cc523c..c8946c5 100644 --- a/mdc/mdc.rc +++ b/mdc/mdc.rc @@ -70,19 +70,19 @@ END // Dialog // -IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 133, 111 +IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 156, 111 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "About" FONT 10, "MS Sans Serif" BEGIN ICON IDI_MDC,IDC_MYICON,7,7,20,20 - LTEXT "MDC version %d.%d.%d",IDC_ABOUT_VERS,33,7,93,8, + LTEXT "MDC version %d.%d.%d",IDC_ABOUT_VERS,33,7,116,8, SS_NOPREFIX - LTEXT "Copyright © 2007 by FaddenSoft, LLC.\rAll Rights Reserved.", - IDC_STATIC,7,31,119,19 - DEFPUSHBUTTON "OK",IDOK,41,90,50,14 + LTEXT "Copyright © 2009 by CiderPress project authors.\rAll Rights Reserved.", + IDC_STATIC,7,31,142,19 + DEFPUSHBUTTON "OK",IDOK,53,90,50,14 LTEXT "This utility scans Apple II disk images and creates formatted listings of the files in them.", - IDC_STATIC,7,58,119,26 + IDC_STATIC,7,58,142,26 LTEXT "Multi-Disk Catalog",IDC_STATIC,33,15,55,8 END @@ -148,7 +148,7 @@ BEGIN IDD_ABOUTBOX, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 126 + RIGHTMARGIN, 149 VERTGUIDE, 33 TOPMARGIN, 7 BOTTOMMARGIN, 104