Код:
[Serializable]
[Flags]
[Macro("FHDO1$")] public enum F_UCHA : byte
{
UC_RES = 1 // 1 (file was and should be contiguous)
, UC_NIB = 2 // 2 No incremental backup
, UC_WBC = 4 // 4 Write-back cached
, UC_RCK = 8 // 10 Read-checked
, UC_WCK = 16 // 20 Write-checked
, UC_CNB = 32 // 40 Contiguous best-effort
, UC_DLK = 64 // 100 Deaccess-locked (improperly closed)
, UC_CON = 128 // 200 Contiguous
}
[Serializable]
[Flags]
[Macro("FHDO1$")] public enum F_SCHA : byte
{
SC_CHK = 4 // 4 Header checksum == 0xAAAA (no checksum)
, SC_ACL = 8 // 10 ACL, reserved
, SC_SPL = 16 // 20 Intermediate spooling file
, SC_DIR = 32 // 40 Directory (seems like not actually used?)
, SC_BAD = 64 // 100 Bad block in file, not implemented
, SC_MDL = 128 // 200 Marked for deletion
}
[Serializable]
[Flags]
[Macro("FCSBT$")] public enum FileFormats : byte
{
R_UND = 0 // Undefined format (block I/O only)
, R_FIX = 1 // Fixed length records, padded to even
, R_VAR = 2 // Variable length records, padded to even
, R_SEQ = 3 // Sequenced variable length records (aka VFC), -"-
, R_STM = 4 // RMS-11 stream (rec.seps: CR-LF(def), CR, LF, VT, FF [,and ESC]) /* Note VAX RMS removed CR and ESC from generic stream separators. */
, R_STMLF = 5 // RMS-11 stream LF (UNIX) (NB: leading '\0's ignored in streams)
, R_STMCR = 6 // RMS-11 stream CR (NB: streams seq only and may not use FD_BLK)
}
[Serializable]
[Flags]
[Macro("FCSBT$")] public enum FileOrganizations : byte
{
R_RMS_SEQ = 0 // 0 Sequential file (FCS compatible)
, R_RMS_REL = 16 // 20 Relative file
, R_RMS_IDX = 32 // 40 Indexed file
, R_RMS_DIR = 48 // 60 Direct (hashed) file (not directory!) -- never implemented
}
[Serializable]
[Flags]
[Macro("FCSBT$")] public enum RecordAttributes : byte
{
FD_FTN = 1 // 1 FORTRAN carriage control (mutually exlusive with H_FCS_FD_CR)
, FD_CR = 2 // 2 Implied carriage control (each record on a separate line)
, F_PRN = 4 // 4 Print control information for H_FCS_F_SEQ in the "seqn" field
, FD_BLK = 8 // 10 No block boundary spanning for records (padded)
, FD_MSBRCW = 16 // 20 RMS-11 record-length word (for R.SEQ) in MSB order (big-endian)
}
[Macro("FHDO1$")] public class RetrievalPointer
{
[Map("M.CNT: .BLKB ?M.CTSZ")] public UInt32 Count; // block count
[Map("M.LBN: .BLKB ?M.LBSZ")] public UInt32 StartLBN; // first lbn
static RetrievalPointer()
=> Helpers.Mapper<RetrievalPointer>();
public RetrievalPointer(byte[] data, uint baseOffset = 0)
=> this.Mapper2(data, baseOffset);
}
[Macro("FHDO1$")] public partial class ODS1FileHeader
{
[Macro("FHDO1$")] public const UInt16 I_DASZ = 7; // I.DASZ,7
[Macro("FHDO1$")] public const UInt16 I_TISZ = 6; // I.TISZ,6
[Map("H.IDOF: .BLKB 1")] public byte H_IDOF; // [1]
[Map("H.MPOF: .BLKB 1")] public byte H_MPOF; // [1]
[Map("H.FNUM: .BLKW 1")] public UInt16 H_FNUM; // [2]
[Map("H.FSEQ: .BLKW 1")] public UInt16 H_FSEQ; // [2]
[Map("H.FLEV: .BLKW 1")] public UInt16 H_FLEV; // [2]
[Map("H.FOWN: .BLKW 1")] public UIC H_FOWN; // [2]
[Set(".=.-2")]
[Map("H.PROG: .BLKB 1")] public byte H_PROG; // [1]
[Map("H.PROJ: .BLKB 1")] public byte H_PROJ; // [1]
[Map("H.FPRO: .BLKW 1")] public FileProtection H_FPRO; // [2]
[Map("H.FCHA: .BLKW 1")] public UInt16 H_FCHA; // [2]
[Set(".=.-2")]
[Map("H.UCHA: .BLKB 1")] public F_UCHA H_UCHA; // [1]
[Map("H.SCHA: .BLKB 1")] public F_SCHA H_SCHA; // [1]
[Map("H.UFAT: .BLKB 32.")] public byte[] H_UFAT; // [32]
[Set(".=.-32.")]
//[Map("H.DUFAT: .BLKB 32.")] public UFAT H_DUFAT; // [32]
[Map("F.RTYP: .BLKB 1")] public byte F_RTYP; // [1]
[Map("F.RATT: .BLKB 1")] public RecordAttributes F_RATT; // [1]
[Map("F.RSIZ: .BLKW 1")] public UInt16 F_RSIZ; // [2]
[Map("F.HIBK: .BLKW 2", dataOrder: PDP11Order.BigWordEndian)] public ODS1BlockNum F_HIBK; // [4]
[Map("F.EFBK: .BLKW 2", dataOrder: PDP11Order.BigWordEndian)] public ODS1BlockNum F_EFBK; // [4]
[Map("F.FFBY: .BLKW 1")] public UInt16 F_FFBY; // [2]
[Map("F.BKSZ: .BLKB 1")] public byte F_BKSZ; // [1] Bucket size
[Map("F.HDSZ: .BLKB 1")] public byte F_HDSZ; // [1] Fixed header size
[Map("F.MRS: .BLKW 1")] public UInt16 F_MRS; // [2] Maximum record size
[Map("F.DEQ: .BLKW 1")] public UInt16 F_DEQ; // [2] Default extend quantity
[Set(".=??H.IDOF")]
[Map("I.FNAM: .BLKW 3", PDP11Type.Radix50)] public string I_FNAM; // [6]
[Map("I.FTYP: .BLKW 1", PDP11Type.Radix50)] public string I_FTYP; // [2]
[Map("I.FVER: .BLKW 1")] public UInt16 I_FVER; // [2]
public string I_FileName => I_FNAM + "." + I_FTYP + ";" + I_FVER.ToString();
[Map("I.RVNO: .BLKW 1")] public UInt16 I_RVNO; // [2]
[Map("I.RVDT: .BLKB 13.")] public ODS1DateTime I_RVDTTI; // [7]+[6]
//[Map("I.RVTI: .BLKB 6")] public UInt16 I_RVTI; // [6]
[Map("I.CRDT: .BLKB 13.")] public ODS1DateTime I_CRDTTI; // [7]+[6]
//[Map("I.CRTI: .BLKB 6")] public UInt16 I_CRTI; // [6]
[Map("I.EXDT: .BLKB 7")] public ODS1DateTime I_EXDT; // [7]
[Set(".=??H.MPOF")]
[Map("M.ESQN: .BLKB 1")] public byte M_ESQN; // [1] Header Extension Sequence Number
[Map("M.ERVN: .BLKB 1")] public byte M_ERVN; // [1] Header Extension Relative Volume Number (ODS-1 does not use)
[Map("M.EFNU: .BLKW 1")] public UInt16 M_EFNU; // [2] Header Extension File Number
[Map("M.EFSQ: .BLKW 1")] public UInt16 M_EFSQ; // [2] Header Extension File Sequence Number
[Map("M.CTSZ: .BLKB 1")] public byte M_CTSZ; // [1] Count Size (ODS-1 - only 1?)
[Map("M.LBSZ: .BLKB 1")] public byte M_LBSZ; // [1] LBN Size (ODS-1 - only 3?)
[Map("M.USE: .BLKB 1")] public byte M_USE; // [1] Retrieval Pointers in use
[Map("M.MAX: .BLKB 1")] public byte M_MAX; // [1] Retrieval Pointers max
//[Map("S.MPHD:")] public static UInt16 M_MPHD;
[Map("M.RTRV: .BLKW ?M.USE")] public RetrievalPointer[] M_RTRV; // Start of Retrieval pointers
[Set(".=510.")]
[CheckSumm()] public bool IsCheckSumValid;
[Map("H.CKSM: .BLKW 1")] public UInt16 H_CKSM;
static ODS1FileHeader()
=> Helpers.Mapper<ODS1HomeBlock>();
public ODS1FileHeader(byte[] data, uint baseOffset = 0)
=> this.Mapper(data, baseOffset);
}
В Home Block-е тоже есть пара полей с КС, надо и туда добавить описание