|
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: 45312 (0xb100) Types: TextFile Names: »activity3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »activity3tx «
; jz.fgs 1981.05.25 compile activity algol 8, activity, page 0 ; fp commands: ; (activity = slang text ; activity newactivity passivate activate wactivity) ; finis) b. e11, g1 w. ; begin block insertproc k=10000 ; d. p. <:fpnames:> l. s. c10,d9, f0 w. ; begin slang segment e10 = 0 ; segmentno := 0; f0 = 20 ; table size (=no of halfs in activitytable entry) \f ; jz 1979.008.08 declare/new_activity algol 8, activity, page 1 ; segment 0 (1) b. a18, b112, g3 w. ; k=10000 , g0=0 ; h. ; e11: ; segment base b0: g1 , g2 ; rel of last point , rel of last absword b2: 1<11 o. 1 , 0 ; ref to segment 1 b3: g0 + 3, 0 ; rs entry 3: reserve b4: g0 + 4, 0 ; rs entry 4: take expression b6: g0 + 6, 0 ; rs entry 6: end register expression b13: g0 + 13, 0 ; rs entry 13: last used b23: g0 + 23, 0 ; rs entry 23: youngest zone b30: g0 + 30, 0 ; rs entry 30: saved sref, saved w3 b61: g0 + 61, 0 ; rs entry 61: (csr, cza) b66: g0 + 66, 0 ; rs entry 66: store words at virtual storage b74: g0 + 74, 0 ; rs entry 74: max last used b75: g0 + 75, 0 ; rs entry 75: limit last used b76: g0 + 76, 0 ; rs entry 76: temp last used b77: g0 + 77, 0 ; rs entry 77: current activity (table entry address) b78: g0 + 78, 0 ; rs entry 78: no of activities b79: g0 + 79, 0 ; rs entry 79: base of activity table b80: g0 + 80, 0 ; rs entry 80: aref (sref for activity decl block) b81: g0 + 81, 0 ; rs entry 81: top of program b82: g0 + 82, 0 ; rs entry 82: sref,segtabaddr for latest activate/new b83: g0 + 83, 0 ; rs entry 83: relative of return - - - - b84: g0 + 84, 0 ; rs entry 84: check passivate b85: g0 + 85, 0 ; rs entry 85: current activity no b86: g0 + 86, 0 ; rs entry 86: current stack bottom b90: g0 + 90, 0 ; rs entry 90: (disable,enable) entry points b91: g0 + 91, 0 ; rs entry 91: trapchain g2 = k - 2 - b0 ; define rel of last absword b1: 1<11 o. 1, d2 ; entry point at segment 1 (passivate2) b110:1<11 o. 2, d6 ; entry point segment 2 (release activities); g1 = k - 2 - b0 ; define rel of last point w. e0: 0, 0, s3, s4 ; start external list: empty, date and time \f ; jz 1979.08.08 declare activity (1) algol 8, activity, page 2 ; segment 0 (2) e1 = 1<23 + e10<12 + k - b0 ; entry point: activity rl. w2 (b13.) ; activity: ds. w3 (b30.) ; (saved sref, saved w3) := (last used, segbase); rl. w0 b1. ; rs(entry passivate2) := am. (b84.) ; entry point next segment rs w0 -2 ; (passivate2); rl. w1 (b80.) ; w1 := aref; se w1 0 ; if aref <> 0 then jl. a2. ; goto alarm2; dl w1 x2+8 ; take integer parameter: so w0 16 ; if expression then jl. w3 (b4.) ; take expression; ds. w3 (b30.) ; (saved sref, saved w3) := lastused,segbase; rl w1 x1 ; check param: sl w1 1 ; if value(param) < 1 sz. w1 (b100.) ; or value(param) >= 2**18 then jl. a1. ; goto alarm1; rs. w1 (b78.) ; no of activities := value(param); wm. w1 b112. ; reserve activity table: ac w1 x1+6 ; appetite := -no of activities*table_size - 6; jl. w3 (b3.) ; reserve; ds. w3 (b30.) ; save sref,w3; rl w3 x2 ; block(call sref) . last used := al w1 x1+6 ; last used + 6; rs w1 x3-2 ; aref := rs. w3 (b80.) ; call sref; dl w0 x2+2 ; move return information: ds w0 x1+2-6 ; move return information bz w0 x2+5 ; from old stack top to rs w0 x1+4-6 ; new top; appetite:=0; \f ; jz 1979.08.08 declare activity (2) algol 8, activity, page 3 ; segment 0 (3) al w1 x1-f0 ; base activity table := rs. w1 (b79.) ; last used + 6 - table_size; al w0 0 ; clear activity table: al w1 x1+f0 ; a0: rs w0 x1 ; for i:= last used + 6 al w1 x1+2 ; step 2 until sh w1 x2+4 ; old top + 4 jl. a0. ; do core(i) := 0; al w0 x2-h4 ; init azone: am. (b80.) ; azone := rs w0 -2 ; azone address := old last used - h4; rl. w1 (b23.) ; rs w1 x2+4 ; azone.chain := youngest zone; rs. w0 (b23.) ; youngest zone := azone; al w0 -6 ; azone.block proc := rl. w1 b110. ; entry point(segment 2, ds w1 x2+2 ; release activities); al w0 x1+d8 ; al w1 x1+d9 ; rsentry(89) := entry point(segment 2,disable); ds. w1 (b90.) ; rsentry(90) := entry point(segment 2,enable ); jl. (b6.) ; goto end register expression; b100:2.1111<18 ; \f ; jz.fgs 1982.09.15 new activity (1) algol 8, activity, page 4 ; segment 0 (4) e2 = 1<23 + e10<12 + k - b0 ; entry point: new_activity rl. w2 (b13.) ; new activity: ds. w3 (b30.) ; (saved sref,saved w3):=(last used,segbase); rl w1 x2 ; check level: rl. w0 (b80.) ; w0 := aref (sref for activity decl block); se w0 x1 ; if aref <> call sref then jl. a9. ; goto level alarm; rl w1 x2+14 ; check third param: sz w1 2.11111 ; if kind(third param) <> procedure then jl. a13. ; not procedure: goto proc alarm; dl w1 x2+8 ; take first param: so w0 16 ; if expression then jl. w3 (b4.) ; take expression; ds. w3 (b30.) ; (saved sref,w3):=(last used,segbase); rl w1 x1 ; activity no := rs w1 x2+8 ; rl. w3 (b78.) ; check mode: sh w3 0 ; if neutral or activity mode jl. a10. ; then goto mode alarm; sh w1 x3 ; check activity no: sh w1 0 ; if activity no > no of activities jl. a11. ; or activity no < 1 then goto activityno alarm; wm. w1 b112. ; get activity table entry address: wa. w1 (b79.) ; current activity := rs. w1 (b77.) ; activityno*table_size + base of activity table; \f ; jz.fgs 1982.09.15 new activity (2) algol 8, activity, page 5 ; segment 0 (5) rl w3 x1+4 ; check state: al w1 -1 ; w1 := -1; rl w0 x2+8 ; w0 := act_no; se w3 0 ; if current activity.last used <> 0 then jl. (b6.) ; not empty: goto end register expression; al. w3 b0. ; take second param: dl w1 x2+12 ; w3 := segment base; so w0 16 ; if expression then jl. w3 (b4.) ; take expression; ds. w3 (b30.) ; (saved sref,w3):=(last used,segbase); rl w1 x1 ; w1 := shared virtual := value(param); sn w1 0 ; if shared virtual = 0 then jl. a5. ; goto init resident; rl. w3 (b78.) ; init virtual: sh w1 x3 ; if shared virtual > no of activities sh w1 0 ; or shared virtual < 1 then jl. a14. ; goto virtual alarm 1; wm. w1 b112. ; get shared virtual: wa. w1 (b79.) ; shared virtual := rs w1 x2+12 ; table_size*shared virtual + base of activity table; rl. w0 (b77.) ; sn w0 x1 ; if shared virtual = current activity then jl. a3. ; goto ego virtual; rl w3 x1+0 ; shared virtuals: rl w0 x1+6 ; se w3 0 ; if shared virtual.first core = 0 sh w0 0 ; or shared virtual.virtual <= 0 then jl. a16. ; goto virtual alarm2; \f ; jz.fgs 1982.09.13 new activity (3) algol 8, activity, page 6 ; segment 0 (6) rl w3 x3-2 ; save pending virtual: ac w1 (x3+8) ; if pending virtual.state = 2 then sn w1 -2 ; begin state := -2; goto waiting pending end; jl. a17. ; rl w1 x3+4 ; pending virtual:=(shared virtual.first core-2); rl w0 x3+2 ; w1 := pending virtual.last used; ws w0 2 ; w0 := pending virtual(oldlastused-lastused); rl w2 x3+6 ; w2 := pending virtual.virtual; sl w2 1 ; if w2 < 1 sh w1 0 ; or w1 <= 0 then jl. a15. ; goto update; jl. w3 (b66.) ; store words at virtual storage; a15: rl. w2 (b13.) ; update: rl. w1 (b77.) ; w2 := last used; w1 := current activity; rl w3 x2+12 ; w3 := shared virtual; dl w0 x3+2 ; (w3,w0) := shared virtual.(first c,old last u); rx w0 x1+2 ; swap(w0,current act.old last used); rx w3 x1+0 ; swap(w3,current act.first core); ws w0 6 ; curr act size := cuurent act.(oldlu-firstc); rl w3 x1+2 ; shared size := ws w3 x1+0 ; shared virtual.(oldlu-firstc); sh w0 x3-1 ; if curr act size < shared size then jl. a4. ; goto set new virtual; a3: rl w0 x1+6 ; ego virtual: sh w0 0 ; if current activity.virtual <= 0 then a4: al w0 -1 ;set new virtual: rs w0 x1+6 ; current activity.virtual := -1; \f ; jz.fgs 1982.09.15 new activity (4) algol 8, activity, page 7 ; segment 0 (7) a5: rl. w1 (b77.) ; init resident: al w3 x2+6 ; restore w1; ba w3 x2+4 ; w3 := top formals = top literals := rs. w3 b103. ; last used + 6 + appetite(call); rs. w3 b102. ; rl w0 x1+0 ; sh w0 0 ; if current activity.first core <= 0 jl. a7. ; then goto fresh init; rs. w3 (b76.) ; reinitialize: rl. w0 b76. ; temp last used := w3; rs. w0 (b81.) ; top of program := addr(temp last used); rl w3 x1+2 ; topointer := w3 := bs w3 x2+4 ; current act.oldlu - appetite(call)+5-6; al w3 x3+5-6 ; al w2 x2+5 ; from pointer := last used + 5; a6: al w3 x3+4 ; next param: al w2 x2+4 ; topointer := topointer + 4; sl. w2 (b102.) ; frompointer := frompointer + 4; jl. a8. ; if frompointer >= top literals then dl w1 x2 ; goto end param; ds w1 x3 ; core(topointer) := core(frompointer); sl. w2 (b103.) ; if frompointer >= top literals then jl. a6. ; goto next param; la. w0 b105. ; kind := kindword(param) extract 5; sl w0 17 ; if kind < 17 sn w0 23 ; or kind = 23 jl. a6. ; then goto next param; sl w1 x2 ; if addressword (param) < frompointer sl. w1 (b102.) ; or addressword (param) >= top literals then jl. a6. ; then goto next param; sh. w1 (b103.) ; if addressword (param) <= top formals then rs. w1 b103. ; top formals := addressword (param); ws w1 4 ; wa w1 6 ; core(topointer) := rs w1 x3 ; core(topointer)-frompointer+topointer; jl. a6. ; goto next param; \f ; jz 1979.11.03 new activity (5) algol 8, activity, page 8 ; segment 0 (8) a7: rs w3 x1+2 ; fresh init: rl. w0 b13. ; current activity.oldlu := upper; rs. w0 (b81.) ; top of program := addr(last used); a8: rl. w3 (b78.) ; end param: ac w3 x3 ; no of activities := -no of activities; rs. w3 (b78.) ; <* mode := activity mode *> rl. w1 (b77.) ; w1 := current activity; rl. w2 (b13.) ; w2 := last used; dl w0 x2+2 ; save return: ds. w0 (b82.) ; move return information rl w0 x2+4 ; from old stack top to rs. w0 (b83.) ; running system variables; rl w0 x2+8 ; rs activityno := rs. w0 (b85.) ; saved activity no; rl w0 x1+0 ; max last used := rs. w0 (b74.) ; current activity.first core; rl w3 x1+2 ; w3 := current activity.old last used; bs w3 x2+4 ; limit last used := al w3 x3-6+18 ; last used := rs. w3 (b13.) ; current activity.old last used rs. w3 (b75.) ; - appetite(call) - 6 + 18; \f ; jz 1979.11.03 new activity (5a) algol 8, activity, page 8a rl w0 x1+2 ; current stackbottom := w2 := rs. w0 (b86.) ; current activity.old last used; rl. w0 (b23.) ; current activity.youngest zone := rs w0 x1+10 ; youngest zone; dl. w0 (b61.) ; current activity.(csr,cza) := ds w0 x1+14 ; (csr,cza); rl. w0 b101. ; al w3 0 ; youngest zone := 1 shift 22; rs. w0 (b23.) ; ds. w0 (b61.) ; (csr,cza):=(0,1 shift 22); rl. w0 (b91.) ; rs w0 x1+16 ; current activity.trapchain := trapchain; rl. w3 (b75.) ; rl. w2 (b80.) ; w2 := aref; dl w1 x3-2 ; (w0,w1):= formal(param3); <*procedure*> jl. w3 (b4.) ; take expression; rl. w3 (b2.) ; return via final end: jl x3+d0 ; goto next segment(passivate0); a17: ws. w3 (b79.) ; waiting pending: ld w0 -24 ; wd. w0 b112. ; w0 := activity no(pending virtual); jl. (b6.) ; goto end register expression; \f ; jz.fgs 1982.09.22new activity (6) algol 8, activity, page 9 ; segment 0 (9) b112: f0 ; table size b102 = e0 ; top literals (located in unused start external list) b103 = e0 + 2 ; top formals ( - do - ) b105: 2.11111; mask for kind check b101: 1<22; initial youngest zone; a9: am c3 ; level alarm: a2: ; alarm2: +decl alarm: a10: am c4 ; mode alarm: a16: am c8 ; virtual alarm2: a13: am c7 ; proc alarm: a1: ; index alarm: a11: ; activity no alarm: a14: al w0 c5 ; virtual alarm 1: a18: rl. w3 (b2.) ; call next segment: jl x3+c0 ; goto next segment(alarm0); g3: c. g3-b0-506 m. code too long, segment 0 z. c. 502-g3+b0, jl-1, r. 252 - (:g3-b0:) > 1 z. <:activity:>, 0 e. ; end segment 0 e10 = e10 + 1 ; segment := segment + 1; m. jz 1982.09.15 declare/new activity , segment 0 \f ; jz.fgs 1982.09.15 activate,passivate,resume algol 8, activity, page 10 ; segment 1 (1) b. a19, b111, g2 w. ; k=10000, g0 = 0 ; h. ; b0: g2, g1 ; segment base: rel of last poinr, rel of last absword b3: g0 + 3, 0 ; rs entry 3: reserve b4: g0 + 4, 0 ; rs entry 4: take expression b6: g0 + 6, 0 ; rs entry 6: end register expression b12: g0 + 12, 0 ; rs entry 12: uv b13: g0 + 13, 0 ; rs entry 13: last used b21: g0 + 21, 0 ; rs entry 21: general alarm b23: g0 + 23, 0 ; rs entry 23: youngest zone; b30: g0 + 30, 0 ; rs entry 30: saved sref, saved w3 b61: g0 + 61, 0 ; rs entry 61: (csr,cza) b65: g0 + 65, 0 ; rs entry 65: load words from virtual storage b66: g0 + 66, 0 ; rs entry 66: store words at virtual storage b74: g0 + 74, 0 ; rs entry 74: max last used b75: g0 + 75, 0 ; rs entry 75: limit last used b76: g0 + 76, 0 ; rs entry 76: temp last used b77: g0 + 77, 0 ; rs entry 77: current activity (table entry address) b78: g0 + 78, 0 ; rs entry 78: no of activities b79: g0 + 79, 0 ; rs entry 79: base of activity table b80: g0 + 80, 0 ; rs entry 80: aref (sref for activity decl block) b81: g0 + 81, 0 ; rs entry 81: top of program b82: g0 + 82, 0 ; rs entry 82: (sref,segtabaddr) for activate/new act b83: g0 + 83, 0 ; rs entry 83: relative of return - - - - - b85: g0 + 85, 0 ; rs entry 85: activity no b86: g0 + 86, 0 ; rs entry 86: current stack bottom b87: g0 + 87, 0 ; rs entry 87: temp stack bottom b91: g0 + 91, 0 ; rs entry 91: trapchain b110: 0, 7 ; own core: kill activity (working location) g1 = k - 2 - b0 ; define rel of last absword g2 = k - 2 - b0 ; define rel of last point w. ; \f ; jz.fgs 1982.09.13 passivate (1) algol 8, activity, page 11 ; segment 1 (2) a2: am 1 ; passivate2: cause := 2 else a1: am 1 ; passivate1: cause := 1 else a0: am 3 ; passivate0: cause := 0 else al w0 -3 ; passivate-3: cause := -3 (from alarm seg 1) d0=a0-b0, d1=a1-b0, d2=a2-b0 e3 = 1<23 + e10<12 + d1 rl. w2 (b13.) ; w2 := last used; ds. w3 (b30.) ; (saved sref,saved w3):=(w2,segment base); rl. w3 (b78.) ; check mode: rl. w1 (b85.) ; sl w1 0 ; if disable mode sl w3 0 ; or no of activities >= 0 then jl. a10. ; goto mode alarm; rl. w3 (b77.) ; w3 := current activity; sh w0 0 ; if cause <- 0 then al w2 0 ; last used := 0; rs w2 x3+4 ; current activity.last used := last used; rl w2 0 ; saved cause := w2 := cause; sh w0 0 ; if cause <= 0 then al w0 0 ; cause := 0; rs w0 x3+8 ; current activity.state := cause; rl w0 x3+0 ; w0 := current activity. first core; se w0 0 ; if current activity.first core <> 0 then jl. a6. ; goto check virtual; rl w1 x3+2 ; first init: oldlu := last used; rx. w1 (b13.) ; last used := current activity.oldlastused; rx. w1 (b75.) ; oldlim:=limit last used; limit last used:=oldlu; ws w1 x3+2 ; appetite := oldlim - current activity.oldlastused; sn w0 (x3+6) ; if current activity.virtual <> 0 then jl. a19. ; begin as w1 -9 ; appetite := as w1 9 ; appetite//512*512; a19: ; end; al w1 x1-2 ; appetite := appetite - 2; jl. w3 (b3.) ; reserve(appetite); rs. w3 (b30.) ; saved w3 := return from reserve; rs. w1 (b76.) ; temp last used := last used; \f ; jz.fgs 1982.09.15 passivate (2) algol 8, activity, page 12 ; segment 1 (3) rl. w3 (b80.) ; w3 := aref; rs w1 x3-2 ; block(aref).last used := last used; rl. w3 (b77.) ; w3 := current activity; al w0 x1+2 ; current activity.first core := rs w0 x3+0 ; last used + 2; a6: rl w1 x3+6 ; check virtual: sl w1 0 ; if current activity.virtual >= 0 then jl. a7. ; goto return; rl w0 x3+2 ; w1 := appetite := ws w0 x3+0 ; current activity.(oldlastused-first core); jl. w3 (b66.) ; reservebs(appetite); <* note that w1<0 at this point *> rl. w3 (b77.) ; w3 := current activity; rs w1 x3+6 ; current activity.virtual:= virt.addr.area; a7: am (x3+0) ; return: rs w3 -2 ; core(current activity.first core - 2) := al w0 0 ; current activity; rs. w0 (b74.) ; max last used := 0; rl. w1 (b85.) ; ds. w2 (b12.) ; uv := (activity no,cause); jl. w2 a15. ; swop; rl. w3 (b87.) ; current stack bottom := rs. w3 (b86.) ; temp stack bottom; rl. w3 (b78.) ; ac w3 x3 ; no of activities := -no of activities; rs. w3 (b78.) ; <* mode := monitormode *> rl. w1 (b76.) ; rs. w1 (b13.) ; last used := temp last used; rl. w1 b13. ; rs. w1 (b81.) ; top of program := addr(last used); rl. w0 (b83.) ; hs. w0 b100. ; rel of return := saved rel of return; al w1 0 ; rs. w1 (b85.) ; activity no:=0; rl. w1 b12. ; w1 := address(uv); dl. w3 (b82.) ; (w2,w3):=(saved sref,segtabaddr); rl w3 x3 ; w3 := abs(segbase); b100=k+1; rel of return; jl x3+0 ; return to monitor; \f ; jz.fgs 1981.05.25 activate (1) algol 8, activity, page 13 ; segment 1 (4) e4 = 1<23 + e10<12 + k - b0 ; entry point: activate rl. w2 (b13.) ; activate: ds. w3 (b30.) ; (saved sref,w3) := (last used,segbase); dl w1 x2+8 ; take parameter: so w0 16 ; if expression then jl. w3 (b4.) ; take expression; ds. w3 (b30.) ; (saved sref,w3):=(last used,segbase); rl w1 x1 ; kill_activity := rs. w1 (b110.) ; value(param); sh w1 0 ; if value(param) <= 0 then ac w1 x1 ; activity no := -value(param) else rs w1 x2+8 ; activity no := value(param); rl. w3 (b78.) ; check mode: max := no of activities; rl. w0 (b85.) ; w0 := rs activity no; sl w0 0 ; if disable mode sn w3 0 ; or no of activities = 0 <* neutral mode *> then jl. a10. ; goto mode alarm; sh w3 0 ; if no of activities < 0 <*activity mode*> then ac w3 x3 ; max := -no of activities; sh w1 x3 ; check activity no: sh w1 0 ; if activity no > max jl. a11. ; or activityno <= 0 then goto index alarm; wm. w1 b104. ; get table entry address: wa. w1 (b79.) ; activity := base + tablesize(activityno); rl. w3 (b78.) ; check mode: rl w0 x1+4 ; w0:=current activity.last used; sh w0 0 ; if current activity.last used <= 0 jl. a9. ; then goto return; sl w3 1 ; if no of activities >=0 <*monitor mode*> then jl. a16. ; goto called in monitor mode; \f ; jz.fgs 1981.05.25 activate(1a) algol 8, activity, page 13a rl. w3 (b77.) ; called in activity mode: ; w3 := current activity; rl w0 x3+0 ; check new: sh w0 0 ; if old activity.first core <= 0 jl. a10. ; then goto mode alarm; <*act. not initialized*> rs w2 x3+4 ; old activity.last used := last used; rs. w1 (b77.) ; current activity := activity; jl. w2 a15. ; swop; rl. w2 (b13.) ; restore w2(last used); al w1 3 ; cause := rs w1 x3+8 ; old activity.state := 3; jl. a8. ; goto set cause3; \f ; jz.fgs 1981.05.25 activate (2) algol 8, activity, page 14 ; segment 1 (5) a16: dl w0 x2+2 ; called in monitor mode: ds. w0 (b82.) ; move return information rl w0 x2+4 ; from stack top to rs. w0 (b83.) ; running system variables; rs. w1 (b77.) ; current activity := activity; al w3 x2+6 ; unstack call: ba w3 x2+4 ; rs. w3 (b76.) ; temp last used := last used+6+appetite(call); rl. w0 b76. ; rs. w0 (b81.) ; top of program := addr(temp last used); rl w3 x1+4 ; w3 := curr.activity.last used; rl w1 x1+8 ; cause := curr activity.state; a8: rl. w0 (b85.) ; set cause3: w0 := current activity no; se w1 3 ; if cause <> 3 then dl w1 x3+8 ; curr act.last used(6,8); <* passivate2 *> ds. w1 (b12.) ; call activity: uv := (w0,w1); <* return value *> rl. w1 (b77.) ; <*it is assumed that uv is not spoiled below*> rl w3 x1+0 ; w1 := current activity; sn w1 (x3-2) ; if current act = core(first core-2) then jl. a17. ; goto set core resident; am (x3-2) ; pending virtual: ac w1 (+8) ; w1 := -pending virtual.state; sn w1 -2 ; if w1 = -implicit passivate then jl. a14. ; goto waiting pending; a17: rl. w1 (b77.) ; core resident: rs. w3 (b74.) ; w1 := current activity; rl w0 x2+8 ; max lastused := curr act.first core; rs. w0 (b85.) ; current activity no := saved activity no; rl w2 x1+4 ; w2 := last used := rs. w2 (b13.) ; current activity.last used; rl w0 x1+2 ; current stack bottom := rs. w0 (b86.) ; current activity.old last used; sn w1 (x3-2) ; if current activity=curract.firstcore(-2) jl. a13. ; then goto finis; \f ; jz.fgs 1982.09.13 activate(3) algol 8, activity, page 15 ; segment 1 (6) rl w3 x3-2 ; pending virtual: rl w0 x3+2 ; w0 := appetite := ws w0 x3+4 ; pending activity.(oldlastused-lastused); rl w1 x3+4 ; w1 := pending activity.last used; rl w2 x3+6 ; w2 := pending activity.virtual; sl w1 1 ; if pending activity.last used > 0 then jl. w3 (b66.) ; store words at virtual storage; rl. w3 (b77.) ; load virtual: rl w0 x3+2 ; w0 := appetite := ws w0 x3+4 ; current activity.(oldlastused-lastused); rl w1 x3+4 ; w1 := current activity.last used; rl w2 x3+6 ; w2 := current activity.virtual; jl. w3 (b65.) ; load words from virtual storage; a13: rl. w3 (b77.) ; finis: am (x3+0) ; core(current activity.first core-2) := rs w3 -2 ; current activity; jl. w2 a15. ; swop; rl. w3 (b78.) ; set activity mode: sl w3 0 ; no of activities := ac w3 x3 ; if no of activities >= 0 then -no of activities rs. w3 (b78.) ; else no of activities; dl. w1 (b12.) ; (w0,w1) := return value := uv; rl. w3 (b110.) ; sl w3 0 ; if kill_activity > 0 then jl. (b6.) ; goto end register expression; rl. w2 (b13.) ; kill activity: dl w0 x2+4 ; (w3,w0) := (call seg tab,call seg rel); rl w3 x3 ; w3 := segtable(w3); rl w1 x3 ; ref segment(w3); <* may transfer it *> hs. w0 b111. ; segrel := w0; b111 = k + 1 ; seg rel ; al w3 x3+0 ; w3 := segment base + seg rel; al w1 x2 ; w1 := last used; al w2 x2+6 ; unstack call: <* passivate or activate *> ba w2 x2-2 ; last used := last used + 6 rs. w2 (b13.) ; + appetite(call); ds. w3 (b30.) ; (saved sref, saved w3) := (last used, w3); rl w2 x1 ; w2 := w2 of call; al w0 -15 ; w0 := -15; (=> alarm: <:killed:>) jl. (b21.) ; goto general alarm; \f ; jz.fgs 1981.05.25 activity(4) algol 8, activity, page 16 ; segment 1 (7) a9: al w1 -1 ; state return: rl w0 x2+8 ; return := (activity no, -1); jl. (b6.) ; goto end register expression; a14: rl w3 x3-2 ; waiting pending: ws. w3 (b79.) ; ld w0 -24 ; wd. w0 b104. ; w0 := activity no(pending virtual); jl. (b6.) ; goto end register expression; a15: rl. w0 (b23.) ; swop: rx w0 x3+10 ; rs. w0 (b23.) ; swap(youngest zone,curr act.youngest zone); dl. w1 (b61.) ; rx w0 x3+12 ; swap( rx w1 x3+14 ; current activity.(csr,cza), ds. w1 (b61.) ; (csr,cza) dl w1 x3+18 ; swap ( (trapchain, limit last used) , rx. w0 (b91.) ; current activity. rx. w1 (b75.) ; (trapchain, limit last used) ); ds w1 x3+18 ; jl x2 ; return; \f ; jz.fgs 1982.09.15 alarms etc. algol 8, activity, page 17 ; segment 1 (8) b104: f0 ; table_size b107:<:<10>level :> ; b108:<:<10>proc :> ; b109:<:<10>virtual :> ; b101:<:<10>mode :> ; b106: ; param alarm ; b102:<:<10>index :> ; c0 = k - b0 am (0) ; alarm0: (called from segment 0) a10: am b101-b102+1 ; mode alarm: a11: al. w0 b102. ; index alarm: jl. w3 (b21.) ; general alarm(text address); c3=b107-b101, c4=b101-b109, c5=b102-b101-1 c7=b108-b102+1, c8=b109-b108, c10 = a10 - b0 b2: c. b2 - b0 - 506 m. code too long, segment 1 z. c. 502 - b2 + b0, jl-1, r. 252 - (:b2-b0:) > 1 z. <:activity:>, 0 e. ; end segment 1 e10 = e10 + 1 ; segment := segment + 1; m. jz 1982.09.15 passivate, activate segment 1 \f ; jz 1979.08.08 utility algol 8, activity, page 18 ; segment 2 (0) b. a30 , b109, g3 w. ; k=10000 , g0=0 ; h. ; ; segment base b0: g1 , g2 ; rel of last point , rel of last absword b107: 0, 3 ; own core: (saved limit last used,last used) b109: 0, 5 ; own core: level count b4: g0 + 4, 0 ; rs entry 4: take expression b6: g0 + 6, 0 ; rs entry 6: end register expression b13: g0 + 13, 0 ; rs entry 13: last used b21: g0 + 21, 0 ; rs entry 21: general alarm b23: g0 + 23, 0 ; rs entry 23: youngest zone b30: g0 + 30, 0 ; rs entry 30: saved sref, saved w3 b38: g0 + 38, 0 ; rs entry 38: *** used with spare mess buf *** b61: g0 + 61, 0 ; rs entry 61: (csr, cza) b74: g0 + 74, 0 ; rs entry 74: max last used b75: g0 + 75, 0 ; rs entry 75: limit last used b76: g0 + 76, 0 ; rs entry 76: temp last used b77: g0 + 77, 0 ; rs entry 77: current activity (table entry address) b78: g0 + 78, 0 ; rs entry 78: no of activities b79: g0 + 79, 0 ; rs entry 79: base of activity table b80: g0 + 80, 0 ; rs entry 80: aref (sref for activity decl block) b81: g0 + 81, 0 ; rs entry 81: top of program b85: g0 + 85, 0 ; rs entry 85: current activity no b86: g0 + 86, 0 ; rs entry 86: current stack bottom b89: g0 + 89, 0 ; rs entry 89: disable activity b90: g0 + 90, 0 ; rs entry 90: enable activity b108:1<11 o.(:-1:),0; segment 1 reference g2 = k - 2 - b0 ; define rel of last absword b1: 1<11 o. 0, d7 ; entry point: (this segment, terminate release) g1 = k - 2 - b0 ; define rel of last point w. ; \f ; jz 1979.03.27 release activities (1) algol 8, activity, page 19 ; segment 2 (1) b100: 1<22 ; 0 ; b101-2: saved cza b101: 0 ; saved youngest zone b102: 0 ; saved return b103: 0 ; stop d6 = k - b0 ; called from rs(release zones) ; release activities: rs. w2 b102. ; save(return); rl. w1 (b23.) ; change block proc(azone): rl. w0 b1. ; change blockproc(azone) defining second rs w0 x1+h4+2 ; call to: terminate release; al w1 f0 ; w1 := table_size; wm. w1 (b78.) ; stop:=table address(last activity) := wa. w1 (b79.) ; no of activities+base activity table; rs. w1 b103. ; rl. w1 (b79.) ; activity :=table address(activity no 0); a0: sn. w1 (b103.) ; get youngest zone: jl. a7. ; if activity=stop then goto finis3; al w1 x1+f0 ; activity := activity + table_size; rl w3 x1+10 ; yzone := activity.youngest zone; se w3 0 ; if yzone = 0 sl w3 (x1+2) ; or yzone>= activity.old last used jl. a0. ; then goto get youngest zone; am (x1+0) ; se w1 (-2) ; if activity<>core(act.first core-2) then jl. a0. ; goto get youngest zone; rl. w2 (b79.) ; activity1 := table address(activity no 0); a1: sn. w2 (b103.) ; get cza: jl. a2. ; if activity1=stop then goto finis1; al w2 x2+f0 ; activity1:=activity1+table_size; rl w0 x2+14 ; czone := activity1.cza; se w0 0 ; if czone = 0 sl w0 (x2+2) ; or czone >= activity1.old last used jl. a1. ; then goto get cza; am (x2+0) ; se w2 (-2) ; if activity1<>core(act1.firstcore-2) then jl. a1. ; goto get cza; \f ; jz 1979.03.27 release activities (2) algol 8, activity, page 20 ; segment 2 (2) a2: rl w2 0 ; finis1: sn w2 0 ; w2 := czone; rl. w2 b100. ; if czone = 0 then czone := 1 shift 22; ds. w3 b101. ; save yzone and czone; a3: rl w0 x3+h4+4 ; next zone: sl w0 (x1+2) ; yzone1 := yzone.chain to elder; jl. a4. ; if yzone1>=activity.old last used then rl w3 0 ; goto next activity; yzone:=yzone1; se w3 x2 ; if yzone=czone then jl. a4. ; begin <*context zone*> rl w0 x2+h2+2 ; czone1 := czone.oldcza; sh w0 (x1+2) ; if czone1<=activity.old last used then rl w2 0 ; czone := czone1; ; end; a4: sl. w1 (b103.) ; next activity: jl. a5. ; if activity>=stop then goto finis; al w1 x1+f0 ; activity := activity + table_size; rl w0 x1+10 ; yzone1 := activity.youngest zone; se w0 0 ; if yzone1 = 0 sl w0 (x1+2) ; or yzone1 >= activity.old last used then jl. a4. ; goto next activity; am (x1+0) ; se w1 (-2) ; if activity<>core(activ.first core-2) then jl. a4. ; goto next activity; \f ; jz 1979.06.07 release activities (3) algol 8, activity, page 21 ; segment 2 (3) rs w0 x3+h4+4 ; yzone.chain to elder := yzone1; rl w3 0 ; yzone := yzone1; rl w0 x1+14 ; czone1 := activity.cza; sl w0 (x1+2) ; if czone1>= activity.old last used then jl. a3. ; goto next zone; rs w0 x2+h2+2 ; czone.oldcza := czone1; rl w2 0 ; czone := czone1; jl. a3. ; goto next aone; a5: sn. w2 (b100.) ; finis: jl. a6. ; if czone=1 shift 22 then goto finis2; rl. w1 b101.-2 ; w1 := saved cza; rx. w1 (b61.) ; swap(cza,saved cza); rs w1 x2+h2+2 ; czone.oldcza := saved cza; a6: rl. w1 b101. ; finis2: rx. w1 (b23.) ; swap(youngest zone,saved youngest zone); rs w1 x3+h4+4 ; yzone.chain to elder := youngest zone; ; exit: a7: jl. (b102.) ; return to release zones; d7 = k - b0 ; called from release zones (second time) rl. w1 (b23.) ; terminate release: rl w1 x1+h4+4 ; youngest zone:= rs. w1 (b23.) ; youngest zone.chain to elder; rl. w1 b13. ; top of program := rs. w1 (b81.) ; address of last used; al w0 0 ; rs. w0 (b80.) ; aref := 0; rs. w0 (b78.) ; no of activities := 0; (neutral mode); rs. w0 (b85.) ; current activity no := 0; rs. w0 (b89.) ; entry point(disable activity) := 0; rs. w0 (b90.) ; entry point(enable activity) := 0; jl. (b102.) ; return to release zones; \f ; btj 1979.05.04 activity wait (1) algol 8, activity, page 22 ; segment 2(4) b104: f0 ; size of entry in activity table b105: 0-0-0; abs address of last entry in activity table e6 = 1<23 + e10<12 + k - b0 ; entry point: activity wait rl. w2 (b13.) ; activity wait: ds. w3 (b30.) ; (saved sref,w3) := (last used,irrell) dl w1 x2+8 ; take parameter: so w0 16 ; if expression then jl. w3 (b4.) ; take expression; ds. w3 (b30.) ; (saved sref,w3) := (last used,irrell); rs w1 x2+8 ; formal := abs addr of parameter; rl w2 x1 ; w2 := buf := value(parameter); rl. w1 (b78.) ; check mode: sh w1 0 ; if no of activities <= 0 then jl. a30. ; goto mode alarm; wm. w1 b104. ; last entry := no of activities * entry size wa. w1 (b79.) ; + base activity table; rs. w1 b105. ; \f ; jz 1979.09.26 activity wait (2) algol 8, activity, page 23 ; segment 2(5) a15: ; wait next event: jd 1<11+24 ; result :=wait event(buf); sn w0 0 ; if result = message then jl. a25. ; goto take message; am. (b38.) ; if buf = spare message buffer then sn w2 (-6) ; <* nasty addressing, like in 'monitor 24' *> jl. a15. ; goto wait next event; c. +1; if old monitor then include ... rl w0 90 ; if size of message buffer <> 24 then se w0 24 ; jl. a17. ; goto skip search; rl. w1 (b79.) ; w1 := entry := base activity table; al w0 2 ; w0 := allowed activity state; a16: ; compare next: sl. w1 (b105.) ; if entry >= last entry then jl. a24. ; goto take answer; al w1 x1+f0 ; increase(entry); se w0 (x1+8) ; if state(entry) <> waiting for answer then jl. a16. ; goto compare next; rl w3 (x1+4) ; w3 := zone addr := stack(last used(entry)); rl w3 x3+h0+4 ; w3 := share addr := used share(zone); se w2 (x3+0) ; if buf <> share state(share) then jl. a16. ; goto compare next; jl. a20. ; goto activity answer found; a17: ; skip search: z. ; end monitor condition rl w1 x2-2 ; entry := message extension(buf); am. (b78.) ; sh w1 (+0) ; if activity no > no of activities sh w1 0 ; or activity no <= 0 then jl. a24. ; goto take answer; wm. w1 b104. ; entry := activity no * entry size wa. w1 (b79.) ; + base activity table; al w0 2 ; se w0 (x1+8) ; if state(entry) <> waiting for answer then jl. a24. ; goto take answer; rl w3 (x1+4) ; w3 := zone addr := stack(last used(entry)); rl w3 x3+h0+4 ; w3 := share addr := used share(zone); se w2 (x3+0) ; if buf <> share state(share) then jl. a24. ; goto take answer; \f ; btj/jz 1979.07.02 activity wait (3) algol 8, activity, page 24 ; segment 2(6) a20: ; activity answer found: ws. w1 (b79.) ; activity no := (entry - base activity table) al w0 0 ; wd. w1 b104. ; / entry size; ; w1 = activity no ; w2 = buf a21: ; wactivity return: rl. w3 (b13.) ; w3 := last used; rs w2 (x3+8) ; param := buf addr; jl. (b6.) ; end register expression(w1); a24: ; take answer: am -1 ; w1 := -1; <* i.e. notify undef answer *> a25: ; take message: al w1 0 ; w1 := 0; <* i.e. notify a message *> jl. a21. ; goto wactivity return; a30: ; mode error: rl. w3 (b108.) ; jl x3+c10 ; goto mode alarm (segment 1); \f ; jz 1979.07.02 disable activity algol 8, activity, page 25 ; segment 2 (7) b. a3, i2 w. ; begin block: disable/enable d8 = k - b0 - d6 rl. w0 (b109.) ; disable activity: ba. w0 1 ; level count := rs. w0 (b109.) ; level count + 1; rl. w1 (b85.) ; w1 := current act no <* mode *>; sh w0 1 ; if level count > 1 sh w1 0 ; or disable mode or not activity mode jl. (b6.) ; then goto end reg. expression; ac w1 x1 ; current actno := -current actno; rs. w1 (b85.) ; <* mode := disable mode *> rl. w1 (b13.) ; current stack bottom := rs. w1 (b86.) ; last used; rl. w3 (b74.) ; sh w3 0 ; if max last used > 0 then jl. a0. ; begin <* in activate *> rl. w0 (b76.) ; last used := rs. w0 (b13.) ; temp last used; al w0 0 ; max last used := 0; rs. w0 (b74.) ; end; a0: rl. w0 (b75.) ; saved limit last used := limit last used; ds. w1 (b107.) ; saved last used := call last used; rl. w0 b13. ; top of program := rs. w0 (b81.) ; abs address(last used); rl w2 x1 ; exit: dl w0 x1+4 ; hs. w0 i0. ; w2 := call sref; rl w3 x3 ; i0 = k + 1; rel ; jl x3+0 ; return; \f ; jz 1979.07.03 enable activity (1) algol 8, activity, page 26 ; segment 2 (8) d9 = k - b0 - d6 ds. w3 (b30.) ; enable activity: rl. w1 (b107.) ; w1 := saved last used; rl. w0 (b109.) ; check level: bs. w0 1 ; level count := rs. w0 (b109.) ; level count - 1; rl. w3 (b85.) ; w3 := current act no <* mode *>; sn w2 0 ; if called from alarm and disable mode sh w0 0 ; or level count > 0 sl w3 0 ; or not disable mode then jl. a2. ; goto check alarm; ac w3 x3 ; current actno := -current actno; rs. w3 (b85.) ; <* mode := activity mode *> al w3 x2 ; rl. w2 (b107.) ; w2 := saved last used; se w3 0 ; if called from alarm segment 1 jl. a3. ; then goto unstack call; rl. w1 (b13.) ; w1 := last used; dl w0 x1+4 ; ds w0 x2+4 ; move return information rl w0 x1 ; from current stack top rs w0 x2 ; to activity stack top; a3: rs. w2 (b13.) ; unstack call: ; last used := saved last used; rl. w3 (b77.) ; rl w0 x3+0 ; max last used := rs. w0 (b74.) ; current activity.first core; sh w0 0 ; if max last used > 0 then jl. a1. ; <* in activate *> rl. w0 b76. ; top of program := rs. w0 (b81.) ; abs addr of(temp last used); \f ; jz 1979.07.02 enable activity (2) algol 8, activity, page 27 ; segment 2 (9) a1: rl w0 x3+2 ; current stack bottom := rs. w0 (b86.) ; current activity.last core; dl. w1 (b107.) ; limit last used := rs. w0 (b75.) ; saved limit last used; dl. w3 (b30.) ; restore w2; a2: sh w0 -1 ; check alarm: al w2 -1 ; if level count >=0 sn w2 0 ; and w2=0 <*called from program*> jl. (b6.) ; then goto end register expression;; dl w3 x1+2 ; w2 := call sref; rl w3 x3 ; rl w0 x3 ; ba w3 x1+5 ; w3 := call addr; al w1 x1+6 ; last used := rs. w1 (b13.) ; saved last used+6 (<*unstack disable call*>) al w0 0 ; rs. w0 (b109.) ; level count := 0; al. w0 i1. ; w0 := textaddress; jl. (b21.) ; goto general alarm; i1 = k + 1; odd text address to suppress number print <:<10>abled :> ; e. ; end disable/enable \f ; jz 1979.06.25 end segment 2 algol 8, activity, page 28 ; segment 2 (7) g3: c. g3 - b0 - 506 m. code too long, segment 2 z. c. 502 - g3 + b0, jl-1, r. 252 - (:g3 - b0:) > 1 z. <:activity:>, 0 e. ; end segment 2 e10 = e10 + 1 ; segment = segment + 1 e. ; end slang segment m. jz 1979.09.26 disable/enable , release activities , w_activity, segment 2 \f ; jz 1979.11.05 tails for insertproc algol 8, activity, page 29 b. b8 w. ; b0 = e10 ; area length b1 = b0<12 + 8 ; code length<12 + 8 owns b2 = 1<23 + 4 ; shared entry b3 = 4<12+e0-e11 ; algol external<12+start ext list b4 = 1<18+19<12 ; notype procedure(int param) b5 = 5<18+19<12 ; long procedure(int param) b6 = 1<18 ; notype procedure b7 = 5<18+39<12+19<6+19 ; long procedure(integer,integer,general) b8 = 3<18 + 19<12 ; integer procedure(int param) g0: b0, 0,r.4, e1, b4, 0, b3, b1 ; activity(int) b2, 0,r.4, e2, b7, 0, b3, b1 ; new_activity(int,int,general) b2, 0,r.4, e3, b6, 0, b3, b1 ; passivate b2, 0,r.4, e4, b5, 0, b3, b1 ; activate(int) b2, 0,r.4, e6, b8, 0, b3, b1 ; wactivity(int) g1 = k - 20 ; last entry e. ; tails m. jz 1979.11.05 insertproc d. p. <:insertproc:> ▶EOF◀