Можно. Только я до правок генерации .ASCII так и не добрался, что бы собрать обратно - нужны будут ручные правки после генерации исходника.
Вечером выложу текущую версию и пришлю ссылку
Можно. Только я до правок генерации .ASCII так и не добрался, что бы собрать обратно - нужны будут ручные правки после генерации исходника.
Вечером выложу текущую версию и пришлю ссылку
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
На работе (в рабочее время имеется ввиду) нарисовался перерыв и вспомнилась мне задумка - сделать более удобной работой с комментариями. Почесав почесуемое, решил - пуркуа бы и не па? Сколько времени затратил - не скажу - и не вёл учёт времени (всё таки не работа) и с перерывами делалось и больше вылизывал удобство работы, а не сам функционал, но.. не много. Так что теперь комменатрии вводятся почти как в текстовом редакторы - жмём ; на выбранной команде (или данных), вводим комментарий, нажимаем Enter, вводим комментарий для следующей команды (или данных) и так, пока не надоест или комментарии не закончатся, а тогда жмём Esc и возвращаемся в окно листинга. Вводит можно в любом из трёх окон.
А потом голову посетила мысль, что теперь извлекать .TSK файлы из образов RSX сталко плёвым делом - и решил я добавить поддержку и таких файловВообщем, начал пилить. Собственно, для допила требуется только распотрощить служебку - и всё.
Но пока, как и для .SAV файлов - никаких оверлеев и никаких I-D задач. Это на будущее.
Ещё в TSK поддерживаются резидентные библиотеки (некоторый аналог .DLL в Windows) - посмотрю, возможно это дело включу в данном релизе.
И, поскольку такой вопрос периодически возникает, продублирую ответ здесь, в первом сообщении, а потом и в теме про ImgUtil (и всех всех всех с ней связанных)
Пока большая часть моих программ - RequestWare, то есть, если что-то из написанного мной кому-то интересно, а у меня на недо-сайте не выложено - пишем в теме или в личку - обсуждаемо.
Развлечения с .TSK продолжаются. Формат "несколько" сложней других форматх и не всё с ходу понятно по документации, но картинка постепенно вырисовывается. Но до теста Моментальная идентичность ещё далеко. Да и что бы его реализовать - нужна генерация не только .MAC файла, но и командника для сборщика TKB...
Одна из "проблем", нарисовавшихся первоначально при написании ImgUtil, а затем и DisAsm-11 - в силу сложной структуры .TSK - необходимость переноса определений всяких констант, смещений и т.п., которые были сделаны через макросы в макробиблиотеках, выглядевшие примерно так:
Первоначально всё это дело переносилось руками 1) в описание констант-смещений, а затем 2) создавались описания классов для удобства программирования, после чего это выглядело примерно так:Код:.MACRO LBLDF$ L,B .ASECT .=0 R$LNAM:'L'.BLKW 2 R$LSA:'L' .BLKW 1 R$LHGV:'L'.BLKW 1 R$LMXV:'L'.BLKW 1 R$LLDZ:'L'.BLKW 1 R$LMXZ:'L'.BLKW 1 R$LOFF:'L'.BLKW 1 R$LWND:'L'.BLKW 1 R$LSEG:'L'.BLKW 1 R$LFLG:'L'.BLKW 1 R$LDAT:'L'.BLKW 3 R$LSIZ:'L'.BLKW 0 LD$ACC='B'100000 LD$RSV='B'040000 LD$CLS='B'020000 LD$SMV='B'010000 LD$SCL='B'000200 LD$AMK='B'000060 LD$RES='B'000040 LD$SUP='B'000010 LD$REL='B'000004 LD$TYP='B'000002 ....
и этот процесс был как долгим в принципе, так и чреват ошибками. Была уже мысль написать некий скрипт, который на основе макроса создавал бы похожие описания, но..Код:[Flags] public enum LD_FLG: UInt16 { LD_TYP = 2 // 2 Shared region type (1 - common, 1 - library) , LD_REL = 4 // 4 Position-independent code (PIC) flag (1 - PIC) , LD_SUP = 8 // 10 Supervisor mode library (1 - yes) , LD_RES = 32 // 40 Library has memory-resident overlays , LD_CLS = 8192 // 20000 Library is part of a cluster , LD_RSV = 16384 // 40000 APR was reserved , LD_ACC = 32768 // 100000 Access intention (1 - rw, 0 - ro) } ... public static class RLBDF { public static readonly UInt16 R_LNAM = 0; // 4 Library/common name public static readonly UInt16 R_LSA = (ushort)(R_LNAM + 4); // 2 Base address of library public static readonly UInt16 R_LHGV = (ushort)(R_LSA + 2); // 2 Highest address in first library window public static readonly UInt16 R_LMXV = (ushort)(R_LHGV + 2); // 2 Highest address in library public static readonly UInt16 R_LLDZ = (ushort)(R_LMXV + 2); // 2 Library load size (64 byte blocks) public static readonly UInt16 R_LMXZ = (ushort)(R_LLDZ + 2); // 2 Library max size (64 byte blocks) public static readonly UInt16 R_LOFF = (ushort)(R_LMXZ + 2); // 2 Library offset into region public static readonly UInt16 R_LWND = (ushort)(R_LOFF + 2); // 2 Number of library window blocks public static readonly UInt16 R_LSEG = (ushort)(R_LWND + 2); // 2 Size of library segment desciptors public static readonly UInt16 R_LFLG = (ushort)(R_LSEG + 2); // 2 Library flag word public static readonly UInt16 R_LDAT = (ushort)(R_LFLG + 2); // 2+2+2 Library creation date - year, month, day public static readonly UInt16 R_LSIZ = (ushort)(R_LDAT + 6); // length }
Мне как то не нравилась сама эта идея (да и написание скрипта - тоже не быстро и не сразу под всякие варианты), потому как она не решала две другие проблемы - короткие имена членов класса и преобразование "сырых" данных, прочитанных из файла (по сути - массив байт) в экземпляры класса.
Да, имена членов класса можно после написания программы можно переименовать (и VS поможет найти и поправить старые имена по всему проекту), но после этого терялась связь с первоначальными именами - если только не переносить их - руками - во что-нибудь типа комментариев.
Плюс - под каждый класс надо было писать конструктор, типа такого:
который принимает на вход массив байт и парсит его по полям класса. Ещё одна совершенно "ручная" и нудная задача.Код:public SharedRegion(byte[] data) { Name = data.GetDWord(RLBDF.R_LNAM).Radix50().Trim(); BaseAddress = data.GetWord(RLBDF.R_LSA); HighetFirstWinAddress = data.GetWord(RLBDF.R_LHGV); HighestVirtualAddress = data.GetWord(RLBDF.R_LMXV); LoadSizeIn64bBlocks = data.GetWord(RLBDF.R_LLDZ); MaximumSizeIn64bBlocks = data.GetWord(RLBDF.R_LMXZ); OffsetIntoPartition = data.GetWord(RLBDF.R_LOFF); WindowBlocksCount = data.GetWord(RLBDF.R_LWND); SizeOfSegmentDescriptors = data.GetWord(RLBDF.R_LSEG); Flags = (LD_FLG)data.GetWord(RLBDF.R_LFLG); CreationDate = new RSXDate(data.GetTWord(RLBDF.R_LDAT)); }
И вот сегодня, почесав почесуемое, решил я использовать возможности .NET (однажды такое уже было, но несколько в другой области). А именно - аттрибуты и рефлексиюПримерно через три часа программирования - остался только один класс, который выглядит примерно так:
а его конструктора - так:Код:public class SharedRegion { [Map("R$LNAM: .BLKW 2", PDP11Type.Radix50)] public string Name; // Shared region name [Map("R$LSA: .BLKW 1")] public UInt16 BaseAddress; // Base virtual address [Map("R$LHGV: .BLKW 1")] public UInt16 HighetFirstWinAddress; // Highest address in first library window [Map("R$LMXV: .BLKW 1")] public UInt16 HighestVirtualAddress; // Highest address in library [Map("R$LLDZ: .BLKW 1")] public UInt16 LoadSizeIn64bBlocks; // Library load size (64 byte blocks) [Map("R$LMXZ: .BLKW 1")] public UInt16 MaximumSizeIn64bBlocks; // Library max size (64 byte blocks) [Map("R$LOFF: .BLKW 1")] public UInt16 OffsetIntoPartition; // Library offset into region [Map("R$LWND: .BLKW 1")] public UInt16 WindowBlocksCount; // Number of library window blocks [Map("R$LSEG: .BLKW 1")] public UInt16 SizeOfSegmentDescriptors; // Size of library overlay segment descriptor [Map("R$LFLG: .BLKW 1")] public LD_FLG Flags; // Library flag word public bool IsLibrary => ((Flags & LD_FLG.LD_TYP) != 0); // 2 Shared region type (1 - common, 1 - library) public bool IsPositionIndependentCode => ((Flags & LD_FLG.LD_REL) != 0); // 4 Position-independent code (PIC) flag (1 - PIC) public bool IsSupervisorModeLibrary => ((Flags & LD_FLG.LD_SUP) != 0); // 10 Supervisor mode library (1 - yes) public bool HasMemoryResidentOverlays => ((Flags & LD_FLG.LD_RES) != 0); // 40 Library has memory-resident overlays public bool IsClusterPart => ((Flags & LD_FLG.LD_CLS) != 0); // 20000 Library is part of a cluster public bool IsAPRReserved => ((Flags & LD_FLG.LD_RSV) != 0); // 40000 APR was reserved public bool IsRWAccessIntention => ((Flags & LD_FLG.LD_ACC) != 0); // 100000 Access intention (1 - rw, 0 - ro) [Map("R$LDAT: .BLKW 3")] public RSXDate CreationDate; // Library creation date [Map("R$LSIZ:")] public static UInt16 Length; // Block length
И вот этот метод Mapper - он общий для любого класса, описание которое построено таким же образом. И большую часть такого описания класса можно сделать с помощью макросов в FAR-е на основе исходного макроса. Останется только добавить название полей в класс для C# и нарисовать простейшие конструкторы. Всё. Длина поля, как можно видеть, берётся из макроса, а смещение в блоке байт высчитывается на основении описаний в методе Mapper. Плюс этот метод может осуществлять и некоторые преобразование - скажем, поле Name ("R$LNAM") хранится как два слова в формате Radix50 - но в объект класса C# будет перенесено как строка.Код:public SharedRegion(byte[] data) { this.Mapper(data); }
Пока это больше концептуальная идея (есть ещё нюансы, над которыми надо подумать - скажем, пока не нравится, как выглядят и как используются описания флагов), но технически её УЖЕ можно задействовать. Одну описанную пару классов я переделал, надо переделать вторую, а вот описание третьего блока данных уже будет делаться сразу по такой схеме - а значит - конструктор можно будет уже не писать
Ну и как в очередной раз буду развлекаться в ImgUtil - тоже начну переделывать по такой схеме![]()
А что кстати под RT-11 нет дизасма? Внезапно казалось что должен быть какой-т.
Но вообще полезное дело да, вдруг кому пригодится
(правда даже имея исходник понять чет сложно, даже с комментариями, сам глянул в свой код на асме и голова гругом пошла мол "че тут такое".. но лучше чтоб был дизасм чем чтобы его не было, иначе утеряна способность в 8-ричных кодах читать программу)
Последний раз редактировалось BlaireCas; 20.08.2022 в 12:39.
Ну как бы сейчас уже какой-никакой есть, но.
Были и раньше. Но - или совсем тупые (то есть тупо в лоб и практически без возможности повлиять на генерацию кода) или мне не нравились (типа IDA - хотя про него говорили, что его можно допилить модулями на Phyton-е, но меня и этот вариант не устроил).
В целом же меня интересовал более универсальный вариант. Уже сейчас - образ памяти, .LDA, .SAV и какой-никакой, но вариант для .TSK), плюс возможность подсказки, плюс комментарии. Пока во всех вариантах - программы без оверлеев и образы без страничной организации (ну тут я начинаю приближаться к доделке). Плюс - можно прерваться, сохранить уже натворённое и потом вернутся. Плюс - генерация полноценного .MAC (в том числе через командную строку) - то есть его можно подсунуть ассемблеру, потом компоновщику и (пока без особоых теледвижения для .SAV) сравнить с исходником.
Ну и какое никакое развитие - правда, в основном в режиме - понадобилось что-то ещё дизассемблировать - оппа - чего-то не хватает - а не дописать лиВот как сейчас.
Как показала моя практика года так два, что ли, назад - для меня и процесс разборки логики дизассмеблированного и процесс понимания потом, по прошествию времени - резко ускорился после перехода на использования макросов для структурного программирования. Которые, кстати, ускорили и написание кода - примерно так на порядок
- - - Добавлено - - -
Ну а насколько удобен или нет DisAsm-11 кому то, кроме меня (мне то понятно - под меня писался) - можно поинтересоваться у anasana-ы - он его использовал для восстановления исходников тестов![]()
Последний раз редактировалось Hunta; 18.11.2022 в 20:26.
Структура метки (первый блок) .TSK файла немного отличается между вариантом под M и под M-Plus (из за поддержки разделяемых библиотек режима супервизора). И из-за этого различия некоторые поля имеют разные смещения в зависимости от содержимого поля L$BSYS (4 для M-Plus). А сама структура метки - фиксированная по длине часть; переменная по длине часть; фиксированная по длине часть. И после некоторого размышления - получилось сделать описание и под такой вариант (своеобразный if else в аттрибутах):
Конструктор этого класса в старом варианте:Код:public class TaskLabel { [Map("L$BTSK: .BLKW 2", PDP11Type.Radix50)] public string TaskName; [Map("L$BPAR: .BLKW 2", PDP11Type.Radix50)] public string TaskPartitionName; [Map("L$BSA: .BLKW 1")] public UInt16 BaseAddress; [Map("L$BHGV: .BLKW 1")] public UInt16 HighestWin0VirtualAddress; [Map("L$BMXV: .BLKW 1")] public UInt16 HighestVirtualAddress; [Map("L$BLDZ: .BLKW 1")] public UInt16 LoadSizeIn64bBlocks; [Map("L$BMXZ: .BLKW 1")] public UInt16 MaximumSizeIn64bBlocks; [Map("L$BOFF: .BLKW 1")] public UInt16 OffsetIntoPartition; [Map("L$BWND: .BLKB 1")] public byte WindowBlocksCount; [Map("L$BSYS: .BLKB 1")] public byte SysID; [Map("L$BSEG: .BLKW 1")] public UInt16 SizeOfOverlaySegmentDescriptors; [Map("L$BFLG: .BLKW 1")] public TS_FLG Flags; public bool IsNoExternalHeader => ((Flags & TS_FLG.TS_NXH) != 0); public bool IsExternalHeader => ((Flags & TS_FLG.TS_XHR) != 0); public bool IsPriviledge => ((Flags & TS_FLG.TS_PRV) != 0); public bool IsDoesNotMapIOPage => ((Flags & TS_FLG.TS_IOP) != 0); public bool IsCheckpointable => ((Flags & TS_FLG.TS_CHK) != 0); public bool IsInCompatabilityMode => ((Flags & TS_FLG.TS_CMP) != 0); public bool IsNoSend => ((Flags & TS_FLG.TS_NSD) != 0); public bool IsSlaveTask => ((Flags & TS_FLG.TS_SLV) != 0); public bool IsGeneratesPostmortDump => ((Flags & TS_FLG.TS_PMD) != 0); public bool IsAncillaryControlProcessor => ((Flags & TS_FLG.TS_ACP) != 0); public bool IsNoHeader => ((Flags & TS_FLG.TS_NHD) != 0); public bool IsPositionIndependentCode => ((Flags & TS_FLG.TS_PIC) != 0); [Map("L$BDAT: .BLKW 3")] public RSXDate CreationDate; [Map("L$BLIB: .BLKW ?L$BSYS:=4:15:7")] public SharedRegion[] SharedRegions; [Map("L$SOME: .BLKW 1")] public UInt16 Some; [Map("L$BPRI: .BLKW 1")] public UInt16 Priority; [Map("L$BXFR: .BLKW 1")] public UInt16 TransferAddress; [Map("L$BEXT: .BLKW 1")] public UInt16 TaskExtension; [Map("L$BSGL: .BLKW 1")] public UInt16 SegmentLoadListBlockNumber; [Map("L$BHRB: .BLKW 1")] public UInt16 HeaderBlockNumber; [Map("L$BBLK: .BLKW 1")] public UInt16 LabelBlockCount; [Map("L$BLUN: .BLKW 1")] public UInt16 LUNCount; [Map("L$BROB: .BLKW 1")] public UInt16 ROImageRelativeBlockNumber; [Map("L$BROL: .BLKW 1")] public UInt16 ROImageLoadSize; [Map("L$BRDL: .BLKW 1")] public UInt16 RODataSizeIn64bBlocks; [Map("L$BHDB: .BLKW 1")] public UInt16 DataHeaderRelativeBlockNumber; [Map("L$BDHV: .BLKW 1")] public UInt16 DataWin1HighVirtualAddress; [Map("L$BDMV: .BLKW 1")] public UInt16 DataHighVirtualAddress; [Map("L$BDLZ: .BLKW 1")] public UInt16 DataLoadSize; [Map("L$BDMZ: .BLKW 1")] public UInt16 DataMaxSize; [Map("L$BAPR: .BLKW 1")] public UInt16 BAPR; // ?? [Set(".=772")] [Map("L$BFL2: .BLKW 1")] public static TS_FLG2 Flags2; [Map("L$BLRL: .BLKW 1")] public UInt16 BLRL; // ?? [Map("L$AME: .BLKW 1")] public UInt16 AME; // ?? [Set(".=1000")] [Map("L$BASG:")] public static UInt16 Length; ...
и в новом:Код:public TaskLabel(byte[] data, uint baseOffset = 0) { TaskName = data.GetDWord(LBLDF.L_BTSK).Radix50().Trim(); TaskPartitionName = data.GetDWord(LBLDF.L_BPAR).Radix50().Trim(); BaseAddress = data.GetWord(LBLDF.L_BSA); HighestWin0VirtualAddress = data.GetWord(LBLDF.L_BHGV); HighestVirtualAddress = data.GetWord(LBLDF.L_BMXV); LoadSizeIn64bBlocks = data.GetWord(LBLDF.L_BLDZ); MaximumSizeIn64bBlocks = data.GetWord(LBLDF.L_BMXZ); OffsetIntoPartition = data.GetWord(LBLDF.L_BOFF); WindowBlocksCount = data[LBLDF.L_BWND]; SysID = data[LBLDF.L_BSYS]; SizeOfOverlaySegmentDescriptors = data.GetWord(LBLDF.L_BSEG); Flags = (TS_FLG)data.GetWord(LBLDF.L_BFLG); CreationDate = new RSXDate(data.GetTWord(LBLDF.L_BDAT)); UInt16 currPtr = LBLDF.L_BLIB; int maxCnt = SysID == 4? 15 : 7; int commonCnt = 0; while ((maxCnt > 0) && (data.GetWord(currPtr) != 0)) { maxCnt--; commonCnt++; currPtr += (UInt16)typeof(SharedRegion).GetOffset("R$LSIZ"); } if ((maxCnt == 0) && (data.GetWord(currPtr) != 0)) throw new FormatException("Error in task label"); commonCnt = WindowBlocksCount; SharedRegions = new SharedRegion[commonCnt]; UInt16 R_LSIZ = (UInt16)typeof(SharedRegion).GetOffset("R$LSIZ"); for (int idx=0; idx<commonCnt; idx++) { SharedRegions[idx] = new(data, (uint)(LBLDF.L_BLIB + idx * R_LSIZ)); } if (SysID == 4) { Priority = data.GetWord(LBLDF.L_BPRI_MP); TransferAddress = data.GetWord(LBLDF.L_BXFR_MP); TaskExtension = data.GetWord(LBLDF.L_BEXT_MP); SegmentLoadListBlockNumber = data.GetWord(LBLDF.L_BSGL_MP); HeaderBlockNumber = data.GetWord(LBLDF.L_BHRB_MP); LabelBlockCount = data.GetWord(LBLDF.L_BBLK_MP); LUNCount = data.GetWord(LBLDF.L_BLUN_MP); ROImageRelativeBlockNumber = data.GetWord(LBLDF.L_BROB_MP); ROImageLoadSize = data.GetWord(LBLDF.L_BROL_MP); RODataSizeIn64bBlocks = data.GetWord(LBLDF.L_BRDL_MP); DataHeaderRelativeBlockNumber = data.GetWord(LBLDF.L_BHDB_MP); DataWin1HighVirtualAddress = data.GetWord(LBLDF.L_BDHV_MP); DataHighVirtualAddress = data.GetWord(LBLDF.L_BDMV_MP); DataLoadSize = data.GetWord(LBLDF.L_BDLZ_MP); DataMaxSize = data.GetWord(LBLDF.L_BDMZ_MP); BAPR = data.GetWord(LBLDF.L_BAPR_MP); // ?? } else { Priority = data.GetWord(LBLDF.L_BPRI); TransferAddress = data.GetWord(LBLDF.L_BXFR); TaskExtension = data.GetWord(LBLDF.L_BEXT); SegmentLoadListBlockNumber = data.GetWord(LBLDF.L_BSGL); HeaderBlockNumber = data.GetWord(LBLDF.L_BHRB); LabelBlockCount = data.GetWord(LBLDF.L_BBLK); LUNCount = data.GetWord(LBLDF.L_BLUN); ROImageRelativeBlockNumber = data.GetWord(LBLDF.L_BROB); ROImageLoadSize = data.GetWord(LBLDF.L_BROL); RODataSizeIn64bBlocks = data.GetWord(LBLDF.L_BRDL); DataHeaderRelativeBlockNumber = data.GetWord(LBLDF.L_BHDB); DataWin1HighVirtualAddress = data.GetWord(LBLDF.L_BDHV); DataHighVirtualAddress = data.GetWord(LBLDF.L_BDMV); DataLoadSize = data.GetWord(LBLDF.L_BDLZ); DataMaxSize = data.GetWord(LBLDF.L_BDMZ); BAPR = data.GetWord(LBLDF.L_BAPR); // ?? } }
Безусловно, Mapper был дописан для поддержки нового описания в MapКод:public TaskLabel(byte[] data) { this.Mapper<TaskLabel>(data); }И доделка предполагает и несколько более сложные варианты - несколько вариантов длины блока переменной длины. И блок может быть не один. В целом же - доделка пока идёт по принципу - налетим на что то ещё в макросах - подпилим Mapper
Осталось подумать над работой с флагами![]()
Новое описание с самого начала сделано по такой схеме.
Слегка расширен функционал Mapper-аКод:[Macro("HDRDF$")] public class TaskHeader { [Map("H.CSP: .BLKW 1")] public UInt16 CurrentStackPointer; // Current stack pointer [Map("H.HDLN: .BLKW 1")] public UInt16 HeaderLength; // Header length [Map("H.EFLM: .BLKW 1")] public UInt16 EventFlagMask; // Event flag mask [Set(".=.-2")] [Map("H.SMAP: .BLKB 1")] public byte SupervisorModeMappingMask; // Supervisor mode mapping mask [Map("H.DMAP: .BLKB 1")] public byte IDSpaceModeMappingMask; // I- and D-space mode mapping mask [Map("H.EFLA: .BLKW 1")] public UInt16 EventFlagAddress; // Event flag address [Set(".=.-2")] [Map("H.FMAP: .BLKW 1")] public UInt16 H_FMAP; // ?? [Map("H.CUIC: .BLKW 1")] public UInt16 CurrentUIC; // Current UIC [Map("H.DUIC: .BLKW 1")] public UInt16 DefaultUIC; // Default UIC [Map("H.IPS: .BLKW 1")] public UInt16 InitialPS; // Initial PS [Map("H.IPC: .BLKW 1")] public UInt16 InitialPC; // Initial PC [Map("H.ISP: .BLKW 1")] public UInt16 InitialSP; // Initial SP [Map("H.ODVA: .BLKW 1")] public UInt16 ODTSSTVectorAddress; // ODT SST vector address [Map("H.ODVL: .BLKW 1")] public UInt16 ODTSSTVectorLength; // ODT SST vector length [Map("H.TKVA: .BLKW 1")] public UInt16 TaskSSTVectorAddress; // Task SST vector address [Map("H.TKVL: .BLKW 1")] public UInt16 TaskSSTVectorLength; // Task SST vector length [Map("H.PFVA: .BLKW 1")] public UInt16 PowerFailASTControlBlock; // Power fail AST control block [Map("H.FPVA: .BLKW 1")] public UInt16 FloatingPointASTControlBlock; // Floating-point AST control block [Map("H.RCVA: .BLKW 1")] public UInt16 ReceiveASTControlBlock; // Receive AST control block [Map("H.EFSV: .BLKW 1")] public UInt16 EventFlagContextAddress; // Address of event flag context [Map("H.FPSA: .BLKW 1")] public UInt16 FloatingPointContextAddress; // Address of floating-point context [Map("H.WND: .BLKW 1")] public UInt16 PointerToNumberOfWindowBlock; // Pointer to number of window block [Map("H.DSW: .BLKW 1")] public UInt16 DirectiveStatusWord; // Directive status word [Map("H.FCS: .BLKW 1")] public UInt16 FCSImpureStorageAddress; // Address of FCS impure storage [Map("H.FORT: .BLKW 1")] public UInt16 FORTRANImpureStorageAddress; // Address of FORTRAN impure storage [Map("H.OVLY: .BLKW 1")] public UInt16 OverlayImpureStorageAddress; // Address of overlay impure storage [Map("H.VEXT: .BLKW 1")] public UInt16 ImpureVectorsAddress; // Address of impure vectors [Map("H.SPRI: .BLKB 1")] public byte SwappingPriority; // Swapping priority [Map("H.NML: .BLKB 1")] public byte MailboxLUN; // Mailbox LUN [Map("H.RRVA: .BLKW 1")] public UInt16 ReceiveByReferenceASTControlBlock; // Receive by reference AST control block [Map("H.X25: .BLKB 1")] public byte X25; // H_X25 [Map("H.RES1: .BLKB 1")] public byte H_Reserved1; // Reserved [Map("H.RES2: .BLKW 1")] public UInt16 H_Reserved2; // Reserved [Map("H.LUTE: .BLKW 1")] public UInt16 H_LUTE; // Reserved [Map("H.GARD: .BLKW 1")] public UInt16 HeaderGuardWord; // Header guard word [Map("H.NLUN: .BLKW 1")] public UInt16 NumberOfLUNs; // Number of luns [Map("H.LUN: .BLKW ?H.NLUN")] public LUNDescriptor[] LUNTable; // LUN table (2 words per LUN) static TaskHeader() => Helpers.Mapper<TaskLabel>(); public TaskHeader(byte[] data, uint baseOffset = 0) => this.Mapper<TaskHeader>(data, baseOffset); }
Законченный TaskHeader
- - - Добавлено - - -Код:[Macro("HDRDF$")] public class TaskHeader { [Map("H.CSP: .BLKW 1")] public UInt16 CurrentStackPointer; // Current stack pointer [Map("H.HDLN: .BLKW 1")] public UInt16 HeaderLength; // Header length [Map("H.EFLM: .BLKW 1")] public UInt16 EventFlagMask; // Event flag mask [Set(".=.-2")] [Map("H.SMAP: .BLKB 1")] public byte SupervisorModeMappingMask; // Supervisor mode mapping mask [Map("H.DMAP: .BLKB 1")] public byte IDSpaceModeMappingMask; // I- and D-space mode mapping mask [Map("H.EFLA: .BLKW 1")] public UInt16 EventFlagAddress; // Event flag address [Set(".=.-2")] [Map("H.FMAP: .BLKW 1")] public UInt16 H_FMAP; // ?? [Map("H.CUIC: .BLKW 1")] public UInt16 CurrentUIC; // Current UIC [Map("H.DUIC: .BLKW 1")] public UInt16 DefaultUIC; // Default UIC [Map("H.IPS: .BLKW 1")] public UInt16 InitialPS; // Initial PS [Map("H.IPC: .BLKW 1")] public UInt16 InitialPC; // Initial PC [Map("H.ISP: .BLKW 1")] public UInt16 InitialSP; // Initial SP [Map("H.ODVA: .BLKW 1")] public UInt16 ODTSSTVectorAddress; // ODT SST vector address [Map("H.ODVL: .BLKW 1")] public UInt16 ODTSSTVectorLength; // ODT SST vector length [Map("H.TKVA: .BLKW 1")] public UInt16 TaskSSTVectorAddress; // Task SST vector address [Map("H.TKVL: .BLKW 1")] public UInt16 TaskSSTVectorLength; // Task SST vector length [Map("H.PFVA: .BLKW 1")] public UInt16 PowerFailASTControlBlock; // Power fail AST control block [Map("H.FPVA: .BLKW 1")] public UInt16 FloatingPointASTControlBlock; // Floating-point AST control block [Map("H.RCVA: .BLKW 1")] public UInt16 ReceiveASTControlBlock; // Receive AST control block [Map("H.EFSV: .BLKW 1")] public UInt16 EventFlagContextAddress; // Address of event flag context [Map("H.FPSA: .BLKW 1")] public UInt16 FloatingPointContextAddress; // Address of floating-point context [Map("H.WND: .BLKW 1")] public UInt16 PointerToNumberOfWindowBlock; // Pointer to number of window block [Map("H.DSW: .BLKW 1")] public UInt16 DirectiveStatusWord; // Directive status word [Map("H.FCS: .BLKW 1")] public UInt16 FCSImpureStorageAddress; // Address of FCS impure storage [Map("H.FORT: .BLKW 1")] public UInt16 FORTRANImpureStorageAddress; // Address of FORTRAN impure storage [Map("H.OVLY: .BLKW 1")] public UInt16 OverlayImpureStorageAddress; // Address of overlay impure storage [Map("H.VEXT: .BLKW 1")] public UInt16 ImpureVectorsAddress; // Address of impure vectors [Map("H.SPRI: .BLKB 1")] public byte SwappingPriority; // Swapping priority [Map("H.NML: .BLKB 1")] public byte MailboxLUN; // Mailbox LUN [Map("H.RRVA: .BLKW 1")] public UInt16 ReceiveByReferenceASTControlBlock; // Receive by reference AST control block [Map("H.X25: .BLKB 1")] public byte X25; // H_X25 [Map("H.RES1: .BLKB 1")] public byte H_Reserved1; // Reserved [Map("H.RES2: .BLKW 1")] public UInt16 H_Reserved2; // Reserved [Map("H.LUTE: .BLKW 1")] public UInt16 H_LUTE; // Reserved [Map("H.GARD: .BLKW 1")] public UInt16 HeaderGuardWordPointer; // Header guard word pointer [Map("H.NLUN: .BLKW 1")] public UInt16 NumberOfLUNs; // Number of luns [Map("H.LUN: .BLKW ?H.NLUN")] public LUNDescriptor[] LUNTable; // LUN table (2 words per LUN) // Check RSX names! [Map("H.NWIN: .BLKW 1")] public UInt16 NumberOfWindows; // Number of Window blocks [Map("H.WIN: .BLKW ?H.NWIN")] public WindowBlock[] WindowBlocks; // Window Blocks [Map("H.CPS: .BLKW 1")] public UInt16 CurrentPS; // Current PS [Map("H.CPC: .BLKW 1")] public UInt16 CurrentPC; // Current PC [Map("H.CR5: .BLKW 1")] public UInt16 CurrentR5; // Current R5 Initial value - Relative block number of header [Map("H.CR4: .BLKW 1")] public UInt16 CurrentR4; // Current R4 Initial value - Ident word #2 [Map("H.CR3: .BLKW 1")] public UInt16 CurrentR3; // Current R3 Initial value - Ident word #1 [Set(".=.-4")] [Map("H.IDENT:.BLKW 2", PDP11Type.InvertRadix50)] public string Ident; // Ident [Map("H.CR2: .BLKW 1")] public UInt16 CurrentR2; // Current R2 Initial value - Task name word #2 (if include debugger) [Map("H.CR1: .BLKW 1")] public UInt16 CurrentR1; // Current R1 Initial value - Task name word #1 (if include debugger) [Set(".=.-4")] [Map("H.IDENT:.BLKW 2", PDP11Type.InvertRadix50)] public string TaskName; // Task name [Map("H.CR0: .BLKW 1")] public UInt16 CurrentR0; // Current R0 Initial value - Program transfer address (if include debugger) [Map("H.GRD: .BLKW 1")] public UInt16 HeaderGuardWord; // Header guard word //public static readonly UInt16 H_FPSL=25.*2; static TaskHeader() => Helpers.Mapper<TaskHeader>(); public TaskHeader(byte[] data, uint baseOffset = 0) => this.Mapper(data, baseOffset); }
В основном возня с аттрибутами закончена, осталось описать ещё один класс на инфу из служебной части .TSK (на данном этапе ни на что не влияет), теперь буду разбираться с отображением на резидентные библиотеки и с инфой о перекрытиях - пока понимания, особенно о первом - не сильно много![]()
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)