|
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: 37632 (0x9300) Types: TextFile Names: »do31tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »do31tx «
\f ; dotext part 1 (of 2) c.h57<3 b. g5, i2 w. ; for insertproc d. p.<:fpnames:> l. z. c.h57<2 b. g5, i2 w. ; for insertproc z. m. dotext begin version for system 2 and 3 ; do, an rc 4000 fp utility program ; torkild glaven ; rc 14.11.70 ; changes: jens ramsbøl ; rc 27.06.75 b.g99w. s.g0,q1,k=h55w. b.j0w. ; helping block w.g1: g0 ; length, saved return g2: <:***:> ; three stars g36: 0 ; g2+2 ; empty text g3: 0 ; ok bit g5: 2<12+2 ; the parameter: <nl> ; g7: jl x3+0 ; return instruction g8=h57 ; fp version ; variables ; g10: 0 ; param addr ; g11: 0 ; prog name addr ; g12: 0 ; item ; g13: 0 ; out name addr ; g14: 0 ; saved register ; g15: 0 ; saved register ; g16: 0 ; param ; procedure outchar(44); ; procedure outchar(47); ; procedure outend(10); ; procedure outchar(32); ; procedure outchar(61); ; procedure outchar(46); ; call: exit: ; w0 unchanged ; w1 destroyed ; w2 destroyed ; w3 link unchanged; g20: am 44-47 ; char:= 44 g21: am 47-10 ; or 47 g22: am 10-32 ; or 10 g23: am 32-61 ; or 32 g24: am 61-46 ; or 61 g25: al w2 46 ; or 46; rl.w1 q1. ; q1=g61 jl. h26. ; outchar(char); ; procedure end program(sorry); w.g28: am j0 ; ok bit:= false; ; procedure end program(ok bit); w.g26: rl.w2 g3. se w2 -1 ; if ok bit<>-1 then jl.w3 h7. ; end program(ok bit) jl. h10.+h76 ; else goto fp interrupt service addr; ; procedure outinteger(<<d>,value); ; call: exit: ; w0 value destroyed ; w1 destroyed ; w2 link unchanged ; w3 destroyed; w.g27: rl.w1 q1. ; q1=g61 jl.w3 h32. 1 jl x2+0 j0=g27+4-g3 ; procedure init program; ; comment: saves param address, program name address, and output ; name address, and generates names for eventually stack chains. ; may only be called once before any variable is assigned. ; call: exit: ; w0 delim ; w1 link unchanged ; w2 out name addr ; w3 call pointer destroyed; w.g30: ; begin g10: rs.w3 g10. ; param addr:= call pointer; g11: al w2 x3+2 ; prog name addr:= call pointer+2; g12: ds.w3 g12. ; item:= call pointer; g13: bl w0 x3+0 ; out name addr:= g14: sn w0 6 ; if byte(call pointer)=6 then g15: am x3-8 ; call pointer-8 g16: al w2 0 ; else 0; rs.w2 g13. jl x1+0 ; end; ; error texts w.g31: <:connect <0>:> g32: <:param <0>:> g33: <:call<10><0>:> g34: <:syntax<0>:> g35: <:end medium<10><0>:> ; g36: <:<0>:> (g36=g2+2) ; procedure error(text addr); ; call: exit: ; w0 unchanged ; w1 destroyed ; w2 text addr destroyed ; w3 link destroyed; w.g46: am g36-g35 ; empty error entry: text:= <::> g45: am g35-g34 ; end medium error entry: or <:end medium<10>:> g44: am g34-g33 ; syntax error entry: or <:syntax:> g43: am g33-g32 ; call error entry: or <:call<10>:> g42: am g32-g31 ; param error entry: or <:param :> g41: al.w2 g31. ; connect error entry: or <:connect :>; g40: ds.w0 g15. ; error entry: al.w0 g2. jl.w3 h31.-2 ; outtext(<:***:>); rl.w0 g11. jl.w3 h31.-2 ; outtext(prog name addr); al w0 x2+0 jl.w3 g23. ; outchar(32); jl.w3 h31.-2 ; outtext(text addr) rl.w0 g15. jl. (g14.) ; end; ; procedure get param(end list); ; comment: delivers the next parameter as the value of an integer ; or the address of a name. ; call: exit: ; w0 length ; w1 delim ; w2 param ; w3 link next delim; w.g50: ; begin rl.w2 g10. ; addr:= param addr; ba w2 x2+1 ; addr:= addr+byte(addr+1); rs.w2 g10. ; param addr:= addr; bl w1 x2+0 ; delim:= byte(addr); bl w0 x2+1 ; length:= byte(addr+1); sh w1 2 ; if delim<=2 then g7: jl x3+0 ; goto end list; al w3 x3+2 rs.w3 g14. am (0) ; next delim:= byte(addr+length); bl w3 x2+0 al w2 x2+2 ; param:= addr+2; sn w0 4 ; if length=4 then rl w2 x2+0 ; param:= word(param) rs.w2 g16. jl. (g14.) ; end; ; procedure just list param(end list); ; comment: executes the procedure list param except for the call of ; param error and the terminating new line. ; procedure list param(end list); ; comment: lists the current parameter as a parameter error and the ; following parameters up to the first space. the procedure continues ; with get param. ; call: exit: ; w0 length ; w1 delim ; w2 param ; w3 link next delim; b.a6w. ; begin w.g51: am a0 ; just list param entry: g52: al w2 a5 ; destroy outend(10) at exit; rs.w3 g1. ; goto start; hs.w2 a4. ; list param entry: se w2 2 ; param error; jl.w3 g42. ; start: a6: rl.w1 g10. ; addr:= param addr; bl w0 x1+1 ; length:= byte(addr+1); bl w1 x1+0 ; delim:= byte(addr); jl.w3 x1+g22.-2 ; outchar(character(delim)); rl.w3 g10. se w0 4 ; if length=4 then jl. a1. rl w0 x3+2 jl.w2 g27. ; outinteger(<<d>,param) jl. a2. a1: al w0 x3+2 rl.w1 q1. ; q1=g61 jl.w3 h31. ; else outtext(param); a2: jl.w3 g50. ; get param(exit); jl. a3. se w1 4 ; if delim<>4 then jl. a6. ; goto start; a4=k+1 a3: jl.w3 g22. ; exit: a5=g22-a3,a0=2-a5 ; if not destroyed then rl.w2 g10. ; outend(10); rl.w3 g1. ; param addr:= param addr-length; jl. g50.+4 ; get param(end list) i.e. ; end; ; g60 and g61 are used for determinig the output zone; g60: 0 ; g61: 0 ; q1=g61 i.e. ; end helping block b.a42,b80,c16,d23,e39,f99,i1 ; assembly variables f0=4<12+10 ; space,name f1=17 ; x words f2=28 ; first compound f3=3 ; format niveaus f4=6 ; names per line f5=30 ; repeat niveaus w.f10: jl. a3. ; goto after interrupt ; procedure increase addr; ; call: exit: ; w0 unchanged ; w1 next addr ; w2 unchanged ; w3 link unchanged; w.b1: rl.w1 e15. ; begin sh w1 7 ; if next addr<=7 then jl. a28. ; goto core addr error; rs.w1 e13. ; write addr:= next addr; sl.w1(e14.) ; if next addr>=write top then jl. (e32.) ; goto return(write item); al w1 x1+2 ; next addr:= next addr+2; rs.w1 e15. ; exit: jl x3+0 ; end; ; procedure write word; ; procedure write bytes; ; procedure write text; ; procedure write octets; ; procedure write sixtets; ; procedure write octal; ; procedure write binary; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 unchanged ; w3 link destroyed; b.j5 ; begin b4=k-10 w.b5: am 24<6-12<6+ 8- 5; word: bits:= 24; digits:= 8; b6: am 12<6- 8<6+ 5-16; bytes: or bits:= 12; digits:= 5; b7: am 8<6- 8<6+16- 4; text: or bits:= 8; digits:= 16; b8: am 8<6- 6<6+ 4- 3; octets: or bits:= 8; digits:= 4; b9: am 6<6- 3<6+ 3-12; sixtets: or bits:= 6; digits:= 3; b10:am 3<6- 1<6+12-10; octal: or bits:= 3; digits:= 12; b11:al 1<6 +10 ; binary: or bits:= 1; digits:= 10; ld w1 -6 hs.w0 j1. ls w1 -18 hs.w1 j2. rs.w2 j5. ; rs.w3 e30. sl w1 10 ; if digits>=10 then jl.w3 g23. ; outchar(32); jl.w3 g23. ; outchar(32); al w2 0 ; bit:= 0; j0: rl.w1 e16. ; next: ls w1 x2+0 ; word:= value shift bit; al w0 0 j1=k+1 ld w1;bits ; byte:= word(0:bits-1); bl.w1 j2. sl w1 10 ; if digits>=10 then jl. j3. ; goto characters; rl.w1 g61. ; jl.w3 h32. ; outinteger(<digits>,byte); j2=k+1 1<23+32<12;+digits jl. j4. ; goto exit; j3: ; characters: rx w2 0 ; if digits=10 and byte<>0 jl. x1-8 ; or digits=12 then se w2 0 ; byte:= byte+2; am 2 ; if digits<16 then al w2 x2+46 ; byte:= byte+46; sh w2 126 ; if byte>126 sh w2 31 ; or byte<=31 then al w2 32 ; byte:=32; rl.w1 g61. ; jl.w3 h26. ; outchar(byte); rl w2 0 ; exit: j4: ba.w2 j1. ; bit:= bit+bits; sh w2 23 ; if bit<=23 then jl. j0. ; goto next rl.w2 j5. ; jl. (e30.) ; end; j5: 0 i.e. ; procedure new line; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; w.b12: rl.w0 e15. ; begin rs.w0 e13. ; write addr:= next addr; jl. g22. ; outend(10) ; end; ; procedure write empty; ; call: exit: ; w0 write addr ; w1 unchanged ; w2 unchanged ; w3 unchanged; w.b13: rl.w0 e14. ; begin rs.w0 e13. ; write addr:= write top; jl. (e32.) ; goto return(write item) ; end; ; procedure write index; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; b.j1 ; begin w.b14: ; if w or z=-2 then rl.w0 e27. ; goto return(write item); sn w0 -2 ; if w or z<>0 then jl. (e32.) ; begin sn w0 0 ; w or z:= -2; jl. j1. ; goto exit al w0 -2 ; end; rs.w0 e27. jl x3+0 j1: rs.w3 e30. jl.w3 b1. ; increase addr; rl.w0 e13. ws.w0 e12. ; index:= write addr-write base; sh w0 -1 ; sign:= am 2 ; if index<=-1 then 45 al w2 43 ; else 43; hs.w2 j0. sh w0 -1 ; if index<=-1 then ac w0(0) ; index:= -index; sh w0 9 ; if index<=9 then jl.w3 g23. ; outchar(32); sh w0 99 ; if index<=99 then jl.w3 g23. ; outchar(32); j0=k+1 al w2;sign ; if index<=999 then rl.w1 g61. ; sh w0 999 ; outchar(sign); jl.w3 h26. ; outinteger(<<d>,index); jl.w2 g27. ; exit: jl. (e30.) ; end; i.e. ; procedure write double; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; b.j3 ; begin w.j0: al w1 0 ; procedure first group(value); hs.w1 j1. ; begin al w1 32 ; test:= 0; hs.w1 j2. ; char:= 32; j1=k+1 ; group(value) ; end; se w0 0 ; test ; procedure group(value); jl. j2. ; if value=test then al.w0 c4. ; outtext(<: :>) rl.w1 g61. ; jl. h31. ; else last group(value); j2=k+1 ; procedure last group(value); al w1 32; char ; begin hs.w1 j3. ; fill:= char; al w1 48 ; char:= 48; hs.w1 j2. al w1 -1 ; test:= -1; hs.w1 j1. rs.w3 e35. ; outinteger(value) rl.w1 g61. ; jl.w3 h32. ; end; j3: 32<12+6 ; fill jl. (e35.) b15: rs.w3 e35. jl.w3 b1. ; increase addr; jl.w3 b14. ; write index; rl.w3 e35. rs.w3 e30. ; a:= word(write addr-2); dl.w0(e13.) ; b:= word(write addr); ld w2 -65 ; a1:= a/1000000; wd.w3 c2. ; a2:= a mod 1000000; wd.w2 c15. ; d1:= a2/500000; ls w2 23 ; d1:= d1 shift 23; rx w2 2 ; d2:= a2 mod 500000; rx w3 4 ; b1:= (d2*2**24+b)/1000000; wd.w0 c2. ; b2:= (d2*2**24+b) mod 1000000; wa w0 2 ; b1:= b1+d1; rx w3 4 ; c1:= (a1*2**24+b1)/1000000; wd.w0 c2. ; c2:= (a1*2**24+b1) mod 1000000; rs.w3 e31. ; comment: the double value is now jl.w3 j0. ; c1*10**12+c2*10**6+b2; rl.w0 e31. ; first group(c1); jl.w3 j1. ; group(c2); al w0 x2+0 jl.w3 j2. ; last group(b2) jl. (e30.) i.e. ; end; ; procedure write name; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; w.b16: rs.w3 e30. ; begin jl.w3 g23. ; outchar(32); jl.w3 g23. ; outchar(32); rl.w0 e13. ; addr:= write addr; jl.w3 b1. ; increase addr; jl.w3 b1. ; increase addr; jl.w3 b1. ; increase addr; b3: rl w1 116 ; write name without spaces: sl w0 8 ; if addr>=8 sl w0 x1-6 ; and addr<core top-6 then jl. (e30.) ; outtext(addr) rl.w1 g61. ; jl.w3 h31. jl. (e30.) ; end; ; procedure write procname; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; w.b17: rs.w3 e31. ; begin jl.w3 b5. ; write word; jl.w3 g25. ; outchar(46); rl.w1 e16. ; addr:= value; sh w1 -1 ; if addr<=-1 then ac w1 x1+0 ; addr:= -addr; al w0 x1+2 ; addr:= addr+2; rl.w3 e31. b2: rs.w3 e30. ; goto write name without spaces jl. b3. ; end; ; procedure write procnames; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; b.j5 ; begin w.b18: rs.w3 e31. jl.w3 b11. ; write binary; rl w1 78 ; pointer:= first internal; al w2 0 ; names:= 0; j0: ds.w1 j3. ; next: rs.w2 j4. rl w3 x1+0 ; addr:= word(pointer); rl.w0 e16. ; if value and word(addr+12) so w0(x3+12) ; =word(addr+12) then jl. j2. ; begin al w0 x3+2 ; addr:= addr+2; sh w2 f4-1 ; if names>=names per line then jl. j1. ; begin rs.w0 j5. al.w0 c10. ; outtext(<:<10> :>); rl.w1 g61. ; jl.w3 h31. ; names:= -1 al w2 -1 ; end; rl.w0 j5. j1: al w2 x2+1 ; names:= names+1; rs.w2 j4. jl.w3 g23. ; outchar(32); jl.w3 g23. ; outchar(32); jl.w3 b2. ; write name without spaces rl.w2 j4. j2: dl.w1 j3. ; end; al w1 x1+2 ; pointer:= pointer+2; se w1(80) ; if pointer<>name table end then jl. j0. ; goto next jl. (e31.) ; end; 0 j3: 0 j4: 0 j5: 0 i.e. ; procedure write code; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; b.j4 ; begin w.b19: rs.w3 e30. rl.w0 e16. ; instruction:= value; al w3 0 ld w0 7 rl.w2 x3+c0. ; load mnemonic code; la.w3 2.1 ld w0 2 sz w3 2.1 al w2 x2+14 ; add relative bit; am 1000 rl.w3 x3+f94. ; load register part; so w2 2.1 ; if w0 irrelevant then jl. j0. ; begin am 1000 sn.w3(f94.) ; if w0 then remove register part; rl.w3 c12. ; remove irrelevant mark al w2 x2+32-39 ; end; j0: sh w0 -1 ; if indirect mark then am 40-32 ; add left par al w3 x3+32 ; else add space; ds.w3 e35. ld w0 2.11 ; displ:= instruction(12:23); la.w3 c13. am x3+1000 rl.w2 x3+f95. ; load index part; sn w3 0 ; if index=0 then al w2 0 ; remove index part; sl w0 0 ; if displ>=0 al w2 x2+43 ; and index<>0 then rs.w2 e36. ; add plus; bl w2 0 al.w0 e34. rl.w1 g61. ; jl.w3 h31. ; outtext(instruction addr); al w0 x2+0 la.w2 c16. al w2 x2+1 rs.w2 j4. rl.w1 g61. ; jl.w3 h32. ; outinteger(<<d>,displ); j4: 1<23+1 bl.w1 e16. sz w1 2.100 ; if indirect instruction then am 41-32 ; outchar(41) al w2 32 ; else outchar(32); rl.w1 g61. ; jl.w3 h26. bl.w0 e39. bl.w1 e16. sl w0 0 ; if displ>=0 sz w1 2.11 ; and index=0 then jl. j1. ; outchar(32); jl.w3 g23. j1: sh w0 -1 ; if displ<=-1 then ac w0(0) ; displ:= -displ; sh w0 9 ; if displ<=9 then jl.w3 g23. ; outchar(32); sh w0 99 ; if displ<=99 then jl.w3 g23. ; outchar(32); sh w0 999 ; if displ<=999 then jl.w3 g23. ; outchar(32); bl.w1 e16. sz w1 2.11 ; if index<>0 then jl. j2. ; outtext(<: :>) so w1 2.1000 ; else if -,relative instruction then jl. j3. ; outtext(<: :>) bl.w0 e39. ; else wa.w0 e13. ; begin rl.w1 g61. ; jl.w3 h32. ; rel:= instruction(12:23) 32<12+6 ; +write addr; jl. (e30.) ; outinteger(<<dddddd>,rel) j2: jl.w3 g23. ; end am +2 j3: al.w0 c4. rl.w1 g61. ; jl.w3 h31. jl. (e30.) i.e. ; end; ; procedure write words5; ; procedure write bytes10; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; b.j1 w.j0: 0 j1: rs.w3 j0. ; store link; rl.w1 e15. ; sl.w1(e14.) ; if next addr>=top then jl. (e31.) ; return to link; jl.w3 b1. ; increase addr; rl.w3(e13.) ; rs.w3 e16. ; value:=word(write addr); jl.w3 x2+b5. ; write word or bytes; jl. (j0.) ; b21: am 2 ; write bytes10: b20: al w2 0 ; write words5: rs.w3 e31. ; store link; jl.w3 x2+b5. ; write word or bytes; jl.w3 j1. ; jl.w3 j1. ; jl.w3 j1. ; jl.w3 j1. ; jl. (e31.) ; i.e. ; constants ; ' means w0 is irrelevant in write code w.c0: <:aw'do el hl la lo lx wa ws am'wm al ri'jl'jd'je':> <:xl'es ea zl rl sp're'rs wd rx hs xs'gg di ms'is':> <:ci ac ns nd as ad ls ld sh sl se sn so sz sx'gp :> <:fa fs fm ks fd cf dl ds aa ss 58'59'60'61'62'63':> <:aw'io bl hl la lo lx wa ws am'wm al ml'jl'jd'je':> <:xl'bs ba bz rl sp'kl rs wd rx hs xs'pl'ps'ms'is':> <:ci ac ns nd as ad ls ld sh sl se sn so sz sx'ic':> <:fa fs fm ks fd cf dl ds aa ss 58'59'60'61'62'63':> c2: 1000000 c3: <: =<0>:> c4: <: :> ; 6 spaces (terminated by null) c5: 63 ; last 6 bits c6: <:niveau<0>:> c7: <:no core<0>:> c8: <:core addr<0>:> c9: <:format<0>:> c10: <:<10> :> ; c11 used c12: <: <0>:> c13: 3 ; last 2 bits c14: <:clock:>,0,0,0 c15: 500000 c16: 1<23 ; references ; f8 used ; f9 used f11: jl. g22. ; outend(10); f12: jl. g27. ; outinteger; f13: rl.w1 g61. ; jl. h31. ; outtext; f14: rl.w1 g61. ; jl. h33. ; outend; f15: jl. g25. ; outchar(46); ; f96 used ; f97 used ; f98 used ; f99 used ; variables ; w3 copy w.e0=k+2 ; w0 addr e1=e0+2 ; w1 addr e2=e0+4 ; w2 addr e3=e0+6 ; w3 addr ; z3 copy ; z0 addr ; z1 addr ; z2 addr ; z3 addr e4=e0+8+10 ; x0 addr e5=e4+2*f1 ; x1 addr e6=e4+4*f1 ; x2 addr e7=e4+6*f1 ; x3 addr b.j0 w.g70: rs.w1 e23. ; init do; rs.w2 e11. ; cur com:= current command; jl.w1 g30. ; init program; al.w1 e9. ; wa.w1 e9. ; se w2 0 ; if left side in call then al w1 x1+512 ; save addr:=first free addr+share rs.w1 e9. ; else save addr:=first free addr; al w1 x1+18+8*f1; rs.w1 e10. ; buf addr:=save addr+variable length; rl.w2 e11. ; sl w1 x2+2 ; if buf addr>=cur com+2 then jl. a27. ; goto no core error; al.w1 d0. ; set address of fpnames; rx.w1 e29. am h10+h76-h55 rx.w1 h55. ; save(fp interrupt instruction); rs.w1 e37. ; insert(goto after interrupt); al.w1 f8. al w1 x1+2 ; set table references; al w0 x1+0 wa w0 x1+0 rs w0 x1+0 sh.w1 f9. jl. -10 al.w1 e38. ; wa.w1 e38. ; set param addr reference; rs.w1 e38. am -2000 ; al.w1 h21.+2000 ; rs.w1 g60. ; g60:=h21; rs.w1 g61. ; g61:=h21; rl.w2 g13. ; if word(g13)=0 <=> sn w2 0 ; no left side in call of do jl. j0. ; then goto restore; am -2000 ; al.w1 h19.+2000 ; rs.w1 g60. ; g60:=h19 jl.w3 h79. ; terminate cur prog zone; rl.w3 e9. ; al w3 x3-512 ; am -2000 ; rs.w3 h80.+2+2000; insert share addr in sh descr; al w0 1<1+1 ; jl.w3 h28. ; connect output; sn w0 0 ; if no error then jl. j0. ; goto restore; ; error: jl.w3 g41. ; error text; al w2 48 ; w2:= wa w2 0 ; error cause+48; jl.w3 h26.-2 ; outchar current; jl.w3 g23. ; outchar(<sp>); rl.w0 g13. ; outtext jl.w3 h31.-2 ; call-name; jl.w3 g22. ; outchar <nl>; jl. g28. ; end program(sorry); j0: al.w3 a34. ; restore variables; jl. d19. ; goto do; i.e. h.r.e4.+8*f1+1 w.e9: e8. ; save addr e10: 0 ; buf addr e11: 0 ; cur com e23: 0 ; fp base e29: jl. f10-h10-h76; fpnames , goto after interrupt e12: 0 ; operator , write base , slang addr e13: 0 ; word , write addr , instruction e14: 0 ; base , write top , slang mode e15: 0 ; xy index , next addr e16: 0 ; step , value , begin name e39=e16+1 e17: 0 ; value index , text addr , end name e18: 0 ; old operator , niveau , skip level e19: 0,r.f5 ; repeat(niveau) e20: 0 ; written 0 ; addr(niveau) e21: 0 ; shift(niveau) e22: 0,r.f3*3-2 ; index(niveau) d5. ; last action table addr e24: d4. ; last output table addr d3. ; last format table addr d2. ; last word table addr f8=e24-4 f9=e24+2 e25: 0 ; next delim e26: 0,r.f5 ; procedure(number) e27: 0 ; w or z e28: 0 ; write index e30: 0 ; saved link e31: 0 ; saved link e32: 0 ; saved link e34: <: <127>:> <:al.:> e35: <:w2(:> e36: <:x1+:> e33: -2 ; repeat niveau e37: 0 ; saved fp interrupt instruction e38: g10. ; param addr reference ; procedure lookup word(index,wz,xy,operator,special,other name); ; call: exit: ; w0 exit ; w1 index ; w2 unchanged ; w3 link unchanged; b.j1 ; begin w.d10: rl.w0(g16.) ; word:= word(param); rs.w0 d2. ; word table(last):= word; al w1 -2 ; index:= -2; j0: ; next word: al w1 x1+2 ; index:= index+2; se.w0(x1+d1.) ; if word<>word table(index) then jl. j0. ; goto next word; rs.w1 e17. al.w1 x1+d1. ; text addr:= index+word table start; rx.w1 e17. sl w1 32 ; if index>=32 then jl. j1. ; goto not variable; sl w1 16 ; return:= if index>=16 then al w3 x3+2 ; xy else wz; sl w1 16 ; if index>=16 then al w1 x1-16 ; index:= index-16; sl w1 8 ; if index>=8 then al w1 x1+2 ; index:= index+2; jl x3+0 ; goto return; j1: ; not variable: al w1 x1-32 ; index:= index-32; sh w1 30 ; if index<=30 then jl x3+4 ; goto operator; al w1 x1-32 ; index:= index-32; sh w1 6 ; if index<=6 then jl x3+6 ; goto special; jl x3+8 ; goto other name i.e. ; end; ; procedure lookup format(index,sorry); ; procedure lookup output(index,sorry); ; procedure lookup action(index,sorry); ; call: exit: ; w0 -1 ; w1 index ; w2 pointer ; w3 link destroyed; b.j3 ; begin w.d11: am 2 ; last:= last addr(format, output, d12: am 2 ; or action table); d13: dl.w1 e24. ; entry:= first addr(format, output, ds.w0 e31. ; or action table); al w3 x1+0 ; next entry: j0: al w3 x3+2 ; entry:= entry+2; rl.w2 g16. ; pointer:= param; al w1 x3+0 ; index:= entry wa w1 x1+0 ; +word(entry); rs.w1 e17. ; text addr:= index; j1: rl w0 x1+0 ; test word: se w0(x2+0) ; if word(index)<>word(pointer) then jl. j2. ; goto not equal; al w2 x2+2 ; pointer:= pointer+2; al w1 x1+2 ; index:= index+2; jl. j1. ; goto test word; j2: ; not equal: se w0 -1 ; if word(index)<>-1 then jl. j0. ; goto next entry; sl.w1(e31.) ; if index>=last then jl. (e30.) ; goto sorry; rl.w3 g10. j3: rs.w3 g10. ; while pointer>=param addr+2 do ba w3 x3+1 ; param addr:= param addr sl w2 x3+2 ; +byte(param addr+1); jl. j3. rl.w3 e30. jl x3+2 ; end; i.e. ; procedure stack pointer; ; call: exit: ; w0 unchanged ; w1 destroyed ; w2 unchanged ; w3 link unchanged; w.d14: rl.w1 e33. ; begin al w1 x1+2 ; niveau:= repeat niveau+2; sl w1 2*f5 ; if niveau>=2*repeat niveaus then jl. a1. ; goto list; rs.w1 e33. ; repeat niveau:= niveau; rs.w3 x1+e19. ; rl.w3 g10. ; repeat(niveau):= param addr rx.w3 x1+e19. ; jl x3+0 ; end; ; procedure next param(end list,space integer, ; space name,point name,point integer); ; procedure list and next param(end list,space integer, ; space name,point name,point integer); ; call: exit: ; w0 length ; w1 destroyed ; w2 param ; w3 link next delim; b.j2 ; begin w.d15: rs.w3 e30. ; next param entry: jl. j1. ; get param d16: rs.w3 e30. ; or j0: am g52-g50 ; list and next param entry: j1: jl.w3 g50. ; list param jl. (e30.) ; (end list); rs.w3 e25. ; save(next delim); sn w1 8 ; if delim=8 then jl. j2. ; goto point; rl.w1 e30. ; if length=4 then sn w0 4 ; goto space integer; jl x1+2 jl x1+4 ; goto space name; j2: rl.w1 e30. ; point: se w0 4 ; if length<>4 then jl x1+6 ; goto point name; jl x1+8 ; goto point integer i.e. ; end; ; procedure write item; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed; b.j6 ; begin w.d17: rs.w3 e32. dl.w2 e14. al w2 x2-1 sl w1 0 ; if write addr<0 sl w2(116) ; or write top-1>=core top then jl. a28. ; goto core addr error; al w3 0 ; niveau:= 0; jl. 4 ; if false then j0: jl. a29. ; goto format error; rl.w1 e22. ; index:= format index; ; j0+4: ; new niveau: rs.w1 x3+e22. ; index(niveau):= index; ; j0+6: ; repeat compound: rl.w1 x3+e22. ; index:= index(niveau); al w1 x1+2 ; addr(niveau):= index+2; ; j0+10: ; repeat compound word: al w2 -18 ; shift(niveau):= -18; jl. j2. ; goto next format; ; j0+14: ; old niveau: al w3 x3-6 ; niveau:= niveau-6; sh w3 -6 ; if niveau<=-6 then jl. (e32.) ; goto exit; j1: dl.w2 x3+e21. ; next format: j2: rl w0 x1+0 ; word:= word(addr(niveau)); ls w0 x2+0 ; word:= word shift shift(niveau); la.w0 c5. ; format:= word(18:23); sh w0 4 ; if format<=4 then jl. j3. ; goto test format; al w2 x2+6 ; shift(niveau):= shift(niveau)+6; sh w2 0 ; if shift(niveau)<=0 then jl. j3. ; goto test format; al w1 x1+2 ; addr(niveau):= addr(niveau)+2; al w2 -18 ; shift(niveau):= -18 j3: ds.w2 x3+e21. ; test format: rs.w3 e18. sl w0 f2 ; if format>=first compound then jl. j6. ; goto compound; rl w2 0 ; value:= word(write addr); rl.w0(e13.) ; rs.w0 e16. ; sl w2 5 ; if format>=5 then al.w3 j5. ; w3:=link j5 bl.w2 x2+4 ; case format of b0: jl. x2 ; begin h. j0+0-b0 ; 0: goto format error; j0+4-b0 ; 1: goto new niveau; j0+6-b0 ; 2: goto repeat compound; j0+10-b0 ; 3: goto repeat compound word; j0+14-b0 ; 4: goto old niveau; b5-b0 ; 5: write word; b6-b0 ; 6: write bytes; b7-b0 ; 7: write text; b8-b0 ; 8: write octets; b9-b0 ; 9: write sixtets; b10-b0 ; 10: write octal; b11-b0 ; 11: write binary; b12-b0 ; 12: write new line; b13-b0 ; 13: write empty; b14-b0 ; 14: write index; b15-b0 ; 15: write double; b16-b0 ; 16: write name; b17-b0 ; 17: write procname; b18-b0 ; 18: write procnames; b19-b0 ; 19: write code; b20-b0 ; 20: write words5; b21-b0 ; 21: write bytes10; w.j5: rl.w3 e18. ; end; jl. j1. ; goto next format; j6: am (0) ; compound: al w1 -64 ls w1 1 ; index:= format index table(format); al.w1 x1+d0. wa w1 x1+0 ; niveau:= niveau+6; al w3 x3+6 sl w3 f3*6 ; if niveau>=format niveaus*6 then jl. a26. ; goto niveau error; jl. j0.+4 ; goto new niveau; ; exit: i.e. ; end; ; procedure save variables; ; procedure restore variables; ; call: exit: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link unchanged; b.j0 ; begin w.d18: al.w1 e0. ; save variables entry: rl.w2 e9. ; from:= w0 addr; jl. j0. ; to:= save addr; d19: rl.w1 e9. ; goto move; al.w2 e0. ; restore variables entry: j0: rl w0 x1+0 ; from:= save addr; rs w0 x2+0 ; to:= w0 addr; al w1 x1+2 ; move: al w2 x2+2 ; word(to):= word(from); se.w1(e10.) ; from:= from+2; sn.w2(e10.) ; to:= to+2; jl x3+0 ; if to<>buf addr and from<>buf addr then jl. j0. ; goto move i.e. ; end; ; procedure skip block(begin name,end name); ; call: exit: ; w0 begin name destroyed ; w1 end name destroyed ; w2 destroyed ; w3 link destroyed; b.j3 ; begin w.d20: rs.w3 e31. ; ds.w1 e17. ; al w0 1 ; skip level:= 1; rs.w0 e18. ; skip: j0: jl.w3 d15. ; next param( jl. a4. ; terminate, jl. j0. ; skip, jl. j1. ; space name, jl. j0. ; skip, jl. j0. ; skip); j1: rl w0 x2+0 ; space name: sn.w0(j3.) ; if name=<:go:> then jl. j0. ; goto skip; sn.w0(e16.) ; if name=begin name then jl. j2. ; goto increase level; se.w0(e17.) ; if name<>end name then jl. j0. ; goto skip; am -2 ; skip level:= skip level-2; j2: al w1 1 ; increase level: wa.w1 e18. ; skip level:= skip level+1; rs.w1 e18. ; sl w1 1 ; if skip level>=1 then jl. j0. ; goto skip jl. (e31.) ; j3: <:go:> ; i.e. ; end; ▶EOF◀