|
|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 69120 (0x10e00)
Types: TextFileVerbose
Names: »t35mass«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system
└─⟦093e2ad1c⟧
└─⟦this⟧ »t35mass«
job fh 1 1000 size 90000 area 10 buf 10 time 11 0 perm disc 300 300,
output 300000
mode list.yes
rc35mass=set 1 disc
if ok.no
finis
scope login rc35mass
rc35mass=algol connect.no fp.no list.no bossline.yes blocks.yes
begin
boolean expr_expected, printing, listing, bcdef, compress, disassemble,
warning, jump_table, printbin, genoutput, bossline, mess,
expl_bdest, expl_bsource, irdef, rcdef, fastregs, disasskneh, default1;
integer i, j, k, p, p1, swopcount, linelength, pass, kk, expr_pointer,
instr, map_k, reps,
fpnames, nextbossline, boss_line_no, sourceno, fpcount,
line_no, page_no, errors, warnings,
fbdest, fcond, fslop,
fsldest, fbsource, fslop1, fslop2, const_field_length, ra_def_length,
aq, ab, oq, ob, oa, da, dq, d0,
ar, fq, fn, bd;
long op1, op2, alufunc, areg, breg, bitword1, bitword2,
no_burn, word, symb_name,
data1, data2, sliceop, implc, cdef, radef, bfdef, name, binary,
r, q, ass, aluass, carshift, clr, comma, car, op, dofunc,
jump, cond_allowed, invert, line_end, vect, map, sign, undef, ir,
rc, minus, carry, cond;
long array symb(0:1999, 0:3), ext(1:30, 0:1), a(1:30),
bin_mem(0:2047, 0:1), fp_file, headname(1:2);
integer array line(1:200), char_pos(1:30), map_table(0:1023+4);
zone zin, bin(128, 1, stderror);
integer max_symb, entr_no;
\f
procedure examineparams(initmode);
value initmode;
boolean initmode;
begin
boolean first;
integer pno, j, i, type, paramfct, bits;
real array rarr(1:2), name(1:fpnames, 1:2);
integer array field ia;
procedure alarm(i);
value i;integer i;
begin
write(out,<:<10>params :>,pno);
goto slut1;
end alarm;
procedure set(boo);
boolean boo;
begin
if type=1 or type=4 then alarm(5);
if type<=3 == initmode then
boo:= type=2 or type=5 ;
paramfct:=fpnames+2; comment no more points may follow;
end set;
procedure set1(boo);
boolean boo;
begin
if type<>2 and type<>3 then alarm(5);
boo:= type=2;
paramfct:=fpnames+2; comment no more names may follow;
end;
for j:=1 step 1 until fpnames do name(j,1):=name(j,2):=real<::>;
for j:=1 step 1 until fpnames do name(j,1):=real (case j of(
<:bossl:> add 105, <:messa:> add 103, <:print:> add 98,
<:jumpt:> add 97, <:warni:> add 110, <:print:>, <:list:>,
<:map:>,<:compr:> add 101,<:disas:> add 115, <:disas:> add 115, <:fastr:> add 101,
<:defau:> add 108));
name(1,2):=real<:ne:>;
name(2,2):=real<:e:>;
name(3,2):=real<:in:>;
name(4,2):=real<:ble:>;
name(5,2):=real<:g:>;
name(9,2):=real<:ss:>;
name(10,2):=real<:emble:>;
name(11,2):=real<:kneh:>;
name(12,2):= real<:gs:>;
name(13,2):=real<:t1:>;
if initmode then
begin
boss_line_no:=fpcount:=0;
sourceno:=1;
bossline:=
genoutput:=printbin:=jumptable:=printing:=listing:=disassemble:=
compress:=fastregs:=disasskneh:=default1:=false;
mess:=warning:=true;
end;
if fpcount=0 then
begin
pno:=1;
if system(4,pno,rarr)=6 shift 12 + 10 then
begin comment name=;
pno:=pno+1;
genoutput:=true;
end;
end else pno:=fpcount;
rep:
for j:=system(4,pno,rarr) while j>=4 shift 12 do
begin
if j<>4 shift 12 + 10 then alarm(5);
for paramfct:=1 step 1 until fpnames do
if name(paramfct,1)=rarr(1) and
name(paramfct,2)=rarr(2) then goto ud; ud:
if system(4,pno+1,rarr)shift(-12)<>8 then
begin
pno:=pno+1;
goto if initmode then rep else fin;
end;
first:=true;
for i:=system(4,increase(pno)+1,rarr)while i shift(-12)=8 do
begin comment .param;
type:=if i extract 12=4 then 1 else if rarr(1)=real<:yes:>
then 2 else if rarr(1)=real<:no:> then 3 else
if rarr(1)=real<:on:> then 5 else
if rarr(1)=real<:off:> then 6 else 4;
\f
case paramfct of
begin
set(bossline);
set(mess);
set1(printbin);
set1(jumptable);
set(warning);
set(printing);
set(listing);
begin comment map.<filename> ;
if type=1 then alarm(5);
paramfct:=fpnames+2; comment no more points may follow;
end map;
set(compress);
set(disassemble);
set1(disasskneh);
set1(fastregs);
set1(default1);
alarm(5);comment not known;
alarm(5); comment no more points might follow;
end case paramfct;
first:=false;
end point loop;
comment terminate param;
case paramfct of
begin
; comment bossline;
; comment mess;
; comment printbin;
; comment jumptable;
; comment warning;
; comment print;
; comment list;
; comment map;
; comment compress;
; comment disassemble;
; comment disasskneh;
; comment fastregs;
; comment default1;
; comment not known;
; comment no more points might follow;
end;
end outer loop;
fin:
if -, initmode then fpcount:=pno;
end examineparams;
\f
boolean procedure opennextsource(z, sourceno);
integer sourceno;
zone z;
begin
integer k, j, count, pno, file, block;
boolean first;
real array field ra;
integer array arr(1:10);
real array rarr(1:2);
procedure alarm;
begin
write(out, <:<10>connect file:>, <<-d>, sourceno, <:<10>:>);
sourceno:=sourceno+1;goto slut;
end;
if sourceno>0 then
begin
nextbossline:=10;
lineno:=1000;
end;
start:
first:=true;
close(z,true);
opennextsource:=true;
pno:=1;
if system(4, pno, rarr)=6 shift 12 + 10 then pno:=pno+1;
count:=k:=0;
for j:=system(4, pno, rarr) while count<>sourceno and(j<>0 or k<>0) do
begin
if sourceno<0 and
system(4, pno-1, rarr)=4 shift 12 + 10 and j=8 shift 12 + 10 and
rarr(1)=real fpfile(1) and rarr(2)=real fpfile(2) then
begin
pno:=pno+1;
count:=-1;
end else
if k=4 shift 12 + 10 and (j shift(-12)=4 or j=0) then
count:=count+1;
k:=j;
pno:=pno+1;
end;
if count<>sourceno or pno<>2 and sourceno=0 then opennextsource:=false else
begin
system(4, pno-2, rarr);
if sourceno>0 then for j:=1, 2 do headname(j):=long rarr(j);
count:=0;
if sourceno<>0 and fpcount<=pno-2 then examineparams(false);
loop:
j:=1;
open(z, 4, string rarr(increase(j)), 0);
if monitor(42, z, j, arr)<>0 then
begin
if sourceno>0 then alarm;
for j:=1 step 1 until 10 do arr(j):=0; arr(1):=1;
if monitor(40,z,j,arr)<>0 then alarm;
goto out1;
end;
if first then
begin
file:=arr(7);
block:=arr(8);
first:=false;
end;
if arr(1)<0 then
begin
ra:=2;
rarr(1):=arr.ra(1);
rarr(2):=arr.ra(2);
end;
if arr(1)=1 shift 23 + 4 then
begin
count:=count+1;
if count=100 then alarm;
close(z, false);
goto loop;
end;
if arr(1)<0 then
begin
j:=arr(1) shift(-12) extract 11;
k:=arr(1) extract 12;
if k>20 or k extract 1=1 or arr(1)=0 or j extract 1=1 or
j>(if k=10 or k=12 then 6 else if k=16 then 4 else if
k=18 then 2 else 0) then alarm;
j:=arr(1)extract 23;
if k=20 then j:=j+(14-20);
close(z, false);
k:=1;
open(z, j, string rarr(increase(k)), 0);
end not bsarea;
k:=arr(1) extract 12;
if k<>10 and k<>16 then setposition(z,file,block);
if sourceno<>0 then sourceno:=sourceno+1;
end;
out1:
end opennextsource;
long procedure s(i, pos);
value i, pos;
integer i, pos;
begin
s:=0;
if pos<48 then bitword1:=logor(bitword1, extend i shift(47-pos))
else bitword2:=logor(bitword2, extend i shift(47+48-pos));
end s;
long procedure s1(i, pos);
value i, pos;
integer i, pos;
begin
s1:=extend i shift(47-pos);
end s1;
procedure outword(l1, l2);
value l1, l2;
long l1, l2;
begin
if pass=2 then
begin
if binmem(kk, 0)<>no_burn or binmem(kk, 1)<>no_burn then
error4(<:overwrite the old contents:>);
binmem(kk, 0):=l1 - l1 extract 16 + l1 extract 2 shift 14 +
l1 shift(-2) extract 14;
binmem(kk, 1):=l2;
print(l1, l2);
end;
kk:=(kk+1)extract 11;
end outword;
long procedure trihex(i);
value i;
integer i;
begin
integer j, k;
long word;
word:=0;
for j:=24 step 8 until 40 do
begin
k:=i extract 4;
i:=i shift (-4);
word:=word + extend(if k>9 then k+97-10 else k+48) shift j;
end;
trihex:=word;
end trihex;
long procedure outhex(i);
value i;
integer i;
begin
integer j, k, n;
long word;
boolean print;
print:=false;
n:=40;
word:=0;
for j:=-20 step 4 until 0 do
begin
k:=i shift j extract 4;
if -,print then print:=i shift(j+4)extract 4>9 or k<>0 or j=0;
if print then
begin
word:=word + extend(if k>9 then k+97-10 else k+48)shift n;
n:=n-8;
end;
end;
outhex:=word;
end outhex;
procedure find_items;
begin
integer pointer, linestart;
procedure pack;
begin
integer j, count, k, constval;
while line(linestart)=32 do linestart:=linestart+1;
charpos(pointer):=linestart;
j:=line(linestart);
linestart:=linestart+1;
ext(pointer, 0):=extend j shift 40;
ext(pointer, 1):=0;
k:=if j>96 then 1 <*letter*> else
if j=60 <* < *> or j=62 <* > *> or j=58 <* : *> then 2 else
if j=43 <* + *> or j=45 <* - *> then 3 else
if j=59 <* ; *> or j=61 <* = *> or j=10 or j=12 <* ff *> or
j=46 <* . *> or j=47 <* / *> or j=44 <* , *> then 4 else
if j>=48 and j<58 then 6 else 7;
if k>=6 then
begin
if k=7 then error1(<:syntax:>, charpos(pointer));
constval:=j-48;
for j:=line(linestart) while j>=48 and j<58 or
j>=97 and j<=102 do
begin
constval:=constval shift 4 +
(if j<58 then j-48 else j+10-97);
if constval>2047 then error1(<:constant too big:>, charpos(pointer));
linestart:=linestart+1;
end;
ext(pointer, 0):=outhex(constval);
a(pointer):=data2+sliceop+binary+constval;
goto ud;
end else
for count:=48 + 32 step -8 until -8 do
begin
j:=line(linestart);
if k=(if j>=48 and j<58 or j>96 then 1 <*letter*> else
if j=61 <* = *> or j=62 <* > *> or
j=60 <* < *> then 2 else
if j=43 <* + *> or j=45 <* - *> then 3 else 0)
then
begin
if count=-8 then
error1(<:name too long:>, charpos(pointer));
ext(pointer, 1-count//48):=ext(pointer, 1-count//48) +
extend j shift(count mod 48);
end else goto ud1;
linestart:=linestart+1;
end;
ud1:
search1(pointer); <*sets the a array *>
ud:
end pack;
linestart:=1;
for pointer:=1 step 1 until 30 do
begin
pack;
if pointer=2 then
begin
if ext(1, 0)=long<:.:> and ext(2, 0)=long<:m:> then goto ud;
end;
if logand(a(pointer), line_end)<>0 then goto ud;
end;
error1(<:too many fields:>, charpos(pointer));
ud:
end find items;
long procedure tab(i);
value i; integer i;
begin
tab:=case i of(
<*ext set bits + test bits*>
long<::=:>, ass + aluass + 3<*aludest*>,
long<::<62><62>:>,aluass + carshift +4<*aludest*>,
long<::=>:>, aluass + carshift + 5<*aludest*>,
long<::<<60>:>, aluass + carshift + 6<*aludest*>,
long<::=<60>:>, aluass + carshift + 7<*aludest*>,
long<:q:>, q + sliceop,
long<:,:>, comma,
long<:<10>:>, line_end,
long<:;:>, line_end,
long<:.:>, extend 0,
long<:::>, car + cdef + 2 shift 5<*carry cntrl*>,
long<:=:>, extend 0,
long<:<60>:>, car + cdef + carshift + 1 shift 5,
long<:>:>, car + cdef + carshift + 0 shift 5,
long<:+:>, s1(0,46) + op + sign,
long<:++:>, s1(0,46) + s1(1,47) + op,
long<:-:>, s1(2,46) + s1(1,47) + op + sign + minus,
long<:--:>, s1(2,46) + op + minus,
long<:ior:>, s1(3,46) + op,
long<:and:>, s1(4,46) + op,
long<:clr:>, s1(5,46) + op + clr,
long<:xor:>, s1(6,46) + op,
long<:equ:>, s1(7,46) + op,
long<:c:>, s(1,43) + carry,
long<:k:>, data2 + sliceop + binary,
long<:bus:>, data1 + 0,
long<:swp:>, data2 + sliceop + 1,
long<:ra:>, data1 + 7,
long<:zd:>, data1 + data2 + sliceop + cdef + radef +
6 shift 7 + 1 shift 5 + 2,
long<:zdx:>, data1 + data2 + sliceop + cdef + radef +
2 shift 7 + 1 shift 5 + 2,
long<:zdw:>, data1 + data2 + sliceop + cdef + radef +
0 shift 7 + 1 shift 5 + 2,
long<:zdc:>, data1 + data2 + sliceop + cdef + radef +
4 shift 7 + 1 shift 5 + 2,
long<:zd0:>, data1 + data2 + sliceop + cdef + radef + implc +
4 shift 7 + 1 shift 5 + 0 shift 3 + 2,
long<:zd1:>, data1 + data2 + sliceop + cdef + radef + implc +
4 shift 7 + 1 shift 5 + 1 shift 3 + 2,
long<:zd2:>, data1 + data2 + sliceop + cdef + radef + implc +
4 shift 7 + 1 shift 5 + 2 shift 3 + 2,
long<:zd3:>, data1 + data2 + sliceop + cdef + radef + implc +
4 shift 7 + 1 shift 5 + 3 shift 3 + 2,
long<:zm:>, data1 + cdef + radef +
6 shift 7 + 0 shift 5 + 2,
long<:zmx:>, data1 + cdef + radef +
2 shift 7 + 0 shift 5 + 2,
long<:zmw:>, data1 + cdef + radef + 0 shift 7 + 0 shift 5 + 2,
long<:zmc:>, data1 + cdef + radef + 4 shift 7 + 0 shift 5 + 2,
long<:zm0:>, data1 + cdef + radef + implc +
4 shift 7 + 0 shift 5 + 0 shift 3 + 2,
long<:zm1:>, data1 + cdef + radef + implc +
4 shift 7 + 0 shift 5 + 1 shift 3 + 2,
long<:zm2:>, data1 + cdef + radef + implc +
4 shift 7 + 0 shift 5 + 2 shift 3 + 2,
long<:zm3:>, data1 + cdef + radef + implc +
4 shift 7 + 0 shift 5 + 3 shift 3 + 2,
long<:zo:>, data1 + cdef + radef + 6 shift 7 + 2 shift 5 + 2,
long<:zox:>, data1 + cdef + radef + 2 shift 7 + 2 shift 5 + 2,
long<:zow:>, data1 + cdef + radef + 0 shift 7 + 2 shift 5 + 2,
long<:zoc:>, data1 + cdef + radef + 4 shift 7 + 2 shift 5 + 2,
long<:zo0:>, data1 + cdef + radef + implc +
4 shift 7 + 2 shift 5 + 0 shift 3 + 2,
long<:zo1:>, data1 + cdef + radef + implc +
4 shift 7 + 2 shift 5 + 1 shift 3 + 2,
long<:zo2:>, data1 + cdef + radef + implc +
4 shift 7 + 2 shift 5 + 2 shift 3 + 2,
long<:zo3:>, data1 + cdef + radef + implc +
4 shift 7 + 2 shift 5 + 3 shift 3 + 2,
long<:zz:>, data1 + cdef + radef + 6 shift 7 + 3 shift 5 + 2,
long<:zzx:>, data1 + cdef + radef + 2 shift 7 + 3 shift 5 + 2,
long<:zzw:>, data1 + cdef + radef + 0 shift 7 + 3 shift 5 + 2,
long<:zzc:>, data1 + cdef + radef + 4 shift 7 + 3 shift 5 + 2,
long<:zz0:>, data1 + cdef + radef + implc +
4 shift 7 + 3 shift 5 + 0 shift 3 + 2,
long<:zz1:>, data1 + cdef + radef + implc +
4 shift 7 + 3 shift 5 + 1 shift 3 + 2,
long<:zz2:>, data1 + cdef + radef + implc +
4 shift 7 + 3 shift 5 + 2 shift 3 + 2,
long<:zz3:>, data1 + cdef + radef + implc +
4 shift 7 + 3 shift 5 + 3 shift 3 + 2,
long<:rd:>, data1 + data2 + sliceop + cdef + radef +
7 shift 7 + 1 shift 5 + 2,
long<:rdx:>, data1 + data2 + sliceop + cdef + radef +
3 shift 7 + 1 shift 5 + 2,
long<:rdw:>, data1 + data2 + sliceop + cdef + radef +
1 shift 7 + 1 shift 5 + 2,
long<:rdc:>, data1 + data2 + sliceop + cdef + radef +
5 shift 7 + 1 shift 5 + 2,
long<:rd0:>, data1 + data2 + sliceop + cdef + radef + implc +
5 shift 7 + 1 shift 5 + 0 shift 3 + 2,
long<:rd1:>, data1 + data2 + sliceop + cdef + radef + implc +
5 shift 7 + 1 shift 5 + 1 shift 3 + 2,
long<:rd2:>, data1 + data2 + sliceop + cdef + radef + implc +
5 shift 7 + 1 shift 5 + 2 shift 3 + 2,
long<:rd3:>, data1 + data2 + sliceop + cdef + radef + implc +
5 shift 7 + 1 shift 5 + 3 shift 3 + 2,
long<:rm:>, data1 + cdef + radef +
7 shift 7 + 0 shift 5 + 2,
long<:rmx:>, data1 + cdef + radef +
3 shift 7 + 0 shift 5 + 2,
long<:rmw:>, data1 + cdef + radef + 1 shift 7 + 0 shift 5 + 2,
long<:rmc:>, data1 + cdef + radef + 5 shift 7 + 0 shift 5 + 2,
long<:rm0:>, data1 + cdef + radef + implc +
5 shift 7 + 0 shift 5 + 0 shift 3 + 2,
long<:rm1:>, data1 + cdef + radef + implc +
5 shift 7 + 0 shift 5 + 1 shift 3 + 2,
long<:rm2:>, data1 + cdef + radef + implc +
5 shift 7 + 0 shift 5 + 2 shift 3 + 2,
long<:rm3:>, data1 + cdef + radef + implc +
5 shift 7 + 0 shift 5 + 3 shift 3 + 2,
long<:ro:>, data1 + cdef + radef + 7 shift 7 + 2 shift 5 + 2,
long<:rox:>, data1 + cdef + radef + 3 shift 7 + 2 shift 5 + 2,
long<:row:>, data1 + cdef + radef + 1 shift 7 + 2 shift 5 + 2,
long<:roc:>, data1 + cdef + radef + 5 shift 7 + 2 shift 5 + 2,
long<:ro0:>, data1 + cdef + radef + implc +
5 shift 7 + 2 shift 5 + 0 shift 3 + 2,
long<:ro1:>, data1 + cdef + radef + implc +
5 shift 7 + 2 shift 5 + 1 shift 3 + 2,
long<:ro2:>, data1 + cdef + radef + implc +
5 shift 7 + 2 shift 5 + 2 shift 3 + 2,
long<:ro3:>, data1 + cdef + radef + implc +
5 shift 7 + 2 shift 5 + 3 shift 3 + 2,
long<:rz:>, data1 + cdef + radef + 7 shift 7 + 3 shift 5 + 2,
long<:rzx:>, data1 + cdef + radef + 3 shift 7 + 3 shift 5 + 2,
long<:rzw:>, data1 + cdef + radef + 1 shift 7 + 3 shift 5 + 2,
long<:rzc:>, data1 + cdef + radef + 5 shift 7 + 3 shift 5 + 2,
long<:rz0:>, data1 + cdef + radef + implc +
5 shift 7 + 3 shift 5 + 0 shift 3 + 2,
long<:rz1:>, data1 + cdef + radef + implc +
5 shift 7 + 3 shift 5 + 1 shift 3 + 2,
long<:rz2:>, data1 + cdef + radef + implc +
5 shift 7 + 3 shift 5 + 2 shift 3 + 2,
long<:rz3:>, data1 + cdef + radef + implc +
5 shift 7 + 3 shift 5 + 3 shift 3 + 2,
long<:ba:>, data1 + 3,
long<:bf:>, data1 + bfdef + 0 shift 7 + 1,
long<:bfm:>, data1 + bfdef + 1 shift 7 + 1,
long<:bd:>, data1 + data2 + sliceop + 4,
long<:cd:>, data1 + data2 + sliceop + 6,
long<:led:>, data1 + 5,
long<:ccr:>, data2 + sliceop + 7,
long<:int:>, data2 + sliceop + 0,
long<:const:>, data2 + sliceop + 3,
long<:ir:>, s(1,45) + ir,
long<:rc:>, s(1,46) + rc,
long<:h:>, s(1,26) + dofunc,
long<:w:>, s(1,26) + s(1,40) + dofunc,
long<:b:>, s(1,26) + s(1,41) + dofunc,
long<:s:>, s(1,42) + dofunc,
long<:r:>, s(1,26) + s(1,48) + dofunc,
long<:i:>, s(1,26) + s(1,39) + dofunc,
long<:u:>, s(1,44) + dofunc,
long<:jz:>, s(0,3) + jump,
long<:cjs:>, s(1,3) + jump + cond_allowed,
long<:jmap:>, s(2,3) + jump + map,
long<:cjp:>, s(3,3) + jump + cond_allowed,
long<:push:>, s(4,3) + jump + cond_allowed,
long<:jsrp:>, s(5,3) + jump + cond_allowed,
long<:cjv:>, s(6,3) + jump + vect,
long<:jrp:>, s(7,3) + jump + cond_allowed,
long<:rfct:>, s(8,3) + jump + cond_allowed,
long<:rpct:>, s(9,3) + jump + cond_allowed,
long<:crtn:>, s(10,3) + jump + cond_allowed,
long<:cjpp:>, s(11,3) + jump + cond_allowed,
long<:ldct:>, s(12,3) + jump,
long<:loop:>, s(13,3) + jump + cond_allowed,
long<:cont:>, s(14,3) + jump,
long<:twb:>, s(15,3) + jump + cond_allowed,
long<:b0:>, s(0,7) + s(1,47) + cond,
long<:i10:>, s(1,7) + s(1,47) + cond,
long<:st2:>, s(2,7) + s(1,47) + cond,
long<:st3:>, s(3,7) + s(1,47) + cond,
long<:st4:>, s(4,7) + s(1,47) + cond,
long<:st5:>, s(5,7) + s(1,47) + cond,
long<:c7:>, s(6,7) + s(1,47) + cond,
long<:st7:>, s(7,7) + s(1,47) + cond,
long<:zro:>, s(8,7) + s(1,47) + cond,
long<:ovf:>, s(9,7) + s(1,47) + cond,
long<:pty:>, s(10,7) + s(1,47) + cond,
long<:acy:>, s(11,7) + s(1,47) + cond,
long<:b15:>, s(12,7) + s(1,47) + cond,
long<:cry:>, s(13,7) + s(1,47) + cond,
long<:cr:>, s(14,7) + s(1,47) + cond,
long<:b1:>, s(15,7) + s(1,47) + cond,
long<:not:>, s(1,38) + invert,
long<::>);
end tab;
integer procedure search1(pointer);
value pointer;
integer pointer;
begin
integer i;
long word1, word2, l1;
k:=max_symb;
word1:=ext(pointer,0);
word2:=ext(pointer,1);
i:=(((((word1 mod k) shift 24) +
(word2 shift (-24))) mod k) shift 24 + word2) mod k;
while symb(i, 0) <> 0 do
begin
if symb(i, 0) = word1 then
begin
if symb(i, 1) = word2 then
begin
l1:=symb(i, 3);
bitword1:=logor(bitword1,
logand(l1, -s1(1,7)) + logand(l1, s1(1,7)-1)shift(-1));
if l1 extract 1 = 1 then bitword2:= extend 1 shift 47;
a(pointer):=symb(i, 2) + (if word1 = long<:k:> then kk else 0);
goto found;
end;
end;
i:=(i + 1) mod k;
end;
entr_no:=entr_no + 1;
if entr_no > max_symb - 1 then
begin
write(out, <:symbol overflow:>,entr_no,max_symb);
goto slut;
end;
symb(i, 0):=word1;
symb(i, 1):=word2;
a(pointer):=symb(i, 2):=if pass=1 then name else name + undef;
found:
if a(pointer) = name and pass = 2 then
a(pointer):=name + undef;
search1:=i;
end search1;
procedure copy(from, to);
value from, to;
integer from, to;
begin
integer i;
for i:=from step 1 until to do write(out, false add line(i), 1);
end copy;
integer procedure outf1(i, pos);
value i, pos;
integer i, pos;
begin
outf1:=if i=0 then write(out, false add 32, pos) else
outf(ext(i, 0), if pos>6 then 6 else pos) +
outf(ext(i, 1), pos-6);
end outf1;
integer procedure outf(word, pos);
value word, pos;
integer pos;
long word;
begin
integer i;
i:=write(out, string word shift(-8) shift 8, string word shift 40);
outf:=i+write(out, false add 32, pos-i);
end outf;
procedure print_head;
begin
own boolean notfirst;
own real date, time;
real r;
integer j;
integer field fi;
if -, notfirst then
begin
notfirst:=true;
systime(1, 0.0, r);
date:=systime(4, r, time);
end;
line_no:=2;
page_no:=page_no+1;
write(out, <:!<12><10>!rc35mass:>, false add 32, 5);
j:=0;
for fi:=2 step 2 until 8 do
j:=j+write(out, string(extend headname.fi)shift 24);
write(out, false add 32, 15-j,
<<zd dd dd>, date, <: :>, time, false add 32, 10,
<:page:>, <<-ddd>, page_no, <:<10>!<10>:>);
end print head;
procedure prep_line(n);
value n;
integer n;
begin
line_no:=line_no + n;
if line_no > 45 then
begin
print_head;
line_no:=line_no + n;
end;
end prep line;
procedure prep_line1(n);
value n;
integer n;
begin
line_no:=line_no + n;
if line_no > 45 then
begin
print_head;
line_no:=line_no + n + 5;
write(out,<:!:>,
<:lsb: 3 7 11 15 18 21 22 25 26 28 31 34 37 38 39 40 41 42 43 44:>,
<: 45 46 47 48 59 promno: 4 5 4 3 2 0 0 1<10>!:>,
<:addr cnd a b fnc op eh wrg bs bd -i w -b -s -u:>,
<: -rld -r 0 0 7 3 1 1 6 6<10>!:>,
<: nxt sld cin cld not -uc :>,
<:-ir -ce nmar 3 5 4 2 2 0 1<10>!:>,
<: :>,
<: 6 4 3 9 6 2 1<10>!<10>:>);
end;
end prep line1;
procedure prep_line2(n);
value n;
integer n;
begin
line_no:=line_no + n;
if line_no > 45 then
begin
print_head;
line_no:=line_no + n + 2;
write(out,
<:!addr _ _ _0 _ _1 _ _2 _ _3 _ _ 4 _ _5 _ _6 _ _7 _ _ 8 _ _9 _ _a _ _b _ _ c _ _d _ _e _ _f<10>!<10>:>);
end;
end prep_line2;
procedure format;
begin
integer i, j;
if -,compress then
begin
prep_line(1);
outline_no(true, true);
write(out, <: :>, string trihex(bitword2 shift (-47+11)extract 11), <:!:>);
j:=0;
end else j:=1000;
j:=j + write(out, false add 32, 3,
if bitword1 shift (-47+45) extract 1 = 0 then <:ir:=:> else <::>,
if bitword1 shift (-47+46) extract 1 = 0 then <:rc:=:> else <::>,
if bitword1 shift (-47+28) extract 2 = 3 and
bitword1 shift (-47+43) extract 1 = 0 then <:c:=:> else <::>) +
outf1(fbdest, 0) +
write(out, if fbdest=0 then <::> else <::=:>) +
outf1(fbsource, 0);
j:=j+write(out, false add 32, 13-j, if fbsource=0 then <::> else <:,:>);
j:=j+write(out, false add 32, 14-j);
j:=j+outf1(fsldest, 0) +
write(out, case bitword1 shift(-47+18) extract 3 + 1 of
(<::=:>,<::>,<::=:>,<::=:>,<::<62>>:>,
<::=>:>,<::<<60>:>,<::=<60>:>));
j:=j+write(out, false add 32, 18-j) +
write(out,
if bitword1 shift (-47+43) extract 1 = 0 then (
case bitword1 shift (-47+28) extract 2 + 1 of (
<:c>:>,<:c<60>:>,<:c::>,<::>)) else <::>) +
outf1(fslop1, 0) +
write(out, if if fslop=0 then true else ext(fslop, 0) shift(-24)extract 8=0 then <::> else <: :>) +
outf1(fslop, 0) +
write(out, if if fslop=0 then true else ext(fslop, 0) shift(-24)extract 8=0 then <::> else <: :>) +
outf1(fslop2, 0);
j:=j+write(out, false add 32, 28-j, <:,:>);
if bitword1 shift (-47+26) extract 1 = 0 then
j:=j + write(out, <:h :>);
if bitword1 shift(-47+34)extract 3<>2 and
bitword1 shift(-47+37)extract 3<>2 and
bitword1 shift(-47+40)extract 1=1 then
j:=j+write(out, <:w :>);
if bitword1 shift(-47+41)extract 1=0 then
j:=j+write(out, <:b :>);
if bitword2 shift(-47+0)extract 1=0 then
j:=j+write(out, <:r :>);
if bitword1 shift(-47+39)extract 1=0 then
j:=j+write(out, <:i :>);
if bitword1 shift(-47+44) extract 1=0 then
j:=j+write(out, <:u :>);
if bitword1 shift(-47+42)extract 1=0 then
j:=j+write(out, <:s:>);
j:=j+write(out, false add 32, 36-j, <:,:>);
j:=j + write(out,
case bitword1 shift(-47+3) extract 4 + 1 of (
<:jz :>,<:cjs :>,<:jmap :>,<:cjp :>,
<:push :>,<:jsrp :>,<:cjv :>,<:jrp :>,
<:rfct :>,<:rpct :>,<:crtn :>,<:cjpp :>,
<:ldct :>,<:loop :>,<::>,<:twb :>),
(if bitword1 shift (-47+38) extract 1 = 1 then
<:not :> else <::>)) +
outf1(fcond, 0) + write(out, if fcond<>0 then <: :> else <::>);
p:=expr_pointer;
while -,f(line_end) do
begin
j:=j+outf1(p, 0);
advance(1);
end;
write(out, false add 32, if compress then 1030-j else 58-j);
i:=charpos(p);
if line(i)<>59 <* ; *> then write(out, <:;:>);
copy(i, linelength);
end format;
procedure disass;
begin
boolean const;
long t1, top1, top2, t2;
integer i;
long procedure cheat;
begin
cheat:=0;
const:=true;
end cheat;
long procedure bus(dest);
value dest; boolean dest;
begin
long t;
integer i;
t:=long (case bitword1 shift (
if dest then -47+37 else -47+34) extract 3 +
(if dest then 1 else 9) of (
<::>,<:bf:>,<:rd:>,<:ba:>,
<:bd:>,<:led:>,<:cd:>,<:ra:>,
<:int:>, <:swp:>, <:rd:>, string( ( if symb_name<>0 then symb_name else
outhex(bitword2 shift(-47+11) extract 11) ) + cheat),
<:bd:>,<::>,<:cd:>,<:ccr:>));
if t = long<:rd:> then
begin
t:=long(case bitword1 shift (-47+31) extract 3 + 1 of (
<:zdw:>, <:rdw:>, <:zdx:>, <:rdx:>,
<:zdc:>, <:rdc:>, <:zd:>, <:rd:>));
if dest then
t:=t - long<: d:>+long(
case bitword1 shift (-47+28) extract 2 + 1 of (
<: m:>,<: d:>,<: o:>,<: z:>));
if t shift (-24) extract 8 =
long <:c:> shift (-40) then
t:=t - long <:c:> shift (-16) +
extend 48 add (bitword2 shift (-47+11) extract 2) shift 24;
end rd;
if t= long <:bf:> and
bitword1 shift (-47+31) extract 1 = 1 then
t:=long<:bfm:>;
bus:=t;
end bus;
long procedure slice(n);
value n; integer n;
begin
slice:=long (case n+1 of(
<:w0:>,<:w1:>,<:w2:>,<:w3:>,<:w4:>,<:w5:>,<:w6:>,<:w7:>,
<:w8:>,<:w9:>,<:w10:>,<:w11:>,<:w12:>,<:w13:>,<:w14:>,<:w15:>));
end slice;
for i:=1 step 1 until 9 do ext(i, 1):=0;
const:=false;
ext(1, 0):=bus(true);
fbdest:=if ext(1,0)=0 then 0 else 1;
t1:=ext(2, 0):=bus(false);
fbsource:=if ext(2, 0)<>0 then 2 else 0;
if ext(2, 0) = 0 <* alu *> and
bitword1 shift (-47+18) extract 3 = 2 then
begin
ext(2, 0):=slice( bitword1 shift (-47+11) extract 4);
fbsource:=2;
end;
fsldest:= 3; i:= bitword1 shift (-47+18) extract 3;
ext(3,0):= long(if i=0 then <:q:> else
if i=1 then <::> else
string slice(bitword1 shift (-47+15) extract 4));
i:=bitword1 shift (-47+25) extract 3; <* alu source *>
top2:=long(
if i = 7 then <::> else
if i = 6 or i = 0 or i = 2 then <:q:> else
if i >= 4 then string slice(
bitword1 shift (-47+11) extract 4) else
string slice(
bitword1 shift (-47+15) extract 4));
top1:=if i >= 5 then t1 else
if i >= 2 then extend 0 else
slice(bitword1 shift (-47+11) extract 4);
if bitword1 shift(-47+45)extract 1<>0 <* ir:= *> and
bitword1 shift(-47+46)extract 1<>0 <* rc:= *> and
(bitword1 shift(-47+43)extract 1<>0 or
bitword1 shift(-47+28)extract 2<>3) <* c:= *> and
i>=5 and fbdest=0 then fbsource:=0;
i:=bitword1 shift (-47+21) extract 3; <* alu function *>
if i = 6 or i = 1 then
begin t2:=top1; top1:=top2; top2:=t2
end;
if bitword1 shift(-47+34)extract 3=2 or
bitword1 shift(-47+37)extract 3=2 then
bitword1:=logand(bitword1, -s1(1,40)-1); <* remove w if rd *>
t2:=long(case i + 1 of (
if bitword1 shift (-47+22) extract 1 = 0 then ( if top1=0 or top2=0 then <::> else <:+:> ) else <:++:>,
if bitword1 shift (-47+22) extract 1 = 0 then <:--:> else <:-:>,
if bitword1 shift (-47+22) extract 1 = 0 then <:--:> else <:-:>,
<:ior:>,
<:and:>,<:clr:>,<:xor:>,<:equ:>));
if t2 = long <:and:> and
(top1 = 0 or top2 = 0) then
t2:=top1:=top2:=0;
ext(4, 0):=top1;
fslop1:=if top1 = 0 then 0 else 4;
ext(5, 0):=t2;
fslop:=if t2 = 0 then 0 else 5;
ext(6, 0):=top2;
fslop2:=if top2 = 0 then 0 else 6;
i:=bitword1 shift (-47+3) extract 4;
fcond:=0;
if bitword1 shift (-47+47) extract 1 = 0 then
begin comment condition;
fcond:=7;
ext(7,0):=long (case
bitword1 shift (-47+7) extract 4 + 1 of (
<:b0:>,<:i10:>,<:st2:>,<:st3:>,<:st4:>,<:st5:>,
<:c7:>,<:st7:>,<:zro:>,<:ovf:>,<:pty:>,<:acy:>,
<:b15:>,<:cry:>,<:cr:>,<:b1:>))
end else
if i = 2 <* jmap *> or
i = 6 <* cjv *> then
begin
fcond:=7;
ext(7, 0):=outhex(
bitword1 shift (-47+7) extract 4);
end;
expr_pointer:=8;
ext(8, 0):=if symb_name<>0 then symb_name else outhex(
bitword2 shift (-47+11) extract 11);
if const or bitword2 shift(-47+11)extract 11=0 then expr_pointer:=9;
a(8):=0; a(9):=line_end;
charpos(9):=9; line(9):=10;
line_length:=9;
end disass;
procedure disassknehproc;
begin comment disassemble kneh-type micro programs;
integer i,j,k,p,p1;
boolean procedure readhex(pos, val);
value pos;
integer pos, val;
begin
integer j, k, m;
m:=0;
for j:=pos step 1 until pos+3 do
begin
k:=line(j);
if k>=48 and k<=57 then k:=k-48 else
if k>=97 and k<=97+15-10 then k:=k+10-97 else
begin
readhex:=false;
goto ud;
end;
m:=m shift 4 + k;
end;
readhex:=true;
val:=m;
ud:
end readhex;
om:
p:=p1:=i:=0;
j:=0;
while j<>10 and j<>25 do
begin
readchar(zin,j);
i:=i+1;
line(i):=j;
if j=12 <* ff *> then
begin
line(i):=long<:.:> shift(-40);
i:=i+1;
line(i):=long<:p:> shift(-40);
end;
if p1=0 and line(i)=59 then p1:=i;
if p=0 and line(i)=59 then p:=i <* ; *> else
if p=0 and j<>32 then p:=-1;
end;
if j=25 then goto prbslut;
if -,readhex(5, kk) then
no_instr:
begin
if p<=0 then copy(1,i) else
begin
write(out,<:;:>);
copy(p,i);
end;
goto om;
end;
if kk>=2048 then
begin <* addr *>
if -,readhex(20, j) then goto no_instr;
if -,readhex(25, k) then goto no_instr;
for k:=38 step 1 until 42 do line(k):=
( case k-37 of (<:.:>, <:a:>, <:d:>, <:d:>, <:r:>) )shift(-40)extract 8;
copy(30, i);
goto om;
end;
if -, readhex(10, k) then goto no_instr;
bitword1:=extend k shift 32;
if -,readhex(15, k) then goto no_instr;
bitword1:=bitword1 + extend k shift 16;
if -,readhex(20, k) then goto no_instr;
bitword1:=bitword1 + k extract 12 shift(-2);
bitword2:=extend ( k extract 2 shift(-1) ) shift 47;
if -,readhex(25, k) then goto no_instr;
bitword1:=bitword1 + extend( k shift(-10) ) shift 10;
binmem(kk, 0):=bitword1 - bitword1 extract 16 +
bitword1 extract 2 shift 14 + bitword1 shift(-2) extract 14;
binmem(kk, 1):=bitword2:=bitword2 + extend( k extract 10 ) shift 36;
if line(30)>=64 then
begin <* label *>
for j:=30 step 1 until 35 do
if line(j)>=48 and line(j)<>58 then write(out, false add line(j), 1) else
j:=41;
write(out, <::<10>:>);
end label ;
symb_name:=0;
j:=0;
for k:=1 step 1 until i do
if line(k)=long<:,:> shift(-40) then
begin comment comma ;
j:=j+1;
if j=11 then
begin comment the address coloumn found;
k:=k+1;
while line(k)=32 do k:=k+1;
if line(k)>64 then
begin comment name ;
for j:=40 step -8 until 0 do
begin
if line(k)>=48 then
symb_name:=symb_name + extend line(k) shift j else
j:=0;
k:=k+1;
end for j ;
end name ;
k:=i;
end j=11 ;
end comma;
disass;
if p1<>0 then
begin <*copy comment*>
charpos(9):=p1;
linelength:=i;
end;
if bitword1 shift (-47+21) extract 3 = 7 and
bitword1 shift (-47+34) extract 3 = 0 then
begin
write(out,<:nop:>);
if p1<=0 then write(out,<:<10>:>) else copy(p1,i);
end else format;
goto om;
end disasspromtape;
procedure format1(n);
value n;
integer n;
begin
integer i, j;
<* n meaning
1 .loc / .loc expression
2 .k= expression
3 .list on/off
4 .print on/off
5 .instruction / .instruction expression
6 .regname= expression
7 constname= expression
8 <empty line>
9 .m
10 .p
11 constname:
12 .mapk expression
13 .addr expression / .addr expression , repetition *>
if pass=1 then goto next1;
if -,f(line_end) and n<>9 then error1(<:new line missing:>, 1);
if -,listing and (n<>9 or -,mess) then goto ud;
if -,compress then
begin
prep_line(1);
if bossline then write(out, <:!:>, <<ddddd>, bossline_no, <:! :>);
j:=-4;
end else j:=1000;
if n=9 <* .m *> then
begin comment copy the line stricly as it has been written;
copy(char_pos(1), linelength);
goto ud;
end;
p:=1;
if n=11 or n=7 or n=6 then j:=j+write(out, false add 32, 6-j);
while -,f(line_end) do
begin
j:=j+outf1(p, 0);
if p=1 and n=7 or p=2 and n=6 then
j:=j+write(out, false add 32, 16-j) <* spaces before = *> else
if p>1 then j:=j+write(out, <: :>);
advance(1);
end;
if instr>=0 and n=5 <* .instruction *> and -,compress then
j:=j + write(out, <:! :>, string trihex(instr),
<: :>, string trihex(map_table(instr)),
<: :>, string trihex(map_table(instr+256)), <:!:>);
if instr=-1 and n=5 <* .instruction *> and -,compress then
j:=j + write(out, <:! default :>, string trihex(map_table(1024)),
<: :>, string trihex(map_table(1025)), <:!:>);
if n=13 <* .addr *> and -,compress then
j:=j + write(out, false add 32, 25-j, <:! :>, string trihex(instr),
<: :>, string trihex(map_table(instr)), <: :>,
string trihex(reps), <:!:>);
i:=char_pos(p);
write(out, false add 32,
if if i<line_length then line(i+1)=59 <* ; *> else false then
9-j else if compress then 1030-j else 64-j);
if line(i)<>59 <* ; *> then write(out, <:;:>);
copy(i, linelength);
if n=10 then line_no:=1000;
ud:
goto next;
end format1;
procedure print(bitword1, bitword2);
value bitword1, bitword2;
long bitword1, bitword2;
if printing then
begin
integer i, j;
prep_line(1);
outline_no(true, true);
write(out, <: :>);
for i:=3 step 4 until 63 do
begin
if i mod 16=3 then write(out, <: :>);
j:=(if i>47 then bitword2 else bitword1)shift(-47+i mod 48)extract 4;
write(out, false add( if j>9 then j+97-10 else j+48), 1);
end;
if bitword1=no_burn and bitword2=no_burn then goto ud;
write(out, <: :>,
case bitword1 shift(-47+21)extract 3 + 1 of(
<:add:>, <:bus:>, <:sub:>, <:ior:>,
<:and:>, <:clr:>, <:xor:>, <:equ:>),
<<d>, bitword1 shift(-47+22)extract 1, <: :>,
case bitword1 shift(-47+25)extract 3 + 1 of(
<:aq :>, <:ab :>, <:oq :>, <:ob :>,
<:oa :>, <:da :>, <:dq :>, <:d0 :>),
case bitword1 shift(-47+18) extract 3 + 1 of(
<:fq :>, <: :>, <:ar :>, <:fr :>,
<:rq :>, <:rn :>, <:lq :>, <:ln :>),
case bitword1 shift(-47+28)extract 2 + 1 of(
<:rm/c> :>, <:rd/c< :>, <:ro/c= :>, <:rz/c:=:>),
<< dd>, bitword1 shift(-47+11)extract 4,
bitword1 shift(-47+15)extract 4, <: :>,
case bitword1 shift(-47+34)extract 3 + 1 of(
<:int :>, <:swp :>, <:rd :>, <:c :>,
<:bd :>, <:alu :>, <:cd :>, <:ccr :>),
case bitword1 shift(-47+37)extract 3 + 1 of(
<: :>, <:bf :>, <:rd :>, <:ba :>,
<:bd :>, <:led :>, <:cd :>, <:ra :>),
case bitword1 shift(-47+31)extract 3 + 1 of(
<:w :>, <:bw :>, <:x :>, <:bx :>,
<:w0 :>, <:b0 :>, <:rg :>, <:rd :>),
case bitword1 shift(-47+3)extract 4 + 1 of(
<:jz :>, <:cjs :>, <:jmap:>, <:cjp :>,
<:push:>, <:jsrp:>, <:cjv :>, <:jrp :>,
<:rfct:>, <:rpct:>, <:crtn:>, <:cjpp:>,
<:ldct:>, <:loop:>, <: :>, <:twb :>),
if bitword1 shift(-47+38)extract 1=1 then <: not :> else <: :>,
false add ( if bitword1 shift(-47+7)extract 4 > 9 then 97-10
else 48) add (bitword1 shift(-47+7)extract 4), 1, <:/:>,
case bitword1 shift(-47+7) extract 4 + 1 of(
<:b0 :>, <:i10 :>, <:st2 :>, <:st3 :>,
<:st4 :>, <:st5 :>, <:c7 :>, <:st7 :>,
<:zro :>, <:ovf :>, <:pty :>, <:acy :>,
<:b15 :>, <:cry :>, <:cr :>, <:b1 :>));
for i:=3 step 4 until 11 do
begin
j:=bitword2 shift(-47+i)extract (if i=3 then 3 else 4);
write(out, false add(if j>9 then j+97-10 else j+48), 1);
end;
write(out, <: :>);
j:=0;
if bitword1 shift(-47+26)extract 1=0 then j:=j+write(out, <:h :>);
for i:=39 step 1 until 48 do
if(if i>47 then bitword2 else bitword1)shift(-47+i mod 48)
extract 1=(if i=40 or i>=50 then 1 else 0) then
j:=j+write(out, case i-38 of(
<:supp :>, <:wait :>, <:byte :>, <:stat :>, <:updc :>,
<:sb :>, <:ir :>, <:rc :>, <:ccen :>, <:read :>));
ud:
write(out, <:<10>:>);
end print;
integer procedure read_expr;
begin
integer sum, i, result;
result:=-1;
sum:=0;
om:
i:=1;
if f(sign) and n(name+binary) then
begin
if f(minus) then i:=-1;
advance(1);
end;
if f(binary+name) then
begin
sum:=sum+a(p)extract 11 * i;
if result=-1 then result:=0;
if -,f(data2) then
begin
result:=-2;
if pass=2 then
error3(p, if f(r) then <: is a register name:> else
<: is undefined:>);
end;
advance(1);
if f(sign) and n(binary+name) then goto om;
end;
read_expr:= if result<0 then result else sum extract 11;
<* result = -1 : no expression
result = -2 : undefined expression *>
end read expr;
procedure swopop;
begin
long i;
swopcount:=1-swopcount;
i:=op1; op1:=op2; op2:=i;
end swopop;
boolean procedure f(t);
long t;
begin
p1:=p;
f:=logand(a(p1), t)<>0;
end f;
boolean procedure n(t);
long t;
begin
p1:=p1+1;
n:=logand(a(p1), t)<>0;
end n;
procedure advance(n);
integer n;
begin
p:=p+n;
end advance;
procedure setconst(length, n);
value length, n;
integer length, n;
begin
if (n-bitword2 shift(-47+11))extract(
if length<constfieldlength then length else constfieldlength)<>0 then
error(<:constant conflicts:>);
s(n, 59);
if constfieldlength<length then constfieldlength:=length;
end setconst;
procedure set_bus(a, pos);
value a, pos;
long a;
integer pos; <* source/dest bitposition *>
begin
integer i;
if logand(a, binary)<>0 then
begin
setconst(11, a extract 11);
a:=data2+sliceop+3; <* micro word to bus *>
end;
if pos<>0 then
begin
i:=bitword1 shift(-47+pos)extract 3;
if pos=37 and -,expl_bdest or pos=34 and -,expl_bsource then
s(a extract 3, pos) else
if i<>a extract 3 then error(<:bus used twice:>);
end;
if logand(a, implc)<>0 then setconst(2, a shift(-3)extract 2);
if logand(a, cdef)<>0 then
begin
i:=a shift(-5)extract 2;
if bcdef then
begin
if i<>bitword1 shift(-47+28)extract 2 then
error(<:carry field trouble:>);
end;
bcdef:=true;
s(i, 28);
end cdef;
if logand(radef+bfdef, a)<>0 then
begin
i:=a shift(-7)extract 3;
if (i-bitword1 shift(-47+31))extract(
if logand(radef, a)=0 and ra_def_length<>0 then 1 else
ra_def_length) <> 0 then
error(<:wreg contr field trouble:>);
if ra_def_length<>3 then ra_def_length:=if logand(radef, a)
<>0 then 3 else 1;
s(i, 31);
end;
end set bus;
procedure set_bus_source(a);
value a;
long a;
begin
a:=logand(a, -1-cdef); <* dont define the carry field *>
setbus(a, 34);
expl_bsource:=true;
end set bus source;
procedure set_bus_dest(a);
value a;
long a;
begin
setbus(a, 37);
expl_bdest:=true;
end set bus dest;
procedure outline_no(input, outaddr);
value input, outaddr;
boolean input, outaddr;
begin
if bossline then
begin
if input then write(out, <:!:>, <<ddddd>, bossline_no, <:! :>) else
write(out, false add 32, 8);
end;
if outaddr then write(out, <:! :>, string trihex(kk)) else
write(out, false add 32, 6);
end outline_no;
procedure error1(text, pos);
value pos;
integer pos;
string text;
begin
if pass=1 then goto next1;
prep_line(2);
errors:=errors+1;
outline_no(false, true);
write(out, <: **** :>, text, <:<10>:>);
outline_no(true, false);
copy(1,pos-1);
write(out, <:**:>);
copy(pos, linelength);
goto next;
end error1;
procedure error(text);
string text;
begin
integer i;
if pass=1 then
begin
kk:=kk+1;
goto next1;
end;
prep_line(2);
errors:=errors+1;
outline_no(false, true);
write(out, <: **** :>, text, <:<10>:>);
outline_no(true, false);
copy(1, charpos(p)-1);
write(out, <:**:>);
copy(charpos(p), linelength);
outword(no_burn, no_burn);
goto next;
end error;
procedure error3(i, s);
value i;
integer i;
string s;
begin
prep_line(1);
errors:=errors+1;
outline_no(false, true);
write(out, <: **** :>);
outf1(i, 0);
write(out, if i<>0 then <: :> else <::>, s, <:<10>:>);
end error3;
procedure error4(s);
string s;
if warning then
begin
prep_line(1);
outline_no(false, true);
write(out, <: ** :>, s, <:<10>:>);
warnings:=warnings+1;
end error4;
procedure error5(n, s);
value n;
integer n;
string s;
if n<>0 then
begin
prep_line(1);
write(out, <:! :>, <<d>, n, <: :>, s, <:<10>:>);
end error5;
procedure readline;
begin
integer i, j;
boolean skip, comm;
om:
bossline_no:=nextbossline;
nextbossline:=nextbossline+10;
skip:=comm:=false;
for i:=1 step 1 until 200 do
begin
linelength:=i;
readchar(zin, j);
if j>=64 and j<96 then j:=j+32;
line(i):=j;
if j=25 <* em *> then
begin
if i=1 then
begin
if -,opennextsource(zin, sourceno) then
goto if pass=1 then end_pass1 else fin;
goto om;
end else
repeatchar(zin);
end;
if j=12 <* ff *> then
begin
nextbossline:=(nextbossline+990)//1000*1000+10;
i:=i-1;
end else
if comm then else
if j=33 <* ! *> or j=42 <* * *> then
begin
skip:=-,skip;
i:=i-1;
end else
if skip then i:=i-1 else
if j=59 <* ; *> then comm:=true;
if j=10 or j=25 <* em *> then goto ud;
end for i;
while j<>10 and j<>25 do
begin
readchar(zin, j);
if j=12 then nextbossline:=(nextbossline+990)/1000*1000+10;
end;
if j=25 then repeatchar(zin);
linelength:=linelength-10;
error1(<:line too long:>, 1);
ud:
if skip and line_length<=1 then goto om;
line(line_length):=10;
end read line;
procedure laes_snask;
begin
integer i, j, k;
if ext(p, 0)=long <:.:> then
begin comment directive or slice register definition;
advance(1);
if ext(p, 0)=long <:mapk:> then
begin <* . mapk = expression *>
advance(1);
j:=read_expr;
if j=-1 then error1(<:expression missing:>, 1);
if j>=0 then map_k := j extract 10;
format1(12);
end else
if ext(p, 0)=long <:addr:> then
begin <* . addr expression
. addr expression , repetition *>
advance(1);
j:=read_expr;
if j=-1 then error1(<:expression missing:>, 1);
reps:=1;
if f(comma) then
begin
advance(1);
reps:=read_expr;
if reps=-1 then error1(<:expression missing:>, 1);
end;
instr:=map_k;
if pass=2 and reps>-1 and j>-1 then
begin
for i:=reps step -1 until 1 do
begin
if map_table(map_k)>=0 then error3(0, <:instruction redefined:>);
map_table(map_k):=j;
map_k := (map_k + 1) extract 10;
end;
end;
if reps<0 then reps:=0;
format1(13);
end else
if ext(p, 0)=long <:instr:> add 117 and ext(p, 1)=long <:ction:> then
begin comment .instruction ;
advance(1);
instr:=j:=read_expr;
if f(comma) then advance(1);
i:=read_expr;
if f(comma) then advance(1);
k:=read_expr;
if pass=2 and j>=-1 and i>=-1 and k>=-1 then
begin
if j>255 then error1(<:instruction expression too high:>, 1);
if j=-1 then j:=1024; <* default instruction *>
if map_table(j)>=0 then
error3(0, <:instruction redefined:>);
map_table(j):=if i=-1 then kk else i;
map_table(if j=1024 then 1025 else j+256) :=
if k=-1 then kk else k;
end;
format1(5);
end else
if ext(p, 0)=long<:k:> and ext(p+1, 0)=long<:=:> then
begin comment . k = expression ;
advance(2);
j:=read_expr;
if j=-1 then error1(<:expression missing:>, 1);
if j=-2 then error3(0, <:undefined .k=expression:>)
else kk:=j;
format1(2);
end else
if ext(p, 0)=long<:loc:> then
begin comment .loc;
advance(1);
j:=read_expr;
if j>=-1 then
begin comment .loc;
if j=-1 then j:=0;
kk:=(kk+(-j-1) extract 2)//4*4 + j extract 2;
format1(1);
end else
error3(0, <:undefined .loc expression:>);
end else
if ext(p, 0)=long <:list:> then
begin comment .list on/off;
advance(1);
if ext(p, 0)=long <:on:> then listing:=true else
if ext(p, 0)=long <:off:> then listing:=false else
error1(<:wrong list parameter<10>:>, 1);
advance(1);
format1(3);
end else
if ext(p, 0)=long<:print:> then
begin comment .print on/off;
advance(1);
if ext(p, 0)=long <:on:> then printing:=true else
if ext(p, 0)=long <:off:> then printing:=false else
error1(<:wrong print parameter<10>:>, 1);
advance(1);
format1(4);
end else
if f(name) and ext(p+1, 0)=long <:=:> then
begin comment . regname=;
i:=search1(p);
advance(2);
j:=read_expr;
if j>0 then j:=j extract 4;
if j=-1 then error1(<:expression missing:>, 1);
if pass=2 then
begin
if logand(undef, symb(i, 2))<>0 then
begin comment undef in pass2;
symb(i, 2):=name+r+sliceop+
(if j=-2 then 0 else j);
end else
if logand(data2, symb(i, 2))<>0 then
error3(0, <:constant redefined as a register:>) else
if j>=0 and j<>symb(i, 2) extract 11 then
error3(0, <:illegal redefinition:>);
end else
if logand(undef+r+data2, symb(i, 2))=0 then
begin
symb(i, 2):=if j>=0 then name+r+sliceop+j else name+undef;
end;
format1(6);
end else
if ext(p, 0)=long<:m:> then
begin comment .m;
format1(9);
end else
if ext(p, 0)=long<:p:> then
begin comment .p;
advance(1);
format1(10);
end else
error1(<:illegal directive:>, 1);
end directive or slice register definition else
if f(name) and (ext(p+1, 0)=long <:::> or ext(p+1, 0)=long <:=:>) then
begin comment constname=/:;
i:=search1(p);
advance(2);
j:=if ext(p-1, 0)=long <:::> then kk else
read_expr;
if j=-1 then error1(<:expression missing:>, 1);
if pass=2 then
begin
if logand(undef, symb(i, 2))<>0 then
begin comment undef in pass2;
symb(i, 2):=name+data2+sliceop+binary+(if j=-2 then 0 else j);
end else
if logand(r, symb(i, 2))<>0 then
error3(0, <:register redefined as a constant:>) else
if j>=0 and j<>symb(i, 2)extract 11 then
error3(0, <:illegal redefinition:>);
end else
if logand(undef+r+data2, symb(i, 2))=0 then
begin
symb(i, 2):= if j<0 then name + undef else
name+data2+sliceop+binary+j;
end;
format1(if ext(2, 0)=long<:::> then 11 else 7);
end constname=/: else
if f(line_end) then
begin
format1(8);
end;
end laes snask;
<* alu sources *>
aq:=0;
ab:=1;
oq:=2;
ob:=3;
oa:=4;
da:=5;
dq:=6;
d0:=7;
<* alu destinations *>
ar:=2;
fq:=0;
fn:=1;
bd:=4;
<* definitions of type bits *>
data1:=s1(1,0);
data2:=s1(1,1);
sliceop:=s1(1,2);
implc:=s1(1,3);
cdef:=s1(1,4);
radef:=s1(1,5);
bfdef:=s1(1,6);
name:=s1(1,7);
binary:=s1(1,8);
r:=s1(1,9);
q:=s1(1,10);
ass:=s1(1,11);
aluass:=s1(1,12);
carshift:=s1(1,13);
clr:=s1(1,14);
comma:=s1(1,15);
car:=s1(1,16);
cond:=s1(1,17);
op:=s1(1,18);
dofunc:=s1(1,19);
jump:=s1(1,20);
cond_allowed:=s1(1,21);
invert:=s1(1,22);
line_end:=s1(1,23);
vect:=s1(1,24);
map:=s1(1,25);
sign:=s1(1,26);
undef:=s1(1,27);
ir:=s1(1,28);
rc:=s1(1,29);
minus:=s1(1,30);
carry:=s1(1,31);
entr_no:=0;
max_symb:=1999;
for j:=0 step 1 until 3 do
for i:=max_symb step (-1) until 0 do
symb(i, j):=0;
i:=1;
word:=tab(i);
ext(1, 1):=0;
while word <> 0 do
begin
ext(1, 0):=word;
j:=search1(1);
bitword2:=bitword1:=0;
symb(j, 2):=tab(i + 1);
symb(j, 3):=logand(bitword1, -s1(1,7)) +
logand(bitword1, s1(1,7)-1) shift 1 +
bitword2 shift(-47);
i:=i + 2;
word:=tab(i);
end;
printing:=listing:=false;
errors:=warnings:=0;
fpnames:=13;
examine_params(true);
no_burn := if default1 then -1 else 0;
if -,opennextsource(zin, sourceno) then
begin
write(out, <:no input:>);
goto slut1;
end;
symb_name:=0;
page_no:=0;
line_no:=1000;
pass:=1;
kk:=0;
if disasskneh then
begin
for i:=0 step 1 until 1023+4 do map_table(i):=-1;
for i:=0 step 1 until 2047 do binmem(i, 0):=binmem(i, 1):=no_burn;
disassknehproc; comment jumps directly to slut when finished;
end;
next1:
p:=1;
readline;
find_items;
laes_snask;
kk:=kk+1;
goto next1;
end_pass1:
examine_params(true);
opennextsource(zin, sourceno);
for i:=0 step 1 until 1023+4 do map_table(i):=-1;
for i:=0 step 1 until 2047 do binmem(i, 0):=binmem(i, 1):=no_burn;
pass:=2;
kk:=0;
map_k:=0;
next:
bitword1:=bitword2:=0;
p:=1;
readline;
finditems;
laes_snask;
irdef:=rcdef:=expl_bdest:=expl_bsource:=bcdef:=expr_expected:=false;
op1:=op2:=alufunc:=areg:=breg:=0;
p:=1;
swopcount:=expr_pointer:=fbsource:=fslop1:=fslop2:=const_field_length:=
fsldest:=fbdest:=fcond:=fslop:=ra_def_length:=0;
om1:
if f(carry) and n(ass) then
begin comment carry:=bus;
expr_expected:=true;
if bcdef then error(<:double c:=:>);
bcdef:=true;
s(3, 28); s(1, 43);
advance(2);
goto om1;
end;
if f(ir) and n(ass) then
begin
if irdef then error(<:double ir:=:>);
irdef:=true;
expr_expected:=true;
s(1, 45);
advance(2);
goto om1;
end ir;
if f(rc) and n(ass) then
begin
if rcdef then error(<:double rc:=:>);
rcdef:=true;
expr_expected:=true;
s(1, 46);
advance(2);
goto om1;
end rc;
if f(data1 + undef) and n(ass) then
begin
if f(undef) then error(<:undefined:>);
expr_expected:=true;
setbusdest(a(p));
fbdest:=p;
advance(2);
goto om1;
end data1:=;
if f(data2+undef) and n(comma + line_end) then
begin
if f(undef) then error(<:undefined:>);
expr_expected:=false;
setbussource(a(p));
fbsource:=p;
advance(1);
goto read_alu_dest;
end;
if expr_expected then setbussource(data2+5); <* set alu output *>
if f(r + undef) and n(comma) and n(r + undef) and n(ass) then
begin <* r , r := *>
if f(undef) then error(<:undefined:>);
s(ar, 18);
breg:=a(p+2);
fbsource:=p;
areg:=a(p);
advance(2);
goto skip_aludest;
end;
read_alu_dest:
while f(comma) do advance(1);
if f(q) and n(ass) then
begin <* q := *>
s(fq, 18);
goto skip_aludest;
end;
if f(r + undef) and n(aluass) then
begin <* r :=/:=</:<</:=>/:>> *>
if f(undef) then error(<:undefined:>);
s(a(p+1)extract 3, 18); <* set aludest *>
breg:=a(p);
skip_aludest:
expr_expected:=true;
fsldest:=p;
advance(2);
end else
s(fn, 18); <* set aludest fn default *>
if f(carry) and n(car) then
begin
setbus(a(p+1), 0); <* set carry *>
s(1, 43); <* update carry *>
if logand(carshift, a(p+1)) <> 0 then
begin
if bitword1 shift(-47+17)extract 2<>2 + a(p+1)shift(-5)extract 2 then
error(<:illegal carry shifting:>);
end;
advance(2);
end;
if f(sliceop + undef) then
begin comment first operand;
if f(undef) then error(<:undefined:>);
fslop1:=p;
op1:=a(p);
advance(1);
end;
if f(op) then
begin
fslop:=p;
alufunc:=a(p);
s(alufunc extract 4, 22);
advance(1);
end;
if f(sliceop + undef) then
begin comment second operand;
if f(undef) then error(<:undefined:>);
fslop2:=p;
op2:=a(p);
advance(1);
end;
if alufunc=0 then
begin
if op2<>0 then error(<:+operand:>);
if logand(binary, op1)<>0 and op1 extract 11=0 or op1=0 then
begin comment expr=0;
alufunc:=op;
s(4, 21); <* set and *>
s(oa, 25);
goto expr_ok;
end;
if logand(data2, op1)<>0 and bitword1 shift(-47+34)extract 3=5 <* alu *> then
begin
expl_bsource:=false;
bitword1:=bitword1-s1(5, 34);
end;
alufunc:=op;
s(0, 21); <* set + *>
end;
if logand(binary, op1)<>0 and op1 extract 11=0 then op1:=0;
if logand(binary, op2)<>0 and op2 extract 11=0 then op2:=0;
if op2=0 then swopop;
if logand(data2, op2)<>0 then swopop else
if logand(q, op1)<>0 then swopop;
if op1=0 then
begin
if op2=0 then
begin
s(d0, 25);
setbussource(data2+binary+sliceop+0);
swopcount:=0;
goto expr_ok;
end;
if logand(q, op2)<>0 then
begin
s(oq, 25);
goto expr_ok;
end;
if areg=op2 or areg=0 then
begin
areg:=op2;
s(oa, 25);
goto expr_ok;
end else
if breg<>0 and breg<>op2 then
error(<:wrong a, b combination:>);
breg:=op2;
s(ob, 25);
goto expr_ok;
end op1=0;
if logand(data2, op1)<>0 then
begin
setbussource(op1);
if op2=0 then s(d0, 25) else
if logand(op2, q)<>0 then s(dq, 25) else
if logand(r, op2)<>0 then
begin
if areg<>0 and areg<>op2 then
error(<:data must not be combined with b:>);
s(da, 25);
areg:=op2;
end else error(<:data allowed only once:>);
goto expr_ok;
end;
if logand(q, op2)<>0 then
begin
if areg<>0 and areg<>op1 then
error(<:q must not be combined with b:>);
areg:=op1;
s(aq, 25);
goto expr_ok;
end;
if logand(q, op1)<>0 then error(<:q allowed only once:>);
comment a op b;
if logand(clr, alufunc)<>0 and swopcount=0 then swopop;
s(ab, 25);
if areg<>0 and areg<>op1 then swopop else
if breg<>0 and breg<>op2 then swopop;
if areg=0 then areg:=op1 else
if areg<>op1 then error(<:a, b conflicts:>);
if breg=0 then breg:=op2 else
if breg<>op2 then error(<:a, b conflicts:>);
goto expr_ok;
expr_ok:
if areg<>0 then s(areg extract 4, 11);
if breg<>0 then s(breg extract 4, 15);
if swopcount=1 then
begin
if logand(minus, alufunc)<>0 then bitword1:=bitword1 - s1(1, 21);
<* modify sub and sb1 to bus and bs1 *>
end else
if logand(clr, alufunc)<>0 then error(<:clr not commuting:>);
if -,expl_bsource then setbussource(data2 + 5); <* alu is default *>
while f(comma) do advance(1);
comment test do;
while f(dofunc) do advance(1);
while f(comma) do advance(1);
comment jump and cond;
if f(jump) then
begin
if f(vect+map) then
begin
advance(1);
if f(invert) then advance(1);
if -, f(binary) then error(<:missing constant after vect or map:>);
fcond:=p;
i:=a(p)extract 11;
advance(1);
if i>15 then error(<:constant too big after vect or map:>);
s(i, 7); <* set condition field *>
if constfield_length<>0 then
error3(0, <:the constant field is disabled by map and vect:>);
goto ud;
end;
advance(1);
if f(invert) and logand(a(p-1), cond_allowed)<>0 and n(cond) then
begin
advance(1);
end not;
if f(cond) then
begin
fcond:=p;
advance(1);
end;
end jump else
s(14, 3); <* set default continue *>
ud:
while f(comma) do advance(1);
expr_pointer:=p;
i:=read_expr;
if -,f(line_end) then error(<:syntax:>);
if i>=0 then
begin
if bitword1 shift(-47+3)extract 4=6 then
begin comment vect;
if i extract 2<>0 then
begin
error4(<:address not divisible by 4:>);
i:=i shift(-2)shift 2;
end;
i:=i+bitword2 shift(-47+11)extract 2;
end vect;
setconst(11, i);
end;
if bitword2 shift(-47+0)extract 1=1 <* read *> and
bitword1 shift(-47+37)extract 3<>bd <* bd:= *> then
error3(0, <:read requires bd:= :>);
if bitword1 shift(-47+40)extract 1=1 <* wait *> and
bitword1 shift(-47+37)extract 3<>bd <* bd:= *> and
bitword1 shift(-47+34)extract 3<>bd <* :=bd *> then
error3(0, <:wait requires bd:>);
if bitword2 shift(-47+0)extract 1=1 <* read *> and
(bitword1 shift(-47+3)extract 4=2 <* map *> or
bitword1 shift(-47+3)extract 4=6 <*vect *> or
bitword1 shift(-47+46)extract 1=1 <* rc:= *> ) then
error3(0, <:read is disabled by map, vect, or rc:=:>);
if bitword1 shift(-47+46)extract 1=1 <* rc:= *> and
(bitword1 shift(-47+34)extract 3=3 <* const *> or
const_field_length<>0 ) then
error3(0, <:the constant and the address field is disabled by rc:=:>);
if -,fastregs then
begin
if bitword2 shift(-47+0)extract 1=1 <* read *> and
bitword1 shift(-47+40)extract 1=1 <* wait *> then
error3(0, <:read and wait may not coexist:>);
i:=0;
if bitword1 shift(-47+37)extract 3=2 then i:=i+1;
if bitword1 shift(-47+34)extract 3=2 then i:=i+1;
if bitword1 shift(-47+40)extract 1=1 then i:=i+1;
if i>0 then s(1,40); <* set w in case rd *>
if i>1 then error3(0, <:rd, wait trouble:>);
end;
bitword1:=logor(bitword1, s1(1,26) + s1(1, 39) + s1(127, 47)) -
logand(bitword1, s1(1, 26) + s1(1, 39) + s1(127, 47));
bitword2:= ( logor(bitword2, s1(1, 0))shift(-1) -
logand(bitword2, s1(1, 0))shift(-1) ) shift 1;
if disassemble then disass;
if listing then format;
outword(bitword1, bitword2);
goto next;
fin:
<* replace unassigned entries by default ones *>
for i:=1024 step 1 until 1024+3 do
if map_table(i)<0 then map_table(i):=0;
for i:=0 step 1 until 1023 do
if map_table(i)<0 then map_table(i):=map_table(i//256+1024);
if jump_table then
begin
head_name(1):=long<:jump:>;
head_name(2):=long<:table:>;
line_no:=1000;
kk:=2048-256;
for i:=0 step 1 until 255 do
begin
j:=map_table(i);
if j<0 then j:=map_table(1024);
j:=j extract 11;
outword(s1(3, 3) + s1(fn, 18) + s1(4, 21) + s1(oa, 25) + s1(5,34) +
s1(1, 39) + s1(127, 47), s1(1, 0) + s1(j, 11));
end;
end jump_table;
if genoutput then
begin comment generate prom tapes;
opennextsource(bin, 0);
for i:=3 step 4 until 59 do
begin
write(bin, false, 100, false add 255, 1);
for j:=0 step 1 until 2047 do
write(bin, false add(
binmem(j, i//48)shift(-47+i mod 48)extract 4 +64), 1);
end;
write(bin, false, 100, <:<25>:>);
end genoutput;
fpfile(1):=long<:map:>;
fpfile(2):=long<::>;
if opennextsource(bin, -1)then
begin comment map.<mapfilename>;
for i:=0 step 1 until 3 do
begin
write(bin, false, 100, false add 255, 1);
for j:=0 step 1 until 511 do write(bin, false add(
map_table(j + i extract 1 * 512)shift(-i //2*8)
extract 8), 1);
end;
write(bin, false, 100);
end map;
prbslut:
if printbin then
begin
boolean skipping;
head_name(1):=long<:print:>;
head_name(2):=long<:bin:>;
line_no:=1000;
skipping:=true;
for kk:=0 step 1 until 2047 do
begin
for j:=0 step 1 until 1 do
if binmem(kk, j)<>no_burn then goto ud;
if skipping then goto om;
skipping:=true;
prep_line1(1);
write(out, <:!<10>:>);
goto om;
ud:
skipping:=false;
prep_line1(1);
write(out, <:! :>, string trihex(kk));
j:=-1;
bitword1:=binmem(kk, 0);
bitword1:=bitword1 - bitword1 extract 16 +
bitword1 extract 14 shift 2 +
bitword1 shift(-14) extract 2;
for i:=3, 7, 11, 15, 18, 21, 22, 25, 26, 28, 31, 34, 37,
38 step 1 until 48 do
begin
k:=if i=48 then binmem(kk, 1) shift(-47+0) else
bitword1 shift(-47+i) extract(i-j);
j:=i;
write(out, <: :>, false add (if k>9 then k+97-10 else k+48),
1);
end for i;
write(out, <: :>,
string trihex( binmem(kk, 1) shift(-47+11) extract 11),
false add 32, 8);
for j:=15 step 16 until 47 do
write(out, <: :>, string outhex(binmem(kk, 0)
shift(-47+j) extract 16 + 1 shift 16)shift 8);
write(out, <: :>,
string trihex(binmem(kk, 1) shift (-47+11) extract 12), <:<10>:>);
om:
end for kk;
head_name(2):=long<:map:>;
for kk:=0 step 1 until 1023 do
begin
if kk mod 16=0 then
begin
if kk mod 512=0 then line_no:=1000;
prep_line2(1);
write(out, <:! :>, string trihex(kk), <: :>);
end;
if kk mod 4=0 then write(out,<:_:>);
write(out, <: :>, string outhex(map_table(kk) + 1 shift 16)
shift 8);
if kk mod 16=15 then write(out, <:<10>:>);
end for kk;
end printbin;
lineno:=1000;
headname(1):=headname(2):=long<::>;
error5(errors, <:errors:>);
error5(warnings, <:warnings:>);
error5(blocksread, <:blocksread:>);
slut:
close(bin, true);
slut1:
trap_mode:=1 shift 10;
end;
(source=set 1
bin=set 1
source=edit
scope login source
bin=rc35mass disassemble.yes list.yes source bossline.yes,
printbin.yes
finis)
i@
.c4=0b
.reg=0c
.w4=4
.cx=0a
.w0=0
.pu=0e
ra:=reg+c4
.instruction , 2, 3
.k=100
.instruction 5, 6, 7
w4:=cx--
.instruction 8
w0:=77,
bus:=77
cjp 77
rd:=w0:=77
w0:=w0,cjp 77
q:=w0 xor pu
@,f
;;the preceding line contained a form_feed
.instruction 0a
w1:=ccc
.loc
w1:=<0
.loc 0a1
.instruction 0b
fff=ggg+2
ggg:
.instruction 0a
jmp fff
;;dobbelt kommentar
jmp ggg
;;dobbelt kommentar med 7spacer foran
.m message
.m message med 7 spacer
ddd:
w1:=ddd
@,f
ccc=2a
w1:=0
.loc
ddd:
eee:
jmp ddd
jmp eee
.w0=02
.w1=01
fff=ggg+1
ggg:
jmp ggg
jmp fff
kkk=w0+1
rd1,vect 0,14
rd1,vect 0,15
rd1,jmp 14
rd1,jmp 15
w1:<<0
w1:=0
w1:=<c=0
w1:=<c<0
w1:<<0
w1:<<c<0
w1:>>0
w1:=>0
jmp constant
,,,;empty instruction
ra:=0a,,,;data:=const
w0:=w0+w1,,,;r:=r+r
ra:=w1:=w0+w1,,,;data:=r:=r+r
ra:=w0+w1,,,;data:=r+r
w0:=w1+w0,,,;r:=r+r
ra:= 0ab,,,;
ra:= 0ab,,,;
ra:= w0,,,;
ra:=rd/w0:=w0 and w1,,,;
w0:=0a,,,;
w0:=0a+0,,,;
c:=ra:=w0:=w0--w1, h wait, jmp not b0, addr;
ra:=w0/w1:=c:w0+w1,,,;
w1:=< c< w1,,,;
;test bus syntax
c:=w0,,,;
c:=w0,,,
ba:=w0,,,
c:=ba:=w0,,,
c:=ba:=bd,,,
;dette er en kommentar
bd,,,
ba:=w0/w1:=w1+w0,,,
ba:=ccr,,,
bd:=ccr,,,
ba:=0a,,,
ba:=const,,,0ab
ba:=0ab/w0:=w0+0ab,,,
0ab,,,
bus:=0ab,,,
w0:=w0+w1,,,
bus:=w0:=w0+w1,,,
w0/w1:=w0+w1,,,
bus:=w0/w1:=w0+w1,,,
;test kombinationer med c
w0:=c:w1,,,
w0:=w1,,,
c:=w0:=w1,,,
q:=c:w1,,,
q:=w1,,,
c:=q:=w1,,,
c:w1,,,
w1,,,
c:=w1,,,
w0:=<c:w1,,,
w0:=<c<w1,,,
w0:=w1,,,
c:=w0:=<w1,,,
w0:<<c:w1,,,
w0:<<c<w1,,,
w0:<<w1,,,
c:=w0:<<w1,,,
w0:=>c:w1,,,
w0:=>c>w1,,,
w0:=>w1,,,
c:=w0:=>w1,,,
w0:>>c:w1,,,
w0:>>c>w1,,,
w0:>>w1,,,
c:=w0:>>w1,,,
;test alu functions
w0+w1,,,
w0++w1,,,
w0-w1,,,
w0--w1,,,
w0 and w1,,,
w0 ior w1,,,
w0 clr w1,,,
w0 xor w1,,,
w0 equ w1,,,
;test data til alu
w1:=0a+w0,,,
w1:=0a+q,,,
w1:=0a+0,,,
w1:=ccr+w0,,,
w1:=ccr+q,,,
w1:=ccr+0,,,
w1:=bd+w0,,,
w1:=bd+q,,,
w1:=bd+0,,,
;test alu dest and source
;aq
w0/w1:=w0-q,,,
w0/w1:=q-w0,,,
w1:=w0-q,,,
w1:=q-w0,,,
w0-q,,,
q-w0,,,
;ab
w0/w1:=w0-w1,,,
w0/w1:=w1-w0,,,
w1:=w0-w1,,,
w1:=w1-w0,,,
w0-w1,,,
;oq
w0/w1:=0-q,,,
w0/w1:=q-0,,,
w1:=0-q,,,
w1:=q-0,,,
0-q,,,
q-0,,,
;ob
w0/w1:=0-w1,,,
w0/w1:=w1-0,,,
w1:=0-w1,,,
w1:=w1-0,,,
0-w1,,,
w1-0,,,
;oa
w0/w1:=0-w0,,,
w0/w1:=w0-0,,,
w1:=0-w0,,,
w1:=w0-0,,,
;do
w0/w1:=0-0a,,,
w0/w1:=0a-0,,,
w0/w1:=0-0a,,,
w1:=0a-0,,,
w1:=0-0a,,,
0a-0,,,
0-0a,,,
;da
w0/w1:=0a-w0,,,
w0/w1:=w0-0a,,,
w1:=0a-w0,,,
w1:=w0-0a,,,
0a-w0,,,
w0-0a,,,
;dq
w0/w1:=0a-q,,,
w0/w1:=q-0a,,,
w1:=0a-q,,,
w1:=q-0a,,,
0a-q,,,
q-0a,,,
ccr-q,,,
bd-q,,,
;special alu functions
w1:=0,,,
w1:=w0,,,
w1:=q,,,
w1:=0a,,,
w1:=0-0,,,
w1:=-0,,,
w1:=-w0,,,
w1:=-q,,,
w1:=-0a,,,
+0,,,
++0,,,
--0,,,
.print off
@,f
«eof»