|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 23808 (0x5d00)
Types: TextFile
Names: »tconass«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦976cf9702⟧ »tassemb«
└─⟦this⟧
;nhp time.300
slet std.conass
beskyt std.conass.61
conass=algol message.no
begin comment constructor for the tda-assembler,
a call of the constructor has the form:
resultarea = tac sourcearea
the data is read from the sourcearea,
transformed ,checked and written into
the resultarea.
the data has the format:
leading text å
global variabels å
format of operations å
modification tabels å
data for symboltabels å
initialization of operationcodetabels å
;
integer f,d,addrno,modifno,base,baseindex,length,
char,name,number,index,i,j,h,k,l,operand,
c,m,a,o,u,r,ii,e,b,x,comma,point,semicolon,slash,å,em,g,
wordlength,nooindex,noobase,coresize,charsinword,
charlength,nooformats,noooperations,maxaddrno,
maxmodifno,machine,
nooextra,textword,addressword,realword,charrep,indirect,
nooperm,expoex,exposh,fracex,fracsh,noocodes;
boolean boo,addror,code,found,basenames,indexnames,permnames,nl,
list;
long longnumber;
array ar(1:2);
integer array t(1:10);
zone zout(128,1,stderror);
procedure skip(val);
integer val;
begin comment skips chars read from current input
until a char with internal value val or em
is met,
if em is met the program is terminated,
val=zero means leading spaces and newlines are skipped;
integer i,char;
if val=0 then
begin
for i:=readchar(in,char) while char=32 or char=10 do;
repeatchar(in)
end
else
for i:=readchar(in,char) while char<>em and char<>val do;
if char=em then
begin
write(out,nl,1,<:***source:>);
goto errorout
end
end skip;
boolean procedure readnumber(limit);
integer limit;
begin comment reads in a non-negative integer less then limit
and stores the value in number,
the number is preceded by a point,
if the syntax is incorrect or the value exeedes
the limit-value readnumber is false else it is true;
integer i,char;
operand:=operand+1;
readnumber:=false;
skip(0); i:=readchar(in,char);
if char<>point then goto outnum;
number:=0;
for i:=readchar(in,char) while i=2 do
begin
readnumber:=true;
number:=number*10+char-48;
if number>limit then
begin
readnumber:=false; goto outnum
end
end;
repeatchar(in);
outnum:
end readnumber;
boolean procedure readbinary(limit);
long limit;
begin comment reads integers in binary form,
syntax as readnumber,
returns value in longnumber;
integer i,char;
operand:=operand+1;
readbinary:=false;
skip(0); i:=readchar(in,char);
if char<>point then goto outbin;
longnumber:=0;
for i:=readchar(in,char) while char=48 or char=49 do
begin
readbinary:=true;
longnumber:=longnumber*2+char-48;
if longnumber>limit then
begin
readbinary:=false; goto outbin
end
end;
outbin:
repeatchar(in)
end readbinary;
boolean procedure readname;
begin comment reads in a name,only the 4 first chars.
the value is returned in name.
if the first char is not a letter eadname is false;
integer i,j,val,char;
skip(0);
operand:=operand+1;
name:=j:=0; readname:=false;
for i:=readchar(in,char)
while (i=6 or (i=2 and j>0)) and j<4 do
begin
j:=j+1; readname:=true;
name:=name*40+(if i=6 then char-86 else char-48)
end;
repeatchar(in);
if j=4 then
for i:=readchar(in,char) while i=6 or i=2 do;
repeatchar(in)
end readname;
procedure error(no,destination,val);
integer no,val; label destination;
begin comment writes an errormessage,skips tomval and
continues from destination;
integer i,char;
write(out,nl,2,<:***:>,<<-ddd>,case no of
(<:length:>,<:format:>,<:modification:>,
<:mask:>,<:symboltabel:>,<:opcodetabel:>,
<:resultarea:>,<:opcodetabelsize:>,<:textrep:>));
if no<7 then write(out,if no<5 then f else index);
if no=8 then write(out,noocodes);
if no<>7 or j<>1 then write(out,operand);
skip(val);
write(out,nl,2);
goto destination
end error;
procedure writename(name);
integer name;
begin comment writes out a name;
integer i,char,val;
boolean array r(1:4);
val:=name;
for i:=1,2,3,4 do r(i):=false add 32;
i:=5;
for i:=i-1 while i>0 and val<>0 do
begin
char:=val mod 40;
r(i):=if char<11 then false add (char+47)
else false add (char+86);
val:=val//40
end;
for i:=1,2,3,4 do write(out,r(i),1)
end writename;
nl:=false add 10;
em:=25;
å:=125;
comment skip leading text;
skip(å);
comment read in global variabels;
read(in,machine,wordlength,nooindex,noobase,coresize,
nooformats,noooperations,maxaddrno,maxmodifno,
nooextra,nooperm,
charrep,
realword,expoex,exposh,fracex,fracsh,
addressword,indirect,
noocodes);
comment initialize variabels and constants;
skip(å);
a:=97;
b:=98;
c:=99;
e:=101;
ii:=105;
m:=109;
o:=111;
r:=114;
u:=117;
x:=120;
comma:=44;
point:=46;
semicolon:=59;
slash:=47;
baseindex:=0;
basenames:=noobase>0;
if -,basenames then noobase:=1;
indexnames:=nooindex>0;
if -,indexnames then nooindex:=1;
permnames:=nooperm>0;
if -,permnames then nooperm:=1;
comment test size of opcodetabels;
if noocodes mod 2=0 or
noocodes mod 37=0 or
noocodes<50 then error(8,errorout,0);
comment initialize resultarea;
if readparam(ar)>=0 then error(7,errorout,0);
i:=1;
open(zout,0,string ar(increase(i)),0);
if monitor(42,zout,0,t)<>0 or t(9)<>0 then
error(7,errorout,0);
j:=t(1);
if j>0 then j:=4 else
begin
j:=(j shift 1) shift (-1);
for i:=1,2 do ar(i):=
0.0 shift 24 add t(i*2) shift 24 add t(i*2+1)
end;
close(zout,true);
i:=1;
open(zout,4,string ar(increase(i)),0);
comment read list option;
list:=false;
readparam(ar);
readparam(ar);
if readparam(ar)=2 then
begin
if ar(1)=real<:list:> then
begin
readparam(ar);
list:=ar(1)=real<:yes:>
end
end;
comment calculate the textrepresentation;
charlength:=if charrep=2 then 6 else 8;
j:=0;
for j:=j+1 while (wordlength*j) mod charlength<>0 do;
if wordlength*j<=48 then
begin
charsinword:=wordlength*j//charlength;
textword:=j
end
else error(9,errorout,0);
comment tabels describing the operations are declared;
begin
boolean array opf,maskaddr,bi,formattab(0:nooformats-1),
amf,adf(0:nooformats-1,0:maxaddrno),
adrmodif(0:(nooformats)*(noobase+nooindex+4));
integer array indextab(1:nooindex),
basetab(1:noobase),
permtab(1:nooperm*2),
opcodename,opcode(0:noocodes),
symname(1:noobase+nooindex+nooperm+10);
long array maskvalue(0:nooformats-1);
procedure inoptab(name,index,found);
value name;
integer name,index;
boolean found;
begin integer k;
comment inserts the name in the opcodetabels,
found tells if the name was in the tabel,
index gives the index of the last entry examined;
k:=(name shift (-12) + name extract 12) mod noocodes;
for index:=k+1 step 1 until noocodes,
0 step 1 until k do
if opcodename(index)=name then
begin found:=true; goto OUT; end else
if opcodename(index)=0 then
begin found:=false; opcodename(index):=name; goto OUT; end;
OUT:
end inoptab;
boolean procedure compare;
begin comment compares a name with a list of names,
if the name is found compare is false else
the name is added to the list and compare is true;
integer i;
i:=0;
for i:=i+1 while symname(i)<>0 and symname(i)<>name do;
compare:=symname(i)=0;
symname(i):=name;
end compare;
procedure loopend(no,dest,val,sep,limit);
integer no,val,sep,limit;
label dest;
begin comment tests end of a loop;
skip(0); g:=readchar(in,char);
if char=sep or j=limit then
begin
if char<>sep or j<>limit then
begin
repeatchar(in); error(no,dest,val)
end
end
end loopend;
for i:=0 step 1 until nooformats-1 do
begin
opf(i):=maskaddr(i):=formattab(i):=
bi(i):=false add 0;
maskvalue(i):=0;
for j:=1 step 1 until maxaddrno do
adf(i,j):=amf(i,j):=false add 0
end;
for i:=0 step 1 until (nooformats)*(noobase+nooindex+4) do
adrmodif(i):=false add 0;
for i:=0 step 1 until noocodes do
opcode(i):=opcodename(i):=0;
for i:=1 step 1 until nooindex do
indextab(i):=0;
for i:=1 step 1 until noobase do
basetab(i):=0;
for i:=1 step 1 until nooperm*2 do
permtab(i):=0;
for i:=1 step 1 until noobase+nooindex+nooperm+10 do
symname(i):=0;
comment the formats of the operations are read in,
a format has the form:
no of words semicolon
layout semicolon
modification semicolon
mask/
the layout consists of statements: code.field length
separated by commas.
the layoutcodes are
c code field (only one)
a address field
m addr modif field
o masked addr field (only one)
u unused
the modification consists of statements: code.modifvalue
separated by commas.
the modification values are:
r relative addressing
i indirect
m immediate
e extended
b baseregisterrelative
x indexed
the b-code demands noobase modifvalues,
the x-code demands nooindex modifvalues
the mask consists of m.value
;
for f:=0 step 1 until nooformats-1 do
begin
comment initialize formatstatement;
operand:=0;
code:=addror:=false;
addrno:=modifno:=0;
d:=48;
base:=f*(4+noobase+nooindex);
for h:=0 step 1 until noobase+nooindex+3 do
adrmodif(base+h):=false add 128;
maskaddr(f):=false add 0;
comment read number of words;
read(in,length);
if length*wordlength>48 then error(1,nextformat,slash);
repeatchar(in);
skip(0); g:=readchar(in,char);
if char<>semicolon then error(1,nextformat,slash);
comment read format of machine word(s);
formatpart:
skip(0); g:=readchar(in,name);
operand:=operand+1;
if -,readnumber(48) then error(2,nextformat,slash);
if name=c then
begin comment code field;
if code then error(2,nextformat,slash);
code:=true;
d:=d-number;
opf(f):=false add d shift 6 add number
end
else if name=m then
begin comment modification part;
modifno:=modifno+1;
if modifno>maxmodifno then error(2,nextformat,slash);
d:=d-number;
amf(f,modifno):=false add d shift 6 add number
end
else if name = a then
begin comment address part;
addrno:=addrno+1;
if addrno>maxaddrno then error(2,nextformat,slash);
d:=d-number;
adf(f,addrno):=false add d shift 6 add number
end
else if name=o then
begin comment address part to be masked;
if addror then error(2,nextformat,slash);
addror:=true;
addrno:=addrno+1;
if addrno>maxaddrno then error(2,nextformat,slash);
adf(f,addrno):=false add d shift 6 add number;
maskaddr(f):=false add (addrno)
end
else if name=u then
begin comment undefined part;
d:=d-number
end
else error(2,nextformat,slash);
skip(0); g:=readchar(in,char);
if char=comma then goto formatpart else
if char<>semicolon then error(2,nextformat,slash);
comment test length of formatdescription;
if 48-d<>length*wordlength then error(2,nextformat,slash);
formattab(f):=false add length shift 4
add addrno shift 4 add modifno;
comment read in addressmodification symbols;
modifpart:
operand:=operand+1;
skip(0); g:=readchar(in,name);
if name=semicolon then goto maskpart;
index:= if name=r then 0 else
if name=ii then 1 else
if name=e then 2 else
if name=m then 3 else -1;
if index<>-1 then
begin
if adrmodif(base+index) extract 12<>128
and -,readnumber(48)
then error(3,nextformat,slash);
adrmodif(base+index):=false add number
end
else if name=b then
begin
for h:=1 step 1 until noobase do
begin
if adrmodif(base+3+h) extract 12 <>128
and -,readnumber(48) then
error(3,nextformat,slash);
adrmodif(base+3+h):=false add number
end
end
else if name=x then
begin
for h:=1 step 1 until nooindex do
begin
if adrmodif(base+3+noobase+h) extract 12<>128
and -,readnumber(48) then
error(3,nextformat,slash);
adrmodif(base+3+noobase+h):=false add number
end
end
else error(3,nextformat,slash);
skip(0); g:=readchar(in,char);
if char=comma then goto modifpart else
if char<>semicolon then error(3,nextformat,slash);
comment read in mask part;
maskpart:
skip(0); g:=readchar(in,char);
operand:=operand+1;
if (addror and char<>m) or ( -,addror and char<>slash)
then error(4,nextformat,slash);
if addror then
begin
if readbinary(long(2**24-1)) then maskvalue(f):=longnumber
else error(4,nextformat,slash);
end else repeatchar(in);
skip(slash);
comment calculate base for modif 2 action;
nextformat:
bi(f):=false add baseindex;
baseindex:=baseindex+2**(amf(f,1) extract 6)*addrno;
comment test end of statement;
skip(0); g:=readchar(in,char); repeatchar(in);
if char=å or f=nooformats-1 then
begin
if char<>å or f<>nooformats-1 then
error(4,modiftabels,å)
end
end format loop;
comment modify base for modif action;
baseindex:=baseindex-1;
skip(å);
modiftabels:;
comment tabel for symbols,operationcodes and addresscal-
culation are declared;
begin
boolean array modif1tab(0:nooformats-1),
modif2tab(0:baseindex);
integer array aid1(0:nooformats-1),
aid2(0:baseindex);
for i:=0 step 1 until nooformats-1 do aid1(i):=0;
for i:=0 step 1 until baseindex do aid2(i):=0;
comment data for the modificationtabels are read in,
the data has the form:
data for modif1tab/data for modif2tab/
;
read(in,aid1,aid2);
repeatchar(in); skip(å);
for j:=0 step 1 until nooformats-1 do
modif1tab(j):=false add aid1(j);
for j:=0 step 1 until baseindex do
modif2tab(j):=false add aid2(j);
symboltab:;
comment data for the symboltabels are read in,
it has the form:
indexregister names/
baseregister names/
permanent names/
a permanent name has the form:
name.value
;
operand:=0;
comment indexregister names;
if indexnames then
begin
for j:=1 step 1 until nooindex do
begin
if readname and compare then indextab(j):=name
else error(5,opcodetabels,å);
loopend(5,opcodetabels,å,slash,nooindex)
end
end else skip(slash);
comment baseregister names;
if basenames then
begin
for j:=1 step 1 until noobase do
begin
if readname and compare then basetab(j):=name
else error(5,opcodetabels,å);
loopend(5,opcodetabels,å,slash,noobase)
end
end else skip(slash);
comment permanent names;
if permnames then
begin
for j:=1 step 1 until nooperm do
begin
if readname and compare and readnumber(8388606) then
begin
permtab(j*2-1):=name;
permtab(j*2):=number;
end;
loopend(5,opcodetabels,å,slash,nooperm)
end
end else skip(slash);
skip(å);
opcodetabels:;
comment read in data for the opcodetabels,
the data has the form:
extradirectives/operationcodes/
extradirectives consists of a
name.actionno+31.no of words generated
.state1.state2
operationcodes consists of a
name.formatno.machinecode
;
comment put directives in:r,c,z,l,u,n,t,m;
i:=0;
for j:=28,13,36,22,31,24,30,23 do
begin
i:=i+1;
inoptab(j,index,found);
opcode(index):=case i of
(9shift 6 add 9 shift 12 add 36,
0 shift 6 add 9 shift 12 add 37,
0 shift 6 add 8 shift 12 add 38,
0 shift 6 add 9 shift 12 add 39,
0 shift 6 add 8 shift 12 add 40,
0 shift 6 add 8 shift 12 add 41,
0 shift 6 add 8 shift 12 add 42,
0 shift 6 add 9 shift 12 add 44)
end;
comment put extra directives in;
operand:=0;
if nooextra>0 then
begin
for j:=1 step 1 until nooextra do
begin
found:=true;
if readname then inoptab(name,index,found);
boo:= -,readnumber(64); h:=number;
boo:=boo or -,readnumber(64); k:=number;
boo:=boo or -,readnumber(64); l:=number;
if boo or -,readnumber(64) or found then
error(6,codenames,slash) else
opcode(index):=number shift 6 add l shift 6 add k
shift 6 add h;
loopend(6,outprogram,å,slash,nooextra)
end
end else skip(slash);
codenames:;
comment put operationcodes in;
for j:=1 step 1 until noooperations do
begin
found:=true;
if readname then inoptab(name,index,found);
boo:= -,readnumber(nooformats-1); h:=number;
boo:=boo or -,readbinary(long(2**(opf(h)extract 6)));
if -,found or -,boo then
opcode(index):=longnumber shift 6 add h
else error(6,outprogram,0);
if boo or found then error(6,outprogram,0);
loopend(6,outprogram,å,slash,noooperations)
end;
outprogram:;
comment the tabels are written on current output for control;
if -,basenames then noobase:=0;
if -,indexnames then nooindex:=0;
if -,permnames then nooperm:=0;
if -,list then goto nolist;
write(out,false add 12,1,<:global variabels::>,nl,2);
write(out,<<-dddddd>,
<:machine ::>,
(case machine of (<: TEXAS 980 A:>,<: INTEL 8008:>,
<: INTEL 8080:>,<: VARIAN 620/i:>,
<: PDP 8:>,<: MOTOROLA M6800:>)),nl,1,
<:no of operations ::>,noooperations,nl,1,
<:no of indexregisters ::>,nooindex,nl,1,
<:no of baseregisters ::>,noobase,nl,1,
<:coresize ::>,coresize,nl,1,
<:wordlength ::>,wordlength,nl,1,
<:textpart in words ::>,textword,nl,1,
<:charecterrepresentation ::>,
(case charrep+1 of(<: iso 8-bit:>,<: ascii 8-bit:>,
<: ascii 6-bit:>)),nl,1,
<:no of charecters in textpart ::>,charsinword,nl,1,
<:realnumber in words ::>,realword,nl,1,
<:realnumber format (ex,frac) ::>,<<-dd>,
expoex,exposh,fracex,fracsh,nl,1,<<-dddddd>,
<:addressword in words ::>,addressword,nl,1,
<:indirect correction ::>,indirect,
false add 12,1);
write(out,nl,3,<:formats::>,nl,2);
for i:=0 step 1 until nooformats-1 do
begin
write(out,<<-dd>,<:no::>,i,nl,1,<:layout ::>,
opf(i) extract 6,
opf(i) shift(-6) extract 6);
for j:=1 step 1 until maxaddrno do
write(out,<<-dd>,amf(i,j) extract 6,
amf(i,j) shift (-6) extract 6,
adf(i,j) extract 6,
adf(i,j) shift (-6) extract 6);
write(out,<<-ddd>,nl,1,<:maskaddr/value::>,
maskaddr(i) extract 12,
maskvalue(i),nl,1,
<:modifications ::>);
h:=bi(i) extract 12;
l:=if i<nooformats-1 then bi(i+1) extract 12
else baseindex+1;
for j:=0 step 1 until noobase+nooindex+3 do
write(out,<<-ddd>,
adrmodif(i*(noobase+nooindex+4)+j) extract 12);
write(out,nl,1,<:addr actions ::>,<<-ddd>,
modif1tab(i) extract 12,nl,1,false add 32,15,h,<:::>);
j:=h-1;
for j:=j+1 while j<l do
write(out,<<-dd>,modif2tab(j) extract 12);
write(out,nl,3)
end;
write(out,nl,3,<:symbols::>,nl,2);
i:=0; for i:=i+1 while i<=nooindex do
begin
writename(indextab(i)); write(out,<: indexreg:>,nl,1)
end;
i:=0; for i:=i+1 while i<=noobase do
begin
writename(basetab(i)); write(out,<: basereg:>,nl,1)
end;
i:=0; for i:=i+1 while i<=nooperm do
begin
writename(permtab(i*2-1));
write(out,<<-dddddd>,permtab(i*2),nl,1)
end;
write(out,false add 12,1,<:operation tabels::>,nl,1);
for i:=0 step 1 until noocodes do
begin
write(out,<<-ddd>,nl,1,i,false add 32,3);
writename(opcodename(i));
write(out,<<-ddddddd>,
opcode(i),opcode(i) extract 6);
if opcode(i) extract 6>nooformats then
write(out,<<-dddddd>,
opcode(i) shift(-6) extract 6,
opcode(i) shift(-12) extract 6,
opcode(i) shift(-18) extract 6)
else write(out,<<-dddddd>,
opcode(i) shift(-6) extract 18);
end;
nolist:;
comment write variabels and tabels to initialize the
assembler into the resultarea;
write(zout,machine,wordlength,nooindex,noobase,coresize,
nooformats,textword,charrep,charsinword,charlength,
realword,expoex,exposh,fracex,fracsh,
addressword,indirect,noocodes,nooperm,
baseindex,maxaddrno);
for i:=0 step 1 until noocodes do
write(zout,opcodename(i));
for i:=0 step 1 until noocodes do
write(zout,opcode(i));
if indexnames then
for i:=1 step 1 until nooindex do
write(zout,indextab(i));
if basenames then
for i:=1 step 1 until noobase do
write(zout,basetab(i));
if permnames then
for i:=1 step 1 until nooperm*2 do
write(zout,permtab(i));
for i:=1 step 1 until nooformats do
write(zout,formattab(i-1) extract 12);
for i:=1 step 1 until nooformats do
write(zout,opf(i-1) extract 12);
for i:=1 step 1 until nooformats do
write(zout,modif1tab(i-1) extract 12);
for i:=0 step 1 until (nooformats)*(noobase+nooindex
+4) do
write(zout,adrmodif(i) extract 12);
for i:=0 step 1 until baseindex do
write(zout,modif2tab(i) extract 12);
for i:=0 step 1 until nooformats-1 do
write(zout,bi(i) extract 12);
for i:=0 step 1 until nooformats-1 do
for j:=0 step 1 until maxaddrno do
write(zout,amf(i,j) extract 12);
for i:=0 step 1 until nooformats-1 do
for j:=0 step 1 until maxaddrno do
write(zout,adf(i,j) extract 12);
for i:=0 step 1 until nooformats -1 do
write(zout,maskaddr(i) extract 12);
for i:=0 step 1 until nooformats-1 do
write(zout,maskvalue(i));
write(zout,0,0)
end
end;
errorout:
close (zout,true)
end
▶EOF◀