Files
Main/DiskImage.h
2019-06-29 00:57:18 +08:00

193 lines
5.3 KiB
C++
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __DISKIMAGE_H
#define __DISKIMAGE_H
//-----------------------------------------------------------------------------
#include "file_io.h"
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(fileTYPE *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()
int x2trd(const char *name, fileTYPE *f);
int x2trd_ext_supp(const char *name);
//-----------------------------------------------------------------------------
#endif