195 lines
5.5 KiB
C++
195 lines
5.5 KiB
C++
#ifndef __DISKIMAGE_H
|
||
#define __DISKIMAGE_H
|
||
//-----------------------------------------------------------------------------
|
||
|
||
#ifdef __cplusplus
|
||
|
||
enum TDiskImageType { DIT_UNK, DIT_SCL, DIT_FDI, DIT_TD0, DIT_UDI, DIT_HOB, DIT_FDD };
|
||
|
||
struct VGFIND_TRACK
|
||
{
|
||
unsigned char *TrackPointer;
|
||
unsigned char *ClkPointer;
|
||
unsigned int TrackLength;
|
||
bool FoundTrack;
|
||
};
|
||
|
||
|
||
struct VGFIND_ADM
|
||
{
|
||
unsigned char* TrackPointer;
|
||
unsigned char* ClkPointer;
|
||
unsigned int TrackLength;
|
||
|
||
unsigned char *ADMPointer;
|
||
unsigned int ADMLength;
|
||
|
||
unsigned int MarkedOffsetADM;
|
||
unsigned int OffsetADM;
|
||
unsigned int OffsetEndADM;
|
||
bool FoundADM;
|
||
bool CRCOK;
|
||
};
|
||
|
||
|
||
struct VGFIND_SECTOR
|
||
{
|
||
VGFIND_ADM vgfa;
|
||
|
||
unsigned char *SectorPointer;
|
||
unsigned int SectorLength;
|
||
|
||
unsigned int MarkedOffsetSector;
|
||
unsigned int OffsetSector;
|
||
unsigned int OffsetEndSector;
|
||
bool FoundDATA;
|
||
bool CRCOK;
|
||
unsigned char DataMarker;
|
||
};
|
||
|
||
|
||
class TDiskImage
|
||
{
|
||
unsigned int FTrackLength[256][256];
|
||
unsigned char* FTracksPtr[256][256][2];
|
||
|
||
TDiskImageType FType;
|
||
|
||
unsigned short MakeVGCRC(unsigned char *data, unsigned long length);
|
||
public:
|
||
bool Changed;
|
||
|
||
bool ReadOnly;
|
||
bool DiskPresent;
|
||
unsigned char MaxTrack;
|
||
unsigned char MaxSide;
|
||
|
||
TDiskImage();
|
||
~TDiskImage();
|
||
|
||
bool FindTrack(unsigned char CYL, unsigned char SIDE, VGFIND_TRACK *vgft);
|
||
bool FindADMark(unsigned char CYL, unsigned char SIDE,
|
||
unsigned int FromOffset,
|
||
VGFIND_ADM *vgfa);
|
||
bool FindSector(unsigned char CYL, unsigned char SIDE,
|
||
unsigned char SECT,
|
||
VGFIND_SECTOR *vgfs, unsigned int FromOffset=0);
|
||
void ApplySectorCRC(VGFIND_SECTOR vgfs);
|
||
|
||
|
||
void Open(const char *filename, bool ReadOnly);
|
||
|
||
void writeTRD(int hfile);
|
||
|
||
void readSCL(int hfile, bool readonly);
|
||
void readFDI(int hfile, bool readonly);
|
||
void readUDI(int hfile, bool readonly);
|
||
void readTD0(int hfile, bool readonly);
|
||
void readFDD(int hfile, bool readonly);
|
||
void readHOB(int hfile);
|
||
|
||
void formatTRDOS(unsigned int tracks, unsigned int sides);
|
||
|
||
void ShowError(const char *str);
|
||
};
|
||
|
||
#pragma pack(1)
|
||
struct UDI_HEADER // 16 bytes
|
||
{
|
||
unsigned char ID[4];
|
||
unsigned long UnpackedLength;
|
||
unsigned char Version;
|
||
unsigned char MaxCylinder;
|
||
unsigned char MaxSide;
|
||
unsigned char _zero;
|
||
unsigned long ExtHdrLength;
|
||
};
|
||
|
||
struct TD0_MAIN_HEADER // 12 bytes
|
||
{
|
||
char ID[2]; // +0: "TD" - 'Normal'; "td" - packed LZH ('New Advanced data compression')
|
||
unsigned char __t; // +2: = 0x00
|
||
unsigned char __1; // +3: ???
|
||
unsigned char Ver; // +4: Source version (1.0 -> 10, ..., 2.1 -> 21)
|
||
unsigned char __2; // +5: ???
|
||
unsigned char DiskType; // +6: Source disk type
|
||
unsigned char Info; // +7: D7- «¨ç¨¥ image info
|
||
unsigned char DataDOS; // +8: if(=0)'All sectors were copied', else'DOS Allocated sectors were copied'
|
||
unsigned char ChkdSides; // +9: if(=1)'One side was checked', else'Both sides were checked'
|
||
unsigned short CRC; // +A: CRC 娤¥à TD0_MAIN_HEADER (ªà®¬¥ ¡ ©â á CRC)
|
||
};
|
||
|
||
struct TD0_INFO_DATA // 10 ¡ ©â ¡¥§ áâப¨ ª®¬¥â à¨ï...
|
||
{
|
||
unsigned short CRC; // +0: CRC ¤«ï áâàãªâãàë COMMENT_DATA (¡¥§ ¡ ©â®¢ CRC)
|
||
unsigned short strLen; // +2: „«¨ áâப¨ ª®¬¥â à¨ï
|
||
unsigned char Year; // +4: „ â á®§¤ ¨ï - £®¤ (1900 + X)
|
||
unsigned char Month; // +5: „ â á®§¤ ¨ï - ¬¥áïæ (Ÿ¢ àì=0, ”¥¢à «ì=1,...)
|
||
unsigned char Day; // +6: „ â á®§¤ ¨ï - ç¨á«®
|
||
unsigned char Hours; // +7: ‚६ï á®§¤ ¨ï - ç áë
|
||
unsigned char Minutes; // +8: ‚६ï á®§¤ ¨ï - ¬¨ãâë
|
||
unsigned char Seconds; // +9: ‚६ï á®§¤ ¨ï - ᥪã¤ë
|
||
};
|
||
|
||
struct TD0_TRACK_HEADER // 4 bytes
|
||
{
|
||
unsigned char SectorCount;
|
||
unsigned char Track;
|
||
unsigned char Side;
|
||
unsigned char CRCL;
|
||
};
|
||
|
||
struct TD0_SECT_HEADER // 8 bytes
|
||
{
|
||
unsigned char ADRM[6];
|
||
unsigned short DataLength;
|
||
};
|
||
|
||
struct FDD_MAIN_HEADER
|
||
{
|
||
char ID[30]; /* ᨣ âãà */
|
||
unsigned char MaxTracks; /* ç¨á«® â४®¢ (樫¨¤à®¢) */
|
||
unsigned char MaxHeads; /* ç¨á«® £®«®¢®ª (1 ¨«¨ 2) */
|
||
long diskIndex; /* unused */
|
||
long DataOffset[512*2]; /* ᬥ饨¥ ¢ ä ©«¥ ª áâàãªâãà ¬ § £®«®¢ª®¢ */
|
||
/* â४®¢ */
|
||
};
|
||
|
||
struct FDD_TRACK_HEADER
|
||
{
|
||
unsigned char trkType; /* unused */
|
||
unsigned char SectNum; /* ç¨á«® ᥪâ®à®¢ â४¥ */
|
||
struct
|
||
{
|
||
/* § £®«®¢®ª ᥪâ®à */
|
||
unsigned char trk; /* ®¬¥à â४ */
|
||
unsigned char side; /* ®¬¥à áâ®à®ë */
|
||
/* 7 ¡¨â í⮣® ¡ ©â 㪠§ë¢ ¥â ¡¨â a */
|
||
unsigned char sect; /* ®¬¥à ᥪâ®à */
|
||
unsigned char size; /* à §¬¥à ᥪâ®à (ª®¤) */
|
||
long SectPos; /* ᬥ饨¥ ¢ ä ©«¥ ª ¤ ë¬ á¥ªâ®à */
|
||
} sect[256];
|
||
};
|
||
|
||
|
||
struct TRDOS_DIR_ELEMENT // 16 bytes
|
||
{
|
||
char FileName[8];
|
||
char Type;
|
||
unsigned short Start;
|
||
unsigned short Length;
|
||
unsigned char SecLen;
|
||
unsigned char FirstSec;
|
||
unsigned char FirstTrk;
|
||
};
|
||
#pragma pack()
|
||
|
||
#else
|
||
|
||
int x2trd(char *name, fileTYPE *f);
|
||
int x2trd_ext_supp(char *name);
|
||
|
||
#endif
|
||
|
||
//-----------------------------------------------------------------------------
|
||
#endif |