Новости декомпиляции

24 views
Skip to first unread message

Leo B.

unread,
Jun 6, 2021, 12:45:17 AM6/6/21
to БЭСМ-6
Программа PRETTY (почему в Пульте она запускалась командой "ЛЕС" - загадка):


Неплохой pretty-printer, хотя со странной ошибкой - во входном файле в объявлении типов вокруг знака равенства в конструкции _type мойтип = определение   не должно было быть пробелов, иначе ругается и останавливается. Собственно, я и декомпилировал его, чтобы понять, почему не работает.

Программа ЛЕНТЯЙ 


Назначение псевдо-комментария Л+ для меня было загадкой. 
По нему в конце компиляции по определенному адресу заносилось слово "ЛЕНТЯЙ" и время выполнения, и ничего больше. Это приводило к диагностике "НЕ ВЫДЕРЖАН СТАНДАРТ".

В то же время в архиве пульта в файле  ПАСЛ был код программы ЛЕНТЯЙ, которую не удавалось запустить вручную. Пришлось декомпилировать её, отчего выяснилось, что она делала, когда была запущена автоматически из приказа ПАС: если вторая строка в исходном тексте начиналась с комментария вида

(* дд.мм.гг чч.мм MAXADR=ааааа 

то программа заменяла эти данные на актуальные.

Предлагайте, что бы ещё интересного из имеющегося у нас декомпилировать, пока у меня время есть. 

Leo

Sergey Rozhkov

unread,
Jun 6, 2021, 1:33:52 AM6/6/21
to be...@googlegroups.com
Привет!

Ну,  насчет "ЛЕС" могу прояснить.
Эту программу писали мы с Володей Тихорским.
ЛЕС - это от "лесенка" ))) Печать лесенкой - pretty print )


--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/7fedb092-450a-4543-b9c2-7d12815e1352n%40googlegroups.com.

Michael Yaroslavtsev

unread,
Jun 6, 2021, 2:52:19 AM6/6/21
to be...@googlegroups.com
On Sat, Jun 5, 2021 at 10:33 PM Sergey Rozhkov <s.a.r...@gmail.com> wrote:
Привет!

Ну,  насчет "ЛЕС" могу прояснить.
Эту программу писали мы с Володей Тихорским.
ЛЕС - это от "лесенка" ))) Печать лесенкой - pretty print )
Зашёл сюда, чтобы оставить этот комментарий. 
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CADF6C3iLVPg4YSeavWO5kHnee5iZ1vnvh3buGBzFuWmeoBM_6A%40mail.gmail.com.


--
Thanks,
-- Michael

Макаров-Землянский Николай

unread,
Jun 6, 2021, 5:22:49 AM6/6/21
to be...@googlegroups.com
Этот термин pretty print я услышал в 77-78 году. Когда один из студентов Мальковского или Пильшикова писал подобную программу для ЛИСПа или ПЛЭНЕРа. И сотворил! А т.к. они работали в Пульте, то, думаю, корни лежат где-то там.
 
 
06.06.2021, 08:33, "Sergey Rozhkov" <s.a.r...@gmail.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CADF6C3iLVPg4YSeavWO5kHnee5iZ1vnvh3buGBzFuWmeoBM_6A%40mail.gmail.com.

Leo B.

unread,
Jun 6, 2021, 5:35:03 AM6/6/21
to БЭСМ-6
On Saturday, June 5, 2021 at 10:33:52 PM UTC-7 s.a.r...@gmail.com wrote:
Привет!

Ну,  насчет "ЛЕС" могу прояснить.
Эту программу писали мы с Володей Тихорским.
ЛЕС - это от "лесенка" ))) Печать лесенкой - pretty print )

Точно, спасибо! Я еще подумал, когда увидел результат, что Маяковский позавидовал бы, но слово "лесенка" в памяти не всплыло достаточно высоко, чтобы проассоциироваться с названием программы. ))

Не вспомнишь, как именно она работала? Например, зачем ей такой огромный буфер 

 charArray=_array [1..11024]_of char;

А то я её за пару вечеров декомпилировал, но понял очень мало. А сейчас я декомпилирую ПАСКАЛЬ-ПРОГРАММА 'РRЕТТУ РRINТ FОR LISР'. 
Собственно ЛИСП не сохранился, к сожалению - это единственное свидетельство наличия ЛИСПа на БЭСМ-6. Запустить её из Пульта я не смог, так хоть после декомпиляции выясню, 
как она работала. Вместо ЛИСПа возьму, к примеру, похожий по структуре EDIF - у меня его хватает. 

Она маленькая, но хитрая, потому что скомпилирована старой версией компилятора (которая еще не писала дату компиляции в заголовок), и в ней некоторые конструкции очевидно скомпилированы "по-старому"
(например, c:char; ... write(c) делается не как output^ := c; put(output), а примерно как write(c:1) только ещё длиннее на одну команду - приходится писать write(c:1+0) чтобы адреса сошлись). 
И ещё там есть тонкости с разницей в компиляции условных выражений, которые я не до конца понял (или что-то было хакнуто уже в двоичном коде).

Leo

Sergey Rozhkov

unread,
Jun 6, 2021, 9:37:57 AM6/6/21
to be...@googlegroups.com
Ну, термин pretty print конечно был известен ранее.
Я про конкретную программу "ЛЕС" писал.
А вот зачем такой большой буфер странного размера, увы, не помню.
Писалась программа быстро, может остатки такого быстрого написания.
Вадим Валерианович сначала скептически отнесся к такой распечатке, но потом сам стал пользоваться.
По крайней мере при поиске ошибок в "красиво структурированной программе" ))
Писал-то он сам плотно (и нас заставлял так писать, символы экономить)!

А вот псевдо-комментарий Л+ - точно! Спасибо Лене, вспомнил теперь.
Вадим Валерианович в каждом блоке Джина (и вообще в своих программах) ставил дату и время изменения,  размер скомпилированной программы.
И, опять-таки, от нас требовал вести версии с такими пометками ))
И Володя Тихорский, то ли самому уже надоело постоянно менять, то ли все же по просьбе Вадима Валериановича, сделал этот псевдо-комментарий.



--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/5c8fcde8-9f5e-47b4-8b14-0e0bc081ed57n%40googlegroups.com.

Michael Yaroslavtsev

unread,
Jun 6, 2021, 6:10:11 PM6/6/21
to be...@googlegroups.com
On Sun, Jun 6, 2021 at 6:38 AM Sergey Rozhkov <s.a.r...@gmail.com> wrote:
Ну, термин pretty print конечно был известен ранее.
Я про конкретную программу "ЛЕС" писал.
А вот зачем такой большой буфер странного размера, увы, не помню.
Писалась программа быстро, может остатки такого быстрого написания.
Дрогнула рука? И вместо 1024 получилось 11024? 
Вадим Валерианович сначала скептически отнесся к такой распечатке, но потом сам стал пользоваться.
По крайней мере при поиске ошибок в "красиво структурированной программе" ))
Писал-то он сам плотно (и нас заставлял так писать, символы экономить)!
А чем он мотивировал? 
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CADF6C3iS5uvrztPDsBqTFC3z5U4qVxW%2B_spfJS2Ex%2BqNbz1CEA%40mail.gmail.com.


--
Thanks,
-- Michael

Leo B.

unread,
Jun 6, 2021, 6:54:58 PM6/6/21
to БЭСМ-6
On Sunday, June 6, 2021 at 3:10:11 PM UTC-7 BOPOHOK wrote:
On Sun, Jun 6, 2021 at 6:38 AM Sergey Rozhkov <s.a.r...@gmail.com> wrote:
Ну, термин pretty print конечно был известен ранее.
Я про конкретную программу "ЛЕС" писал.
А вот зачем такой большой буфер странного размера, увы, не помню.
Писалась программа быстро, может остатки такого быстрого написания.
Дрогнула рука? И вместо 1024 получилось 11024? 

Логично, но и зачем был бы нужен килобайтный буфер, тоже пока непонятно. 
 
Вадим Валерианович сначала скептически отнесся к такой распечатке, но потом сам стал пользоваться.
По крайней мере при поиске ошибок в "красиво структурированной программе" ))
Писал-то он сам плотно (и нас заставлял так писать, символы экономить)!
А чем он мотивировал? 

Каждый лишний пробел в исходном тексте замедляет компиляцию на  15 команд.  Я только что померил.


А вот псевдо-комментарий Л+ - точно! Спасибо Лене, вспомнил теперь.
Вадим Валерианович в каждом блоке Джина (и вообще в своих программах) ставил дату и время изменения,  размер скомпилированной программы.
И, опять-таки, от нас требовал вести версии с такими пометками ))
И Володя Тихорский, то ли самому уже надоело постоянно менять, то ли все же по просьбе Вадима Валериановича, сделал этот псевдо-комментарий.

Классный хак!

Leo

Leo B.

unread,
Jun 6, 2021, 9:05:42 PM6/6/21
to БЭСМ-6
Не работала она потому, что ожидала входной файл в кодировке ИТМ. Каким образом для этого входные файлы в Пульте готовили, интересно? 
Вводили по А0, а потом экстракодом на диск писали, что ли?

Детали реализации тоже не очень понятны. Что-то она там в список собирает, потом его на два других списка сортирует... Но вроде работает, после удаления зависимости от кодировки ITM, даже удивительно.

Примерно так:

ПACKAЛЬ-ПPOГPAMMA ’PRETTY PRINT FOR LISP’
   1.  0    1 (EDIFVERSION 2 0 0)
   2.  0    2 (EDIFLEVEL 0)
   3.  0    3 (KEYWORDMAP (KEYWORDLEVEL 0)
   4.  1       )
   5.  0    4 (STATUS
   6.  1       (WRITTEN   (TIMESTAMP 2021 5 11 14 18 58)
   7.  2        (PROGRAM "TEST" (VERSION "V2.0")
   8.  3         )
   9.  2        (AUTHOR "ENGINEERING") ) )
  10.  0    5 (LIBRARY XCVE  (EDIFLEVEL 0)
  11.  1       (TECHNOLOGY (NUMBERDEFINITION )
  12.  2        )
  13.  1       (CELL TEST8 (CELLTYPE GENERIC)
  14.  2        (VIEW NETLIST (VIEWTYPE NETLIST)
  15.  3         (INTERFACE
  16.  4          (PORT (ARRAY (RENAME DI "DI[7:0]") 8)
  17.  5           (DIRECTION INPUT) )
  18.  4          (PORT (ARRAY (RENAME S "S[7:0]") 8)
  19.  5           (DIRECTION INPUT) )
  20.  4          (PORT (ARRAY (RENAME CO "CO[7:0]") 8)
  21.  5           (DIRECTION OUTPUT) )
  22.  4          (PORT (ARRAY (RENAME O "O[7:0]") 8)
  23.  5           (DIRECTION OUTPUT) )
  24.  4          (PORT CI (DIRECTION INPUT)
  25.  5           )
...
 201.  4          (NET (RENAME SQNET50 "TEST8_S[6]")
 202.  5           (JOINED(PORTREF (MEMBER S 1) (INSTANCEREF SQNOD9) )
 203.  6            (PORTREF G (INSTANCEREF SQNOD18)
 204.  7             )) )
 205.  4          (NET (RENAME SQNET51 "TEST8_S[7]")
 206.  5           (JOINED(PORTREF (MEMBER S 0) (INSTANCEREF SQNOD9) )
 207.  6            (PORTREF G (INSTANCEREF SQNOD19)
 208.  7             )))))))
 209.  0    7 (DESIGN TEST4_DESIGN
 210.  1       (CELLREF TEST4 (LIBRARYREF DESIGN_LIB)
 211.  2        ) )


Leo

Leo B.

unread,
Jun 7, 2021, 11:15:16 PM6/7/21
to БЭСМ-6
А вот программа ВЫЗОВЛ (от собственно ЛИСПа, который должен был вызываться с НУ 66 зон 1651-1655, поди знай, на каком диске, ничего не осталось), но интерес не в нём.
Интерес в том, как эта программа разбирала свою командную строку, в которой ожидалось имя файла: она копировала буфер командной строки в буфер ввода, хачила процедуру ввода, удаляя из неё Э70, после чего просто читала из файла input. Остальное более или менее прозрачно.

Остается следующий вопрос: как эта программа вызывалась из Пульта?  Паскаль-программу,  скомпилированную в файл путем "ПАС  ... - ЗОНГП файл" Пульт не позволяет вызвать 
напрямую, говорит "НЕ БУДУ ВЫПОЛНЯТЬ". 

Программу можно вызывать или с помощью "ПАС - ВЫП файл" (никакой дополнительной командной строки здесь указать нельзя), или с помощью сформированной запускалки (которая, в сущности, есть копия запускалки ПАС с подправленными параметрами), которая ещё раз анализирует параметры и ругается, если что-то написано лишнее. 

Если придать программе выполняемость, приписав ЫЫЫ в 7-е слово (это я сначала сам определил, а потом и  в инструкции прочёл), то ничего интересного не происходит - Пульт говорит О.К О.К, а программа не запускается.

Leo

(*=p-,t-*)_program ВЫЗОВЛ;
_label 327;
_type letter = 'A'..'Z'; digit = '0'..'9';
string=_record a:_array[1..15] _of alfa _end;
word=_record _case boolean _of true:(i:integer); false:(a:alfa) _end;
page = _array [0..1023] _of word;
unalfa = _array [1..6] _of char;

_var inBuf, cmdLine:@string;
fileName, archName:alfa;
pos,archLoc,nuzzzz,fileLen:integer;
catalog:@page;
_proced SkipSp; _( _while (input@ = ' ') _do get(input) _);

_function getName(_var name:alfa):boolean;
_var unp:unalfa; i:integer; _(
 SkipSp;
 getName := false;
 i := 1;
 name := '      ';
 unpck( unp[1], name);
 _if _not (input@ _in letter) _then exit;
 _while ((input@ _in letter) _or (input@ _in digit)) _and (i < 7)  _do _(
   unp[i] := input@;
   get(input);
   i := i + 1;
 _);
 pck(unp[1], name);
 getName := true;
_);

_function hasArchive(_var nuzzzz:integer; _var archName:alfa):boolean;
_const drum36=10320000270036C;
_var is:integer; _(
 code(ИА57776=СЧ,); nuzzzz := ;
 is := drum36; code(2Э0706=,);
 code(ИА64000=СЧ,); archName := ;
 hasArchive := chr(sel(archName,40,8)) _in letter;
 _);

_proced RDPG(nuzzzz, len:integer);
_const rdpg34=001034T;
_var is:integer; _(
 is := rdpg34;
 code(2ЦС3=ЗЧ75211,2СЧ4=У076002,АВ13=ЗЧ75212,);
 _);

_proced WRPG(nuzzzz, len:integer);
_const wrpg35=000035T;
_var is:integer; _(
 is := wrpg35;
 code(2ЦС3=ЗЧ75203,ЗЧ75223=2СЧ4,У076002=ЦС13,ЗЧ75204=,);
 _);

_proced close;
_(
 write('\172\175      ');
 code(СЧ75235=ЦС13,СР75204=У074275,Э07075223=,);
 WRPG(270000C, 1);
 rewrite(output);
_);

_(
  cmdLine := ptr(57640B);
  inBuf := ptr(70000B);
  inBuf@ := cmdLine@;
  code(СЧХАК=Э07574243,15ПВ74027=,);                            % hack input and setup
  _if getName(fileName) _then;
  _if _not getName(fileName)_then _( writeln('ГДЕ ЖЕ ИМЯ ?'); exit _);
  catalog := _NIL;
  code(СЧХАК(1)=Э07574243,);                                    % restore
  _if _not hasArchive(archLoc, archName) _then _( writeln('НЕТ НАСТРОЙКИ НА АРХИВ'); exit _);
  archLoc := sel(archLoc, 0, 18);
  pos := 1;
  _while pos < 512 _do _(
   _if catalog@[pos].a = fileName _then _goto 327;
   pos := pos + 2;
 _);
 writeln('В АРХИВЕ ', archName, ' НЕТ ИМЕНИ ', fileName);
 exit;
327:
 pos := pos + 1;
 pos := catalog@[pos].i;
 nuzzzz := shift(pos, 24) + archLoc;
 fileLen := sel(pos, 0, 24);
 RDPG(nuzzzz, fileLen);
 code(15ПВ74027=,);
 WRPG(100000B, fileLen);
 _while (input@ <> '\172') _do _(
   _if (input@ = '\175') _then write(' ') _else write(input@);
   get(input);
 _);
 close;
 code(Э070ИС(2)=,СЧ5252=); fileName := ;
 _if fileName <> 'NОNЕ  ' _then _( writeln('ИСПОРЧЕН ЛИСП-ТРАНСЛЯТОР'); exit _);
 code(Э070ИС(1)=,Э070ИС(3)=,Э070ИС(4)=,СЧИС=ЗЧ70003,);
 code(СЧПАТЧ=Э07570000,СЧПАТЧ(1)=Э07570001,СЧПАТЧ(2)=ЗЧ70002,);
 fileName := '      ';
 code(ЗЧ70012=);
 fileName := '<*> ФИ';
 code(ЗЧ70013=);
 fileName := 'НАЛ <*';
 code(ЗЧ70014=);
 fileName := '>\1720000';
 code(ЗЧ70015=,);
 pos := 2264253121233462C;
 code(Э07270010=,);
 code(СЧПП=Э07570010,СЧПП(1)=Э07570011,);
 writeln('работает лисп-транслятор':30);writeln;
  code(ПБ70000=,);
  exit;
  code(ХАК:ЗЧ74356=,ЗЧ74356=Э07074357,);
  code(C;ИС:10000000661651,10010000661652,10020000661653,10030000661654,10040000661655,K;);
  code(ПП:15ПА70012=16ПВ76005,ПБ76002=,ПАТЧ:Э07070003=,16ПА70002=ПБ410,С;20001000031000,K;);
_).

Reply all
Reply to author
Forward
0 new messages