А вот программа ВЫЗОВЛ (от собственно ЛИСПа, который должен был вызываться с НУ 66 зон 1651-1655, поди знай, на каком диске, ничего не осталось), но интерес не в нём.
Интерес в том, как эта программа разбирала свою командную строку, в которой ожидалось имя файла: она копировала буфер командной строки в буфер ввода, хачила процедуру ввода, удаляя из неё Э70, после чего просто читала из файла input. Остальное более или менее прозрачно.
Остается следующий вопрос: как эта программа вызывалась из Пульта? Паскаль-программу, скомпилированную в файл путем "ПАС ... - ЗОНГП файл" Пульт не позволяет вызвать
Программу можно вызывать или с помощью "ПАС - ВЫП файл" (никакой дополнительной командной строки здесь указать нельзя), или с помощью сформированной запускалки (которая, в сущности, есть копия запускалки ПАС с подправленными параметрами), которая ещё раз анализирует параметры и ругается, если что-то написано лишнее.
Если придать программе выполняемость, приписав ЫЫЫ в 7-е слово (это я сначала сам определил, а потом и в инструкции прочёл), то ничего интересного не происходит - Пульт говорит О.К О.К, а программа не запускается.
(*=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;);
_).