|
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: 22272 (0x5700) Types: TextFile Names: »outvar3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »outvar3tx «
; fgs 1987.07.09 algol 6 record procedures for variable length page 1 ; ; 2 segments ; first segment contains changevar, outvar and checkvar ; second segment contains invar b. g1, i6 ; g0, g1 are used by insertproc ; as address of first and last tail. ; i-names (may be changed to anything ; but g0, g1 and h-names) ; are used to define entries ; and externals for tail part s. d2, j35, a22, b4, c3 ; segment start w. k=10000, h. ; d-names are used to define numbers ; of abs words and points ; j-names are used to define rs entry numbers ; a-names are used to define addresses on this segment ; b-names are used to define constants ; c-names are used to define working locations i0: d2 , d1 ; rel of last point, rel of last abs word ; for mnemotecnic reasons j-names ; corresponds to rs entry numbers j3: 3 , 0 ; rs entry reserve j4: 4 , 0 ; rs entry take expression j5: 5 , 0 ; rs entry goto point j7: 7 , 0 ; rs entry end uv expression j12: 12 , 0 ; rs variable uv j13: 13 , 0 ; rs variable last used j18: 18 , 0 ; rs entry zone alarm j21: 21 , 0 ; rs entry general alarm j29: 29 , 0 ; rs entry param alarm j30: 30 , 0 ; rs variable saved stack ref, saved w3 d1=k-2-i0 ; abs word j35: 35 , 0 ; rs variable outblock d2=k-2-i0 ; abs words and points w. i1: 0 ; number of externals 0 ; number of owns s3 ; date s4 ; time ; ;after evaluation of the parameters, the stack is utilized as follows: ; x2+ 6: block change<12+call type ; x2+ 8: zone address (unchanged) ; x2+10: record length as in a.firstword ; x2+12: address of a(0) \f ; fgs 1982.10.05 algol6 record procedures for variable length page 2 i2: am 1 ; entry changevar: calltype:=2 i3: al w1 1 ; entry outvar: calltype:=1 rl. w2 (j13.) ; w2:=lastused ds. w3 (j30.) ; saved lastused:=last used rl w3 x2+8 ; rl w0 x3+h3+4 ; if oldlength=0 wa w0 2 ; and calltype=2 sn w0 2 ; then al w1 1 ; calltype:=1; sn w3 (x2+12) ; if first param=second param then al w1 x1+2 ; calltype:=calltype+2 bl w0 x3+h1+1 ; rs w1 x2+6 ; save block change, call type; se w0 4 ; if (kind = area process sn w0 6 ; or kind = disc process) and se w1 4 ; call type = 4 then jl. a1. ; begin rl w0 x3+h3+2 ; rem:=lastbyte ws w0 x3+h3 ; -recbase am (x3+h3) ; -z.firstword ws w0 2 ; sl w0 0 ; if rem<0 then jl. a1. ; begin ac w1 (x3+h3+4) ; jl. w3 (j3.) ; reserve reclength for stack rl w3 x2+8 ; al w1 x1-1 ; rs w1 x2+12 ; recbase:=workplacebase:=newstacktop-1 rs. w1 c2. ; c2:=workplacebase al w2 x1 ; w2:=workplacelast wa w2 x3+h3+4 ; rl w1 x3+h3 ; wa w1 x3+h3+4 ; w3:=recordlast al w3 x1 ; a0: rl w1 x3 ; rs w1 x2 ; workplace:=record al w2 x2-2 ; al w3 x3-2 ; sl. w2 (c2.) ; jl. a0. ; dl. w3 (j30.) ; reset stackpointer ; end rl w3 x2+8 ; al w0 0 ; rs w0 x3+h3+4 ; z.reclength:=0; rl w3 x2+12 ; w3:=recbase; jl. a22. ; goto compute reclength; a1: al w0 0 ; so w1 1 ; if calltype=2 or calltype=4 then rs w0 x3+h3+4 ; z.reclength:=0; \f ; fgs 1987.07.09 algol 6 record procedures for variable length page 3 al w1 2.11111 ; kind := la w1 x2+10 ; kind of sec. param; sh w1 23 ; if kind > 23 <*zone *> sh w1 18 ; or kind <= 18 <*integer array*> then jl. w3 (j29.) ; goto param alarm; sn w1 23 ; if kind = 23 <*zone record*> then jl. a2. ; skip index check; al w3 (x2+12) ; w3=array descr ba w3 x2+10 ; w3=dope addr al w1 1 ; index=1 sh w1 (x3) ; if lower limit>=1 then jl. w3 (j18.) ; indexalarm(1); a2: rl w3 (x2+12) ; rs w3 x2+12 ; save recbase; a22: rl w1 x3+2 ; compute reclength: w1:=a.firstword sl w1 4 ; if w1<4 jl. a3. ; se w1 0 ; and w1<>0 then jl. w3 a17. ; goto reclength alarm a3: sz w1 1 ; if reclength is odd then al w1 x1+1 ; reclength:=reclength+1 rs w1 x2+10 ; rl w3 x2+8 ; w3:=zone addr. al w1 6 ; zonestate:=6 rx w1 x3+h2+6 ; w1:=oldzonestate se w1 (x3+h2+6) ; if zonestate<>oldzonestate then jl. a7. ; goto just after open al w0 0 ; hs w0 x2+6 ; blockchange:=false rl w0 x3+h3+4 ; wa w0 x3+h3+0 ; rs w0 x3+h3+0 ; recordbase:=recordbase+recordlength ws w0 x3+h3+2 ; w0:=recordbase-lastbyte sl w0 0 ; if w0>=0 then jl. a6. ; goto change block a4: rl w1 x3+h3+2 ; get record: ws w1 x3+h3+0 ; w1:=lastbyte-recordbase sn w1 0 ; if w1=0 then jl. a6. ; goto change block ws w1 x2+10 ; w1:=w1-length sh w1 -1 ; if w1<0 then jl. a5. ; goto test blockchange rl w0 x2+10 ; recordlenght:=reclength rs w0 x3+h3+4 ; rs. w1 (j12.) ; result:=w1 jl. a12. ; goto continue a5: bl w0 x2+6 ; test blockchange: w0:=blockchange se w0 0 ; if blockchange then jl. a16. ; goto block alarm a6: al w0 -1 ; change block: blockchange:=true hs w0 x2+6 ; jl. a8. ; goto outblock a7: ; just after open: se w1 0 ; if oldstate<>after open then jl. a18. ; goto zonestate alarm al w1 -1 ; hs w0 x2+6 ; blockchange:=true; jl. a4. ; goto get record \f ; fgs 1982.10.05 algol 6 record procedures for variable length page 4 a8: bz w0 x3+h1+1 ; outblock: sl w0 4 ; sl w0 8 ; jl. a11. ; if kind=bs then al w0 0 ; begin rl w1 x3+h3+0 ; zerofill block tail al w1 x1+1 ; jl. a10. ; a9: rs w0 x1 ; al w1 x1+2 ; a10: sh w1 (x3+h3+2) ; jl. a9. ; end; a11: rl w1 x3+h0+4 ; w1:=used share bz w0 x3+h1+1 ; last addr of transfer(used share):= se w0 4 ; (if kind = area process sn w0 6 ; or kind = disc process then lastbyte else am 2 ; recordbase) - 1 rl w0 x3+h3+0 ; bs. w0 1 ; rs w0 x1+10 ; al w0 x3 ; w0:=zone addr<4 ls w0 4 ; rl. w1 j35. ; jl. w3 (j4.) ; call rs outblock ds. w3 (j30.) ; saved last used:=last used rl w3 x2+8 ; w3:=zone addr jl. a4. ; goto get record a12: al w3 (x2+8) ; continue: al w1 (x3+h2+2) ; bl w0 x2+7 ; sz w0 1 ; skipnext if changevar al w1 x1+1 ; ia(11):=ia(11)+1 rl w0 x2+10 ; w0:=reclength sn w0 0 ; skipnext if recordlength<>0 al w1 x1-1 ; ia(11):=ia(11)-1 rs w1 x3+h2+2 ; sn w0 0 ; skipnext if recordlength<>0 jl. w3 (j7.) ; end uv expr rl w3 (x2+8) ; rs. w3 c3. ; c3:=addr z(0) rl w0 x2+12 ; rl w1 x2+10 ; ds. w1 c2. ; c1:=addr a(0) \f ; rc 1973.07.06 algol 6 record procedures for variable length page 5 al. w2 (c2.) ; w2:=reclength am. (c3.) ; rs w2 2 ; w2:=z.firstword:=reclength al w3 x2+3 ; chechsum:=reclength+3 a13: sh w2 6 ; jl. a14. ; if w2<=6 then goto last am. (c1.) ; loop: dl w1 x2 ; w0.w1:=a.w2 am. (c3.) ; ds w1 x2 ; z.w2:=a.w2 am (0) ; al w3 x3 ; checksum:=checksum+w0 am (2) ; al w3 x3 ; checksum:=checksum+w1 al w2 x2-4 ; w2:=w2-4 jl. a13. ; a14: se w2 6 ; if reclength mod 4<>0 then jl. a15. ; begin am. (c1.) ; rl w1 6 ; am. (c3.) ; rs w1 6 ; z.word3:=a.word3 am (2) ; al w3 x3 ; checksum:=checksum+word3 ; end; a15: lx. w3 b4. ; beware of overflow al w3 x3+1 ; checksum:=-checksum am. (c3.) ; rs w3 4 ; z.secword:=checksum dl. w3 (j30.) ; rs. w2 (j13.) ; jl. w3 (j7.) ; end uv expr b0: <:<10>block :> ; b1: <:<10>rec len:> ; b2: <:<10>z.state:> ; b3: <:<10>checklen:> ; b4: -1 ; constant -1 a16: wa w1 x2+10 ; alarm(<:block:>,blocklength) am b0-b1 ; a17: am b1-b2 ; alarm(<:rec len:>,reclength) a18: am b2-b3 ; alarm(<:z.state:>,oldstate) a19: al. w0 b3. ; alarm(<:checklen:>,reclength) jl. w3 (j21.) ; \f ; rc 1976.06.23 algol 6 record procedures for variable length, page ...6... i4: ; entry checkvar: rl. w2 (j13.) ; w2:=lastused ds. w3 (j30.) ; saved last used:=last used al w3 (x2+8) ; am (x3+h3) ; rl w1 2 ; w1:=z.firstword sl w1 4 ; if reclength<4 or se w1 (x3+h3+4) ; z.firstword<>reclength then jl. w3 a19. ; generalalarm(<:checklen:>,z.firstword); am (x3+h3) ; rl w0 4 ; rs. w0 (j12.) ; uv:=old checksum al w3 (x2+8) ; al w1 (x3+h3) ; al w1 x1+4 ; rs. w1 c1. ; c1:=addr z.secword al w1 (x3+h3) ; wa w1 x3+h3+4 ; w1:=addr z.reclength al w3 (x3+h3+4) ; w3:=reclength a20: sn. w1 (c1.) ; for w1:=reclength step -2 until 4 do jl. a21. ; begin am (x1) ; al w3 x3 ; w3:=w3+z.w1 al w1 x1-2 ; w1:=w1-2 jl. a20. ; end a21: lx. w3 b4. ; w3:=-(checksum+3) al w3 x3-2 rs. w3 (c1.) ; z.secword:=checksum jl. w3 (j7.) ; c1: 0 ; move from base c2: 0 ; reclength c3: 0 ; addr z(0) ; empty room for 13 instructions h. r.i0.+505 ; fill rest of segment with zeros w. <:ch/outvar :> ; alarm text i.e. ; end of segment m. rc 1987.07.09 changevar, outvar, checkvar text \f ; rc 06.07.73 algol 6 record procedure for variable length page 7 ; segment 2 ; this segment contains invar s. d2, j34, b4, a13 ; segment start w. k=10000, h. ; d-names are used to define numbers ; of abs words and points ; j-names are used to define rs entry numbers ; a-names are used to define addresses on this segment ; b-names are used to define constants i5: d2 , d1 ; rel of last point, rel of last abs word ; for mnemotecnic reasons j-names ; corresponds to rs entry numbers j3: 3 , 0 ; rs entry reserve j4: 4 , 0 ; rs entry take expression j5: 5 , 0 ; rs entry goto point j7: 7 , 0 ; rs entry end uv expression j12: 12 , 0 ; rs variable uv j13: 13 , 0 ; rs variable last used j21: 21 , 0 ; rs entry general alarm j30: 30 , 0 ; rs variable saved stack ref, saved w3 d1=k-2-i5 ; abs word j34: 34 , 0 ; rs variable inblock d2=k-2-i5 ; abs words and points b0: 16 , b1 ; appetite blockproc, rel return to invar w. b4: -1 ; constant -1 \f ; rc 76.06.23 algol 6 record procedure for variable length, page ...8... w. i6: ; entry invar: rl. w2 (j13.) ; w2:=last used ds. w3 (j30.) ; saved last used:=last used b1=k-i5 a0: rl w3 x2+8 ; w3:=zone addr al w1 5 ; zonestate:=5; rx w1 x3+h2+6 ; w1:=oldstate se w1 (x3+h2+6) ; if oldstate<>newstate then jl. a5. ; goto just after open rl w0 x3+h3+0 ; wa w0 x3+h3+4 ; rs w0 x3+h3+0 ; recordbase:=recordbase+recordlength a1: rl w1 x3+h3+2 ; get record: ws w1 x3+h3+0 ; w1:=lastbyte-recordbase sl w1 1 ; if w1>0 then jl. a8. ; goto continue a2: al w0 x3 ; inblock: ls w0 4 ; w0:=zone addr<4 rl. w1 j34. ; jl. w3 (j4.) ; call rs inblock ds. w3 (j30.) ; saved last used:=last used rl w3 x2+8 ; w3:=zone addr jl. a1. ; goto get record a5: ; just after open: se w1 0 ; if oldzonestate<>after open then jl. a6. ; goto zonestate alarm jl. a2. ; goto inblock b2: <:<10>z.state:> ; a6: al. w0 b2. ; alarm(<:z.state:>,oldstate) jl. w3 (j21.) ; a8: ; continue: rs w1 x3+h3+4 ; reclength:=remaining am (x3+h3) ; rl w0 2 ; w0:=z.firstword sn w0 0 ; if z.firstword=0 jl. a0. ; goto repeat \f ; rc 1974.08.23 algol 6 procedure for variable length page 9 a9: rl w1 x3+h3+4 ; w1:=remaining; ba. w0 1 ; if w0 is odd ls w0 -1 ; then ls w0 1 ; w0:=w0+1; sl w0 4 ; if w0<4 sl w0 x1 ; or w0>remaining al w0 x1 ; then b:=w0:=remaining; rs w0 x3+h3+4 ; reclength:=b; ws w1 x3+h3+4 ; remaining:=remaining-b; rs. w1 (j12.) ; uv:=remaining; am (x3+h3) ; rl w1 2 ; if z.firstword se w0 x1 ; <>b then jl. a12. ; goto call blockproc rl w1 x3+h2+2 ; sl w1 0 ; if -,checksum then jl. a13. ; goto finis am (x3+h3) ; rl w0 4 ; rs w0 x2+6 ; stack(6):=old checksum al w3 (x2+8) ; al w1 (x3+h3) ; al w1 x1+4 ; rs. w1 b3. ; b3:=addr z.secword al w1 (x3+h3) ; wa w1 x3+h3+4 ; w1:=addr z.reclength al w3 (x3+h3+4) ; w3:=reclength a10: sn. w1 (b3.) ; for w1:=reclength step -2 until 4 do jl. a11. ; begin am (x1) ; al w3 x3 ; w3:=w3+z.w1 al w1 x1-2 ; w1:=w1-2 jl. a10. ; end a11: lx. w3 b4. ; beware of overflow al w0 x3-2 ; w0:=-(checksum+3) sn w0 (x2+6) ; jl. a13. ; if checksum ok then goto finis a12: al w1 -22 ; call blockproc: jl. w3 (j3.) ; reserve 22 bytes for stack rs w2 x1 ; newstack0:=w2 of call al. w3 (i5.) ; w3:=seg table addr this segment al. w0 (b0.) ; w0:=appetite, rel return ds w0 x1+4 ; store return information dl w0 x2+8 ; ds w0 x1+8 ; move formals of z al w3 26 ; kind of s and b = integer al w0 x1+18 ; addr of s ds w0 x1+12 ; store formals of s rs w3 x1+14 ; store 1. formal of b rl w3 x2+8 ; w3:=zone descriptor al w0 x1+20 ; rs w0 x1+16 ; 2. formal b rl w0 x3+h3+4 ; rs w0 x1+20 ; b:=reclength; al w0 1 ; ls w0 11 ; rs w0 x1+18 ; s=1<11 dl w1 x3+h4+2 ; w0.w1:=description blockproc ls w0 4 ; w0:=stackref<4 jl. w3 (j5.) ; goto point jl. a0. ; end call of blockproc \f ; rc 09.05.72 algol 6 record procedure for variable length page 10 a13: rl w3 x2+8 ; finis: al w1 (x3+h2+2) ; al w1 x1+1 ; rs w1 x3+h2+2 ; ia(11):=ia(11)+1 jl. w3 (j7.) ; end uv expression b3: 0 ; working loc ; empty room for 141 instructions h. r.i5.+505 ; fill rest of segment with zeros w. <:invar <0><0><0>:> ; alarm text i.e. ; end of segment m. rc 1976.06.23 invar text \f ; tails h. g0: ; first tail 0 , 2 ; area entry with 2 segments 0 , r.8 ; fill 2048 , i2-i0 ; entry point changevar w. 3<18+41<12+8<6 ; integer type proc, sec. param undefined, 0 ; first param zone h. 4 , i1-i0 ; code proc, start external list 2 , 0 ; 2 segments, no bytes in permanent store 2048 , 4 ; modekind=backing store 0 , r.8 ; fill 2048 , i3-i0 ; entry point outvar w. 3<18+41<12+8<6 ; integer type proc, sec param undefined 0 ; first param zone h. 4 , i1-i0 ; code proc, start external list 2 , 0 ; 2 segments, no bytes in permanent store 2048, 4 ; modekind = backing store 0 , r.8 ; fill 1<11+1 , i6-i5 ; entry point invar on segment 2 w. 3<18+8<12 ; integer type proc, param zone 0 ; h. 4 , i1-i0 ; code proc, start external list 2 , 0 ; 2 segments, no bytes in permanent store g1: ; last tail 2048 , 4 ; modekind=backing store 0 , r.8 ; fill 2048 , i4-i0 ; entry point checkvar w. 3<18+8<12 ; integer type proc, param zone 0 ; h. 4 , i1-i0 ; code proc, start external list 2 , 0 ; 2 segments, no bytes in permanent store m. rc 1987.07.09 varprocs i. ; id list \f ▶EOF◀