15#include "Reflection.h"
16#include "Serializable.h"
46static const isize highestTrack = 42;
47static const isize highestHalftrack = 84;
50static const isize highestSector = 20;
52static inline bool isTrackNumber(isize nr) {
return 1 <= nr && nr <= highestTrack; }
53static inline bool isHalftrackNumber(isize nr) {
return 1 <= nr && nr <= highestHalftrack; }
54static inline bool isSectorNumber(isize nr) {
return nr >= 0 && nr <= highestSector; }
61static const isize maxBytesOnTrack = 7928;
62static const isize maxBitsOnTrack = maxBytesOnTrack * 8;
69static const i64 averageBitTimeSpan[] =
81static const isize averageBitsOnTrack[4] =
92static const isize averageBytesOnTrack[4] =
103static const isize headerBlockSize = 10 * 8;
104static const isize dataBlockSize = 325 * 8;
119struct DiskTypeEnum : util::Reflection<DiskTypeEnum, DiskType> {
121 static constexpr long minVal = 0;
123 static bool isValid(
auto value) {
return value >= minVal && value <= maxVal; }
125 static const char *prefix() {
return "DISK_TYPE"; }
126 static const char *key(
long value)
137enum_long(CBM_FILE_TYPE)
144typedef CBM_FILE_TYPE CBMFileType;
146struct CBMFileTypeEnum : util::Reflection<CBMFileTypeEnum, CBMFileType> {
148 static constexpr long minVal = 0;
149 static constexpr long maxVal = CBM_FILE_REL;
150 static bool isValid(
auto value) {
return value >= minVal && value <= maxVal; }
152 static const char *prefix() {
return "CBM"; }
153 static const char *key(
long value)
157 case CBM_FILE_PRG:
return "PRG";
158 case CBM_FILE_SEQ:
return "SEQ";
159 case CBM_FILE_USR:
return "USR";
160 case CBM_FILE_REL:
return "REL";
166enum_long(DISK_ERROR_CODE)
169 HEADER_BLOCK_NOT_FOUND_ERROR = 0x2,
170 NO_SYNC_SEQUENCE_ERROR = 0x3,
171 DATA_BLOCK_NOT_FOUND_ERROR = 0x4,
172 DATA_BLOCK_CHECKSUM_ERROR = 0x5,
173 WRITE_VERIFY_ERROR_ON_FORMAT_ERROR = 0x6,
174 WRITE_VERIFY_ERROR = 0x7,
175 WRITE_PROTECT_ON_ERROR = 0x8,
176 HEADER_BLOCK_CHECKSUM_ERROR = 0x9,
178 DISK_ID_MISMATCH_ERROR = 0xB,
179 DRIVE_NOT_READY_ERRROR = 0xF
181typedef DISK_ERROR_CODE DiskErrorCode;
183struct DiskErrorCodeEnum : util::Reflection<DiskErrorCodeEnum, DiskErrorCode> {
185 static constexpr long minVal = 0;
186 static constexpr long maxVal = DRIVE_NOT_READY_ERRROR;
187 static bool isValid(
auto value) {
return value >= minVal && value <= maxVal; }
189 static const char *prefix() {
return ""; }
190 static const char *key(
long value)
194 case DISK_OK:
return "DISK_OK";
195 case HEADER_BLOCK_NOT_FOUND_ERROR:
return "HEADER_BLOCK_NOT_FOUND_ERROR";
196 case NO_SYNC_SEQUENCE_ERROR:
return "NO_SYNC_SEQUENCE_ERROR";
197 case DATA_BLOCK_NOT_FOUND_ERROR:
return "DATA_BLOCK_NOT_FOUND_ERROR";
198 case DATA_BLOCK_CHECKSUM_ERROR:
return "DATA_BLOCK_CHECKSUM_ERROR";
199 case WRITE_VERIFY_ERROR_ON_FORMAT_ERROR:
return "WRITE_VERIFY_ERROR_ON_FORMAT_ERROR";
200 case WRITE_VERIFY_ERROR:
return "WRITE_VERIFY_ERROR";
201 case WRITE_PROTECT_ON_ERROR:
return "WRITE_PROTECT_ON_ERROR";
202 case HEADER_BLOCK_CHECKSUM_ERROR:
return "HEADER_BLOCK_CHECKSUM_ERROR";
203 case WRITE_ERROR:
return "WRITE_ERROR";
204 case DISK_ID_MISMATCH_ERROR:
return "DISK_ID_MISMATCH_ERROR";
205 case DRIVE_NOT_READY_ERRROR:
return "DRIVE_NOT_READY_ERRROR";
222struct DiskData :
public Serializable
228 u8 _pad[maxBytesOnTrack];
229 u8 halftrack[85][maxBytesOnTrack];
232 u8 track[43][2 * maxBytesOnTrack];
236 void serialize(W& worker)
242 } SERIALIZERS(serialize);
253struct DiskLength :
public Serializable
267 void serialize(W& worker)
273 } SERIALIZERS(serialize);
283 Sector firstSectorNr;
VirtualC64 project namespace.
Definition CmdQueue.cpp:16
DISK_TYPE
Disk type.
Definition DiskTypes.h:113
@ DISK_TYPE_SS_SD
Single-sided, single density (VC1541)
Definition DiskTypes.h:114
@ DISK_TYPE_DS_SD
Double-sided, single density (VC1571) (unsupported)
Definition DiskTypes.h:115