Updates to MZQD Tool for Sharp MZ Series QD image creation

This commit is contained in:
Philip Smart
2026-04-01 17:20:52 +01:00
parent c0b9a6a5af
commit 8ef9652935
2 changed files with 0 additions and 385 deletions

BIN
projects/tzpuPico/tools/MZQDTool vendored Executable file

Binary file not shown.

View File

@@ -1,385 +0,0 @@
#define VERSION "0.30"
#define FMS 0xEFFF
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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);
}