|
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: 100608 (0x18900) Types: TextFile Names: »tjsclib «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦f546e193b⟧ └─⟦this⟧ »tjsclib «
job j 2 time 12 00 size 55000 perm disc1 1000 25 temp disc 1000 25 buf 10 area 10 oclaim mode listing.yes; yes => listning v. oversættelse clear user , jsclib , xnulstil , xnulfratil , xkl , xhex , xbin , xstatustxt , xwritealarm , xstderror , xtrapbreak , xnametable , xmaxbuflgd , xdumpzone , xinitinput , xinput , xwaitinput , xinitoutput , xsetoutput , xoutput , xwaitoutput , xcopyzone , xconnectout , xsortsq , xclaimproc , xbsclaim , xopencreate , xopencrsq , xprimostate , xprimosend , xhost , xsearchproc , xebcdtable , xwriteall , xy , xpos , xhome , xclreol , xclreos , xclrhom , xtrace , xtextlgd , xnameok , xdiscok , xclaim , oclaim , program ; slang procedurer xnulstil = set 1 disc1 ; jsc 01.01.1983 xnulfratil = entry bs xnulstil ; jsc 01.01.1983 ; algol procedurer jsclib = set 1 disc1 ; jsc 24.07.1987 xkl = set 1 disc1 ; jsc 01.12.1987 xhex = set 1 disc1 ; jsc 14.12.1988 xbin = set 1 disc1 ; jsc 14.12.1988 xstatustxt = set 1 disc1 ; jsc 15.11.1988 xwritealarm = set 1 disc1 ; jsc 15.10.1988 xstderror = set 1 disc1 ; jsc 10.11.1988 xtrapbreak = set 1 disc1 ; jsc 27.07.1988 xnametable = set 1 disc1 ; jsc 27.07.1988 xmaxbuflgd = set 1 disc1 ; jsc 27.09.1988 xdumpzone = set 1 disc1 ; jsc 15.08.1988 xinitinput = set 1 disc1 ; jsc 15.08.1988 xinput = set 1 disc1 ; jsc 15.08.1988 xwaitinput = set 1 disc1 ; jsc 15.08.1988 xinitoutput = set 1 disc1 ; jsc 15.08.1988 xsetoutput = set 1 disc1 ; jsc 15.08.1988 xoutput = set 1 disc1 ; jsc 15.08.1988 xwaitoutput = set 1 disc1 ; jsc 15.08.1988 xcopyzone = set 1 disc1 ; jsc 25.09.1988 xconnectout = set 1 disc1 ; jsc 27.07.1988 xsortsq = set 1 disc1 ; jsc 30.12.1987 xclaimproc = set 1 disc1 ; jsc 01.01.1982 xbsclaim = set 1 disc1 ; jsc 01.01.1982 xopencreate = set 1 disc1 ; jsc 01.08.1987 xopencrsq = set 1 disc1 ; jsc 01.08.1987 xprimostate = set 1 disc1 ; jsc 01.08.1987 xprimosend = set 1 disc1 ; jsc 01.08.1987 xhost = set 1 disc1 ; jsc 01.08.1987 xsearchproc = set 1 disc1 ; jsc 01.01.1982 xebcdtable = set 1 disc1 ; jsc 30.09.1981 xwriteall = set 1 disc1 ; jsc 05.02.1982 xy = set 1 disc1 ; jsc 21.01.1983 xpos = set 1 disc1 ; jsc 01.12.1987 xhome = set 1 disc1 ; jsc 01.12.1987 xclreol = set 1 disc1 ; jsc 01.12.1987 xclreos = set 1 disc1 ; jsc 01.12.1987 xclrhom = set 1 disc1 ; jsc 01.12.1987 xtrace = set 1 disc1 ; jsc 01.12.1987 xtextlgd = set 1 disc1 ; jsc 01.12.1987 xnameok = set 1 disc1 ; jsc 01.12.1987 xdiscok = set 1 disc1 ; jsc 01.12.1987 xclaim = set 1 disc1 ; jsc 12.10.1988 ; object programmer oclaim = set 1 disc1 ; jsc 01.07.1987 if listing.yes ( ljsclib = set 1000 disc1 scope user ljsclib if ok.no finis o ljsclib ) head iso jsclib = algol blocks.yes bossline.no ix.no xref.yes jsclib (dummy) external procedure jsclib; begin <* tom *> end procedure jsclib; end; if ok.yes if warning.yes (o c message algol procedure fejl jsclib finis) \f if listing.yes head iso (xnulstil = slang entry.no names.no xref.yes xnulstil xnulfratil) ; ; jsc den 1/1-1983 ; ; procedure til nulstilling af en vilkårlig type array ; kald af procedurer: ; xnulstil (array) ; xnulfratil (array, fra, til) ; array ::= vilkårlig type array eller zone ; fra ::= integer, der opfattes som intege field ; til ::= integer, der opfattes som intege field ; fra/til = -8388608 => fra/til := start adr på array ; fra/til = 8388607 => fra/til := slut adr på array ; ; nulstillingen -binært nul- sker fra første til sidste element i arrayet ; eller fra adresse <fra> til adresse <til>. ; adresserne <fra> og <til> opfattes som integer fields. ; -------------- ; ; cpu-forbruget på rc8000 model 55 er: ; xnulstil: 88 mikrosek til start og 3.7 mikrosek pr dobbeltord ; xnulfratil: 160 mikrosek til start og 3.7 mikrosek pr dobbeltord ; det ses heraf, at xnulstil er hurtigere end brugen af for i:=1 step 1 ... ; ved nulstilling af 6 dobbeltord og derover, og at xnulfratil er det ; ved nulstilling af 11 dobbeltord og derover. ; ; exempel 1: xnulstil (z) => hele z nulstilles ; exempel 2: xnulfratil (z, 10, 32) => z nulstilles fra adr 10 til 32 ; ; b. ; begin m.slangprocedure xnulstil og xnulfratil g1, i7 ; g0, g1 are used by insertproc as adresses ; of first and last tail. i-names area used ; to define entries and externals for tail- ; parts, may be changed to anything else but ; g0, g1, and h-names. l.d. ; list.off p.<:fpnames:> ; indkopier fpnames l. ; list.on s. d2, j60, a3, c7, f6 ; segm start ; d1 is used to define no. of abs words ; d2 is used to define no. of abs words + points ; j-names are used to define rs entries, for ; mnemotecnic resons they correspond to rs numbers. w. k=10000, h. ; i5=0 ; no of externals i4: d0: d2 , d1 ; rel last point, rel last abs word j4: i5+4 , 0 ; rs entry take expression j8: i5+8 , 0 ; - end adress expresion j13: i5+13, 0 ; - last used j21: i5+21, 0 ; - general alarm j29: i5+29, 0 ; - param alarm j30: i5+30, 0 ; - saved last used d1=k-2-d0 ; abs words d2=k-2-d0 ; abs words and points w. i3: i5 ; no of externals 0 ; no of owns 830101,0000 ; date, time ; arbejdsvariable f0: 0 ; array lgd f1: 0 ; adr på 1. element i array f2: 0 ; wrk adr f3: 0 ; - portion til behandling f4: 0 ; element lgd i array (hw) f5: 0 ; første adr i array f6: 0 ; sidste adr i array i0: i7: rl. w2 (j13.) ; w2:=last used ds. w3 (j30.) ; saved last used:=last used jl. w3 c0. ; kald check og udpak array ; hent 1. integer param, indexcheck og param i f1 dl w1 x2+12 ; get formals jl. w3 c4. ; index mv. check al w1 x1-1 ; w1 skal pege på første hw rs. w1 f5. ; f5:= lower adr wa w1 (x2+8) ; w1:=w1+base for array rs. w1 f1. ; f1:=lower adr ; hent 2. integer param, indexcheck og lgd i f0 dl w1 x2+16 ; get formals jl. w3 c4. ; index mv. check rs. w1 f6. ; f6:= upper adr ws. w1 f5. ; w1:=upper adr-lower adr al w1 x1+1 ; medtag endepunkterne rs. w1 f0. ; f0:=array lgd i hw jl. w3 a3. ; goto behandling i6: rl. w2 (j13.) ; w2:=last used ds. w3 (j30.) ; saved last used:=last used jl. w3 c0. ; kald check og udpak array a3: ; begin test ; dl. w3 (j30.) ; rl. w1 f5. ; rs w1 (x2+20) ; rl. w1 f6. ; rs w1 (x2+24) ; rl. w1 f0. ; rs w1 (x2+28) ;; jl. w3 (j8.) ; end test ; klargør til selve nulstillingen rl. w0 f0. ; w0:=array lgd rl. w1 f1. ; w1:=start adresse al w2 0 ; w2:=0 al w3 0 ; w3:=0 ; behandl første hw hvis array starter på ulige adr so w1 1 ; if w1 mod 2 = 0 then jl. a0. ; goto test slut adr hs w3 x1 ; hw.1:=0 al w1 x1+1 ; adr:=adr+1 al w0 -1 ; wa. w0 f0. ; lgd:=lgd-1 rs. w0 f0. ; f0:=lgd ; behandl sidste hw. hvis ulige arraylgd. a0: so w0 1 ; if lgd mod 2 <> 1 then jl. a1. ; goto test helord am. (f0.) ; else nulstil sidste element i array hs w3 x1-1 ; al w0 -1 ; wa. w0 f0. ; rs. w0 f0. ; lgd:=lgd-1; ; behandl første helord, hvis ikke lgd er et helt antal dobbeltord a1: so w0 2.01 ; if lgd mod 4 = 0 sz w0 2.10 ; jl. 4 ; jl. a2. ; then goto nulstil rs w3 x1 ; else første helord := 0 al w1 x1+2 ; adr:=adr+2 al w0 -2 ; wa. w0 f0. ; lgd:=lgd-2 rs. w0 f0. ; f0:=lgd ; nulstil portion a2: rl. w0 f0. ; w0:=lgd sl w0 4 ; if lgd >= 4 then jl. c1. ; goto udfør nulstilling jl. w3 (j8.) ; end adress expression ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; procedure check og udpak array (arr) ; call: w2: stack ref ; w3: return adress ; return: w0: length of array in hw (osse i f0) ; w1: adress of first word in array (osse i f1) ; w2: unchanged c0: al w1 2.11111 ; entry check and unpack: la w1 x2+6 ; kind:=bits(19:23).formal1 sn w1 23 ; if kind=zone then kind:=19 al w1 19 ; sh w1 21 ; if kind > 21 sh w1 16 ; or kind < 17 jl. w3 (j29.) ; then alarm(<:param:>) sn w1 17 ; if kind = boolean array al w1 1 ; then w1:=1 sn w1 18 ; if kind = integer array al w1 2 ; then w1:=2 sl w1 19 ; if kind >= real al w1 4 ; then w1:=4 rs. w1 f4. ; f4:=if boolean then 1 else i if integer then 2 else 4 rl w1 x2+8 ; ba w1 x2+6 ; rl w0 x1-2 ; rs. w0 f6. ; f6:=upper index ws w0 x1 ; w0:=upper index -(lower index - k) (= array lgd) rs. w0 f0. ; f0:=array lgd i hw rl w1 x1 ; al w1 x1+1 ; w1:=(lower index - k?) + 1 ; det tyder på at der er en fejl i manualen ; da der vist er tale om "lowerindex - 1" ; og ikke som angivet "lowerindex - k" rs. w1 f5. ; f5:=lower index wa w1 (x2+8) ; w1:=w1+base for array rs. w1 f1. ; f1:=abs lower adress jl x3 ; return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; udpak param og indexcheck samt oprunding til helord ; call: w0: 1. formal ; w1: 2. formal ; w2: stackref ; w3: retur adr ; retur w1: parameter ; w2: uændret ; w3: brugt til arb c4: rs. w3 c5. ; gem returadresse ; ; expressions are computed at callside (value def) so w0 16 ; if expression jl. w3 (j4.) ; then goto (rs take expression) ds. w3 (j30.) ; saved stack ref, saved w3:=w2,w3 dl w1 x1 ; w1:=res rl w3 x2+10 ; sz w3 1 ; if type = real cf w1 0 ; then convert to integer rl. w3 c7. ; w3:= -8388605 sh w1 x3 ; if param < -8388605 rl. w1 f5. ; then param:=start adr ac w3 x3 ; w3:=8388605 sl w1 x3 ; if param > 8388605 rl. w1 f6. ; then param:=slut adr sz w1 1 ; if w1 er ulige al w1 x1+1 ; then w1:=w1+1 al. w0 c6. ; w0:=alarmtext adresse sh. w1 (f6.) ; if w1 > upper index sh. w1 (f5.) ; or w1 < (<= ?) lower index jl. w3 (j21.) ; then (rs general alarm) jl. (c5.) ; returner c5: 0 ; returadr c6: <:<10>nulfield:> ; alarmtext c7: -8388605 ; næsten minus moppe ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; procedure udfør nulstil ; call: w0: lgd på resterende array ; w1: adr på første helord til nulstilling ; w3: nul c1: ac w0 (0) ; w0:=-lgd sh w0 -256 ; if lgd >= maxlgd al w0 -256 ; then w0:=-maxlgd rs. w0 f3. ; f3:=-portion i hw. rl. w0 f0. ; w0:=lgd wa. w0 f3. ; w0:=w0+portion rs. w0 f0. ; lgd:=lgd-portion ws. w1 f3. ; w1:=w1+portion rs. w1 f2. ; wrkadr:=wrkadr+portion rl. w0 f3. ; as w0 -1 ; w0:=protion // 2 am (0) ; jl. c3. ; goto c3-portion//2 c2: ds w3 x1-254 ; nulstil array (wrkadr-254) ds w3 x1-250 ; nulstil array (wrkadr-250) ds w3 x1-246 ; nulstil array (wrkadr-246) ds w3 x1-242 ; nulstil array (wrkadr-242) ds w3 x1-238 ; nulstil array (wrkadr-238) ds w3 x1-234 ; nulstil array (wrkadr-234) ds w3 x1-230 ; nulstil array (wrkadr-230) ds w3 x1-226 ; nulstil array (wrkadr-226) ds w3 x1-222 ; nulstil array (wrkadr-222) ds w3 x1-218 ; nulstil array (wrkadr-218) ds w3 x1-214 ; nulstil array (wrkadr-214) ds w3 x1-210 ; nulstil array (wrkadr-210) ds w3 x1-206 ; nulstil array (wrkadr-206) ds w3 x1-202 ; nulstil array (wrkadr-202) ds w3 x1-198 ; nulstil array (wrkadr-198) ds w3 x1-194 ; nulstil array (wrkadr-194) ds w3 x1-190 ; nulstil array (wrkadr-190) ds w3 x1-186 ; nulstil array (wrkadr-186) ds w3 x1-182 ; nulstil array (wrkadr-182) ds w3 x1-178 ; nulstil array (wrkadr-178) ds w3 x1-174 ; nulstil array (wrkadr-174) ds w3 x1-170 ; nulstil array (wrkadr-170) ds w3 x1-166 ; nulstil array (wrkadr-166) ds w3 x1-162 ; nulstil array (wrkadr-162) ds w3 x1-158 ; nulstil array (wrkadr-158) ds w3 x1-154 ; nulstil array (wrkadr-154) ds w3 x1-150 ; nulstil array (wrkadr-150) ds w3 x1-146 ; nulstil array (wrkadr-146) ds w3 x1-142 ; nulstil array (wrkadr-142) ds w3 x1-138 ; nulstil array (wrkadr-138) ds w3 x1-134 ; nulstil array (wrkadr-134) ds w3 x1-130 ; nulstil array (wrkadr-130) ds w3 x1-126 ; nulstil array (wrkadr-126) ds w3 x1-122 ; nulstil array (wrkadr-122) ds w3 x1-118 ; nulstil array (wrkadr-118) ds w3 x1-114 ; nulstil array (wrkadr-114) ds w3 x1-110 ; nulstil array (wrkadr-110) ds w3 x1-106 ; nulstil array (wrkadr-106) ds w3 x1-102 ; nulstil array (wrkadr-102) ds w3 x1-98 ; nulstil array (wrkadr-98) ds w3 x1-94 ; nulstil array (wrkadr-94) ds w3 x1-90 ; nulstil array (wrkadr-90) ds w3 x1-86 ; nulstil array (wrkadr-86) ds w3 x1-82 ; nulstil array (wrkadr-82) ds w3 x1-78 ; nulstil array (wrkadr-78) ds w3 x1-74 ; nulstil array (wrkadr-74) ds w3 x1-70 ; nulstil array (wrkadr-70) ds w3 x1-66 ; nulstil array (wrkadr-66) ds w3 x1-62 ; nulstil array (wrkadr-62) ds w3 x1-58 ; nulstil array (wrkadr-58) ds w3 x1-54 ; nulstil array (wrkadr-54) ds w3 x1-50 ; nulstil array (wrkadr-50) ds w3 x1-46 ; nulstil array (wrkadr-46) ds w3 x1-42 ; nulstil array (wrkadr-42) ds w3 x1-38 ; nulstil array (wrkadr-38) ds w3 x1-34 ; nulstil array (wrkadr-34) ds w3 x1-30 ; nulstil array (wrkadr-30) ds w3 x1-26 ; nulstil array (wrkadr-26) ds w3 x1-22 ; nulstil array (wrkadr-22) ds w3 x1-18 ; nulstil array (wrkadr-18) ds w3 x1-14 ; nulstil array (wrkadr-14) ds w3 x1-10 ; nulstil array (wrkadr-10) ds w3 x1-6 ; nulstil array (wrkadr-6) ds w3 x1-2 ; nulstil array (wrkadr-2) c3: jl. a2. ; return til nulstil portion h. 0, r.d0.+512-8 ; fyld op med nuller w. <:nulstil<0><0><0><0><0>:> ; fejltext i.e. ; end segment w. ; tail for insertproc g0: ; first entry 1 ; segm 0, 0, 0, 0 ; plads til navn 1<23+i6-i4 ; entrypoint 1<18+41<12 ; notype proc (undefined) 0 ; ; 1<18+3<12+3<6+3<0 ; test ; 13<18+13<12+41<6 ; test 4<12+i3-i4 ; kind, ext list 1<12+0 ; segm, own core g1: ; last entry 1<23+4 ; backingstorage 0,0,0,0 ; plads til navn 1<23+i7-i4 ; entrypoint 1<18+13<12+13<6+41<0 ; notype proc(undefined, val.integer, val.integer) 0 ; ; 1<18+3<12+3<6+3<0 ; test ; 13<18+13<12+41<6 ; test 4<12+i3-i4 ; kind, ext list 1<12+0 ; segm, own core l.d. ; list.off p.<:insertproc:> ; indkopier insertproc if ok.yes if warning.yes (o c message slang procedure fejl xnulstil xnulfratil finis) \f if listing.yes head iso xkl = algol blocks.yes bossline.no ix.no xref.yes xkl external integer procedure xkl; begin real r; systime (5, 0, r); xkl := r; end procedure xkl; end; if ok.yes if warning.yes (o c message algol procedure fejl xkl finis) \f if listing.yes head iso xhex = algol blocks.yes bossline.no ix.no xref.yes xhex external real procedure xhex (tal, cif); value tal; long tal; integer cif; begin <* returner tal som "cif" hexcifre *> own integer state; integer i, j; real r; r := real <::>; if state < cif then begin <* op til 6 cifre *> repeat state := state + 1; j := tal shift (- (cif - state) * 4) extract 4; j := if j < 10 then j + '0' else j - 10 + 'A'; r := real (logor (r, extend j shift (40 - (state - 1) mod 6 * 8))); until state mod 6 = 0 or state = cif; if state mod 6 <> 0 then state := 0; <* der kan være et "nul" *> end else state := 0; <* slut med "nul" *> xhex := r; end procedure xhex; end; if ok.yes if warning.yes (o c message algol procedure fejl xhex finis) \f if listing.yes head iso xbin = algol blocks.yes bossline.no ix.no xref.yes xbin external real procedure xbin (tal, cif); value tal; long tal; integer cif; begin <* returner tal som "cif" bincifre *> own integer state; integer i, j; real r; r := real <::>; if state < cif then begin <* op til 6 cifre *> repeat state := state + 1; j := tal shift (- (cif - state) * 1) extract 1; j := if j = 1 then '1' else '.'; r := real (logor (r, extend j shift (40 - (state - 1) mod 6 * 8))); until state mod 6 = 0 or state = cif; if state mod 6 <> 0 then state := 0; <* der kan være et "nul" *> end else state := 0; <* slut med "nul" *> xbin := r; end procedure xbin; end; if ok.yes if warning.yes (o c message algol procedure fejl xbin finis) \f if listing.yes head iso xstatustxt = algol blocks.yes bossline.no ix.no xref.yes xstatustext external real procedure xstatustxt (bit); integer bit; begin <* proceduren omsætter bit, der angiver bitnr talt fra venstre i statusordet (0..23) til text *> xstatustxt := real (case bit + 1 of ( <:intervention:>, <:parity error:>, <:timer:>, <:data overrun:>, <:block length:>, <:end document:>, <:load point:>, <:att or tape mark:>, <:write enable:>, <:mode error:>, <:read error:>, <:card reject:>, <:checksum:>, <:bit 13:>, <:bit 14:>, <:stopped:>, <:word defect:>, <:position error:>, <:non exist:>, <:disconnected:>, <:unintelligible:>, <:rejected:>, <:normal:>, <:hard error:>)); end procedure xstatustxt; end; if ok.yes if warning.yes (o c message algol procedure fejl xstatustxt finis) \f if listing.yes head iso xwritealarm = algol blocks.yes bossline.no ix.no xref.yes xwritealarm external boolean procedure xwritealarm; begin <* hvis alarmtypen er "giveup" udskrives alarmtexten og der returneres true ellers returneres false *> long array text (1 : 4); long array field docname; integer status, cause, param, bit, col; real comma; integer array ia (1 : 20); docname := 8; status := getalarm (text); if text (1) shift (- 40) extract 8 <= 'sp' then begin <* slet foranstillet nl ell lign *> text (1) := text (1) shift 8 + text (2) shift (- 40); if text (2) shift (- 40) extract 8 <> 'nul' then text (2) := text (2) shift 8; end; cause := alarm_cause extract 24; param := alarm_cause shift (-24); if cause = - 11 then begin <* giveup alarm *> xwritealarm := true; col := write (out, text, param, "sp", 1, text.docname); comma := real <:: :>; for bit := 0 step 1 until 23 do if status shift bit < 0 then begin if col > 60 then begin outchar (out, 'nl'); comma := real <: :>; col := 0; end; col := col + write (out, string comma, string xstatustxt (bit)); comma := real <:, :>; end; end else xwritealarm := false; getzone6 (out, ia); if ia (1) <> 4 then setposition (out, 0, 0); end procedure xwritealarm; end; if ok.yes if warning.yes (o c message algol procedure fejl xwritealarm finis) \f if listing.yes head iso xstderror = algol blocks.yes bossline.no ix.no xref.yes xstderror external procedure xstderror (z, s, b); zone z; integer s, b; begin <* udskriver dokumentnavnet mv og kalder stderror v harderror *> integer array zd (1 : 20), tail (1 : 10); long array field laf2; laf2 := 2; getzone6 (z, zd); if monitor (42, z, 0, tail) <> 0 then tail.laf2 (1) := long <::>; write (out, "nl", 1, <<zd.dd>, xkl / 100 00, ":", 1, <<d>, zd.laf2, <: hw=:>, b, <: st=:>, string xbin (s, 24), if tail.laf2 (1) <> long <::> then <: disk.:> else <::>, tail.laf2, <: mk=:>, zd (1) shift (- 12), ".", 1, zd (1) extract 12, <: fi=:>, zd (7), <: bl=:>, zd (8), <: seg=:>, zd (9), <: zst=:>, zd (13), <: ush=:>, zd (17)); getzone6 (out, zd); if zd (1) <> 4 then setposition (out, 0, 0); if logor (s, zd (10)) extract 24 <> zd (10) or s extract 1 = 1 then stderror (z, s, b); end procedure xstderror; end; if ok.yes if warning.yes (o c message algol procedure fejl xstderror finis) \f if listing.yes head iso xtrapbreak = algol blocks.yes bossline.no ix.no xref.yes xtrapbreak external procedure xtrapbreak; begin <* proceduren breaker til næste trapniveau hvis alarmcause=break *> if alarmcause extract 24 = - 9 then begin <* break *> trap (0); <* clear evt. traplabel *> system (9, 8, <:<10>break:>); end break; end procedure xtrapbreak; end; if ok.yes if warning.yes (o c message algol procedure fejl xtrapbreak finis) \f if listing.yes head iso xnametable = algol blocks.yes bossline.no ix.no xref.yes xnametable external integer procedure xnametable (addr); value addr; integer addr; begin <* proceduren returnerer name table address for den givne processadresse ved ukendt process returneres nul *> integer array mon (1 : 5); integer max; system (5, 72, mon); <* get monitor (72 .. 80) *> max := (mon (5) - mon (1)) // 2 + 1; begin <* extra *> integer array core (1 : max); integer i, j; system (5, mon (1), core); <* get nametable *> i := 0; for i := i + 1 while core (i) <> addr and i < max do ; if core (i) = addr then xnametable := mon (1) + (i - 1) * 2 else xnametable := 0; end extra; end procedure xnametable; end; if ok.yes if warning.yes (o c message algol procedure fejl xnametable finis) \f if listing.yes head iso xmaxbuflgd = algol blocks.yes bossline.no ix.no xref.yes xmaxbuflgd external integer procedure xmaxbuflgd (antbuf, frit, high); value antbuf; integer antbuf, frit; boolean high; begin <* proceduren returnerer den maximalt mulige bufferlængde i hw pr buffer når der skal laves antbuf buffere fordelet over lavt og højt lager, hvis ikke high benyttes kun lavt lager der friholdes frit hw til programsegmenter mv *> integer i, l, h, b, a_l, a_h; integer array ia (1 : 4); long array la (1 : 2); system (13, i, ia); <* get algol release *> h := 0; l := if i <= 2 and ia (1) shift (- 12) <= 3 or not high then system (2, 0, la) <* før algol2 v.4.0 ell kun lavt lager *> else system (15, h, la); <* fra algol2 v.4.0 *> l := l - frit; if l < 0 then begin h := h + l; l := 0; end; if h < 0 then h := 0; al := (extend antbuf * l) // (l + h); ah := (extend antbuf * h) // (l + h); if al + ah < antbuf then antbuf := antbuf + 1; al := (extend antbuf * l) // (l + h); ah := (extend antbuf * h) // (l + h); b := if al = 0 then h // ah else if ah = 0 then l // al else if h // ah <= l // al then h // ah else l // al; xmaxbuflgd := b // 4 * 4; <* hele dw adresser *> comment test write (out, <<d>, <: l.:>, l, <: h.:>, h, <: al.:>, al, <: ah.:>, ah, <: b.:>, b); end procedure xmaxbuflgd; end; if ok.yes if warning.yes (o c message algol procedure fejl xmaxbuflgd finis) \f if listing.yes head iso xinitinput = algol blocks.yes bossline.no ix.no xref.yes xinitinput external procedure xinitinput (z, zd); zone z; integer array zd; begin <* jsc d. 15/8-1988 procedurekomplex til lowlevel dobbeltbufret io init-in/out-put benyttes før nogen anden procedure, zonedescriptor sættes op bl.a med zonestate 15/16 der betegner procedurekomplexet zonen skal på forhånd være åbnet på normal vis. setoutput forbereder zonen på output i angivne share, data fyldes ind med håndkraft. in/out-put sender message vha. monitor 16. v disk optælles segmcount. wait-in/out-put afventer svar vha. monitor 18 og kalder evt stderror. io-funktionerne styres udelukkende af zonen, zonedescriptoren og shareno der er altid sat op til en maximal stor record proceduren xcopyzone benytter procedurekomplexet til multibufret datakopiering, fx. fra lan til disk, disk til disk osv. *> <* proceduren initierer zonen z til input *> integer res, shno; integer array sh (1 : 12); shno := 1; <* start med første share *> getzone6 (z, zd); if zd (20) < zd (18) then system (9, zd (20), <:<10>zlgth:>); monitor (92, z, 0, sh); <* create entry lock process *> if zd (1) extract 12 = 4 then begin <* disc *> zd (7) := 0; <* filecount *> zd (8) := 0; <* blockcount *> zd (9) := 0; <* segmcount *> end disc; zd (13) := 15; <* zonestate after input *> zd (14) := zd (19) + (zd (20) // zd (18) * 4) * (shno - 1); <* record base *> zd (15) := zd (14) + zd (20) // zd (18) * 4; <* last hw *> zd (16) := zd (20) // zd (18) * 4; <* record length *> zd (17) := shno; <* used share *> if zd (16) < 1 then system (9, zd (20), <:<10>zlgth:>); setzone6 (z, zd); for shno := 1 step 1 until zd (18) do begin <* pr share *> comment getshare6 (z, sh, shno); sh (1) := 0; <* free share *> sh (2) := (zd (20) // zd (18) * 4) * (shno - 1) + 1; <* first shared *> sh (3) := sh (2) + (zd (20) // zd (18) * 4) - 1; <* last shared *> sh (4) := 3 shift 12 + 0; <* input *> sh (5) := zd (19) + sh (2); <* first abs adr *> sh (6) := zd (19) + sh (3) - 1; <* last abs adr *> sh (7) := zd (9); <* segm count *> sh (8) := sh (9) := sh (10) := sh (11) := 0; <* ubenyttet *> sh (12) := sh (5) + 0; <* top transferred *> setshare6 (z, sh, shno); end pr share; end procedure xinitinput; end; if ok.yes if warning.yes (o c message algol procedure fejl xinitinput finis) \f if listing.yes head iso xinput = algol blocks.yes bossline.no ix.no xref.yes xinput external integer procedure xinput (z, zd, shno, hw); value hw; zone z; integer array zd; integer shno, hw; begin <* proceduren starter input af hw halvord på zonen z's share shno hvis hw = 0 laves input med maxlgd hvis hv < 512 og kind = 4 laves alarm (length) hvis hw > zonebuffer laves alarm (length) hvis zonestate <> 15 laves alarm (zonest) hvis kind=4 tælles segmentcount op til næste segm retur antal hw i inputmessage *> integer array sh (1 : 12); comment getzone6 (z, zd); comment getshare6 (z, sh, shno); if hw = 0 then hw := zd (20) // zd (18) * 4; <* max antal hw *> if zd (13) <> 15 then system (9, zd (13), <:<10>zonest:>); if zd (1) extract 12 = 4 and hw < 512 then system (9, hw, <:<10>length:>); if hw > zd (20) // zd (18) * 4 then system (9, hw, <:<10>length:>); zd (14) := zd (19) + (zd (20) // zd (18) * 4) * (shno - 1); <* record base *> zd (15) := zd (14) + zd (20) // zd (18) * 4; <* last hw *> zd (16) := zd (20) // zd (18) * 4; <* record length *> zd (17) := shno; <* used share *> sh (1) := 0; <* free share *> sh (2) := (zd (20) // zd (18) * 4) * (shno - 1) + 1; <* first shared *> sh (3) := sh (2) + (zd (20) // zd (18) * 4) - 1; <* last shared *> sh (4) := 3 shift 12 + 0; <* input *> sh (5) := zd (19) + sh (2); <* first abs adr *> sh (6) := sh (5) + hw - 2; <* last abs adr *> sh (7) := zd (9); <* segm count *> sh (8) := sh (9) := sh (10) := sh (11) := 0; <* ubenyttet *> sh (12) := sh (5) + 0; <* top transferred *> setzone6 (z, zd); setshare6 (z, sh, shno); if monitor (16, z, shno, zd) = 0 then system (9, 6, <:<10>break:>); if zd (1) extract 12 = 4 then zd (9) := zd (9) + hw // 512; <* segmcount *> setzone6 (z, zd); xinput := hw; end procedure xinput; end; if ok.yes if warning.yes (o c message algol procedure fejl xinput finis) \f if listing.yes head iso xwaitinput = algol blocks.yes bossline.no ix.no xref.yes xwaitinput external integer procedure xwaitinput (z, zd, shno); zone z; integer array zd; integer shno; begin <* proceduren afventer input på zonen z's share shno retur antal hw læst *> integer hw, res; integer array sh (1 : 12), answer (1 : 8); zd (14) := zd (19) + (zd (20) // zd (18) * 4) * (shno - 1); <* record base *> zd (15) := zd (14) + zd (20) // zd (18) * 4; <* last hw *> zd (17) := shno; <* used share, skal sættes før wait answer *> zd (16) := zd (20) // zd (18) * 4; <* record length *> setzone6 (z, zd); res := monitor (18, z, shno, answer); if res = 1 and answer (1) = 0 then <* ok *> else if res <> 1 then xstderror (z, 1 shift res, 0) else if answer (1) = 1 shift 18 then hw := 0 <* em *> else if answer (1) <> 0 then xstderror (z, answer (1), answer (2)); hw := answer (2); xwaitinput := hw; end procedure xwaitinput; end; if ok.yes if warning.yes (o c message algol procedure fejl xwaitinput finis) \f if listing.yes head iso xinitoutput = algol blocks.yes bossline.no ix.no xref.yes xinitoutput external procedure xinitoutput (z, zd); zone z; integer array zd; begin <* proceduren initierer zonen z til output *> integer res, shno; integer array sh (1 : 12); shno := 1; <* start med første share *> getzone6 (z, zd); if zd (20) < zd (18) then system (9, zd (20), <:<10>zlgth:>); monitor (92, z, 0, sh); <* create entry lock process *> monitor (8, z, 0, sh); <* reserve process *> if zd (1) extract 12 = 4 then begin <* disc *> zd (7) := 0; <* filecount *> zd (8) := 0; <* blockcount *> zd (9) := 0; <* segmcount *> end disc; zd (13) := 16; <* zonestate after output *> zd (14) := zd (19) + (zd (20) // zd (18) * 4) * (shno - 1); <* record base *> zd (15) := zd (19) + zd (20) // zd (18) * 4; <* last hw *> zd (16) := zd (20) // zd (18) * 4; <* record length *> zd (17) := shno; <* used share *> if zd (16) < 1 then system (9, zd (20), <:<10>zlgth:>); setzone6 (z, zd); for shno := 1 step 1 until zd (18) do begin <* pr share *> comment getshare6 (z, sh, shno); sh (1) := 0; <* free share *> sh (2) := (zd (20) // zd (18) * 4) * (shno - 1) + 1; <* first shared *> sh (3) := sh (2) + (zd (20) // zd (18) * 4) - 1; <* last shared *> sh (4) := 5 shift 12 + 0; <* output *> sh (5) := zd (19) + sh (2); <* first abs adr *> sh (6) := zd (19) + sh (3) - 1; <* last abs adr *> sh (7) := zd (9); <* segm count *> sh (8) := sh (9) := sh (10) := sh (11) := 0; <* ubenyttet *> sh (12) := sh (5) + 0; <* top transferred *> setshare6 (z, sh, shno); end pr share; end procedure xinitoutput; end; if ok.yes if warning.yes (o c message algol procedure fejl xinitoutput finis) \f if listing.yes head iso xsetoutput = algol blocks.yes bossline.no ix.no xref.yes xsetoutput external procedure xsetoutput (z, zd, shno, hw); zone z; integer array zd; integer shno, hw; begin <* proceduren setter up til output af hw halvord på zonen z's share shno hvis hw < 512 og kind = 4 laves alarm (length) hvis hw = 0 laves alarm (length) hvis hw > zonebuffer laves alarm (length) hvis zonestate <> 16 laves alarm (zonest) *> integer array sh (1 : 12); comment getzone6 (z, zd); comment getshare6 (z, sh, shno); if zd (13) <> 16 then system (9, zd (13), <:<10>zonest:>); if hw < 512 and zd (1) extract 12 = 4 or hw = 0 then system (9, hw, <:<10>length:>); if hw > zd (20) // zd (18) * 4 then system (9, hw, <:<10>length:>); zd (14) := zd (19) + (zd (20) // zd (18) * 4) * (shno - 1); <* record base *> zd (15) := zd (14) + zd (20) // zd (18) * 4; <* last hw *> zd (16) := hw; <* record length *> zd (17) := shno; <* used share *> setzone6 (z, zd); end procedure xsetoutput; end; if ok.yes if warning.yes (o c message algol procedure fejl xsetoutput finis) \f if listing.yes head iso xoutput = algol blocks.yes bossline.no ix.no xref.yes xoutput external integer procedure xoutput (z, zd, shno, hw); zone z; integer array zd; integer shno, hw; begin <* proceduren starter output af hw halvord på zonen z's share shno hvis hw < 512 og kind = 4 laves alarm (length) hvis hw = 0 laves alarm (length) hvis hw > zonebuffer laves alarm (length) hvis zonestate <> 16 laves alarm (zonest) hvis kind=4 tælles segmentcount op til næste segm retur antal hw i inputmessage *> integer array sh (1 : 12); comment getzone6 (z, zd); comment getshare6 (z, sh, shno); if zd (13) <> 16 then system (9, zd (13), <:<10>zonest:>); if hw < 512 and zd (1) extract 12 = 4 or hw = 0 then system (9, hw, <:<10>length:>); if hw > zd (20) // zd (18) * 4 then system (9, hw, <:<10>length:>); zd (14) := zd (19) + (zd (20) // zd (18) * 4) * (shno - 1); <* record base *> zd (15) := zd (19) + zd (20) // zd (18) * 4; <* last hw *> zd (16) := zd (20) // zd (18) * 4; <* record length *> zd (17) := shno; <* used share *> sh (1) := 1; <* ready share *> sh (2) := (zd (20) // zd (18) * 4) * (shno - 1) + 1; <* first shared *> sh (3) := sh (2) + (zd (20) // zd (18) * 4) - 1; <* last shared *> sh (4) := 5 shift 12 + 0; <* output *> sh (5) := zd (19) + sh (2); <* first abs adr *> sh (6) := sh (5) + hw - 2; <* last abs adr *> sh (7) := zd (9); <* segm count *> sh (8) := sh (9) := sh (10) := sh (11) := 0; <* ubenyttet *> sh (12) := sh (5) + 0; <* top transferred *> setzone6 (z, zd); setshare6 (z, sh, shno); if monitor (16, z, shno, zd) = 0 then system (9, 6, <:<10>break:>); if zd (1) extract 12 = 4 then zd (9) := zd (9) + hw // 512; <* segmcount *> setzone6 (z, zd); xoutput := hw; end procedure xoutput; end; if ok.yes if warning.yes (o c message algol procedure fejl xoutput finis) \f if listing.yes head iso xwaitoutput = algol blocks.yes bossline.no ix.no xref.yes xwaitoutput external integer procedure xwaitoutput (z, zd, shno); zone z; integer array zd; integer shno; begin <* proceduren afventer output på zonen z's share shno retur antal hw skrevet *> integer hw, res; integer array sh (1 : 12), answer (1 : 8); zd (14) := zd (19) + (zd (20) // zd (18) * 4) * (shno - 1); <* record base *> zd (15) := zd (14) + zd (20) // zd (18) * 4; <* last hw *> zd (16) := zd (20) // zd (18) * 4; <* record length *> zd (17) := shno; <* used share, skal sættes før wait answer *> setzone6 (z, zd); res := monitor (18, z, shno, answer); if res = 1 and answer (1) = 0 then <* ok *> else if res <> 1 then xstderror (z, 1 shift res, 0) else if answer (1) <> 0 then xstderror (z, answer (1), answer (2)); hw := answer (2); xwaitoutput := hw; end procedure xwaitoutput; end; if ok.yes if warning.yes (o c message algol procedure fejl xwaitoutput finis) \f if listing.yes head iso xcopyzone = algol blocks.yes bossline.no ix.no xref.yes xcopyzone external long procedure xcopyzone (z_ind, z_ud, lgd, buflgd, shares); value lgd; zone z_ind, z_ud; long lgd; integer buflgd, shares; begin <* jsc d. 22/9-1988 proceduren kopierer indholdet fra z_ind til z_ud hvis lgd >= 0 kopieres lgd hw ellers til em på input z_ind og z_ud er zoner indeholdende kind og navn filer udvides ikke, stderror kaldes strax ved fejl antal hw kopieret returneres i procedurenavnet buflgd angiver hver enkelt buffer i hw shares angiver ønsket antal buffere pr input og output fx. giver buflgd=512 og shares=2 ialt 4 shares og 2048 hw *> <* testudskrifter slås til ved at ændre "comment test" til "comment test" *> zone z (buflgd // 4 * 2 * shares, 2 * shares, xstderror); integer shno, antsh, aktive, i; long hw; boolean em; long array field laf2; integer array ia, zd_ind, zd_ud (1 : 20), data (1 : shares * 2); laf2 := 2; antsh := shares * 2; em := false; hw := 0; if lgd < 0 then lgd := (extend (- 1)) shift (- 1); <* max tal *> comment test write (out, "nl", 1, <<d>, <:xcopyzone,:>, <: lgd.:>, lgd, <: buflgd.:>, buflgd, <: shares.:>, shares, <: forbrug, bufs.:>, antsh, <: hw:>, antsh * buflgd); <* open *> getzone6 (z_ind, ia); comment test write (out, "nl", 1, <:kopier fra.:>, ia.laf2, <<d>, <: kind.:>, ia (1) shift (- 12), ".", 1, ia (1) extract 12); getzone6 (z, zd_ind); tofrom (zd_ind, ia, 26); <* genbrug zd (1)..zd (13) *> setzone6 (z, zd_ind); xinitinput (z, zd_ind); getzone6 (z_ud, ia); comment test write (out, "nl", 1, <:kopier til.:>, ia.laf2, <<d>, <: kind.:>, ia (1) shift (- 12), ".", 1, ia (1) extract 12); getzone6 (z, zd_ud); tofrom (zd_ud, ia, 26); <* genbrug zd (1)..zd (13) *> setzone6 (z, zd_ud); xinitoutput (z, zd_ud); for shno := 1 step 1 until antsh do data (shno) := 0; <* fri *> aktive := 0; for shno := 1 step 2 until antsh do if lgd > 0 then begin <* initier input i hveranden *> comment test write (out, "nl", 1, <<d>, <:init input sh.:>, shno); data (shno) := - xinput (z, zd_ind, shno, 0); <* input max *> lgd := lgd + data (shno); data (shno) := - 1; <* input sendt *> aktive := aktive + 1; end init input; shno := 1; while aktive > 0 do begin <* while shares ude *> if data (shno) > 0 then begin <* output sendt *> comment test write (out, "nl", 1, <<d>, <:wait output:>); i := xwaitoutput (z, zd_ud, shno); if i < data (shno) then xstderror (z, 1 shift 19, i); <* blocklength *> hw := hw + i; data (shno) := 0; <* fri *> aktive := aktive - 1; end output sendt; if data (shno) < 0 then begin <* input sendt *> comment test write (out, "nl", 1, <<d>, <:wait input:>); i := xwaitinput (z, zd_ind, shno); if i < - data (shno) then xstderror (z, 1 shift 19, i); <* blocklength *> data (shno) := i; <* marker output sendt *> comment test write (out, <<d>, <: received.:>, data (shno)); if data (shno) >= 512 then begin <* ej em *> comment test write (out, "nl", 1, <<d>, <:output.:>, data (shno)); xoutput (z, zd_ud, shno, data (shno)); end ej em else begin <* em *> comment test write (out, "nl", 1, <<d>, <:em:>); em := true; data (shno) := 0; <* fri *> aktive := aktive - 1; end em; end input sendt; if data (shno) = 0 and not em and lgd > 0 then begin <* fri og ej em *> comment test write (out, "nl", 1, <<d>, <:input:>); data (shno) := - xinput (z, zd_ind, shno, 0); <* input max *> lgd := lgd + data (shno); aktive := aktive + 1; end fri og ej em; shno := if shno <> antsh then shno + 1 else 1; comment test write (out, "nl", 1, <<d>, <:status,:>, <: shno.:>, shno, <: aktive.:>, aktive, <: em.:>, if em then <:ja:> else <:nej:>, <: data (:>, shno, <:) = :>, data (shno), <: lgd.:>, lgd); end while aktive; xcopyzone := hw; end procedure xcopyzone; end; if ok.yes if warning.yes (o c message algol procedure fejl xcopyzone finis) \f if listing.yes head iso xdumpzone = algol blocks.yes bossline.no ix.no xref.yes xdumpzone external procedure xdumpzone (zout, z, shno, txt); zone zout, z; integer shno; string txt; begin <* proceduren udskriver indholdet af zonedescriptor hvis shno > 0 udskrives sharedescriptor nr shno hvis shno = 0 udskrives samtlige sharedescriptore hvis shno < 0 udskrives ingen sharedescriptor der udskrives på zonen zout *> integer i, j; integer array sh (1 : 12), zd (1 : 20); long array field laf2; laf2 := 2; getzone6 (z, zd); write (zout, "nl", 1, <:zone.:>, zd.laf2, "sp", 1, txt); for i := 1 step 1 until 20 do write (zout, <<-dddddddd>, if i mod 6 = 1 then "nl" else "sp", 1, zd (i)); if shno >= 0 then for j := (if shno = 0 then 1 else shno) step 1 until (if shno = 0 then zd (18) else shno) do begin getshare6 (z, sh, j); write (zout, "nl", 1, <:share no:>, j); for i := 1 step 1 until 12 do write (zout, <<-dddddddd>, if i mod 6 = 1 then "nl" else "sp", 1, sh (i)); end; outchar (zout, 'nl'); getzone6 (zout, zd); if zd (1) <> 4 then setposition (zout, 0, 0); end procedure xdumpzone; end; if ok.yes if warning.yes (o c message algol procedure fejl xdumpzone finis) \f if listing.yes head iso xconnectout = algol blocks.yes bossline.no ix.no xref.yes xconnectout external boolean procedure xconnectout; begin <* jsc d. 27/7-1988 connecter en evt. venstreside i programkaldet til out efterfølgende kald disconecter retur: true hvis venstreside i programkaldet eller false *> own integer nr; own long l1, l2; long array la, stack (1 : 2); integer array ia (1 : 20); if system (4, 1, la) = 6 shift 12 + 10 then begin <* venstre side *> if nr = 1 then begin <* disconnect *> stack (1) := l1; stack (2) := l2; getzone6 (out, ia); fpproc (34, 0, out, if ia (1) = 0 or ia (1) = 8 then 'nl' else 'em'); <* close up *> fpproc (30, 0, out, stack); <* unstack zone *> end disconnect else if nr = 0 then begin <* connect *> stack (1) := stack (2) := long <::>; system (4, 0, la); fpproc (33, 0, out, 'nul'); <* out end *> fpproc (29, 0, out, stack); <* stack zone *> fpproc (28, 1 shift 1 + 1, out, la); <* connect zone *> if monitor (42, out, 0, ia) = 0 and ia (1) >= 0 then begin <* lookup file ok *> ia (1) := 1; ia (6) := systime (7, 0, 0.0); ia (7) := ia (8) := ia (9) := ia (10) := 0; monitor (44, out, 0, ia); end lookup; l1 := stack (1); l2 := stack (2); end connect; nr := nr + 1; xconnectout := true; end venstre side else xconnectout := false; end procedure xconnectout; end; if ok.yes if warning.yes (o c message algol procedure fejl xconnectout finis) \f if listing.yes head iso xsortsq = algol blocks.yes bossline.no ix.no xref.yes xsortsq external procedure xsortsq (fromname, toname, todisc, nkey, recdescr, maxreclength, clear); long array fromname, toname, todisc; integer nkey, maxreclength; integer array recdescr; boolean clear; begin <* proceduren sorterer sqfilen i fromname over i toname call parametre: fromname ::= fra navn toname ::= tilnavn, 'nul' medfører wrknavn todisc ::= tildisc, 'nul' medfører frit valg nkey ::= antal nøgler recdescr ::= integer array (1 : nkey + 1, 1 : 2) der beskriver af nøglerne på formen: key1: type, field, key2: type, field .... type dækker over følgende: 1=12 bit signed integer 2=24 bit signed integer 3=long 4=real 5=12 bit unsigned integer positiv medfører stigende sortering negativ medfører faldende sortering hvis recdescr (nkey + 1, 1) <> 0 indholder den længdefeltet for recorden, ellers er der tale om fastlængde records maxreclength ::= fastlængde: recordlængden variablellængde: maximal recordlængde clear ::= true medfører clearing af inputfil *> integer noofrecs, result, explanation, i, j; real eof; integer array param (1 : 7); real array names (1 : 6); long array field laf0, laf8, laf16; laf0 := 0; laf8 := 8; laf16 := 16; param (1) := 0; <* segsprblock fra sq-filen *> param (2) := clear extract 1; <* 0=bevar inputfilen, 1=slet inputfilen *> param (3) := 0; <* segsprblock fra sq-filen *> param (4) := if recdescr (nkey + 1, 1) = 0 then 1 else 0; <* 1=fix, 0=var *> param (5) := maxreclength; <* reclgd/max reclgd *> param (6) := nkey; <* noofkeys *> param (7) := 1; <* runtimealarm v. resourceproblemer *> tofrom (names.laf0, fromname, 8); tofrom (names.laf8, toname, 8); tofrom (names.laf16, todisc, 8); eof := real <::>; noofrecs := - 1; <* tag fra sqfilen *> mdsortproc (param, recdescr, names, eof, noofrecs, result, explanation); if result <> 1 then system (9, 8,<:<10>xsortsq:>); tofrom (toname, names.laf8, 8); <* toname retur *> end procedure xsortsq; end; if ok.yes if warning.yes (o c message algol procedure fejl xsortsq finis) \f if listing.yes head iso xclaimproc = algol blocks.yes bossline.no ix.no xref.yes xclaimproc external boolean procedure xclaimproc (keyno, bsno, bsname, entries, segm, slicelgd); value keyno; integer keyno, bsno, entries, segm, slicelgd; long array bsname; <******************************************************************************* parametre keyno (kald) : 0 : temp 2 : login 3 : user / project bsno (kald) : -2 : returværdi = bsno for device with bsname -1 : returværdi = bsno for main bsdevice 0-n : uændret returværdi (n = max bsdevice) bsname (retur) : discnavn entries( - ) : antal entries (keyno) segm ( - ) : antal segmenter (keyno) slicelgd( - ) : slicelængde *******************************************************************************> begin boolean før_mon9; integer bsdevices, firstbs, ownadr, mainbs, i; long array field name; integer array core (1 : 18); name := 0; ownadr := system (6, i, core.name); system (5, 92, core); bsdevices := (core (3) - core (1)) // 2; firstbs := core (1); mainbs := core (4); if bsno >= 0 and bsno < bsdevices and keyno >= 0 and keyno <= 3 or bsno >= - 2 and bsno < 0 then begin integer array nametable (1 : bsdevices); name := 18; xclaimproc := true; system (5, firstbs, nametable); if keyno < 0 or keyno > 3 then keyno := 0; if bsno = - 1 then begin <* find main device number *> for bsno := bsno + 1 while nametable (bsno + 1) <> mainbs do; end bsno = - 1 else if bsno = - 2 then begin <* find device number for bsname *> bsno := - 1; repeat bsno := bsno + 1; system (5, nametable (bsno + 1) - 36, core); <* get chaintable *> until bsno >= bsdevices or (core.name (1) = bsname (1) and (core.name (1) extract 8 = 0 or core.name (2) = bsname (2))); if bsno >= bsdevices then goto fejl; end bsno = - 2; system (5, nametable (bsno + 1) - 36, core); <* get chaintable *> if core.name (1) shift (- 40) = 'nul' then goto ud; bsname (1) := core.name (1); if core.name (1) extract 8 <> 'nul' then bsname (2) := core.name (2) else bsname (2) := long <::>; slicelgd := core (15); før_mon9 := core (2) extract 12 shift (- 3) <> 3; system (5, ownadr + core (1), core); <* get process description *> if før_mon9 then begin <* monitor rel før 9.0 *> entries := core (keyno + 1) shift (- 12); segm := core (keyno + 1) extract 12 * slicelgd; end else begin <* monitor rel 9.0 og derefter *> entries := core (keyno * 2 + 1); segm := core (keyno * 2 + 2) * slicelgd; end; end else begin fejl: xclaimproc := false; ud: entries := segm := slicelgd := 0; bsname (1) := bsname (2) := 0; end; end xclaimproc; end; if ok.yes if warning.yes (o c message algol procedure fejl xclaimproc finis) \f if listing.yes head iso xbsclaim = algol blocks.yes bossline.no ix.no xref.yes xbsclaim external boolean procedure xbsclaim (funk, segm, entry, slicelgd, perm, kit); value funk, perm; integer funk, perm, segm, entry, slicelgd; long array kit; begin <******************************************************************************* kald: funk = 0 => max segmenter, entry opfyldt 1 => max entries , segm opfyldt 2 => max segmenter, max entries 3 => mest hensigtsmæssige disc, segm opfyldt, entr opfyldt 4 => min segmenter, segmenter og entries opfyldt 5 => min entries, segmenter og entries opfyldt 6 => min segmenter og min entries, s og e opfyldt segm = minimum antal segmenter der kræves entry = minimum antal entries der kræves perm = den aktuelle permkey (0=temp, 2=login, 3=user/project) kit = hvis kit = <::> ønskes et vilkårligt kit ellers kit hvis kravene ikke er opfyldt er bs_claim falsk og parametrene uforandrede hvis kravene er opfyldt er bs_claim sand og følgende gælder: retur: kit = navnet på kittet segm = antal segmenter på kit entry = antal entries på kit slicelgd = segm pr slice på kit perm = permkey for valgte løsning *******************************************************************************> real procedure ulempe; begin <* proceduren beregner ulempeværdien for en given sammensætning af slicelængde, rest-slices, rest-segmenter, vægtene for forbrug af slices og entries kan varieres i koden *> integer spild, fillgd_slices, afv_fra_gnsn, led_slices, slice_fak, entry_fak; <* sette er de to omtalte vægte *> real pct_fri_slices, pct_fri_entries; if seg >= slgd and entr > 0 then begin slice_fak := 20; entry_fak := 10; spild := (segm + slgd - 1) // slgd * slgd - segm; fillgd_slices := (segm - 1) // slgd + 1; led_slices := seg // slgd; pct_fri_entries := 100 / entr; pct_fri_slices := fillgd_slices * 100 / led_slices; afv_fra_gnsn := abs (fillgd_slices - led_slices / entr) * 100 / (led_slices / entr); ulempe := spild + slice_fak * pct_fri_slices + entry_fak * pct_fri_entries + afv_fra_gnsn; end seg > 0 and entr > 0 else ulempe := 2 ** 2044; end procedure ulempe; real gl_ulempe; integer max_entr, max, max_sl, kit_no, entr, seg, slgd, p, max_p; long array max_kit, bs (1 : 2); max_entr := max := max_sl := 0; max_p := perm; tofrom (max_kit, kit, 8); gl_ulempe := 2 ** 2045; for p := perm step 1 until 3 do begin <* alle permkeys støøre end ell lig med *> kit_no := - 1; for kit_no := kit_no + 1 while xclaimproc (p, kit_no, bs, entr, seg, slgd) do if bs (1) shift (- 40) = 'nul' or (kit (1) shift (- 40) <> 'nul' and (kit (1) <> bs (1) or kit (1) extract 8 <> 'nul' and kit (2) <> bs (2))) then <* forkert kit *> else if (case funk + 1 of ( seg > max and entr >= entry, entr > max_entr and seg >= segm, seg > max and entr >= max_entr or seg >= max and entr > max_entr, gl_ulempe > ulempe, seg >= segm and entr >= entry and (seg < max or max = 0), seg >= segm and entr >= entry and (entr < max_entr or max_entr = 0), seg >= segm and entr >= entry and ((seg < max or max = 0) or (entr < max_entr or max_entr = 0)), false)) then begin gl_ulempe := ulempe; max_entr := entr; max := seg; max_sl := slgd; max_p := p; tofrom (max_kit, bs, 8); end; end pr perm; if max >= segm and max_entr >= entry and max_kit (1) <> 0 then begin xbsclaim := true; tofrom (kit, max_kit, 8); segm := max; entry := max_entr; slicelgd := max_sl; perm := max_p; end ok else xbsclaim := false; end procedure xbsclaim; end; if ok.yes if warning.yes (o c message algol procedure fejl xbsclaim finis) \f if listing.yes head iso xopencreate = algol blocks.yes bossline.no ix.no xref.yes xopencreate external integer procedure xopencreate (z, modekind, name, giveup, perm); value modekind; zone z; integer modekind; long array name; integer giveup; integer perm; begin <* retur: 0 = ok 1 = reserved by another 2 = calling process is not a user 3 = process does not exist 4 = area process is writeprotected processen åbnes og der returneres efter ovenstående mønster, hvis filen ikke existerer oprettes denne, hvis der er peget på en entry åbnes til det denne peger på, oprettelse finder sted på disken med flest <perm> segmenter. filen reserveres ikke. *> integer i; integer array ia (1 : 20), bases (1 : 8); long array field doc; doc := 2; system (11, 0, bases); open (z, modekind, name, giveup); if monitor (42, z, 0, ia) = 0 <* existerer *> and ia (1) < 0 <* entry *> then begin <* gå videre i kæden *> close (z, true); open (z, ia (1) extract 23, ia.doc, giveup); modekind := ia (1) extract 23; end entry; if modekind extract 12 = 4 then begin <* diskfil *> if monitor (76, z, 0, ia) <> 0 <* lookup entry *> or ia (2) < bases (7) or ia (3) > bases (8) then begin <* create entry *> ia.doc (1) := ia.doc (2) := long <::>; xbsclaim (0, 1, 1, 0, perm, ia.doc); <* find disk med flest <perm> segm *> ia (7) := ia (8) := ia (9) := ia (10) := 0; ia (1) := 1; ia (6) := systime (7, 0, 0.0); monitor (40, z, 0, ia); <* create entry *> end create entry; end diskfil; monitor (52, z, 0, ia); <* create area process *> xopencreate := monitor (8, z, 0, ia); <* reserve process *> monitor (10, z, 0, ia); <* release process *> end procedure xopencreate; end; if ok.yes if warning.yes (o c message algol procedure fejl xopencreate finis) \f if listing.yes head iso xopencrsq = algol blocks.yes bossline.no ix.no xref.yes xopencrsq external integer procedure xopencrsq (z, name, giveup, function, perm); zone z; long array name; integer giveup, function, perm; begin <* processen åbnes og der returneres med opensq's værdi hvis filen ikke existerer oprettes denne, oprettelse finder sted på disken med flest <perm> segmenter. filen reserveres ikke. *> integer array ia (1 : 20), bases (1 : 8); integer buflgd; long array field doc; integer i; doc := 2; system (11, 0, bases); getzone6 (z, ia); buflgd := ia (20) // 128; open (z, 4, name, 0); close (z, false); if function extract 12 <> 2 then <* ej opret *> else if monitor (76, z, 0, ia) <> 0 <* lookup entry *> or ia (2) < bases (7) or ia (3) > bases (8) then begin <* create entry *> ia.doc (1) := ia.doc (2) := long <::>; xbsclaim (0, 1, 1, 0, perm, ia.doc); <* find disk med flest <perm> segm *> ia (7) := ia (8) := ia (9) := ia (10) := 0; ia (1) := 0; ia (6) := systime (7, 0, 0.0); monitor (40, z, 0, ia); <* create entry *> end create entry; i := 1; xopencrsq := opensq (z, string name (increase (i)), giveup, function); end procedure xopencrsq; end; if ok.yes if warning.yes (o c message algol procedure fejl xopencrsq finis) \f if listing.yes head iso xprimostate = algol blocks.yes bossline.no ix.no xref.yes index.yes xprimostate (index.yes) external real procedure xprimostate (nr); integer nr; begin <* max 17 tegn retur *> if nr < 0 then xprimostate := real (case - nr of ( <:?:>, <:Afvist af Primo:>, <:Primofejl:>, <:Primofejl:>, <:Primo mangler:>, <:Buffermangel:>, <:Parameterfejl:>, <:Parameterfejl:>, <:Parameterfejl:>, <:?:>, <:?:>, <:Transport ukendt:>, <:Resourcemangel:>, <:?:>, <:Filproblemer:>, <:Printerproblemer:>)) else xprimostate := real <:Ok:>; end procedure xprimostate; end; if ok.yes if warning.yes (o c message algol procedure fejl xprimostate finis) \f if listing.yes head iso xprimosend = algol blocks.yes bossline.no ix.no xref.yes index.yes xprimosend (index.yes) external integer procedure xprimosend (printer, fil); long array printer, fil; begin <* sender filen "fil" til printeren beskrevet ved entryen "printer", primosend returnerer transportnumret hvis alt er ok ellers - fejlkode, hvor fejlkode: 1 = ? 2 = Afvist af Primo 3 = Primofejl 4 = Primofejl 5 = Primo mangler 6 = Messagebuffermangel 7 = Parameterfejl 8 = Parameterfejl 9 = Parameterfejl 10 = ? 11 = ? 12 = Transport ukendt 13 = Resourcemangel 14 = ? 15 = Problemer med filen 16 = Problemer med printeren *> integer i, cleng, rleng; integer array carr (1 : 39), rarr (1 : 11); long array field transname, username, sendername, receivername, groupname, queuename; integer field reply, number, criterion, sendererror, receivererror, state, chposition, errorcause, errorstatus; long array processname (1 : 2); transname := 4; username := 16; sendername := 40; receivername := 50; groupname := 60; queuename := 68; reply := 2; number := 4; criterion := 60; sendererror := 16; receivererror := 20; state := 42; chposition := 44; errorcause := 50; errorstatus := 52; cleng := 39; for i := 1 step 1 until cleng do carr (i) := - 1; rleng := 11; for i := 1 step 1 until rleng do rarr (i) := 0; system (6, 0, processname); <* processname som user *> tofrom (carr.username, processname, 8); if fil (1) extract 8 = 'nul' then fil (2) := long <::>; tofrom (carr.sendername, fil, 8); if printer (1) extract 8 = 'nul' then printer (2) := long <::>; tofrom (carr.receivername, printer, 8); i := transfer (2, carr, cleng, rarr, rleng); if i = 0 and rarr.reply <> 0 then i := rarr.reply + 10; xprimosend := if i = 0 then rarr.number else - i; end procedure xprimosend; end; if ok.yes if warning.yes (o c message algol procedure fejl xprimosend finis) \f if listing.yes head iso xhost = algol blocks.yes bossline.no ix.no xref.yes xhost external integer procedure xhost (name); long array name; <* min 2 dw *> begin <* hent hostid og hostname hvis hostname starter med rc8000 og der er mere end 11 tegn slettes rc8000 samt evt efterfølgende - ol. *> integer array ia (1 : 1); long array xname (1 : 3); system (5, 1186, ia); xhost := ia (1); system (5, 1192, xname); if xname (1) extract 8 = 'nul' or xname (2) extract 8 = 'nul' then <* ok *> else if xname (1) = long <:rc800:> add '0' then begin <* slet første del af navnet *> xname (1) := xname (2); xname (2) := xname (3); xname (3) := long <::>; while xname (1) shift (- 40) extract 8 <= '@' do begin <* skub til venstre *> xname (1) := xname (1) shift 8 + xname (2) shift (- 40) extract 8; xname (2) := xname (2) shift 8 + xname (3) shift (- 40) extract 8; xname (3) := xname (3) shift 8; end skub; end slet første del; xname (2) := xname (2) shift (- 8) shift 8; <* slut med <nul> *> tofrom (name, xname, 8); end procedure xhost; end; if ok.yes if warning.yes (o c message algol procedure fejl xhost finis) \f if listing.yes head iso xsearchproc = algol blocks.yes bossline.no ix.no xref.yes index.yes xsearchproc external boolean procedure xsearchproc (z, typ, base, perm, navn, ia); value perm; integer perm, typ; zone z; integer array base, ia; long array navn; begin <************************************************************************** proceduren søger efter filer i cataloget, til hvilket z er åbnet, search returnerer true hvis den har fundet en entry, der opfylder base og perm-kravet, ellers returneres false. procedurekald : typ ::= 0 shift 0 => forfra 1 shift 0 => fortsæt 0 shift 1 => perm skal matche 1 shift 1 => perm altid ok 0 shift 2 => filens base skal være nøjagtig som base 1 shift 2 => filen skal ligge indenfor base 2 shift 2 => filen skal kunne ses fra base base ::= nedre/øvre base perm ::= 0 => temp 1 => special 2 => login 3 => permanent retur: typ ::= 1 shift 0 vil være sat hvis der er fundet en entry 0 shift 0 vil være sat hvis ingen entry fundet base ::= uændret perm ::= uændret navn ::= navn på fundet entry ia ::= head and tail (monitor-76) for fundet entry searchproc er true hvis entry fundet, ellers false *************************************************************************> own integer blok, entry_ref, res, gl_perm; own long gl_navn1, gl_navn2, gl_base; boolean fundet; integer array field entry; long field lf1, lf2; long array field laf; lf1 := 4; lf2 := 6; laf := 6; if typ extract 1 = 0 then begin <* forfra *> gl_perm := perm; gl_navn1 := gl_navn2 := gl_base := 0; blok := 0; entry_ref :=- 34; end forfra; fundet := false; setposition (z, 0, blok); res := inrec6 (z, 0); inrec6 (z, res); entry := entry_ref; if typ extract 1 = 1 then begin if z.entry (1) = - 1 or z.entry.lf2 <> gl_base or z.entry (1) extract 3 <> gl_perm or z.entry.laf (1) <> gl_navn1 or z.entry.laf (2) <> gl_navn2 then begin <* gal indgang *> while (if entry > 476 then false else z.entry (1) = - 1 or z.entry.lf2 <> gl_base or z.entry (1) extract 3 <> gl_perm or z.entry.laf (1) <> gl_navn1 or z.entry.laf (2) <> gl_navn2) do entry := entry + 34; if entry > 476 then entry := - 34; end; end typ <> 0; repeat entry := entry + 34; if entry > 476 then begin blok := blok + 1; entry := 0; res := inrec6 (z, 0); inrec6 (z, res); end ny blok; if res < 34 then <* slut *> else if z.entry (1) = - 1 then <* tom *> else if z.entry (1) extract 3 <> perm and typ shift (- 1) extract 1 = 0 then <* perm skal matche og det gør den ikke *> else if (case typ shift (- 2) extract 2 + 1 of ( <* 0<2 = filbaser matcher med base *> (extend z.entry (2) = extend base (1) and extend z.entry (3) = extend base (2)), <* 1<2 = filbaser indenfor base *> (extend z.entry (2) >= extend base (1) and extend z.entry (3) <= extend base (2)), <* 2<2 = filbaser ses fra base *> (extend z.entry (3) >= extend base (1) and extend z.entry (2) <= extend base (2)) )) then fundet := true; until fundet or res < 34; entry_ref := entry; if fundet then begin typ := typ shift (- 1) shift 1 + 1; xsearchproc := true; tofrom (ia, z.entry, 34); tofrom (navn, z.entry.laf, 8); gl_perm := ia (1) extract 3; gl_navn1 := navn (1); gl_navn2 := navn (2); gl_base := z.entry.lf2; end else begin typ := typ shift (- 1) shift 1; xsearchproc := false; gl_perm := 0; gl_navn1 := gl_navn2 := gl_base := 0; end; end procedure xsearchproc; end; if ok.yes if warning.yes (o c message algol procedure fejl xsearchproc finis) \f if listing.yes head iso xebcdtable = algol blocks.yes bossline.no ix.no xref.yes xebcdtable external procedure xebcdtable (type, alfa); value type; integer type; integer array alfa; begin <******************************************************************************* beskrivelse af proceduren xebcdtable (type, alfa); <type> ::= 1, 2, 3 eller 4 1 => iso til ebcdic 2 => iso til ebcdic incl. æ, ø og å konvertering af små bogstaver til store konvertering af div. tegn så udseendet passer til rc8000 printere 3 => ebcdic til iso 4 => ebcdic til iso incl. æ, ø og å konvertering af store bogstaver til små konvertering af div. tegn så udseendet passer fra rc8000 til ibm printere <alfa> ::= integer array startende i index 0 type = 1 => længden >= 128 type = 2 => længden >= 128 type = 3 => længden >= 256 type = 4 => længden >= 256 retur: alfa assignes med de interne tegn-værdier, svarende til de, ved type, specificerde tegnsæt. efter at alfa er assignet som iso til ebcdic, vil det, i forbindelse med "outtable" direkte være muligt at skrive ebcdic. efter at alfa er assignet som ebcdic til iso, vil det, i forbindelse med "intable" direkte være muligt at læse ebcdic. alle ukendte tegn assignes med værdien for "*", ved ebcdic til iso alfabetet får ukendte tegn endvidere tilknyttet tegnklasse 6, som omfatter alle almindelige bogstaver. alfa assignes fra index 0 til det maximale index. exempel på skrivning i ebcdic: ------------------------------ integer array alfa (0 : 127); - xebcdtable (2, alfa); outtable (alfa); comment der er nu indsat et ebcdic-alfabet til skrivning; - - - outtable (0); comment der er nu indsat et almindeligt iso-alfabet til skrivning; - exempel på læsning af ebcdic: ----------------------------- integer array alfa (0 : 255); - - xebcdtable (4, alfa); intable (alfa); comment der er nu indsat et ebcdic-alfabet til læsning; - - - intable (0); comment der er nu indsat et alm. iso-alfabet til læsning; - *******************************************************************************> integer alfa_max, alfa_lgd, i; if type = 1 or type = 2 then begin <* iso til ebcdic *> for i := 0 step 1 until 127 do alfa (i) := case i + 1 of ( <* 0 - 7 *> 0, 1, 2, 3, 55, 45, 46, 47, <* 8 - 15 *> 22, 5, 21, 11, 12, 13, 14, 15, <* 16 - 23 *> 16, 17, 18, 'Ø', 60, 61, 50, 38, <* 24 - 31 *> 24, 25, 63, 39, 34, 'Ø', 53, 'Ø', <* 32 - 39 *> 64, 90, 127, 123, 91, 108, 80, 125, <* ! " # $ % & ' *> <* 40 - 47 *> 77, 93, 92, 78, 107, 96, 75, 97, <* ( ) * + , - . / *> <* 48 - 55 *> 240, 241, 242, 243, 244, 245, 246, 247, <* 0 1 2 3 4 5 6 7 *> <* 56 - 63 *> 248, 249, 122, 94, 76, 126, 110, 111, <* 8 9 : ; < = > ? *> <* 64 - 71 *> 124, 193, 194, 195, 196, 197, 198, 199, <* @ A B C D E F G *> <* 72 - 79 *> 200, 201, 209, 210, 211, 212, 213, 214, <* H I J K L M N O *> <* 80 - 87 *> 215, 216, 217, 226, 227, 228, 229, 230, <* P Q R S T U V W *> <* 88 - 95 *> 231, 232, 233, 'Ø', 224, 'Ø', 95, 109, <* X Y Z * * * ^ _ *> <* 96 - 103 *> 121, 129, 130, 131, 132, 133, 134, 135, <* ` a b c d e f g *> <* 104 - 111 *> 136, 137, 145, 146, 147, 148, 149, 150, <* h i j k l m n o *> <* 112 - 119 *> 151, 152, 153, 162, 163, 164, 165, 166, <* p q r s t u v w *> <* 120 - 127 *> 167, 168, 169, 192, 106, 208, 161, 7, <* x y z * * * ü *> 0 ); end iso / ebcdic else if type = 3 or type = 4 then begin <* ebcdic til iso *> for i := 0 step 1 until 255 do alfa (i) := ( case i + 1 of ( <* 0 - 7 *> 0, 7, 7, 7, 6, 7, 6, 0, <* 8 - 15 *> 6, 6, 6, 7, 8, 0, 7, 7, <* 16 - 23 *> 7, 7, 7, 6, 6, 8, 7, 6, <* 24 - 31 *> 7, 8, 6, 6, 6, 6, 6, 6, <* 32 - 39 *> 6, 6, 7, 6, 6, 6, 7, 7, <* 40 - 47 *> 6, 6, 6, 6, 6, 7, 7, 7, <* 48 - 55 *> 6, 6, 7, 6, 6, 7, 6, 7, <* 56 - 63 *> 6, 6, 6, 6, 7, 7, 6, 7, <* 64 - 71 *> 7, 6, 6, 6, 6, 6, 6, 6, <* 72 - 79 *> 6, 6, 6, 4, 7, 7, 3, 6, <* 80 - 87 *> 7, 6, 6, 6, 7, 6, 6, 6, <* 88 - 95 *> 6, 6, 7, 7, 7, 7, 7, 7, <* 96 - 103 *> 3, 7, 6, 6, 6, 6, 6, 6, <* 104 - 111 *> 6, 6, 7, 7, 7, 7, 7, 7, <* 112 - 119 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 120 - 127 *> 6, 7, 7, 7, 6, 5, 7, 7, <* 128 - 135 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 136 - 143 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 144 - 151 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 152 - 159 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 160 - 167 *> 6, 7, 6, 6, 6, 6, 6, 6, <* 168 - 175 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 176 - 183 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 184 - 191 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 192 - 199 *> 7, 6, 6, 6, 6, 6, 6, 6, <* 200 - 207 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 208 - 215 *> 7, 6, 6, 6, 6, 6, 6, 6, <* 216 - 223 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 224 - 231 *> 7, 6, 6, 6, 6, 6, 6, 6, <* 232 - 239 *> 6, 6, 6, 6, 6, 6, 6, 6, <* 240 - 247 *> 2, 2, 2, 2, 2, 2, 2, 2, <* 248 - 255 *> 2, 2, 6, 6, 6, 6, 6, 6, 0 ) ) shift 12 + ( case i + 1 of ( <* 0 - 7 *> 0, 1, 2, 3, '*', 9, '*', 127, <* 8 - 15 *> '*', '*', '*', 11, 12, 13, 14, 15, <* 16 - 23 *> 16, 17, 18, '*', '*', 10, 8, '*', <* 24 - 31 *> 24, 25, '*', '*', '*', '*', '*', '*', <* 32 - 39 *> '*', '*', 28, '*', '*', '*', 23, 27, <* 40 - 47 *> '*', '*', '*', '*', '*', 5, 6, 7, <* 48 - 55 *> '*', '*', 22, '*', '*', 30, '*', 4, <* 56 - 63 *> '*', '*', '*', '*', 20, 21, '*', 26, <* 64 - 71 *> 32, '*', '*', '*', '*', '*', '*', '*', <* * * * * * * * *> <* 72 - 79 *> '*', '*', '*', 46, 60, 40, 43, '*', <* * * * . < ( + * *> <* 80 - 87 *> 38, '*', '*', '*', '*', '*', '*', '*', <* & * * * * * * * *> <* 88 - 95 *> '*', '*', 33, 36, 42, 41, 59, 94, <* * * ! * * ) ; * *> <* 96 - 103 *> 45, 47, '*', '*', '*', '*', '*', '*', <* - / * * * * * * *> <* 104 - 111 *> '*', '*', 124, 44, 37, 95, 62, 63, <* * * * , % _ > ? *> <* 112 - 119 *> '*', '*', '*', '*', '*', '*', '*', '*', <* * * * * * * * * *> <* 120 - 127 *> '*', 96, 58, 35, 64, 39, 61, 34, <* * ` : # @ ' = " *> <* 128 - 135 *> '*', 97, 98, 99, 100, 101, 102, 103, <* * a b c d e f g *> <* 136 - 143 *> 104, 105, '*', '*', '*', '*', '*', '*', <* h i * * * * * * *> <* 144 - 151 *> '*', 106, 107, 108, 109, 110, 111, 112, <* * j k l m n o p *> <* 152 - 159 *> 113, 114, '*', '*', '*', '*', '*', '*', <* q r * * * * * * *> <* 160 - 167 *> '*', 126, 115, 116, 117, 118, 119, 120, <* * ü s t u v w x *> <* 168 - 175 *> 121, 122, '*', '*', '*', '*', '*', '*', <* y z * * * * * * *> <* 176 - 183 *> '*', '*', '*', '*', '*', '*', '*', '*', <* * * * * * * * * *> <* 184 - 191 *> '*', '*', '*', '*', '*', '*', '*', '*', <* * * * * * * * * *> <* 192 - 199 *> 123, 65, 66, 67, 68, 69, 70, 71, <* * A B C D E F G *> <* 200 - 207 *> 72, 73, '*', '*', '*', '*', '*', '*', <* H I * * * * * * *> <* 208 - 215 *> 125, 74, 75, 76, 77, 78, 79, 80, <* * J K L M N O P *> <* 216 - 223 *> 81, 82, '*', '*', '*', '*', '*', '*', <* Q R * * * * * * *> <* 224 - 231 *> 92, '*', 83, 84, 85, 86, 87, 88, <* * * S T U V W X *> <* 232 - 239 *> 89, 90, '*', '*', '*', '*', '*', '*', <* Y Z * * * * * * *> <* 240 - 247 *> 48, 49, 50, 51, 52, 53, 54, 55, <* 0 1 2 3 4 5 6 7 *> <* 248 - 255 *> 56, 57, '*', '*', '*', '*', '*', '*', <* 8 9 * * * * * * *> 0 ) ); end ebcdic / iso else system (9, type, <:<10>***type:>); case type of begin ; <* iso til ebcdic *> begin <* iso til ebcdic modificeret *> alfa (91) := alfa (123) := 123; alfa (92) := alfa (124) := 124; alfa (93) := alfa (125) := 91; for i := 97 step 1 until 122 do alfa (i) := alfa (i - 32); end; ; <* ebcdic til iso *> begin <* ebcdic til iso modificeret *> alfa (123) := 6 shift 12 + 123; alfa (124) := 6 shift 12 + 124; alfa (91) := 6 shift 12 + 125; alfa (106) := alfa (192) := alfa (208) := alfa (224) := 6 shift 12 + '*'; for i := 193 step 1 until 201, 209 step 1 until 217, 226 step 1 until 233 do alfa (i) := alfa (i - 64); end; end case; alfa_lgd := case type of (128, 128, 256, 256); system (3, alfa_max, alfa); for i := alfa_lgd step 1 until alfa_max do alfa (i) := alfa (i - alfa_lgd); end procedure xebcdtable; end; if ok.yes if warning.yes (o c message algol procedure fejl xebcdtable finis) \f if listing.yes head iso xwriteall = algol blocks.yes bossline.no ix.no xref.yes xwriteall external procedure xwriteall (z, ra, lgd, type); value lgd, type; integer lgd; long type; zone z; real array ra; begin <* proceduren skriver indholdet af ra på zonen z på følgende former: type = 1 => real type = 10 => long type = 100 => integer type = 1000 => half type = 10000 => char type = 100000 => bits type = 1000000 => iso type = 10000000 => ebcdic type = 0 => alle samt diverse kombinationer af ovenstående. hvis lgd > 0 udskrives ra fra field 2 til field lgd ellers udskrives hele ra *> integer field ref; integer array field iaf0; integer fra, til, ord_pr_lin, lin_lgd, rest_plads, i; boolean typ; integer array ebcd (0 : 255); rest_plads := lin_lgd := ord_pr_lin := 0; iaf0 := 0; ref := 0; typ := type = 0; for i := 0 step 1 until 7 do typ := if round (type / 10 ** i) mod 10 <> 1 then typ else typ or false add (1 shift i); for i := 0 step 1 until 7 do lin_lgd := if -, typ shift (- i) then lin_lgd else lin_lgd + (case i + 1 of (20, 20, 10, 10, 12, 25, 4, 4)); ord_pr_lin := (114 - 8) // lin_lgd; if ord_pr_lin > 1 then ord_pr_lin := ord_pr_lin // 2 * 2; if typ shift (- 7) then begin xebcdtable (3, ebcd); for i := 0 step 1 until 255 do ebcd (i) := ebcd (i) extract 12; end; til := (lgd + 1) // 2; fra := if til > 0 then 1 else system (3, til, ra.iaf0); fra := fra * 2; til := til * 2; for ref := fra step 2 until til do begin integer array tegn (1 : 3); if rest_plads <= 0 then begin <* linieskift *> integer t; t := write (z, "nl", 1, <<ddd>, ref - 1, ":", 1, <<d>, if ref - 2 + ord_pr_lin * 2 <= til then ref - 2 + ord_pr_lin * 2 else til); write (z, "sp", 8 - t, ":", 1); rest_plads := ord_pr_lin; end linieskift; if typ shift (- 4) extract 8 > 0 then begin tegn (1) := ra.ref shift (- 16) extract 8; tegn (2) := ra.ref shift (- 8) extract 8; tegn (3) := ra.ref extract 8; end; if typ shift (- 0) then <* real *> begin integer t; real field rf; rf := ref; if rf - 2 >= fra then t := write (z, ra.rf) else t := 0; write (z, "sp", 10 - t); end real; if typ shift (- 1) then <* long *> begin integer t; long field lf; lf := ref; if lf - 2 >= fra then t := write (z, ra.lf) else t := 0; write (z, "sp", 20 - t); end long; if typ shift (- 2) then <* integer *> write (z, <<-ddddddddd>, ra.ref); if typ shift (- 3) then <* half *> write (z, <<-dddd>, ra.ref shift (- 12), ra.ref extract 12); if typ shift (- 4) then <* char *> write (z, <<-ddd>, tegn (1), tegn (2), tegn (3)); if typ shift (- 5) then <* bits *> begin integer bit; outchar (z, 'sp'); for bit := - 23 step 1 until 0 do if ra.ref shift bit extract 1 = 1 then outchar (z, '1') else outchar (z, '.'); end bits; if typ shift (- 6) then <* iso *> write (z, "sp", 1, false add (if tegn (1) > 32 and tegn (1) < 127 then tegn (1) else 32), 1, false add (if tegn (2) > 32 and tegn (2) < 127 then tegn (2) else 32), 1, false add (if tegn (3) > 32 and tegn (3) < 127 then tegn (3) else 32), 1); if typ shift (- 7) then <* ebcdic *> begin tegn (1) := ebcd (tegn (1)); tegn (2) := ebcd (tegn (2)); tegn (3) := ebcd (tegn (3)); write (z, "sp", 1, false add (if tegn (1) > 32 and tegn (1) < 127 then tegn (1) else 32), 1, false add (if tegn (2) > 32 and tegn (2) < 127 then tegn (2) else 32), 1, false add (if tegn (3) > 32 and tegn (3) < 127 then tegn (3) else 32), 1); end ebcdic; rest_plads := rest_plads - 1; end for ref; end procedure xwriteall; end; if ok.yes if warning.yes (o c message algol procedure fejl xwriteall finis) \f if listing.yes head iso xy = algol blocks.yes bossline.no ix.no xref.yes index.yes xy (index.yes) external real procedure xy (x, y); value x, y; integer x, y; begin comment jsc den 21/1-1983. beskrivelse af proceduren ---------- xy ---------- proceduren benyttes til positionering på rc822 skærme proceduren kaldes med x-y koordinaterne, hvor øverste venstre har koordinaterne 1,1 ex. writeint (z, string xy (40, 10), <<dddd.dd->, beløb); xy := if y < 1 then real ((extend 29 + 128) shift 32 + extend 13 shift 40) else real ((extend (6 + 128) shift 16 + 95 shift 8 + 95 + (x - (x - 1) shift (- 5) shift 6) shift 8 add y) shift 16 + extend 13 shift 40); end procedure xy; end; if ok.yes if warning.yes (o c message algol procedure fejl xy finis) \f if listing.yes head iso xpos = algol blocks.yes bossline.no ix.no xref.yes index.yes xpos (index.yes) external real procedure xpos (term, col, lin); value col, lin; integer term, col, lin; begin comment jsc den 21/12-1988. beskrivelse af proceduren ---------- xpos ---------- proceduren benyttes til positionering på diverse terminaler term betegner terminaltypen udskriftszonen skal lade alt gå transparent igennem (fx mode 1024) fx. 851=rc851, 822=rc822, 3=adm3, 52=vt52, 100=vt100, 220=vt220 proceduren kaldes med col-lin koordinaterne, hvor øverste venstre har koordinaterne 1,1 ex. writeint (z, string xpos (z, 100, 40, 10), <<dddd.dd->, beløb); own integer status, glterm; if term <> glterm and status <> 0 then term := status := 0; if col < 1 or col > 80 then col := 1; if lin < 1 or lin > 25 then lin := 1; if term = 100 or term = 200 or term = 220 then begin <* vt100 / vt200 / vt220 *> case status + 1 of begin begin xpos := real (extend 'esc' shift 40 + extend 'Æ' shift 32 + extend (lin // 10 mod 10 + '0') shift 24 + (lin mod 10 + '0') shift 16 + ';' shift 8 + (col // 10 mod 10 + '0')); status := 1; end; begin xpos := real (extend (col mod 10 + '0') shift 40 + extend 'H' shift 32); status := 0; end; end case; end vt100/200/220 else if term = 822 or term = 851 then begin <* rc822 / rc851 *> xpos := real (extend (6 shift 16 + 95 shift 8 + 95 + (col - (col - 1) shift (- 5) shift 6) shift 8 add lin) shift 16 + extend 'cr' shift 40); end rc822/851 else if term = 52 then begin <* vt52 *> xpos := real (extend 'esc' shift 40 + extend 'Y' shift 32 + extend (lin + 32) shift 24 + (col + 31) shift 16); end vt52 else if term = 3 then begin <* adm3 *> xpos := real (extend 'esc' shift 40 + extend '=' shift 32 + extend (lin + 32) shift 24 + (col + 31) shift 16); end adm3 else xpos := real <::>; glterm := term; end procedure xpos; end; if ok.yes if warning.yes (o c message algol procedure fejl xpos finis) \f if listing.yes head iso xhome = algol blocks.yes bossline.no ix.no xref.yes index.yes xhome (index.yes) external real procedure xhome (term); integer term; begin comment positionerer i øverste venstre hjørne; xhome := real ( if term = 822 or term = 851 then <:<29>:> else if term = 100 or term = 200 or term = 220 then <:<27>Æ;H:> else if term = 52 then <:<27>H:> else if term = 3 then <:<31>:> else <::>); end procedure xhome; end; if ok.yes if warning.yes (o c message algol procedure fejl xhome finis) \f if listing.yes head iso xclreol = algol blocks.yes bossline.no ix.no xref.yes index.yes xclreol (index.yes) external real procedure xclreol (term); integer term; begin comment clear to end of line; xclreol := real ( if term = 822 or term = 851 then <:<30>:> else if term = 100 or term = 200 or term = 220 then <:<27>Æ0K:> else if term = 52 then <:<27>K:> else if term = 3 then <:?:> else <::>); end procedure xclreol; end; if ok.yes if warning.yes (o c message algol procedure fejl xclreol finis) \f if listing.yes head iso xclreos = algol blocks.yes bossline.no ix.no xref.yes index.yes xclreos (index.yes) external real procedure xclreos (term); integer term; begin comment clear to end of screen; xclreos := real ( if term = 822 or term = 851 then <:<31>:> else if term = 100 or term = 200 or term = 220 then <:<27>ÆJ:> else if term = 52 then <:<27>J:> else if term = 3 then <:?:> else <::>); end procedure xclreos; end; if ok.yes if warning.yes (o c message algol procedure fejl xclreos finis) \f if listing.yes head iso xclrhom = algol blocks.yes bossline.no ix.no xref.yes index.yes xclrhom (index.yes) external real procedure xclrhom (term); integer term; begin comment home og clear to end of screen; own integer status, glterm; if term <> glterm and status <> 0 then term := status := 0; if term = 822 or term = 851 then xclrhom := real <:<29><31>:> else if term = 100 or term = 200 or term = 220 then begin <* vt100 / vt200 / vt220 *> case status + 1 of begin begin xclrhom := real <:<27>Æ;H<27>:> add 'Æ'; status := 1; end; begin xclrhom := real <:0J:>; status := 0; end; end case; end vt100/200/220 else if term = 52 then xclrhom := real <:<27>H<27>J:> else if term = 3 then xclrhom := real <:?:> else xclrhom := real <::>; glterm := term; end procedure xclrhom; end; if ok.yes if warning.yes (o c message algol procedure fejl xclrhom finis) \f if listing.yes head iso xtrace = algol blocks.yes bossline.no ix.no xref.yes xtrace external procedure trace (la); long array la; begin integer i; trap (ud); i := 1; if la (1) = long <::> then system (9, xkl, <:<10>trace:>) else system (9, xkl, string la (increase (i))); ud: end procedure trace; end; if ok.yes if warning.yes (o c message algol procedure fejl xtrace finis) \f if listing.yes head iso xtextlgd = algol blocks.yes bossline.no ix.no xref.yes xtextlgd external integer procedure textlgd (la); long array la; begin <* returnerer antal tegn i texten *> integer i, c, max; system (3, max, la); max := max * 6; i := 0; repeat c := la (i // 6 + 1) shift (i mod 6 * 8 - 40) extract 8; if c <> 'nul' then i := i + 1; until c = 'nul' or i = max; textlgd := i; end procedure textlgd; end; if ok.yes if warning.yes (o c message algol procedure fejl xtextlgd finis) \f if listing.yes head iso xnameok = algol blocks.yes bossline.no ix.no xref.yes index.yes xnameok (index.yes) external boolean procedure xnameok (name, maske); long array name, maske; begin <* true hvis name=maske, "*" og "?" kan benyttes på cpm vis tom maske medfører altid ok, max 12 tegn *> integer i, j, k, c1, c2; boolean ok; ok := true; i := 0; if maske (1) <> long <::> and maske (1) <> long <:*:> then repeat if i = 0 or c1 <> 'nul' then c1 := name (i // 6 + 1) shift (i mod 6 * 8 - 40) extract 8; c2 := maske (i // 6 + 1) shift (i mod 6 * 8 - 40) extract 8; ok := c1 = c2 or c2 = '?' or c2 = '*'; i := i + 1; until i = 12 or not ok or c2 = '*'; xnameok := ok; end procedure xnameok; end; if ok.yes if warning.yes (o c message algol procedure fejl xnameok finis) \f if listing.yes head iso xdiscok = algol blocks.yes bossline.no ix.no xref.yes index.yes xdiscok (index.yes) external boolean procedure xdiscok (disc, maske); long array disc, maske; begin <* true hvis disc=maske, tom maske medfører altid ok *> boolean ok; if maske (1) shift (- 40) = 'nul' then ok := true else if disc (1) = maske (1) and (disc (2) = maske (2) or maske (1) extract 8 = 'nul') then ok := true else ok := false; xdiscok := ok; end procedure xdiscok; end; if ok.yes if warning.yes (o c message algol procedure fejl xdiscok finis) \f if listing.yes head iso xclaim = algol blocks.yes bossline.no ix.no xref.yes index.yes xclaim (index.yes) external procedure xclaim (hw); integer hw; begin <* jsc den 22/2-1989 reserverer "hw" halvord i stakken *> integer array i (1 : (hw + 1) // 2); end; end; \f oclaim = algol blocks.yes bossline.no ix.no xref.yes connect.no oclaim begin <* kildetexten til oclaim *> <************************************************************************** jsc den 1/6-1987 Beskrivelse af programmet -----oclaim----- Claim program for Rc8000. Programkald: oclaim (<process>) process ::= navnet på processen hvis ressourcer skal udskrives, hvis udeladt tages os selv. **************************************************************************> long array procname (1 : 2); zone z (1, 1, stderror); integer bsdevices, firstbs, procadr, bsno, i, j; boolean ownprocess; integer array core, internal (1 : 18), ia (1 : 20); long array field laf0, laf2, name; real array field raf0; procedure fejl (text); string text; begin write (out, "*", 3, "sp", 1, text, "nl", 1); errorbits := 1 shift 0 + 1 shift 1; goto kikset; end procedure fejl; laf0 := raf0 := 0; laf2 := 2; name := 18; ownprocess := false; i := system (4, 1, procname); if i = 0 then begin <* own process *> ownprocess := true; procadr := system (6, 0, procname); end else if i = 4 shift 12 + 10 then begin <* specificeret process *> open (z, 0, procname, 0); close (z, true); procadr := monitor (4, z, 0, ia); getzone6 (z, ia); tofrom (procname, ia.laf2, 8); end else fejl (<:Parameter error:>); if procadr = 0 then fejl (<:Process does not exist:>); system (5, 92, core); <* get first bs mv. *> bsdevices := (core (3) - core (1)) // 2; <* top chain - first chain *> firstbs := core (1); begin <* extra niveau *> integer array nametable (1 : bsdevices); system (5, firstbs, nametable); <* get chaintable for bsdevices *> system (5, procadr, internal); <* get part of processdescr *> write (out, <<-d>, <:Claims for :>, internal.laf2, <: Size:>, internal (13) - internal (12), <: Bufs:>, internal (14) shift (- 12) + (if ownprocess then 1 else 0), <: Areas:>, internal (14) extract 12 + (if ownprocess then 1 else 0), <: Internals:>, internal (15) shift (- 12), <: Prio:>, internal (16), "nl", 1, "-", 72, "nl", 1, <:Discname Slice ---Temp--- ---Login--- ---Perm---:>); for bsno := 1 step 1 until bsdevices do begin <* gennemløb alle discs *> system (5, nametable (bsno) - 36, core); <* get part of chaintable *> system (5, procadr + core (1), internal); <* get part of internal *> if core.name (1) shift (- 40) <> 'nul' then begin <* ikke tom *> write (out, "nl", 1, true, 12, core.name, <<-ddddddd>, core (15)); for i := 0, 2, 3 do <* permkey *> write (out, <<-dddddd>, internal (i * 2 + 2) * core (15), <* segments *> <<-dddd>, internal (i * 2 + 1)); <* entries *> end ej tom; end for bsno; write (out, "nl", 1, "-", 72, "nl", 1); end extra; kikset: trapmode := 1 shift 10; <* drop end <segm> *> end; if ok.yes if warning.yes (o c message algol program fejl oclaim finis) \f if listing.yes head iso jsclib = compresslib , xnulstil , (xnulfratil er allerede libbet til xnulstil) xkl , xhex , xbin , xstatustxt , xwritealarm , xstderror , xtrapbreak , xnametable , xmaxbuflgd , xdumpzone , xinitinput , xinput , xwaitinput , xinitoutput , xsetoutput , xoutput , xwaitoutput , xcopyzone , xconnectout , xsortsq , xclaimproc , xbsclaim , xopencreate , xopencrsq , xprimostate , xprimosend , xhost , xsearchproc , xebcdtable , xwriteall , xy , xpos , xhome , xclreol , xclreos , xclrhom , xtrace , xtextlgd , xnameok , xdiscok , xclaim , if ok.no c=message kikset ved compresslib scope user.disc1 , jsclib , xnulstil , xnulfratil , xkl , xhex , xbin , xstatustxt , xwritealarm , xstderror , xtrapbreak , xnametable , xmaxbuflgd , xdumpzone , xinitinput , xinput , xwaitinput , xinitoutput , xsetoutput , xoutput , xwaitoutput , xcopyzone , xconnectout , xsortsq , xclaimproc , xbsclaim , xopencreate , xopencrsq , xprimostate , xprimosend , xhost , xsearchproc , xebcdtable , xwriteall , xy , xpos , xhome , xclreol , xclreos , xclrhom , xtrace , xtextlgd , xnameok , xdiscok , xclaim , oclaim ; if ok.no c=message kikset ved scope user lookup , jsclib , xnulstil , xnulfratil , xkl , xhex , xbin , xstatustxt , xwritealarm , xstderror , xtrapbreak , xnametable , xmaxbuflgd , xdumpzone , xinitinput , xinput , xwaitinput , xinitoutput , xsetoutput , xoutput , xwaitoutput , xcopyzone , xconnectout , xsortsq , xclaimproc , xbsclaim , xopencreate , xopencrsq , xprimostate , xprimosend , xhost , xsearchproc , xebcdtable , xwriteall , xy , xpos , xhome , xclreol , xclreos , xclrhom , xtrace , xtextlgd , xnameok , xdiscok , xclaim , oclaim ; if ok.no c=message der mangler filer o c c=message translation ended end finis ▶EOF◀