User Tag List

Страница 7 из 31 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя
Показано с 61 по 70 из 304

Тема: DisAsm-11

  1. #61

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Можно. Только я до правок генерации .ASCII так и не добрался, что бы собрать обратно - нужны будут ручные правки после генерации исходника.

    Вечером выложу текущую версию и пришлю ссылку

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    На работе (в рабочее время имеется ввиду) нарисовался перерыв и вспомнилась мне задумка - сделать более удобной работой с комментариями. Почесав почесуемое, решил - пуркуа бы и не па? Сколько времени затратил - не скажу - и не вёл учёт времени (всё таки не работа) и с перерывами делалось и больше вылизывал удобство работы, а не сам функционал, но.. не много. Так что теперь комменатрии вводятся почти как в текстовом редакторы - жмём ; на выбранной команде (или данных), вводим комментарий, нажимаем Enter, вводим комментарий для следующей команды (или данных) и так, пока не надоест или комментарии не закончатся, а тогда жмём Esc и возвращаемся в окно листинга. Вводит можно в любом из трёх окон.

    А потом голову посетила мысль, что теперь извлекать .TSK файлы из образов RSX сталко плёвым делом - и решил я добавить поддержку и таких файлов Вообщем, начал пилить. Собственно, для допила требуется только распотрощить служебку - и всё.

    Но пока, как и для .SAV файлов - никаких оверлеев и никаких I-D задач. Это на будущее.

    Ещё в TSK поддерживаются резидентные библиотеки (некоторый аналог .DLL в Windows) - посмотрю, возможно это дело включу в данном релизе.

    И, поскольку такой вопрос периодически возникает, продублирую ответ здесь, в первом сообщении, а потом и в теме про ImgUtil (и всех всех всех с ней связанных)

    Пока большая часть моих программ - RequestWare, то есть, если что-то из написанного мной кому-то интересно, а у меня на недо-сайте не выложено - пишем в теме или в личку - обсуждаемо.

  4. #63

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

  5. #64

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Развлечения с .TSK продолжаются. Формат "несколько" сложней других форматх и не всё с ходу понятно по документации, но картинка постепенно вырисовывается. Но до теста Моментальная идентичность ещё далеко. Да и что бы его реализовать - нужна генерация не только .MAC файла, но и командника для сборщика TKB...

  6. #65

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Одна из "проблем", нарисовавшихся первоначально при написании ImgUtil, а затем и DisAsm-11 - в силу сложной структуры .TSK - необходимость переноса определений всяких констант, смещений и т.п., которые были сделаны через макросы в макробиблиотеках, выглядевшие примерно так:
    Код:
    	.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
    ....
    Первоначально всё это дело переносилось руками 1) в описание констант-смещений, а затем 2) создавались описания классов для удобства программирования, после чего это выглядело примерно так:
    Код:
      [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
    а его конструктора - так:

    Код:
        public SharedRegion(byte[] data)
        {
          this.Mapper(data);
        }
    И вот этот метод Mapper - он общий для любого класса, описание которое построено таким же образом. И большую часть такого описания класса можно сделать с помощью макросов в FAR-е на основе исходного макроса. Останется только добавить название полей в класс для C# и нарисовать простейшие конструкторы. Всё. Длина поля, как можно видеть, берётся из макроса, а смещение в блоке байт высчитывается на основении описаний в методе Mapper. Плюс этот метод может осуществлять и некоторые преобразование - скажем, поле Name ("R$LNAM") хранится как два слова в формате Radix50 - но в объект класса C# будет перенесено как строка.

    Пока это больше концептуальная идея (есть ещё нюансы, над которыми надо подумать - скажем, пока не нравится, как выглядят и как используются описания флагов), но технически её УЖЕ можно задействовать. Одну описанную пару классов я переделал, надо переделать вторую, а вот описание третьего блока данных уже будет делаться сразу по такой схеме - а значит - конструктор можно будет уже не писать

    Ну и как в очередной раз буду развлекаться в ImgUtil - тоже начну переделывать по такой схеме

  7. #66

    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    483
    Спасибо Благодарностей отдано 
    139
    Спасибо Благодарностей получено 
    391
    Поблагодарили
    146 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А что кстати под RT-11 нет дизасма? Внезапно казалось что должен быть какой-т.
    Но вообще полезное дело да, вдруг кому пригодится

    (правда даже имея исходник понять чет сложно, даже с комментариями, сам глянул в свой код на асме и голова гругом пошла мол "че тут такое" .. но лучше чтоб был дизасм чем чтобы его не было, иначе утеряна способность в 8-ричных кодах читать программу)
    Последний раз редактировалось BlaireCas; 20.08.2022 в 12:39.

  8. #67

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от BlaireCas Посмотреть сообщение
    А что кстати под RT-11 нет дизасма
    Ну как бы сейчас уже какой-никакой есть, но.

    Были и раньше. Но - или совсем тупые (то есть тупо в лоб и практически без возможности повлиять на генерацию кода) или мне не нравились (типа IDA - хотя про него говорили, что его можно допилить модулями на Phyton-е, но меня и этот вариант не устроил).

    В целом же меня интересовал более универсальный вариант. Уже сейчас - образ памяти, .LDA, .SAV и какой-никакой, но вариант для .TSK), плюс возможность подсказки, плюс комментарии. Пока во всех вариантах - программы без оверлеев и образы без страничной организации (ну тут я начинаю приближаться к доделке). Плюс - можно прерваться, сохранить уже натворённое и потом вернутся. Плюс - генерация полноценного .MAC (в том числе через командную строку) - то есть его можно подсунуть ассемблеру, потом компоновщику и (пока без особоых теледвижения для .SAV) сравнить с исходником.

    Ну и какое никакое развитие - правда, в основном в режиме - понадобилось что-то ещё дизассемблировать - оппа - чего-то не хватает - а не дописать ли Вот как сейчас.

    Цитата Сообщение от BlaireCas Посмотреть сообщение
    правда даже имея исходник понять чет сложно, даже с комментариями, сам глянул в свой код на асме и голова гругом пошла
    Как показала моя практика года так два, что ли, назад - для меня и процесс разборки логики дизассмеблированного и процесс понимания потом, по прошествию времени - резко ускорился после перехода на использования макросов для структурного программирования. Которые, кстати, ускорили и написание кода - примерно так на порядок

    - - - Добавлено - - -

    Ну а насколько удобен или нет DisAsm-11 кому то, кроме меня (мне то понятно - под меня писался) - можно поинтересоваться у anasana-ы - он его использовал для восстановления исходников тестов
    Последний раз редактировалось Hunta; 18.11.2022 в 20:26.

  9. #68

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Структура метки (первый блок) .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); // ??
          }
        }
    и в новом:
    Код:
        public TaskLabel(byte[] data)
        {
          this.Mapper<TaskLabel>(data);
        }
    Безусловно, Mapper был дописан для поддержки нового описания в Map И доделка предполагает и несколько более сложные варианты - несколько вариантов длины блока переменной длины. И блок может быть не один. В целом же - доделка пока идёт по принципу - налетим на что то ещё в макросах - подпилим Mapper

    Осталось подумать над работой с флагами

  10. #69

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Новое описание с самого начала сделано по такой схеме.
    Код:
      [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);
      }
    Слегка расширен функционал Mapper-а

  11. #70

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,507
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    714
    Поблагодарили
    596 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Законченный 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 (на данном этапе ни на что не влияет), теперь буду разбираться с отображением на резидентные библиотеки и с инфой о перекрытиях - пока понимания, особенно о первом - не сильно много

Страница 7 из 31 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Disasm with Sts 7.5...
    от Stl75 в разделе Софт
    Ответов: 3
    Последнее: 25.06.2018, 11:28

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •