From 8ef965293571279a8e7d008697ed69184bd559af Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Wed, 1 Apr 2026 17:20:52 +0100 Subject: [PATCH] Updates to MZQD Tool for Sharp MZ Series QD image creation --- projects/tzpuPico/tools/MZQDTool | Bin 0 -> 17320 bytes projects/tzpuPico/tools/MZQDTool.c | 385 ----------------------------- 2 files changed, 385 deletions(-) create mode 100755 projects/tzpuPico/tools/MZQDTool delete mode 100755 projects/tzpuPico/tools/MZQDTool.c diff --git a/projects/tzpuPico/tools/MZQDTool b/projects/tzpuPico/tools/MZQDTool new file mode 100755 index 0000000000000000000000000000000000000000..eaa207753872b77ae42528fe0dc98342e875ef42 GIT binary patch literal 17320 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 literal 0 HcmV?d00001 diff --git a/projects/tzpuPico/tools/MZQDTool.c b/projects/tzpuPico/tools/MZQDTool.c deleted file mode 100755 index f18f642..0000000 --- a/projects/tzpuPico/tools/MZQDTool.c +++ /dev/null @@ -1,385 +0,0 @@ -#define VERSION "0.30" - -#define FMS 0xEFFF - -#include -#include -#include - - -#define FALSE 0 -#define TRUE 1 - -#define QDSIZE 61455 -#define MAXQDFILETYPES 12 - - - -struct CMTHeaderStr -{ - unsigned char Attribute; - char Name[17]; - unsigned short Size; - unsigned short LoadAddress; - unsigned short ExecAddress; - char Comment[104]; -}; - - -struct QDHeaderStr -{ - unsigned char Attribute; - char Name[17]; - unsigned short Unknown; - unsigned short Size; - unsigned short LoadAddress; - unsigned short ExecAddress; - char Comment[38]; -}; - - -char QDFileTypes[MAXQDFILETYPES][4] = { - "???", - "OBJ", - "BTX", - "BSD", - "BRD", - "RB ", - "???", - "LIB", - "???", - "???", - "SYS", - "GR " - }; - - -unsigned char QDArray[QDSIZE]; -unsigned short QDPtr; - - - - -void QDFormat(void) -{ - FILE *QDFile; - unsigned char QDFormatByte; - unsigned short Counter; - - - puts("Format"); - - - QDPtr = 0; - - QDArray[QDPtr++] = 0x00; // BREAK - QDArray[QDPtr++] = 0x16; // SYNC CHAR1 - QDArray[QDPtr++] = 0x16; // SYNC CHAR2 - QDArray[QDPtr++] = 0xA5; // SHARP SYNC - QDArray[QDPtr++] = 0x00; // 0 data blocks on disk - QDArray[QDPtr++] = 'C'; // CRC - QDArray[QDPtr++] = 'R'; // CRC - QDArray[QDPtr++] = 'C'; // - QDArray[QDPtr++] = 0x00; // BREAK - QDArray[QDPtr++] = 0x16; // SYNC CHAR1 - QDArray[QDPtr++] = 0x16; // SYNC CHAR2 - QDArray[QDPtr++] = 0xA5; -// 12 - QDFormatByte = 0xAA; - Counter = FMS - 65; // FMS 0xEFFF = 61439, 61455 - 61439 = 16 - do - { - QDFormatByte = ~QDFormatByte; - QDArray[QDPtr++] = QDFormatByte; - Counter--; - } while(Counter != 0); - - QDArray[QDPtr++] = 0x00; - QDArray[QDPtr++] = 'C'; // CRC - QDArray[QDPtr++] = 'R'; // CRC - QDArray[QDPtr++] = 'C'; // CRC - QDArray[QDPtr++] = 0x00; - - // *** ADD DIRECTORY TERMINATOR *** - uint32_t termPos = QDSIZE - 64; // Last 64 bytes - memset(&QDArray[termPos], 0, 64); - QDArray[termPos + 0] = 0x00; // BREAK - QDArray[termPos + 1] = 0x16; - QDArray[termPos + 2] = 0x16; - QDArray[termPos + 3] = 0xA5; - QDArray[termPos + 4] = 0x00; // attribute 0 = end of directory - QDArray[termPos + 5] = 0x40; // size low (64) - QDArray[termPos + 6] = 0x00; // size high - // rest zero - - if((QDFile = fopen("MZ700.QD", "wb")) != NULL) - { - fwrite(QDArray, QDSIZE, 1, QDFile); - fclose(QDFile); - } -} - - - - -unsigned short SeekSync(unsigned short Ptr) -{ - unsigned char SyncFound; - - - SyncFound = FALSE; - do - { - if(QDArray[Ptr++] == 0x16) - { - if(QDArray[Ptr++] == 0x16) SyncFound = TRUE; - else Ptr--; - } - } while(!SyncFound && (Ptr <= QDSIZE)); - - return(Ptr); -} - - - -void QDDir(void) -{ - FILE *QDFile; - unsigned char QDBlocks; - unsigned char Counter; - unsigned char QDFileType; - unsigned short QDBlockSize; - unsigned short PtrSave; - - - if((QDFile = fopen("MZ700.qd", "rb")) != NULL) - { - fread(QDArray, QDSIZE, 1, QDFile); - fclose(QDFile); - - QDPtr = 0; - QDPtr = SeekSync(QDPtr); - - QDPtr++; - QDBlocks = QDArray[QDPtr]; - - puts("DIRECTORY OF QD:"); - - for(Counter = 0; Counter < QDBlocks; Counter++) - { - QDPtr = SeekSync(QDPtr); - PtrSave = QDPtr; - - QDBlockSize = QDArray[QDPtr + 2]; - QDBlockSize = QDBlockSize + QDArray[QDPtr + 3] * 256; -// printf("BLSize: %u -> %04X\n", QDBlockSize, QDBlockSize); - - QDPtr++; - if(QDArray[QDPtr] == 0x00) - { - QDPtr += 3; - - QDFileType = QDArray[QDPtr++]; - if(QDFileType >= MAXQDFILETYPES) QDFileType = 0; - printf(" %s \"", QDFileTypes[QDFileType]); - do - { - printf("%c", QDArray[QDPtr++]); - } while(QDArray[QDPtr] != 0x0d); - puts("\""); - } - QDPtr = PtrSave + QDBlockSize; - } - puts("Ready"); - } -} - - - - -void AddFileToQD(char *MZFileName) -{ - FILE *QDFile; - FILE *MZFFile; - unsigned short FilePos; - unsigned short MZFFileSize; - unsigned short QDPtr; - unsigned char QDBlocks; - unsigned short QDBlockSize; - unsigned short Counter; - unsigned short *usPtr; - - unsigned char CMTHeader[sizeof(struct CMTHeaderStr)]; - struct CMTHeaderStr *CMTHeaderPtr; - struct QDHeaderStr *QDHeaderPtr; - - - printf("try to add %s\n", MZFileName); - - if((QDFile = fopen("MZ700.QD", "rb")) == NULL) - { - puts("file MZ700.QD not found"); - exit(3); - } - - fread(QDArray, QDSIZE, 1, QDFile); - fclose(QDFile); - - QDPtr = 0; - QDPtr = SeekSync(QDPtr); - - QDPtr++; - QDBlocks = QDArray[QDPtr++]; - - QDPtr = QDPtr + 3; // jump over CRC - - for(Counter = 0; Counter < QDBlocks; Counter++) - { - QDPtr = SeekSync(QDPtr); - - QDPtr = QDPtr + 2; // jump over 0xA5 and the next byte - - QDBlockSize = QDArray[QDPtr++]; - QDBlockSize = QDBlockSize + QDArray[QDPtr++] * 256; -// printf("BLSize: %u -> %04X\n", QDBlockSize, QDBlockSize); - - QDPtr = QDPtr + QDBlockSize; - - QDPtr = QDPtr + 3; // jump over CRC - } - - - if((MZFFile = fopen(MZFileName, "rb")) == NULL) - { - printf("file %s not found\n", MZFileName); - exit(5); - } - - fseek(MZFFile, 0, SEEK_END); - MZFFileSize = ftell(MZFFile); - fseek(MZFFile, 0, SEEK_SET); - - if(MZFFileSize > (QDSIZE - QDPtr + 14)) - { - printf("file %s is to big, only %u bytes free\n", MZFileName, QDSIZE - QDPtr); - } - else - { - QDArray[QDPtr++] = 0x00; // BREAK - QDArray[QDPtr++] = 0x16; // SYNCCHAR1 - QDArray[QDPtr++] = 0x16; // SYNCCHAR2 - - QDArray[QDPtr++] = 0xA5; - QDArray[QDPtr++] = 0x00; - - QDArray[QDPtr++] = 64; // headerlength fixed - QDArray[QDPtr++] = 0x00; - -/* - fread(&QDArray[QDPtr], 1, 64, MZFFile); - if(QDArray[QDPtr] == 0x05) QDArray[QDPtr] = 2; // BTX file - QDPtr = QDPtr + 64; - fseek(MZFFile, 128, SEEK_SET); // go to end of MZF header -*/ - - fread(CMTHeader, 1, sizeof(struct CMTHeaderStr), MZFFile); - CMTHeaderPtr = (struct CMTHeaderStr *) &CMTHeader[0]; - - QDHeaderPtr = (struct QDHeaderStr *) &QDArray[QDPtr]; - - QDHeaderPtr->Attribute = CMTHeaderPtr->Attribute; - if(CMTHeaderPtr->Size != 0) - { - if(QDHeaderPtr->Attribute == 0x05) QDHeaderPtr->Attribute = 0x02; - } - memcpy(QDHeaderPtr->Name, CMTHeaderPtr->Name, 17); - - if(CMTHeaderPtr->Size == 0) - { - memcpy(&QDHeaderPtr->Unknown, &CMTHeaderPtr->Size, 64 - 18); - } - else - { - QDHeaderPtr->Unknown = 0; - QDHeaderPtr->Size = CMTHeaderPtr->Size; - QDHeaderPtr->LoadAddress = CMTHeaderPtr->LoadAddress; - QDHeaderPtr->ExecAddress = CMTHeaderPtr->ExecAddress; - memcpy(QDHeaderPtr->Comment, CMTHeaderPtr->Comment, 38); - } - - QDPtr = QDPtr + sizeof(struct QDHeaderStr); - - QDArray[QDPtr++] = 'C'; - QDArray[QDPtr++] = 'R'; - QDArray[QDPtr++] = 'C'; - - QDArray[QDPtr++] = 0x00; // BREAK - QDArray[QDPtr++] = 0x16; // SYNCCHAR1 - QDArray[QDPtr++] = 0x16; // SYNCCHAR2 - - QDArray[QDPtr++] = 0xA5; - QDArray[QDPtr++] = 0x05; - - usPtr = (unsigned short *) &QDArray[QDPtr]; - *usPtr = MZFFileSize - 128; - QDPtr = QDPtr + 2; - - fread(&QDArray[QDPtr], 1, MZFFileSize - 128, MZFFile); - QDPtr = QDPtr + MZFFileSize - 128; - - QDArray[QDPtr++] = 'C'; - QDArray[QDPtr++] = 'R'; - QDArray[QDPtr++] = 'C'; - - QDArray[4] = QDArray[4] + 2; // increase blockcounts - } - - fclose(MZFFile); - - QDFile = fopen("MZ700.QD", "wb"); - fwrite(QDArray, QDSIZE, 1, QDFile); - fclose(QDFile); - -/* - // *** ADD DIRECTORY TERMINATOR *** - uint32_t termPos = QDSIZE - 64; // Last 64 bytes - memset(&QDArray[termPos], 0, 64); - QDArray[termPos + 0] = 0x00; // BREAK - QDArray[termPos + 1] = 0x16; - QDArray[termPos + 2] = 0x16; - QDArray[termPos + 3] = 0xA5; - QDArray[termPos + 4] = 0x00; // attribute 0 = end of directory - QDArray[termPos + 5] = 0x40; // size low (64) - QDArray[termPos + 6] = 0x00; // size high - // rest zero -*/ -} - - - - -int main(int argc, char *argv[]) -{ - printf("\nMZQDTool V %s (c) 2002 by BKK\n\n", VERSION); - - if(argc == 1) - { - puts("usage: mzqdtool [format] [dir] [add filename]"); - puts(""); - exit(1); - } - - if(strcmp("format", argv[1]) == 0) QDFormat(); - if(strcmp("dir", argv[1]) == 0) QDDir(); - if(strcmp("add", argv[1]) == 0) - { - if(argc < 3) - { - puts("error: no file to add"); - exit(2); - } - AddFileToQD(argv[2]); - } - - return(0); -}