|
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: 189696 (0x2e500) Types: TextFile Names: »monprocfnc2«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦3b4b74406⟧ »kkmon3filer« └─⟦this⟧ └─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦953993a1e⟧ »kkmon1filer« └─⟦this⟧ └─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦b8ddea98b⟧ »kkmon3filer« └─⟦this⟧
\f m. monprocfnc2 - monitor process functions, part 2 b.i30 w. i0=81 04 06, i1=13 00 00 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; c.i0-a133 c.i0-a133-1, a133=i0, a134=i1, z. c.i1-a134-1, a134=i1, z. z. i10=i0, i20=i1 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 i2: <: date :> (:i15+48:)<16+(:i14+48:)<8+46 (:i13+48:)<16+(:i12+48:)<8+46 (:i11+48:)<16+(:i10+48:)<8+32 (:i25+48:)<16+(:i24+48:)<8+46 (:i23+48:)<16+(:i22+48:)<8+46 (:i21+48:)<16+(:i20+48:)<8+ 0 i3: al. w0 i2. ; write date: rs w0 x2+0 ; first free:=start(text); al w2 0 ; jl x3 ; return to slang(status ok); jl. i3. ; e. j. ; btj 1977.06.07 ; check maincat ; tests the existence of a main catalog ; ; call: m0, <no maincat addr> ; exit: w2 = unchanged ; error exits: goto-action m0: ; check maincat: rl w0 b25 ; se w0 0 ; if maincat docaddr <> 0 then jl. n1. ; skip jl. n5. ; else goto next param; ; check main catalog not on document ; ; call: m1 ; error exits: result 6, if maincat on document m1: ; check maincat not on document: rl. w0 d4. ; se w0 (b25) ; if curdoc <> maincat docaddr then jl. n0. ; next instruction; jl. j6. ; goto result 6; j6=k-2 ; clear maincat ; ; call: m2 m2: ; clear maincat: al w0 0 ; rs w0 b25 ; maincat docaddr := 0; jl. n0. ; next instruction; ; if main-catalog entry then goto <addr> ; ; call: m3, <maincatalog entry addr> ; error return: goto-action 1, if main catalog entry m3: ; test maincat entry: rl w2 b25 ; se. w2 (d4.) ; if curdoc <> maincat docaddr then jl. n1. ; skip; al. w2 d9. ; w2 := maincat pseudo chain; jl. w3 e41. ; compare names (name.work, name.pseudochain); jl. n1. ;+2: not same: skip; bl. w0 v4. ; if first slice.work <> bs w0 x2+f54 ; first slice.pseudochain then se w0 0 ; jl. n1. ; skip; dl. w1 v2. ; if base.work <> sn w0 (x2+f1-f0) ; se w1 (x2+f2-f0) ; base.pseudochain then jl. n1. ; skip; jl. n5. ; goto <main catalog entry>; ; the two following routines terminate the use of the current catalog, ; and selects the new catalog. ; the catalog may either be an auxilliary catalog or the main catalog. ; set auxcat ; ; call: m4 ; error return: result 2, in case of catalog io-error m4: ; set auxcat: jl. e0. ; set auxcat and return; ; set maincat ; ; call: m5 ; error return: result 2, in case of catalog io-error m5: ; set maincat: jl. e1. ; set maincat and return; ; dump chaintable ; ; the chaintable of curdoc is written back on the device ; ; call: m6 ; error return: result 2, in case of io-error m6: ; dump chaintable: jl. e2. ; dump chaintable and return; ; check function mask ; tests that the internal process is allowed to execute the current ; monitor call ; ; call: w1 = sender ; m8, <function bit> ; error exits: result 1, if function bit is not in function mask.internal m8: ; check function mask: jl. w3 n10. ; w0 := bit := next param; bl w3 x1+a22 ; mask := function mask.sender; so w3 (0) ; if bit not contained in mask then jl. j1. ; goto result 1; jl. n0. ; next instruction; ; check privileges ; ; checks that the sender is allowed to manipulate with the catalog-system ; on the current bs-device: ; 1. the sender must be user of the device ; ; call: w2 = chain ; m9 ; error exits: result 4, if not user m9: ; check privs: rl. w1 d2. ; w1 := sender; rl w3 (x2+f62) ; w3 := bs-process (= nametable.nametab addr.chain) ba w3 x1+a14 ; bz w3 x3+a402 ; w3:=userbits.intproc; bz w1 x1+a14+1 ; w1:=idbit.intproc; so w3 x1 ; if idbit.intproc is not on then jl. j4. ; goto result 4; jl. n0. ; next instruction; ; search best entry ; ; call: m10, <not found addr> ; error exits: result 2, if catalog io-error ; result 6, if name format illegal ; goto-action 1, if not found m10: ; search best entry: jl. w3 e46. ; search best entry in catalog; jl. n5. ;+2: not found: goto jl. n1. ; skip ; search best entry and test modification allowed ; ; the best catalog entry is found. if an areaprocess exists for that ; entry, it will be tested that no other process is user (or reserver) ; as specified in parameter ; ; call: m11, <no user/no reserver> ; (no user = 2.0100, no reserver = 2.1000) ; error exits: result 2, if catalog io-error ; result 3, if not found ; result 4, if base.entry is outside maxbase.sender ; result 5, if modification not allowed ; result 6, if nameformat illegal m11: ; search best entry and test modif allowed: jl. w3 e46. ; search best entry; jl. j3. ;+2: not found: goto result 3; ; w0w1 := base.entry rl. w3 d2. ; dl w3 x3+a44 ; w2w3 := maxbase.sender; sl w0 x2 ; if base.entry outside maxbase.sender then sl w1 x3+1 ; jl. j4. ; goto result 4; al w0 0 ; cur proc nametable addr := 0; rs. w0 d11. ; (i.e. no areaprocess found) jl. w3 e43. ; for all area processes with same name do b5 ; b6 ; jl. n1. ;+6: no more: skip ; w0w1 = base.proc, w2 = nametable address of area process, w3 = continue sn. w0 (v1.) ; if base.proc <> base.work then se. w1 (v2.) ; jl x3 ; continue search; ; an area process is found with exact the same base as base.work rs. w2 d11. ; cur proc nametable addr := nametable addr; rl w3 x2 ; w3:=addr(area process description); rl. w1 d2. ; w1:=intproc; jl. w2 e53. ; test user and reserver; jl. w3 n10. ; w0:=2.100 test other users ; 2.1100 test other reservers; so w2 (0) ; if no other users-reservers then jl. n0. ; next instruction; (notice: param is skipped) ; the area process was protected by another internal process jl. j5. ; goto result 5; ; test name format ; ; the format of name.work is tested ; ; call: m13 ; error exits: result 6, if name format illegal m13: ; test name format: jl. e24. ; goto test name format; e24 = k-2 ; stepping stone ; compute namekey ; ; namekey.work is computed and set, according to name.work ; ; call: m14 m14: ; compute namekey: jl. e3. ; compute namekey and return; jl. e1., e1 = k-2 ; test new system name (maybe wrk-name) ; ; the chaintables and the whole nametable and the current catalog ; are scanned in order to check, that (base.work,name.work) does ; not coincide with the already existing names. ; ; (the reason for searching the chaintables too is, that a name, ; once reserved as a document-name, is protected against misuse ; in case of intervention on a disc (in which case the process-name ; is cleared). the name may only be reused by exactly the same ; process or it may be released by means of ..delete bs.. etc. ; this means that procfunc does not have to check with the catalog ; when ..create peripheral process.. is used to restore the name ; of the disc-process ) ; ; if name(0).work = 0 then a wrk-name is generated, which is ; completely unique (i.e. independant of base), and the wrk-name ; is moved to name.work. ; ; call: m15, <overlap addr>, <exact addr> ; error exits: result 2, if catalog io-error ; result 6, if nameformat illegal ; goto-action 1, if overlap ; goto-action 2, if exact (base, name) exists ; generate wrk-name ; ; a wrk-name is generated, which is completely unique (i.e. ; independant of base), ; and the wrk-name is moved to name.work ; ; call: m16, <irrell>, <irrell> ; error exits: result 2, if catalog error ; test new system name (wrk-name not allowed) ; ; function as ..test new system name, wrkname allowed.. except that ; wrk-name is not allowed ; ; call: m17, <overlap addr>, <exact addr> ; error exits: as test new system name b. g30 w. m15: ; test new system name, wrk-name allowed: rl. w0 v5. ; create wrkname := name(0).work = 0; sn w0 0 ; m16: ; generate wrk-name: am -1 ; create wrkname := true; m17: ; test new system name , wrk-name not allowed: al w0 0 ; create wrkname := false; rs. w0 d17. ; ; d17 = 0 : create wrkname == false ; d17 = -1 : create wrkname == true se w0 -1 ; if not create wrk-name then am e24-e23; test name format ; else g0: ; next wrk-name: jl. w3 e23. ; create next wrkname; ; (i.e. maybe generate the next wrk-name) jl. w3 e45. ; find chain (name.work); v5 ; jl. g1. ;+4: not found: goto test in nametable; ;+6: found: dl w1 b45 ; base := catalog interval; jl. w3 g20. ; test overlap; g1: ; test in nametable: jl. w3 e43. ; for all procs in nametable do b3 ; b7 ; jl. g8. ;+6: no more: goto test main catalog; jl. g20. ; goto test overlap and continue; g8: ; test main catalog: rl w0 b25 ; se w0 0 ; if main catalog exists then jl. g10. ; goto test in current catalog; jl. n2. ; skip 2; ; test new catalog name ; ; the current catalog is scanned in order to test that ; (base.work, name.work) do not coincide with any entries ; ; call: m18, <overlap addr>, <exact addr> ; error exits: as ..test new system name.. ; notice: cur entry position is defined at <exact> return m18: ; test new catalog name: jl. w3 e24. ; test format; al w0 0 ; create wrkname := false; rs. w0 d17. ; g10: ; test in current catalog: jl. w3 e42. ; for all named entries in catalog do jl. n2. ;+2: no more: skip 2 (notice params not skipped yet) ; subprocedure test overlap ; if wrkname generated then goto test in nametable ; if overlap then goto first param addr ; if base = base.work then goto second param addr ; ; entry: w0w1 = base.entry(or proc), (maybe w2 = entry), w3 = link ; exit: all regs unchanged g20: ; test overlap: sz. w3 (d17.) ; if create wrkname then jl. g0. ; goto next wrk-name; sh. w0 (v1.) ; if lower base > lower.work then jl. g21. ; begin sh. w0 (v2.) ; if lower base > upper.work sh. w1 (v2.) ; or upper base <= upper.work then jl x3 ; return; i.e. inside base.work or above jl. n5. ; goto overlap-addr; i.e embraces upper.work g21: ; end; sl. w1 (v2.) ; if upper base < upper.work then jl. g22. ; begin sl. w1 (v1.) ; if upper base < lower.work sl. w0 (v1.) ; or lower base >= lower.work then jl x3 ; return; i.e. inside base.work or below jl. n5. ; goto overlap-addr; i.e. embraces lower.work g22: ; end; sn. w0 (v1.) ; if base <> base.work then se. w1 (v2.) ; jl x3 ; return; i.e. contains base.work jl. w3 e48. ; save position; jl. n6. ; goto exact-addr; d17: 0 ; create wrk-name: 0 == false, all ones == true e. ; ; test chain error ; ; tests that the previous call of ..copy chain.. did not ; give any overlap-errors etc ; ; call: m19 ; error exits: result 5, if any errors b. g20, h10 w. m19: ; test chain error: rl. w0 h3. ; sn w0 0 ; if any errors = 0 then jl. n0. ; next instruction; jl. j5. ; goto result 5; ; copy chaintable chain ; ; call: m20 ; error exits: result 5, if chain is too short ; return: w2 = slices m20: ; copy chaintable chain: bz. w1 v26. ; w1 := last slice number; al w1 x1+f0+1+511; bytes := last slice + 1 + size of chainhead + round ls w1 -9 ; w1 := number of segments used for chaintable; al. w3 v27. ; w3 := addr of first slice information; jl. w2 g10. ; copy chain(w1, w3); jl. n0. ;+2: chain ok: next instruction jl. n0. ;+4: chain too long: next instruction jl. j5. ;+6: chain too short: result 5 ; copy chain and cut down ; ; call: m21 ; return: w2 = slices m21: ; copy chain and cut down: rl. w1 v7. ; w1 := size.work; al. w3 v4. ; w3 := addr of first slice information; jl. w2 g10. ; copy chain; jl. n0. ;+2: chain ok: next instruction jl. n0. ;+4: chain too long: next instruction ;+6: chain too short: ; w0 = 0 ; w1 = remaining number of slices without chains ; w2 = irrellevant ; w3 = irrellevant rl. w3 d4. ; w3 := curdoc; wm w1 x3+f64 ; segments := - slices * slicelength ac w1 x1 ; wa. w1 v7. ; + size.work; wd w1 x3+f64 ; slices := segments / slicelength (rounded); se w0 0 ; al w1 x1+1 ; al w2 x1 ; w2 := slices; wm w1 x3+f64 ; rs. w1 v7. ; size.work := slices * slicelength; jl. n0. ; next instruction; ; subprocedure copy chain ; ; copies a chain from senders area into the curdoc chaintable. ; all the new chain-elements in curdoc chaintable must be in ; state = free. ; the chain is copied until: ; 1. a chain addresses outside the chaintable ; or 2. the areasize is reached ; or 3. the chain is terminated ; whichever occurs first. ; all new chain-elements are counted (unless already used). ; in case of chain overlap the copying will proceed, but will not ; destroy the chains already copied. ; ; if the areasize is negative, it is a filedecriptor. in this case ; no chain is copied (of course), but first slice.work is set to ; doc-ident. ; ; call: w1 = areasize, w2 = link, w3 = addr of first slice information ; return: link+0: chain matches areasize : w2 = slices ; link+2: chain too long : w2 = slices used ; link+4: chain too short : w0 = 0, w1 = slices not used g10: ; copy chain: rs. w2 h0. ; save(return); al w0 0 ; (w0 := 0;) rs. w0 h3. ; any errors := false; sl w1 1 ; if areasize > 0 then jl. g12. ; goto area; ; the areasize is either zero or negative, prepare first slice := 0 al w2 0 ; first slice := 0; hs w2 x3 ; (w2 = number of slices := 0;) sn w1 0 ; if areasize = 0 then jl. (h0.) ; next instruction; jl. m91. ; goto compute docnumber; g12: ; area: jl. w2 e62. ; w2 := abs addr (w3.sender); rs. w2 h1. ; sender chain := abs addr of save w3.sender rl. w2 d4. ; w2 := curdoc; ; w0 = 0 wd w1 x2+f64 ; se w0 0 ; w1 := slices to use := areasize / slicelength; ; (rounded) al w1 x1+1 ; rs. w1 h2. ; bz w2 x2+f66 ; w2 := last slicenumber of chaintable; bz w3 x3 ; w3 := first slice number; g13: ; next slice: ; w1 = remaining slices to copy ; w2 = last slicenumber of slicetable ; w3 = current slicenumber sl w3 0 ; if slicenumber outside sl w3 x2+1 ; chaintable then jl. g16. ; goto chain outside limits; am. (d4.) ; if corresponding slice in chaintable bl w0 x3 ; is not free then sn w0 -2048 ; jl. g14. ; begin rs. w2 h3. ; any errors := true; am. (h1.) ; w0 := slicelink; bl w0 x3+f0 ; jl. g15. ; end g14: ; else am. (h1.) ; bl w0 x3+f0 ; move chain element from user area am. (d4.) ; to curdoc chain; hs w0 x3 ; g15: ; wa w3 0 ; slicenumber := next(slicenumber); al w1 x1-1 ; decrease(remaining slices); sn w1 0 ; if remaining slices = 0 then jl. g17. ; goto chain ok or too long; se w0 0 ; if not end of chain then jl. g13. ; goto next slice; ; the chain was too short am. (h0.) ; jl +4 ; return short-exit; (independant of errors) g16: ; chain outside limits: rs. w3 h3. ; any errors := true; al w1 0 ; g17: ; chain ok or too long: ; w0 = contents of last slice ; w1 = 0 ; w2 = irrellevant ; w3 = next slicenumber rl. w2 h2. ; w2 := slices used; se w0 0 ; if end of chain se. w1 (h3.) ; or any errors then jl. (h0.) ; then return ok; ws w3 0 ; w3 := last slicenumber; am. (d4.) ; hs w1 x3 ; slicelink(last slicenumber).curdoc := end of chain am. (h0.) ; jl +2 ; return chain too long; h0: 0 ; saved return h1: 0 ; saved chainhead address in sender area h2: 0 ; slices used h3: 0 ; any errors ( 0 == false, else true ) e. ; ; compute slices to claim ; ; the current slice-chain of entry.work is scanned, thus counting the ; number of slices it used to occupy. ; this number is compared to the new size.work: ; ; if new number of slices < counted number then ; save address of last slicelink to use ; ; if new number of slices > counted number then ; save address of last used slicelink ; ; call: m22, <compute new slices> ; return: w2 = slices ; variables are defined for later call of: adjust chain b. g20, h10 w. m22: ; compute slices to claim: jl. w3 n10. ; w0 := next param; rl. w2 v7. ; sh w2 -1 ; if size.work < 0 then jl. g4. ; goto non-area; so w0 2.10 ; if not compute new slices then al w2 0 ; size := 0; rl. w3 d4. ; w3 := curdoc; al w1 0 ; wd w2 x3+f64 ; w2 := slices to use := se w1 0 ; size / slicelength (rounded); al w2 x2+1 ; al. w0 v4. ; (prepare new area or no slices) bz. w1 v4. ; w1 := first slice.work; wa w1 6 ; w1 := abs addr of first slice; rs. w1 h4. ; minslice := first slice; sn w1 x3 ; if old size = 0 then jl. g2. ; goto after count; ; notice: an area may not start in slice 0 g1: ; count next: ; w0 = abs addr of last slice link (either first slice.work or curr slice) ; w1 = abs addr of next slice link ; w2 = slices to use al w2 x2-1 ; decrease(remaining slices to use); sn w2 -1 ; if area must be cut down then ds. w1 h1. ; save(curr slice addr, next slice addr); al w0 x1 ; curr slice := next slice; ba w1 x1 ; next slice := next(next slice); sh. w1 (h4.) ; if next slice <= minslice then rs. w1 h4. ; minslice := next slice; se w0 x1 ; if current slice is not the last one then jl. g1. ; goto count next; g2: ; after count: ; w0 = abs addr of current slice ; w1 = abs addr of next slice (if area exhausted then curr=next) ; w2 = slice change rs. w2 h2. ; save(slice change); sl w2 0 ; if new size = old size or area must be extended ds. w1 h1. ; then save(current slice, next slice); jl. n0. ; next instruction; g4: ; non-area: al w2 0 ; slice change := 0; jl. g2. ; goto after count; h0: 0 ; abs addr of current slice h1: 0 ; abs addr of next slice h2: 0 ; slice change h3: 0 ; abs address of last slice in chaintable h4: 0 ; abs addr of min slice ; common variables: d16: 0, r.8 ; answer area c. 4 * (:a110+1:)+d16.-1; and 0, r. 2*(:a110+1:)+d16.>1; claim change array (set bs claims) z. ; d4: 0 ; curdoc: address of current document (chaintable) d5: d9 ; maincat pseudochain ; description of current entry d29: 0 ; -2 curr entry segment number d3: 0 ; curr entry address in catalog ; record work: ; (format as a catalog entry) d1: 0,r.f0>1 ; work d30: 0, r.4 ; stat area.work ; format of chainhead format of catalog entry v1 = d1 + f1 ; lower base of catalog lower base of entry v2 = d1 + f2 ; upper base of catalog upper base of entry v3 = d1 + f3 ; chainkink*8 + permkey namekey*8 + permkey v4 = d1 + f4 ; first slice of auxcat first slice v5 = d1 + f5 ; name of auxcat entry name v6 = d1 + f6 ; start of tail v7 = d1 + f7 ; size of auxcat size of entry v11= d1 + f11 ; document name name v12= d1 + f12 ; name table addr of write access counter, ; auxcat area process read acces counter v13= d1 + f5 + 2 ; v14= d1 + f5 + 6 ; v15= d1 + f5 + 7 ; v26= d1 + f66 + f0 ; last slice in chaintable v27= d1 + f67 + f0 ; first slice in ; chaintable-chain v30= d1 + f11 + 2 ; v31= d1 + f11 + 6 ; v32= d1 + f12 + 2 ; d2: 0 ; sender: process description address of sender d11: 0 ; cur proc name table address d13: 0,r.a401 ; children bits d14: 0 ; d13+2 ; address of a process description d15: 0 ; d13+4 ; end chain ; stepping stones jl. e5., e5 = k-2 jl. e7., e7 = k-2 jl. e8., e8 = k-2 jl. e9., e9 = k-2 jl. e10., e10=k-2 jl. e12., e12= k-2 jl. e50., e50= k-2 ; adjust chain to size ; ; the chain of entry.work is extended or cut down, as ; decided by the previous function ; ; if the area must be extended, it will preferably be extended ; with slices adjacent to the last slice, otherwise preferably ; as a contiguous area. ; ; call: (m22 must have been called prior to this function) ; m23 m23: ; adjust chain: rl. w3 d4. ; w3 := curdoc; bz w0 x3+f66 ; last slice := last slice number.curdoc; wa w0 6 ; abs last slice addr := last slice + curdoc; rs. w0 h3. ; dl. w2 h2. ; w1 := abs addr of next slice; ; w2 := remaining := slice change; sn w2 0 ; if slice change = 0 then jl. n0. ; next instruction; g5: ; next portion: sl w2 1 ; if remaining >= 1 then jl. g8. ; goto extend area; ; chain is now ok or too long ; w1 = abs addr of next slice, i.e. first slice to release ; w2 = remaining ; h0 = abs addr of last slice link, i.e. end of chain sn w2 0 ; if remaining = 0 then jl. g7. ; goto set end of chain; ; the old chain was longer than is has to be now, so release the ; superflouos chain-elements al w0 -2048 ; w0 := free element; g6: al w3 x1 ; ba w1 x1 ; release rest of chain hs w0 x3 ; se w1 x3 ; until end of chain; jl. g6. ; g7: ; set end of chain: al w0 0 ; hs. w0 (h0.) ; last link := end of chain; jl. n0. ; next instruction; g8: ; extend area: ; the area was too short ; try to extend the area with adjacent slices ; w1 = abs addr of last used slice ; w2 = remaining sn. w1 (d4.) ; if old size = 0 then jl. g9. ; goto new area; sn. w1 (h3.) ; if abs addr of last used slice = jl. g15. ; addr of last slice in chaintable then ; goto get a slice; bl w0 x1+1 ; se w0 -2048 ; if adjacent slice is occupied then jl. g15. ; goto get a slice; ; the slice was free and may therefore be used for extending the area al w0 1 ; slice link(last used slice) := 1; hs w0 x1 ; al w1 x1+1 ; increase(addr of last used slice); g17: ; occupy byte: ; w1 = new slice ; w2 = remaining al w0 0 ; hs w0 x1 ; slicechain (new slice) := 0; i.e. end of chain; rs. w1 h4. ; min slice := new slice; rs. w1 h0. ; addr of curr slice := addr of last used slice; al w2 x2-1 ; decrease(remaining); jl. g5. ; goto next portion; ; notice that end of chain will be set later g9: ; new area: ; try to find a contigouos hole that fits the remaining number ; of slices rl. w1 d4. ; slice := first slice of chaintable; ; notice: the first slice of chaintable will never be allocated g10: ; get start of free area: al w2 x1+1 ; w2 := free := next slice; al w3 0 ; w3 := free size := 0; g11: ; test next slice: sl. w1 (h3.) ; if slice = last slice of chaintable then jl. g13. ; goto take first free; al w1 x1+1 ; increase(slice); bl w0 x1 ; se w0 -2048 ; if slice <> free then jl. g10. ; goto get start of free area; al w3 x3+1 ; increase(free size); se. w3 (h2.) ; if free size < remaining then jl. g11. ; goto test next slice; ; a hole of the sufficient size is found g12: ; connect slice to area: ; w2 = abs addr of start of new slice ; h0 = abs addr of last slice link (maybe = first slice.work) ; h1 = abs addr of previous slice (maybe = chaintable start) al w1 x2 ; curr slice := new slice; ws. w2 h1. ; slicelink := addr of new slice - addr of previous; hs. w2 (h0.) ; link(last slice) := slicelink; rl. w2 h2. ; remaining := remaining - 1; jl. g17. ; goto occupy byte; g15: ; get a slice: ; w1 = abs addr of last used slice ; w2 = remaining ds. w2 h2. ; save (last used, remaining); ; it was not possible to get a contigouos area. ; therefor just take the first free slice, and try once more ; w1 = abs addr of last slice in chaintable g13: ; take first free: rl. w2 h4. ; free := minslice; g14: ; test next: sl. w2 (h3.) ; if free is the last slice of chaintable then jl. g16. ; goto test from first of chaintable; al w2 x2+1 ; increase (free); bl w0 x2 ; se w0 -2048 ; if slice(free) is not free then jl. g14. ; goto test next; jl. g12. ; goto connect slice to area; ; it was not possible to find a slice between minslice and ; last of chaintable. ; now try between first and last of chaintable g16: ; test from first of chaintable: rl. w2 d4. ; rx. w2 h4. ; minslice := first of chaintable; se. w2 (h4.) ; if not already tried from first of chaintable then jl. g13. ; goto take first free; ; it was not even possible to find a single slice in the chaintable jl. j7. ; alarm; ; if area extended then <function> ; ; call: (m23 must have been called prior to this function) ; m24, <instruction> ; error return: skip action, if area was not extended m24: ; if area extended then: rl. w0 h2. ; w0 := slice change; sh w0 0 ; if slice change <= 0 then jl. n1. ; skip jl. n0. ; else next instruction; e. ; ; stepping stones: jl. e17., e17= k-2 jl. e31., e31= k-2 jl. e32., e32= k-2 jl. e33., e33= k-2 jl. e14. , e14 = k-2 jl. e15. , e15 = k-2 jl. e25. , e25 = k-2 ; the functions m25-m30 all have a common ; call-sequence and error-return actions: ; ; call: w2 = slices ; m<number>, <claims exceeded addr> ; error return: goto-action 1, if claims exceeded ; the functions m260 and m280 are used to adjust maincat entry claims in case ; of insert entry result 3. ; they will set w2=slices=0. b. g20, h10 w. h0: 0 ; entry-change h1: 0 ; slice-change h2: 0 ; maincat claim addr h3: 0 ; auxcat claim addr h4: 0, r.a109*2 ; pseudo main cat bs_claims m25: ; prepare bs: al w1 0 ; entries := 0; al w0 a110 ; newkey := max catalog key; jl. g0. ; goto init pseudo claims; m260: al w2 0 ; claim 1 aux entry. (slices already claimed) insert entry r es 3 m26: ; create aux entry: al w1 1 ; entries := 1; al w0 -f51-1 ; la. w0 d1.+f3 ; newkey := key.work; g0: ; init pseudo claims: al w3 -1 ; oldkey := -1; ds. w2 h1. ; save (entries, slices); rs. w1 h4. ; save entries r. a109*2 ; al. w1 h4. ; maincat claim addr := pseudo claim; jl. g3. ; goto get auxcat claim addr; m27: ; permanent entry: ; w2 = negative number of slices to claim ac w2 x2 ; w2 := number of slices to claim; al w1 1 ; entries := 1; rl. w3 d10. ; oldkey := saved old key; al w0 -f51-1 ; la. w0 d1.+f3 ; newkey := key.work; sl w0 x3 ; if newkey >= oldkey then jl. g2. ; goto get maincat claim addr; ; the rest of the algorithm supposes an ascending key-change. ; in order to do this the entry- and slice-claims are negated ac w2 x2 ; slices := - slices; ac w1 x1 ; entries := - entries rx w3 0 ; exchange keys; jl. g2. ; goto get maincat claim addr; m280: al w2 0 ; unclaim 1 main and aux entry. aux entry will be reclaimed later m28: ; remove entry: ; (as in permanent entry, the claims must be negated) ; (w2 is already negative number of slices to claim) am -1-0 ; entries := -1; m29: ; change entry: am 0-1 ; entries := 0; m30: ; create entry: al w1 1 ; entries := 1; al w0 -f51-1 ; la. w0 d1.+f3 ; newkey := key.work; al w3 -1 ; oldkey := -1; g2: ; get maincat claim addr: ds. w2 h1. ; save (entries, slices); rl w1 b25 ; w1 := maincat docaddr; rl w1 x1+f60 ; w1 := rel claim addr.maindoc; wa. w1 d2. ; w1 := abs addr of maincat claim in sender descr; g3: ; get auxcat claim addr: ; w0 = newkey ; w1 = maincat claim addr ; w3 = oldkey ( <= newkey ) rl. w2 d4. ; rl w2 x2+f60 ; wa. w2 d2. ; w2 := abs addr of auxcat claim in sender descr; ds. w2 h3. ; save (maincat claim addr, auxcat claim addr); ld w0 1 ; oldkey := oldkey * 2; hs. w0 h5. ; newkey := newkey * 2; al w2 x3 ; current key := oldkey; jl. g11. ; goto test key; g10: ; next claim: ; w2 = current key : even = test entry-claim ; odd = test slice-claim ; w3 = second scan : oldkey == false ; max key + 1 == true ; the claims are scanned twice: ; first time the claims are just tested for claims exceeded ; second time the claims are changed al w1 x2 ; claim addr := current key ls w1 1 ; half word addr changed to integer addr so w2 2.1 ; + if slice-claim sl w2 a109*2-2; or current key >= minimum aux key then am h3-h2 ; auxcat claim addr wa. w1 h2. ; else maincat claim addr; rl w0 x1+4 ; w0:=current claim(claim addr); sz w2 2.1 ; rest := current claim am h1-h0 ; - if slice claim then slices ws. w0 h0. ; else entries; sh w0 -1 ; if rest < 0 then jl. n5. ; goto claims exceeded; sn w3 a110+1 ; if second scan then rs w0 x1+4 ; current claim(claim addr):=rest al w2 x2+1 ; increase(current key); g11: ; test key: h5 = k+1 se w2 ; newkey*2 ; if current key <> newkey then jl. g10. ; goto next claim; al w2 x3 ; current key := oldkey; al w3 a110+1 ; oldkey := second scan := true; se w2 x3 ; if second pass not done yet then jl. g11. ; goto test key; ; all claims in the interval oldkey-newkey have been tested and ; changed, without having claims exceeded jl. n1. ; skip e. ; ; prepare maincat entry ; ; the permanens key.work is set to the minimum of key.entry and ; min aux cat key - 1. ; slices to claim is set to zero ; ; call: w2 = entry address ; m31 ; exit: w2 = slices = 0 m31: ; prepare maincat entry: al w0 -f51-1 ; la w0 x2+f3 ; w0 := permkey.entry; sl w0 a109 ; if permkey >= min aux key then al w0 a109-1 ; permkey := min aux key - 1; hs. w0 d1.+f3 ; key.work := permkey; al w2 0 ; w2 := slices to claim := 0; jl. n0. ; next instruction; ; set bs claims ; ; it is tested that the claims can be subtracted from ; the parent and added to the childs claims ; the claims are given to the child ; ; notice: the claims-change may be positive or negative ; ; call: m32 ; error return: result 1, if claims exceeded ; result 3, if process does not exist ; result 3, if process is not an internal process ; result 3, if process is not a child of calling process b. g10, h10 w. m32: ; set bs claims: jl. w3 e17. ; first proc; je. w3 e75. ; move bs-params from sender to claim-array; al. w2 d16. ; w2 := claim array; rl. w3 d4. ; w3 := curdoc; g0: ; convert next key: al w0 0 ; se w3 (b25) ; if curdoc = maincat docaddr sl. w2 d16.+a109*4; or key >= min aux key then rl w0 x2 ; keep (entrychange.key) rs w0 x2 ; else entrychange.key := 0; rl w0 x2+2 ; w0w1 := signed segmentchange.key; ad w1 -24 ; wd w1 x3+f64 ; slices := segments // slicelength.curdoc sl w0 1 ; al w1 x1+1 ; + sign (remainder); sh w0 -1 ; al w1 x1-1 ; rs w1 x2+2 ; save in claim-array; al w2 x2+4 ; increase key; sh. w2 d16.+4*a110; if not all keys converted then jl. g0. ; goto convert next key; rs. w2 d1. ; second pass := false; g5: ; next pass: rl. w1 d2. ; w1 := sender; rl. w2 d14. ; w2 := child; wa w1 x3+f60 ; w1 := claimaddr.sender (curdoc); wa w2 x3+f60 ; w2 := claimaddr.child (curdoc); al. w3 d16. ; w3 := start of claim-array; ( = key 0 ) g8: ; next key: ; first test that the parent won't have claims exceeded rl w0 x1 ; remainder:= claim(key).sender ws w0 x3 ; - claimchange(key); sh w0 -1 ; if remainder < 0 then jl. j1. ; goto result 1; (i.e. claims exceeded at sender) sl. w3 (d1.) ; if second pass then rs w0 x1 ; claim(key).sender:= remainder ; parent claims was ok (till now) ; test child claims rl w0 x2 ; newclaim:= claim(key).child wa w0 x3 ; + claimchange(key); sh w0 -1 ; if newclaim < 0 then jl. j1. ; goto result 1; (i.e. claims excceded at child) sl. w3 (d1.) ; if second pass then rs w0 x2 ; claim(key).child:=newclaim ; child-claims was also ok ; try next key al w1 x1+2 ; increase (sender claimaddr); al w2 x2+2 ; increase (child claimaddr); al w3 x3+2 ; increase (key); sh. w3 d16.+4*a110+3; if not all keys tested then jl. g8. ; goto next key; ; all keys have been tested (or updated) al. w3 d16.-2 ; sn. w3 (d1.) ; if second pass then jl. j0. ; goto result ok; rs. w3 d1. ; second pass := true; rl. w3 d4. ; w3 := curdoc; jl. g5. ; goto next pass; e. ; ; if not bs-device then goto <not bs> ; ; the kind of the process description of curproc is tested to ; find out whether or not it is a bs-device ; ; call: m34, <not bs addr> ; error return: goto-action 1, if not bs-device; m34: ; check bs-device: rl. w2 (d11.) ; proc := nametable (cur proc name table address); rl w1 x2+a10 ; w1 := kind.proc; se w1 84 ; if kind = rcnet subprocess then sn w1 85 ; bz w1 x2+a63 ; kind := subkind.proc; se w1 6 ; if kind = drum sn w1 62 ; or kind = disc then jl. n1. ; skip; n1=k-2 jl. n5. ; goto <not bs>; n5=k-2 ; search any chains (allowed state) ; ; finds a document on which the sender has enough claims ; to create the entry described in entry.work ; ; call: m35, <allowed states> ; error return: result 2, if document not found ; result 2, if state.document not allowed ; result 4, if no documents with enough claims ; result 6, if document nameformat illegal ; return: curdoc is defined b. g10, h10 w. m35: ; search any chains: rl. w0 d1.+f7 ; w0 := size.work; rl. w2 d1.+f11; w2 := docname(0).work; sl w0 0 ; if size < 0 sz w2 -1<1 ; or docname(0) is neither 0 nor 1 then jl. m36. ; goto search chain; jl. w3 n10. ; w0 := allowed state := param; hs. w0 h0. ; ls w2 1 ; w2 := first drum rel or first disc rel; g0: ; next device kind: rl w2 x2+b22 ; w2 := first drum (or disc) chain entry in ; name table; jl. g5. ; goto test end of bs-devices; ; (only relevant if devicekind = disc) g1: ; test chain state: rl w3 x2 ; doc := name table(entry); bl w1 x3+f68 ; w1 := state.doc; h0 = k+1 al w0 ; allowed state; sh w0 (x3+f61) ; if docname.doc = 0 so w0 x1 ; or state.doc not allowed then jl. g2. ; goto next chain; rl w1 x3+f60 ; wa. w1 d2. ; w1 := abs addr of claims in sender descr; ; just test slice-claim, because it is irrellevant to test entry-claim rl w1 x1+2 ; w1:= slice claim (key 0) wm w1 x3+f64 ; segments := slices * slicelength; sl. w1 (d1.+f7); if segments >= size.work then jl. g10. ; goto document found; g2: ; next chain: al w2 x2+2 ; increase(entry); g5: ; test end: se w2 (b24) ; if entry <> top of chain list then jl. g1. ; goto test chain state; al w2 0 ; device kind := drum; rx. w2 d1.+f11; se w2 0 ; if old device kind <> drum then jl. g0. ; goto next device kind; ; all drums have been tested for slice-claims ; and all discs have been tested (maybe even twice) for slice-claims ; but no documents had enough claims jl. j4. ; goto result 4; (claims exceeded) g10: ; document found: rs. w3 d4. ; curdoc := doc; al. w1 d1.+f11; al w2 x3+f61 ; move docname.curdoc to docname.work; jl. w3 e32. ; jl. n0. ; next instruction; e. ; ; procedure search chain (allowed state) ; ; searches the chaintables for a document with docname = docname.work ; ; call: m36, <allowed states> ; error return: result 2, if document not found ; result 2, if state.document not allowed ; result 6, if document nameformat illegal ; return: curdoc is defined b. g10 w. m36: ; search chain: rl. w0 d1.+f7 ; sl w0 0 ; if size.work >= 0 then jl. g1. ; goto area; jl. w3 e15. ; compute document address; jl. g5. ; goto test state; g1: ; area: jl. w3 e45. ; find chain (docname.work); d1+f11 ; jl. g10. ;+4: not found: goto test document name; ;+6: found: g5: ; test state: rs. w2 d4. ; curdoc := doc; jl. w3 n10. ; w0 := allowed states := param; bl w1 x2+f68 ; if state.curdoc is not allowed then so w0 x1 ; jl. j2. ; goto result 2; jl. n0. ; next instruction; g10: ; test document name: al. w1 d1.+f5 ; al w2 x1+f11-f5 ; move docname.work to name.work; jl. w3 e32. ; jl. w3 e24. ; test format; jl. j2. ; goto result 2; j2 = k-2 ; (stepping stone) e. ; ; set chainstate ; ; the state of curdoc chain is set ; ; call: m37, <new state> m37: ; set chainstate: jl. w3 n10. ; w0 := new state := param; rl. w2 d4. ; w2 := curdoc; hs w0 x2+f68 ; state.curdoc := new state; jl. n0. ; next instruction; ; find empty chain and prepare ; ; the kind is tested, whether it is a fast or slow device (drum/disc) ; the size of the chaintable is tested against the corresponding ; maximum size ; an empty chain is found, and all the chain-link are cleared ; (i.e. set to free) ; the chainhead is copied (except first word of docname) ; it is tested that the size of the catalog wont give too large ; entry-claim ; all claims on the device are given to the sender, while all other ; internal processes will have their claims cleared ; ; call: m38 ; error return: result 5: illegal kind (neither fast not slow device) ; result 5: too many slices ; result 5: catalog too big, i.e. too many entries ; result 7: no chains idle b. g20, h10 w. m38: ; find empty chain and prepare: bz. w2 d1.+f53+f0; w2 := chain kind.chainhead; ls w2 -3 ; sl w2 2 ; if illegal kind then jl. j5. ; goto result 5; j5=k-2 ; kind = 0 : fast device, i.e. drum ; kind = 1 : slow device, i.e. disc ls w2 1 ; bz. w0 d1.+f66+f0; if last slice.chainhead sl. w0 (x2+h0.) ; >= chainsize(kind) then jl. j5. ; goto result 5; ; find an empty chain of the specified kind ; an empty chain is characterized by having first word of docname = 0 dl w3 x2+b22+2 ; w3 := top entry; al w2 x2-2 ; w2 := base entry; al w0 0 ; (empty docname) g0: ; next chain: al w2 x2+2 ; increase(entry); sn w2 x3 ; if all chains(kind) are tested jl. j7. ; goto result 7; (i.e. no chains idle) rl w1 x2 ; doc := chain(entry); se w0 (x1+f61) ; if first word of docname.doc <> 0 then jl. g0. ; goto next chain; ; a chaintable was found: clear all chainlinks rs. w1 d4. ; curdoc := doc; bz. w2 d1.+f66+f0; wa w2 2 ; w2 := abs addr of last slice of curdoc chaintable; al w0 -2048 ; w0 := free slice; g2: ; clear next slice: hs w0 x2 ; al w2 x2-1 ; clear all slices in chain table sl w2 x1 ; (notice: there is at least one slice) jl. g2. ; ; w1 = curdoc jl. g5. ; goto init chainhead; h0: a114 + f60 ; size of fast-chains (i.e. drums) a116 + f60 ; size of slow-chains (i.e. discs) ; set maincat and prepare ; ; maincat docaddr is set to curdoc ; the pseudo-chainhead for main catalog is initialized ; the size of main catalog is tested for too large entry-claim ; all maincat entry-claims are given to sender, while all other ; internal processes will have their maincat entry-claims cleared ; ; call: m39 ; error return: result 5: catalog size illegal (i.e. too many entries) m39: ; set maincat and prepare: rl. w1 d4. ; rs w1 b25 ; maincat docaddr := curdoc; rl. w1 d5. ; w1 := pseudo chaintable; g5: ; init chainhead: ; w1 = chaintable (or maincatalog pseudo chaintable) rs. w1 h1. ; save(chaintable addr); al w1 x1-f0 ; al. w2 d1. ; move chainhead from work to chaintable; jl. w3 e33. ; rl. w1 h1. ; (docname.chain must stay cleared until al w0 0 ; all checking is ended, because this is the se. w1 (d5.) ; rs w0 x1+f61 ; way to characterize an empty chain) rs w0 x1+f70 ; catalog name table addr := 0; ; compute number of entries in the catalog and compare this to ; the maximum possible claim al w0 f10 ; wm w0 x1+f57 ; if number of entries.catalog bz w3 x1+f66 ; slices := last slice number + 1; al w1 x3+1 ; g8: ; prepare claims: ; w0 = max claims ; w3=max entry claims ; w0=max slice claims ds. w1 h3. ; ; initialize claims for all internal processes: rl w2 b6 ; w2 := first internal in nametable; ; (there is at least one, namely sender itself) jl. g13. ; test more internals g10: rl w2 x2 ; proc:=nametable(entry) ld w0 -100 ; clear w3-w0 sn. w2 (d2.) ; claim:= if dl. w0 h3. ; proc= sender then maxclaim else 0 rl. w1 d4. ; w1 := curdoc wa w2 x1+f60 ; claim addr:=proc +claimrel.curdoc se. w1 (h1.) ; if chain <> curdoc then jl. g15. ; goto init maincat entry-claim; al w1 x2 ; g11: ; init next key: ; w3 = entry claim ; w0 = slice claim rs w0 x2+2 ; init slice claim from slice sl w2 x1+a109*4 ; if key >=min aux key then rs w3 x2 ; init entry claim al w2 x2+4 ; increase(key) sh w2 x1+a110*4 ; if key <= max cat key then jl. g11. ; goto init next key g12: ; test more internal rl. w2 h4. ; load nametable entry al w2 x2+2 ; increase(entry) g13: rs. w2 h4. ; store next entry se w2 (b7) ; if entry < last internal in nametable then jl. g10. ; goto next internal; ; all internals have had their claims initialized jl. n0. ; next instruction g15: ; init maincat entry-claim: al w1 x2 ; g16: ; init maincat key: rs w3 x2 ; init entry claim(key) al w2 x2+4 ; increase(key) sh w2 x1+a109*4-1; if key < min aux key then jl. g16. ; goto init next maincat key; jl. g12. ; goto test more internals; h1: 0 ; chaintable to be initialized h2: 0 ; maxclaim ( = entries, slices) h3: 0 ; slice claim h4: 0 ; name table entry ; stepping stones: am e12-e15 , e12=k-2 am e15-e17 , e15=k-2 am e17-e18 , e17 = k-2 am e18-e19 , e18 = k-2 am e19-e20 , e19 = k-2 am e20-e24 , e20 = k-2 am e24-e26 , e24=k-2 am e26-e43 , e26 = k-2 jl. e43. , e43 = k-2 jl. e44. , e44 = k-2 jl. e45. , e45=k-2 jl. e46. , e46=k-2 jl. e25. , e25=k-2 jl. e47. , e47 = k-2 jl. e52., e52=k-2 jl. e53., e53=k-2 jl. e60. , e60 = k-2 jl. e74. , e74 = k-2 jl. e76. , e76 = k-2 ; terminate update of new chainhead ; ; the chaintable and the disc-process are linked, and the slicelength ; is inserted in the process-description of the disc ; first word of docname.chaintable is initialized, thus indicating ; that the chain is no longer empty. ; procfunc itself is inserted as user and reserver of the disc-process ; ; call: m40 m40: ; terminate update of new chainhead: rl. w1 d4. ; w1 := curdoc; rl. w2 d11. ; w2 := cur proc name table address; rs w2 x1+f62 ; set document name table address; rl. w0 d1.+f61+f0; rs w0 x1+f61 ; first word of docname.chainhead := docname.work; ; now the chaintable-head is completely initialized ; (except state, which still is undefined) rl w3 x2 ; proc := disc process description; rl w2 x1+f64 ; slicelength.proc := slicelength; ds w2 x3+a72 ; chaintable .proc := curdoc; rl w1 b1 ; w1:=addr(procfunc process description); rl w0 x1+a14 ; w0:=idbit.procfunc; rs w0 x3+a52 ; discprocess.reserver:=idbit.procfunc; jl. w2 e51. ; include procfunc as user of discprocess; jl. n0. ; next instruction; ; terminate use of chain and disc ; ; ************************************************** ; * * ; * notice that the following is executed disabled * ; * * ; ************************************************** ; ; the first word of docname.curdoc is cleared, thus indicating ; that the chain is empty ; removes the links between disc-process and chaintable ; removes the name of disc-proc ; excludes procfunc as user and reserver of disc-proc ; all internal processes will have their claims cleared ; ; call: m41 m41: ; terminate use of chain and disc: rl. w1 d4. ; w1 := curdoc; rs. w1 h1. ; save (chaintable address); jd. 2 ; disable; al w2 0 ; rs w2 x1+f61 ; first word of docname.curdoc := 0; rx w2 x1+f62 ; document name table addr := 0; rl w3 x2 ; w3:=addr(discprocess); rl w1 b1 ; w1:=addr(procfunc process description); jl. w2 e52. ; exclude procfunc as user of discprocess; ld w1 -100 ; rs w0 x3+a11 ; name(0):=0; (this will prevent further user of the discprocess) rs w0 x3+a52 ; exclude procfunc as reserver; ds w1 x3+a72 ; chaintable.discproc:=slicelength.discproc:=0; ; w0 = 0 ( = max claims ) je. g8. ; enable, goto prepare claims; e. ; ; clean catalog ; ; clears all segments in the current catalog (which must be maincat) ; ; call: m42 ; error return: result 2, if catalog io-error b. g10, h10 w. m42: ; clean catalog: jl. w3 e7. ; (terminate update); ; w2 = start of catalog buffer al w0 -1 ; al w1 x2+f9 ; g1: ; clear next word of catalog buffer: rs w0 x2 ; al w2 x2+2 ; set all words of catalog buffer to -1 se w2 x1 ; thus indicating all entries are free; jl. g1. ; al w0 0 ; entry count.catbuffer := 0; rs w0 x2 ; ; segment number := 0; g2: ; next segment: rs. w0 (h0.) ; save (segment number); jl. w3 e9. ; prepare update; jl. w3 e7. ; terminate update; i.e. write the catalog buffer ; w1 = segment number al w0 x1+1 ; increase (segment number); ws. w1 (h1.) ; se w1 -1 ; if segment number <> size of curcat then jl. g2. ; goto next segment; ; now all catalog segments have been cleared jl. n0. ; next instruction h0: d8 + f36 ; address of segment number in cat-message h1: c0 ; address of size of curcat e. ; ; check idle bs-device or still same name ; ; if the disc-process has a link to a chaintable (i.e. chain.disc <> 0) ; the new name must correspond with docname.chain ; (used after intervention on a disc). ; otherwise there are no further limitations on the new process-name. ; ; call: m43, <idle bs addr> ; error return: result 3, if chain.proc <> 0 and newname <> docname.chain.proc ; result 6, if newname(0) = 0 ; goto-action 1, if chain.proc = 0 m43: ; check idle bs-device or test still same name: rl. w2 (d11.) ; rl w2 x2+a71 ; chain := chain.curproc; sn w2 0 ; if chain = 0 then jl. n5. ; goto <idle bs-device> rs. w2 d4. ; curdoc := chain; ; test that name.work = docname.chain ; (e.g. find chain with docname = name.work and test same chain) jl. w3 e45. ; find chain (name.work); d1+f5 ; jl. j3. ;+4: not found: result 3; (not same name at all) ;+6: found: sn. w2 (d4.) ; if chain = curdoc then jl. n1. ; skip; (i.e. name.chain = name.work) jl. j3. ; result 3; (not same name) j3 = k-2 ; (stepping stone) ; search best area process ; ; call: m45, <not found addr> ; error return: goto-action 1, if area process not found m45: ; search best area process: jl. w3 e47. ; search best process b5 ; between first area process b6 ; and top area process; jl. n5. ;+6: not found: goto <not found> ; w2 = area- (or pseudo-) process rl w0 x2+a10 ; w0 := kind.proc; sn w0 f38 ; if kind.proc = area process then jl. n1. ; skip; jl. n5. ; goto <not area>; ; setup area process ; ; if the area process already exists, the specified process ; is included as user (in case it has resources) ; otherwise the area-claim of the process is tested, ; and an empty area process is initialized according to entry.work ; ; call: (entry.work contains the entry) ; m46, <process code> (code = 0 : procfunc, code = 2 : sender) ; ; error return: result 1, if area claims exceeded ; return: cur proc name table address corresponds to the area process ; the specified process is included as user of the area process b. g10, h10 w. m46: ; setup area process: jl. w3 n10. ; w0 := process code := param; am (0) ; rl. w1 (h0.) ; internal := proctable (process code); rs. w1 h1. ; jl. w3 e47. ; search best area process; b5 ; b6 ; jl. g1. ;+6: not found: goto test area claim; ; an area process was found, but was it the rigth one, i.e how about the base ; w0w1 = base.proc sn. w0 (d1.+f1); if base.proc <> base.work then se. w1 (d1.+f2); jl. g1. ; goto test area claim; ; it was the correct area proces jl. g5. ; goto include; g1: ; test area claim: rl. w1 h1. ; bz w0 x1+a20 ; if area claim.internal = 0 then sn w0 0 ; jl. j1. ; goto result 1; i.e. claims exceeded ; the internal process has the claim of at least one area process, ; i.e. at least one empty area process exist. ; find that one and initialize it. jl. w3 e44. ; find empty area process; b5 ; rl. w3 (d11.) ; ld w1 -100 ; ds w1 x3+a412 ; access counters:=0,0; jl. w3 g10. ; init area(enabled); ; an area process exists now, corresponding to entry.work g5: ; include: rl. w1 h1. ; w1:=intproc; rl. w3 (d11.) ; w3:=extproc; jl. w2 e53. ; test users and reserver; sz w2 2.1 ; if intproc already user then jl. n0. ; goto next instruction else al w0 -1 ; ba w0 x1+a20 ; sn w0 -1 ; if areaclaim.sender=0 then jl. j1. ; goto result 1 else j1=k-2 hs w0 x1+a20 ; else decrease areaclaim.sender; jl. w2 e51. ; include intproc as user of areaproc; jl. n0. ; next instruction ; subprocedure init area ; ; initializes the area process from information given in entry.work ; ; an empty area process may be initialized enabled ; an existing - - must - - disabled ; ; call: w3 = link g10: ; procedure init area: rs. w3 h2. ; save (return); al. w2 d1. ; move from: entry.work rl. w3 (d11.) ; to: area process the following: al w0 f38 ; rs w0 x3+a10 ; kind ( = area process) dl w1 x2+f11+2 ; ds w1 x3+a62+2 ; docname dl w1 x2+f11+6 ; ds w1 x3+a62+6 ; bz w0 x2+f4 ; rs w0 x3+a60 ; first slice rl w0 x2+f7 ; rs w0 x3+a61 ; size dl w1 x2+f2 ; ds w1 x3+a49 ; base ; notice: name(0) is moved last dl w1 x2+f5+6 ; ds w1 x3+a11+6 ; name dl w1 x2+f5+2 ; ds w1 x3+a11+2 ; jl. (h2.) ; return; h0: b1 ; process table: param = 0 : procfunc d20: d2 ; param = 2 : sender h1: 0 ; internal h2: 0 ; return from init area ; include in area process ; ; the internal process, specified in the parameter is included ; as user of the area process ; ; call: m47, <process code> ; error return: result 1, if area claims exceeded m47: ; include in area process: jl. w3 n10. ; w0 := process code := param; am (0) ; rl. w1 (h0.) ; internal := proctable (process code); rs. w1 h1. ; jl. g5. ; goto include; ; if area process then reinit area process ; ; it is tested, that an area process was found earlier. ; in this case it will be re-initialized from the current entry.work ; ; call: m48 m48: ; reinit area process: rl. w2 d11. ; if cur proc name table address sl w2 (b5) ; does not outpoint an area process then sl w2 (b6) ; jl. n0. ; next instruction; jd. w3 g10. ; init area process disabled; je. n0. ; enable ; next instruction e. ; ; make sender to reserver of area process ; ; call: m49 m49: ; make sender reserver: rl. w1 d2. ; w1 := sender; rl. w2 (d11.) ; w2 := area process; rl w0 x1+a14 ; w0 := idbit.sender; rs w0 x2+a52 ; reserver.areaproc := sender; jl. n0. ; next instruction n0 = k-2 ; (stepping stone) ; if area process then delete area process ; ; the first word of name.proc is cleared, indicating an empty areaprocess. ; reserver.proc and users.proc are cleared. ; all internal processes who were users of the area process will have ; their area-claim increased. ; ; call: m50 b. g10,h5 w. m50: ; if areaprocess then delete area process: rl. w2 d11. ; w2 := name table address of possible area process; sl w2 (b5) ; if not an area process then sl w2 (b6) ; jl. n0. ; next instruction rl w3 x2 ; proc := area process; ; notice: all the remove is performed enabled: al w2 0 ; rs w2 x3+a52 ; clear reserver.extproc; rs w2 x3+a11 ; name(0). rs w2 x3+a50 ; docaddr. ; scan all internal processes and maybe increase their area-claim rl w2 b6 ; w2:=first intproc in nametable; g1: rl w1 x2 ; w1:=next intproc in nametable; rs. w2 h0. ; jl. w2 e53. ; test users and reserver; rs. w2 h1. ; :=user and reserver mask; jl. w2 e52. ; exclude intproc as user; rl. w2 h1. ; w2:=user and reserver mask; al w0 1 ; ba w0 x1+a20 ; sz w2 2.1 ; if intproc is user then hs w0 x1+a20 ; increase areaclaim.intproc; so w2 2.0100 ; if no other users then jl. n0. ; next instruction else rl. w2 h0. al w2 x2+2 ; next in name table; jl. g1. ; (no check of upper limit in nametable, ; because of the test on other users) h0: 0 h1: 0 e. ; ; find process and move bs-claims from process to sender area ; call : m51 b. g10 w. m51: jl. w3 e47. ; find best process b6 ; first internal in name table b7 ; last in name table jl. j3. ; process non exist: result 3 am. (d4.) ; wa w2 f60 ; w2:= bs-claim address in curr proc al w1 x2 ; al w0 a110*4+4; bs-claims length jl. w3 e83. ; move jl. w2 e60. ; w2:=addr(w1.sender); al w1 x2+a110*4 ; w1:=last key; g0: rl w0 x2+2 ; w0:=slice; am. (d4.) ; wm w0 f64 ; w0:=segments; rs w0 x2+2 ; :=segment; al w2 x2+4 ; w2:=next key; sh w2 x1 ; if w2<=last key then jl. g0. ; goto next key; jl. j0. ; goto result ok e. ; find empty entry ; ; the current catalog is searched for an empty catalog entry ; ; call: m55, <no room addr> ; error return: result 2, if catalog io-error ; goto-action 1, if no empty entries were found m55: ; find empty entry: jl. w3 e10. ; search free entry; jl. n5. ;+2: no room: goto <no room> jl. n1. ; skip ; modify cur entry ; ; the entry, previously found by ..find empty entry.. or some other ; search-routines is modified by the current contents of work. ; ; call: m56 ; error return: result 2, if catalog io-error m56: ; modify cur entry: jl. (2), e12; set cur entry and return; ; delete cur entry ; ; the entry, previously found by some search-routines, is deleted ; ; call: m57 ; error return: result 2, if catalog io-error m57: ; delete cur entry: jl. (2), e13; delete cur entry and return; ; set aux entry ; ; if the entry does not exist already in the auxcat, it will be ; created. ; finally entry.work is moved to that entry ; ; call: m58, <overlap or no room addr> ; error return: result 2, if catalog io-error ; goto-action 1, if entry could not be created ; (i.e. overlapping intervals or no room) m58: ; set aux entry: al. w3 p0. ; jl. n20. ; call(set aux); d21: d16 d22: d16+2 d24: d14 d33: d15 d34: d1+f6 ;stepping stones: jl. e31. , e31=k-2 jl. e90. , e90=k-2 jl. e92. , e92=k-2 ; delete aux entry ; ; if the entry exists in the aux catalog, it will be removed ; (if it does'nt exist nothing will be deleted) ; ; call: m59 ; error return: result 2, if catalog io-error m59: ; delete aux entry: al. w3 p1. ; jl. n20. ; call(delete aux); ; clear access counters.work ; ; the write and read access counters in the statarea of work is cleared. ; ; call: m60 m60: ; clear access counters: ld w1 -100 ; ds. w1 d30.+4 ; access counters.work:=0,0; jl. n0. ; next instruction; ; update and insert statarea ; updates last change in statarea of work and moves statarea.work to current entry. ; ; call: m62 m62: ; update and insert statarea: dl w1 b13+2 ; ld w1 5 ; now:=monitor time shift 5; rs. w0 d30.+0 ; last change:=word0(now); ; move statarea.work to statarea.entry ; ; moves statarea.work to statarea.entry (=docname area) ; ; call: m63 m63: ; move statarea.work to statarea.entry: jl. w3 e9. ; prepare update; am e49-e50; ; move statarea.entry to statarea.work ; ; moves statarea.entry (=docname area in aux cat) to statarea.work ; ; call: m64 m64: ; move statarea.entry to statarea.work: jl. w3 e50. ; get statinf; jl. n0. ; next instruction; ; set base and name ; ; base.work and name.work are taken from catbase.sender and w3-name.sender ; ; call: m65 m65: ; set base and name: rl. w1 d2. ; w1:=sensed; dl w1 x1+a43 ; ds. w1 d1.+f2 ; base.work := catbase.sender; jl. w3 e90. ; move name.sender to name.work; jl. n0. ; next instruction ; docname.work := docname.chain ; ; call: m66 m66: ; init docname.work from docname.curdoc: am f61-f55; namerel := docname rel; ; name.work := name.chain ; ; call: m67 m67: ; init name.work from name.curdoc: al w2 f55 ; namerel := name rel; al. w1 x2+d1.+f0 ; to-addr := work + namerel; wa. w2 d4. ; from-addr := curdoc + namerel; jl. e32. ; move name ; and return; ; name.work := name.pseudochain ( = main catalog name ) ; ; call: m68 m68: ; init name.work from maincat name: al. w1 d1.+f5 ; rl. w2 d5. ; al w2 x2+f55 ; move name.pseudochain to name.work; jl. e32. ; (and return) ; base.work := interval for catalogs ; ; call: m70 m70: ; init base.work from catalog interval: dl w1 b45 ; ds. w1 d1.+f2 ; base.work := catalog interval; jl. n0. ; next instruction ; test new base ( = w0w1.sender ) ; ; the new base must be either: ; 1. equal to stdbase (or maxbase) ; or 2. inside stdbase ; or 3. between stdbase and maxbase ; ; call: m71 ; error return: result 4, if illegal new base ; return: w0w1 = new base b. g10 w. m71: ; test new base: rl. w2 d2. ; w2 := sender; dl w1 x2+a29 ; newbase := w0w1.sender; sh w1 (x2+a44-0) ; if newupper > maxupper sl w0 x1+1 ; or newlower > newupper then jl. j4. ; goto result 4; ; (i.e. not inside maxbase or illegal base) sl w0 (x2+a45-2) ; if newlower < stdlower then jl. g5. ; begin <* test between stdbase and maxbase *> al w3 x1+1 ; (trick) sl w0 (x2+a44-2) ; if newlower < maxlower <* outside maxbase *> sh w3 (x2+a45-0) ; or newupper < stdupper <* embraces stdlower *> jl. j4. ; then goto result 4; ; at this point: maxlower <= newlower < stdlower ; stdupper <= newupper <= maxupper jl. n0. ; next instruction g5: ; end; ; at this point: stdlower <= newlower ; newupper <= maxupper se w0 (x2+a45-2) ; if newlower = stdlower <* irrellevant newupper *> sh w1 (x2+a45-0) ; or newupper <= stdupper <* inside stdbase *> jl. n0. ; then next instruction; ; this time the following was allowed: ; stdlower = newlower <= newupper <= maxupper ; or stdlower < newlower <= newupper <= stdupper jl. j4. ; goto result 4; j4 = k-2 ; (stepping stone) e. ; ; save oldbase, base.work := w0w1.sender ; ; call: w0w1 = newbase ; m72, <same base addr> ; ; error return: goto-action 1, if newbase = oldbase b. g10, h10 w. m72: ; save oldbase: dl. w3 d1.+f2 ; ds. w3 h1. ; save (base.work); ds. w1 d1.+f2 ; base.work := newbase; sn w0 x2 ; if newbase <> oldbase then se w1 x3 ; jl. n1. ; skip; jl. n5. ; goto <same base>; h0: 0 ; old lower base h1: 0 ; old upper base ; restore old base ; ; call: m73 m73: ; restore old base: dl. w1 h1. ; ds. w1 d1.+f2 ; base.work := oldbase; jl. n0. ; next instruction; e. ; ; set catbase of internal ; ; if first word of name.w3.sender = 0, the catbase of sender is set ; otherwise name must outpoint a child of sender: ; catbase.child := newbase ; ; call: w0w1 = newbase ; w2 = sender ; m74 ; ; error return: result 2, if state.child <> waiting for start by parent ; result 3, if internal not found ; result 3, if internal not child ; result 6, if nameformat illegal ; return: is always enabled b. g10 w. m74: ; set catbase of internal: rl. w3 d1.+f5 ; if name(0) = 0 then sn w3 0 ; goto set base; jl. g5. ; (i.e. own process) jl. w3 e17. ; first proc; ; w1 = sender, w3 = child c.-1 bz w0 x3+a13 ; if state.child se w0 f47 ; <> waiting for start by parent then je. j2. ; enabled goto result 2; z. dl w1 x1+a29 ; w0w1 := newbase.sender; al w2 x3 ; internal := child; g5: ; set base: ; w0w1 = newbase ; w2 = internal ds w1 x2+a43 ; catbase.internal := newbase; je. n0. ; enable (if after check of child) ; next instruction; e. ; ; test base.work, key.work ; ; the consistency of base and key is checked: ; if key < min global key then base must be inside stdbase ; ; call: m75, <error addr> ; error return: goto-action 1, if base,key inconsistent m75: ; test base and key: al w0 -f51-1 ; la. w0 d1.+f3 ; key := key.work; sl w0 a111 ; if key >= min global key then jl. n1. ; skip; rl. w2 d2. ; w2 := sender; dl. w1 d1.+f2 ; w0w1 := base.work; al w1 x1-1 ; (codetrick) sl w0 (x2+a45-2) ; if base.work is outside stdbase.sender then sl w1 (x2+a45-0) ; jl. n5. ; goto <error>; jl. n1. ; skip; ; test auxkey, interval ; ; tests that: min aux key <= key.work <= max cat key ; and that base.work is legal and not outside catalog interval ; ; notice: it is thus allowed to make any kind of intervals, ; independant of maxbase.sender and stdbase.sender ; ; call: m76 ; error return: result 5, if key.work not a legal aux-key ; result 5, if base.work illegal m76: ; test auxkey and interval: al w0 -f51-1 ; la. w0 d1.+f3 ; key := key.work; sl w0 a109 ; if key < min aux key sl w0 a110+1 ; or key > max cat key then jl. j5. ; goto result 5; dl. w2 d1.+f2 ; w1w2 := base.work; sl w1 (b45-2) ; if lower base < minimum sl w1 x2+1 ; or lower base > upper base jl. j5. ; sh w2 (b45) ; or upper base > maximum then jl. n0. ; goto result 5; jl. j5. ; next instruction; j5 = k-2 ; (stepping stone) ; if key.work < min aux key then goto ... ; ; call: m77, <not aux key> ; error return: goto-action 1, if key < min aux key m77: ; test aux key: al w0 -f51-1 ; la. w0 d1.+f3 ; key := key.work; sl w0 a109 ; if key >= min aux key then jl. n1. ; skip; jl. n5. ; goto <not aux key>; ; save oldkey and test newkey ; ; old key is saved ; the new key must obey: 0 <= new key <= max cat key ; key.work := new key; ; ; call: m78 ; error return: result 4, if newkey illegal b. g10 w. m78: ; save oldkey and test newkey: al w0 -f51-1 ; la. w0 d1.+f3 ; key := key.work; rs. w0 d10. ; oldkey := key; rl. w1 d2. ; w1 := sender; rl w0 x1+a29 ; newkey := w1.sender; sl w0 0 ; if new key illegal then sl w0 a110+1 ; jl. j4. ; goto result 4; g0: ; set key.work: ; w0 = key al w1 f51 ; la. w1 d1.+f3 ; (leave first slice and namekey unchanged) wa w1 0 ; rs. w1 d1.+f3 ; key.work := key; jl. n0. ; next instruction; d10: 0 ; oldkey ; restore oldkey ; ; key.work := oldkey ; ; call: m79 m79: ; restore oldkey: am. (d10.) ; key := oldkey; ; key.work := 0 ; ; call: m80 m80: ; clear key.work: al w0 0 ; key := 0; jl. g0. ; goto set key.work; e. ; ; size.work := name table addr of area process ; ; call: m83 m83: ; set name table addr: am. (d11.) ; size.work := cur proc name table addr; ; size.work := 0 ; ; call: m84 m84: ; clear size.work: al w0 0 ; size.work := 0; rs. w0 d1.+f7 ; jl. n0. ; next instruction; ; search bs-process and check reserved by sender ; ; the document, specified in docname.work must be a bs-device, ; i.e. it must have base.proc = catalog interval. ; it must be reserved by sender, because this will ensure, that ; the document not already exists in the bs-system (otherwise ; it would have been reserved by procfunc) ; notice: chainhead.work is destroyed, but reinitialized ; ; call: m85, <not exist or not reserved addr> ; error return: result 6, if document nameformat illegal ; goto-action 1, if not reserved bs-device ; return: cur proc name table addr is defined (i.e. the bs-device) m85: ; check reserved bs-device: al. w1 d1.+f5 ; al w2 x1+f11-f5 ; move docname.work to name.work; jl. w3 e32. ; jl. w3 e24. ; test format; jl. w3 e47. ; search best process in device-part of name table; b4 ; (first device in name table) b5 ; (top device in name table) jl. n5. ;+6: not found: goto <not exist> ; w0w1 = base.proc, w2 = proc sn w0 (b45-2) ; if base.proc <> catalog interval then se w1 (b45-0) ; jl. n5. ; goto <not bs interval>; rl. w1 d2. ; w1 := sender; rl w0 x2+a52 ; w0 := reserver.proc; se w0 (x1+a14) ; if sender is not reserver then jl. n5. ; goto <not reserver>; ; (move chainhead.sender to work, because name.work was destroyed above) ; move chainhead.sender to work, if catsize <= 0 then goto <illegal catsize> ; ; (the catalog must have at least one catalog segment) ; ; call: m86, <illegal catsize addr> ; error return: goto-action 1, if catsize illegal m86: ; move chainhead to work, test catsize: jl. w3 e92. ; move chainhead.sender to work; ; if size <= 0 then goto <illegal catsize> ; ; call: m87, <illegal catsize addr> ; error return: goto-action 1, if size <= 0 m87: ; test positive size: am 1-0 ; minimum size := 1; ; if size < 0 then goto <file descriptor> ; ; call: m88, <file descr addr> ; error return: goto-action 1, if size < 0 m88: ; test size not negative: al w0 0 ; minimum size := 0; sh. w0 (d1.+f7); if size.work >= minimum size then jl. n1. ; skip; n1 = k-2 ; (stepping stone) jl. n5. ; goto <illegal size or file descr>; n5 = k-2 ; (stepping stone) ; move tail and test new size ; ; if the old entry was a file-descriptor, it must still stay so ; if the old entry was an area , it must still stay so ; (i.e. the sign of size.work may not change) ; ; call: m89 ; error return: result 6, if illegal size-change b. h10 w. m89: ; move tail and test new size: rl. w0 d1.+f7 ; rs. w0 h0. ; old size := size.work; jl. w3 m105. ; move tail.sender to tail.work; rl. w0 d1.+f7 ; if sign (newsize) lx. w0 h0. ; = sign (oldsize) then sl w0 0 ; jl. n0. ; next instruction; jl. j6. ; goto result 6; (i.e. illegal size-change) j6=k-2 h0: 0 ; old size e. ; ; slice.work := 0 ; ; call: m90 m90: ; clear first slice.work: al w0 0 ; hs. w0 d1.+f4 ; first slice.work := 0; jl. n0. ; next instruction; ; compute docnumber ; ; first slice.work := docnumber of curdoc ; if old firstslice was neither 0 nor docnumber then error ; ; call: m91 ; exit: w2 = unchanged ; error return: result 5, if illegal document-change b. h10 w. m91: ; compute docnumber: rl. w1 d4. ; w1 := curdoc; rl w1 x1+f60 ; docnumber := (claimsrel.curdoc al w1 x1-a46 ; - start of claimrel) al w0 0 ; / number of keys; wd. w1 h0. ; al w1 x1-2048 ; bl. w0 d1.+f4 ; oldnumber := first slice.work; hs. w1 d1.+f4 ; first slice.work := docnumber + auxcat-mark; se w0 0 ; if only in maincat sn w0 x1 ; or still in same auxcat then jl. n0. ; next instruction; jl. j5. ; goto result 5; (i.e. illegal document-change) h0: (:a110+1:)<1 ; number of keys * 2 (=max cat key +1 *2) e. ; ; the following set of routines all perform the different moves ; between sender and procfunc: ; ; they all have a common call- and return-sequence: ; ; call: m<number> m100:am e90-e95; move name.sender to name.work; m101:am e95-e96; move name.work to name.sender; m102:am e96-e70; move name.work + nametable address to name etc.sender m103:am e70-e85; move newname.sender to/name.work; m104:am e85-e72; move docname.sender to docname.work; m105:am e72-e80; move tail.sender to tail.work; m106:am e80-e73; move tail.work to tial.sender; m107:am e73-e81; move entry.sender to entry.work; m108:am e81-e92; move entry.work to entry.sender; m109:am e92-e24; move chainhead.sender to entry.work; jl. e24. ; ; check any area processes ; ; all area processes are scanned, and it is tested that no internal ; processes (except procfunc itself) are users of area processes ; belonging to curdoc. (of course procfunc has a single one, the ; auxcat area process). ; notice that pseudo processes share the same area, but no process ; can be user of a pseudo process ; ; call: m115 ; error return: result 5, if any processes has area processes on curdoc b. g10,h5 w. m115: ; check any area process; rl w2 b5 ; w2:=first addr in nametable; jl. g0. ; g1: g2: rl. w2 h0. ; al w2 x2+2 ; w2:=next in nametable g0: sn w2 (b6) ; if upper limit in namtable is exceeded jl. n0. ; then goto next instruction; rs. w2 h0. ; rl w3 x2 ; w3:=addr(next extproc); rl w1 b1 ; w1:=addr(procfunc process description); jl. w2 e53. ; test users and reserver; sn w2 0 ; if no users then jl. g2. ; goto next extproc; rs. w2 h1. ; store result of test users and reserver; al w1 x3 ; NB w1<->w3 g1<->g2 ; an area process was found in use. ; first test whether it is a file-descriptor-process or an area-process rl w3 x1+a61 ; w3 := size.proc; sh w3 -1 ; if size < 0 then jl. g3. ; goto file-descriptor; ; it was an area: test the document-name rl. w3 d4. ; w3 := curdoc; dl w0 x3+f61+2 ; sn w3 (x1+a62+0) ; if docname.proc <> docname.curdoc then se w0 (x1+a62+2) ; jl. g1. ; goto next area; rl. w3 d4. ; dl w0 x3+f61+6 ; sn w3 (x1+a62+4) ; se w0 (x1+a62+6) ; jl. g1. ; ; the documentname corresponded to docname.curdoc. ; procfunc is the only one allowed at this point rl. w0 h1. ; w0:=result of test users and reserver; so w0 2.0100 ; if not any other users then jl. g1. ; goto next area; jl. j5. ; goto result 5; (i.e. other users) g3: ; file-descriptor: rl w3 x1+a60 ; w3 := first slice.proc; sn w3 0 ; if first slice = 0 then jl. g2. ; goto next area; (i.e. maincat entry) am (b22) ; if docnumber (entry) <> docnumber (curdoc) then rl w3 x3-2048 ; se. w3 (d4.) ; jl. g2. ; goto next area; jl. j5. ; goto result 5; (i.e. entry in auxcat.curdoc) h0: 0 ; addr in name table; h1: 0 ; result af test users and reserver; e. ; ; prepare catalog scan ; ; call: m116 m116: ; prepare catscan: al w0 0 ; rl. w2 d4. ; hs w0 x2+f69 ; curkey.curdoc := 0; jl. n0. ; next instruction; ; test more catalog segments ; ; curkey is increased, and compared to size.maincat. ; if more segments then goto ... ; ; call: m117, <more segments addr> ; error return: goto-action 1, if more segments in main catalog m117: ; test more catalog segments: rl. w2 d4. ; al w0 1 ; ba w0 x2+f69 ; increase (curkey.curdoc); hs w0 x2+f69 ; rl. w2 d5. ; se w0 (x2+f57) ; if curkey <> number of segments in maincat then jl. n5. ; goto <more segments>; jl. n1. ; skip; ; for all curkey.curdoc entries do ; ; all entries, with key.entry = curkey, in main catalog are scanned ; when all entries are examined then goto <no more>, else continue ; ; call: m118, <no more addr> ; w2 = entry ; ... ; <actions for entries with key.entry = curkey> ; ... ; m119 ; ; error return: result 2, if catalog io-error ; goto-action 1, when no more entries to examine b. g10, h10 w. m118: ; for all curkey entries do: al w0 0 ; rs. w0 h0. ; entry-change := 0; rl. w2 d4. ; w2 := curdoc; bz w2 x2+f69 ; key := curkey.curdoc; jl. w3 e14. ; for all key entries do jl. n5. ;+2: no more: goto <no more>; ; w2 = entry ; w3 = continue search rs. w2 h1. ; save (entry); am n25-n35; call (second instruction); n25 = k-2 ; (stepping stone) ; endfor ; ; continues with the previous for-procedure ; ; call: m119 m119: ; endfor: am n35-e14; goto return; jl. e14. ; ; multi-delete entry ; ; the current entry is deleted, and entrycount is prepared for later update ; ; call: w3 = return ; m120 ; exit: w2 = entry address m120: ; multi-delete entry: rl. w2 h1. ; restore (entry); al w0 -1 ; rs w0 x2+f4 ; first word.entry := -1; wa. w0 h0. ; rs. w0 h0. ; decrease (entry count change); jl. e9. ; prepare update ; and return; ; update entry-count ; ; in case any entries have been multi-deleted then the key-segment ; will have its entry-count updated ; ; call: m121 ; error return: result 2, if catalog io-error m121: ; update entry-count: rl. w0 h0. ; sn w0 0 ; if entry-count change = 0 then jl. n0. ; next instruction; rl. w2 d4. ; bz w2 x2+f69 ; segment := curkey.curdoc; jl. w3 e5. ; get catalog segment; ; w2 = start of catalog buffer rl. w0 h0. ; change entry count and prepare update; jl. w3 e8. ; jl. n0. ; next instruction; h0 = d13 ; entry-count change h1 = d14 ; entry e. ; ; check entry on document ; ; tests whether the current entry belongs to curdoc ; ; call: w2 = entry ; m122, <not on doc addr> ; error return: goto-action 1, if entry does not belong to curdoc b. g10 w. m122: ; check entry on document: rl. w3 d4. ; w3 := curdoc; rl w0 x2+f7 ; sh w0 -1 ; if size.entry < 0 then jl. g2. ; goto file-descriptor; dl w1 x2+f11+2 ; sn w0 (x3+f61+0) ; if docname.entry <> docname.curdoc then se w1 (x3+f61+2) ; jl. n5. ; goto <not on document>; dl w1 x2+f11+6 ; sn w0 (x3+f61+4) ; se w1 (x3+f61+6) ; jl. n5. ; jl. n1. ; skip; g2: ; file-descriptor: bz w1 x2+f4 ; w1 := first slice.entry; sn w1 0 ; if either maincat-entry jl. n5. ; am (b22) ; or docnumber.entry <> docnumber.curdoc then se w3 (x1-2048) ; jl. n5. ; goto <not on document>; jl. n1. ; skip; e. ; ; for all existing chaintables do ; ; all chaintables, including maincat-pseudochain, are scanned. ; when all tables are tested, then goto <no more>, else continue ; ; call: m123, <no more addr> ; work = chainhead ; w2 = work ; ... ; <actions for chaintable> ; ... ; m119 ; ; error return: goto-action 1, when no more chaintables b. g10, h10 w. m123: ; for all existing chaintables do: rl w1 b22 ; al w1 x1-2 ; cur chain entry := base of chains in name table; rl. w2 d5. ; chain := maincat pseudo chain; g1: ; exit with chain: rs. w1 h0. ; save (cur chain entry); al w2 x2-f0 ; al. w1 d1. ; move chainhead.chain to work; jl. w3 e33. ; al. w2 d1. ; w2 := work; jl. w3 n25. ; call (second instruction); ; when action m119 has been executed, then proceed here: rl. w1 h0. ; restore (cur chain entry); g2: ; next chain: al w1 x1+2 ; increase (cur chain entry); sn w1 (b24) ; if all chain are tested then jl. n5. ; goto <no more>; rl w2 x1 ; chain := name table (cur chain entry); rl w3 x2+f61 ; se w3 0 ; if docname(0).chain <> 0 then jl. g1. ; goto exit with chain; i.e. chain exists jl. g2. ; goto next chain; i.e. chain was idle; h0 = d13 ; cur chain entry e. ; ; goto ; ; call: m125, <next address> m125: ; goto: jl. n5. ; goto <next address>; ; return ; ; call: m126 m126: ; return: am n30-n31; return; ; skip-return ; ; call: m127 m127: ; skip-return: am n31-n33; skip-return; ; goto-return ; ; call: m128 m128: ; goto-return: am -2048 ; jl. n33.+2048; goto-return; ; test devicenumber, user and reserver ; ; it is tested that the device number is legal, and that sender ; is user of the device, and that no other processes are ; reserver ; ; call: m149 ; error return: result 2, if sender is not user of the device ; result 4, if illegal device number ; result 5, if device reserved by another process m149: ; test device,user,reserver: rl. w1 d2. ; w1 := sender; rl w2 x1+a29 ; devno := save w1.sender; ls w2 1 ; entry := 2 * devno wa w2 b4 ; + first device in name table; sl w2 (b4) ; sl w2 (b5) ; if entry is outside device-part of nametable then jl. j4. ; result 4; (illegal device number); rs. w2 d11. ; cur proc name table addr := entry; rl w3 x2 ; w3:=addr(extproc); jl. w2 e53. ; test users and reserver; so w2 2.0001 ; if calling process is not user then jl. j2. ; result 2; j2=k-2 sz w2 2.1000 ; if other reserver then jl. j5. ; result 5; jl. n0. ; next instruction; ; set name and interval ; ; the curproc is initialized from base.work and name.work ; ; in case of magtape stations, the state.proc is set too, indicating ; that the process is named ; ; call: m150 m150: ; set name and interval: rl. w3 (d11.) ; w3 := proc; al. w2 d1.+f5 ; w2 := name.work; jd. 2 ;****** disable: rl w1 x3+a10 ; w1 := kind.proc; se w1 84 ; if kind = rcnet subprocess then sn w1 85 ; bz w1 x3+a63 ; kind := subkind.proc; al w0 0 ; sn w1 60 ; if magtape station then rs w0 x3+a70 ; state.proc := named; se w1 18 ; sn w1 34 ; rs w0 x3+a70 ; dl w1 x2+f2-f5 ; base.proc := base.work; ds w1 x3+a49 ; al w1 x3+a11 ; w1 := name.proc; jl. w3 e32. ; move name.work to name.proc; je. n0. ;****** enable ; next instruction; ; create internal process ; call: w1 = parameter address ; w3 = name address ; return: w0 = 0 ok ; 1 storage,protection or claim trouble ; 3 name overlap ; 6 name illegal ; parameters: 0 first core ; 2 last core ; 4 buf claim, area claim ; 6 intern claim, func mask ; 8 prot reg, prot key ; 10-12 max interval ; 14-16 stand interval b.g10 w. m151: ; create internal process: rl. w1 d2. ; w1 := sender; bz w0 x1+a21 ; if internal claim.sender = 0 sn w0 0 ; jl. j1. ; then goto error 1 jl. w3 e76. ; move internal-params to work; jl. w3 e44. ; find idle process; b6 ;+2: (from internal processes) al w1 x2+a27 ; index:= addr(ir addr.proc) g1: rs w0 x1 ; proc descr(index):= 0 al w1 x1+2 ; index:= index+2 se w1 x2+a4-4 ; end until index = proc descr end jl. g1. ; al. w1 d1.+f6 ; dl w0 x1+2 ; la. w3 g6. ; la. w0 g6. ; ds w0 x2+a18 ; move first and last core dl w0 x1+6 ; ds w0 x2+a21 ; move claims and function mask rl w3 x1+8 ; move protection reg and mask rl. w0 c5. ; ds w0 x2+a26 ; move interrupt mask dl w0 x1+12 ; ds w0 x2+a44 ; move max interval dl w0 x1+16 ; ds w0 x2+a45 ; move stand interval ds w0 x2+a43 ; set catalog base rl. w1 d2. ; w1 := sender dl w0 x2+a44 ; test max base: sh w0 x3-1 ; if lower.max.proc > upper.max.proc jl. j1. ; then goto error 1 bs. w0 1 ; sl w3 (x1+a44-2; if lower.max.proc < lower.max.sender sl w0 (x1+a44) ; or upper.max.proc > upper.max.sender jl. j1. ; then goto error 1 dl w0 x2+a45 ; test standard base: sh w0 x3-1 ; jl. j1. ; bs. w0 1 ; sl w3 (x1+a45-2; sl w0 (x1+a45) ; jl. j1. ; dl w0 x1+a182 ; initial,current (cpa, base) (child) ds w0 x2+a172 ; := current cpa,base (sender); ds w0 x2+a182 ; ; the following is just an ad hoc solution for determining the writing priviliges: bz w0 x2+a25 ; if pk(child) = 0 then se w0 0 ; begin jl. g8. ; al w3 8 ; lower write limit := 8; rl w0 b12 ; top write limit := core size; rl. w1 g10. ; interrupt levels := standard; jl. g9. ; end g8: ; else begin dl w0 x2+a18 ; lower write limit := first of process + base; wa w3 x2+a182 ; top write limit := top of process + base; wa w0 x2+a182 ; sh w0 x3 ; if base is so extreme that process wraps around then je. j1. ; goto result 1; sh w0 (b12) ; if limits gets outside relevant part of core then sh w3 8-1 ; je. j1. ; goto result 1; rl w1 x1+a185 ; interrupt levels := current interrupt levels(sender); g9: ; end; ds w0 x2+a184 ; initial,current write-limits := limits; ds w0 x2+a174 ; rs w1 x2+a185 ; initial,current interrupt levels := interrupt levels; rs w1 x2+a175 ; rl. w1 d2. ; restore sender; rl w3 x1+a22 ; bz w0 x2+a22 ; if function mask.proc so w3 (0) ; is not subset of mask.sender jl. j1. ; then goto error 1 c.-4000 rl w0 x2+a24 ; sz. w0 (g5.) ; if pk.proc > 7 or pr.proc > 255 jl. j1. ; then goto error 1 bz w3 x1+a25 ; sn w3 0 ; if pk.sender <> 0 jl. g2. ; then begin bz w3 1 ; ls w0 x3+4 ; al w3 2.111 ; lo w3 x2+a24 ; sl w0 0 ; if bit(pk.proc)in:(pr.proc)<> 0 so w3 (x1+a24) ; or pr.proc not subset pr.sender jl. j1. ; then goto error 1 end z. g2: dl w0 x2+a18 ; sl w3 (x1+a17) ; if first core.proc < first core.sender sh w0 x3 ; or last core.proc <= first core.proc jl. j1. ; then goto error 1 sh w0 (x1+a18) ; if last core.proc > last core.sender jd. g3. ; jl. j1. ; then goto error 1 g3: rs w3 x2+a33 ; ic.proc:=first core.proc rl w3 x2+a19 ; sz. w3 (c4.) ; je. j1.,j1=k-2; bl w3 x2+a21 ; sh w3 -1 ; je. j1. ; rl w0 x1+a19 ; if buf claim > buf claim.sender ws w0 x2+a19 ; or area claim.proc > area claim.sender ac w3 x3+1 ; or int claim proc > int claim.sender-1 ba w3 x1+a21 ; then goto error 1 sl w3 0 ; sz. w0 (c4.) ; je. j1. ; hs w3 x1+a21 ; set internal claim.sender rs w0 x1+a19 ; set buf and area claim.sender rs w1 x2+a34 ; parent.proc:= sender dl w0 b13+2 ; ds w0 x2+a38+2; start run.proc:= time al w0 f47 ; stop count.proc:= 0 rs w0 x2+a13 ; state.proc:= wait start parent al w0 0 ; save area.proc := 0; rs w0 x2+a302 ; rl w0 x1+a301 ; priority.proc := priority.sender; rs w0 x2+a301 ; jl. n0. ; goto next instruction g5: 8.7400 7770 ; g6: 8.7777 7776 ; g10: 6 < 12 + b54 ; standard interrupt levels, used by drivers etc e. ; ; start internal process(name); ; follows the process tree starting with the process given by name.work ; which must be a child of the sender (otherwise: error 3); if the state ; of the child is not waiting for start by parent nothing will be done at all. ; if ok then the child and all the decendants with state = waiting for ; for start by ancestor found by following the tree are treated as follows: ; the protection key is set on the whole process area, the description ; address of the processes are chained together via wait address with end ; chain holding the address of the last process. ; when the tree is exhausted then the chain is followed in disabled mode ; and each process is entered in the timer queue, its state is set to run- ; ning and stop count for its parent is increased by one. b. g5 ; begin w. ; start internal process: m152: ; jl. w3 e17. ; first proc (proc addr, new state); g0: bz w0 x3+a13 ; treat next: disable; se w0 x2+f41 ; if state.proc addr = new state + no stop bit jl. g1. ; then begin enable; c.-8000-(:a128>2a.1:) bz w0 x3+a25 ; set pk (proc addr, pk.proc addr); je. w2 e22. ; w2 link; chain and add children; z. jl. w3 e18. ; end; g1: je. w3 e20. ; next process; jd. g0. ; if more then goto treat next; ; tree exhausted. now start all the processes: rl. w3 (d33.) ; proc := end chain; jd 1<11+58 ; start the whole chain; (special instruction) jl. (2), j0 ; goto exit ok; j0 = k-4 ; stepping stone e. ; end start internal process; ; stop internal process (name,buf,result); ; follows the process tree, starting with the process given by name. ; work, of those processes which are not waiting for stop or already ; stopped. ; each of these processes is treated, in disabled mode, as follows: ; if it is in a queue then it is removed from that queue, ; if it is in a waiting state then the instruction counter is decreased ; by 2 so that the original monitor call will be repeated when it is ; restarted. ; if stop count is zero then the state is set to: if the process is ; the direct child of the sender, i.e. the first process treated, then ; wait start by parent, else wait start by ancestor; and stop count ; for the parent is decreased by one, possibly stopping the parent. ; if stop count is not zero then state is set to wait stop by parent ; or wait stop by ancestor as above. ; when the states of all the processess involved are set, the stop count ; of the process given by name.work is inspected. if the count is zero, thus ; indicating that the processes are effectively stopped, then a normal answer ; (result = 1) is send to the calling process. b. g5 ; begin w. ; stop internal process: m153: ; jl. w3 e17. ; first proc (proc addr, new state); ds. w3 (d22.) ; save (new state, proc); ; prepare the message buffer for returning the answer bz w0 x1+a19 ; decrease(bufclaim(sender)); bs. w0 1 ; (it has already been tested that hs w0 x1+a19 ; the claim is present). rl w2 b8 ; buf := next(mess buf pool); jl w3 b35 ; remove(buf); ac w0 (b1) ; receiver(buf) := -procfunc; i.e. let procfunc claim it. ds w1 x2+6 ; sender(buf) := sender; rl w0 x1+a30 ; rs w0 x2+a139 ; mess.flag=saved w2 rs w2 x1+a30 ; save w2(sender) := buf; rl. w3 (d22.) ; w3 := proc; rs w2 x3+a40 ; rl. w2 (d21.) ; w2 := new state; g0: bz w0 x3+a13 ; treat next: disable; sz w0 f43 ; state.w0:= state.proc; jl. g3. ; if -, stopped bit (state.w0) then hs w2 x3+a13 ; begin rl w2 x3+a33 ; state.proc:= new state; al w2 x2-2 ; if repeat bit (state.w0) then sz w0 f40 ; ic.proc:= ic.proc - 2; rs w2 x3+a33 ; al w2 x3+a16 ; sz w0 f44 ; if out of queue bit (state.w0) jd w3 b35 ; then remove (proc); al w3 x2-a16 ; g1: rl w2 x3+a12 ; loop stop: sz. w2 (c7.) ; if stop count.proc = 0 and jl. g2. ; -, no stop bit (state.proc) then al w2 x2+f41 ; begin hs w2 x3+a13 ; state.proc:= state.proc + no stop bit; rl w3 x3+a34 ; proc:= parent.proc; bz w2 x3+a12 ; stop count.proc:= al w2 x2-1 ; stop count.proc - 1; hs w2 x3+a12 ; goto loop stop; jl. g1. ; end; g2: jl. w3 e19. ; add children; sn w0 0 ; if children bits=0 jl. g4. ; then goto no more; ; end; g3: je. w3 e20. ; enable; next proc (proc, newstate); jd. g0. ; if more then goto treat next; g4: rl. w3 (d22.) ; no more:unsave proc; c.-8000-(:a128>2a.1:) rl. w2 d2. ; bz w0 x2+a25 ; je. w2 e22. ; w2 link ; set pk (proc,pk.parent); z. jd. 2 ; al. w1 (d21.) ; if stop count.proc = 0 then rl w2 x3+a40 ; send answer (answ addr, bz w0 x3+a12 ; wait addr.proc,1); ac w3 (b1) ; sn w0 0 ; if stopcount <> 0 se w3 (x2+4) ; or procfunc not receiver anymore ; i.e. a driver may have used ...decrease stopcount... je. j0. ; then goto exit ok ac w3 x3+0 ; bz w0 x3+a19 ; bufclaim.procfunc bs. w0 1 ; - 1 hs w0 x3+a19 ; =: bufclaim.procfunc al w0 1 ; jd 1<11+22 ; send answer je. j0. ; goto exit ok e. ; end stop internal process; ; modify internal process (name,registers); ; finds the process given by name.work and checks that it is a child of ; the sender. if the process is waiting for start by parent then the ; given values of the registers and the instruction counter are set in ; the process description. b. g5 ; begin w. ; modify internal process: m154: ; jl. w3 e17. ; first proc (proc addr,new state); bz w0 x3+a13 ; disable; se w0 f47 ; if state.proc <> waiting for start by parent je. j2.,j2=k-2 ; then goto enabled error2; rl w0 x3+a33 ; if save ic(child) odd then so w0 2.1 ; begin jl. g0. ; (it waited for completion of initialize process etc) ; search through the message pool to find the corresponding buffer: rl w2 b8+4 ; buf := first mess buf ws w2 b8+8 ; - buf size; g1: wa w2 b8+8 ; rep: if buf >= last of pool then sl w2 (b8+6) ; goto result 2; je. j2. ; (it should be a severe error) se w3 (x2+6) ; if child <> sender(buf) or jl. g1. ; rl w1 x2+4 ; receiver(buf) > 0 or sh w1 0 ; receiver(buf) is even then so w1 2.1 ; jl. g1. ; goto rep; al w1 x1+1 ; make receiver(buf) even; rs w1 x2+4 ; al w1 x3 ; (save child) jl w3 b43 ; regretted message(buf); al w3 x1 ; (restore child) ; end; g0: ; je. w3 e74. ; ** enable and ** move registers to tail.work; rl. w1 (d24.) ; w1 := child; am -2046 ; al. w2 v6.+2046; al w0 -1<1 ; la w0 x2-a28+a33; make child ic even; rs w0 x2-a28+a33; sl w0 (x1+a17) ; if child ic outside sl w0 (x1+a18) ; child process then jl. j2. ; goto result 2; rl. w3(d20.) ; w3 := sender; (i.e. parent process) rl w0 x3+a32 ; new status := lo. w0 g3. ; monmode.sender la w0 x2-a28+a32; and monmode.new status la. w0 g4. ; or exceptionbits.new status rl w3 x1+a32 ; la. w3 g5. ; or aritmetic interrupts.status.child; lo w3 0 ; rs w3 x2-a28+a32; status.child := new status; al w0 12 ; al w1 x1+a28 ; jl. w3 e31. ; move registers to child description; jl. j0. ; return ok; g3: 2.111 ; exception g4: 1<23+2.111 ; monitor mode + exception g5: 2.11<18 ; aritmetic interrupts e. ; end modify internal process; ; remove process (name); ; area process: the sender is removed as user and reserver of the ; process, possibly removing the area process (see procedure clear ; area proc). ; peripheral process: if the sender is allowed to call the function ; the peripheral process is removed if it is not reserved by another ; process. ; internal process: if the process is a child of the sender and is ; waiting for start by parent then ; 1* the protection key is reset in the process area, ; 2* the process is removed, ; 3* the process is removed from all external processes, ; 4* all message buffers involving the removed process are cleaned ; up, so that the buffers may return to the pool, ; 5* all console buffers involving the removed process are released. ; 2* to 5* is applied to all descendants of the child in a recursive ; way. b. g25 ; begin w. ; remove process: m155:jl. w3 e47. ; search best process in name table; b3 ; (first in name table) b7 ; (top of name table) jl. e26. ;+6: not found: goto test found; al w3 x2 ; proc := proc found; al. w2 j0. ; return to ex ok; rl w0 x3+a10 ; get and examine kind: rl. w1 (d20.) ; w1 := sender; sn w0 f38 ; if kind.proc = area kind then jd. w0 e25. ; w2 link ; remove area (sender,proc); sn w0 f37 ; if kind.proc = internal kind then je. g1. ; enabled goto internal; sn w0 64 ; if kind.proc = pseudo kind then jl. g0. ; goto pseudo process; ; peripheral process: bl w0 x1+a22 ; w0 := function mask.sender; so w0 f75 ; if function not allowed then je. j1. ; enabled result 1; jl. w2 e53. ; test users and reserver; so w2 2.1 ; if sender is not user then je. j2. ; enable goto result 2; sz w2 2.1000 ; if other reserver then je. j5. ; enable goto result 5 j5=k-2 al w0 0 ; name(0).proc:= 0; rs w0 x3+a11 ; comment: now removed; rs w0 x3+a52 ; reserved.proc:= 0; jl. w2 g7. ; release process; je. j0. ; enabled goto ex ok; g0: ; pseudo process: se w1 (x3+a50) ; if sender <> mainproc.pseudo process then je. j3. ; goto result 3; j3=k-2 rs. w3 g24. ; save (pseudo process); g21: ; scan all: rl w1 b8+4 ; w1 := first message buffer; rl. w3 g24. ; w3 := pseudo process; ac w2 x3 ; (w2 := claimed buffer) jd. g23. ; goto examine buffer; g25: ; regret: al w2 x1 ; jd w3 b43 ; regretted message(buf); je. g21. ; goto scan all; g22: ; buffer in queue: rl. w2(d20.) ; w2 := sender; jl. w3 g12. ; clean to (buffer, sender); je. g21. ; goto scan all; g23: ; examine buffer: sn w3 (x1+a141) ; if receiver.buf = proc then jl. g22. ; goto buffer in queue; sn w2 (x1+a141) ; if buffer claimed by proc then je. j2. ; goto result 2; sn w3 (x1+a142) ; if sender.buf = proc jl. g25. ; then goto regret; wa w1 b8+8 ; buffer := next buffer in pool; sh w1 (b8+6) ; if not all buffers tested then jl. g23. ; goto examine buffer; rl. w1(d20.) ; al w0 0 ; rs w0 x3+a11 ; name(0).proc := 0; rs w0 x3+a50 ; mainproc.proc := 0; bz w2 x1+a23 ; al w2 x2+1 ; increase (pseudo claim.sender); hs w2 x1+a23 ; je. j0. ; goto result ok; g24: 0 ; saved pseudo process , work g1: ; internal: jl. w3 e17. ; first proc (proc addr,--); bz w0 x3+a13 ; if not child then goto error 3; se w0 f47 ; if state.proc <> wait start by parent je. j2.,j2=k-2 ; then goto error 2; g5: jd. w3 e18. ; link: chain and add children; je. w3 e20. ; next proc (proc addr,--); jd. g5. ; if more then disabled goto link; rl. w3 (d33.) ; tree exhausted: proc:= end chain; g6: al w0 0 ; used ; remove one process: rs w0 x3+a11 ; name(0).proc:= 0; ac w2 x3+0 ; childrenbits:= -proc; ds. w3 (d24.) ; proc addr:= proc; rl w3 b4 ; extproc:= first device in name table; g2: rs. w3 g24. ; examine extproc: rl. w1 (d24.) ; rl w3 x3+0 ; if kind.extproc = area kind rl w0 x3+a10 ; then disable: sn w0 64 ; if kind.extproc = pseudoproc se w1 (x3+a50) ; and mainproc.extproc = proc jl. g15. ; then begin al w0 0 ; rs w0 x3+a11 ; name.extproc:= 0 je. g4. ; g15: sn w0 f38 ; remove area (proc,extproc); jd. w2 e25. ; w2 link ; enable: jl. w2 e52. ; exclude intproc as user; jl. w2 e53. ; test users and reserver; al w0 0 ; sz w2 2.10 ; if inproc is reserver then rs w0 x3+a52 ; exclude inproc as reserver; sz w2 2.0100 ; if no other users then jl. w2 g7. ; release extprocess; g4: rl. w3 g24. ; extproc:= next proc in name table; al w3 x3+2 ; if extproc <> first intproc se w3 (b6) ; then goto je. g2. ; examine extproc; rl w1 b8+4 ; examine message buffers: g10: jd. 2 dl w3 x1+6 ; for buf:= first mess buf sh w2 0 ; ac w2 x2 ; rl w0 x2+a10 ; sn w0 64 ; if receiver = pseudoproc rl w2 x2+a50 ; then receiver:= mainproc.reciever sh w3 0 ; if sender = pseudoproc ac w3 x3 ; then sender:= mainproc.sender rl w0 x3+a10 ; sn w0 64 ; rl w3 x3+a50 ; ; step buf size rl. w0 (d24.) ; sn w2 (0) ; jl. w3 g12. ; begin ; if proc = abs (receiver.buf) sn w3 (0) ; jd. g13. ; if proc = abs (sender.buf) g11: wa w1 b8+8 ; then clean from (buf); sh w1 (b8+6) ; end; je. g10. ; al w0 0 ; rl. w3 (d24.) ; rl w1 b5 ; for pseudoproc:=first pseudoproc in name table g19: jd. 2 ; step 2 until rl w2 x1+0 ; first internal in name table do se w3 (x2+a50) ; begin jl. g20. ; if proc=mainproc.proc rs w0 x2+a50 ; then bz w2 x3+a23 ; begin al w2 x2+1 ; mainproc.proc:=0; hs w2 x3+a23 ; pseudoclaims.proc:= g20: al w1 x1+2 ; pseudoclaims.proc+1; se w1 (b6) ; end je. g19. ; end g16: jd. 2 ; add claims: disable al w2 0 ; rl. w3 (d24.) ; dl w1 x3+a21 ; rx w2 x3+a34 ; claims.parent.proc:= hl. w1 g6.+1 ; note ; claims.parent.proc + claim.proc; aa w1 x2+a21 ; add one to int claim.parent.proc; wa. w1 c8. ; parent.proc:= 0; ds w1 x2+a21 ; proc:= wait addr.proc; dl w1 x3+a36+2 ; runtime(parent) := aa w1 x2+a36+2 ; runtime(parent) + ds w1 x2+a36+2 ; runtime(child); al w1 x3+a46 ; claims child al w2 x2+a46 ; claims parent g17: rl w0 x2 ; claims parant(i) wa w0 x1 ; + claims child(i) rs w0 x2 ; =:claims parent(i) al w1 x1+2 ; al w2 x2+2 ; i:= i+1 se w1 x3+a4-4 ; if i<procdescr end jl. g17. ; then goto repeat rl w3 x3+f26 ; if proc <> 0 then enabled se w3 0 ; goto remove one process else je. g6. ; enabled goto ex ok; je. j0. ; ; end remove process; c4: 3<22 + 3<10 ; used to test claims c5: a89 ; initial interrupt mask c7: -1<12 + f41 ; used by stop internal c8: 1<12 + 0 ; ; release process. ; this procedure releases an external process if it is of ; type remote subprocess (monitor kind=85). ; call: return: ; w0 destroyed ; w1 destroyed ; w2 link destroyed ; w3 proc destroyed b.i10 w. g7: rl w0 x3+a10 ; release process: se w0 85 ; if kind<>85 then jl x2 ; return; ds. w3 i2. ; al. w1 i0. ; message:=release; al. w3 i3. ; name:=<:host:>; jd 1<11+16 ; send message; rl. w1 d21. ; jd 1<11+18 ; wait answer; jl. (i1.) ; exit: return; i0: 2<12+1 ; message: operation:=release, mode:=indirect addr; i1: 0 ; dummy (saved return addr) i2: 0 ; i0+6 ; proc i3: <:host:>,0,0,0 ; name-constant and name table addr e. ; the following three procedures (used by remove process) are called in ; disabled mode but returns enabled ; procedure clean to (buf); ; delivers a dummy answer <receiver does not exist> in the queue of ; the sending process (the buffer administration takes care if the ; sender is removed). g12: rs. w3 g14. ; save (return); rl w3 b1 ; bz w0 x3+a19 ; bufclaim.procfunc bs. w0 1 ; -1 hs w0 x3+a19 ; =: bufclaim.procfunc ac w3 x3 ; rx w3 x1+4 ; sender.buf:= -procfunc bz w0 x2+a19 ; bufclaim.sender sh w3 0 ; + if buffer received ba. w0 1 ; then 1 else 0 hs w0 x2+a19 ; =: bufclaim.semder al w2 x1 ; jl w3 b44 ; remove(buf) al. w1 0 ; here ; al w0 5 ; jd 1<11+22 ; send answer(5,answer addr,buf) al w1 x2 ; dl w3 x1+6 ; jd. (g14.) ; g14: 0 ; saved return ; procedure clean from (buf); ; releases pending buffers and prepares the return of buffer claims to ; the parents of removed processes. g13: al w2 x1 ; jd w3 b43 ; regretted message (buf); je. g11. ; e. ; copy message ; ; call: m156 ; error return: result 2, if sender.buf is stopped ; result 3, if message regretted ; result 3, if addresses.buffer illegal ; result 3, if operation.buffer neither input nor output b. g10, h10 w. m156: ; copy message: rl. w1 (d20.) ; w1 := sender; rl w3 x1+a30 ; w3 := buf := save w2.sender; rl w2 x3+6 ; w2 := sender.buf; sh w2 -1 ; if sender.buf < 0 then jl. j3. ; result 3; i.e. message regretted; rl w0 x2+a10 ; if sender.buf is a pseudo process sn w0 64 ; then sender.buf:= main(sender.buf); rl w2 x2+a50 ; bz w0 x2+a13 ; if state(sender.buf) = stopped then sz w0 a105 ; jl. j2. ; goto result 2; dl w0 x3+12 ; w3 := first addr.buf; w0 := last addr.buf; sl w3 (x2+a17) ; if addresses outside sender-process then sl w0 (x2+a18) ; jl. j3. ; goto result 3; la. w3 h0. ; la. w0 h0. ; (make addresses even) sh w0 x3-1 ; if last address < first address then jl. j3. ; goto result 3; ws w0 6 ; w0 := size of area(buf); (less two bytes) c. 8000 ; if rc8000 then wa w3 x2+a182 ; w3 := abs first of area(buf); z. ds. w0 h3. ; save (first addr, size); dl. w0 h1. ; la w3 x1+a29 ; w3 := first of area.sender; (even) la w0 x1+a31 ; w0 := last of area.sender; (even) ws w0 6 ; w0 := size of area.sender; (less two bytes) c. 8000 ; if rc8000 then wa w3 x1+a182 ; w3 := abs first of area.sender; z. al w2 x3 ; w2 := from := abs first of area.sender; rl w3 x1+a30 ; bz w3 x3+8 ; w3 := operation.buf.sender; rl. w1 h2. ; w1 := to := abs first of area(buf); sn w3 3 ; if operation.buf = input then jl. g5. ; goto prepare move; se w3 5 ; if operation.buf <> output then jl. j3. ; goto result 3; h4: rx w2 2 ;used; exchange (from, to); g5: ; prepare move: ; w0 = size of area.sender (less two) ; w1 = to-address ; w2 = from-address sl. w0 (h3.) ; bytes to move := rl. w0 h3. ; minimum (size.sender, size.buf) ba. w0 h4.+1 ; + 2; rs. w0 h3. ; save (bytes to move); jl. w3 e31. ; move; ; now the data has been moved between sender-process and buffer-area ; compute the number of bytes and characters transferred and deliver to ; sender-process rl. w2 h3. ; w2 := bytes moved; al w3 x2 ; ls w3 -1 ; wa w3 4 ; w3 := chars moved; ( = bytes * 3 / 2 ) rl. w1 (d20.) ; rs w2 x1+a29 ; save w1.sender := bytes moved; rs w3 x1+a31 ; save w3.sender := chars moved; jl. j0. ; goto result 0; h0: -1 < 1 ; mask for making even h1: -1 < 1 ; double-mask for making two words even h2: 0 ; abs first of area(buf) h3: 0 ; size of area(buf) ; (later: bytes to move) e. ; ; general copy ; ; call: m157 ; error return: result 2, if sender.buf is stopped ; result 3, if message regretted ; result 3, if addresses illegal ; result 3, if operation in buffer is even b. g10, h10 w. m157: ; general copy: rl. w1 (d20.) ; w1:= sender rl w3 x1+a30 ; w3:= buf:= save w2.sender rl w2 x3+6 ; w2:= sender.buf sh w2 -1 ; if sender.buf<0 then jl. j3. ; goto result3 ; rl w0 x2+a10 ; if sender.buf is a pseudo process sn w0 64 ; then sender.buf:= main(sender.buf); rl w2 x2+a50 ; bz w0 x2+a13 ; if state(sender.buf)=stopped then sz w0 a105 ; goto result2 jl. j2. ; ; bz w0 x3+8 ; if operation.buf not odd then so w0 2.1 ; goto result3 jl. j3. ; ; get start and size of area described in messagebuffer rl w3 x1+a29 ; param:= save w1.sender c.8000 ; wa w3 x1+a182 ; w3:= abs addr of param z. ; rs. w3 h3. ; save abs addr rl w3 x3 ; rel of addr:= param.function(bit(1:5)) ls w3 -1 ; am (x1+a30) ; first:= mess buf(rel of addr) dl w0 x3+10 ; last:= mess buf(rel of addr+2) sl w3 (x2+a17) ; if first<first addr(sender) or sl w0 (x2+a18) ; last>=top addr(sender) then jl. j3. ; goto result3 ; am. (h3.) ; first:= first+relative.param wa w3 6 ; first in buf:= even(first) la. w3 h0. ; la. w0 h0. ; size in buf:= even(last)-first ws w0 6 ; sh w0 -1 ; if size in buf<0 then jl. j3. ; goto result3 ; note: size in buf is missing two halfwords c. 8000 ; wa w3 x2+a182 ; w3:= abs addr of first in buf z. ; ds. w0 h2. ; save(first in buf, size in buf) ; get start and size of corearea rl. w3 h3. ; first in core:= even(first addr.param) dl w0 x3+4 ; last:= even(last addr.param) la. w3 h0. ; size in core:= last - first in core la. w0 h0. ; ws w0 6 ; c. 8000 ; wa w3 x1+a182 ; w3:= abs addr of first in core z. ; ; get minimum size of core- and buffer area sl. w0 (h2.) ; size to move:= rl. w0 h2. ; min(size in buf, size in core)+2 ba. w0 h4. ; saved w1.sender:= size to move rs w0 x1+a29 ; ; check direction in which to move al w2 x3 ; from:= first in core rl. w1 h1. ; to:= first in buf rl. w3 (h3.) ; if param.function(bit(0))=0 then so w3 2.1 ; exchange(to,from) rx w2 2;used ; h4=k-1 ; am -2048 ; jl. w3 e31.+2048 ; move(size to move,to,from) ; jl. j0. ; goto result0 h0: -1<1 ; mask to remove bit 0 h1: 0 ; saved first in buf h2: 0 ; saved size in buf h3: 0 ; saved parameter address e. ; end of general copy ; setup pseudo process ; ; the pseudo-process claim is decreased and an empty pseudo-process ; is initialized according to entry.work ; ; call: m158 ; error return: result 1, if pseudo process claims exceeded m158: ; setup pseudo process: rl. w1 (d20.) ; bz w3 x1+a23 ; if pseudo-process claims.sender exceeded then sn w3 0 ; jl. j1. ; goto result 1; al w3 x3-1 ; decrease(pseudo-process claims.sender); hs w3 x1+a23 ; am -2048 ; jl. w3 e44.+2048; find idle pseudo process; b26 ; ; w2 = pseudo process rl w0 x1+a30 ; rs w0 x2+a60 ; mref.pseudo:= save w2(cur) rs w1 x2+a50 ; mainproc.pseudo := sender; al w0 64 ; rs w0 x2+a10 ; kind.pseudo := pseudo process; jl. n0. ; next instruction; ; redefine m-names: m00 = m00-n50, m01 = m01-n50, m02 = m02-n50, m03 = m03-n50, m04 = m04-n50, m05 = m05-n50, m06 = m06-n50, , m08 = m08-n50, m09 = m09-n50, m10 = m10-n50, m11 = m11-n50, , m13 = m13-n50, m14 = m14-n50, m15 = m15-n50, m16 = m16-n50, m17 = m17-n50, m18 = m18-n50, m19 = m19-n50, m20 = m20-n50, m21 = m21-n50, m22 = m22-n50, m23 = m23-n50, m24 = m24-n50, m25 = m25-n50, m26 = m26-n50, m27 = m27-n50, m28 = m28-n50, m29 = m29-n50, m30 = m30-n50, m31 = m31-n50, m32 = m32-n50, , m34 = m34-n50, m35 = m35-n50, m36 = m36-n50, m37 = m37-n50, m38 = m38-n50, m39 = m39-n50, m40 = m40-n50, m41 = m41-n50, m42 = m42-n50, m43 = m43-n50, , m45 = m45-n50, m46 = m46-n50, m47 = m47-n50, m48 = m48-n50, m49 = m49-n50, m50 = m50-n50, m51 = m51-n50, , , , m55 = m55-n50, m56 = m56-n50, m57 = m57-n50, m58 = m58-n50, m59 = m59-n50, m60 = m60-n50, , m62 = m62-n50, m63 = m63-n50, m64 = m64-n50, m65 = m65-n50, m66 = m66-n50, m67 = m67-n50, m68 = m68-n50, , m70 = m70-n50, m71 = m71-n50, m72 = m72-n50, m73 = m73-n50, m74 = m74-n50, m75 = m75-n50, m76 = m76-n50, m77 = m77-n50, m78 = m78-n50, m79 = m79-n50, m80 = m80-n50, , , m83 = m83-n50, m84 = m84-n50, m85 = m85-n50, m86 = m86-n50, m87 = m87-n50, m88 = m88-n50, m89 = m89-n50, m90 = m90-n50, m91 = m91-n50, , , , m100=m100-n50, m101=m101-n50, m102=m102-n50, m103=m103-n50, m104=m104-n50, m105=m105-n50, m106=m106-n50, m107=m107-n50, m108=m108-n50, m109=m109-n50, m115=m115-n50, m116=m116-n50, m117=m117-n50, m118=m118-n50, m119=m119-n50, m120=m120-n50, m121=m121-n50, m122=m122-n50, m123=m123-n50, , m125=m125-n50, m126=m126-n50, m127=m127-n50, m128=m128-n50, , , , , , m149=m149-n50, m150=m150-n50, m151=m151-n50, m152=m152-n50, m153=m153-n50, m154=m154-n50, m155=m155-n50, m156=m156-n50, m157=m157-n50, m158=m158-n50, , m260=m260-n50 , m280=m280-n50 , j0=j0-n50, j1=j1-n50, j2=j2-n50, j3=j3-n50, j4=j4-n50, j5=j5-n50, j6=j6-n50, j7=j7-n50 \f ; the following few instructions all perform an exit: h. ; (the whole table is in halfword mode) r0: j0 ; goto result ok; r1: j1 ; goto result 1; r2: j2 ; goto result 2; r3: j3 ; goto result 3; r4: j4 ; goto result 4; r5: j5 ; goto result 5; r6: j6 ; goto result 6; r7: j7 ; goto result 7; ; procedure set aux entry b. g10 h. p0: ; m77 , g3. ; if key.work < min aux key then goto skip-return; m4 ; set aux cat; m18 ; test new catalog name: g5. ; overlap: goto error-return; g0. ; exact : goto copy; ; no entry was found: create one now m55 ; find empty entry: g5. ; overlap or no room: goto error-return; m60 ; clear access counters.work; m125, g1. ; goto modify; g0: ; copy: m64 ; move statarea.entry to statarea.work; g1: ; modify: m56 ; modify cur entry; m88, g2. ; if size.work>=0 then m62 ; update and insert statarea; g2: ; m5 ; set main cat; g3: ; skip-return: m127 ; skip-return; g5: ; error-return: m5 ; set main cat; m128 ; error-return; e. ; ; procedure delete aux entry b. g10 h. p1: ; m4 ; set aux cat; m18 ; test new catalog name: g5. ; overlap: goto set maincat; g0. ; exact : goto delete; ; no entry was found, i.e. don't delete anything m125, g5. ; goto return; g0: ; delete: m57 ; delete cur entry; g5: ; return: m5 ; set main cat; m126 ; return; e. ; ; create entry ; ; call: ; w1.sender : tail address ; w3.sender : name address ; return: ; w0.sender : result = 0 : entry created ; result = 2 : catalog io-error ; result = 2 : document not present ; result = 2 : document not ready ; result = 3 : name overlap or name already exists ; result = 4 : claims exceeded ; result = 5 : catbase.sender outside stdbase.sender ; result = 6 : nameformat (of entry-name) illegal ; result = 6 : nameformat (of document name) illegal ; result = 7 : maincat not present p20: ; create entry: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m90 ; clear first slice.work; m80 ; clear key.work; m75 ; test base,key.work: r5. ; illegal: result 5; m15 ; test new system name (maybe wrk-name); r3. ; overlap: result 3; r3. ; exact : result 3; m105 ; move tail to work; m35 , t3 ; search any chains (state = ready); m22 , 2.10 ; compute slices to claim (compute new slices); m30 ; test claims (create): r4. ; claims exceeded: result 4; m23 ; adjust chain to size; m55 ; find empty entry: r4. ; no room: result 4; (not possible) m56 ; modify cur entry; m101 ; move name.work to name.sender; (in case of wrk-name) j0 ; result ok; ; lookup entry ; ; call: ; w1.sender : tail address ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : entry looked up ; result = 2 : catalog io-error ; result = 3 : entry does not exist ; result = 6 : nameformat illegal ; result = 7 : maincat not present p21: ; lookup entry: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m10 ; search best catalog entry: r3. ; not found: result 3; m106 ; move tail.work to tail.sender; j0 ; result ok; ; lookup entry head and tail: ; ; call: ; w1.sender : entry address ; w3.sender : name address ; ; return: ; w0.sender : result (as lookup entry) p38: ; lookup entry head and tail: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m10 ; search best catalog entry: r3. ; not found: result 3; m108 ; move entry.work to entry.sender; j0 ; result ok; ; change entry ; ; call: ; w1.sender : tail address ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : entry changed ; result = 2 : catalog io-error ; result = 2 : document not ready ; result = 3 : entry does not exist ; result = 4 : entry protected against calling process ; (i.e. base.entry outside maxbase.sender) ; result = 5 : entry reserved by another process ; result = 6 : nameformat illegal ; result = 6 : new size illegal ; result = 6 : claims exceeded ; result = 7 : maincat not present b. g10 h. p22: ; change entry: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m11 , 2.1000; search best entry and test modif allowed (no reserver); m36 , t3 ; search chain (state = ready); m89 ; move tail to work and test new size; m22 , 2.11 ; compute slices to claim (compute new slices and count old slices); m29 ; test claims (change): r6. ; exceeded: result 6; m23 ; adjust chain; m88 ; if size.work >= 0 then g0. ; begin m66 ; move docname.curdoc to docname.entry; m77 , g0. ; if key.work >= min aux key m24 ; and area extended then m6 ; dump chaintable; g0: ; end; m48 ; if area process then reinit area process; m56 ; modify cur entry; m58 ; set aux entry: g1. ; overlap or no room: does'nt matter g1: ; j0 ; result ok; e. ; ; rename entry ; ; call: ; w1.sender : new name address ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : entry renamed ; result = 2 : catalog io-error ; result = 2 : document not ready ; result = 3 : entry not found ; result = 3 : name overlap (new name) ; result = 3 : new name exists ; result = 4 : entry protected against calling process ; (i.e. base.entry outside maxbase.sender) ; result = 5 : entry used by another process ; result = 6 : old or new name format illegal ; result = 7 : maincat not present b. g10 h. p23: ; rename entry: m0 , r7. ; if no maincat then result 7; m103 ; move newname.sender to name.work; m13 ; test name format (newname); m65 ; move catbase,name to work; m11 , 2.0100; search best entry and test modif allowed (no users); m36 , t3 ; search chain (state = ready); m57 ; delete cur entry; m103 ; move newname.sender to name.work; m17 ; test new system name (no wrk-name): g10. ; overlap: goto repair maincat; g10. ; already: goto repair maincat; m55 ; find empty entry: r7. ; no room: (result 7: not possible) m56 ; modify cur entry; m77 ; if key.work >= min aux key then g2. ; begin m100 ; name.work := name.sender; m59 ; delete aux entry (old name); m103 ; restore new name; g2: ; end; m58 ; set aux entry (new name); g5. ; overlap or no room: goto repair auxcat; m48 ; if area process then reinit area process; j0 ; result ok; g5: ; repair auxcat: m100 ; restore old name; m58 ; set aux entry: g6. ; overlap or no room: does'nt matter g6: ; m103 ; restore new name; m18 ; test new catalog name (new name): r7. ; overlap: result 7; (not possible) g7. ; exact : goto remove new name; j7 ; not found: result 7; (not possible) g7: ; remove new name: m57 ; delete cur entry; g10: ; repair maincat: m100 ; restore old name; m14 ; compute name key; m55 ; find empty entry: r7. ; no room: result 7; (not possible) m56 ; modify cur entry; j3 ; result 3; e. ; ; remove entry ; ; call: ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : entry removed ; result = 2 : catalog io-error ; result = 2 : document not ready ; result = 3 : entry not found ; result = 4 : entry protected against calling process ; (i.e. base.entry outside maxbase.sender) ; result = 5 : entry used by another process ; result = 6 : nameformat illegal ; result = 7 : maincat not present b. g10 h. p24: ; remove entry: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m11 , 2.0100; search best entry and test modif allowed (no users); m36 , t3 ; search chain (state = ready); m22 , 2.01 ; compute slices to claim (count old slices); m28 ; test claims (remove); r7. ; claims exceeded: result 7; (not possible) m23 ; adjust chain to size; m50 ; if areaprocess then delete areaprocess; m57 ; delete cur entry; m77 , g5. ; if key.work >= min aux key then m59 ; delete aux entry; g5: ; j0 ; result ok; e. ; ; permanent entry ; ; call: ; w1.sender : permanens key ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : entry-permanens changed ; result = 2 : catalog io-error ; result = 2 : document not ready ; result = 3 : entry does not exist ; result = 3 : overlap (or no room) in auxcat ; result = 4 : entry protected against calling process ; (i.e. base.entry outside maxbase.sender) ; result = 4 : key illegal ; result = 5 : entry reserved by another process ; result = 6 : nameformat illegal ; result = 6 : claims exceeded ; result = 7 : maincat not present b. g20 h. p25: ; permanent entry: m0 , r7. ; if maincat not present then result 7; g0: ; m65 ; move catbase,name to work; m11 , 2.1000; search best entry and test modif allowed (no reserver); g1: ; entry found: m36 , t3 ; search chain (state = ready) g2: ; chain found: m78 ; save oldkey, key.work := param, test key legal; m75 ; test base,key: r4. ; key < minaux and base outside stdbase: result 4; m22 , 2.01 ; compute slices to claim (count old slices); m27 ; test claims (permanent): r6. ; exceeded: result 6; m88 , g8. ; if size < 0 then goto file-descriptor; g4: ; modify maincat: m56 ; modify cur entry; m77 ; if key.work >= min aux key then g5. ; begin m6 ; dump chaintable; m58 ; set aux entry: g10. ; overlap or no room: goto repair maincat; j0 ; result ok; g5: ; end; m79 ; restore old key; m77 , g6. ; if key.work >= min aux key then m59 ; delete aux entry; g6: ; j0 ; result ok; g8: ; file-descriptor: m77 , g9. ; if key.work >= min aux key then m91 ; slice.work := docnumber; (result 5 not possible) m125, g4. ; g9: ; else m90 ; first slice.work := 0; m125, g4. ; goto modify maincat; g10: ; repair maincat: m79 ; restore old key; m18 ; test new catalog name: r7. ; overlap: result 7; (not possible) g11. ; exact : goto modify maincat entry; j7 ; not found: result 7; (not possible) g11: ; modify maincat entry: m56 ; modify cur entry; j3 ; result 3; ; permanent entry in auxcat ; ; call: ; w1.sender : permanens key ; w2.sender : docname address ; w3.sender : name address ; ; return: ; w0.sender : result (as permanent entry) ; result = 2 : document not found ; result = 5 : entry already permanent in another auxcat ; result = 6 : docname format illegal p45: ; permanent entry in auxcat: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m78 ; (save oldkey), key.work := param, test key; m77 ; if key.work < min aux key then g0. ; goto permanent entry; m104 ; move docname.sender to docname.work; m84 ; (size.work := 0) m36 , t3 ; search chain (state = ready) m11 , 2.1000; search best entry and test modif allowed (no reserver); m88 , g20. ; if size.work >= 0 then m125, g1. ; goto entry found; (new docname irrellevant) g20: ; file-descriptor: m91 ; slice.work := docnumber; (maybe result 5) m125, g2. ; goto chain found; e. ; ; create area process ; ; call: ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : area process created ; result = 1 : area claims exceeded ; result = 2 : catalog io-error ; result = 2 : state of document does not permit this call ; result = 3 : entry not found ; result = 4 : entry does not describe an area ; (i.e. size.entry < 0) ; result = 6 : nameformat illegal b. g10 h. p26: ; create area process: m0 , g5. ; if no maincat then goto test areaprocs; m65 ; move catbase,name to work; m10 ; search best catalog entry: g5. ; not found: goto test areaprocs; m88 , r4. ; if size.work < 0 then result 4; ; notice: if the document is being dismounted etc. it is not allowed ; to create area processes: m36 , t30 ; search chains (state = allowed for create area process); m46 , 2 ; setup area process (sender); j0 ; result ok; g5: ; test areaprocs: ; remember: none of the catalogs are described in maincatalog yet, ; therefor special care must be taken, when a process wants to ; have an areaprocess to one of the catalogs: m45 ; search best area process: r3. ; not found: result 3; m47 , 2 ; include in areaprocess (sender); j0 ; result ok; e. ; ; create entry lock process ; ; call: ; w3.sender : name address ( with room for name table address ) ; ; return: ; w0.sender : result = 0 : process created ; result = 1 : area claims exceeded ; result = 2 : catalog io-error ; result = 2 : state of document does not permit this call ; result = 3 : entry not found ; result = 6 : nameformat illegal ; result = 7 : maincat not present p46: ; create entry lock process: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m10 ; search best catalog entry: r3. ; not found: result 3; ; (see comment at create area process) m36 , t30 ; search chain (state = allowed for create area process); m46 , 2 ; setup area process (sender); m83 ; prepare for moving nametable address to sender; m102 ; move (name and) nametable address to sender; j0 ; result ok; ; create peripheral process ; ; call: ; w1.sender : device number ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : peripheral process created ; result = 1 : function forbidden in calling process ; result = 2 : calling process is not a user ; result = 2 : catalog io-error ; result = 3 : name overlap ; result = 3 : name already exists ; result = 3 : not same disc name ; result = 4 : device number does not exist ; result = 5 : device is reserved by another user ; result = 6 : nameformat illegal b. g10 h. p27: ; create peripheral process: m8 , f74 ; check function mask (create peripheral process); m149 ; test device, user, reserver; m65 ; move catbase,name to work; m34 ; if not bs-device then g5. ; goto not bs; ; all bs-devices will have catalog-interval, with no regard on a future ; catalog-system or not. ; this ensures that all bs-devices have distinct names, and that ; that bs-documents (i.e. bs-devices included in catalog-system) may ; loose its connection to the device (e.g. the device-name is cleared ; at intervention at the disc), and later resume the connection, ; without any risk that the device-name has been occupied by another ; device. m70 ; base.work := catalog interval; m43 ; compare name.work and docname.chain.proc: ; (if connection between proc and a chain then ; the names must agree) g5. ; no chain: goto not bs; m66 ; docname.work := docname.chain; m40 ; reinit rest of chainhead; ; (i.e. insert procfunc as user and reserver of disc) m125 , g10. ; goto set name and interval; g5: ; not bs: m15 ; test new system name (maybe wrk-name): r3. ; overlap: result 3; r3. ; exact : result 3; m101 ; move name.work to name.sender; (in case of wrk-name) g10: ; set name and interval: m150 ; set name and interval; j0 ; result ok; e. ; ; create internal process ; ; call: ; w1.sender : parameter address ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : internal process created ; result = 1 : storage area outside calling process ; result = 1 : internal claims exceeded ; result = 1 : illegal protection ; result = 1 : maxbase or stdbase not contained in ; corresponding base of calling process ; result = 2 : catalog io-error ; result = 3 : name overlap ; result = 3 : name already exists ; result = 6 : nameformat illegal p28: ; create internal process: m65 ; move catbase,name to work; m15 ; test new system name (maybe wrk-name): r3. ; overlap: result 3; r3. ; exact : result 3; m101 ; move name.work to name.sender (in case of wrk-name); m151 ; create internal process; m150 ; set name and interval; j0 ; result ok; ; start internal process ; ; call: ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : internal process started ; ( result = 2 : state of process does not permit start ) ; result = 3 : process does not exist ; result = 3 : process is not an internal process ; result = 3 : process is not a child of calling process ; result = 6 : nameformat illegal p29: ; start internal process: m65 ; move catbase,name to work; m152 ; start internal process; ; stop internal process ; ; call: ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : stop initiated ; result = 3 : process does not exist ; result = 3 : process is not an internal process ; result = 3 : process is not a child of calling process ; result = 6 : nameformat illegal ; w2.sender : buffer address (in case result=0) p30: ; stop internal process: m65 ; move catbase,name to work; m153 ; stop internal process; ; modify internal process ; ; call: ; w1.sender : register address ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : internal process modified ; ( result = 2 : state of process does not permit modification ) ; result = 2 : child ic outside child process ; result = 3 : process does not exist ; result = 3 : process in not an internal process ; result = 3 : process is not a child of calling process ; result = 6 : nameformat illegal p31: ; modify internal process: m65 ; move catbase,name to work; m154 ; modify internal process; ; remove process ; ; call: ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : process removed ; result = 1 : function forbidden in calling process ; result = 2 : state of process does not permit removal ; result = 2 : calling process is not a user of process ; result = 2 : claimed message to pseudo process ; result = 3 : process does not exist ; result = 3 : process is not a child of calling process ; result = 5 : peripheral process reserved by another user ; result = 6 : nameformat illegal p32: ; remove process: m65 ; move catbase,name to work; m155 ; remove process; ; generate name ; ; call: ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : wrk-name generated ; result = 2 : catalog io-error p34: ; generate name: m16 ; generate wrk-name: r7. ; (irrell) r7. ; (irrell) m101 ; move name.work to name.sender; j0 ; result ok; ; copy ; ; call: ; w1.sender : first address ; w2.sender : buffer address ; w3.sender : last address ; ; return: ; w0.sender : result = 0 : area copied ; result = 2 : sender of buffer is stopped ; result = 3 : buffer describes input or output ; outside senders area ; result = 3 : message regretted ; result = 3 : operation in buffer is neither input not output ; w1.sender : bytes moved (if result=0) ; w3.sender : characters moved (if result=0) p35: ; copy: m156 ; copy message; ; set catalog base ; ; call: ; w0.sender : lower base ; w1.sender : upper base ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : catalog base set ; ( result = 2 : state of process does not permit modification ) ; result = 3 : process does not exist ; result = 3 : process is not an internal process ; result = 3 : process is not a child of calling process ; result = 4 : newbase illegal ; result = 6 : nameformat illegal p36: ; set catalog base: m65 ; move catbase,name to work; m71 ; test new base; m74 ; set catbase of internal; j0 ; result ok; ; set entry base ; ; call: ; w0.sender : lower base ; w1.sender : upper base ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : entry interval set ; result = 2 : catalog io-error ; result = 2 : document not ready ; result = 3 : entry not found ; result = 3 : name overlap (at new base) ; result = 3 : name already exists (at new base) ; result = 4 : entry protected against calling process ; (i.e. oldbase.entry outside maxbase.sender) ; result = 4 : key,newbase combination illegal ; result = 5 : entry used by another process ; result = 6 : nameformat illegal ; result = 7 : maincat not present b. g10 h. p37: ; set entry base: m0 , r7. ; if no maincat then result 7; m65 ; move catbase,name to work; m11 , 2.0100; search best entry and test modif allowed (no users) m36 , t3 ; search chain (state = ready); m71 ; test new base; m72 ; save oldbase, base.work := newbase; r0. ; same base: result ok; m75 ; test base.work,key.work combination; r4. ; error: result 4; m17 ; test new system name (wrk-name not allowed): r3. ; overlap: result 3; r3. ; exact : result 3; m56 ; modify cur entry; m48 ; if areaprocess then reinit area process; m77 , r0. ; if key.work < min aux key then result ok; m4 ; set aux cat; m18 ; test new catalog name: g6. ; overlap: goto repair maincat; g8. ; exact : goto remove superfluous entry; g0: ; find old entry in auxcat: m73 ; restore oldbase; m18 ; test new catalog name: g1. ; overlap: goto create new; (does'nt matter) g2. ; exact : goto copy; ; the entry did not exist in the auxcat g1: ; create new: m55 ; find empty entry; g5. ; no room: goto repair maincat; m60 ; clear access counters.work; m125, g3. ; goto modify; g2: ; copy: m64 ; move statarea.entry to statarea.work; g3: ; modify: m71 ; (test and) get new base; m72 ; save oldbase, set newbase; r7. ; (same base: not possible) m56 ; modify cur entry; m88, g4. ; if size.work>=0 then m62 ; update and insert statarea; g4: ; m5 ; set maincat; j0 ; result ok; g5: ; repair maincat: m71 ; (test and) get new base; m72 ; save oldbase, set newbase; r7. ; (same base: not possible) g6: ; (newbase set): m5 ; set maincat; m18 ; test new catalog name: r7. ; overlap: result 7; (not possible) g7. ; exact : goto change main entry; j7 ; result 7; (not possible) g7: ; change main entry: m73 ; restore oldbase; m56 ; modify cur entry; j3 ; result 3; g8: ; remove superfluous entry: m57 ; delete cur entry; m125, g0. ; goto find old entry in auxcat; e. ; ; set backing storage claims ; ; call: ; w1.sender : claim list address ; w2.sender : docname address ; w3.sender : name address ; ; result: ; w0.sender : result = 0 : backing starage claims set ; result = 1 : claims exceeded (at calling process) ; result = 1 : claims exceeded (at child) ; result = 2 : document not found ; result = 3 : process does not exist ; result = 3 : process is not an internal process ; result = 3 : process is not a child of calling process ; result = 6 : nameformat (of docname) illegal ; result = 6 : nameformat (of childname) illegal p39: ; set bs claims: m104 ; move docname.sender to docname.work; m84 ; (size.work := 0); m36 , t29 ; search chain (state = allowed for set bs claims); m65 ; move catbase,name to work; m32 ; set bs claims; ; create pseudo process ; ; call: ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : pseudo process created ; result = 1 : (area) claims exceeded ; result = 2 : catalog io-error ; result = 3 : name overlap ; result = 3 : name already exists ; result = 6 : nameformat illegal p40: ; create pseudo process: m65 ; move catbase,name to work; m15 ; test new system name (maybe wrk-name): r3. ; overlap: result 3; r3. ; exact : result 3; m101 ; move name.work to name.sender (in case of wrk-name); m158 ; create pseudo process; m150 ; set name and interval; j0 ; result ok; ; general copy ; ; call: ; w1.sender: parameter address ; w2.sender: buffer address ; ; return: ; w0.sender: result = 0 : area copied ; result - 2 : sender of buffer stopped ; result = 3 : message regretted ; result = 3 : illegal addresses in buffer ; result = 3 : operation in buffer not odd p42: ; general copy: m157 ; ; prepare backing storage ; ; call: ; w3.sender : chainhead address ; ; return: ; w0.sender : result = 0 : chaintable allocated ; result = 1 : function forbidden in calling process ; result = 1 : area claims exceeded ; result = 2 : catalog io-error ; result = 3 : auxcat name overlap ; result = 3 : auxcat name already exists ; result = 4 : document-device does not exist ; result = 4 : device is not a bs-device ; result = 4 : device not reserved by calling process ; result = 5 : auxcat size <= 0 or auxcat size too large ; result = 5 : chainhead chain inconsistent ; result = 5 : auxcat chain inconsistent ; result = 5 : illegal kind of chaintable ; result = 5 : key illegal ; result = 5 : too many slices ; result = 5 : claims exceeded (too few slices for chaintable) ; result = 5 : claims exceeded (auxcat too large) ; result = 5 : claims exceeded (no room in maincat) ; result = 6 : auxcat nameformat illegal ; result = 6 : docname nameformat illegal ; result = 7 : no chains idle b. g10 h. p51: ; prepare bs: m8 , f71 ; check function mask (aux catalog handling); m86 ; move chainhead.sender to work and test auxcat size > 0; r5. ; auxcat size <= 0: result 5; ; test the auxcat name: m70 ; base.work := catalog interval; m17 ; test new system name (wrk-name not allowed): r3. ; overlap: result 3; r3. ; exact : result 3; ; test the document name: ; notice: the reservation ensures that the document does not exist ; already in the bs-system m85 ; search bs-process and check reserved by sender: r4. ; not found or not bs or not reserved: result 4; m70 ; base.work := catalog interval; (because moved again...) m76 ; test auxkey (and interval); ; give all claims to sender: m38 ; find empty chain and prepare; m20 ; copy chaintable chain; ; claim the slices used for chaintable: m25 ; test claims (prepare bs); r5. ; claims exceeded: result 5; m19 ; test chain errors; m21 ; copy chain and cut down (auxcat); ; claim the slices used for auxcat: ; (notice: the auxcat itself is not described in any catalog entry) m25 ; test claims (prepare bs); r5. ; claims exceeded: result 5; m19 ; test chain errors; ; insert in maincat a description of the aux catalog ; (if maincat does not exist yet, it will take place when ; the main catalog is connected) m0 , g5. ; if no maincat yet then goto no maincat; m31 ; prepare maincat entry; m30 ; test claims (create): r5. ; claims exceeded: result 5; m14 ; compute namekey; m55 ; find empty entry; r5. ; no room: result 5; m56 ; modify cur entry; g5: ; no maincat: m40 ; terminate update of new chainhead; ; notice: now the chain is included is the bs-system ; (still not ready for normal use) m37 , t1 ; state.chain := after prepare; m46 , 0 ; setup area process (procfunc) for auxcat; m47 , 2 ; include (sender) as user of auxcat area process; m49 ; let sender be reserver of auxcat area process; ; (i.e. sender may now make any modifications ; in the auxcat) ; (hint: he could have done any damage before he ; called ..prepare bs.. so why not let him have the ; advantage of the area-process concept) j0 ; result ok; e. ; ; insert entry ; ; call: ; w1.sender : entry address ; w3.sender : chainhead address ; ; return: ; w0.sender : result = 0 : entry inserted in main catalog ; result = 1 : function forbidden in calling process ; result = 2 : catalog io-error ; result = 2 : document not found ; result = 2 : state of document does not permit this call ; result = 3 : name overlap ; result = 3 : name already exists ; result = 4 : calling process is not user of the device ; result = 5 : key illegal ; result = 5 : interval illegal ; result = 5 : chain overlap ; result = 5 : chain outside limits ; result = 6 : nameformat illegal ; result = 6 : docname format illegal ; result = 6 : claims exceeded ; result = 7 : maincat not present ; ; notice: the claims of the process are ok, when result = 0,3,(5),7 b. g20 h. p52: ; insert entry: m8 , f71 ; check function mask (aux catalog handling) m109 ; move chainhead.sender to work; m84 ; (size.work := 0;) m36 , t21 ; search chain (state = allowed for insert entry); m9 ; check privileges; m37 , t2 ; state.chain := during insert; m107 ; move entry.sender to work; m76 ; test auxkey, interval; ; notice: if the main catalog has been connected from this ; document, the chain has already been copied, and ; entry and slices claimed m3 ; if main-catalog entry then r0. ; goto result ok; m21 ; copy chain (entry) and cut down; m0 , g20. ; if no maincat then goto claim slices only; m30 ; test claims (create entry): r6. ; claims exceeded: result 6; m19 ; test chain errors; m17 ; test new system name (wrk-name not allowed): g15. ; overlap: result 3; g15. ; exact : result 3; ; make it easy for changing the name of the document: m88 , g5. ; if size.work >= 0 then m66 ; docname.work := docname.chain; m125, g10. ; else g5: ; begin m90 ; (prepare compute docnumber: prevent alarms) m91 ; first slice.work := compute docnumber; g10: ; end; m55 ; find empty entry: r6. ; no room: result 6; m56 ; modify cur entry; j0 ; result ok; ; ; entry cannot be inserted in maincat but the entry is already claimed. ; unclaim 1 entry and 0 slices in main and auxcat and reclaim i entry in auxcat. g15: m280, r7. ; unclaim entries . (hardly claims exceeded.) m260, r7. ; claim 1 aux entry. j3 ; deliver result 3 g20: ; claim slices only: ; main catalog not present, therefor don't claim a maincat entry m26 ; test claims (create aux entry); r6. ; claims exceeded: result 6; m19 ; test chain errors; j7 ; result 7; e. ; ; insert backing storage ; ; call: ; w2.sender : docname address ; ; return: ; w0.sender : result = 0 : document included is bs-system ; result = 1 : function forbidden in calling process ; result = 2 : document not found ; result = 2 : state of document does not permit this call ; result = 4 : calling process is not user of device ; result = 6 : docname format illegal p53: ; insert bs: m8 , f71 ; check function mask (aux catalog handling); m104 ; move docname.sender to docname.work; m84 ; (size.work := 0;) m36 , t21 ; search chain (state = allowed for insert bs); m9 ; check privileges; m37 , t3 ; state.chain := ready; j0 ; result ok; ; delete backing storage ; ; call: ; w2.sender : docname address ; ; return: ; w0.sender : result = 0 : document removed from bs-system ; result = 1 : function forbidden in calling process ; result = 2 : catalog io-error ; result = 2 : document not found ; result = 4 : calling process is not user of device ; result = 5 : areaprocesses exists for the document ; result = 6 : main catalog on the document ; result = 6 : docname format illegal p54: ; delete bs: m8 , f71 ; check function mask (aux catalog handling); m104 ; move docname.sender to docname.work; m84 ; (size.work := 0); m36 , t23 ; search chain (state = allowed for delete bs); m9 ; check privileges; m115 ; check any area processes on document; m1 ; test main catalog not on document; m116 ; prepare catalog scan; m37 , t4 ; state.chain := during delete; ; the following assumes that the disc-driver handles messages: ; last come => last served ; a (dummy) message is sent to the aux catalog (in this case an input ; message, because such a procedure exists), and when the answer ; arrives, all other area-transfers must have been terminated too. ; the chaintable may now (soon) be used by another disc, if wanted. m4 ; set auxcat; m118 ; (get first auxcat segment); r0. ; (no entries with namekey = 0, does'nt matter) j0 ; result ok; ; delete entries ; ; call: ; w2.sender : docname address ; ; return: ; w0.sender : result = 0 : all entries deleted (from main catalog) ; and chain released ; result = 1 : function forbidden in calling process ; result = 2 : catalog io-error ; result = 2 : document not found ; result = 2 : state of document does not permit this call ; result = 3 : not all entries deleted yet ; result = 4 : calling process is not user of device ; result = 6 : docname format illegal b. g10 h. p55: ; delete entries: m8 , f71 ; check function mask (aux catalog handling); m104 ; move docname.sender to docname.work; m84 ; (size.work := 0;) m36 , t4 ; search chain (state = during delete); m9 ; check privileges; m0 ; if no maincat then g10. ; goto clear up; ; clear a portion of the main catalog for entries belonging to curdoc m118 ; for all curkey entries in main catalog do g5. ; begin m122, g1. ; if entry on document then m31 ; prepare maincat entry; m28 ; test claims (remove): r7. ; claims exceeded: result 7; (not possible) m120 ; delete entry; g1: ; m119 ; end for all entries; g5: ; m121 ; update entry count, if any deleted; m117 ; test more catalog segments to clean: r3. ; more segments: result 3; ; all entries, belonging to curdoc, has been removed from main catalog: g10: ; clear up: m70 ; base.work := catalog interval; m67 ; move auxcat name from chain to name.work; m45 ; search best area process: r7. ; not found: result 7; (not possible) m50 ; (if area process then) delete area process; m41 ; terminate use of chain and disc; m37 , t0 ; state.chain := idle; j0 ; result ok; e. ; ; connect main catalog ; ; call: ; w1.sender : main catalog name address ; w3.sender : chainhead address ; ; return: ; w0.sender : result = 0 : main catalog connected ; result = 1 : function forbidden in calling process ; result = 1 : area claims exceeded ; result = 2 : catalog io-error ; result = 2 : document not found ; result = 2 : state of document does not permit this call ; result = 3 : name does not exist in auxcat ; result = 3 : name overlap ; result = 3 : name already exists ; result = 4 : calling process is not user of device ; result = 5 : maincat size <= 0 or maincat size too large ; result = 5 : key illegal ; result = 5 : interval illegal ; result = 5 : chain overlap ; result = 5 : chain outside limits ; result = 6 : claims exceeded ; result = 6 : docname format illegal ; result = 7 : main catalog already present b. g10 h. p56: ; connect main catalog: m8 , f72 ; check function mask (main catalog handling); m0 , g1. ; if maincat already exists then j7 ; result 7; g1: ; m109 ; move chainhead.sender to work; m84 ; (size.work := 0;) m36 , t21 ; search chain (state = allowed for connect catalog); m9 ; check privileges; ; prepare a search in auxcat for a main catalog: m103 ; move catalog name.sender to name.work; m70 ; base.work := catalog interval; m17 ; test new system name (wrk-name not allowed): r3. ; overlap: result 3; r3. ; exact : result 3; m4 ; set auxcat; m10 ; search best entry (in aux catalog): r3. ; not found: result 3; m87 ; if size.work <= 0 then r5. ; result 5; m76 ; test auxkey (and interval); m37 , t2 ; state.chain := during insert; m21 ; copy chain and cut down; ; claim an auxcat entry and the slices used for main catalog m26 ; set claims (create aux entry): r6. ; claims exceeded : result 6; m19 ; test chain errors; m66 ; docname.work := docname.curdoc; m46 , 0 ; setup area process (procfunc) for main catalog area; m39 ; set maincat and prepare claims; m5 ; set maincat; m42 ; clean main catalog; m67 ; move auxcat name from chain to name.work; m70 ; base.work := catalog interval; m45 ; search best area process: r7. ; not found: result 7; (not possible) m47 , 2 ; include (sender) as user of auxcat area process; m49 ; let sender be reserver of auxcat area process; ; (see the hint in ..prepare backing storage..) ; insert all existing chainheads in main catalog m123 ; for all existing chaintables do r0. ; begin m31 ; prepare maincat entry; m30 ; test claims (create); r6. ; claims exceeded: result 6; m70 ; base.work := catalog interval; m14 ; compute namekey; m55 ; find empty entry: r6. ; no room: result 6; m56 ; modify cur entry; m119 ; end for; ; result ok; e. ; ; remove main catalog ; ; return: ; w0.sender : result = 0 : main catalog removed ; result = 7 : main catalog not present p57: ; remove main catalog: m8 , f72+f71; check function mask (main catalog handling); m0 , r7. ; if no maincat then result 7; m68 ; move maincat name from pseudo chainhead to name.work; m70 ; base.work := catalog interval; m45 ; search best area process: r7. ; not found: result 7; (not possible) m50 ; (if area process then) delete area process; m4 ; set auxcat; (i.e. prevent further use of main catalog) m2 ; clear maincat; j0 ; result ok; ; lookup bs claims ; call: ; w1.sender : claim list address ; w2.sender : document name address ; w3.sender : name address ; return: ; w0.sender : result = 0 : bs claims looked up ; result = 2 : document not found ; result = 3 : process does not exist ; result = 6 : name format illegal p59: ; lookup bs claims m104 ; move docname.sender to docname.work m84 ; size.work:=0 m36,t22 ; search chain, state = allowed for normal use m65 ; move catbase,name to work; m51 ; find best internal process and move bs claims ; create aux entry and area process ; ; call: ; w1.sender : entry address ; w2.sender : docname address ; w3.sender : procname address ; ; return: ; w0.sender : result = 0 : entry and areaprocess created ; result = 1 : function forbidden in calling process ; result = 1 : area claims exceeded ; result = 2 : catalog io-error ; result = 2 : document not found ; result = 2 : state of document does not permit this call ; result = 3 : procname overlap ; result = 3 : procname already exists ; result = 3 : entryname overlap (in auxcat) ; result = 3 : entryname already exists (in auxcat) ; result = 4 : calling process is not user of device ; result = 4 : claims exceeded ; result = 5 : key illegal ; result = 5 : interval illegal ; result = 6 : entryname format illegal ; result = 6 : procname format illegal ; result = 6 : docname format illegal b. g10 h. p60: ; create aux entry and area process: m8 , f76 ; check function mask (create aux entry); m104 ; move docname.sender to docname.work; m84 ; (size.work := 0;) m36 , t28 ; search chain (state = allowed for create aux); m9 ; check privileges; m107 ; move entry.sender to work; m90 ; first slice.work := 0; m88 , g1. ; if size.work >= 0 then m66 ; docname.work := docname.chain; g1: ; m76 ; test auxkey and interval; ; scan the auxcat to see if the new entry may be created: m4 ; set auxcat; m18 ; test new catalog name (in auxcat): r3. ; overlap: result 3; r3. ; exact : result 3; m37 , t6 ; state.chain := during aux entry manipulation; m22 , 2.10 ; compute slices to claim (compute new slices); m26 ; test claims (create aux entry): r4. ; claims exceeded: result 4; m23 ; adjust chain to size; m55 ; find empty entry: r4. ; no room: result 4; m6 ; dump chaintable; m60 ; clear access counters.work; m56 ; modify current entry; m88 , g2. ; if size.work>=0 then m62 ; update and insert statarea; g2: ; ; prepare for testing of the area-process name: m5 ; set maincat; m100 ; move name.sender to name.work; (i.e. get procname) m15 ; test new system name (wrk-name allowed): r3. ; overlap: result 3; r3. ; exact : result 3; m46 , 2 ; setup area process (sender); m49 ; let sender be reserver of the area-process; m101 ; move name.work back to name.sender (if wrk-name); j0 ; result ok; e. ; ; remove aux entry ; ; call: ; w1.sender : entry address ; w2.sender : docname address ; ; return: ; w0.sender : result = 0 : aux entry removed ; result = 1 : function forbidden in calling process ; result = 2 : catalog io-error ; result = 2 : document not found ; result = 2 : state of document does not permit this call ; result = 3 : entry does not exist (in auxcat) ; result = 6 : entry nameformat illegal ; result = 6 : docname format illegal p61: ; remove aux entry: m8 , f76 ; check function mask (create aux); m104 ; move docname.sender to docname.work; m84 ; (size.work := 0;) m36 , t28 ; search chain (state = allowed for aux entry manipulation m9 ; test privileges; m4 ; set auxcat; m107 ; move entry.sender to work; ; notice: there is no check upon legality of interval m10 ; search best entry (in auxcat): r3. ; not found: result 3; ; notice: it is not checked that it was the rigth entry (i.e. same base) m37 , t4 ; state.chain := during aux entry manipulation; m57 ; delete cur entry; ; notice: the entry- and slice-claims are not released, nor is the slice-chain j0 ; result ok; ; lookup aux entry ; ; call: ; w1.sender : tail address ; w2.sender : docname address ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : entry looked up ; result = 2 : catalog input-output error ; result = 2 : document not ready( or does not exist ; result = 3 : entry not found ; result = 6 : name format illegal ; result = 7 : maincat not present p43: ; lookup auxentry: m0 , r7. ; check maincat m65 ; move catbase.name to work m104 ; move docname.sender to docname.work m84 ; size.work:=0 m36 , t3 ; search chain (state ready) m4 ; set auxcat m100 ; move entry.sender to entry.work m10 ; seach best entry r3. ; not found result 3 m106 ; move tail.sender to tail.sender m5 ; set main cat j0 ; result ok ; clear statistics in aux entry ; ; call: ; w2.sender : dacname address ; w3.sender : name address ; ; return: ; w0.sender : result = 0 : the statistiks of the entry is initialised ; result = 2 : catalog input/output error ; result = 2 : document not ready(or does not exist) ; result = 3 : entry not found; name conflict(in auxcat) ; result = 6 : name format illegal; claims exceeded ; result = 7 : maincat not present b.g10 h. p44: ; m0 , r7. ; if no maincat then result 7 m65 ; move catbase.sender to work m104 ; move docname.sender to docname.work m84 ; size.work:=0 m36 , t3 ; search chain (state ready) m4 ; set aux cat m100 ; move entry.sender to entry.work m10 ; search best entry r3. ; not found result 3 m88 , g0. ; if size.work>=0 then m64 ; move statarea.entry to statarea.work m60 ; clear access counters.work m63 ; move statarea.work to statarea.entry g0: ; m5 ; set main cat j0 ; result ok e. \f n49: ; start of monitor call-table: p20., p21., p22., p23., p24., p25., p26., p27., p28., p29., p30., p31., p32., r7. , p34., p35., p36., p37., p38., p39., p40., r7. , p42., p43., p44. , p45., p46., r7. , r7. , r7. , r7. , p51., p52., p53., p54., p55., p56., p57., r7.,p59. , p60., p61., w. j0 = j0+n50 , j1 = j1+n50 , j2 = j2+n50 , j3 = j3+n50 , j4 = j4+n50 , j5 = j5+n50 , j6 = j6+n50 , j7 = j7+n50 ; record cat buf: ; this record holds the current catalog segment. if its content is ; changed, then the segment is rewritten onto the backing store at ; the very end of all process function actions. d0: -1, r.f9>1 ; cat buf (0:size-2); d18: 0 ; last word of cat buf. d19 = d0 - 2 + f10*f0 ; abs addr of last word of last entry ; in cat buf. c.(:a92>22a.1:)-1 m. procfunc testbuffer, start d49=k, 0, r.100, d50=k m. procfunc testbuffer, top z. ; interrupt address (used during debugging): ; proc func is entered here after programming errors. c. (:a92>21a.1:) -1 e30: 0, r.a180>1 ; ia: save for registers; al. w1 e30. ; if included print then rl w0 x1+0 ; begin jd 1<11+28 ; for i:=ia step 2 until ia+12 do al w1 x1+2 ; print w (word(i)); sh. w1 e30.+a180-2 ; wait forever in disabled mode; jl. -8 ; jl. (2) j7 z.c. -(:a92>21a.1:) ; else e30 = 0,z. ; ia:= 0; ; code for printing of proc func variables during debugging: e28: c.(:a92>19a.1:) -1 ; if test call included b. g24 ; then begin w. jl. x1+g0. ; goto case print param of ( g0: jl. (g17.) ; 0: error 7, jl. g1. ; 2: print cur entry, jl. (g17.) ; 4: print pf variables); g1: rl. w3 (g13.) ; print cur entry: al w2 x3+f0 ; for addr:= cur entry addr g3: rl w1 x3 ; step 2 until cur entry addr+entry size jd 1<11+30 ; do print x (word(addr)); al w3 x3+2 ; sh w3 x2 ; jl. g3. ; jl. (g11.) ; goto error 1; g11: j1, g17: j7, g13: d3, e.z. ; end; ; define the last b-names: b61 = k ; top address.proc func b62 = e30 ; interrupt address.proc func b63 = j10+2 ; waiting point i. ; id list of process functions ; after loading: b. g0 ; begin w.g0:al. w2 g0. ; define last: jl x3 ; autoload(next segment,top proc func); jd. g0. ; after loading: goto define last; e. ; end. the load code is removed; j21=k - b127 + 2 k = b61 ; top proc func e. ; end proc func segment ; segment 7: Initialize process functions ; this segment initializes the process descriptions for the first internal ; process (proc func). it is executed and then removed ; immediately after loading. s. g6 ; begin init proc func: w.b127=k, g6, k=k-2 g0: al. w2 g0. ; after load: load address := top of procfunc; jl x3 ; goto autoloader; jl. g0. ; entry from autoloader: goto after load; g6= k - b127 + 2 k = b61 ; k= first after proc func; e. ; end init proc func ▶EOF◀