|
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◀