|
|
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: 59136 (0xe700)
Types: TextFile
Names: »ass32tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »ass32tx «
\f
m. slang text 2
m.rc 1977.09.27
; input procedures
; procedure next delim;
; comment: scans the input up to the next delimiter and determines
; the operand situation. the meaning of the operand situation is:
; 0: no operand
; 1: unknown operand
; 2: real
; 3: textstring
; 4: integer
; 5: absolute identifier
; 6: relative identifier
; 7: load address
; call: exit:
; w0 opsit
; w1 delim value
; w2 delim type
; w3 return destroyed;
b.b3,a20
w.e7: rs.w3 b0. ; begin
ld w3 -65 ; save(w3);
ds.w3 g8. ; operand:= opsit:= 0;
al w3 10
rs.w3 g30. ; radix:= 10;
rl.w3 g18.
sn w3 6 ; if prog state=6 then
jl. a12. ; goto init real;
al w3 1
rs.w3 g11. ; delim state:= 1;
a0: ; cont scan:
; procedure next char;
; comment: reads the next compound character and determines the
; type. the meaning of the type values are:
; 0: letter a b .... ø a b .... ø
; 1: digit 0 1 2 3 4 5 6 7 8 9
; 2: point .
; 3: sign - +
; 4: special , / = : ( <33> <38> <42> <63>
; 5: less gr < >
; 6: end line ; nl
; 7: blank bl )
; 8: syllable aa .... øø a. .... ø. w0 .... x9 (: :)
; 9: digit point 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
; 10: text term <: :>
; 11: exponent <39>
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 char
; w3 char type
; symbol if compound then second char else undefined
; ahead if compound then 0 else second char;
b.b1,a4 ; begin
w.e6: al w0 0 ; char state:= 0;
rl.w3 g2. ; symbol:= ahead;
al w2 0 ; ahead:= 0;
rx.w2 g4. ; if symbol=0 then
sn w2 0 ; read:
a0: jl.w1 e5. ; next symbol;
a1: sn w0 0 ; save:
ds.w3 g0. ; if char state=0 then
; save(char,char type);
sn.w3 8 ; if chartype<>blind then
jl. a4. ; begin
al w1 x2 ; compute sum and doublesum:
wa.w1(g78.) ; sum := sum + char;
rs.w1(g78.) ;
wa.w1(g79.) ; doublesum := doublesum + sum;
rs.w1(g79.) ;
a4: ; end;
bz.w1 x3+d1. ; index:= entry(symbol type)
wa w1 0 ; +char state;
bl.w1 x1+d1. ; char action:= char matrix(index);
b1: jl. x1+0 ; goto case char action of (
f3=a0-b1 ; 0: digit again,
; 1: letter again,
; 2: again,
; 3: read,
; 4: colon read,
; 5: colon,
; 6: not compound,
; 7: register,
; 8: compound,
; 9: colon blank,
; 10: less gr,
; 11: left par,
; 12: comment,
; 13: substitute,
; 14: end medium,
; 15: colon less gr,
; 16: less colon,
; 17: digit point,
; 18: exit,
; 19: blank,
; 20: end line);
f0=-b1. ; digit again:
am 1 ; char state:= 2;
; goto again;
f1=-b1. ; letter again:
al w0 1 ; char state:= 1;
f2=-b1. ; again:
al.w1 a0.+2 ; if intext then
g44: jl. e5. ; goto exit;
; am 0
jl. e8. ; goto read;
j15: jl. e5-g44
f4=-b1. ; colon read:
al w0 5 ; char state:= 5;
jl. a0. ; goto read;
f5=-b1. ; colon:
al w1 4 ; char type:= special;
rs.w1 g0.
f6=-b1. ; not compound:
rs.w2 g4. ; ahead:= symbol;
rs.w3 g2. ; save(symbol type);
dl.w3 g0. ; goto exit;
jl. e8.
f7=-b1. ; register:
rl.w1 g1. ; if char<>w and char<>w
al w1 x1-87 ; and char<>x and char<>x then
sz w1 -34 ; goto not compound;
jl. f6+b1.
f8=-b1. ; compound:
ds.w3 g2. ; symbol type:= char type;
al w3 8 ; char type:= syllable;
jl. a2. ; goto exit;
f9=-b1. ; colon blank:
bl.w1 g44.+1 ; if intext then
sn w1 0 ; goto colon;
jl. f5+b1. ; if symbol=right par then
sn w2 41 ; goto compound;
jl. f8+b1. ; goto read;
jl. a0.
f10=-b1. ; less gr:
sn w2 62 ; if char=greater then
jl. e8. ; goto exit;
al w0 3 ; char state:= 3;
jl. f2+b1. ; goto again;
f11=-b1. ; left par:
al w3 4 ; char type:= special;
rs.w3 g0. ; char state:= 4;
al w0 4 ; goto again;
jl. f2+b1.
f12=-b1. ; comment:
j26: bl.w1 g44.+1 ; if intext then
sn w1 0 ; char type:= new line;
al w3 14
sl w3 12 ; while char type<12 do
jl. 6 ; next symbol;
al.w1 -4
jl. e5.
se w3 14 ; if char type=new line then
jl. 6 ; begin
f20=-b1. ; end line:
al w3 6 ; char type:= end line;
jl. e8. ; goto exit
; end;
sn w3 13 ; if char type=end medium then
jl. a3. ; goto end medium;
f13=-b1. ; illegal:
rs.w0 b0. ; save(w0);
; if list then
jl.w3 e20. ; writeaddrstar
; else writeaddr;
al.w0 c31.
jl.w3 e11. ; writetext(<:illegal:>);
jl.w3 e3. ; writechar(bl);
al w0 x2+0
jl.w3 e10. ; writeinteger(char);
jl.w3 e4. ; writechar(nl);
rl.w0 b0. ; restore(w0);
jl. a0. ; goto read;
b0: 0; saved w0
f14=-b1. ; end medium:
a3: rl.w2 c2.
al.w3 a0. ; if procedure source then
am. (g52.) ; unstack current chain
sn w2(+h20+h2+6); and goto read;
jl. e62. ;
al w3 0
sn.w3(g55.) ; if -,normal then
rs.w2(g34.) ; word(source):= 2<12+2;
jl.w3 e16. ; select next source(save);
jl. a1. ; goto read;
jl. a0.
f19=-b1. ; blank:
bl.w1 g44.+1 ; if intext then
sn w1 0 ; goto exit;
jl. e8. ; while symbol type=blank do
se w3 7 ; next symbol;
jl. a1. ; goto save;
al.w1 -4
jl. e5.
f15=-b1. ; colon less gr:
sn w2 60 ; if char=less then
jl. f5+b1. ; goto colon;
f16=-b1. ; less colon:
am 1 ; char type:= text term;
; goto exit;
f17=-b1. ; digit point:
al w3 9 ; char type:= digit point;
a2: rl.w2 g1.
f18=-b1. ; exit:
c.i0i.z. ; end next char;
e.e8:
a1: bz.w1 x3+d2. ; exam char:
wa.w1 g11. ; index:= delim matrix entry(char type)
bz.w0 x1+d2. ; +delim state;
al w1 63 ; element:= delim matrix(index);
la w1 0 ; delim state:= element(0:5);
ls w0 -6 ; delim action:= element(6:11);
rs.w0 g11.
bl.w1 x1+4
b3: jl. x1+0 ; goto case delim action of (
h. a0-b3 ; 0: cont scan,
f21 ; 1: init radix,
f22 ; 2: init dec,
f23 ; 3: conv radix,
f24 ; 4: init id,
f25 ; 5: rel id,
f26 ; 6: pair,
f27 ; 7: single,
f28 ; 8: after point,
f29 ; 9: before point,
f30 ; 10: set real,
f31 ; 11: sign,
f32 ; 12: exponent,
f33 ; 13: after exp,
f34 ; 14: init text,
f35 ; 15: init num,
f36 ; 16: end num,
f37 ; 17: text char,
f38 ; 18: end text,
f39 ; 19: unknown,
f40 ; 20: text unknown,
f41 ; 21: end line,
f42 ; 22: slang fault);
w.f21=-b3. ; init radix:
al w1 8 ; if opsit=8 then
rx.w1 g8. ; goto unknown;
sn w1 8 ; opsit:= 8;
jl. a17.
rl.w1 g7.
wm.w1 g30. ; radix:= radix*operand;
am x2-48
al w1 x1+0
rs.w1 g30. ; radix:= radix-48+char;
al w0 0
rs.w0 g45. ; after digit:= false;
rs.w0 g7. ; operand:= 0;;
jl. a0. ; goto cont scan;
f22=-b3. ; init dec:
al w0 4
rs.w0 g8. ; opsit:= 4;
f23=-b3. ; conv radix:
rl.w1 g7.
wm.w1 g30. ; operand:= radix*operand;
am x2-48
al w1 x1+0
rs.w1 g7. ; operand:= operand-48+char;
al w1 -1
rs.w1 g45. ; after digit:= true;
jl. a0. ; goto cont scan;
f24=-b3. ; init id:
la.w2 c12. ; id letter:= char mod 32;
rs.w2 g5.
sl w2 23 ; if id letter>=23 then
jl. a17. ; goto unknown;
se w2 11 ; if id letter=11 then
jl. a2. ; begin
al w0 3 ; delim state:= 3;
rs.w0 g11. ; opsit:= 7
am 2 ; end
a2: al w0 5 ; else
rs.w0 g8. ; opsit:= 5;
jl. a0. ; goto cont scan;
f25=-b3. ; rel id:
al w0 6
rs.w0 g8. ; opsit:= 6;
jl. f23+b3. ; goto conv radix;
f26=-b3. ; pair:
rl.w1 g3. ; symbol:= symbol
sl w1 96 ; -(if symbol>=96 then 64
am -32 ; else 32);
am x1-32 ; goto init search;
f27=-b3. ; single:
al w1 0 ; symbol:= 0;
; init search:
sl w2 96 ; char:= char
am -32 ; -(if char>=96 then 64
al w2 x2-32 ; else 32);
ls w2 6 ; syllable:= (char shift 6)+symbol;
wa w1 4
rs.w1 d4. ; syllable list(last):= syllable;
ls w2 -6
wa w2 2 ; index:= (syllable+char)
la.w2 c10. ; mod 16;
bz.w2 x2+d3. ; index:= syllable list entry(index);
a3: bz.w0 x2+1+d3. ; again:
sn w0 x1+0 ; if syllable list(index+1)=syllable then
jl. a4. ; goto found;
al w2 x2+2 ; index:= index+2;
jl. a3. ; goto again;
a4: se w2 d4-d3 ; found:
jl. a5. ; if index=last then
rl.w1 g0. ; begin
se w1 0 ; if char type<>letter then
jl. a16. ; goto not found;
rs.w1 g2. ; symbol type:= letter;
rs.w1 g11. ; delim state:= 0;
rl.w1 g3.
rs.w1 g4. ; ahead:= symbol;
ls w0 -6
se w0 43 ; if char=<k> then
jl. 8 ; begin
al w1 3 ; delim state:= 3;
rs.w1 g11. ; opsit:= 7;
am 6 ; goto cont scan
al w1 1 ; end;
rs.w1 g8. ; opsit:= 1;
jl. a0. ; goto cont scan
; end;
a5: bz.w1 x2+d3. ; syllable:= syllable list(index);
a6: al w2 63 ; unpack:
la w2 2 ; delim value:= syllable(0:5);
ls w1 -6 ; delim type:= syllable(6:11);
ds.w2 g13.
rl.w0 g8. ; test opsit:
sn w0 2 ; if opsit=2 then
jl. a20. ; goto conv real;
se w0 8 ; if opsit<>8 then
jl. (b0.) ; goto exit;
al w0 4 ; opsit:= 4;
rl.w3 g45.
sn w3 0 ; if -,after digit then
al w0 1 ; opsit:= 1;
rs.w0 g8.
jl. (b0.) ; goto exit;
a20: rl.w3 g45. ; conv real:
se w3 0 ; if -,after digit then
jl. a7. ; begin
al w0 1 ; opsit:= 1;
rs.w0 g8. ; goto exit
jl. (b0.) ; end;
a7: al w3 0
sn.w3(g60.) ; if real=0 then
se.w3(g50.) ; begin
jl. a8. ; real(24:47):= 2048;
rl.w3 c14. ; goto exit
rs.w3 g50. ; end;
jl. (b0.)
w.c1: c0 ; reference
g52: -1 ; fp base
a8: rl.w1 g47. ; if -,after exp then
sn.w3(g49.) ; frac sign:= sign;
rs.w1 g48.
wm.w1 g7. ; exponent:= sign*operand
ws.w1 g9. ; -point loc;
rs.w1 g47. ; save(exponent);
al w0 1
ci w0 0 ; factor:= 1.0;
a10: sn w1 0 ; while exponent<>0 do
jl. a11. ; begin
sh w1 0 ; if exponent<=0 then
am 2 ; exponent:= exponent+1
al w1 x1-1 ; else exponent:= exponent-1;
fm.w0 c11. ; factor:= factor*10
jl. a10. ; end;
a11: ds.w0 b2.
rl.w1 g60.
ci w1 24 ; real:=
bz.w3 g50. ; floating(real(0:23))
ci w3 12
fa w1 6 ; +floating(real(24:35))
bz.w3 g61.
ci w3 0 ; +floating(real(36:47));
fa w1 6
rl.w2 g47.
sl w2 0 ; if saved exponent<0 then
jl. 6 ; real:= real/factor
fd.w1 b2. ; else real:= real*factor;
jl. 4
fm.w1 b2.
rl.w3 g48.
ci w3 0
fm w1 6 ; real:= real*frac sign;
ds.w1 g50.
al w0 2 ; opsit:= 2;
dl.w2 g13.
jl. (b0.) ; goto exit;
a12: al w0 8 ; init real:
rs.w0 g11. ; delim state:= 8;
ld w1 -65 ; after digit:= false;
ds.w1 g49. ; after exp:= false;
rs.w0 g9. ; point loc:= 0;
ds.w1 g50. ; real:= 0;
al w1 1
rs.w1 g47. ; sign:= 1;
jl. a0. ; goto cont scan;
f28=-b3. ; after point:
al w0 1
wa.w0 g9.
rs.w0 g9. ; point loc:= point loc+1;
f29=-b3. ; before point:
al w0 -1
rs.w0 g45. ; after digit:= true;
al w2 x2-48
dl.w0 g50.
ad w0 2
aa.w0 g50.
ad w0 1
wa w0 4
sx 2.01
al w3 x3+1
ds.w0 g50. ; real:= real*10+char-48;
f31=-b3. ; sign:
al w1 -1
sn w2 45 ; if char=minus then
rs.w1 g47. ; sign:= -1;
f30=-b3. ; set real:
al w0 2
rs.w0 g8. ; opsit:= 2;
jl. a0. ; goto cont scan;
f32=-b3. ; exponent:
al w1 1
rx.w1 g47. ; frac sign:= sign;
rs.w1 g48. ; sign:= 1;
al w0 0
al w1 1
sn.w0(g45.) ; if -,after digit then real:= 1;
ds.w1 g50. ; after digit:= false;
ds.w1 g49. ; after exp:= true;
jl. f30+b3. ; goto set real;
f33=-b3. ; after exp:
al w0 -1
rs.w0 g45. ; after digit:= true;
jl. f23+b3. ; goto conv radix;
f34=-b3. ; init text:
rl.w0 g1.
sn w0 58 ; if char=colon then
jl. a17. ; goto unknown;
al w0 1
la.w0 g23.
wa.w0 g23.
rs.w0 g15. ; text addr:= prog top+prog top(23);
rl.w0 c9.
rs.w0 g44. ; intext:= true;
a13: al w0 0 ; clear text buffer:
rs.w0 g14. ; text buffer:= 0;
al w0 16
rs.w0 g29. ; text count:= 16;
jl. a0. ; goto cont scan;
f35=-b3. ; init num:
sn w2 62 ; if char=greater then
jl. a14. ; goto text char;
al w0 7
rs.w0 g11. ; delim state:= 7;
al w0 0
rs.w0 g7. ; operand:= 0;
jl. a0. ; goto cont scan;
f36=-b3. ; end num:
sn w2 60 ; if char=less then
jl. a18. ; goto text unknown;
al w2 255
la.w2 g7. ; char:= operand mod 256;
f37=-b3. ; text char:
a14: rl.w1 g29.
ls w2 x1+0 ; word:= char shift text count;
wa.w2 g14. ; word:= word+text buffer;
sh w1 0 ; if text count>0 then
jl. 10 ; begin
al w1 x1-8 ; text count:= text count-8;
rs.w1 g29. ; text buffer:= word;
rs.w2 g14. ; goto cont scan
jl. a0. ; end;
rs.w2(g15.) ; word(text addr):= text buffer;
al w1 2
wa.w1 g15.
rs.w1 g15. ; text addr:= text addr+2;
jl. a13. ; goto clear text buffer;
f38=-b3. ; end text:
al w0 3
rs.w0 g8. ; opsit:= 3;
rl.w0 j15.
rs.w0 g44. ; intext:= false;
rl.w1 g15.
rl.w0 g29.
sl w0 16 ; if text count<16 then
jl. a15. ; begin
rl.w0 g14. ; word(text addr):= text buffer;
rs w0 x1+0
al w1 x1+2 ; text addr:= text addr+2
; end;
a15: rs.w1 g7. ; operand:= text addr;
jl. a0. ; goto cont scan;
a16: rl.w0 j10. ; not found:
rx.w0 e8. ; next char;
rs.w0 j10.
jl. e6.
j10: jl. 2-e8.
rl.w0 j10.
rx.w0 e8.
rs.w0 j10.
f39=-b3. ; unknown:
a17: al w0 1
rs.w0 g8. ; opsit:= 1;
al w0 0
rs.w0 g11. ; delim state:= 0;
jl. a1. ; goto exam char;
f40=-b3. ; text unknown:
a18: al w0 1
rs.w0 g8. ; opsit:= 1;
rl.w0 j15.
rs.w0 g44. ; intext:= false;
al w0 0
rs.w0 g11. ; delim state:= 0;
jl. j26. ; goto comment in next char;
f41=-b3. ; end line:
al w1 17<6+0 ; syllable:= new line;
jl. a6. ; goto unpack;
f42=-b3. ; slang fault:
jl. e51. ; slang fault term;
b0: 0; saved w3 ; exit: end next delim;
b1: 0; working location
b2: 0; working location
c.i0i.z.
e.
c.i0i.z. ; end f names for next char and next delim
e.
; write procedures
b.b7
w.b0: 0 ; working locations
b1: 0 ; for write procedures
b2: 0
b3: 0
b4: 0
b5: 0
b6: 0
; procedure writechar(value);
; comment: prints the character on current output.
; call: exit: store:
; w0 value
; w1 b0
; w2 b1
; w3 return destroyed b2;
w.e19: am 42-10 ; writechar(*)-entry
e4: am 10-32 ; writechar(nl)-entry
e3: al w0 32 ; writechar(bl)-entry
e9: rs.w1 b0. ; begin
ds.w3 b2. ; save(w1);
rl w2 0 ; save(w2,w3);
rl.w3 g52.
c.-1 ; if wanted then the online facility may be retrieved...
se w2 0 ; if value=0
sn w2 10 ; or value=10 then
am h33-h26 ; outend(value)
z.
jl w3 x3+h26-2 ; else outchar(value);
dl.w2 b1. ; restore(w1,w2)
jl. (b2.) ; end writechar;
; procedure writeinteger1(value);
; comment: prints the value including sign on current output.
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 value
; w3 return destroyed;
w. al w0 x2+0
w.e17: al w3 x3+1 ; return:= return+1;
; procedure writeinteger(value);
; comment: prints the value without sign on current output.
; call: exit: store:
; w0 value b0
; w1 b1
; w2
; w3 return destroyed b2;
b.a0
w.e10: ds.w1 b1. ; begin
rs.w3 b2. ; save(w0,w1);
rl.w0 a0. ; save(w3);
ls w0 1
ld w0 -1
rs.w0 a0.
rl.w0 b0.
rl.w3 g52.
jl w3 x3+h32-2 ; outinteger(value);
a0: 1<23+32<12+1
dl.w1 b1. ; restore(w0,w1)
jl. (b2.) ; end writeinteger;
e.
; procedure writetext(text addr);
; comment: prints the text on current output.
; call: exit: store:
; w0 text addr after text addr
; w1 b1
; w2
; w3 return destroyed b0;
w.e11: rs.w1 b1. ; begin
rs.w3 b0. ; save(w1);
rl.w3 g52. ; save(w3);
jl w3 x3+h31-2 ; outtext(text addr);
rl.w1 b1. ; restore(w1)
jl. (b0.) ; end writetext;
; procedure writeaddr;
; comment: prints the load address on current output.
; call: exit: store:
; w0 b3
; w1 b4
; w2 b5
; w3 return destroyed b6;
w.e20: rs.w2 b4. ; if list then
rl.w2 j11. ; return:= odd;
sn.w2(c9.) ; writeaddr;
al w3 x3+1
rl.w2 b4.
jl. e13.
e18: rs.w3 b5. ; if list then
rl.w3 j11. ; writeaddr
se.w3(c9.) ; else
jl. (b5.) ; return;
rl.w3 b5.
e13: ds.w1 b4. ; begin
ds.w3 b6. ; save(w0,w1,w2,w3);
am -2048
rl.w3 j11.+2048 ; oldlist:=list;
rx.w3 c56. ; if list <> old list then
sn.w3(c56.) ; writechar(nl) else
sn.w3(c9.) ; if list then
jl.w3 e4. ; writechar(nl);
rl.w0 g68. ; if lines.yes then
am. (g52.) ;-2
;am 0
j30: jl w3 +h32-2 ; outinteger(<<ddddd>, lineno);
;am 0
0<23+32<12+5 ;+2
;am 0
jl.w3 e52. ; value:= get k;
al w0 x2+0
rl.w3 g52.
jl w3 x3+h32-2 ; outinteger(<<-ddddd>,value);
1<23+32<12+6
rl.w3 b6.
sz w3 2.1 ; if return odd then
am e19-e3 ; writechar(*)
jl.w3 e3. ; else writechar(bl);
jl.w3 e3. ; writechar(bl);
dl.w1 b4. ; restore(w0,w1);
rl.w2 b5. ; restore(w2)
jl. (b6.) ; end writeaddr;
; procedure writeid;
; comment: prints the current identifier on current output.
; call: exit: store:
; w0 b3
; w1 b4
; w2
; w3 return destroyed b5;
w.e12: rs.w3 b5. ; begin
ds.w1 b4. ; save(w3);
rl.w3 g5. ; save(w0,w1);
al w0 x3+96
jl.w3 e9. ; writechar(id letter+96);
rl.w0 g7. ; writeinteger(id index)
jl.w3 e10. ;
dl.w1 b4.
jl. (b5.) ; end writeid;
; procedure writetest(addr,value);
; comment: prints addr and value on current output.
; call: exit: store:
; w0 b4
; w1 addr b5
; w2 value
; w3 return destroyed b3;
w. rs.w3 b3.-2 ; begin
e14: jl x3+0 ; if -,testmode then goto exit;
ds.w1 b5. ; save(w0,w1,w3);
jl.w3 e4. ; writechar(nl);
al w0 x1+0
ws.w0 g31.
jl.w3 e17. ; writeinteger1(addr-first label);
jl.w3 e3. ; writechar(bl);
al w0 x2+0
jl.w3 e17. ; writeinteger1(value);
dl.w1 b5. ; exit:
jl. (b3.) ; end writetest;
; procedure writemessage(text addr);
; comment: prints the message on current output.
; call: exit: store:
; w0 text addr after text addr
; w1
; w2
; w3 return destroyed g69;
w.e15: rs.w3 g69. ; begin
sh.w0 c38. ; if warning.no
j19: am 0 ; and warn then
; jl x3+0 ; goto exit;
; if list then
jl.w3 e20. ; writeaddrstar
; else writeaddr;
al w3 0
rx.w3 g57. ; if id out then
se w3 0 ; writeid;
jl.w3 e12. ; id out:= false;
e63: jl.w3 e11. ; writetext(text addr);
rx w0 2
sl.w1 c35. ; if termination file then
jl.w3 e11. ; writetext(<file>);
sn.w1 c40. ; if connect procedure source then
jl.w3 e17.-2 ; writeinteger1(sourcenumber);
sn.w1 c34. ; if text=
jl. 6 ; halfword overflow
se. w1 c43. ; or
jl. 6 ; text=address overflow
rl. w0 g10. ; then
jl. w3 e17. ; writeinteger(byte value);
jl.w3 e4. ; writechar(nl);
dl.w1 b4.
sn.w0 c28. ; if <type> then
jl. (g69.) ; goto exit;
rl.w3 g76. ; increase(no of error messages);
al w3 x3+1 ;
rs.w3 g76. ;
sh.w0 c28. ; if warn then
am 1 ; warn := true else
al w3 1
lo.w3 g53. ;
rs.w3 g53. ; error:= true;
sh.w0 c39. ; if error return then
jl. (g69.) ; goto exit;
sl.w0 c30. ; if term then
jl. d6. ; goto end slang;
al w3 0
rs.w3 g18. ; prog state:= 0;
rl.w0 g8. ; restore(opsit);
dl.w2 g13. ; restore(delim value,delim type);
jl. d9. ; goto look up delim;
; exit:
; end writemessage;
c.i0i.z.
e.
; procedure output <begin>; (called from action ...begin...)
; comment extends the blockhead with 3 words, one of which
; gives the blocknumber of the surrounding block
; prepares an xref record with recordtype = <begin>.
; calls output xref record;
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 stacktop destroyed
; w3 return
w.e54: rl.w0 c46. ; begin
rs w0 x2-4 ; word(stacktop-4) := 4095 shift 12;
al w0 0 ; word(stacktop-2) := 0;
rl.w1 g72. ; word(stacktop) := current blockno;
ds w1 x2 ;
al w2 x2-6 ; stacktop := stacktop - 6;
rs.w2 g26. ;
sh.w2(g23.) ; if stacktop <= prog top then
jl. e46. ; stack term;
al w0 1<2 ; blockno := current blockno
wa.w0 g66. ; := global blockno
sh w0 1<11-1-1; if blockno>max then blockno:=max;
rs.w0 g66. ; := global blockno + increment;
rs.w0 g72. ; recordtype := <begin>;
rl.w1 c49. ; output xref record and return(w0,w1);
jl. e60. ; end;
; procedure output <xref mode>; (called from action ...set xrefmode...)
; procedure output <k assignment>; (called from ...new label...)
; comment prepares an xref reord with recordtype = <xref mode>
; or <k assignment>.
; calls output xref record;
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 destroyed
; w3 return
w.e61: am -2 ; begin recordtype := if <xrefmode> then
e55: rl.w1 c47. ; <xrefmode> else <k assignment>;
al w0 0 ; if <kassignment> then
se.w1(c47.) ; blockno:=0 else
rl.w0 g72. ; blockno := current blockno;
jl. e60. ; output xref record and return(w0,w1);
; end;
; procedure output <end>; (called from action ...end...)
; comment prepares an xref record with recordtype = <end> and
; blockno = current blockno.
; updates current blockno according to the surrounding
; block.
; calls output xref record;
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 stacktop destroyed
; w3 return
w.e56: rl.w1 c48. ; begin
rl w0 x2-6 ; recordtype := <end>;
rx.w0 g72. ; blockno := current blockno;
jl. e60. ; current blockno := word(stacktop-6);
; output xref record and return(w0,w1);
; end;
; procedure output <define>; (called from ...load id...)
; comment searches in the identifierstack for the id-letter
; and id-index associated to stackentry.
; prepares an xref record with recordtype =
; (<define>,<id-letter>,<id-index>) and blockno =
; local blockno.
; calls mark xref record;
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 destroyed
; w3 return
b.a1
w.e53: rl.w1 g26. ; begin idpointer := stacktop;
rl.w0 g72. ; blockno := current blockno;
a1: bz w2 x1+3 ; next id: idindex := byte(idpointer+3);
ls w2 2 ; idlength := idindex*4;
al w1 x1+6 ;
wa w1 4 ; idpointer := idpointer+6+idlength;
sl.w1(g27.) ; if idpointer >= stackentry then
jl. a0. ; goto found;
bl w2 x1+2 ; id letter := byte(idpointer+2);
sn w2 63 ; if idletter = 63 then
rl w0 x1 ; blockno:= word(idpointer);
jl. a1. ; goto next id;
; local blockno now contains the blockno corresponding
; to the identifier.
; idpointer is the stackentry of the last identifier with
; the same idletter.
a0: ws w1 4 ; found: id<0>address := idpointer-idlength;
rl.w2 g27. ; idindex := (stackentry-id<0>address)//4;
ws w2 2 ;
bz w1 x1-4 ; idletter := byte(id<0>address-4);
ls w2 10 ;
ld w2 13 ; packed ident := idletter shift 13 + idindex*2;
jl. e59. ; mark xref record and return(w0,w1);
e. ; end;
; procedure output <use>; (called from ...def operand...)
; comment prepares an xref record with recordtype =
; (<use>,<idletter>,<idindex>) and blockno = current blockno.
; continues as output declaration;
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 destroyed
; w3 return
w.e57: rl.w0 g7. ; w0 := idindex;
al w3 x3+1 ; return := odd return;
; procedure output <declaration>; (called from action ...declare2...)
; comment prepares an xref record with recordtype =
; (<declaration>,<idletter>,<idindex>) and
; blockno = current blockno.
; continues as mark xref record or calls output xref record;
; call: exit:
; w0 idindex destroyed
; w1 destroyed
; w2 destroyed
; w3 return
w.e58: rl.w1 g5. ; w1 := idletter;
ls w1 12 ; packed ident := recordtype :=
wa w1 0 ; idletter shift 12 + idindex * 2;
ls w1 1 ;
rl.w0 g72. ; blockno := current blockno;
so w3 1 ; if output decl then
jl. e60. ; output xref record and return(w0,w1);
rl.w0 g67. ; blockno := local blockno;
al w1 x1+1 ; packed ident := packed ident add usebit;
; procedure mark xref record;
; call:
; w0 blockno
; w1 packed ident
; w2
; w3 return
w.e59: lo.w1 c45. ; recordtype := packed ident add assign-or-use-bit;
; procedure output xref record;
; comment if xref is not specified return is made immediatly.
; else the record is completed with lineno and k-value.
; call: exit:
; w0 blockno destroyed
; w1 recordtype destroyed
; w2 destroyed
; w3 return
w.e60: ;jl x3+0 ; if not xref then return;
am -2048 ;
rl.w2 g70.+h3+0+2048; w2 := record base;
ls w0 -2 ; record(1:2) :=
ls w1 4 ; blockno shift 38
ld w1 14 ; +packed ident shift 18
wa.w1 g77. ; +current lineno;
ds w1 x2+4 ;
al w2 x2+4 ; increase(record base);
al w0 1 ; increase(no of xref records);
wa.w0 g73. ;
rs.w0 g73. ;
am -2048 ;
al.w1 g70.+2048 ;
rs w2 x1+h3+0 ;
sl w2(x1+h3+2) ; if no more space in xref buffer then
jl (x1-g70+g41); outblock(xref zone) and return;
jl x3+0 ; return;
\f
; constants
w.c2: 2<12+2
c51: 2<12+10 ; (<newline>,<name>)
c52: 4<12+10 ; (<space>,<name>)
c53=k+2
c54=k+6, <:slangxref<0>:> ; name of xref output program...
c3: jl x1+0
c4: jl x3+0
c5: 4096
c6: 1022<2
c7: am-2048 ; stepping stone: goto end program
jl. d6.+2048
c8: jl x1+0 ; list off
c55: jl x1+0 ;+2 saved list
; am 0
c9: am 0 ;+4 list on
c56: jl x1+0 ; old list (used at select t-input)
c10: 15
f.c11: 10
w.c12: 31
c13: 63<12
c14: 2048
c15: 1<23+8
; xref:
c46: 4095<12 ; identification of blocknumber-block
0 ;c47-2 recordtype of <xref mode>
c47: 1<19 ; recordtype of <k assign>
c48: 63<13 ; recordtype of <end>
c49: 1 ; recordtype of <begin>
c45= c47 ; mark for define or use
; texts
w.c22: <:<10>***slang <0>:>
c27: <:id list<10>b.<0>:>
c29: <:sorry<0>:>
<:<10>slang ok<0>:>
; warning texts
c31: <:illegal<0>:>
c32: <:relative<0>:>
c33: <:address overflow: <0>:>
c43: <:halfword overflow: <0>:>
c34: <:syntax<0>:>
c38: <:repetition<0>:>
; c38 must be the last warning text
; error return texts
c28: <:type <0>:>
; c28 must be the first error return text
c21: <:end source<0>:>
c37: <:undefined at end<0>:>
c39: <:program too big<0>:>
; c39 must be the last error return text
; error texts
c20: <:syntax<0>:>
c23: <: declaration<0>:>
c24: <: undeclared<0>:>
c25: <: definition<0>:>
c26: <: undefined<0>:>
; termination texts
c30: <:stack<0>:>
; c30 must be the first termination text
c36: <:jump<0>:>
c42: <:slang fault<0>:>
c41: <:source unknown <0>:>
c50: <:connect source <0>:>
; c40 must be the first text after c50
; termination file texts
c40: <:connect <0>:>
c35: <:no text <0>:>
; c35 must be the second termination file text
; variables 2
w. ; g0 and g1 used together
g1: 0 ; char
g0: 0 ; char type
; g2 and g3 used together
g3: 0 ; symbol
g2: 0 ; symbol type
g4: 0 ; ahead
g5: 0 ; id letter (1:22 except 11)
; g7 and g8 used together
g7: 0 ; operand and id index
g8: 0 ; opsit
g9: 0 ; point loc
g11: 0 ; delim state
; g12 and g13 used together
g12: 0 ; delim value
g13: 0 ; delim type
g14: 0 ; text buffer
g15: -1 ; text addr
h.g16: 0 ; op part
g22: 0 ; addr part
w.g17: 0 ; control word
; g18 and g19 used together
g18: 0 ; prog state
g19: 1 ; old prog state
g20: 0 ; operator
g21: 0 ; block level
; g24 and g25 used together
g24: -1 ; operand top
g25: -1 ; operator top
g27: -1 ; stack entry
g28: -1 ; block entry
g29: 0 ; text count
g30: 0 ; radix
g31: -1 ; first label
g32: -1 ; core top
g42: -1 ; seg addr
; g45 and g49 used together
g45: 0 ; after digit
g49: 0 ; after exp
g47: 0 ; sign
g48: 0 ; frac sign
g60: 0
h.g50: 0 ; real
g61: 0 ; exponent
w.g51: 0 ; outside segment
g53: 0 ; error
g54: 0 ; head
g55: -1 ; normal
g57: 0 ; id out
; g58 and g59 used together
g58: 0 ; working location
g59: 0 ; working location
g66: 1 ; global blocknumber (must be uneven)
g67: 0 ; local blocknumber ( of identifier )
g72: 0 ; current blocknumber
g68: 1 ; lineno (starting from 1)
g77: 0 ; current lineno
g10: 0
g69: 0 ; saved return from writemessage and test addr 1
; g70=xref zone
; g71=xref share
g73: 0 ; no of xref records
g74: 0 ; source name address
g75: 0 ; base of procedure names
g76: 0 ; no of error messages
g80: 0 ; link(from jump insert identifier)
g81: 0 ; value(from jump insert identifier)
; jump variables
; g23 and g26 used together
w.g23: -1 ; prog top
g26: -1 ; stack top
g33: -1 ; note addr
g62: -1 ; last k addr
g56: -1 ; result name addr
g82: jl. j43. ; goto jump insert identifier;
g78: 0 ; abs address of sum (i.e. s0)
g79: 0 ; abs address of doublesum (i.e. s1)
; program procedures
e41: rl.w0 g58. ; procedure declaration error;
rs.w0 g7. ; begin id index:= save index;
am c23-c24 ; id out:= true;
; write error(<: declaration:>)
; end;
e42: am c24-c25 ; procedure undeclared error;
; begin id out:= true;
; write error(<: undeclared:>)
; end;
e43: am c25-c26 ; procedure definition error;
; begin id out:= true;
; write error(<: definition:>)
; end;
e44: al.w0 c26. ; procedure undefined error;
al w2 -1 ; begin id out:= true;
rs.w2 g57. ; write error(<: undefined:>)
jl. e15. ; end;
e51: am c42-c37 ; procedure slang fault term;
; write term(<:slang fault:>);
e45: am c37-c30 ; procedure undefined at end error;
; write error(<:undefined at end:>);
e46: am c30-c32 ; procedure stack term;
; write term(<:stack:>);
e47: am c32-c33 ; procedure relative warn;
; write warn(<:relative:>);
e48: am c33-c43 ; procedure address overflow warn;
; write warn(<:address overflow:>);
e34: am c43-c38 ; procedure halfword overflow
; write warn(<:halfword overflow:>);
e49: am c38-c34 ; procedure repetition warn;
; write warn(<:repetition:>);
e50: am c34-c20 ; procedure syntax warn;
; write warn(<:syntax:>);
e40: al.w0 c20. ; procedure syntax error;
jl. e15. ; write error(<:syntax:>);
; procedure round addr;
; comment: the prog top is set to the nearest word address.
; call: exit:
; w0 destroyed
; w1 return
; w2 destroyed
; w3 destroyed;
w.e21: rl.w2 g23. ; begin
so w2 2.1 ; if prog top(23)=1 then
jl x1+0 ; load byte(0)
al w2 0 ; end round addr;
; procedure load byte(value);
; comment: loads the next byte in the object program.
; call: exit:
; w0 destroyed
; w1 return
; w2 value destroyed
; w3 destroyed;
b.a0
w.e22: rx.w1 g23. ; begin
hs w2 x1+0 ; byte(prog top):= value(12:23);
bl w2 5 ; value:= value(12:23);
jl.w3 e14. ; write test(prog top,value);
al w1 x1+1 ; prog top:= prog top+1;
jl. a0. ; goto test room
; end load byte;
; procedure load word(value);
; comment: loads the next word in the object program.
; call: exit:
; w0 destroyed
; w1 return
; w2 value destroyed
; w3 destroyed;
w.e23: rx.w1 g23. ; begin
rs w2 x1+0 ; word(prog top):= value;
jl.w3 e14. ; write test(prog top,value);
al w1 x1+2 ; prog top:= prog top+2;
a0: al w3 x1+0 ; test room:
rx.w1 g23.
sl.w3(g26.) ; if prog top>=stack top then
jl. e46. ; stack term
jl x1+0 ; end load word;
c.i0i.z.
e.
; procedure prep expr;
; comment: sets the operand top and the operator top.
; call: exit:
; w0
; w1 operand top
; w2 operator top
; w3 return;
w.e24: dl.w2 g26. ; begin
sz w1 2.1 ; operand top:=
al w1 x1+1 ; prog top+prog top(23);
ds.w2 g25. ; operator top:= stack top
jl x3+0 ; end prep expr;
; procedure get id(undeclared);
; comment: searches for the stack entry of the current identifier.
; call: exit:
; w0 destroyed
; w1 word(stack entry)
; w2 stack entry
; w3 return;
b.a3
w.e25: al w0 0 ; begin
rs.w0 g51. ; outside segment:= false;
rl.w0 g72. ; local blocknumber := current blocknumber;
rs.w0 g67. ;
rl.w2 g26.
al w2 x2+2 ; stack entry:= stack top+2;
a0: bl w1 x2+0 ; exam:
sn w1 0 ; if byte(stack entry)=0 then
jl x3+0 ; goto undeclared;
rl w0 x2+4
sn w1 -1 ; if byte(stack entry)=4095 then
rs.w0 g67. ; local blocknumber := word(stack entry+4);
sn w1 63
sn w0 0
jl. a3. ; if byte(stack entry)=63
al w0 -1 ; &word(stack entry+4)<>0 then
rs.w0 g51. ; outside segment:= true;
a3: bz w0 x2+1
se.w1(g5.) ; if id letter<>byte(stack entry) then
jl. a1. ; goto next;
rl.w1 g7.
sl w0 x1+0 ; if id index<=byte(stack entry+1) then
jl. a2. ; goto found;
a1: ls w0 2 ; next:
wa w2 0 ; stack entry:= stack entry
al w2 x2+6 ; +4*byte(stack entry+1)+6;
jl. a0. ; goto exam;
a2: ls w1 2 ; found:
wa w2 2
al w2 x2+4 ; stack entry:= stack entry
rs.w2 g27. ; +4*id index+4
rl w1 x2+0
jl x3+2 ; end get id;
c.i0i.z.
e.
; procedure def addr(address);
; comment: defines the load address (k) which corresponds to an
; absolute assembly address by searching for the last address
; label in the object program.
; call: exit:
; w0
; w1 assembly addr label pointer
; w2 load addr
; w3 return;
b.b0,a2
w.e26: rs.w1 b0. ; begin
rl.w1 g31. ; label pointer:= first label;
jl. a1. ; goto first;
a0: wa w2 2 ; again:
al w2 x2+4 ; next:= next+label pointer+4;
sl.w2(b0.)
jl. a2. ; if next>=address then goto found;
al w1 x2+0 ; label pointer:= next;
a1: rl w2 x1+0 ; first:
sl w2 0 ; next:= word(label pointer);
jl. a0. ; if next>=0 then goto again;
a2: ac w2 x1+4 ; found:
wa.w2 b0. ; def addr:= address-(label pointer+4)
wa w2 x1+2 ; +word(label pointer+2)
jl x3+0 ; end;
b0: 0; assembly address
c.i0i.z.
e.
; procedure test byte 1(value);
; comment: works as test byte except for the address output
; which is the prog link instead of the current load addr.
; call: exit:
; w0
; w1
; w2 value
; w3 return;
b.b4,a8
w.j44: al w3 x3+1 ; flag:=half
am c5-c14 ; upper:= 4096;
; goto test;
; procedure test addr 1(value);
; comment: works as test addr except for the address output
; which is the prog link instead of the current load addr.
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 value
; w3 return destroyed;
w.j0: sl.w2(c14.) ; upper:= 2048;
jl. 8 ;
sh w2 2047 ; if value<2048 or
j39: sh w2 2047 ; value>testup (note: may be changed)
jl. 4 ; then goto alarm;
jl. 6 ; test:
j40: sl w2 -2048 ; if value<upper
jl x3+0 ; and value>=testlow (initially -2048) then
ds.w3 g69. ; goto exit;
; if list then
jl.w3 e20. ; writeaddrstar
; else writeaddr;
rl.w1 b2.
jl.w3 e26.
al w0 x2+0
jl.w3 e10. ; writeinteger(def addr(prog link));
jl.w3 e3. ; writechar(bl);
jl.w3 e3. ; writechar(bl);
rl. w3 g69.
sz w3 2.1
am c43-c33
al.w0 c33.
jl.w3 e63. ; writemessage(<:addr or half overflow:>);
jl. (g69.) ; exit:
jl x3+0
j1: jl x3+0
; procedure load id(value);
; comment: follows the program link and distributes the value of an
; identifier. the procedure is modified when used to output the
; addresses in the program link.
; call: exit:
; w0 destroyed
; w1 id value destroyed
; w2 destroyed
; w3 return destroyed;
e27: rs.w1 b0. ; begin
rs.w3 b1.
bl.w3 j6. ; if not modified then
h. sn w3,rs w2 x1 ;
w.j31: jl.w3 e53. ; output <define>;
;am 0
rl.w1 b0. ; (reestablish register after output)
rl.w3 g27. ; prog link:= word(stack entry-2);
rx w1 x3-2 ; word(stack entry-2):= value;
rs.w1 b2.
rl w2 x3+0
sz w2 2.11 ; if word(stack entry)(22:23)<>0 then
jl. (b1.) ; goto exit;
jl. a1. ; goto test long;
a0: al w2 0 ; more long:
rl.w0(b2.) ; rel:= if word(prog link)(23)=1 then
sz w0 2.1 ; def addr(prog link) else 0;
jl.w3 e26.
ac w2 x2+0 ; id:= value-rel;
wa.w2 b0.
rl.w1 b2. ; old link:= prog link;
rl w3 x1+0
ls w3 -2 ; prog link:= word(old link) shift -2;
rs.w3 b2. ; if modified then
j6: rs w2 x1+0 ; writeinteger1(def addr(old link))
; jl.w3 e26. ; else
j7: jl.w3 e14. ; begin
; jl.w3 e17.-2 ; word(old link):= id;
rl.w1 b2. ; write test(old link,id)
; end;
a1: se w1 0 ; test long:
jl. a0. ; if prog link<>0 then
rl.w1(g27.) ; goto more long;
ls w1 -2 ; prog link:= word(stack entry) shift -2;
sn w1 0 ; if prog link=0 then
jl. (b1.) ; goto exit;
a2: bz w3 x1+0 ; more short:
rs.w1 b2. ; next link:= byte(prog link);
rs.w3 b3.
al w2 0 ; rel:= 0;
so w3 2.1
jl. a6.
jl.w3 e26. ; if next link(23)=1 then
rl.w3 b3. ; rel:= def addr(prog link)
sz w3 2.10 ; -next link(22);
am -1
a6: ac w2 x2+0
wa.w2 b0. ; id:= value-rel;
so w3 2.10 ; if next link(22)=0 then
am j44-j0 ; test byte 1(id)
jl.w3 j0. ; else test addr 1(id);
rl.w1 b2. ; if modified then
j8: hs w2 x1+0 ; writeinteger1(def addr(prog link))
; jl.w3 e26. ; else
j9: jl.w3 e14. ; begin
; jl.w3 e17.-2 ; byte(prog link):= id;
rl.w3 b3. ; write test(prog link,id)
; end;
ls w3 -2 ; next link:= next link shift -2;
sn w3 0 ; if next link=0 then
jl. (b1.) ; goto exit;
rl.w1 b2.
sn w3 1023 ; if next link=1023 then
jl. a3. ; goto extended;
ws w1 6 ; prog link:= prog link-next link;
jl. a2. ; goto more short;
a3: rl.w3 g32. ; extended: next link:= core top;
jl. a5. ; goto match;
a4: al w3 x3-4 ; search: next link:= next link-4;
a5: se w1(x3+0) ; match:
jl. a4. ; if word(next link)<>prog link then
rl w1 x3-2 ; goto search;
jl. a2. ; prog link:= word(next link-2);
b0: 0; value ; goto more short;
b1: 0; saved w3 ; exit:
b2: 0; prog link ; end load id;
b3: 0; next link
c.i0i.z.
e.
; procedure def operand(undefined);
; comment: defines the integer value of the current operand.
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 operand value
; w3 return destroyed;
b.b1,a0
w.e28: rl.w2 g7. ; begin
rl.w0 g8. ; operand value:= operand;
sn w0 4
jl x3+2 ; if opsit=4 then goto exit;
rs.w3 b0.
sn w0 7
jl. a0. ; if opsit=7 then goto def k;
al w2 0
sn w0 6 ; rel:= if opsit=6 then get k
jl.w3 e52. ; else 0;
rs.w2 b1.
jl.w3 e25. ; get id(undeclared error);
jl. e42.
j32: jl.w3 e57. ; output <use>;
;am 0
rl.w2 g27. ; (reestablish registers after output)
rl w1 x2+0 ;
sz w1 2.11 ; if word(stack entry)(22:23)=0 then
jl. 4
jl. (b0.) ; goto undefined;
rl w2 x2-2 ; operand value:=
ws.w2 b1. ; word(stack entry-2)-rel;
jl. 4 ; goto exit;
a0: jl.w3 e52. ; def k:
rl.w3 b0. ; operand value:= get k;
jl x3+2 ; exit:
b0: 0; saved w3 ; end def operand;
b1: 0; rel
c.i0i.z.
e.
; integer procedure get byte link;
; comment: creates a program link for an undefined byte. if the
; program link exceeds 12 bits it is replaced by the value 1023
; shift 2 and an extended link is placed below the stack.
; call: exit:
; w0 destroyed
; w1 destroyed
; w2 byte link
; w3 return destroyed;
b.a0
w.e29: ; begin
rl.w2 g23.
ls w2 2 ; new link:= prog top shift 2;
al w1 x2+0 ; old link:= word(stack entry);
rx.w1(g27.) ; word(stack entry):= new link;
ws w2 2 ; link:= if old link=0 then 0 else
sn w1 0 ; new link-old link;
al w2 0
sh.w2(c6.) ; if link<=1022 shift 2 then
jl x3+0 ; goto exit;
ls w1 -2 ; link:= old link shift -2;
rl.w2 g26. ; move pointer:= stack top;
a0: al w2 x2+2 ; move stack:
rl w0 x2+0 ; move pointer:= move pointer+2;
rs w0 x2-4 ; word(move pointer-4):= word(move pointer);
se.w2(g32.) ; if move pointer<>core top then
jl. a0. ; goto move stack;
rs w1 x2-2 ; word(core top-2):= link;
rl.w1 g23.
rs w1 x2+0 ; word(core top):= prog top;
rl.w2 g26.
al w2 x2-4
rs.w2 g26. ; stack top:= stack top-4;
sh.w2(g23.) ; if stack top<=prog top then
jl. e46. ; stack term;
rl.w2 g28.
al w2 x2-4
rs.w2 g28. ; block entry:= block entry-4;
rl.w2 g78. ; change abs addresses of sum and
rs.w2 g79. ; doublesum...;
al w2 x2-4 ;
rs.w2 g78. ;
al w2 -4 ; link:= 1023 shift 2;
jl x3+0 ; exit: get byte link:= link
c.i0i.z. ; end get byte link;
e.
; procedure new label;
; comment: completes the last address label in the object
; program with size information and initialises a new label
; with size = -1.
; call: exit:
; w0 destroyed
; w1 return prog top
; w2 destroyed
; w3 destroyed;
b.b0
w.e30: rs.w1 b0. ; begin save(w1);
jl.w1 e21. ; round addr;
j33: jl.w3 e55. ; output <k assignment>;
;am 0
rl.w1 g23. ; def addr(prog top);
jl.w3 e26.
ws w2 x1+2 ; word(label pointer):=
rs w2 x1+0 ; load addr-word(label pointer+2);
jl.w3 e14. ; write test(label pointer
al w2 -1 ; ,word(label pointer));
jl.w1 e23. ; load word(-1);
rl.w1 g23.
rs.w1 g62. ; last k:= prog top
jl. (b0.) ; end new label;
b0: 0; saved w1
c.i0i.z.
e.
; procedure exam local(id action);
; comment: each stack entry which is local to the current block is
; looked up by this procedure and is examined by a piece of code
; supplied in the call.
; call: jump: exit:
; w0 destroyed
; w1 word(st entry) destroyed
; w2 stack entry block entry-2
; w3 return return destroyed;
b.b1,a1
w.e31: rl.w2 g26. ; begin
a0: al w2 x2+2 ; stack entry:= stack top;
bl w1 x2+0 ; next decl:
rs.w1 g5. ; stack entry:= stack entry+2;
sn w1 63 ; id letter:= byte(stack entry);
jl x3+0 ; if id letter=63 then goto exit;
bz w1 x2+1
rs.w1 b0. ; id limit:= byte(stack entry+1);
al w1 0 ; id index:= 0;
a1: rs.w1 g7. ; next id:
al w2 x2+4 ; stack entry:= stack entry+4;
rs.w2 g27.
rs.w3 b1.
rl w1 x2+0
jl w3 x3+2 ; id action;
rl.w1 g7.
rl.w2 g27.
rl.w3 b1.
sn.w1(b0.) ; if id index=id limit then
jl. a0. ; goto next decl;
al w1 x1+1 ; id index:= id index+1;
jl. a1. ; goto next id
b0: 0; id limit ; end exam local;
b1: 0; saved w3
c.i0i.z.
e.
; procedure test byte(value);
; comment:
; call: exit:
; w0
; w1
; w2 value
; w3 return;
w.e33: am c5-c14 ; upper:= 4096;
; goto test;
; procedure test addr(value);
; comment:
; w0
; w1
; w2 value
; w3 return;
w.e35: sl.w2(c14.) ; upper:= 2048;
jl. 8 ;
sh w2 2047 ; if value<2048 and
j41: sh w2 2047 ; value>testup (note: may be changed)
jl. 4 ; then goto alarm;
jl. 6 ; test:
j42: sl w2 -2048 ; if value<upper
jl x3+0 ; and value>=testlow (initially -2048) then
rs. w2 g10. ; save value
se w0 0 ;
am e34-e48 ; alarm(half)
jl. e48. ; goto exit;
; byte value warn;
; exit:
; end;
; procedure get k;
; comment: gets the load address of the program top.
; call: exit:
; w0
; w1 label pointer
; w2 load addr
; w3 return;
w.e52: rl.w1 g62. ; begin
al w1 x1-2 ; label pointer:= last k-2;
rl.w2 g23.
al w2 x2-2
ws.w2 g62. ; get k:= prog top-last k-2
wa.w2(g62.) ; +word(last k)
jl x3+0 ; end;
m. slang text 2 included
▶EOF◀