Как там... "Небольшой шаг для человека и громадный для человечества"
Сделал первый (небольшой) шаг на пути к функционалу по созданию образов ODS-1И он отработал - как ожидалось
Шаг действительно небольшой - переделка классов (нууу.. пока только класса для home block-а) описания структуры ODS-1 по той же схеме, что я сделал для DisAsm-11 - то есть, весь код создания объекта выглядит так:
А внутри (любого!) конструктора, использующего этот подход - всего одна строчка:Код:HomeBlock hbtest = new(ImageData.BlkGetBlocks(blkNo));
и всю работу делает (универсальный!) метод MapperКод:public HomeBlock(byte[] data, uint baseOffset = 0) => this.Mapper(data, baseOffset);
Как выглядит описание класса:
Но шаг достаточно важный - так как теперь можно использовать не только простые типы данных (строки, числа, перечисления-флаги), но и более сложные (как например классы VolumeProtection и FileProtection) - при определённых условиях для таких классов - Mapper сможет преобразовать байты или слова из блоков - в соотвествующие объекты.Код:[Serializable] [Flags] [Macro("LBLDF$")] public enum F_VCHA : UInt16 { CH_NDC = 8 // 10 no device control functions , CH_NAT = 16 // 20 no attach/detach // CH.RCK = ?? // Set if the volume is to be read checked (not in RSX?) // CH.WCK = ?? // Set if the volume is to be write checked (not in RSX?) , CH_SDI = 256 // 400 single directory volume } [Serializable] [Macro("HMBO1$")] public class HomeBlock { [Map("H.IBSZ: .BLKW 1")] public UInt16 H_IBSZ; // [2] Index file bitmap size in blocks (number of blocks in the index bitmap, which is the offset for the file-headers) [Map("H.IBLB: .BLKW 2", dataOrder: PDP11Order.BigWordEndian)] public ODS1BlockNum H_IBLB; // [4] Index file bitmap LBN addres ([2] #define H_iblh H_iblb[0] - high word, [2] #define H_ibll H_iblb[1] - low word) (long) -> GetBDWord [Map("H.FMAX: .BLKW 1")] public UInt16 H_FMAX; // [2] Maximum number of files allowed on this volume (& 077777) [Map("H.SBCL: .BLKW 1")] public UInt16 H_SBCL; // [2] Storage bitmap cluster factor (cluster size for storage bitmap); the only legal value for this item in ODS-1 is must always be 1 // (That means, the disk cluster sizes 2 - that is two 512 byte sectors (1 kbyte) was the smallest chunk of disk that would be allocated to store a file. Etc.) [Map("H.DVTY: .BLKW 1")] public UInt16 H_DVTY; // [2] Disk device type [Map("H.VLEV: .BLKW 1")] public UInt16 H_VLEV; // [2] Volume structure level (ods-1 = 0x102, ods-2 = 0x201) [Map("H.VNAM: .BLKB 12.")] public string H_VNAM; // [12] Volume name (id) [Set(".=.+4")] [Map("H.VOWN: .BLKW 1")] public string H_VOWN; // [2] Volume owner's decimal UIC in binary (ie: [1,1]) [Map("H.VPRO: .BLKW 1")] public VolumeProtection H_VPRO; // [2] Volume protection code [Map("H.VCHA: .BLKW 1")] public F_VCHA H_VCHA; // [2] Volume characteristics (24 (030) = no attach, no device control fcns) [Map("H.DFPR: .BLKW 1")] public FileProtection H_DFPR; // [2] Default file protection (2 h_dfpr = 164000 - default protection for files) ... static HomeBlock() => Helpers.Mapper<HomeBlock>(); public HomeBlock(byte[] data, uint baseOffset = 0) => this.Mapper(data, baseOffset); }
Что будет дальше - надо описать полностью те классы, которые я сделал (но по другому) для работы по распаковки ODS-1, сделать возможным изменения для объектов этих классов (технически, первый вариант это позволяет, но.. не всё там будет гладко) и нарисовать метод ReMapper - для обратного преобразовния - то есть из объекта в блок (блоки) для образа диска. А его уже можно будет сбрасывать в образПопробую успеть за выходные полностью сделать новое описние и этот функционал для Home блока. Описание - тупо перенести остаток (ну и сделать некоторое количество классов типа FileProtection и VolumeProtection) - достаточно механическая работы. ReMapper тоже не сильно сложный, так как он похож на Mapper, только в обратную сторону
Ну и по прежнему идёт рефакторинг - как выяснилось - приличное количество кода повторяется, что не есть порядок
А, да, в .NET 6 есть некоторое количество своих приколов, так что налетел в паре мест на то, что код в старом .NET (4.x) работает, а в новом - фиг вамРешилось достаточно быстро
- - - Добавлено - - -
А, да, ещё - на работа небольшая запарка, так что в рабочие дни процесс идёт так себе.. Но по часу-два вроде получится выделять. А вот во второй половине декабря - начнётся отпуск - где-то до 10 января - там получится оторватьсяМожет даже повожусь с PDP-2011
Ну и ещё одна цель - аналог подключенных к HD в эмуляторе Патрона папок - ещё и с ODS-1И с возможностью цеплять их к реальных PDP-11 - пока только в варианте через контроллер DD (у него общение идёт через serial порт на стороне PDP-11), но есть некоторые мысли - какой путь выбрать дальше
![]()





И он отработал - как ожидалось
Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
