Fix linear memory mapping structure.

This commit is contained in:
2021-11-21 18:19:17 +00:00
parent 1b06a5a972
commit be2f77fbe3
3 changed files with 561 additions and 479 deletions

View File

@@ -42,352 +42,378 @@ using System.Diagnostics.CodeAnalysis;
// ReSharper disable UnusedMember.Global // ReSharper disable UnusedMember.Global
namespace Aaru.CommonTypes.Enums namespace Aaru.CommonTypes.Enums;
/// <summary>Track (as partitioning element) types.</summary>
public enum TrackType : byte
{ {
/// <summary>Track (as partitioning element) types.</summary> /// <summary>Audio track</summary>
public enum TrackType : byte Audio = 0,
{ /// <summary>Data track (not any of the below defined ones)</summary>
/// <summary>Audio track</summary> Data = 1,
Audio = 0, /// <summary>Data track, compact disc mode 1</summary>
/// <summary>Data track (not any of the below defined ones)</summary> CdMode1 = 2,
Data = 1, /// <summary>Data track, compact disc mode 2, formless</summary>
/// <summary>Data track, compact disc mode 1</summary> CdMode2Formless = 3,
CdMode1 = 2, /// <summary>Data track, compact disc mode 2, form 1</summary>
/// <summary>Data track, compact disc mode 2, formless</summary> CdMode2Form1 = 4,
CdMode2Formless = 3, /// <summary>Data track, compact disc mode 2, form 2</summary>
/// <summary>Data track, compact disc mode 2, form 1</summary> CdMode2Form2 = 5
CdMode2Form1 = 4, }
/// <summary>Data track, compact disc mode 2, form 2</summary>
CdMode2Form2 = 5 /// <summary>Type of subchannel in track</summary>
} public enum TrackSubchannelType : byte
{
/// <summary>Type of subchannel in track</summary> /// <summary>Track does not has subchannel dumped, or it's not a CD</summary>
public enum TrackSubchannelType : byte None = 0,
{ /// <summary>Subchannel is packed and error corrected</summary>
/// <summary>Track does not has subchannel dumped, or it's not a CD</summary> Packed = 1,
None = 0, /// <summary>Subchannel is interleaved</summary>
/// <summary>Subchannel is packed and error corrected</summary> Raw = 2,
Packed = 1, /// <summary>Subchannel is packed and comes interleaved with main channel in same file</summary>
/// <summary>Subchannel is interleaved</summary> PackedInterleaved = 3,
Raw = 2, /// <summary>Subchannel is interleaved and comes interleaved with main channel in same file</summary>
/// <summary>Subchannel is packed and comes interleaved with main channel in same file</summary> RawInterleaved = 4,
PackedInterleaved = 3, /// <summary>Only Q subchannel is stored as 16 bytes</summary>
/// <summary>Subchannel is interleaved and comes interleaved with main channel in same file</summary> Q16 = 5,
RawInterleaved = 4, /// <summary>Only Q subchannel is stored as 16 bytes and comes interleaved with main channel in same file</summary>
/// <summary>Only Q subchannel is stored as 16 bytes</summary> Q16Interleaved = 6
Q16 = 5, }
/// <summary>Only Q subchannel is stored as 16 bytes and comes interleaved with main channel in same file</summary>
Q16Interleaved = 6 /// <summary>Metadata present for each sector (aka, "tag").</summary>
} public enum SectorTagType
{
/// <summary>Metadata present for each sector (aka, "tag").</summary> /// <summary>Apple's GCR sector tags, 12 bytes</summary>
public enum SectorTagType AppleSectorTag = 0,
{ /// <summary>Sync frame from CD sector, 12 bytes</summary>
/// <summary>Apple's GCR sector tags, 12 bytes</summary> CdSectorSync = 1,
AppleSectorTag = 0, /// <summary>CD sector header, 4 bytes</summary>
/// <summary>Sync frame from CD sector, 12 bytes</summary> CdSectorHeader = 2,
CdSectorSync = 1, /// <summary>CD mode 2 sector subheader</summary>
/// <summary>CD sector header, 4 bytes</summary> CdSectorSubHeader = 3,
CdSectorHeader = 2, /// <summary>CD sector EDC, 4 bytes</summary>
/// <summary>CD mode 2 sector subheader</summary> CdSectorEdc = 4,
CdSectorSubHeader = 3, /// <summary>CD sector ECC P, 172 bytes</summary>
/// <summary>CD sector EDC, 4 bytes</summary> CdSectorEccP = 5,
CdSectorEdc = 4, /// <summary>CD sector ECC Q, 104 bytes</summary>
/// <summary>CD sector ECC P, 172 bytes</summary> CdSectorEccQ = 6,
CdSectorEccP = 5, /// <summary>CD sector ECC (P and Q), 276 bytes</summary>
/// <summary>CD sector ECC Q, 104 bytes</summary> CdSectorEcc = 7,
CdSectorEccQ = 6, /// <summary>CD sector subchannel, 96 bytes</summary>
/// <summary>CD sector ECC (P and Q), 276 bytes</summary> CdSectorSubchannel = 8,
CdSectorEcc = 7, /// <summary>CD track ISRC, string, 12 bytes</summary>
/// <summary>CD sector subchannel, 96 bytes</summary> CdTrackIsrc = 9,
CdSectorSubchannel = 8, /// <summary>CD track text, string, 13 bytes</summary>
/// <summary>CD track ISRC, string, 12 bytes</summary> CdTrackText = 10,
CdTrackIsrc = 9, /// <summary>CD track flags, 1 byte</summary>
/// <summary>CD track text, string, 13 bytes</summary> CdTrackFlags = 11,
CdTrackText = 10, /// <summary>DVD sector copyright information</summary>
/// <summary>CD track flags, 1 byte</summary> DvdCmi = 12,
CdTrackFlags = 11, /// <summary>Floppy address mark (contents depend on underlying floppy format)</summary>
/// <summary>DVD sector copyright information</summary> FloppyAddressMark = 13,
DvdCmi = 12, /// <summary>DVD sector title key, 5 bytes</summary>
/// <summary>Floppy address mark (contents depend on underlying floppy format)</summary> DvdTitleKey = 14,
FloppyAddressMark = 13, /// <summary>Decrypted DVD sector title key, 5 bytes</summary>
/// <summary>DVD sector title key, 5 bytes</summary> DvdTitleKeyDecrypted = 15
DvdTitleKey = 14, }
/// <summary>Decrypted DVD sector title key, 5 bytes</summary>
DvdTitleKeyDecrypted = 15 /// <summary>Metadata present for each media.</summary>
} [SuppressMessage("ReSharper", "InconsistentNaming")]
public enum MediaTagType
/// <summary>Metadata present for each media.</summary> {
[SuppressMessage("ReSharper", "InconsistentNaming")] /// <summary>CD table of contents</summary>
public enum MediaTagType CD_TOC = 0,
{ /// <summary>CD session information</summary>
/// <summary>CD table of contents</summary> CD_SessionInfo = 1,
CD_TOC = 0, /// <summary>CD full table of contents</summary>
/// <summary>CD session information</summary> CD_FullTOC = 2,
CD_SessionInfo = 1, /// <summary>CD PMA</summary>
/// <summary>CD full table of contents</summary> CD_PMA = 3,
CD_FullTOC = 2, /// <summary>CD Address-Time-In-Pregroove</summary>
/// <summary>CD PMA</summary> CD_ATIP = 4,
CD_PMA = 3, /// <summary>CD-Text</summary>
/// <summary>CD Address-Time-In-Pregroove</summary> CD_TEXT = 5,
CD_ATIP = 4, /// <summary>CD Media Catalogue Number</summary>
/// <summary>CD-Text</summary> CD_MCN = 6,
CD_TEXT = 5, /// <summary>DVD/HD DVD Physical Format Information</summary>
/// <summary>CD Media Catalogue Number</summary> DVD_PFI = 7,
CD_MCN = 6, /// <summary>DVD Lead-in Copyright Management Information</summary>
/// <summary>DVD/HD DVD Physical Format Information</summary> DVD_CMI = 8,
DVD_PFI = 7, /// <summary>DVD disc key</summary>
/// <summary>DVD Lead-in Copyright Management Information</summary> DVD_DiscKey = 9,
DVD_CMI = 8, /// <summary>DVD/HD DVD Burst Cutting Area</summary>
/// <summary>DVD disc key</summary> DVD_BCA = 10,
DVD_DiscKey = 9, /// <summary>DVD/HD DVD Lead-in Disc Manufacturer Information</summary>
/// <summary>DVD/HD DVD Burst Cutting Area</summary> DVD_DMI = 11,
DVD_BCA = 10, /// <summary>Media identifier</summary>
/// <summary>DVD/HD DVD Lead-in Disc Manufacturer Information</summary> DVD_MediaIdentifier = 12,
DVD_DMI = 11, /// <summary>Media key block</summary>
/// <summary>Media identifier</summary> DVD_MKB = 13,
DVD_MediaIdentifier = 12, /// <summary>DVD-RAM/HD DVD-RAM DDS information</summary>
/// <summary>Media key block</summary> DVDRAM_DDS = 14,
DVD_MKB = 13, /// <summary>DVD-RAM/HD DVD-RAM Medium status</summary>
/// <summary>DVD-RAM/HD DVD-RAM DDS information</summary> DVDRAM_MediumStatus = 15,
DVDRAM_DDS = 14, /// <summary>DVD-RAM/HD DVD-RAM Spare area information</summary>
/// <summary>DVD-RAM/HD DVD-RAM Medium status</summary> DVDRAM_SpareArea = 16,
DVDRAM_MediumStatus = 15, /// <summary>DVD-R/-RW/HD DVD-R RMD in last border-out</summary>
/// <summary>DVD-RAM/HD DVD-RAM Spare area information</summary> DVDR_RMD = 17,
DVDRAM_SpareArea = 16, /// <summary>Pre-recorded information from DVD-R/-RW lead-in</summary>
/// <summary>DVD-R/-RW/HD DVD-R RMD in last border-out</summary> DVDR_PreRecordedInfo = 18,
DVDR_RMD = 17, /// <summary>DVD-R/-RW/HD DVD-R media identifier</summary>
/// <summary>Pre-recorded information from DVD-R/-RW lead-in</summary> DVDR_MediaIdentifier = 19,
DVDR_PreRecordedInfo = 18, /// <summary>DVD-R/-RW/HD DVD-R physical format information</summary>
/// <summary>DVD-R/-RW/HD DVD-R media identifier</summary> DVDR_PFI = 20,
DVDR_MediaIdentifier = 19, /// <summary>ADIP information</summary>
/// <summary>DVD-R/-RW/HD DVD-R physical format information</summary> DVD_ADIP = 21,
DVDR_PFI = 20, /// <summary>HD DVD Lead-in copyright protection information</summary>
/// <summary>ADIP information</summary> HDDVD_CPI = 22,
DVD_ADIP = 21, /// <summary>HD DVD-R Medium Status</summary>
/// <summary>HD DVD Lead-in copyright protection information</summary> HDDVD_MediumStatus = 23,
HDDVD_CPI = 22, /// <summary>DVD+/-R DL Layer capacity</summary>
/// <summary>HD DVD-R Medium Status</summary> DVDDL_LayerCapacity = 24,
HDDVD_MediumStatus = 23, /// <summary>DVD-R DL Middle Zone start address</summary>
/// <summary>DVD+/-R DL Layer capacity</summary> DVDDL_MiddleZoneAddress = 25,
DVDDL_LayerCapacity = 24, /// <summary>DVD-R DL Jump Interval Size</summary>
/// <summary>DVD-R DL Middle Zone start address</summary> DVDDL_JumpIntervalSize = 26,
DVDDL_MiddleZoneAddress = 25, /// <summary>DVD-R DL Start LBA of the manual layer jump</summary>
/// <summary>DVD-R DL Jump Interval Size</summary> DVDDL_ManualLayerJumpLBA = 27,
DVDDL_JumpIntervalSize = 26, /// <summary>Blu-ray Disc Information</summary>
/// <summary>DVD-R DL Start LBA of the manual layer jump</summary> BD_DI = 28,
DVDDL_ManualLayerJumpLBA = 27, /// <summary>Blu-ray Burst Cutting Area</summary>
/// <summary>Blu-ray Disc Information</summary> BD_BCA = 29,
BD_DI = 28, /// <summary>Blu-ray Disc Definition Structure</summary>
/// <summary>Blu-ray Burst Cutting Area</summary> BD_DDS = 30,
BD_BCA = 29, /// <summary>Blu-ray Cartridge Status</summary>
/// <summary>Blu-ray Disc Definition Structure</summary> BD_CartridgeStatus = 31,
BD_DDS = 30, /// <summary>Blu-ray Status of Spare Area</summary>
/// <summary>Blu-ray Cartridge Status</summary> BD_SpareArea = 32,
BD_CartridgeStatus = 31, /// <summary>AACS volume identifier</summary>
/// <summary>Blu-ray Status of Spare Area</summary> AACS_VolumeIdentifier = 33,
BD_SpareArea = 32, /// <summary>AACS pre-recorded media serial number</summary>
/// <summary>AACS volume identifier</summary> AACS_SerialNumber = 34,
AACS_VolumeIdentifier = 33, /// <summary>AACS media identifier</summary>
/// <summary>AACS pre-recorded media serial number</summary> AACS_MediaIdentifier = 35,
AACS_SerialNumber = 34, /// <summary>Lead-in AACS media key block</summary>
/// <summary>AACS media identifier</summary> AACS_MKB = 36,
AACS_MediaIdentifier = 35, /// <summary>AACS data keys</summary>
/// <summary>Lead-in AACS media key block</summary> AACS_DataKeys = 37,
AACS_MKB = 36, /// <summary>LBA extents flagged for bus encryption by AACS</summary>
/// <summary>AACS data keys</summary> AACS_LBAExtents = 38,
AACS_DataKeys = 37, /// <summary>CPRM media key block in Lead-in</summary>
/// <summary>LBA extents flagged for bus encryption by AACS</summary> AACS_CPRM_MKB = 39,
AACS_LBAExtents = 38, /// <summary>Recognized layer formats in hybrid discs</summary>
/// <summary>CPRM media key block in Lead-in</summary> Hybrid_RecognizedLayers = 40,
AACS_CPRM_MKB = 39, /// <summary>Disc write protection status</summary>
/// <summary>Recognized layer formats in hybrid discs</summary> MMC_WriteProtection = 41,
Hybrid_RecognizedLayers = 40, /// <summary>Disc standard information</summary>
/// <summary>Disc write protection status</summary> MMC_DiscInformation = 42,
MMC_WriteProtection = 41, /// <summary>Disc track resources information</summary>
/// <summary>Disc standard information</summary> MMC_TrackResourcesInformation = 43,
MMC_DiscInformation = 42, /// <summary>BD-R Pseudo-overwrite information</summary>
/// <summary>Disc track resources information</summary> MMC_POWResourcesInformation = 44,
MMC_TrackResourcesInformation = 43, /// <summary>SCSI INQUIRY response</summary>
/// <summary>BD-R Pseudo-overwrite information</summary> SCSI_INQUIRY = 45,
MMC_POWResourcesInformation = 44, /// <summary>SCSI MODE PAGE 2Ah</summary>
/// <summary>SCSI INQUIRY response</summary> SCSI_MODEPAGE_2A = 46,
SCSI_INQUIRY = 45, /// <summary>ATA IDENTIFY DEVICE response</summary>
/// <summary>SCSI MODE PAGE 2Ah</summary> ATA_IDENTIFY = 47,
SCSI_MODEPAGE_2A = 46, /// <summary>ATA IDENTIFY PACKET DEVICE response</summary>
/// <summary>ATA IDENTIFY DEVICE response</summary> ATAPI_IDENTIFY = 48,
ATA_IDENTIFY = 47, /// <summary>PCMCIA/CardBus Card Information Structure</summary>
/// <summary>ATA IDENTIFY PACKET DEVICE response</summary> PCMCIA_CIS = 49,
ATAPI_IDENTIFY = 48, /// <summary>SecureDigital CID</summary>
/// <summary>PCMCIA/CardBus Card Information Structure</summary> SD_CID = 50,
PCMCIA_CIS = 49, /// <summary>SecureDigital CSD</summary>
/// <summary>SecureDigital CID</summary> SD_CSD = 51,
SD_CID = 50, /// <summary>SecureDigital SCR</summary>
/// <summary>SecureDigital CSD</summary> SD_SCR = 52,
SD_CSD = 51, /// <summary>SecureDigital OCR</summary>
/// <summary>SecureDigital SCR</summary> SD_OCR = 53,
SD_SCR = 52, /// <summary>MultiMediaCard CID</summary>
/// <summary>SecureDigital OCR</summary> MMC_CID = 54,
SD_OCR = 53, /// <summary>MultiMediaCard CSD</summary>
/// <summary>MultiMediaCard CID</summary> MMC_CSD = 55,
MMC_CID = 54, /// <summary>MultiMediaCard OCR</summary>
/// <summary>MultiMediaCard CSD</summary> MMC_OCR = 56,
MMC_CSD = 55, /// <summary>MultiMediaCard Extended CSD</summary>
/// <summary>MultiMediaCard OCR</summary> MMC_ExtendedCSD = 57,
MMC_OCR = 56, /// <summary>Xbox Security Sector</summary>
/// <summary>MultiMediaCard Extended CSD</summary> Xbox_SecuritySector = 58,
MMC_ExtendedCSD = 57, /// <summary>
/// <summary>Xbox Security Sector</summary> /// On floppy disks, data in last cylinder usually in a different format that contains duplication or
Xbox_SecuritySector = 58, /// manufacturing information
/// <summary> /// </summary>
/// On floppy disks, data in last cylinder usually in a different format that contains duplication or Floppy_LeadOut = 59,
/// manufacturing information /// <summary>DVD Disc Control Blocks</summary>
/// </summary> DCB = 60,
Floppy_LeadOut = 59, /// <summary>Compact Disc First Track Pregap</summary>
/// <summary>DVD Disc Control Blocks</summary> CD_FirstTrackPregap = 61,
DCB = 60, /// <summary>Compact Disc Lead-out</summary>
/// <summary>Compact Disc First Track Pregap</summary> CD_LeadOut = 62,
CD_FirstTrackPregap = 61, /// <summary>SCSI MODE SENSE (6)</summary>
/// <summary>Compact Disc Lead-out</summary> SCSI_MODESENSE_6 = 63,
CD_LeadOut = 62, /// <summary>SCSI MODE SENSE (10)</summary>
/// <summary>SCSI MODE SENSE (6)</summary> SCSI_MODESENSE_10 = 64,
SCSI_MODESENSE_6 = 63, /// <summary>USB descriptors</summary>
/// <summary>SCSI MODE SENSE (10)</summary> USB_Descriptors = 65,
SCSI_MODESENSE_10 = 64, /// <summary>XGD unlocked DMI</summary>
/// <summary>USB descriptors</summary> Xbox_DMI = 66,
USB_Descriptors = 65, /// <summary>XDG unlocked PFI</summary>
/// <summary>XGD unlocked DMI</summary> Xbox_PFI = 67,
Xbox_DMI = 66, /// <summary>Compact Disc Lead-in</summary>
/// <summary>XDG unlocked PFI</summary> CD_LeadIn = 68,
Xbox_PFI = 67, /// <summary>8 bytes response that seems to define type of MiniDisc</summary>
/// <summary>Compact Disc Lead-in</summary> MiniDiscType = 69,
CD_LeadIn = 68, /// <summary>4 bytes response to vendor command D5h</summary>
/// <summary>8 bytes response that seems to define type of MiniDisc</summary> MiniDiscD5 = 70,
MiniDiscType = 69, /// <summary>User TOC, contains fragments, track names, and can be from 1 to 3 sectors of 2336 bytes</summary>
/// <summary>4 bytes response to vendor command D5h</summary> MiniDiscUTOC = 71,
MiniDiscD5 = 70, /// <summary>Not entirely clear kind of TOC that only appears on MD-DATA discs</summary>
/// <summary>User TOC, contains fragments, track names, and can be from 1 to 3 sectors of 2336 bytes</summary> MiniDiscDTOC = 72,
MiniDiscUTOC = 71, /// <summary>Decrypted DVD disc key</summary>
/// <summary>Not entirely clear kind of TOC that only appears on MD-DATA discs</summary> DVD_DiscKey_Decrypted = 73
MiniDiscDTOC = 72, }
/// <summary>Decrypted DVD disc key</summary>
DVD_DiscKey_Decrypted = 73 /// <summary>Enumeration of media types defined in CICM metadata</summary>
} public enum XmlMediaType : byte
{
/// <summary>Enumeration of media types defined in CICM metadata</summary> /// <summary>Purely optical discs</summary>
public enum XmlMediaType : byte OpticalDisc = 0,
{ /// <summary>Media that is physically block-based or abstracted like that</summary>
/// <summary>Purely optical discs</summary> BlockMedia = 1,
OpticalDisc = 0, /// <summary>Media that can be accessed by-byte or by-bit, like chips</summary>
/// <summary>Media that is physically block-based or abstracted like that</summary> LinearMedia = 2,
BlockMedia = 1, /// <summary>Media that can only store data when it is modulated to audio</summary>
/// <summary>Media that can be accessed by-byte or by-bit, like chips</summary> AudioMedia = 3
LinearMedia = 2, }
/// <summary>Media that can only store data when it is modulated to audio</summary>
AudioMedia = 3 /// <summary> CD flags bitmask</summary>
} [Flags]
public enum CdFlags : byte
/// <summary> CD flags bitmask</summary> {
[Flags] /// <summary>Track is quadraphonic.</summary>
public enum CdFlags : byte FourChannel = 0x08,
{ /// <summary>Track is non-audio (data).</summary>
/// <summary>Track is quadraphonic.</summary> DataTrack = 0x04,
FourChannel = 0x08, /// <summary>Track is copy protected.</summary>
/// <summary>Track is non-audio (data).</summary> CopyPermitted = 0x02,
DataTrack = 0x04, /// <summary>Track has pre-emphasis.</summary>
/// <summary>Track is copy protected.</summary> PreEmphasis = 0x01
CopyPermitted = 0x02, }
/// <summary>Track has pre-emphasis.</summary>
PreEmphasis = 0x01 /// <summary>Status of a requested floppy sector</summary>
} [Flags]
public enum FloppySectorStatus : byte
/// <summary>Status of a requested floppy sector</summary> {
[Flags] /// <summary>Both address mark and data checksums are correct.</summary>
public enum FloppySectorStatus : byte Correct = 0x01,
{ /// <summary>Data checksum is incorrect.</summary>
/// <summary>Both address mark and data checksums are correct.</summary> DataError = 0x02,
Correct = 0x01, /// <summary>Address mark checksum is incorrect.</summary>
/// <summary>Data checksum is incorrect.</summary> AddressMarkError = 0x04,
DataError = 0x02, /// <summary>There is another sector in the same track/head with same sector id.</summary>
/// <summary>Address mark checksum is incorrect.</summary> Duplicated = 0x08,
AddressMarkError = 0x04, /// <summary>Sector data section is not magnetized.</summary>
/// <summary>There is another sector in the same track/head with same sector id.</summary> Demagnetized = 0x10,
Duplicated = 0x08, /// <summary>Sector data section has a physically visible hole.</summary>
/// <summary>Sector data section is not magnetized.</summary> Hole = 0x20,
Demagnetized = 0x10, /// <summary>There is no address mark containing the requested sector id in the track/head.</summary>
/// <summary>Sector data section has a physically visible hole.</summary> NotFound = 0x40
Hole = 0x20, }
/// <summary>There is no address mark containing the requested sector id in the track/head.</summary>
NotFound = 0x40 /// <summary>Types of floppy disks</summary>
} public enum FloppyTypes : byte
{
/// <summary>Types of floppy disks</summary> /// <summary>8" floppy</summary>
public enum FloppyTypes : byte Floppy,
{ /// <summary>5.25" floppy</summary>
/// <summary>8" floppy</summary> MiniFloppy,
Floppy, /// <summary>3.5" floppy</summary>
/// <summary>5.25" floppy</summary> MicroFloppy,
MiniFloppy, /// <summary>3" floppy</summary>
/// <summary>3.5" floppy</summary> CompactFloppy,
MicroFloppy, /// <summary>5.25" twiggy</summary>
/// <summary>3" floppy</summary> FileWare,
CompactFloppy, /// <summary>2.5" quickdisk</summary>
/// <summary>5.25" twiggy</summary> QuickDisk
FileWare, }
/// <summary>2.5" quickdisk</summary>
QuickDisk /// <summary>Enumeration of floppy densities</summary>
} public enum FloppyDensities : byte
{
/// <summary>Enumeration of floppy densities</summary> /// <summary>Standard coercivity (about 300Oe as found in 8" and 5.25"-double-density disks).</summary>
public enum FloppyDensities : byte Standard,
{ /// <summary>Double density coercivity (about 600Oe as found in 5.25" HD and 3.5" DD disks).</summary>
/// <summary>Standard coercivity (about 300Oe as found in 8" and 5.25"-double-density disks).</summary> Double,
Standard, /// <summary>High density coercivity (about 700Oe as found in 3.5" HD disks).</summary>
/// <summary>Double density coercivity (about 600Oe as found in 5.25" HD and 3.5" DD disks).</summary> High,
Double, /// <summary>Extended density coercivity (about 750Oe as found in 3.5" ED disks).</summary>
/// <summary>High density coercivity (about 700Oe as found in 3.5" HD disks).</summary> Extended
High, }
/// <summary>Extended density coercivity (about 750Oe as found in 3.5" ED disks).</summary>
Extended /// <summary>Capabilities for optical media image formats</summary>
} [Flags]
public enum OpticalImageCapabilities : ulong
/// <summary>Capabilities for optical media image formats</summary> {
[Flags] /// <summary>Can store Red Book audio tracks?</summary>
public enum OpticalImageCapabilities : ulong CanStoreAudioTracks = 0x01,
{ /// <summary>Can store CD-V analogue video tracks?</summary>
/// <summary>Can store Red Book audio tracks?</summary> CanStoreVideoTracks = 0x02,
CanStoreAudioTracks = 0x01, /// <summary>Can store Yellow Book data tracks?</summary>
/// <summary>Can store CD-V analogue video tracks?</summary> CanStoreDataTracks = 0x03,
CanStoreVideoTracks = 0x02, /// <summary>Can store pregaps without needing to interpret the subchannel?</summary>
/// <summary>Can store Yellow Book data tracks?</summary> CanStorePregaps = 0x04,
CanStoreDataTracks = 0x03, /// <summary>Can store indexes without needing to interpret the subchannel?</summary>
/// <summary>Can store pregaps without needing to interpret the subchannel?</summary> CanStoreIndexes = 0x08,
CanStorePregaps = 0x04, /// <summary>Can store raw P to W subchannel data?</summary>
/// <summary>Can store indexes without needing to interpret the subchannel?</summary> CanStoreSubchannelRw = 0x10,
CanStoreIndexes = 0x08, /// <summary>Can store more than one session?</summary>
/// <summary>Can store raw P to W subchannel data?</summary> CanStoreSessions = 0x20,
CanStoreSubchannelRw = 0x10, /// <summary>Can store track ISRCs without needing to interpret the subchannel?</summary>
/// <summary>Can store more than one session?</summary> CanStoreIsrc = 0x40,
CanStoreSessions = 0x20, /// <summary>Can store Lead-In's CD-TEXT?</summary>
/// <summary>Can store track ISRCs without needing to interpret the subchannel?</summary> CanStoreCdText = 0x80,
CanStoreIsrc = 0x40, /// <summary>Can store the MCN without needing to interpret the subchannel?</summary>
/// <summary>Can store Lead-In's CD-TEXT?</summary> CanStoreMcn = 0x100,
CanStoreCdText = 0x80, /// <summary>Can store the whole 2352 bytes of a sector?</summary>
/// <summary>Can store the MCN without needing to interpret the subchannel?</summary> CanStoreRawData = 0x200,
CanStoreMcn = 0x100, /// <summary>Can store more than 1 session in media that is not CD based (DVD et al)?</summary>
/// <summary>Can store the whole 2352 bytes of a sector?</summary> CanStoreNotCdSessions = 0x2000,
CanStoreRawData = 0x200, /// <summary>Can store more than 1 track in media that is not CD based (DVD et al)?</summary>
/// <summary>Can store more than 1 session in media that is not CD based (DVD et al)?</summary> CanStoreNotCdTracks = 0x4000,
CanStoreNotCdSessions = 0x2000,
/// <summary>Can store more than 1 track in media that is not CD based (DVD et al)?</summary> // TODO: Implement
CanStoreNotCdTracks = 0x4000, /// <summary>Can store scrambled data?</summary>
CanStoreScrambledData = 0x400,
// TODO: Implement /// <summary>Can store only the user area of a sector (2048, 2324, etc)?</summary>
/// <summary>Can store scrambled data?</summary> CanStoreCookedData = 0x800,
CanStoreScrambledData = 0x400, /// <summary>Can store more than 1 track?</summary>
/// <summary>Can store only the user area of a sector (2048, 2324, etc)?</summary> CanStoreMultipleTracks = 0x1000
CanStoreCookedData = 0x800, }
/// <summary>Can store more than 1 track?</summary>
CanStoreMultipleTracks = 0x1000 /// <summary>Enumeration of linear memory device types</summary>
} public enum LinearMemoryType
{
/// <summary>Unknown device type</summary>
Unknown = 0,
/// <summary>Read-only memory</summary>
ROM = 1,
/// <summary>Read-write memory, power-off persistent, used to save data</summary>
SaveRAM = 2,
/// <summary>Read-write volatile memory</summary>
WorkRAM = 3,
/// <summary>NOR flash memory</summary>
NOR = 4,
/// <summary>NAND flash memory</summary>
NAND = 5,
/// <summary>Memory mapper device</summary>
Mapper = 6,
/// <summary>Processor, CPU, DSP, etc</summary>
Processor = 7,
/// <summary>Programmable Array Logic</summary>
PAL = 8,
/// <summary>Generic Array Logic</summary>
GAL = 9,
/// <summary>Electronically Erasable Programmable Read Only Memory</summary>
EEPROM = 10
} }

View File

@@ -38,6 +38,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Structs;
namespace Aaru.CommonTypes.Interfaces; namespace Aaru.CommonTypes.Interfaces;
@@ -63,7 +64,7 @@ public interface IByteAddressableImage : IBaseWritableImage
/// <summary>Gets the linear memory mappings, e.g. interleaving, starting address, etc.</summary> /// <summary>Gets the linear memory mappings, e.g. interleaving, starting address, etc.</summary>
/// <param name="mappings">Format still not decided</param> /// <param name="mappings">Format still not decided</param>
/// <returns>Error number</returns> /// <returns>Error number</returns>
ErrorNumber GetMappings(out object mappings); ErrorNumber GetMappings(out LinearMemoryMap mappings);
/// <summary>Reads a byte from the image</summary> /// <summary>Reads a byte from the image</summary>
/// <param name="b">The byte read</param> /// <param name="b">The byte read</param>
@@ -106,7 +107,7 @@ public interface IByteAddressableImage : IBaseWritableImage
/// <summary>Sets the linear memory mappings, e.g. interleaving, starting address, etc.</summary> /// <summary>Sets the linear memory mappings, e.g. interleaving, starting address, etc.</summary>
/// <param name="mappings">Format still not decided</param> /// <param name="mappings">Format still not decided</param>
/// <returns>Error number</returns> /// <returns>Error number</returns>
ErrorNumber SetMappings(object mappings); ErrorNumber SetMappings(LinearMemoryMap mappings);
/// <summary>Writes a byte to the image</summary> /// <summary>Writes a byte to the image</summary>
/// <param name="b">The byte to be written</param> /// <param name="b">The byte to be written</param>

View File

@@ -38,153 +38,208 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.CommonTypes.Structs namespace Aaru.CommonTypes.Structs;
/// <summary>Contains information about a dump image and its contents</summary>
public struct ImageInfo
{ {
/// <summary>Contains information about a dump image and its contents</summary> /// <summary>Image contains partitions (or tracks for optical media)</summary>
public struct ImageInfo public bool HasPartitions;
{ /// <summary>Image contains sessions (optical media only)</summary>
/// <summary>Image contains partitions (or tracks for optical media)</summary> public bool HasSessions;
public bool HasPartitions; /// <summary>Size of the image without headers</summary>
/// <summary>Image contains sessions (optical media only)</summary> public ulong ImageSize;
public bool HasSessions; /// <summary>Sectors contained in the image</summary>
/// <summary>Size of the image without headers</summary> public ulong Sectors;
public ulong ImageSize; /// <summary>Size of sectors contained in the image</summary>
/// <summary>Sectors contained in the image</summary> public uint SectorSize;
public ulong Sectors; /// <summary>Media tags contained by the image</summary>
/// <summary>Size of sectors contained in the image</summary> public List<MediaTagType> ReadableMediaTags;
public uint SectorSize; /// <summary>Sector tags contained by the image</summary>
/// <summary>Media tags contained by the image</summary> public List<SectorTagType> ReadableSectorTags;
public List<MediaTagType> ReadableMediaTags; /// <summary>Image version</summary>
/// <summary>Sector tags contained by the image</summary> public string Version;
public List<SectorTagType> ReadableSectorTags; /// <summary>Application that created the image</summary>
/// <summary>Image version</summary> public string Application;
public string Version; /// <summary>Version of the application that created the image</summary>
/// <summary>Application that created the image</summary> public string ApplicationVersion;
public string Application; /// <summary>Who (person) created the image?</summary>
/// <summary>Version of the application that created the image</summary> public string Creator;
public string ApplicationVersion; /// <summary>Image creation time</summary>
/// <summary>Who (person) created the image?</summary> public DateTime CreationTime;
public string Creator; /// <summary>Image last modification time</summary>
/// <summary>Image creation time</summary> public DateTime LastModificationTime;
public DateTime CreationTime; /// <summary>Title of the media represented by the image</summary>
/// <summary>Image last modification time</summary> public string MediaTitle;
public DateTime LastModificationTime; /// <summary>Image comments</summary>
/// <summary>Title of the media represented by the image</summary> public string Comments;
public string MediaTitle; /// <summary>Manufacturer of the media represented by the image</summary>
/// <summary>Image comments</summary> public string MediaManufacturer;
public string Comments; /// <summary>Model of the media represented by the image</summary>
/// <summary>Manufacturer of the media represented by the image</summary> public string MediaModel;
public string MediaManufacturer; /// <summary>Serial number of the media represented by the image</summary>
/// <summary>Model of the media represented by the image</summary> public string MediaSerialNumber;
public string MediaModel; /// <summary>Barcode of the media represented by the image</summary>
/// <summary>Serial number of the media represented by the image</summary> public string MediaBarcode;
public string MediaSerialNumber; /// <summary>Part number of the media represented by the image</summary>
/// <summary>Barcode of the media represented by the image</summary> public string MediaPartNumber;
public string MediaBarcode; /// <summary>Media type represented by the image</summary>
/// <summary>Part number of the media represented by the image</summary> public MediaType MediaType;
public string MediaPartNumber; /// <summary>Number in sequence for the media represented by the image</summary>
/// <summary>Media type represented by the image</summary> public int MediaSequence;
public MediaType MediaType; /// <summary>Last media of the sequence the media represented by the image corresponds to</summary>
/// <summary>Number in sequence for the media represented by the image</summary> public int LastMediaSequence;
public int MediaSequence; /// <summary>Manufacturer of the drive used to read the media represented by the image</summary>
/// <summary>Last media of the sequence the media represented by the image corresponds to</summary> public string DriveManufacturer;
public int LastMediaSequence; /// <summary>Model of the drive used to read the media represented by the image</summary>
/// <summary>Manufacturer of the drive used to read the media represented by the image</summary> public string DriveModel;
public string DriveManufacturer; /// <summary>Serial number of the drive used to read the media represented by the image</summary>
/// <summary>Model of the drive used to read the media represented by the image</summary> public string DriveSerialNumber;
public string DriveModel; /// <summary>Firmware revision of the drive used to read the media represented by the image</summary>
/// <summary>Serial number of the drive used to read the media represented by the image</summary> public string DriveFirmwareRevision;
public string DriveSerialNumber; /// <summary>Type of the media represented by the image to use in XML sidecars</summary>
/// <summary>Firmware revision of the drive used to read the media represented by the image</summary> public XmlMediaType XmlMediaType;
public string DriveFirmwareRevision;
/// <summary>Type of the media represented by the image to use in XML sidecars</summary>
public XmlMediaType XmlMediaType;
// CHS geometry... // CHS geometry...
/// <summary>Cylinders of the media represented by the image</summary> /// <summary>Cylinders of the media represented by the image</summary>
public uint Cylinders; public uint Cylinders;
/// <summary>Heads of the media represented by the image</summary> /// <summary>Heads of the media represented by the image</summary>
public uint Heads; public uint Heads;
/// <summary>Sectors per track of the media represented by the image (for variable image, the smallest)</summary> /// <summary>Sectors per track of the media represented by the image (for variable image, the smallest)</summary>
public uint SectorsPerTrack; public uint SectorsPerTrack;
} }
/// <summary>Session defining structure.</summary> /// <summary>Session defining structure.</summary>
public struct Session public struct Session
{ {
/// <summary>Session number, 1-started</summary> /// <summary>Session number, 1-started</summary>
public ushort Sequence; public ushort Sequence;
/// <summary>First track present on this session</summary> /// <summary>First track present on this session</summary>
public uint StartTrack; public uint StartTrack;
/// <summary>Last track present on this session</summary> /// <summary>Last track present on this session</summary>
public uint EndTrack; public uint EndTrack;
/// <summary>First sector present on this session</summary> /// <summary>First sector present on this session</summary>
public ulong StartSector; public ulong StartSector;
/// <summary>Last sector present on this session</summary> /// <summary>Last sector present on this session</summary>
public ulong EndSector; public ulong EndSector;
} }
/// <summary>Track defining structure.</summary> /// <summary>Track defining structure.</summary>
public class Track public class Track
{ {
/// <summary>How many main channel / user data bytes are per sector in this track</summary> /// <summary>How many main channel / user data bytes are per sector in this track</summary>
public int BytesPerSector; public int BytesPerSector;
/// <summary>Information that does not find space in this struct</summary> /// <summary>Information that does not find space in this struct</summary>
public string Description; public string Description;
/// <summary>Track ending sector</summary> /// <summary>Track ending sector</summary>
public ulong EndSector; public ulong EndSector;
/// <summary>Which file stores this track</summary> /// <summary>Which file stores this track</summary>
public string File; public string File;
/// <summary>Starting at which byte is this track stored</summary> /// <summary>Starting at which byte is this track stored</summary>
public ulong FileOffset; public ulong FileOffset;
/// <summary>What kind of file is storing this track</summary> /// <summary>What kind of file is storing this track</summary>
public string FileType; public string FileType;
/// <summary>Which filter stores this track</summary> /// <summary>Which filter stores this track</summary>
public IFilter Filter; public IFilter Filter;
/// <summary>Indexes, 00 to 99 and sector offset</summary> /// <summary>Indexes, 00 to 99 and sector offset</summary>
public Dictionary<ushort, int> Indexes; public Dictionary<ushort, int> Indexes;
/// <summary>Track pre-gap</summary> /// <summary>Track pre-gap</summary>
public ulong Pregap; public ulong Pregap;
/// <summary>How many main channel bytes per sector are in the file with this track</summary> /// <summary>How many main channel bytes per sector are in the file with this track</summary>
public int RawBytesPerSector; public int RawBytesPerSector;
/// <summary>Track number, 1-started</summary> /// <summary>Track number, 1-started</summary>
public uint Sequence; public uint Sequence;
/// <summary>Session this track belongs to</summary> /// <summary>Session this track belongs to</summary>
public ushort Session; public ushort Session;
/// <summary>Track starting sector</summary> /// <summary>Track starting sector</summary>
public ulong StartSector; public ulong StartSector;
/// <summary>Which file stores this track's subchannel</summary> /// <summary>Which file stores this track's subchannel</summary>
public string SubchannelFile; public string SubchannelFile;
/// <summary>Which filter stores this track's subchannel</summary> /// <summary>Which filter stores this track's subchannel</summary>
public IFilter SubchannelFilter; public IFilter SubchannelFilter;
/// <summary>Starting at which byte are this track's subchannel stored</summary> /// <summary>Starting at which byte are this track's subchannel stored</summary>
public ulong SubchannelOffset; public ulong SubchannelOffset;
/// <summary>Type of subchannel stored for this track</summary> /// <summary>Type of subchannel stored for this track</summary>
public TrackSubchannelType SubchannelType; public TrackSubchannelType SubchannelType;
/// <summary>Partition type</summary> /// <summary>Partition type</summary>
public TrackType Type; public TrackType Type;
/// <summary>Initializes an empty instance of this structure</summary> /// <summary>Initializes an empty instance of this structure</summary>
public Track() => Indexes = new Dictionary<ushort, int>(); public Track() => Indexes = new Dictionary<ushort, int>();
} }
/// <summary>Floppy physical characteristics structure.</summary> /// <summary>Floppy physical characteristics structure.</summary>
public struct FloppyInfo public struct FloppyInfo
{ {
/// <summary>Physical floppy type.</summary> /// <summary>Physical floppy type.</summary>
public FloppyTypes Type; public FloppyTypes Type;
/// <summary>Bitrate in bits per second used to write the floppy, 0 if unknown or track-variable.</summary> /// <summary>Bitrate in bits per second used to write the floppy, 0 if unknown or track-variable.</summary>
public uint Bitrate; public uint Bitrate;
/// <summary>Physical magnetic density (coercivity) of floppy medium.</summary> /// <summary>Physical magnetic density (coercivity) of floppy medium.</summary>
public FloppyDensities Coercivity; public FloppyDensities Coercivity;
/// <summary>How many physical tracks are actually written in the floppy image.</summary> /// <summary>How many physical tracks are actually written in the floppy image.</summary>
public ushort Tracks; public ushort Tracks;
/// <summary>How many physical heads are actually written in the floppy image.</summary> /// <summary>How many physical heads are actually written in the floppy image.</summary>
public byte Heads; public byte Heads;
/// <summary>How many tracks per inch are actually written in the floppy image.</summary> /// <summary>How many tracks per inch are actually written in the floppy image.</summary>
public ushort TrackDensity; public ushort TrackDensity;
} }
/// <summary>Provides a map for linear memory structure</summary>
public struct LinearMemoryMap
{
/// <summary>List of devices that are mapped to linear memory</summary>
[NotNull]
public LinearMemoryDevice[] Devices { get; set; }
}
/// <summary>Provides information about a linear memory device</summary>
public struct LinearMemoryDevice
{
/// <summary>Device manufacturer</summary>
public string Manufacturer { get; set; }
/// <summary>Device model</summary>
public string Model { get; set; }
/// <summary>Device package, e.g. DIP28</summary>
public string Package { get; set; }
/// <summary>Device location marking in PCB, e.g. U28</summary>
public string Location { get; set; }
/// <summary>Device functional type</summary>
public LinearMemoryType Type { get; set; }
/// <summary>Arbitrary device information</summary>
public string Description { get; set; }
/// <summary>
/// Physical addressing is the address considering all devices in the linear memory media, starting at the lowest
/// marking in PCB and going up incrementally. This is the view of the memory inside Aaru.
/// </summary>
public LinearMemoryAddressing PhysicalAddress { get; set; }
/// <summary>
/// Virtual addressing is the address as seen by the hardware directly accessing the linear memory media. This
/// allows devices to be overlapped or banked.
/// </summary>
public LinearMemoryAddressing VirtualAddress { get; set; }
}
/// <summary>Maps the addressing of a linear memory device</summary>
public class LinearMemoryAddressing
{
/// <summary>Start in memory where the device is mapped</summary>
public ulong Start { get; set; }
/// <summary>Length in bytes of the device, not including interleaving</summary>
public ulong Length { get; set; }
/// <summary>Interleaving information</summary>
public LinearMemoryInterleave Interleave { get; set; }
}
/// <summary>Provides information about a device interleaving</summary>
public class LinearMemoryInterleave
{
/// <summary>How many bytes to skip from start of map before device first byte starts</summary>
public uint Offset { get; set; }
/// <summary>How many bytes in memory to skip every device byte</summary>
public uint Value { get; set; }
} }