Поигрался в первым вариантом реализации - понял, какие куски кода будут повторяться, а так же - чего ещё будет полезным.
Пример - как инициализируется home блок:
Код:
private void InitHomeBlock()
{
// homeblock
ImageData.SetBlk(val: 0, startBlock: 1);
// defaults for home block, according to [VFFM91], page 1-3
// write the bad block replacement table, no idea about it, took from TU58 and RL02 image and from Don North
homeBlock.BadBlockReplacementTable.Clear();
homeBlock.DWAreaInHomeBlock.DWH_C0 = "000000".Octal();
homeBlock.DWAreaInHomeBlock.DWH_C1 = "170000".Octal();
homeBlock.DWAreaInHomeBlock.DWH_C2 = "007777".Octal();
homeBlock.Reserved1 = 0;
// INITIALIZE/RESTORE data area 0204-0251 - leave blank
homeBlock.InitRestoreArea.SavedDirectoryHeader.TotalNumberOfSegments = 0;
homeBlock.InitRestoreArea.SavedDirectoryHeader.NextSegment = 0;
homeBlock.InitRestoreArea.SavedDirectoryHeader.HighestExtent = 0;
homeBlock.InitRestoreArea.SavedDirectoryHeader.ExtraBytePerEntry = 0;
homeBlock.InitRestoreArea.SavedDirectoryHeader.StartDataBlock = 0;
DirectoryEntry_S temp = new()
{
Status = F_ESTAT.E_EMPTY,
FullName = "",
//Name = "",
//Extension = "",
FileSize = 0,
Time = 0,
Used = 0,
Channel = 0,
JobNum = 0,
Date = new(0)
};
homeBlock.InitRestoreArea.Saved1DirectoryEntry = temp;
homeBlock.InitRestoreArea.Saved2DirectoryEntry = temp;
// BUP information area 0252-0273 as 0's
homeBlock.BUPHomeBlock.BUPTag = "";
homeBlock.BUPHomeBlock.BackupName = "";
homeBlock.BUPHomeBlock.BackupType = "";
homeBlock.BUPHomeBlock.CurrentVolumeNumber = 0;
homeBlock.BUPHomeBlock.MaximumVolumeNumber = 0;
homeBlock.BUPHomeBlock.SmallestVolumeSize = 0;
homeBlock.BUPHomeBlock.TotalVolumeSize = 0;
homeBlock.Reserved2.Clear();
homeBlock.UserArea.Clear();
homeBlock.FirstDataBlockNumber = 0;
homeBlock.RTE = 0;
homeBlock.Reserved3.Clear();
homeBlock.ClusterSize = 1;
homeBlock.DirectoryFirstBlockNumber = 6;
homeBlock.SystemVersion = "V05"; // 12 char volume id. V3A, or V05, ...
homeBlock.VolumeID = "RT11A"; // always 12 chars long, right padded with spaces
homeBlock.OwnerName = ""; // 12 char owner name
homeBlock.SystemID = "DECRT11A"; // 12 char system id
homeBlock.Reserved4 = 0;
homeBlock.UpdateCheckSumms(); // build checksum over all words
}