|
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: 14592 (0x3900) Types: TextFile Names: »tremoveupdi «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »tremoveupdi «
(removeupdi=slang list.no removeupdi end) ; procedure removeupdi ( name ); ; undefined name ; ; ; flemming biggas april 1988. ; flemming biggas januar 1988. ; flemming biggas august 1985. ; ; b.h100 dummy block fpnames ; b. g1, e5 w. k=10000 d. p.<:fpnames:> l. s. c20 w. b. j100 j0=3 ; 3 externals h. c1:e5:c2 , c3 ; head word j1: 0 , 1 ; own core: result j13: j0+13 , 0 ; rs entry last used j29: j0+29 , 0 ; rs entry param alarm j30: j0+30 , 0 ; rs entry saved stack ref j3: j0+3 , 0 ; rs entry reserve j6: j0+6 , 0 ; rs entry end register express. j4: j0+4 , 0 ; rs entry take expression j16: j0+16 , 0 ; rs entry segment table base j21: j0+21 , 0 ; rs entry general alarm j61: 1<11+1 , 0 ; segment table address next segment c2=k-2-c1 c3=k-2-c1 w. e0: 3 ; 3 externals 0 ; 0 own bytes <:open:>,0,0, 1<18+19<12+41<6+19 , 8<18+0 <:close:>,0,0, 1<18+18<12+8<6+0 , 0 <:startfilei:>, 1<18+8<12+0 , 0 s3,s4 ; end external list b. a40, b40 , f40 ; local names w. ; organization of stack extension during call: f0 = + 0 ; saved stack ref; f1 = f0 + 2 ; mess operation f2 = f1 + 2 ; mess first address f3 = f2 + 2 ; mess last address f4 = f3 + 2 ; mess segment number f5 = f4 + 2 ; answer status f6 = f5 + 2 ; answer remaining words f7 = f6 +14 ; docname f8 = f7 +10 ; start i/o area f9 = f8+510 ; top i/o area f10= f9+2 ; zone descriptor address (<>0 if param=zone) f11= f10+2 ; last used (after reserve) f12= f11-f0+2; no of halfwords to reserve in stack b0: 0,r.10 ; area for lookup entry b3: 0 ; saved return in check b18: <:<32><32><32>:>; mask for non zero chars b15: 2.11111; mask for kind b16: 0 ; saved segment table entry of string point; b17: 0 ; saved relative of string point; b19: 6<12+23; param=zone b21: 3<12+0; input b22: 5<12+0; output b24: <:<10>upd.mark:> b25: <:<10>lookup :> b26: <:<10>kind :> b27: <:<10>contents:> b28: <:<10>z.state :> b29: <:<10>reserve :> b30: <:<10>status :> e1: rl. w2 (j13.) ; get last used ds. w3 (j30.) ; save stackref al w1 -f12 ; reserve room for i/o e.t.c. in stack jl. w3 (j3.) ; init stack for i/o: rs w1 x1+f11 ; save stack top; rs w2 x1+f0 ; save stack ref from call; al w2 x1+f8 ; first address; rs w2 x1+f2 ; al w2 x1+f9 ; last address; rs w2 x1+f3 ; ld w0 100 ; rs w0 x1+f4 ; segno:= 0; ds w0 x1+f7+2 ; docname(1):= 0; ds w0 x1+f7+6 ; docname(2):= 0; rs w0 x1+f7+8 ; name table address:=0; rs w0 x1+f10 ; zone descriptor address := 0; a2: rl. w1 (j13.) ; get param: w1:= last used; rl w2 x1+f0 ; get param: w2:= saved stackref; dl w1 x2+8 ; w0w1:= first formal la. w0 b15. ; isolate kind sn w0 24 ; if string variable jl. a1. ; goto string; sn w0 8 ; if expression then jl. a0. ; goto take expression dl w1 x2+8 ; if param<>zone then sn. w0 (b19.) ; jl. a10. ; jl. w3 (j29.) ; call param alarm a0: dl w1 x2+8 ; string expression: jl. w3 (j4.) ; take expression; ds. w3 (j30.) ; save stack ref; a1: dl w0 x1 ; string: sh w3 -1 ; if layout string then jl. w3 (j29.) ; goto param error; sh w0 -1 ; if short string then jl. a6. ; jl. w1 a3. ; save and check; jl. a0. ; goto take expression; a6: zl w0 6 ; string point: w0:= segno; ls w0 1 ; rl. w2 (j16.) ; w2:= segm table (segno); wa w2 0 ; rs. w2 b16. ; save segm table entry zl w2 7 ; w2:= relative string point; a5: rl. w3 (b16.) ; next portion: w3:= address (relative string point); hs. w2 3 ; modify next address with relative string point; dl w0 x3+0 ; w3w0:= string portion; sh w0 -1 ; if point then jl. a6. ; goto string point; jl. w1 a3. ; save and check; al w2 x2-4 ; relative := relative -4; jl. a5. ; goto next portion; 0,0 ; return address,saved w2; a3: ds. w2 a3.-2 ; save and check: rl. w1 (j13.) ; w1:= stack reference; rl w2 x1+f7 ; if docname (1) = real <::> then sn w2 0 ; am -4 ; docname(1):= w3w0 else ds w0 x1+f7+6 ; docname(2):= w3w0; la w3 0 ; if end of text then so. w3 (b18.) ; jl. a4. ; goto check entry dl. w2 a3.-2 ; jl x1 ; else return; a10: rl. w3 (j13.) ; zone parameter: rs w1 x3+f10 ; rl w2 2 ; w2:=zone descriptor rl w1 x2+h2+6 ; if zone state<>10 then sn w1 +10 ; alarm (z.state); jl. +6 ; al. w0 b28. ; jl. w3 (j21.) ; rl. w3 (j13.) ; w3:= saved stack ref; al w2 x2+h1+2 ; for i:= 1, 2 do dl w1 x2+2 ; docname(i):= z.docname(i); ds w1 x3+f7+2 ; dl w1 x2+6 ; ds w1 x3+f7+6 ; ; a4: rl. w3 (j13.) ; check entry: al w3+x3+f7 ; al. w1 b0. ; jd 1<11+42; lookup entry se w0 0 ; if -, found then jl. a20. ; goto alarm (not found) else rl. w0 b0. ; if not area then sh w0 0 ; goto alarm (not area) jl. a21. ; else zl. w0 b0.+16 ; if content key<>22 then se w0 22 ; jl. a22. ; goto alarm (contents); jd 1<11+52; create (area process); jd 1<11+8 ; reserve (process); se w0 0 ; if ok.no then jl. a23. ; goto alarm (reserve); rl. w0 b21. ; operation:=input; rl. w1 (j13.) ; w1:= last used; rs w0 x1+f1 ; al w0 0 ; segno := 0; rs w0 x1+f4 ; jl. w3 a31. ; send and check rl. w3 (j13.) ; w3:= last used; rl w2 x3+f2 ; w2:=buffer start rl w1 x2 ; al w1 x1+147 ; al w1 x1-1 ; as w1 -9 ; al w1 x1+1 ; w1 := segno of update mark sn w1 0 ; if <> current segment then jl. a12. ; begin rs w1 x3+f4 ; segno:=w1; jl. w3 a31. ; send and check a12: rl. w3 (j13.) ; w3:= last used; rl w2 x3+f2 ; w2:=buffer start; rl w1 x2+14 ; w1:=update mark rs. w1 (j1.) ; result:=w1; sh w1 +1 ; if w1>1 then jl. a13. ; al. w0 b24. ; alarm(w1,updatemark); jl. w3 (j21.) ; a13: al w1 0 ; delete update mark rs w1 x2+14 ; rl. w0 b22. ; operation:=output; rs w0 x3+f1 ; jl. w3 a31. ; send and check rl. w3 (j13.) ; w3:= last used; rl w2 x3+f10 ; w2:= zone param (<>0 = yes) al w1 +f12 ; release bytes from stack jl. w3 (j3.) ; sn w2 0 ; if w2=<>0 then jl. a14. ; begin comment zone param; rl. w0 b19. ; w0:= first formal zone param; al w1 x2 ; w1:= zone descr. address; rl. w3 (j61.) ; w3 segment table address jl x3+c8 ; goto rel c8 on next segment ; end a14: rl. w3 (j13.) ; remove process: al w3 x3+f7 ; jd 1<11+64; al w0 0 ; rl. w1 (j1.) ; w0w1:=result; jl. (j6.) ; return a20: al. w1 b25. ; jl. a30. ; a21: al. w1 b26. ; jl. a30. ; a22: al. w1 b27. ; jl. a30. ; a23: al. w1 b29. ; jl. a30. ; a30: rx w1 0 ; jl. w3 (j21.) ; alarm a31: rs. w3 b3. ; save and check: save return ; rl. w3 (j13.) ; al w1 x3+f1 ; w1 := address (mess area); al w3 x3+f7 ; w3 := address (docname); jd 1<11+16 ; send message ; rl. w3 (j13.) ; al w1 x3+f5 ; w1 := address (answer area); jd 1<11+18 ; wait answer; rl w2 0 ; status := al w0 1 ; 1 < result ls w0 x2 ; if normal answer then sn w0 2 ; status := status lo w0 x1 ; or answer.status; se w0 2 ; if status <> 0 then jl. a32. ; goto status_alarm; rl w2 x1+2 ; rl. w3 b3. ; w3 := return; sn w2 512 ; if halfwords = 512 then jl x3 ; goto return else jl. a31. ; goto repeat; a32: rl w1 0 ; status alarm: w1 := status; al. w0 b30. ; jl. w3 (j21.) ; general alarm (<:status:>, w1); i.e. ; end a and b names e. ; end j names c4: c.c4-c1-506 m.code segment 0 too long z. c.502-c4+c1,jl -1,r. 252-(:c4-c1:)>1 z. <:removeupdi0:> \f k=10000 b. j100 j0=3 ; 3 externals h. c5: c6 , c7 ; rel last point,rel last abs word j1: 0 , 1 ; result j3: j0+3 , 0 ; rs entry reserve j4: j0+4 , 0 ; rs entry take expression j6: j0+6 , 0 ; rs entry end register expression j13: j0+13 , 0 ; rs entry last used j30: j0+30 , 0 ; rs entry saved stack ref c7=k-2-c5 j70: 1 , 0 ; 1st external open j71: 2 , 0 ; 2nd external close j72: 3 , 0 ; 3rd external startfilei c6=k-2-c5 b. a20, b20 w. 0 b0: 0, r.10 c8=k-c5 rs w1 4 ; at entry w0w1=formals descr. zone param al w1 -10 ; reserve ( 10 bytes ) jl. w3 (j3.) ; during create call formals are saved in w0 and w2; al w3 x2 ; w2,w3:= zone formals from call; rl w2 0 ; stack+0 : formal 1 zone param ds w3 x1+2 ; stack+2 : formal 2 - - al w2 +25 ; stack+4 : formal 1 boolean rs w2 x1+4 ; stack+ 6: address boolean al w2 x1+8 ; stack+ 8: boolean := rs w2 x1+6 ; 0 ( false ) al w0 0 ; rs w0 x1+8 ; al w0 x1 ; w0 = stack ref ls w0 4 ; ls 4 rl. w1 j71. ; w1 = point (close); dl. w3 (j30.) ; jl. w3 (j4.) ; ds. w3 (j30.) ; al w1 10 ; release from stack jl. w3 (j3.) ; rl. w2 (j13.) ; w2 = last used al w1 -38 ; reserve 38 bytes jl. w3 (j3.) ; in stack dl w0 x2+8 ; w3w0 = formals zone ds w0 x1+2 ; stack+ 2: formals zone rl w2 0 ; w2:= zone descr. al w2 x2+h1+4 ; w2 = zonedescr.name dl w0 x2 ; w3w0 := zone.name(1); ds w0 x1+24 ; stack+24: name(1); dl w0 x2+4 ; w3w0 := zone.name(2); ds w0 x1+28 ; stack+28: name(2); al w3 26 ; stack+6: formals integer al w0 x1+18 ; ds w0 x1+6 ; al w0 +4 ; integer := 4; rs w0 x1+18 ; al w3 +4 ; dope address=4 ls w3 +12 ; formal 1:= dope address < 12 al w3 x3+19 ; + 19 al w0 x1+32 ; ds w0 x1+10 ; al w3 +26 ; stack+14: formals intger al w0 x1+16 ; ds w0 x1+14 ; al w0 +0 ; intger := 0; rs w0 x1+16 ; al w3 x1+29 ; array description al w0 x1+21 ; ds w0 x1+32 ; al w3 +8 ; al w0 +0 ; ds w0 x1+36 ; rs w0 x1+20 ; al w0 x1 ; w0 stack ref ls w0 +4 ; rl. w1 j70. ; w0w1 := point open; dl. w3 (j30.) ; jl. w3 (j4.) ; ds. w3 (j30.) ; al w1 38 ; jl. w3 (j3.) ; release bytes in stack al w2 x1 ; w2:=param stack al w1 -4 ; reserve 4 bytes in stack jl. w3 (j3.) ; dl w0 x2+8 ; transfer zone param to ds w0 x1+2 ; new stack dl. w3 (j30.) ; al w0 0 ; rl. w1 j72. ; w0w1 := point startfilei jl. w3 (j4.) ; call startfilei; ds. w3 (j30.) ; al w1 4 ; release stack jl. w3 (j3.) ; al w0 0 rl. w1 (j1.) ; w0w1:=result jl. (j6.) ; c9: c.c9-c5-506 m.code segment 1 too long z. c.502-c9+c5,jl -1, r.252-(:c9-c5:)>1 z. <:removeupdi1<0>:> e. ; end a20,b20 block i.e. i.e. w. g0:g1: 2 ; 2 segments on disc 0,0,0,0 ; room for docname 1<23+e1-e5 ; entry point on segment 0 3<18+41<12,0 ; integer procedure, one param:undefined 4<12+e0-e5 ; algol procedure, start external list 2<12+2 ; 2 code segments, 2 bytes in own core m.removeupdi 4.0 (sw8201/1 15.2) fb.1988.02.11 d. p.<:insertproc:> end ▶EOF◀