|
|
DataMuseum.dkPresents historical artifacts from the history of: Bogika Butler |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Bogika Butler Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 22400 (0x5780)
Types: TextFile
Names: »NEWEOSLD.SA«
└─⟦909f4eb2b⟧ Bits:30009789/_.ft.Ibm2.50006622.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »NEWEOSLD.SA«
└─⟦e12db5ad4⟧ Bits:30009789/_.ft.Ibm2.50007357.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »NEWEOSLD.SA«
æ*****************************************************************
Copyright 1984 by
NCR Corporation
Dayton, Ohio U.S.A.
All Rights Reserved
******************************************************************
EOS Software produced by:
NCR Systems Engineering - Copenhagen
Copenhagen
DENMARK
*****************************************************************å
OBJECT PROGRAM EosLoad;
æ$H=0 no heap spaceå
CONST
ProcId = 'EosLoad vers 3.02 83-12-08 ';
æ
E O S - L O A D
Changes:
vers. 3.00 83-11-29, EAR change from VERSAdos to EOS pascal
vers. 3.01 83-12-01, EAR error when option without '-'
vers. 3.02 83-12-08, EAR bsMax = dataSize + nullSize
This EOS program transforms a compiled and linked EOS Pascal program or
EOS C program into a loadable EOS module
Program Call:
eosload Æ-p <programName>Å
Æ-c <programName>Å
Æ-u <unixUtil fileName>Å
Æ-m <moduleName>Å
-o <EOS module fileName>
Æ-t <extra tempBytes>Å
Option Explanation:
-c specifies the total file name of an input UNIX C program
-p specifies the total file name of an input Pascal program
one of the options -p or -c must be specified
-u specifies the total file name of an EOS pascal program
defining the EOS environment of a unix C program
(default = 'versafs/eos:0..unixutil.lo')
-m specifies the internal module name to be inserted in
the output EOS module
-o specifies the total file name of the ouotput EOS module;
this option cannot be omitted
-t specifies the number of additional temp bytes to be
used by the program (default = 5000)
å
CONST
ResultId = 'EOSLOAD: sNo OrgSy Au Ar OrgNo Fa Ma';
OrgSys = 7011;
æ$Eå
æ$L-å
æ$F=FAMILY.UNIV.IDå
æ$F=FAMILY.KNEL.IDå
æ$F=FAMILY.ALLOC.IDå
æ$F=FAMILY.SCHED.IDå
æ$F=FAMILY.OBJDIR.IDå
æ$F=FAMILY.IOSYS.IDå
æ$F=FAMILY.APPLI.IDå
æ$F=PASINCLU.CHKPROCS.SAå
æ$F=PASINCLU.TERMTOOL.SAå
æ$L+å
æ***** Local pointers *****å
TYPE
eolLocals = RECORD
code : ^^;
pobjDir : ^^ObjDir;
stdIn : faoRefType;
stdOut : faoRefType;
stdError : faoRefType;
END; æeolLocalså
æ$Eå
PROGRAM iEosLoad OBJECT Application WITH eolLocals;
ENTRY Run æfileEnnv, jobSys ; progId Æ, options...Åå
WITH RECORD
t : ^^;
pFs : iosysRefType;
pFao : faoRefType;
cFs : iosysRefType;
cFao : faoRefType;
oFs : iosysRefType;
oFao : faoRefType;
END;
æ$Eå
CONST
spRel = 0;
epRel = 8;
dsRel = 0;
ssRel = 11;
nlRel = 13;
lsRel = 16;
maxNameLength = 50;
versaPageSize = 256;
æprivate error causeså
privFam = -1;
nameTooLong = 1;
missParam = 2;
missInProg = 3;
missOutProg = 4;
optSyntax = 5;
optUnknown = 6;
nonLoadFormat = 7;
illPdAddr = 8;
illSegAddr = 9;
cTooSmall = 10;
pTooSmall = 11;
TYPE
longtype = (single, double, four);
informtype = (pascal, unixC);
longfield = RECORD
CASE longtype OF
single : (l : long);
double : (w : packed array Æ1..2Å of word);
four : (b : packed array Æ1..4Å of byte);
END; ælongfieldå
rectype = (librec, eoshead1, eoshead2, code, unixrec);
sad = RECORD
rsv, atr : word;
segname : packed array Æ1..4Å of char;
segstart : longfield;
segsize : longfield;
END;
mid = RECORD
first : word;
last : word;
END;
progrec = RECORD
CASE rectype OF
librec:
(head1 : packed array Æ1..22Å of byte;
entpt : longfield;
head2 : packed array Æ1..22Å of byte;
sads : array Æ1..8Å of sad;
mids : array Æ1..20Å of mid);
eoshead1:
(headsize : word;
progsize : long;
progkind : word;
progadr : word;
objName : packed array Æ1..16Å of char;
dummy : packed array Æ13..127Å of word);
eoshead2:
(eos : packed array Æ0..127Å of word);
code :
(data : packed array Æ0..255Å of byte);
unixrec:
(magic : long ;
textSz : long ;
dataSz : long ;
bssSz : long ;
symSz : long ;
trelSz : long ;
drelSz : long ;
entptPoint: long ;
dummy1 : packed array Æ8..63Å of long);
END; æprogrecå
fName = array Æ1..maxNameLengthÅ of char;
VAR
iName, oName, prName, uName : fName;
mName : array Æ1..16Å of char;
line : array Æ1..90Å of char;
prog, lib, unixHead, nulr : progrec;
loadSize, segSize, noTmpB : longfield;
inForm : informtype;
terminate, stop : boolean;
res : resultType;
option, param : fullId;
i, j, bytes, count, pdAddr, segAddr, paramNo, recno,
o, pc, cUsed, oUsed, pUsed : integer;
aEntryPoint, aDesSize, aLoadSize, aNoLoads, aNoLocP,
aNoTmpB1, aNoTmpB2, aNoTmpP, aSegPtr, aSegSize,
noLoads, noLocP, noOfSegs, noTmpP, segRel : word;
curPos, pEof,
extraBss, bssSize, codesize, copySize, dataSize,
eossize, nullSize, pascalSize, totalsize : long;
æ$Eå
PROCEDURE putLongHex (line : shortId;
lng : longField;
width: integer );
VAR
i, j, pos, val : integer;
BEGIN
pos := getLength (line);
æ*b* pss ('putLongHex, pos = ', pos); *e*å
FOR i := 1 TO width-9 DO
BEGIN
pos := pos+1; lineÆposÅ := ' ';
END;
pos := pos+1; lineÆposÅ := '$';
FOR i:= 1 TO 4 DO
BEGIN
val := lng.bÆiÅ;
IF val < 0 THEN val := val + 256;
pos := pos+2;
lineÆpos-1Å := hex (val DIV 16);
lineÆposÅ := hex (val MOD 16);
END; æiå
æ*b* pss ('end putLongHex, last pos = ', pos); *e*å
putLength (line, pos);
END; æputLongHexå
PROCEDURE printLine (line : shortId;
txt : shortId);
BEGIN
clearText (line);
putText (line, txt);
putNl (line);
xCheck ( termIo (stdOut, WriteSeq, line));
END; æprintLineå
FUNCTION copyRec : boolean;
BEGIN
æ*b* ps ('copyRec '); *e*å
xCheck ( oFao.WriteSeq ( VAR IN OUT prog ; OUT bytes));
xCheck ( pFao.ReadSeq ( VAR IN OUT prog ; OUT bytes));
IF bytes <> 0 THEN recNo := recNo + 1;
copyRec := bytes = 0;
æ*b* pss ('end copyRec, bytes = ', bytes); *e*å
END; æcopyrecå
PROCEDURE insertLong (VAR adr : word;
lng : longfield);
BEGIN
æ*b* printVar ('insertLong: adr = ', adr); *e*å
IF adr > 127 THEN æinsert in later sectorå
ELSE
IF adr = 127 THEN æinsert 1st word into this sectorå
prog.eosÆadrÅ := lng.wÆ1Å
ELSE
IF adr >= 0 THEN æinsert both words into this sectorå
BEGIN
prog.eosÆadrÅ := lng.wÆ1Å;
prog.eosÆadr+1Å := lng.wÆ2Å;
END
ELSE
IF adr = -1 THEN æinsert 2nd word into this sectorå
prog.eosÆ0Å := lng.wÆ2Å;
æELSE field has been inserted previouslyå
adr := adr - 128;
END; æinsertLongå
PROCEDURE insertWord (VAR adr : word;
value : word );
BEGIN
æ*b* printVar ('insertWord: adr = ', adr);
printVar ('word = ', value); *e*å
IF adr > 127 THEN æinsert in later sectorå
ELSE
IF adr >= 0 THEN æinsert in this sectorå
prog.eosÆadrÅ := value;
æELSE word inserted previouslyå
adr := adr - 128;
END; æinsertWordå
PROCEDURE getWord (VAR adr : word;
VAR value : word );
BEGIN
IF adr > 127 THEN æget from later sectorå
ELSE
IF adr >= 0 THEN æget from this sectorå
value := prog.eosÆadrÅ;
æELSE field got previouslyå
adr := adr - 128;
END; ægetWordå
PROCEDURE takeName (fileName : fullId);
VAR
i, j, k : integer;
BEGIN
IF nextValArg (param) THEN
BEGIN
paramNo := paramNo + 1;
j := elements(param);
k := elements(fileName);
IF k < j THEN
exception (makeRes (nameTooLong, privFam, -paramNo, 0));
FOR i := 1 TO j DO fileNameÆiÅ := paramÆiÅ;
FOR i := j+1 TO k DO fileNameÆiÅ := chr(0);
END
ELSE
exception (makeRes (missParam, privFam, -paramNo, 0));
END; ætakeNameå
PROCEDURE takeval (val : integer);
VAR
p : ^integer;
BEGIN
IF nextValArg (p) THEN
BEGIN
paramNo := paramNo + 1;
val := p^;
END
ELSE
exception (makeRes (missParam, privFam, -paramNo, 0));
END; ætakeValå
BEGIN
æ*b* PS ('Start of EOS-LOAD '); *e*å
IN
res := OkResult;
xCheck ( Copy (fileEnv^^Æ1Å, stdIn));
xCheck ( Copy (fileEnv^^Æ2Å, stdOut));
xCheck ( Copy (fileEnv^^Æ3Å, stdError));
æ Wellcome message on terminalå
printLine (line, procId);
æ Init default parameters å
inform := unixC;
uName := 'versafs/eos:0..unixutil.lo';
mName := 'module';
extraBss := 5000;
pc := 0;
o := 0;
paramNo := 1;
æ Take program parameters å
REPEAT
IF nextValArg (option) THEN stop := elements(option) = 0
ELSE stop := true;
IF not stop THEN
BEGIN
paramNo := paramNo + 1;
IF optionÆ1Å = '-' THEN
BEGIN
IF elements(option) <> 2 THEN
exception ( makeRes (optSyntax, privFam, -paramNo, 0));
CASE optionÆ2Å OF
'c': BEGIN
æ*b* PS ('-c option '); *e*å
inform := unixC;
pc := pc + 1;
takeName (prName);
END;
'p': BEGIN
æ*b* PS ('-p option '); *e*å
inform := pascal;
pc := pc + 1;
takeName (prName);
END;
'o': BEGIN
æ*b* PS ('-o option '); *e*å
o := o + 1;
takeName (oName);
END;
'm': takeName (mName);
'u': takeName (uName);
't': takeVal (extraBss);
OTHERWISE
exception (makeRes (optUnknown, privFam, -paramNo, 0));
END; æcaseå
END æoption = '-'å
ELSE
exception (makeRes (optUnknown, privFam, -paramNo, 0));
END; ænor stopå
UNTIL stop;
æ Check parameters å
IF pc <> 1 THEN exception (makeRes (missInProg, privFam, 0, 0));
IF o <> 1 THEN exception (makeRes (missOutProg, privFam, 0, 0));
æ Open input- and output files å
IF inform = unixC THEN iName := uName
ELSE iName := prName;
æ Open PascalFile / UnixUtil å
æ*b* ps ('open pascal file ');
printVar ('iName = ', iName); *e*å
xCheck ( pObjDir.GetRef (OUT pFs ; IN iName, OUT pUsed, OUT i));
xCheck ( pFs.Assign (OUT pFao ;
IN iNameÆpUsed+1..maxNameLengthÅ,
IN ReadRight, IN OldFile ));
æ Open output EOS Object File å
æ*b* ps ('open EOS object file ');
printVar ('oName = ', oName); *e*å
xCheck ( pObjDir.GetRef (OUT oFs ; IN oName, OUT oUsed, OUT i));
xCheck ( oFs.Assign (OUT oFao ;
IN oNameÆoUsed+1..maxNameLengthÅ,
IN WriteRight, IN NewOrOld));
xCheck ( oFao.DataSize ( ; 0));
æ Open UNIX C file å
IF inform = unixC THEN
BEGIN
æ*b* ps ('open UNIX C file ');
printVar ('uName = ', uName); *e*å
xCheck ( pObjDir.GetRef (OUT cFs ; IN prName, OUT cUsed, OUT i));
xCheck ( cFs.Assign (OUT cFao ;
IN prNameÆcUsed+1..maxNameLengthÅ,
IN ReadRight, IN OldFile ));
END; æunixCå
æ Read PascalFile / UnixUtil å
xCheck ( pFao.ReadRandom (VAR IN OUT lib ;
OUT bytes, IN 0, OUT i));
xCheck ( pFao.Seek ( ; IN FromEnd, IN 0, OUT pEof));
pascalSize := lib.sadsÆ1Å.segSize.l;
eosSize := lib.sadsÆ2Å.segSize.l;
æ*b* pss ('pascalSize = ', pascalSize);
pss ('eosSize = ', eosSize); *e*å
IF inform = pascal THEN
BEGIN
codeSize := pascalSize;
totalSize := codeSize + eosSize;
bssSize := 0;
dataSize := 0;
nullSize := 0;
noOfSegs := 1;
IF (totalSize > pEof) OR
(lib.sadsÆ1Å.segName <> 'SEG1') OR
(lib.sadsÆ2Å.segName <> 'SEG2') OR
(lib.sadsÆ2Å.segStart.l <> codeSize) OR
(lib.sadsÆ3Å.segSize.l > 0 )
THEN
exception (makeRes (nonLoadFormat, privFam, 0, 0));
END æpascalå
ELSE
BEGIN æunixCå
xCheck ( cFao.ReadRandom (VAR IN OUT unixHead ;
OUT bytes, IN 0, OUT i));
codeSize := 32 + unixHead.textSz;
dataSize := unixHead.dataSz;
bssSize := unixHead.bssSz;
nullSize := bssSize + extraBss;
totalSize := (eosSize + codeSize + dataSize + nullSize
+ 255) DIV 256 * 256;
noOfSegs := 2;
lib.entpt.l:= 32; æ unix header is present in run time text å
printLine (line,
'UnixHeader: magic textSize dataSize bssSize');
clearText (line);
putInt (line, unixHead.magic, 16);
putInt (line, unixHead.textSz, 10);
putInt (line, unixHead.dataSz, 10);
putInt (line, unixHead.bssSz, 10);
putNl (line);
xCheck ( termIo (stdOut, WriteSeq, line));
END;
æ*b* pss ('codeSize = ', codeSize);
pss ('dataSize = ', dataSize);
pss ('bss Size = ', bssSize);
pss ('nullSize = ', nullSize);
pss ('totalSize = ', totalSize);
pss ('entryPoint = ', lib.entpt.l); *e*å
æ Copy EOS head to output file:
insert headSize,totalSize, and moduleName
find addr of ProgDescrAdd å
xCheck ( pFao.ReadRandom (VAR IN OUT prog ;
OUT bytes, IN pascalSize + versaPageSize, OUT i));
æ*b* printVar ('eosHead = ', prog); *e*å
recno := 1;
prog.headSize := eosSize;
prog.progSize := totalSize;
IF inform = unixC THEN prog.objName := mName;
æfind addr of prog-descrå
pdAddr := prog.progAdr;
IF (pdAddr < 0) OR (ODD (pdAddr)) THEN
exception (makeRes (illPdAddr, privFam, 0, 0));
pdAddr := pdAddr DIV 2;
æfrom now all addresses in eosHead are word addresseså
æ Copy ProgDescription:
insert entptPoint
find addrFirstSegDescr, noSegDescr, and no.of pointers/bytes å
aSegPtr := pdAddr + spRel;
aNoLocP := aSegPtr + 1;
aNoTmpP := aNoLocP + 1;
aNoTmpB1 := aNoTmpP + 1;
aNoTmpB2 := aNoTmpB1 + 1;
aEntryPoint := pdAddr + epRel;
terminate := false;
REPEAT
insertLong (aEntryPoint, lib.entpt);
getWord (aSegPtr, segRel);
getWord (aNoLocP, noLocP);
getWord (aNoTmpP, noTmpP);
getWord (aNoTmpB1, noTmpB.wÆ1Å);
getWord (aNoTmpB2, noTmpB.wÆ2Å);
IF aEntryPoint >= 0 THEN terminate := copyRec;
UNTIL (aEntryPoint < 0) OR terminate;
IF terminate THEN
exception (makeRes (pTooSmall, privFam, 0, 1));
æ Print Pointer Values å
printLine (line,
'No. of LocalPointers TempPointers TempBytes EntryPoint');
clearText (line);
putInt (line, noLocP, 16);
putInt (line, noTmpP, 13);
putInt (line, noTmpB.l, 13);
putLongHex (line, lib.entpt, 16);
putNl (line);
xCheck ( termIo (stdOut, WriteSeq, line));
æ Copy SegmentDescription:
insert segmentSize,loadSize
find addr of next SegDescr å
printLine (line, '');
printLine (line,
'EOS segno Segment size Pages Load Size Pages');
segAddr := pdAddr;
FOR i := 1 TO noOfSegs DO
BEGIN
IF odd (segRel) THEN
exception (makeRes (illSegAddr, privFam, 0, 2));
segAddr := segAddr + (segRel DIV 2);
aDesSize := segAddr + dsRel;
aSegSize := segAddr + ssRel;
aNoLoads := segAddr + nlRel;
aLoadSize := segAddr + lsRel;
IF i = 1 THEN
BEGIN
segSize.l := codeSize;
loadSize.l := codeSize;
END
ELSE
IF i = 2 THEN æonly inform UNIX. OBS! Modif.Descr. is destroyedå
BEGIN
segSize.l := dataSize + nullSize;
loadSize.l := segSize.l - extraBss;
noLoads := 1;
END;
REPEAT
insertLong (aSegSize, segSize);
IF i = 2 THEN insertWord (aNoLoads, noLoads);
insertLong (aLoadSize, loadSize);
getWord (aDesSize, segRel);
IF aLoadSize >= 0 THEN terminate := copyRec;
UNTIL (aMoadSize < 0) OR terminate;
clearText (line);
putInt (line, i, 8);
putLongHex (line, segSize, 13);
putInt (line, segSize.l, 8);
putInt (line, (segSize.l+versaPageSize-1)DIV 256, 5);
putLongHex (line, loadSize, 13);
putInt (line, loadSize.l, 8);
putInt (line, (loadSize.l+versaPageSize-1)DIV 256, 5);
putNl (line);
xCheck (termIo (stdOut, WriteSeq, line));
IF (terminate AND (i < noOfSegs)) OR (aLoadSize >= 0) THEN
exception (makeRes (pTooSmall, privFam, 0, 3));
END; æfor iå
æ Copy last sectors if anyå
WHILE not terminate DO terminate := copyRec;
æ Copy Pascal code Segment or Unix C program to output file å
IF inform = unixC THEN
BEGIN
FOR i:= 0 TO 255 DO nulr.dataÆiÅ:= 0;
xCheck ( cFao.ReadRandom (VAR IN OUT prog ;
OUT bytes, IN 0, OUT i));
prog.symSz:= dataSize + nullSize; æcommunicate bsmax to runtime systemå
xCheck ( oFao.WriteSeq (VAR IN OUT prog ; OUT j));
count := bytes;
copySize := codeSize + dataSize;
WHILE count < copySize DO
BEGIN
xCheck ( cFao.ReadRandom (VAR IN OUT prog ;
OUT bytes, IN 0, OUT i));
IF bytes = 0 THEN
exception (makeRes (cTooSmall, privFam, 0, 4));
xCheck ( oFao.WriteSeq (VAR IN OUT prog ; OUT j));
count := count + bytes;
END;
copySize := copySize + bssSize;
WHILE count < copySize DO
BEGIN
xCheck ( oFao.WriteSeq (VAR IN OUT nulR ; OUT bytes));
count := count + bytes;
END;
END æunixCå
ELSE
BEGIN æ copy Pascal code segment å
count := 0;
xCheck ( pFao.Seek ( ; FromStart, 256, OUT curPos ));
WHILE count < codeSize DO
BEGIN
xCheck ( pFao.ReadSeq (VAR IN OUT prog ; OUT bytes));
IF bytes = 0 THEN
exception (makeRes (pTooSmall, privFam, 0, 5));
xCheck ( oFao.WriteSeq (VAR IN OUT prog ; OUT j));
count := count + bytes;
END;
END; æpascalå
DO
BEGIN
res := GetException;
æ*b* ps ('eosload error '); pr (res); *e*å
IF res.family = privFam THEN
BEGIN
clearText (line);
putText (line, '*** ');
CASE res.main OF
1: BEGIN
putText (line, param);
putText (line, ': file name too long');
putInt (line, paramNo, 4);
END;
2: BEGIN
putText (line, 'missing parameter');
putInt (line, paramNo, 4);
END;
3: putText (line, 'no input program name specified (-p/-c)');
4: putText (line, 'no output program name specified (-o)');
5: BEGIN
putText (line, 'syntax error in option list');
putInt (line, paramNo, 4);
END;
6: BEGIN
putText (line, 'unknown option');
putInt (line, paramNo, 4);
END;
7: BEGIN
putText (line, iName);
putText (line, ' not correct load format');
END;
8: BEGIN
putText (line, iName);
putText (line, ' illegal pd-addr');
putInt (line, pdAddr, 4);
END;
9: BEGIN
putText (line, iName);
putText (line, ' illegal seg-addr');
putInt (line, segRel, 4);
END;
10: BEGIN
putText (line, prName); æC programå
putText (line, ' file too small');
END;
11: BEGIN
putText (line, iName); æPascal programå
putText (line, ' file too small');
END;
otherwise
BEGIN
putText (line, 'unknown error');
putInt (line, res.main, 4);
END;
END; æcaseå
putNl (line);
res.main := ok;
END æfamily = privFam, own error codeså
ELSE
putError (line, res, '', 0);
res := call( termIo (stdError, writeSeq, line));
æ*b* printVar ('error msg line = ', line); *e*å
ObjReturn (res);
END;
END; æentry Runå
OTHERWISE unknown
with record t : ^^; end;
BEGIN
exception (makeRes (-EntryIllegal, Universal, 0, 0));
END;
END; æprogram eosloadå
INITIALIZE
iEosLoad 'eosload' :
pObjDir 'objdir'
END. æ eosLoad å
«eof»