forked from MiSTer-devel/Main_MiSTer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDiskImage.h
192 lines (156 loc) · 5.51 KB
/
DiskImage.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#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(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()
int x2trd(const char *name, fileTYPE *f);
int x2trd_ext_supp(const char *name);
//-----------------------------------------------------------------------------
#endif