|
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: 126720 (0x1ef00) Types: TextFile Names: »tgetreci «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »tgetreci «
\f ; rc 07.11.78 algol7, file-i procedures, ib, comments page ...0... ; 01.02.81 eah ; 82.09.01 fb ; 85.09.01 fb/fgs m. isq release 14.0 1985.09.01 ; standard procedures for handling an indexed-sequential file ; slangnames: ; a : local in each procedure or subroutine block ; b : communication to tail part, other than entries ; c : global entry points in subroutines ; d : global labels in procedures and subroutines ; e : global entry points in the code procedure ; f : global defined constant values ; g : local segment head administration ; h : file processor names ; i : global addresses in the zonebuffer, relative to w2 = zonebufref ; note that the definitions of i-names here and ; in head_file_i must agree. ; j : abs words, local to each segment but same name = same meaning ; entry points and labels, non local: ; c, d and e-names are often defined in pairs, the even ; name as the absolute address and the following odd name as ; the segment relative name (odd e-names also used in tails); ; (the following survey is possibly not fully updated); ; ; name(s): point: segm,page: called from: ; c0 , c1: prepare 1 5 e0,e2,e4,e6,e8,e10,e16,e20 ; c4 : inouthere 1 7 e0,e2 ; c6 c7: inout 1 7 e4,e6,e20 ; c12,c13: putnew 1 8 e4,e6,e8,e20 ; c18,c19: movedbwords 5 e8 ; c28,c29: initblocktable 5 44 d30,e8 ; c30,c31: calltestproc 2 22 e8 ; d0 , d1: searchrec 1 9 e16 ; d2 , d3: accessnext 1 11 e0,e4,e6 ; d4 , d5: termaccess 1 11 e0 ; d6 , d7: testresult 1 12 e10 ; d8 , d9: startfile 1 13 e14 ; d10,d11: getreciint. 1 9 ; d12 : exitvianext 2 21 e10 ; d14 : exit3, segm2 2 21 e8 ; d16 : exit4, segm2 2 21 e8 ; d18 : exit2, segm2 2 21 e8 ; d20,d21: continsert 4 31 e0 ; e0 , e1: getreci 1 9 algol ; e2 , e3: nextreci 1 11 - ; e4 , e5: setupdatei 8 60 - ; e6 , e7: setreadi 8 60 - ; e8 , e9: initreci 2 17 - ; e10,e11: deletereci 2 20 - ; e12,e13: initfilei 3 24 - ; e14,e15: startfilei 3 24 - ; e16,e17: insertreci 4 33 - ; e18,e19: systemi 9 68 - ; e20,e21: setputi 8 60 - ; e22,e23: putreci 2 16 - ; e24,e25: getparamsi 7 53 - ; e26,e27: setparamsi 7 53 - ; e28,e29: settesti 7 53 - \f ; rc 07.11.78 algol7, file-i procedures, ib, comments page ...1... b. b5,e29,g1 ; w. ; s. c31,d31,f30,i10 ; w. ; Definition of addresses in the zonebuffer. ; Variables and codepieces in the zonebuffer are referenced relative ; to x2 = zonebufref = basebuffer + word(basebuffer+1) with the ; following relative addresses and meanings, only relevant ; after init_file_i or start_file_i has converted relative ; addresses to absolute ones; ; Note: ...size means always in bytes, ...length in reals. i0 = 0; entrypoints to code pieces: ; a code piece is called by: jl w2 (x2+rel) and ; returns again with w2 = zonebuffer; ; rel: name: function: ; i0+0 compare1 savekey verses a record key, result in w0 ; i0+2 compare2 savekey verses a keypart (in a table) ; i0+4 savethekey moves a record key to savekey ; i0+6 restorehead moves savekey and savelength to a record ; i0+8 copykey moves savekey to a keypart (in a table) ; i0+10 getsize yields bytesize of a record and moves, if needed, ; the length field to savelength, result in w1 ; i0+12 compare3 after initfilei: dummy otherwise as compare1 i1 = i0+14; insert parameters ; i1+0 empty block price ; i1+1 priceperbuck ; i1+2 empty buck price (used both as half- and fullword) ; i1+3 - - - - - - - - - ; i1+4 compressprice ; i1+5 priceperblock ; i1+6 shortbuf (0 = false, else true) ; i1+7 strategy (used as word if shortbuf = false) ; i1+8 computed price ; i1+10 pricelimit ; i1+12 transports ; i1+14 teststackref ; i1+16 testproc ; i1+18 max insertprice (not implemented) \f ; rc 07.11.78 algol6, file-i procedures, ib, comments page ...1a... i2 = i1+20; unclassified variables: ; i2+0 abs addr of recordbase in the zone descriptor (isq-sum in head) ; i2+2 - - - zonestate - - - - (in head: segs_per_buck) ; i2+4 - - - recordsize - - - - (in head: segs_in_head*seg_size-17) ; i2+6 errorbits, user spec. of action on resulti ; i2+8 actno: procnoi<7+newrec<6+errorbits ; i2+10 newrec , the base of a record when given as call param. ; i2+12 topfirstblocks, abstop for the first block table ; i2+14 bucktable size ; i2+16 maxrecsize ; i2+18 minrecsize-1 ; i2+20 blocksperbuck1, no of blocks in first buck ; i2+21 blocksperbuck , - - - - other bucks ; i2+22 bytesperblock , ensured capacity of a block ; i2+24 isq-release no i10 = 18 ; descrsize, see descriptions below i3 = i2+26 ; descr = bucks , see descriptions below i4 = i3+i10 ; descr = blocks, - - - i5 = i4+i10 ; descr = recs , - - - i6 = i5+i10+2; return information used during input output, and work. ; i6+0 return jump = jl X3 + ; i6+1 return rel ; i6+2 return segm ; i6+4 work0 ; i6+6 work1 ; i6+8 - 2 ; i6+10 - 3 ; i6+12 - 4 ; i6+14 - 5 ; i6+16 - 6 ; i6+18 - 7 ; i6+20 - 8 ; i6+22 - 9 ; i6+24 testbits == tail(9) extract 12 ; i6+26 (unused) ; i6+28 value of bufdif used from switchbuf and setbuf p.45 \f ; rc 22.01.79 algol 6, file_i procedures, jj/ib page ...2... i7 = i6 + 30 ; startbuckhead, first word of buchshare ; description of the total file: ; i7+0 maxused bucks, no of relevant bytes in bucktable ; i7+4 noofrecs , number of records in the file (dw) ; i7+6 ub (file) , table entry describing the whole file ; i7+8 sn (file) , in analogy with the bucktable and ; the blocktable ; i7+12 recbytes , number of bytes used for records in the file (dw) ; i7+14 updmarks , 1<0 = update, 1<1 = gossip, 1<2 = initialize ; i7+16 updcount , (not implemented) i8 = i7+30 ; first word of the bucktable. ; table entries: the bucktable and the blocktable consists ; of entries referenced via an absolute entryaddr ; entryaddr- ; entryheadsize+1: first word of entry, at present entryheadsize = 4 ; entryaddr-3 : ub (entry) , bytes used ; entryaddr-1 : sn (entry) , first segment ; entryaddr+1 : <keypart> (entry) ; entryaddr - ; entryheadsize + ; entrysize : lastword of <keypart> ; descriptions. ; the bucket table, ; the current bucket = the block table and ; the current block = the records are described by 3 ; descriptions: bucks, blocks and recs (i3, i4, and i5) ; each description holds at the indicated relative address: ; ; 0 these ; 2 first ; 4 entrysize ; 6 last ; 8 leap ; 10 shareopaddr ; 12 top ; 14 fill ; 16 segsinshare ; 17 segsper ; i10 curr abs addr of current entry in this table ; identical with these in the next description \f ; rc 07.11.78 algol7, file-i procedures, ib, comments page ...3... f0 = 10 ; lowest zonestate, altogether five consecutive ; values: set by: ; f0+0 = readonly startfilei, setreadi, getreci ; +1 = readnext nextreci ; +2 = put setputi ; +3 = update setupdatei ; +4 = initialize initfilei ; identification of file i procs: ;testshifts + no of results (maxvalue = 1<6-1 == 63) ; procno:(max=31) entry: page: f8 = 2 ; 1 initfilei e12 24 f5 = f8 + 4 ; 2 initreci e8 17 f9 = f5 + 2 ; 3 startfilei e14 24 f4 = f9 + 2 ; 4 setreadi e6 60 f17 = f4 + 2 ; 5 setputi e20 60 f3 = f17 + 2 ; 6 setupdatei e4 60 f1 = f3 + 3 ; 7 getreci e0 9 f2 = f1 + 2 ; 8 nextreci e2 11 f6 = f2 + 3 ; 9 deletereci e10 20 f7 = f6 + 6 ; 10 insertreci e16 33 f18 = f7 + 1 ; 11 putreci e22 16 ; 12 getparamsi e24 53 ; 13 setparamsi e26 53 ; 14 settesti e28 53 f19 = f18 + 1 ; 15 putblocki - f20 = f19 + 4 ; 16 putdirecti - f11 = 4 ; entryheadsize(bucks) f12 = 4 ; entryheadsize(blocks) f13 = 3 ; readoperation f14 = 5 ; writeoperation f15 = 26 ; integer kind as formal f16 = 37 ; min legal zonerefrel \f ; rc 15.06.79 file_i procedures, segment 1, jj/ib page ...4... ; prepare, inout, getreci, nextreci b. j20,g2 ; block for segment 1 k=10000 ; h. ; g0=0 ; no of externals + no of globals j0: g1, g2 ; rel of last point, rel of last absword j2: 1<11+1, 0; address of segment 2 j4: 1<11+3, 0; - - - 4 j5: 0, 1; result_i, permanent core byte 0-1 j6: g0+13 , 0; rs entry 13 last used j7: g0+30 , 0; - - 30 saved stackref and w3 j8: g0+21 , 0; - - 21 general alarm j9: g0+8 , 0; - - 8 end address expression j11: g0+4 , 0; - - 4 take expression j14: g0+85 , 0; - - 85 current activity no. (algol8) g2=k-2-j0 ; rel of last absword j10: g0+33 , 0; rs entry point 33 check g1=k-2-j0 ; rel of last point b0=9 ; total number of segments b1=k-j0 ; external list 0,0 ; no of globals, no of externals 0,0 ; core to copy w. s3,s4 ; date b2 = 4 ; total number of own core halfwords \f ; rc 09.03.79 algol7, file-i procedures, ib, segment 1 page ...5... ; subroutine prepare (statebits, actno); ; the routine is called at the start of each record handling procedure. ; it checks the zonestate against statebits when ; bit (23-f0-4+n) of: (statebits) = 1 if zonestate = n is allowed ; it saves actno and computes and saves zonebufrel from ; first formal and, if bit(17) of: (actno) = 1, computes and ; saves newrec from second formal. it sets result_i := 1; ; call return ; w0: statebits zonestate ; w1: actno undefined ; w2: irrelevant zonebufref ; w3: return address newrec or undefined b. a5 ; beginblock prepare w. ; al w0 2.11110 ; prepare(states(readonly,readnext, ; put,update);only entered from this segment!! c0: c1=k-j0 ; prepare: rl. w2 (j6.) ; begin ds. w3 (j7.) ; w2:= stackref:= lastused; rl w3 x2+8 ; save stackref and return; am (x3+h2+6) ; w3:= zoneaddr; ls w0 -f0-4 ; if bit(stack(zoneaddr) - empty state + 23) so w0 1 ; of (statebits) = 0 then goto prgerr; jl. a2. ; rl w3 x3+h0 ; formal 1.1 = wa w3 x3+1 ; zonebufref:= w2:= basebuffer(zoneaddr) + hs w1 x3+i2+9 ; relative zonebufref; rs w3 x2+6 ; actno:= w1; w3:= stackref; rx w2 6 ; so w1 1<6 ; if bit(17) of :(actno) = 1 then jl. a1. ; rl w3 (x3+12) ; w3:= newrec:= rs w3 x2+i2+10 ; array base addr (formal2); a1: al w0 1 ; rs. w0 (j5.) ; result_i:= 1; rl w0 (x2+i2+2) ; w0:= zonestate; rl. w1 (j7.) ; jl x1 ; return; a2: ls w1 -7 ; prgerr: hs. w1 a3. ; al w1 100 ; wm w1 x3+h2+6 ; a3=k+1 ; al w1 x1;+procno; general alarm ( al. w0 a4. ; state (zoneaddr) * 100 + procno; jl. w3 (j8.) ; <:state i:>); a4: <:<10>state i :> ; end prepare; m.prepare i. ; e. ; endblock prepare \f ; rc 26.06.70 algol 5, file_i procedures, jj, segment 1 page ...6... ; Input-output subroutines. ; Performs transports to and from the backing storage. ; One transport is performed by an explicit send message and ; is immediately waited for and checked by a call of rs-check. ; The basic subroutine is inout which in principle is used ; by all the other input-output. ; It writes, reads, or writes and read from/to one share according ; to the following algorithm: ; subroutine inout(descr, getbit); ; descr: abs address of the description specifying the transport. ; i.e. bucks, blocks, or recs; ; getbit: boolean, true==1, true if reading is wanted after write. ; begin ; if shareop(descr) = readop then ; read: ; begin ; sharesn(descr):= sn(these(descr)); ; last(descr):= first(descr) + ub(these(descr)) ; end; ; perform one transport including wait and check; ; if shareop(descr) = writeop then ; begin ; shareop(descr):= readop; ; if getbit then goto read ; end; ; ; registers: entry: exit ; w0 : returnsegm undefined ; w1 : descr+getbit descr+getbit ; w2 : zonebufref zonebufref ; w3 : abs return undefined ; entry points: c6, c7 ; The two other subroutines are described in terms of inout ; only w0 and w1 at entry may differ from the above ; Subroutine inouthere (descr, getbit); inout(descr, getbit); ; ; registers: entry: ; w0 : irrelevant ; entrypoint: c4. Note only call from this segment, otherwise as inout; ; Subroutine putnew(descr, getbit); ; begin ; shareop(descr):= writeop; ; ub(these(descr)):= curr(descr) - first(descr); ; sharesn(descr):= sn(these(descr)); ; inout(descr, getbit) ; end; ; ; entrypoints c12, c13 \f ; rc 20.09.79 algol8, file-i procedures, ib, segment 1 page ...7... b.a10 ; beginblock input-output; w. ; c4: rl. w0 j0. ; inouthere: w0:= thissegm; c6: c7=k-j0 ; inout: ws w3 (0) ; return segm:= w0; ds w1 x2+i6+4 ; work0:= descr+getbit; hs w3 x2+i6+1 ; relreturn:= w3 - segmtable(return segm); bl w0 (x1+10) ; if shareop(descr) = readop then se w0 f13 ; read: jl. a3. ; begin a1: dl w0 (x1+0) ; w0:= sn(these(descr)); wa w3 x1+2 ; last(descr):= rs w3 x1+6 ; first(descr) + ub(these(descr)); a2: am (x1+10) ; setsn: sharesn(descr):= w0; rs w0 6 ; end; ; a3: rl w1 x1+10 ; perform transport: rl w3 x2+i2+0 ; al w3 x3-h3+h1+2 ; rl. w0 (j5.) ; zonestate := result_i shift 12 + zonestate; hs w0 (x2+i2+2) ; <* save result_i while pasivated *> rl. w2 (j14.) ; w2:= currrent activity no. jd 1<11+16 ; w2:= sendmessage(docname, actno, shareopaddr(descr)); sn w2 0 ; if w2 = 0 then jd 1<11+18 ; nobuffer: provoke interrupt; al w1 x1-6 ; rs w2 x1 ; sharestate(descr):= w2; rs w1 x3-h1-2+h0+4; usedshare(zone):= share(descr); al w0 x3-h1-2+h3 ; ls w0 4 ; dl. w3 (j7.) ; rl. w1 j10. ; call rs check; jl. w3 (j11.) ; ds. w3 (j7.) ; rl w2 x2+6 ; w2:= zonebufref; comment from first formal. zl w3 (x2+i2+2) ; result_i:= zonestate shift (-12) extract 12; rs. w3 (j5.) ; <* unsave result_i - and.. *> al w3 0 ; zonestate := zonestate extract 12; hs w3 (x2+i2+2) ; <* reestablish zonestate *> rl w3 (x2+i6+2) ; w3:= segmtable(returnsegm); rl w1 x2+i1+12 ; al w1 x1+1 ; transportcount:= transportcount + 1; rs w1 x2+i1+12 ; rl w1 x2+i6+4 ; w1:= descr + getbit; bl w0 (x1+10) ; se w0 f14 ; if shareop(descr) <> readop then jl x2+i6+0 ; begin al w0 f13 ; shareop(descr):= readop; hs w0 (x1+10) ; if getbit then sz w1 1 ; goto read jl. a1. ; end; jl x2+i6+0 ; goto return jump; \f ; rc 17.01.79 algol7, file-i procedures, ib, segment 1 page ...8... c12: c13=k-j0 ; putnew: ws w3 (0) ; returnsegm:= w0; ds w1 x2+i6+4 ; work0:= descr + getbit hs w3 x2+i6+1 ; relreturn: w3 - segmtable(returnsegm); rl w0 x1+i10 ; ws w0 x1+2 ; ub(these(descr)):= am (x1+0) ; curr(descr) - first(descr); rs w0 -2 ; al w0 f14 ; shareop(descr):= writeop; hs w0 (x1+10) ; sh w1 x2+i4+1 ; if descr = recs then jl. a6. ; al w3 0 ; begin am (x2+i5+10) ; w0w1:= firstshared, lastshared dl w1 4 ; am (x2+i5+0) ; w0:= firstshared +ub(these(recs)) wa w0 -2 ; a4: sl w0 x1+2 ; while w0 < w1 +2 do jl. a5. ; word(w1):= 0; rs w3 x1 ; al w1 x1-2 ; jl. a4. ; end; a5: rl w1 x2+i6+4 ; reset w1 a6: rl w0 (x1+0) ; w0:= sn(these(descr)); jl. a2. ; goto setsn; m.inout i. ; e. ; endblock input - output \f ; rc 29.12.75 file_i procedures, segment 1, jj/ib page ...9... ; procedure getreci(z, rec); zone z; array rec; ; searches for a record with the same key as rec; ; resulti: ; 1 record found ; 2 record not found, next higher available ; 3 record not found, end of file, first record available b. a21 ; beginblock getreci w. ; e0: e1=k-j0 ; getreci: ; al w0 2.11110 ; prepare (states(readonly,readnext, al w1 7<7+1<6+f1 ; put,update), getact+getarray); jl. w3 c0.-2 ; w0 is set to: 2.11110 at : c0-2 ; sn w0 f0+1 ; if state = readnext then ensure reading jl. a14. ; else d10: d11=k-j0 ; lookup: comment entered from insertreci; rl w3 x2+i5+i10 ; restorehead(curr(recs)); jl w2 (x2+i0+6) ; d0: d1= k-j0 ; searchrec: comment from insertreci; a1: rl w3 x2+i2+10 ; savethe key(newrec); jl w2 (x2+i0+4) ; ; w1:= descr:= bucks; al w1 x2+i3 ; while descr <> recs do a2: dl w0 x1+8 ; begin ds. w0 a9. ; leapsearch: ac w0 (x1+4) ; wlast:= last(descr); hs. w0 a7. ; wleap:= leap(descr); rl w3 x1+2 ; wsize:= entrysize(descr); jl w2 (x2+i0+2) ; w3:= first(descr); sh w0 0 ; w0:= compare2(w3); jl. a10. ; ; if w0 > 0 then <*wanted_key > key_in_descr *> a3: wa. w3 a9. ; begin sl. w3 (a8.) ; for w3:= w3+wleap while w3 < wlast do jl. a4. ; begin jl w2 (x2+i0+2) ; w0:= compare2(w3); sh w0 0 ; if w0 <= 0 then jl. a6. ; goto backup jl. a3. ; end; a4: rl. w3 a8. ; w3:= wlast; w0:= compare2(w3); a5: jl w2 (x2+i0+2) ; backup: a6: sl w0 0 ; while w0 < 0 do jl. a10. ; begin a7=k +1 ; w3:= w3 - wsize; al w3 x3; -wsize ; w0:= compare2(w3) jl. a5. ; end; ; end; a8: 0 ; wlast.double ; a9: 0 ; wleap. - ; \f ; rc 07.11.78 algol7, file-i procedures, ib, segment 1 page ...10... a10: sl w3 (x2+i4+2) ; comment now w3 points at the searched entry; am i10 ; w1:= descr:= 1 + if w3 < first(blocks) then al w1 x2+i4+1 ; blocks else recs; comment getbit:= true; rs w3 x1+0 ; these(descr):= w3; am (x1+10) ; rl w0 6 ; if sharesn(descr) <> sn(curr(descr)) then sn w0 (x3) ; begin jl. a21. ; comment if the current description is ; blocks, then it is known that both ; blocktable and block must be changed ; to optimize disc head movings, an up- ; dated block is written back before the ; new blocktable is fetched; se w1 x2+i4+1 ; if descr=blocks then jl. a20. ; begin bl w0 (x2+i5+10) ; w0:= shareop(recs); se w0 f14 ; if shareop(recs)=writeop then jl. a20. ; begin <*current block updated*> al w1 x2+i5 ; descr:= recs; jl. w3 c4. ; inouthere(recs, false); al w1 x2+i4+1 ; descr:= blocks; getbit:= true; ; end recs updated; ; end change; a20: ; getblock: jl. w3 c4. ; inouthere(descr, true); a21: ; blockincore: al w1 x1-1 ; descr:- descr -; comment getbit:= false; se w1 x2+i5 ; if descr <> recs then goto do; jl. a2. ; end while descr <> recs; rl w3 x2+i5+2 ; simple search in the block: ; w3:= first(recs); a11: jl w2 (x2+i0+0) ; for w0:= compare1(w3) while w0 > 0 do sh w0 0 ; begin jl. a12. ; jl w2 (x2+i0+10) ; w3:= w3 + getsize(w3); wa w3 2 ; if w3 >= last(recs) then sl w3 (x2+i5+6) ; goto notfound jl. a13. ; end; jl. a11. ; a12: sn w0 0 ; if w0 = 0 then goto termaccess; jl. d4. ; ; not found: comment w3 holds recbase for the a13: al w0 3 ; next higher record or w3 = last (recs), ws. w0 (j5.) ; value of result i is used to distinguish rs. w0 (j5.) ; between getrec i and ensertreci; sn w0 2 ; resulti:= 3 - resulti; jl. d2. ; comment was 1 or 2 now 2 or 1; rs w3 x2+i5+i10 ; if resulti = 2 then goto access next rl. w3 (j4.) ; curr(recs):= w3; jl x3+d21 ; goto continue insert; a14: al w0 0 ; ensurereading: am (x2+i5+10) ; beginthen rs w0 6 ; sharesn(recs):= 0; al w0 f0 ; comment will ensure that the block rs w0 (x2+i2+2) ; is read again; jl. a1. ; zonestate:= readonly; ; endthen ensure reading; m.getreci i. ; e. ; endblock getreci; \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 1 page ...11... ; procedure nextreci(z); zone z ; makes the cyclically next record available ; resulti: ; 1 next record found ; 2 next record found, is first in file b. a10 ; beginblock nextreci w. ; e2: e3=k-j0 ; nextreci: ; al w0 2.11110 ; prepare (states(readonly,readnext, al w1 8<7+f2 ; put,update), nextact); jl. w3 c0.-2 ; w0 is set to: 2.11110 at : c0-2 ; sn w0 f0+0 ; al w0 f0+1 ; if state = readonly then rs w0 (x2+i2+2) ; zonestate:= readnext; rl w3 x2+i5+i10 ; se w0 f0+1 ; if state <> readnext then jl w2 (x2+i0+6) ; restorehead(curr(recs)); wa w3 x2+i5+4 ; w3:= recbase:= (curr(recs)) + entrysize(recs); d2: d3=k-j0 ; access next: comment yields, when ; entered here with w3 = recbase the, sl w3 (x2+i5+6) ; cyclically, first record starting at jl. a3. ; recbase or later ; increments resulti by one if wrap around; ; if recbase >= last(recs) then ; blockexhausted; a1: rl w0 (x2+i2+2) ; se w0 f0+1 ; if zonestate <> readnext then jl w2 (x2+i0+4) ; savethekey(recbase); d4: d5=k-j0 ; termaccess: sets, when entered here rs w3 x2+i5+i10 ; with w3 = recbase, recordbase and recordsize rs w3 (x2+i2+0) ; in the zone. sets, if needed, writeop in jl w2 (x2+i0+10) ; shareop(recs); rs w1 x2+i5+4 ; recordbase:= curr(recs):= recbase rs w1 (x2+i2+4) ; recordsize:= entrysize(recs):= al w1 f14 ; getsize(recbase); rl w0 (x2+i2+2) ; if zonestate = update then sn w0 f0+3 ; shareop(recs):= writeop; hs w1 (x2+i5+10) ; dl w1 x2+i2+8 ; testresult: sl w0 0 ; if testbits >= 0 then jl. (j9.) ; return; al w3 2.111111 ; la w3 2 ; if bit (actno extract 6 - resulti + 1) ws. w3 (j5.) ; of:(testbits) = 0 then ld w1 x3-16 ; return; so w0 1<6 ; jl. (j9.) ; rl. w3 (j2.) ;goto calltestproc; comment segment 2; jl x3+c31 ; \f ; rc 07.11.78 algol7, file-i procedures, ib, segment 1 page ...13... a3: rl w3 x2+i4+i10 ; blockexhausted: wa w3 x2+i4+4 ; beginthen current:= w3:= sh w3 (x2+i4+6) ; curr(blocks) + entrysize(blocks); jl. a5. ; if current > last(blocks) then ; bucketexhausted: rl w3 x2+i3+i10 ; begin current:= w3:= wa w3 x2+i3+4 ; curr(bucks) + entrysize(bucks); sh w3 (x2+i3+6) ; if current > last(bucks) then jl. a4. ; fileexhausted: al w0 1 ; begin wa. w0 (j5.) ; if resulti < 3 then sh w0 3 ; resulti:= resulti + 1; rs. w0 (j5.) ; fromstart: current:= first(bucks); d8: d9=k-j0 ; startfile: rl w3 x2+i3+2 ; end; a4: rs w3 x2+i3+i10 ; curr(bucks):= current; al w1 x2+i4+1 ; inouthere(blocks, true); jl. w3 c4. ; current:= first(blocks); rl w3 x2+i4+2 ; end bucketexhausted; a5: rs w3 x2+i4+i10 ; curr(blocks):= current; al w1 x2+i5+1 ; inouthere(recs, true); jl. w3 c4. ; w3:= recbase:= first(recs); rl w3 x2+i5+2 ; endthen blockexhausted; jl. a1. ; m.nextreci i. ; e. ; endblock nextreci; j20=k-j0 c.j20-506 m.code on segment 1 too long z. c.502-j20,0,r.252-j20>1 z.; fill with zeroes <:file_i pr.<0>:> ; alarm text m.segment 1 i. ; e. ; end segment 1 \f ; rc 23.06.78 algol6, file-i procedures, ib, segment 2 page ...14... ; 01.02.81 eah ; putreci initreci deletereci b. j20,g2 ; block for segment 2 k = 10000 h. ; g0=0 ; no of externals + number of globals j0: g1,g2 ; rel of last point, rel of last abs word j1: -1, 0 ; address of segment 1 j5: 0, 1 ; result_i, permanent core byte 0, 1 j9: g0+8, 0 ; rs-entry 8, end address expression j6: g0+13, 0 ; - - 13 lastused j12: g0+3 , 0 ; - - 3 reserve j13: g0+5 , 0 ; - - 5 goto point j8: g0+21, 0 ; - - 21 general alarm j16: 1<11+3, 0 ; address of segment 5 g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 2 page 15 \f ; rc 23.06.78 algol6, file-i procedures, ib, segment 2 page ...16... ;procedure putreci(z); ; ensures that the block containing the current available record ; will be written before a new block is read; e22: e23=k-j0 ; al w0 2.00110 ; putreci: al w1 11<7+f18 ; rl. w3 (j1.) ; prepare (states(put,update), jl w3 x3+c1 ; putact); al w0 f14 ; shareoprecs:= writeop; hs w0 (x2+i5+10) ; jl. d6. ; goto testresultseg2; \f ; rc 29.01.76 file_i procedures, segment 2, jj/ib page ...17... ; procedure init_rec_i (z, record); zone z; array record; ; initializes the file by adding the specified record as ; the next record. ; an average of fill(recs) bytes are filled in each block ; and an average of fill(blocks) bytes are filled in each ; block table. ; fill(recs) and fill(blocks) are computed by initfilei. ; result_i: ; 1 record accepted and added ; 2 record not added, file is full ; 3 - - - , improper length ; 4 - - - , not ascending key b. a15 ; beginblock initreci w. ; e8: e9=k-j0 ; initreci: al w0 2.1 ; prepare (states(initialize), al w1 2<7+1<6+f5 ; initrecact+getarray); rl. w3 (j1.) ; w0:= compare 3(newrec); jl w3 x3+c1 ; comment compare3 will yield w0>=0 if jl w2 (x2+i0+12) ; first call after initfilei or file sl w0 0 ; is full or key not ascending; jl. a10. ; if w0 >= 0 then goto testinitcase; jl w2 (x2+i0+10) ; sh w1 (x2+i2+16) ; w1:= getsize(newrec); sh w1 (x2+i2+18) ; if w1 > maxrecsize or w1 < minrecsize jl. d14. ; or w1 mod 4 <> 0 then sz w1 3 ; goto exit 3, comment improper length; jl. d14. ; rs w1 x2+i5+4 ; recordaccepted if we have room for it: jl w2 (x2+i0+4) ; entrysize(recs):= w1; rl w1 x2+i5+i10 ; savethekey(newrec); al w0 x1 ; w1:= curr(recs); wa w0 x2+i5+4 ; w0:= curr(recs) + entrysize(recs); sh w0 (x2+i5+12) ; if curr(recs) + entrysize(recs) > top(recs) or sl w1 (x2+i5+6) ; curr(recs) >= last(recs) then jl. a3. ; blockfull; a1: rs w0 x2+i5+i10 ; comment now w1 holds the base of the rl w2 x2+i2+10 ; next free record with the necessary block- rl. w3 (j16.) ; and bucket-changes performed. jl w3 x3+c19 ; w0 holds w1 + entrysize(recs); ; curr(recs):= w0; ; movedbwords(newrec,w1,w0); al w0 0 ; noofrecs:= noofrecs +1; al w1 1 ; aa w1 x2+i7+4 ; ds w1 x2+i7+4 ; al w0 0 ; recbytes:= recbytes +entrysize(recs); rl w1 x2+i5+4 ; aa w1 x2+i7+12 ; ds w1 x2+i7+12 ; a2: al w0 0 ; end_init: rs w0 (x2+i2+4) ; rec_size:= 0; \f ; rc 07.11.78 algol7, file-i procedures, ib, segment 2 page ...18... d6: dl w1 x2+i2+8 ; testresultseg2: sl w0 0 ; if testbits >= 0 then jl. (j9.) ; return; al w3 2.111111 ; la w3 2 ; if bit(actno extract 6 - resulti + 1) ws. w3 (j5.) ; of:(testbits) = 0 then return; ld w1 x3-16 ; so w0 1<6 ; jl. (j9.) ; jl. c30. ; a3: al w0 0 ; blockfull: bl w1 x2+i5+17 ; w1:= lastshared:= segsper*512+first(recs)-curr(recs); ls w1 9 ; wa w1 x2+i5+2 ; a11: sh w1 (x2+i5+i10) ; while w1 > curr(recs) do jl. a12. ; word(w1):= 0; rs w0 x1 ; al w1 x1-2 ; jl. a11. ; a12: al w1 x2+i5 ; descr:= recs; a4: rl. w0 j0. ; buckfull: rl. w3 (j1.) ; jl w3 x3+c13 ; putnew(descr, false); rl w3 x1 ; rl w0 x1+6 ; ws w0 x3-2 ; wa w0 x1+14 ; last (descr):= last(descr) rs w0 x1+6 ; - ub(these(descr)) + fill(descr); al w1 x1-i10 ; descr:= descr - descrsize; wa w3 x1+4 ; w3:= curr(descr) + entrysize(descr); sn w1 x2+i3 ; if descr = bucks then jl. a6. ; test bucks; rl w0 x2+i3+i10 ; else sn w0 (x2+i3+2) ; testblocks: am i2+12-i4-12 ; if w3 > (if curr(bucks) = first(bucks) sh w3 (x2+i4+12) ; then topfirstblocks else top(blocks)) sl w3 (x2+i4+6) ; or w3 >= last(blocks) then jl. a4. ; goto buckfull; ; a5: rs w3 x2+i4+i10 ; newblock: jl w2 (x2+i0+8) ; curr(blocks):= w3; copykey(w3); rl w1 x2+i5+2 ; w1:= first(recs); al w0 x1 ; w0:= first(recs) + entrysize(recs); wa w0 x2+i5+4 ; jl. a1. ; endthen blockfull; a6: sl w3 (x2+i3+12) ; testbucks: jl. a8. ; beginthen ; if w3 >= top(bucks) then goto fullfile; a7: rs w3 x2+i3+i10 ; newbuck: jl w2 (x2+i0+8) ; comment entered also from testfirst rl. w0 j0. ; rl. w3 (j16.) ; with w3 = first(bucks); jl w3 x3+c29 ; curr(bucks):= w3; copykey(w3); rl w3 x2+i4+2 ; initblocktable; w3:= first(blocks); jl. a5. ; endthen testbucks; a8: al w0 x2-1 ; fullfile: rs w0 x2+i0+12 ; entrypoint(compare3):= zonebufref - 1; jl. d18. ; goto exit2; \f ; rc 14.10.76 file_i procedures, segment 2, jj/ib page ...19... ; testinitcase: entrypoint(compare3) will hold one of 3 values: ; zonebufref - 1: file is full ; zonebufref - 2: first call after initfilei ; entrypoint(compare0): key not greater than previous a10: rl w0 x2+i0+12 ; sn w0 x2-1 ; if entrypoint(compare3) = zonebufref-1 jl. d18. ; then goto exit2; se w0 x2-2 ; if entrypoint(compare3) <> zonebufref-2 jl. d16. ; then goto exit4; jl w2 (x2+i0+10) ; sh w1 (x2+i2+16) ; w1:= getsize(newrec); sh w1 (x2+i2+18) ; if w1 > maxrecsize or w1 < minrecsize jl. d14. ; or w1 mod 4 <> 0 then sz w1 3 ; goto exit3; comment improper length; jl. d14. ; rs w1 x2+i5+4 ; entrysize(recs):= w1; jl w2 (x2+i0+4) ; savethekey(newrec); rl w0 x2+i0+0 ; entrypoint(compare3):= entrypoint(compare1); rs w0 x2+i0+12 ; rl w0 x2+i7+9 ; ba w0 x2+i3+17 ; sn(first(bucks)):= rs w0 (x2+i3+2) ; snfile + segsinshare(bucks); rl w3 x2+i3+2 ; w3:= first(bucks); jl. a7. ; goto newbuck; d14: am -1 ; exit3: resulti:= 3 else d16: am 2 ; exit4: resulti:= 4 else d18: al w0 2 ; exit2: resulti:= 2; rs. w0 (j5.) ; jl. a2. ; goto end_init m.initreci i. ; e. ; endblock initrec \f ; rc 07.11.78 file_i procedures, segment 2, jj/ib page ...20... ; procedure deletereci(z); zone z; ; deletes the current record from z; ; result_i: ; 1 record deleted, next available ; 2 record deleted, end of file, firstavailable ; 3 not deleted, last in file b. a10 ; beginblock deletereci w. ; e10: e11=k-j0; ; deletereci: al w0 2.00110 ; prepare (states(put,update), al w1 9<7+f6 ; deleteact); rl. w3 (j1.) ; jl w3 x3+c1 ; dl w1 x2+i7+4 ; se w1 1 ; if noofrecs = 1 then jl. a5. ; sn w0 0 ; jl. a4. ; goto del_res_3; a5: ss. w1 a1. ; noofrecs:= noofrecs -1; ds w1 x2+i7+4 ; al w0 0 ; recbytes:= recbytes -entrysize(rec); rl w1 x2+i5+4 ; ds w1 x2+i6+6 ; dl w1 x2+i7+12 ; ss w1 x2+i6+6 ; ds w1 x2+i7+12 ; al w0 f14 ; hs w0 (x2+i3+10) ; shareop(bucks):= hs w0 (x2+i4+10) ; shareop(blocks):= hs w0 (x2+i5+10) ; shareop(recs):= writeop; rl w0 x2+i5+6 ; ws w0 x2+i5+4 ; last(recs):= last(recs) - entrysize(recs); rs w0 x2+i5+6 ; ws w0 x2+i5+2 ; ub(these(recs)):= am (x2+i5+0) ; last(recs) - first(recs); rs w0 -2 ; sh w0 0 ; if ub(these(recs)) > 0 then jl. a6. ; squeeze record out: ; begin rl w1 x2+i5+i10 ; movedbwrds rl w0 x2+i5+6 ; (curr(recs)+entrysize(recs), rl w2 x2+i5+4 ; curr(recs), wa w2 2 ; last(recs)); rl. w3 (j16.) ; jl w3 x3+c19 ; end squeeze record out; \f ; rc 07.11.78 algol7, file-i procedures, ib, segment 2 page ...21... a6: al w0 0 ; clear old rec: rl w1 x2+i5+6 ; w1:= last(recs) +entrysize(recs) wa w1 x2+i5+4 ; a7: rs w0 x1 ; while w1 > last(recs) do al w1 x1-2 ; word(w1):= 0 se w1 (x2+i5+6) ; jl. a7. ; am (x2+i5+0) ; rl w0 -2 ; if ub(these(recs)) = 0 then sh w0 0 ; goto blockisempty; jl. a2. ; d12: rl. w3 (j1.) ; exitvianext: rl w1 (x3) ; get segment 1; rl w3 x2+i5+i10 ; w3:= recbase:= curr(recs); jl x1+d3 ; goto accessnext a2: al w1 x2+i5 ; blockisempty: descr:= recs rl. w0 j0. ; <*write the empty block before squeezing*> rl. w3 (j1.) ; inout(recs, false); jl w3 x3+c7 ; a3: al w1 x1-i10 ; repeat squeece: rl w0 x1+6 ; descr:= descr-sizedescr; rs w0 x1+14 ; insert(descr):= last(descr); rl. w3 (j16.) ; move entries(descr); jl w3 x3+c21 ; last(descr):= insert(descr); rl w0 x1+i10 ; ws w0 x1+4 ; curr(descr):= curr(descr)- rs w0 x1+i10 ; entrysize(descr); rl w3 x1+14 ; rs w3 x1+6 ; ws w3 x1+2 ; ub(these(descr)):= am (x1+0) ; last(descr) - first(descr); rs w3 -2 ; sl w3 0 ; if ub(these(descr) >= 0 then jl. d12. ; goto exitvianext; jl. a3. ; goto repeatsqueeze; a4: al w0 3 ; del_res_3: result_i:= 3; rs. w0 (j5.) ; jl. d6. ; goto testresultseg2; a0: 0 ; constant (dw) 1 a1: 1 ; m.deletereci i. ; e. ; endblock deletereci; \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 2 page ...22... ; calltestproc: ; redirects the original call so that it looks like: ; testproc (z) if array param in original call then: (array) else:(z) ; added parameter:(procnoi); b. a1 ; begin block calltestproc w. ; c30: c31=k-j0 ; call testproc: rl. w3 (j6.) ; w3:= last used; bz w0 x2+i2+9 ; returnsegm:= procnoi(actno); so w0 1<6 ; comment used as working location to hold am 4 ; the value of the actual parameter; ac w1 4 ; work0:= w1:= ls w0 -7 ; if getarray(actno) then -4 else -8; ds w1 x2+i6+4 ; comment how far to move the parameters in bl w0 x3+4 ; the stack; ws w0 2 ; appetite(stackref):= hs w0 x3+4 ; appetite(stackref) - w1; rl. w0 a1. ; firstformal1:= zonekind; rs w0 x3+6 ; al w0 x3 ; save old last used; jl. w3 (j12.) ; reserve(w1); rl w3 0 ; restore old last used zl w0 x3+5 ; w0 := rel of return; so w0 1 ; if no unstack bit is set jl. a0. ; <* called from fortran generated code *> then am (x3) ; stack.last used := rs w1 -2 ; last used ; a0: rl w0 x1+4 ; move stack one position: rs w0 x1 ; dl w0 x1+8 ; for i:= 0 step 1 until 7 do ds w0 x1+4 ; stack(w1+i):= stack(w1+i+4); dl w0 x1+12 ; ds w0 x1+8 ; comment w0 will now contain some dl w0 x1+16 ; stackref i.e. <> -8; ds w0 x1+12 ; rx w0 x2+i6+4 ; exchange(w0,work0); sn w0 -8 ; if w0 = -8 then jl. a0. ; goto move stack one position; al w0 x2+i6+2 ; thirdformal:= al w3 f15 ; simplevariable(returnsegment); ds w0 x1+16 ; dl w1 x2+i1+16 ; ls w0 4 ; goto point(teststackref,testproc); jl. (j13.) ; a1: 6<12+23; zonekind ; i. ; e. ; end block calltestproc ; end of segment j20=k-j0 c.j20-506 m.code on segment 2 too long z. c.502-j20,0,r.252-j20>1 z. ; fill with zeroes <:fileipr. s2<0>:> m. segment 2 i. ; e. ; endsegment 2 \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 3 page ...23... ; 01.02.81 eah ; init_file_i and start_file_i b. j20,g7 ; block for segment 3 k = 10000 h. ; g0=0 ; no of externals + no of globals j0: g2 ,g1 ; rel of last point, rel of last absword j1: -2, 0 ; address of segment 1 j2: 1<11+5, 0 ; address of segment 8 j5: 0, 1 ; result_i , permanent core, byte 0-1 j6: g0+13, 0 ; rs entry 13 last used j7: g0+30, 0 ; - - 30 saved stackrefandw3 j8: g0+21, 0 ; - - 21 general alarm j9: g0+8, 0 ; - - 8 end address expression j11: g0+4, 0 ; - - 4 take expression g1=k-2-j0 ; rel of last abs word j14: g0+34, 0 ; rs entry point 34 inblock g2=k-2-j0 ; rel of last point w. ; procedure init_file_i(z, buckfactor, blockfactor); ; value buckfactor, blockfactor; ; zone z; real buckfactor, blockfactor; ; ; initializes the zone buffer with the head of the file and ; prepares it for init_rec_i; ; zonestate must be 0 (after open) at call, a successful call will ; set zonestate to initialize. ; resulti: ; 1 ok ; 2 ok, but buffer too small for insert_rec_i; ; procedure start_file_i (z); ; zone z; ; ; initializes the zonebuffer with the head of the file and ; prepares it for record handling. ; zonestate must be 0 at call, a successful call will ; set zonestate to readonly and yields the first record in ; the file as the zone record; ; ; result i: ; 1 ok, first record available ; 2 ok, - - - buffer too small for insert_rec_i; ; 3 as 1, but update mark found ; 4 as 2, - - - - \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 3 page ...24... b. a30 ; beginblock initfilei, startfilei w. ; e12: e13=k-j0 ; initfilei: rl. w2 (j6.) ; w2: savedstackref:= lastused; ds. w3 (j7.) ; al w3 x2+6 ; a1: al w3 x3+4 ; rs w3 x2+6 ; initbit:= bit(23,firstf1):= true:=0; dl w1 x3+2 ; so w0 16 ; take real value of second and jl. w3 (j11.) ; third parameter; ds. w3 (j7.) ; rl w3 (x2+6) ; dl w1 x1 ; so w3 1 ; ci w1 0 ; rl w3 x2+6 ; ds w1 x3+2 ; sh w3 x2+10 ; jl. a1. ; jl. a4. ; goto read file head; e14: e15=k-j0 ; startfilei: rl. w2 (j6.) ; w2:= savedstackref:= lastused; ds. w3 (j7.) ; comment initbit=bit(23,firstf1)=false=1; \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 3 page ...25... a4: rl w3 x2+8 ; read the file head: rl w1 x3-h3+h0+6 ; comment checks that we have three al w0 x1+h6+h6 ; shares available in z and reads as se w0 (x3-h3+h0+8) ; many segments as the buffer will jl. a21. ; hold, starting with segment 0. rl w0 x3-h3+h2+6 ; inblock is cheated so that only se w0 0 ; the first share is used; jl. a20. ; if not three shares in z then goto shareerr; (a21.) rs w1 x3-h3+h0+4 ; if zonestate <> 0 then goto zonestateerr; (a20.) rs w1 x3-h3+h0+8 ; lastshare:= usedshare:= firstshare; rs w0 x3-h3+h1+16 ; segmentcount:= 0; rs w0 x1 ; sharestate(firstshare):= 0; rl w0 x3-h3+h0+2 ; lastshared(firstshare):= rs w0 x1+4 ; lastaddress(firstshare):= rs w0 x1+10 ; lastofbuffer; al w0 x3 ; ls w0 4 ; rl. w1 j14. ; inblock(z); jl. w3 (j11.) ; rl w3 x2+8 ; w3:= savew3:= zonedescr; ds. w3 (j7.) ; rl w3 x3-h3+h0 ; compute and test zonebufref: rl w2 x3+1 ; w3:= basebuffer(zonedescr); sh w2 2047 ; w2:= zonebufrefrel(w3); sh w2 f16-1 ; if w2 > 2047 or w2 < minrefrel then jl. a22. ; goto nothead; wa w2 6 ; w2:= zonebufref:= w2+w3; al w1 0 ; compute and test checksum: w1:= 0; a5: al w3 x3+2 ; for w3:= basebuffer step 2 am (x3) ; until last of head do al w1 x1 ; w1:= w1+word(w3); se w3 x2+i7-1 ; comment address arithmetic jl. a5. ; gives no overflow; se. w1 (a15.) ; if w1 <> <:isq:> then jl. a22. ; goto not head; ; now the file head has been accepted; rl. w3 (j7.) ; compute and test top(bucks): rs w3 x2+i2-0 ; w3:= zonerecordaddr:= zonedescr; al w3 x3-h3+h1+2 ; w3:= nameaddress; al w1 x2+i6+4 ; w1:= work(0:9) jd 1<11+42 ; lookup(nameaddress, work); bz w0 x2+i6+20 ; if contents <> 22 then se w0 22 ; jl. a18. ; goto contentserr; bz w0 x2+i6+21 ; rs w0 x2+i6+24 ; testbits:= tail(9) extract 12; ; processdescription jd 1<11+4 ; (nameaddress(w3), result); rl w1 0 ; rl w0 x1 ; kind:= w0:= area process(0); rl w1 x1+18 ; w1:=segsinfile:=area process(18); sn w0 0 ; if kind=internal then rl w1 x3-h1-2+h2+2; then segsinfile := free zone parameter; al w0 0 ; wd w1 x2+i2+2 ; rs w1 x2+i6+4 ; noofbucks:= segsinfile//segsperbuck; wm w1 x2+i3+4 ; top(bucks):= noofbucks* al w1 x1+i8-i7 ; entrysize(bucks) + buckheadsize; rs w1 x2+i3+12 ; sh w1 (x2+i2+14) ; if top(bucks) > bucktablesize or sh w1 i8-i7 ; top(bucks) <= buckheadsize then jl. a25. ; goto areaerror; al w0 x1+511 ; ls w0 -9 ; sharesize(bucks):= (top(bucks) + ls w0 9 ; segsize-1)// rs w0 x2+i3+0 ; segsize*segsize; \f ; rc 22.01.79 file_i procedures, segment 3, jj/ib page ...26... al w3 x2+i7 ; move buck table: wa w1 6 ; w1:= a6: am (x2+i2+4) ; top(bucks)+startbuckhead; rl w0 x3 ; for w3:= start buckhead step 2 rs w0 x3 ; until w1 do al w3 x3+2 ; word(w3):= se w3 x1 ; word(w3+bucktablemove); jl. a6. ; rl. w3 (j6.) ; w3:= stackref; rl w0 x3+6 ; if initbit then sz w0 1 ; jl. a7. ; begin rl w1 x2+i4+12 ; compute fillsizes: ci w1 0 ; fm w1 x3+12 ; fillblocks: cf w1 0 ; sh w1 (x2+i4+4) ; w1:= top(blocks)*buckfactor; rl w1 x2+i4+4 ; if w1 < entrysize(blocks) then sl w1 (x2+i4+12) ; w1:= entrysize(blocks); rl w1 x2+i4+12 ; if w1 > top(blocks) then al w0 x1 ; w1:= top(blocks); ws w0 x2+i4+4 ; fill(blocks):= w1-entrysize(blocks); rs w0 x2+i4+14 ; wm w1 x2+i2+12 ; last(blocks):= wd w1 x2+i4+12 ; w1*topfirstblocks//top(blocks); rs w1 x2+i4+6 ; rl w1 x2+i5+12 ; fillrecs: ci w1 0 ; fm w1 x3+16 ; w1:= top(recs)*blockfactor; cf w1 0 ; if w1 < minrecsize then sh w1 (x2+i2+18) ; w1:= minrecsize - 1; rl w1 x2+i2+18 ; if w1 > top(recs) then sl w1 (x2+i5+12) ; w1:= top(recs); rl w1 x2+i5+12 ; rs w1 x2+i5+14 ; fill(recs):= last(recs):= w1; rs w1 x2+i5+6 ; al w0 i8-i7 ; init buckhead: rs w0 x2+i7+0 ; maxusedbucks:= buckheadsize; al w0 0 ; al w1 0 ; ds w1 x2+i7+12 ; noofrecs:= ds w1 x2+i7+4 ; recbytes:= 0; al w0 1<2 ; updmarks:= initialize; rs w0 x2+i7+14 ; al w0 1<7+f8 ; w0:= initact; jl. a8. ; end \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 3 page ...27... a7: rl w1 x2+i7+6 ; else rl w0 x2+i7+0 ; begin sh w0 (x2+i3+12) ; checkbuckhead: sh w0 i8-i7 ; if maxusedbucks>top(bucks) or maxusedbucks jl. a24. ; <=buckheadsize then rs w1 x2+i3+6 ; goto buckheaderr; rl w0 x2+i7+14 ; if updmarks = initialize then sz w0 1<2 ; alarm(9); jl. a17. ; so w0 1 ; if updmarks = update then jl. a9. ; updmarks:= updmarks or gossip; lo. w0 a14. ; rs w0 x2+i7+14 ; a9: rl w0 x2+i7+4 ; last(bucks):= ubfile; lo w0 x2+i7+2 ; sn w0 0 ; if noofrecs <= 0 then goto emptyfile; jl. a19. ; w0:= startact al w0 3<7+f9 ; end; a8: hs w0 x2+i2+9 ; actno := w0; rs w2 x3+6 ; firstformal.1 := zonebufref; rl. w3 (j2.) ; jl x3+d27 ; continue other segment a14: 1<1 ; gossipbit a15: <:isq:>; checksum ; a16: <:<10>prep i<32><32>:> ; ; a17: am 1 ; updmarks: w1:= 9 else a18: am 1 ; contentserr: w1:= 8 else a19: am 1 ; emptyfile: w1:= 7 else a20: am 1 ; zonestateerr: w1:= 6 else a21: am 1 ; shareerr: w1:= 5 else a22: am 1 ; nothead: w1:= 4 else am 1 ; w1:= 3 else a24: am 1 ; bucktablehead:w1:= 2 else a25: al w1 1 ; areasizeerr: w1:= 1; al. w0 a16. ; general alarm jl. w3 (j8.) ; (w1, <file_i>); m.initfilei, startfilei i. ; e. ; endblock initfilei, startfilei \f ; rc 26.06.70 algol 5, file_i procedures, jj, segment 3 page ...30... j20=k-j0 c.j20-506 m.code on segment 3 too long z. c.502-j20,0,r.252-j20>1 z. ; fillwith zeroes <:file_i pr. <0>:> ; alarmtext m.segment3 i. ; e. ; end segment 3 \f ; rc 27.08.70 algol 5, file_i procedures, jj, segment 4 page ...31... ; 01.02.81 eah ; insert rec i b. b12,j20,g10; block for segment 4 k = 10000 h. ; g0=0 ; no of externals + number of globals j0: g1, g2; rel of last point, rel of last absword j1: -3, 0 ; address of segment 1 j5: 0, 1 ; result_i, permanent core byte 0,1 j6: g0+13, 0 ; rs entry 13 lastused j9: g0+8 , 0 ; - - 8 endaddressexpression j15: g0+6 , 0 ; - - 6 endregexpression j16:1<11+1, 0 ; address of segment 5 j17:1<11+2, 0 ; - - - 6 g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; - - - point w. ; ; variables ; used in evaluate compress: evaluate empty block: b0: 0 ; dbw step ubmax b1: 0 ; - topi ubfirstdiff b3: 0 ; dbw testsz b2: 0 ; - blocksz otheri b5: 0 ; dbw besti b6: 0 ; - bestsz b7: 0 ; dbw stackbottom b10:0 ; - savestacktop, savereturn b11: 1<22; constant: big \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 4 page ...33... ; insertreci ; preparation: e16: e17=k-j0 ; al w0 2.110 ; insertreci: al w1 10<7+1<6+f7 ; rl. w3 (j1.) ; prepare(states(put,update), jl w3 x3+c1 ; insertact + getarray); al w0 2 ; rs. w0 (j5.) ; resulti:= 2; rl. w3 (j1.) ; jl x3+d11 ; goto lookup; comment on segment 1, a d20: d21=k-j0 ; successful lookup will come back here:; ; (a successful lookup means record does not exist) rl w3 x2+i2+10 ; continue insert: <*curr(recs) == base of next rec*> jl w2 (x2+i0+10) ; sh w1 (x2+i2+16) ; w1:= getsize(newrec); sh w1 (x2+i2+18) ; jl. g7. ; if w1 < minrecsize or sz w1 3 ; w1 > maxrecsize or jl. g7. ; w1 mod 4 <> 0 then rs w1 x2+i5+4 ; goto lengtherror; rl w0 x2+i3+i10 ; entrysize(recs):= w1; <*size of the new rec*> rs w0 x2+i3+14 ; insert(bucks):= curr(bucks); rl w0 x2+i4+i10 ; insert(blocks):= curr(blocks); rs w0 x2+i4+14 ; rl w0 x2+i5+6 ; tailsize:= insert(recs):= last(recs) - ws w0 x2+i5+i10 ; curr(recs); rs w0 x2+i5+14 ; ; strategy evaluation: ; evaluate simple insert: al w0 0 ; hs w0 x2+i1+7 ; w0:= strategy:= 0; rl w3 x2+i5+6 ; wa w3 x2+i5+4 ; if last(recs) + entrysize(recs) < sh w3 (x2+i5+12) ; top(recs) then goto perform insert; jl. g3. ; comment simple insert is possible; se w0 (x2+i1+6) ; prepare other evaluation: jl. g8. ; if shortbuf then al w0 4 ; goto no buffer; rl. w1 b11. ; price:= big; ds w1 x2+i1+8 ; strategy:= 4; \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 4 page ...34... b. a5 ; evaluate empty block: w. ; begin rl w1 x2+i4+12 ; find nearest buck with empty block: al w0 x1 ; ubmax:= top(blocks) - first(blocks) - ws w0 x2+i4+2 ; entrysize(blocks); ws w0 x2+i4+4 ; comment ubmax is odd, this is used to ws w1 x2+i2+12 ; set the boolean firsti, see below; ds. w1 b1. ; ubfirstdiff:= top(blocks)-topfirstblocks; ; comment start with current bucket; rl w3 x2+i3+i10 ; w3:= i:= otheri:= curr(bucks); rs. w3 b2. ; w0:= snfirstblocks:= rl w0 x2+i7+9 ; sn(file) + segsinshare(bucks); ba w0 x2+i3+17 ; a1: rl. w1 b0. ; loop: firsti:= true; sn w0 (x3) ; comment firsti == odd(w1); ws. w1 b1. ; if (if sn(i) = snfirstblocks then sl w1 (x3-2) ; ubmax-ubfirstdiff else ubmax) > jl. a4. ; ub(i) then goto found; sh. w3 (b2.) ; if i < otheri then ws w3 x2+i3+4 ; i:= i - entrysize(bucks); a2: rx. w3 b2. ; changei: swop(i, otheri); sl w3 (x2+i3+2) ; if i >= first(bucks) and sn w3 (x2+i3+6) ; i <> last(bucks) then jl. a3. ; begin if i >= otheri then sl. w3 (b2.) ; i:= i + entrysize(bucks); wa w3 x2+i3+4 ; goto loop jl. a1. ; end; a3: sz w1 1 ; if firsti then jl. w1 a2. ; begin firsti:= false; goto changei end; jl. a5. ; goto endemptyblock; ; comment no empty block available; a4: rs w3 x2+i3+14 ; found: evaluate result: ws w3 x2+i3+i10 ; insert(bucks):= i; sh w3 -1 ; ac w3 x3 ; w1:= abs(i-curr(bucks))* bl w1 x2+i1+1 ; priceperbuck//entrysize(bucks) + wm w1 6 ; emptyblockprice; wd w1 x2+i3+4 ; if w1 < price then ba w1 x2+i1+0 ; begin al w0 2 ; strategy:= 2; price:= w1 sh w1 (x2+i1+8) ; end; ds w1 x2+i1+8 ; a5: ; endemptyblock: i. ; e. ; end evaluate empty block \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 4 page ...35... b. a2 ; evaluate empty buck: w. ; begin bl w1 x2+i1+3 ; rl w3 x2+i3+6 ; wa w3 x2+i3+4 ; w3:= last(bucks)+entrysize(bucks); sh w3 (x2+i3+12) ; if w3 <= top(bucks) and sl w1 (x2+i1+8) ; priceemptybuck < price then jl. a1. ; begin rs w3 x2+i3+14 ; insert(bucks):= w3; strategy:= 3; al w0 3 ; price:= priceemptybuck ds w1 x2+i1+8 ; end a1: ; end evaluate empty buck; i. ; e. ; b. a15; evaluate compress: w. ; begin bl w1 x2+i1+4 ; sl w1 (x2+i1+8) ; if compressprice >= price then jl. a15. ; goto endcompress; dl w0 x2+i4+4 ; initialize local variables: rl w1 x2+i4+6 ; w3:= first(blocks); topi:= last(blocks); ds. w1 b1. ; step:= entrysize(blocks); rl w1 x2+i2+22 ; al w0 x1-1 ; blocksz:= bytesperblock; ds. w1 b2. ; testsz:= bytesperblock-1; rl w1 x2+i4+i10 ; rl w0 x2+i5+6 ; wa w0 x2+i5+4 ; ba. w0 1 ; rl w2 x2+i5+12 ; w2:= stacktop:= top(recs); ws w0 4 ; ub(curr(blocks)):= last(recs) + rs w0 x1-2 ; entrysize(recs) + 1 - top(recs); rl. w1 b11. ; comment the overflow from the block; ac w0 x1 ; rs w0 x2 ; stackedsum(stacktop):= -big; al w0 0 ; besti:= 0; ds. w1 b6. ; bestsz:= big; al w2 x2+4 ; w0:= sum:= 0; al w3 x3-2 ; w2:= stackbottom:= stacktop + 1; rs. w2 b7. ; w3:= i:= first(blocks)-2; ds w0 x2 ; stackedsum(stacktop):= 0; ; stackedi(stacktop):= i; jl. a3. ; goto fromstart; \f ; rc 27.08.70 algol 5, file_i procedures, jj, segment 4 page ...36... ; evaluate compress, continued a1: wa. w3 b0. ; include next: i:= i+step; sl. w3 (b1.) ; if i > topi then jl. a10. ; goto done; rl. w1 b2. ; sumdiff:= blocksz - ws w1 x3 ; ub(i); sl w1 1 ; if sumdiff > 0 then jl. a6. ; goto positivediff; wa. w0 b3. ; sum:= sum+testsz; a2: wa w0 2 ; negativediff: sum:= sum+sumdiff; wa. w3 b0. ; i:= i+step; sl. w3 (b1.) ; if i > topi then jl. a10. ; goto done; a3: rl. w1 b2. ; fromstart: ws w1 x3 ; sumdiff:= blocksz-ub(i); sh w1 0 ; if sumdiff <= 0 then jl. a2. ; goto negativediff; a4: al w2 x2-4 ; put sum in stack: comment sum is now a local minimum, sh w0 (x2+4) ; we unstack any larger sum and stack this; jl. a4. ; while stackedsum(stacktop) >= sum do al w2 x2+8 ; stacktop:= stacktop-1; ds w0 x2 ; stacktop:= stacktop+1; stackedsum(stacktop):= sum; sh. w2 (b7.) ; stackedi(stacktop):= i; rs. w2 b7. ; if stcktop < stackbottom then ; stackbottom:= stacktop; ws. w0 b3. ; sum:= sum - testsz; a6: wa w0 2 ; positive diff: sum:= sum+sumdiff; rl. w1 b7. ; if sum <= stackedsum(stackbottom) then sh w0 (x1) ; goto include next; comment not yet big enough; jl. a1. ; rs w0 x2+4 ; stackedsum(stacktop+1):= sum; sz w0 0 ; comment to stop the loop below; a7: al w1 x1+4 ; am (x1+4) ; while sum > stackedsum(stackbottom+1) do sl w0 1 ; stackbottom:= stackbottom+1; jl. a7. ; savedstacktop:= stacktop; ds. w2 b10. ; loweri:= w1:= stackedi(stackbottom); dl w2 x1 ; lowersum:= w2:= stackedsum(stackbottom); \f ; rc 27.08.70 algol 5, file_i procedures, jj, segment 4 page ...37... ; evaluate compress, continued ; try one less: comment i and sum corresponds to a8: wa. w2 b2. ; the highest included entry, lower i and ws w2 x1 ; lowersum to the lowest, we now try to move wa. w1 b0. ; loweri one entry up at a time; sl w0 x2+1 ; lowersum:= lowersum+blocksz-ub(loweri); jl. a8. ; loweri:= loweri+step; ; if sum > lowersum then goto try one less; ds. w2 (b7.) ; stackedi(stackbottom):= loweri; ws. w1 b0. ; stackedsum(stackbottom):= lowersum; am. (b6.) ; loweri:= loweri - step; sl w3 x1 ; if i-loweri < bestsz then jl. a9. ; begin ac w2 x1 ; bestsz:= i - loweri; wa w2 6 ; besti:= loweri; ds. w2 b6. ; end; a9: rl. w2 b10. ; solution found try to improve: jl. a1. ; stacktop:= savestacktop; goto include next; a10: rl. w2 (j6.) ; done: rl w2 x2+6 ; w2:= zonebufref; rl w0 x2+i5+6 ; ws w0 x2+i5+2 ; ub(curr(blocks)):= am (x2+i5+0) ; last(recs) - first(recs); rs w0 -2 ; \f ; rc 08.11.78 algol7, file-i procedures, ib segment 4 page ...38... ; evaluate compress, continued ; perform insertion bl w1 x2+i1+5 ; evaluate result: wm. w1 b6. ; w1:= priceperblock * wd w1 x2+i4+4 ; bestsz // entrysize(blocks) + ba w1 x2+i1+4 ; compress price; rl. w3 b5. ; sh w1 (x2+i1+8) ; sn w3 0 ; if besti <> 0 and w1 < price then jl. a15. ; begin al w3 x3+2 ; insert(blocks):= besti+2; rs w3 x2+i4+14 ; strategy:= 1; al w0 1 ; price:= w1 ds w1 x2+i1+8 ; end; a15: ; after compress: i. ; e. ; end evaluate compress ; test the price: dl w1 x2+i1+8 ; sn w0 4 ; if strategy = 4 then jl. g6. ; goto file is full; sl w1 (x2+i1+10) ; if price >= pricelimit then jl. g5. ; goto too expensive; ; perform insertion: ; comment all possible strategies passes this label; g3: al w3 f14 ; hs w3 (x2+i3+10) ; shareop(bucks):= hs w3 (x2+i4+10) ; shareop(blocks):= writeop; rl. w3 (j17.) ; if strategy < 2 then sh w0 1 ; goto compress bucket jl x3+d25 ; else goto insert and move blocks; jl x3+d29 ; comment on segment 6; ; errorexits: g5: am -1 ; too expensive: resulti:= 3 else g6: am -1 ; file is full : resulti:= 4 else g7: am -1 ; length error : resulti:= 5 else g8: al w0 6 ; no buffer : resulti:= 6 ; rs. w0 (j5.) ; rl. w3 (j1.) ; goto access next; rl w1 (x3) ; rl w3 x2+i5+i10 ; jl x1+d3 ; ; end of segment j20=k-j0 ; c.j20-506 ; m. code on segment 4 too long z. c.502-j20,0,r.252-j20>1 z.; fill with zeroes <:fileipr. s4<0>:> m. segment 4 i. e. \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 5 page ...40... ; 01.02.81 eah ; move subroutines must not refer to other segments b. j20, g2 ; block for segment 5 k = 10000 h. ; g0=0 ; no of externals + no of globals j0: g1, g2; rel of last point, rel of last absword j1: -4, 0; address of segment 1, only used from initbucktable j6: g0+13, 0 ; rs entry 13 last used j15: g0+6 , 0 ; - - 6 endregexpression g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; - - - point w. ; subroutine movewrds (source, destination, size); ; moves a number of consecutive words from one place in ; core to another in either increaseing or decreasing ; address order depending on the sign of size: ; increasing address order: ; size = number of bytes to move, size must be even. ; source+1 = address of first byte to move from, source odd. ; destination+1 = - - - - - - to, destination odd. ; destination+ ; size = - - last byte to move to. ; decreasing address order: ; -size = number of bytes to move, size must be even. ; source = address of first byte to move from, i.e. ; last byte of source area, source odd. ; destination = address of first byte to move to, i.e. ; last byte of destination area, destination odd. ; destination+ ; size+1 = address of last byte to move to, i.e. ; first byte of destination area, destination odd. ; entry: exit: ; w0 size undefined ; w1 destination destination+size ; w2 source zonebufref (from first formal.1) ; w3 return undefined b. a10; begin block movewrds w. ; a0: 0 ; saved return a1: 0 ; saved limit = destination+size, a0a1 doubleword c16: c17=k-j0 ; sz w0 2 ; if odd number of words then jl. a6. ; goto moveodd; wa w0 2 ; w0:= limit:= destination+size; ; subroutine movedbwrds (source, destination, limit); ; as movewrds except that: ; w0 = limit = destination+size on entry and ; that only an even number of words can be moved. c18: c19=k-j0 ; comment continuation from c16; ds. w0 a1. ; save return and limit; sh w0 x1 ; if limit <= destination then jl. a8. ; goto movebackw; \f ; rc 27.08.70 algol 5, file_i procedures, jj, segment 5 page ...41... ; move-subroutines, continued a2: al w1 x1+128 ; moveforw: sh. w1 (a1.) ; destination:= destination+128; jl. a3. ; if destination > limit then al w3 x1-128 ; begin rl. w1 a1. ; w3:= destination-128-limit; ws w3 2 ; comment -number of bytes still to move; ws w2 6 ; destination:= limit; source:= source-w3; jl. x3+a4. ; goto move -w3 bytes ; end; a3: al w2 x2+128 ; move128forw: source:= source+128; dl w0 x2-124, ds w0 x1-124, dl w0 x2-120, ds w0 x1-120; dl w0 x2-116, ds w0 x1-116, dl w0 x2-112, ds w0 x1-112; dl w0 x2-108, ds w0 x1-108, dl w0 x2-104, ds w0 x1-104; dl w0 x2-100, ds w0 x1-100, dl w0 x2-96 , ds w0 x1-96 ; dl w0 x2-92 , ds w0 x1-92 , dl w0 x2-88 , ds w0 x1-88 ; dl w0 x2-84 , ds w0 x1-84 , dl w0 x2-80 , ds w0 x1-80 ; dl w0 x2-76 , ds w0 x1-76 , dl w0 x2-72 , ds w0 x1-72 ; dl w0 x2-68 , ds w0 x1-68 , dl w0 x2-64 , ds w0 x1-64 ; dl w0 x2-60 , ds w0 x1-60 , dl w0 x2-56 , ds w0 x1-56 ; dl w0 x2-52 , ds w0 x1-52 , dl w0 x2-48 , ds w0 x1-48 ; dl w0 x2-44 , ds w0 x1-44 , dl w0 x2-40 , ds w0 x1-40 ; dl w0 x2-36 , ds w0 x1-36 , dl w0 x2-32 , ds w0 x1-32 ; dl w0 x2-28 , ds w0 x1-28 , dl w0 x2-24 , ds w0 x1-24 ; dl w0 x2-20 , ds w0 x1-20 , dl w0 x2-16 , ds w0 x1-16 ; dl w0 x2-12 , ds w0 x1-12 , dl w0 x2-8 , ds w0 x1-8 ; dl w0 x2-4 , ds w0 x1-4 , dl w0 x2 , ds w0 x1 ; a4: se. w1 (a1.) ; if destination <> limit then jl. a2. ; goto moveforw; a5: rl. w2 (j6.) ; exit: rl w2 x2+6 ; w2:= first formal.1; jl. (a0.) ; return; a6: wa w0 2 ; moveodd: ds. w0 a1. ; w0:= limit:= destination + size; sh w0 x1 ; save limit and return; jl. a7. ; if limit <= destination then al w1 x1+2 ; goto oddbackw; al w2 x2+2 ; oddforw: source:= source+2; rl w0 x2 ; destination:= destination+2; rs w0 x1 ; word(destination):= word(source); jl. a2. ; goto moveforw; a7: rl w0 x2 ; oddbackw: rs w0 x1 ; word(destination):= word(source); al w1 x1-2 ; destination:= destination-2; al w2 x2-2 ; source:= source-2; a8: al w1 x1-128 ; movebackw: sl. w1 (a1.) ; destination:= destination-128; jl. a9. ; if destination < limit then ac w3 x1+128 ; begin rl. w1 a1. ; w3:= limit - (destination+128); wa w3 2 ; comment - number of bytes stil to move; wa w2 6 ; destination:= limit; source:= source+w3; jl. x3+a10. ; goto move -w3 bytes; ; end; \f ; rc 27.08.70 algol 5, file_i procedures, jj, segment 5 page ...42... ; move-subroutines, continued a9: al w2 x2-128 ; move128backw: source:= source-128; dl w0 x2+128, ds w0 x1+128, dl w0 x2+124, ds w0 x1+124; dl w0 x2+120, ds w0 x1+120, dl w0 x2+116, ds w0 x1+116; dl w0 x2+112, ds w0 x1+112, dl w0 x2+108, ds w0 x1+108; dl w0 x2+104, ds w0 x1+104, dl w0 x2+100, ds w0 x1+100; dl w0 x2+96 , ds w0 x1+96 , dl w0 x2+92 , ds w0 x1+92 ; dl w0 x2+88 , ds w0 x1+88 , dl w0 x2+84 , ds w0 x1+84 ; dl w0 x2+80 , ds w0 x1+80 , dl w0 x2+76 , ds w0 x1+76 ; dl w0 x2+72 , ds w0 x1+72 , dl w0 x2+68 , ds w0 x1+68 ; dl w0 x2+64 , ds w0 x1+64 , dl w0 x2+60 , ds w0 x1+60 ; dl w0 x2+56 , ds w0 x1+56 , dl w0 x2+52 , ds w0 x1+52 ; dl w0 x2+48 , ds w0 x1+48 , dl w0 x2+44 , ds w0 x1+44 ; dl w0 x2+40 , ds w0 x1+40 , dl w0 x2+36 , ds w0 x1+36 ; dl w0 x2+32 , ds w0 x1+32 , dl w0 x2+28 , ds w0 x1+28 ; dl w0 x2+24 , ds w0 x1+24 , dl w0 x2+20 , ds w0 x1+20 ; dl w0 x2+16 , ds w0 x1+16 , dl w0 x2+12 , ds w0 x1+12 ; dl w0 x2+8 , ds w0 x1+8 , dl w0 x2+4 , ds w0 x1+4 ; a10: se. w1 (a1.) ; if destination <> limit then jl. a8. ; goto movebackw; jl. a5. ; goto exit; i. ; e. ; end block movewrds \f ; rc 27.08.70 algol 5, file_i procedures, jj, segment 5 page ...43... ; move-subroutines, continued ; subroutine moveentries (descr,newempty,sn(newempty)); ; moves the entries in the table given by descr so that a, ; presumeably empty, entry at curr(descr) will be shifted ; so that it follows immediately after the entry at ; insert(descr). ; if the entry at insert(descr) is moved then insert(descr) ; is changed accordingly. ; sn(curr(descr)) is also moved to the new empty entry. ; entry: exit: ; w0 irrelevant sn(newempty) ; w1 descr unchanged ; w2 zonebufref zonebufref (from first formal.1) ; w3 return newempty ; uses: work0 and returnsegm for working locations ; calls: movewrds ( on this segment ) b. a1; begin block moveentries w. ; a0: 0 ; return a1: 0 ; newempty, a0a1 doubleword c20: c21=k-j0 ; rl w0 (x1+i10) ; begin ds w1 x2+i6+4 ; work0:= saveddescr:= w1; rl w0 x1+14 ; returnsegm:= savedsn:= rl w2 x1+i10 ; sn(curr(descr)); sl w0 x2 ; if insert(descr) >= curr(descr) then ws w0 x1+4 ; insert(descr):= rs w0 x1+14 ; insert(descr)-entrysize(descr); wa w0 x1+4 ; newempty:= ds. w0 a1. ; insert(descr)+entrysize(descr); ws w0 4 ; return:= w3; bs w2 x1+16 ; w0:= size:= newempty-curr(descr); rl w1 x1+4 ; w2:= curr(descr)-headsz(descr); wa w1 4 ; w1:= w2+entrysize(descr); sl w0 0 ; if size < 0 then rx w1 4 ; movewrds (w2, w1, size) jl. w3 c16. ; else dl w1 x2+i6+4 ; movewrds (w1, w2, size); al w3 0 ; ub(newempty):= 0; ds. w0 (a1.) ; w0:= sn(newempty):= savedsn; rl. w3 a1. ; w3:= newempty; jl. (a0.) ; w1:= saveddescr ; end; i. ; e. ; end block move entries \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 5 page ...44... ; subroutine initblocktable; ; initializes the blocktable for curr(bucks), writes cleared blocks and the bucktable. ; sets ubfile, maxusedbucks, last(bucks), ub(last(bucks)). ; work1-2 is used for return inf. ; work3 - - to save curr(recs) before call of putnew. ; entry: exit: ; w0 return segm undefined ; w1 irrelevant undefined ; w2 zonebufref unchanged ; w3 return undefined b. a1; begin block init block table w. ; c28: c29=k-j0 ; begin ws w3 (0) ; save return in: hs w3 x2+i6+1 ; work1: jl x3+rel rl w3 x2+i6+0 ; work2: return segm ds w0 x2+i6+8 ; rl w1 x2+i5+2 ; rx w1 x2+i5+i10 ; save curr(recs) rs w1 x2+i6+10 ; curr(recs):= first(recs) rl w1 x2+i3+i10 ; rs w1 x2+i3+6 ; last(bucks):= curr(bucks); al w0 0 ; rs w0 x1-2 ; ub(last(bucks)):= 0; rl w0 x1 ; w0:= sn(last(bucks)); ws w1 x2+i3+2 ; rs w1 x2+i7+6 ; ubfile:= last(bucks) - first(bucks); wa w1 x2+i3+4 ; al w1 x1+i8-i7 ; w1:= ubfile+entrysize(bucks)+ sl w1 (x2+i7+0) ; buckheadsize; rs w1 x2+i7+0 ; if w1 > maxused bucks then ba w0 x2+i4+17 ; maxusedbucks:= w1; rl w1 x2+i4+2 ; w0:= w0 + segsinshare(blocks); ; init the blocktable and put cleared blocks: ; <*w1 = first(blocks)*> ; repeat a1: rs w1 x2+i5+0 ; these(recs):= entryaddr; rs w0 x1 ; sn(these(recs)):= w0:= segmno; ; al w1 x2+i5 ; rl. w0 j0. ; putnew(recs, false); rl. w3 (j1.) ; jl w3 x3+c13 ; ; rl w1 x1 ; rl w0 x1 ; w0:= sn(these(recs)) +segsper(recs); ba w0 x2+i5+17 ; w1:= these(recs) +entrysize(blocks); wa w1 x2+i4+4 ; bz w3 x2+i5+16 ; until sh w0 x3 ; w1 > (if w0 > segsperbuck then am i2+12-i4-12 ; topfirstblocks else top(blocks)); sh w1 (x2+i4+12) ; jl. a1. ; ; al w0 f14 ; put the bucktable: al w1 x2+i3 ; hs w0 (x1+10) ; rl. w0 j0. ; rl. w3 (j1.) ; jl w3 x3+c7 ; rl w0 x2+i6+10 ; reset curr(recs) rs w0 x2+i5+i10 ; rl w3 (x2+i6+8) ; return jl x2+i6+6 ; ; i. ; e. ; end block init block table ; end of segment j20=k-j0 ; c.j20-506 ; m. code on segment 5 too long z. c.502-j20,0,r.252-j20>1 z.; fill with zeroes <:fileipr. s5<0>:> m. segment 5 i. e. \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 6 page ...45... ; 01.02.81 eah ; the code which performs insertions ; entered in d24 or d29 from the end of e16 (on segment 4) b. j20, g2 ; block for segment 6 k = 10000 h. ; g0=0 ; no of externals + no of globals j0: g1, g2; rel of last point, rel of last absword j1: -5, 0 ; address of segment 1 j9: 1<11+3, 0 ; address of segment 9 j16: -1, 0 ; - - - 5 g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; - - - point w. ; ; subroutine switchbuf; setbuf(-bufdiff); c22: c23=k-j0 ; ac w1 (x2+i6+28) ; ; subroutine setbuf (diff); ; sets bufdiff, messaddresses(recs) and ; first(recs) on the basis of diff; ; entry: exit: ; w0 irrelevant new first(recs) ; w1 diff new lastmessaddr(recs) ; w2 zonebufref unchanged ; w3 return unchanged c24: c25=k-j0 ; begin rs w1 x2+i6+28 ; sh w1 0 ; bufdiff:= w1:= diff; al w1 0 ; if diff <= 0 then w1:= 0; al w0 x1 ; w0:= w1; am (x2+i5+10) ; firstmessaddr(recs):= aa w1 -2 ; firstshared(recs)+w0; am (x2+i5+10) ; lastmessaddr(recs):= ds w1 4 ; lastshared(recs)+w1; bs. w0 1 ; first(recs):= rs w0 x2+i5+2 ; firstmessaddr(recs)-1; jl x3 ; end; ; subroutine setkeyparts; ; sets the keypart of curr(blocks) and, if needed, of curr(bucks); ; entry: exit: ; w0 irrelevant undefined ; w1 irrelevant undefined ; w2 zonebufref unchanged ; w3 return undefined ; uses: work0 for save return c26: c27=k-j0 ; begin rs w3 x2+i6+4 ; rl w3 x2+i5+2 ; savethekey(first(recs)); jl w2 (x2+i0+4) ; rl w3 x2+i4+i10 ; copykey(curr(blocks)); jl w2 (x2+i0+8) ; se w3 (x2+i4+2) ; if curr(blocks) = first(blocks) then jl (x2+i6+4) ; rl w3 x2+i3+i10 ; copykey(curr(bucks)); jl w2 (x2+i0+8) ; jl (x2+i6+4) ; end; \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 6 page ...46... ; the code which performs insertions, continued b. a25; begin block compress bucket w. ; d24: d25=k-j0 ; compress bucket: rl w3 x2+i4+i10 ; sn w3 (x2+i4+14) ; if curr(blocks) = insert(blocks) then jl. a14. ; goto insert and compress; rx w3 x2+i4+14 ; swop rs w3 x2+i4+i10 ; (curr(blocks),insert(blocks)); al w1 x2+i5+1 ; inout(recs, true); rl. w0 j0. ; comment read the first block; rl. w3 (j1.) ; jl w3 x3+c7 ; rl w3 x2+i4+4 ; w3:= entrysize(blocks); a1: rs w3 x2+i5+8 ; readloop: comment w3 = situation; wa w3 x2+i4+i10 ; situation:= w3; rs w3 x2+i4+i10 ; curr(blocks):= curr(blocks) + w3; rl w1 x2+i5+6 ; rs w1 x2+i5+i10 ; curr(recs):= last(recs); ws w1 x2+i5+2 ; jl. w3 c24. ; setbuf(last(recs)-first(recs)); al w1 x2+i5 ; rl. w0 j0. ; rl. w3 (j1.) ; inout(recs, false); jl w3 x3+c7 ; jl. w3 c22. ; switchbuf; rl w3 x2+i4+i10 ; ws w3 x2+i5+8 ; curr(blocks):= curr(blocks)-situation; rx w3 x2+i4+i10 ; if curr(blocks)+situation = insert(blocks) sn w3 (x2+i4+14) ; then goto insert block has been read; jl. a10. ; a3: rl w3 x2+i5+i10 ; extendrecs: comment find how much to ; output as one block; a4: sl w3 (x2+i5+6) ; w3:=curr(recs); jl. a5. ; while w3 < last(recs) do jl w2 (x2+i0+10) ; begin wa w3 2 ; w1:= getsize(w3); sh w3 (x2+i5+12) ; if w1+w3 > top(recs) then goto a5; jl. a4. ; w3:= w3+w1; ws w3 2 ; end; a5: rs w3 x2+i5+i10 ; a5: curr(recs):= w3; \f ; rc 08.11.78 algol7, file-i procedures, ib, segment 6 page ...47... a6: bz w0 x2+i1+7 ; writeblock: ; <*with zero in unused words*> sn w0 0 ; if strategy = simple insert then jl. a24. ; goto simple; ; rl w3 4 ; bz w2 x3+i5+17 ; ls w2 9 ; wa w2 x3+i5+2 ; w2:= last share byte:= segsper*512 +first(recs) rl w0 x3+i5+i10 ; ws w0 4 ; w0:= -bytes to move:= curr(recs) -lastsharebyte sn w0 0 ; if no unused bytes in this block then jl. a25. ; goto put_no_move; am (x3+i2+0) ; rl w1 -h3+h0+2 ; w1:= last of zbuf ds w1 x3+i6+8 ; work1work2work3:= -bytes_to_move, last_of_zbuf, rs w2 x3+i6+10 ; lastsharebyte; rl. w3 (j16.) ; movewrds(fromw2(lastsharebyte), jl w3 x3+c17 ; tow1(last_of_zbuf*>, sizew0<*-bytes_to_move*>); ; al w1 x2+i5 ; rl. w0 j0. ; rl. w3 (j1.) ; putnew(recs, false); jl w3 x3+c13 ; ; rl w0 x2+i6+6 ; rl w1 x2+i6+10 ; movewrds(fromw2<*lastofzbuf*>, rl w2 x2+i6+8 ; tow1<*lastsharebyte*>, rl. w3 (j16.) ; sizew0<*-bytestomove*>); jl w3 x3+c17 ; ; a22: ; rl w3 x2+i4+i10 ; w3:= wa w3 x2+i4+4 ; curr(blocks)+entrysize(blocks); \f ; rc 09.11.78 algol7, file-i procedures, ib segment 6 page ...48... ; compress bucket, continued rl w0 x2+i5+6 ; test for overflow from the block written: ws w0 x2+i5+i10 ; wa w0 x2+i5+2 ; w0:= first(recs)+last(recs)-curr(recs); sh w0 (x2+i5+2) ; if w0 > first(recs) then jl. a8. ; a7: ; overflow: rl w1 x2+i5+2 ; begin move to front: rs w0 x2+i5+6 ; last(recs):= w0; rs w3 x2+i4+i10 ; curr(blocks):= w3; rl w2 x2+i5+i10 ; movedbwrds ( curr(recs), rl. w3 (j16.) ; first(recs), jl w3 x3+c19 ; last(recs) ); rs w1 x2+i5+i10 ; curr(recs):= last(recs); rl w3 x2+i5+8 ; decide action on overflow: sn w3 -3 ; if situation = -3 then jl. a16. ; goto moveblocks; jl. w3 c26. ; setkeyparts; rl w3 x2+i5+8 ; sl w3 0 ; goto jl. a1. ; if situation >= 0 then readloop sn w3 -1 ; else if situation = -1 then writeblock jl. a6. ; else insert and compress jl. a14. ; end overflow; a8: rl w1 x2+i5+8 ; no overflow: sn w1 -2 ; if situation = -2 then goto overflow; jl. a7. ; comment because record not inserted yet; sh w1 0 ; jl. a9. ; if situation > 0 then al w1 x2+i4 ; empty block: rs w0 x2+i5+6 ; begin rs w3 x2+i4+i10 ; last(recs):= w0; rl. w3 (j16.) ; curr(blocks):= w3; jl w3 x3+c21 ; move entries (blocks); rl w3 x2+i4+14 ; curr(blocks):= insert(blocks); rs w3 x2+i4+i10 ; w3:= new situation:= 0; al w3 0 ; goto readloop jl. a1. ; end empty block; a24: rl w0 x2+i5+i10 ; simple: comment writing can wait till needed; ws w0 x2+i5+2 ; ub(these(recs)):= curr(recs) -first(recs); am (x2+i5+0) ; rs w0 -2 ; al w0 f14 ; shareop(recs):= write; hs w0 (x2+i5+10) ; a9: rl. w3 (j1.) ; record inserted: comment but maybe not jl x3+d1 ; in curr(blocks); goto searchrec; ; end insertreci \f ; rc 10.11.78 algol7, file-i procedures, ib, segment 6 page ...49... ; compress bucket, continued ; insert block has been read: a10: sn w3 (x2+i4+i10) ; if curr(blocks) = insert(blocks) then ; insert now no compress: a11: am 1 ; situation:= -1 else ; insert now or in next: a12: am 1 ; situation:= -2 else d28: d29=k-j0 ; insert and move blocks: a13: am -3 ; situation:= -3 else a14: al w1 0 ; insert and compress: rs w1 x2+i5+8 ; situation:= 0; rl w0 x2+i5+6 ; ws w0 x2+i5+14 ; sl w0 (x2+i5+12) ; if last(recs) - tailsize > top(recs) jl. a3. ; then goto extend recs; rs w0 x2+i5+i10 ; curr(recs):= last(recs) - tailsize; wa w0 x2+i5+4 ; se w1 -2 ; if situation = -2 then jl. a15. ; begin sl w0 (x2+i5+12) ; if curr(recs) + entrysize(recs) > top(recs) jl. a6. ; then goto writeblock; al w1 -1 ; situation:= -1 rs w1 x2+i5+8 ; end; a15: dl w2 x2+i5+6 ; insert the record: wa w1 4 ; movedbwrds ( last(recs), rl. w3 (j16.) ; last(recs)+entrysize(recs), jl w3 x3+c19 ; curr(recs)+entrysize(recs) ); al w0 x1 ; last(recs):= curr(recs)+ wa w1 x2+i5+14 ; entrysize(recs) + tailsize; rs w1 x2+i5+6 ; rl w1 x2+i5+i10 ; movedbwrds ( newrec, rl w2 x2+i2+10 ; curr(recs), rl. w3 (j16.) ; curr(recs)+entrysize(recs) ); jl w3 x3+c19 ; al w0 0 ; al w1 1 ; aa w1 x2+i7+4 ; noofrecs:= noofrecs +1; ds w1 x2+i7+4 ; al w0 0 ; rl w1 x2+i5+4 ; aa w1 x2+i7+12 ; ds w1 x2+i7+12 ; recbytes:= recbytes+entrysize(recs); rl w3 x2+i5+2 ; sn w3 (x2+i5+i10) ; if first(recs) = curr(recs) then jl. w3 c26. ; setkeyparts; jl. a3. ; goto extend recs; ; a25: rl w2 6 ; putnomove: al w1 x2+i5 ; rl. w0 j0. ; rl. w3 (j1.) ; putnew(recs, false); jl w3 x3+c13 ; jl. a22. ; ; a16: rl. w3 (j9.) ; move blocks: jl x3+d31 ; <*continue other segment*> i. ; e. ; end block compress bucket \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 6 page ...51... ; end segment ; end of segment j20=k-j0 ; c.j20-506 ; m. code on segment 6 too long z. c.502-j20,0,r.252-j20>1 z.; fill with zeroes <:fileipr. s6<0>:> m. segment 6 i. e. \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 7 page ...52... ; 01.02.81 eah ; getparamsi, setparamsi, settesti b. b4,g7,j20 ; block for segment 7 k = 10000 h. ; g0=0 ; no of externals + number of globals j0: g1, g2; rel of last point, rel of last absword j1: -6, 0 ; address of segment 1 j5: 0, 1 ; resulti, permanent core bytes 0,1 j6: g0+13, 0 ; rs entry 13 last used j7: g0+30, 0 ; - - 30 saved stackref and w3 j11: g0+4 , 0 ; - - 4 take expression j15: g0+6 , 0 ; - - 6 endregexpression g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. ; ; variables and constants ; name in: getparams setparams settest b0: 0 ; dbw paramno paramno procno b1: 0 ; - valaddr val results b2: 0 ; - bufaddr bufaddr setbits b3: 0 ; longparam longparam i b4: 10; \f ; rc 10.12.70 algol 5, file_i procedures, jj segment 7 page ...53... ; 01.02.81 eah ; integer procedure getparamsi (z) one or more pairs:(paramno, val); ; integer procedure setparamsi (z) one or more pairs:(paramno, val); ; integer procedure settesti (z) optional parameter:(testproc) ; one or more pairs:(procno, results); b. a12 ; beginblock commonpart: entryadministration, getparampair w. ; e24: e25=k-j0 ; getparamsi: am -13<7+12<7 ; w1:= getparamact else e26: e27=k-j0 ; setparamsi: am -14<7+13<7 ; w1:= setparamact else e28: e29=k-j0 ; settesti: al w1 14<7 ; w1:= settestact; al w0 2.11111 ; rl. w3 (j5.) ; work0:= resulti; rs. w3 b0. ; rl. w3 (j1.) ; prepare (all i states, w1); jl w3 x3+c1 ; rl. w3 b0. ; resulti:= work0; rs. w3 (j5.) ; al w1 x2 ; w1:= zonebufref; rl. w2 (j6.) ; w2:= stackref; al w3 x2+7 ; ba w3 x2+4 ; formallimit:= firstformal2:= rs w3 x2+8 ; stackref + appetite(stackref) + 7; sh w3 x2+13 ; if formallimit <= addr(second formal) then jl. a9. ; goto exitminus; comment too few parameters; bl w0 x1+i2+9 ; se w0 14<7 ; if actno = settestact then jl. a2. ; begin dl w0 x2+12 ; w3w0:= secondformal; sz w3 2.11111 ; if kind(w3) = procedure then jl. a1. ; begin ls w3 -4 ; if stackref(w3) < zonebufref then sh w3 x1 ; goto exitminus; comment scope error; jl. a9. ; teststackref:= w3; testproc:= w0; ds w0 x1+i1+16; w3:= address(thirdformal) + 1; al w3 x2+18 ; goto firstpair jl. a4. ; end; a1: rl w0 x1+i1+16; if testproc = 0 then sn w0 0 ; goto exitminus; comment no testproc; jl. a9. ; end; a2: al w3 x2+14 ; w3:= address(secondformal) + 1; jl. a4. ; goto firstpair; \f ; rc 10.12.70 algol 5, file_i procedures, jj, segment 7 page ...54... ; 01.02.81 eah ; getparampair: ; checks the next pair of parameters and switches to the proper action ; defined by actno or exits when through or error. g3: ; getparampair: rl. w2 (j6.) ; w2:= stackref rl w3 x2+10 ; w3:= paramaddr am 2 ; + 2; a3: ; next_of_pair: al w3 x3+3 ; w3:= w3 + 3; a4: ; first_of_pair: sl w3 (x2+8) ; if w3 >= formal_limit then jl. a8. ; goto testfinis; dl w1 x3-1 ; w0w1:= formalpair; rs w3 x2+10 ; save paramaddr in formal1.2 al w3 2.11111 ; la w3 0 ; w3:= paramkind; se w3 10 ; if kind <> int.expr and sn w3 12 ; kind <> long.expr then jl. a5. ; begin se w3 26 ; if kind <> int.var and sn w3 28 ; kind <> long.var jl. a11. ; then jl. g4. ; goto exitn; a11: sh w1 (x2+8) ; if paramaddr(w1) < formal_limit then rs w1 x2+8 ; formal_limit:= param_addr; jl. a6. ; end ; else a5: ; begin jl. w3 (j11.) ; take_expression; ds. w3 (j7.) ; save stackref a6: ; end; rl w3 x2+10 ; w3:= paramaddr; al w0 2.1111 ; w0:= kind:= la w0 x3-3 ; formal1(paramaddr) extract 4; sn w0 12 ; if kind = long al w0 0 ; then longparam:= 0 rs. w0 b3. ; else longparam:= <>0; rl w0 x1 ; w0:= rs w0 x3-1 ; formal2(paramaddr):= value(address); so w3 1 ; if even (w3) then jl. a3. ; goto nextofpair; rl w2 x2+6 ; w2:= zonebufref; rl w3 x3-5 ; b0:= w3:= value(firstparam); ds. w0 b1. ; b1:= w0:= value(secondparam); bz w3 x2+i2+9 ; w1:= address(secondparam); sn w3 12<7 ; jl. g5. ; switch to action (actno) sn w3 13<7 ; of:(getparam, set param, settest); jl. g6. ; jl. g7. ; g4: rl. w2 (j6.) ; exitn: w2:= stackref; rl w3 x2+10 ; w3:= paramaddr; a7: ws w3 4 ; oddpair: al w1 x3-6 ; w1:= pairno:= ls w1 -3 ; (w3-stackref-6)//8; jl. (j15.) ; goto endregexpression; a8: sz w3 1 ; testfinis: jl. a7. ; if odd(w3) then goto oddpair; am 1 ; exit0: w1:= 0 else a9: al w1 -1 ; exitminus: w1:= -1; jl. (j15.) ; goto endregexpression; i. ; e. ; endblock commonpart \f ; rc 14.01.71 algol 5, file_i procedures, jj, segment 7 page ...55... ; 01.02.81 eah b. a12,c3,d2 ; beginblock getparam and setparam w. ; g5: ; getparam: rs. w1 b1. ; valaddr:= w1; <*addr of return param*> rl. w3 b3. ; w3:= longparam; sn w3 0 ; if longparam then rs w3 x1-2 ; first_word_of_param:= 0; al. w3 a5. ; w3:= base extraget; jl. a12. ; goto get_or_set_param; g6: ; setparam: rl. w3 b3. ; w3:= longparam; se w3 0 ; if longparam then jl. a11. ; begin dl w1 x1 ; w0w1:= val; <*value of call param*> se w0 0 ; if first_word_of_param <> 0 jl. g4. ; then goto exitn; a11: ; end; al. w3 a6. ; w3:= base extraset; a12: ; get_or_set_param: rl. w0 b0. ; w0:= paramno; sh w0 a7 ; if paramno > maxparamno or sh w0 0 ; paramno < 1 then jl. g4. ; goto exitn; am (0) ; zl. w1 a4. ; w1:= acts:= acts_table(paramno); al w0 x1 ; w0:= acts; ls w1 -4 ; w1:= bufaddr:= acts shift (-4) wa w1 4 ; + zonebufref; rs. w1 b2. ; sz w0 2.11 ; if acts extract 2 <> 0 then al w3 x3-6 ; w3:= normal base; la w0 x3-2 ; w0:= action:= el w1 x3-2 ; acts and mask(w3) ls w0 x1 ; shift shifts(w3); wa w3 0 ; w3:= base + action; dl. w1 b2. ; w0:= val; <*or valaddr*> zl w3 x3 ; w1:= bufaddr; a1: jl. x3 ; goto action(w3); c1: ; getbyte: el w0 x1 ; a2: rs. w0 (b1.) ; returnparam:= byte(bufaddr); jl. g3. ; goto getparampair; c2: ; getword: rl w0 x1 ; returnparam:= word(bufaddr); jl. a2. ; goto getparampair; c3: rl. w3 b3. ; getlong: se w3 0 ; if -,longparam then jl. c2. ; goto getword; dl w0 x1 ; returnparam:= long(bufaddr); ds. w0 (b1.) ; jl. g3. ; goto getparampair; d1: sh w0 2047 ; setbyte: sh w0 -1 ; if w0 < 0 or w0 > 2047 then d0: jl. g4. ; forbidden: goto exitn; hs w0 x1 ; byte(w1):= w0; jl. g3. ; goto getparampair; d2: sh w0 -1 ; setword: jl. g4. ; if w0 < 0 then goto exitn; rs w0 x1 ; word(w1):= w0; jl. g3. ; goto getparampair; \f ; rc 06.07.78 algol7, file-i procedures, ib, segment 7 page ...56... ; 01.02.81 eah ; acts: ; a table holding one byte for each allowed paramno value, each byte ; defines a setaction and a getaction and possibly an address in the ; zonebuffer. there are two possible formats: ; basic acts, characterized by bits(10,11) <> 0: ; bits 0-7: addr. of parameter in zonebuffer, relative to zonebufref ; - 8-9: basic setaction ; - 10-11: basic getaction ; extra acts, characterized by bits(10,11) = 0; ; bits 0-4: extra setaction ; - 5-9: extra getaction a4=k-1 ; h. ; paramno name setact: getact: i7<4+ 4<4+0<2+3 ; 1 recsinfile forbidden getlong i7<4+12<4+0<2+3 ; 2 recbytes forbidden getlong i1<4+12<4+0<2+2 ; 3 transports forbidden getword i1<4+10<4+2<2+2 ; 4 pricelimit setword getword i1<4+ 2<4+2<2+2 ; 5 emptybuckpr. setword getword i1<4+ 0<4+1<2+1 ; 6 emptyblockpr. setbyte getbyte i1<4+ 4<4+1<2+1 ; 7 compresspr. setbyte getbyte i1<4+ 5<4+1<2+1 ; 8 priceperblock setbyte getbyte i1<4+ 1<4+1<2+1 ; 9 priceperbuck setbyte getbyte i1<4+ 8<4+0<2+2 ; 10 computedcost forbidden getword a7=k-a4-1 ; maxparamno w.h. ; get actions: 0,2.11 ; shifts and mask for basic get ; basic get: 0 ; c1-a1 ; 1 getbyte c2-a1 ; 2 getword c3-a1 ; 3 getlong -2,2.11111<2; shifts and mask for extra get a5: ; extra get: pt empty w.h. ; set actions: -2,2.11<2 ; shifts and mask for basic set ; basic set: d0-a1 ; 0 forbidden d1-a1 ; 1 setbyte d2-a1 ; 2 setword 0 ; 3 unused -7,2.11111<7; shifts and mask for extra set a6: a8=a5-a6; extra set: pt empty w. ; i. ; e. ; endblock getparam and setparam \f ; rc 10.11.78 algol7, file-i procedures, ib, segment 7 page ...57... b. a6 ; beginblock settest w. ; g7: sh w0 -1 ; settest: comment w0 = results; jl. g4. ; if w0 < 0 then goto exitn; al w1 0 ; setbits:= 0; a0: rs. w1 b2. ; sn w0 0 ; while w0 <> 0 do jl. a1. ; begin al w3 0 ; setbits:= setbits or wd. w0 b4. ; 1 shift (5 + w0 mod 10); al w1 1<5 ; w0:= w0//10; ls w1 x3 ; end; lo. w1 b2. ; jl. a0. ; a1: rl. w3 b0. ; test procno: sh w3 a6 ; sh w3 -1 ; if procno < 0 or procno > maxprocno or proctable(procno) = 0 then jl. g4. ; goto exitn; bz. w1 x3+a5. ; sn w1 0 ; jl. g4. ; sn w3 0 ; i:= if procno = 0 then maxprocno else al w3 a6 ; procno; comment =0 == all procs; a2: rs. w3 b3. ; loop set: bz. w3 x3+a5. ; w0w1:= proctable(i) shift(-6) shift 6; al w1 -1<6 ; comment mask for bits relevant for procno; la w1 6 ; w3:= proctable(i) extract 6; ws w3 2 ; comment number of shifts; al w0 0 ; se. w0 (b1.) ; jl. a3. ; if results = 0 then ld w1 x3 ; remove bits: la w0 x2+i2+6 ; testbits:= testbits and la w1 x2+i2+8 ; -,(w0w1 shift w3) lx w0 x2+i2+6 ; lx w1 x2+i2+8 ; jl. a4. ; a3: la. w1 b2. ; else ld w1 x3 ; testbits:= lo w0 x2+i2+6 ; testbits or lo w1 x2+i2+8 ; ((w0w1 and setbits) shift w3); a4: bz w1 2 ; hs w1 x2+i2+8 ; bit(0,testbits):= ls w0 1 ; if bits(1,35) of:(testbits) = 0 sn w0 0 ; then 0 else 1; se w1 0 ; am 1 ; al w3 0 ; ld w0 -1 ; rs w0 x2+i2+6 ; rl. w3 b3. ; i:= i-1; al w3 x3-1 ; sh. w3 (b0.) ; if i <= procno then jl. g3. ; goto getparampair; jl. a2. ; goto loop set; \f ; rc 10.11.78 algol7, file-i procedures, ib, segment 7 page ...58... ; proctable: ; one byte per procno value, 0 == no test: ; (1<noofresults - 1) < 6 + 41 - testshifts = 1<(noofresults+6)- ; testshifts-23; h. ; a5=k-1; table base 1<8 -f8 -23, 1<10-f5 -23, 1<8 -f9 -23, 1<8 -f4 -23, 1<8 -f17-23 1<8 -f3 -23, 1<9 -f1 -23, 1<8 -f2 -23, 1<9 -f6 -23, 1<12-f7 -23 1<7 -f18-23, 0, 0, 1<7-f19-23, 1<10-f20-23; a6=k-a5-1 ; maxprocno w. ; i. ; e. ; endblock settest ;end of segment j20=k-j0 ; c.j20-506 ; m.code on segment 7 too long z. c.502-j20,0,r.252-j20>1 z.; fill with zeroes <:fileipr. s7<0>:> m.segment 7 i. e. \f ; rc 07.06.78 algol6, file i procedures, ib, segment 8 page ...59... ; 01.02.81 eah ; setreadi, setputi, setupdatei b. j20,g2 ; block for segment 8 k = 10000 h. ; g0=0 ; no of externals +no of globals j0: g1, g2; rel of last point, rel of last absword j1: -7, 0 ; address of segment 1 j5: 0, 1 ; resulti, permanent core byte 0, 1 j6: g0+13, 0 ; rs-entry 13, last used j8: g0+21, 0 ; - - 21, general alarm j9: g0+8 , 0 ; - - 8 , end address expression j12: g0+3 , 0 ; - - 3 , reserve j13: g0+5 , 0 ; - - 5 , goto point g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. \f ; rc 22.01.79 algol6, file-i procedures, ib, segment 8 page ...60... ; procedure setreadi (z); ; procedure setputi (z); ; procedure setupdatei (z); ; these procedures prepares the file for updating or reading by ; effectuating the necessary transports to equalize the buffer areas ; in the core and on the backing storage. ; zonestate is set to readonly, put, or update respectively. ; the available record will be the same as before the call or, if ; zonestate was initialize, the first record of the file. ; result_i: ; 1 record available ; 2 first record available, initialization terminated b. a20; beginblock set readonly, put, or update; w. ; e6: e7=k-j0 ; am -5<7-f17+4<7+f4 ; setreadi: e20: e21=k-j0 ; w1:= setreadact else am -6<7-f3 +5<7+f17; setputi: e4: e5=k-j0 ; w1:= setputact else al w1 6<7+f3 ; setupdatei: al w0 2.11111 ; w1:= setupdateact; rl. w3 (j1.) ; jl w3 x3+c1 ; prepare (all i states, w1); bl w1 x2+i2+9 ; w1:= actno se w0 f0+4 ; jl. a4. ; if state = initialize then ; terminate initialization: se w1 4<7+f4 ; updmarks:= if readact then am 1 ; 0 else 1; al w3 0 ; rs w3 x2+i7+14 ; rl w0 x2+i7+4 ; begin lo w0 x2+i7+2 ; se w0 0 ; if noofrecs = 0 then jl. a2. ; begin am -2 ; a10: al w1 9 ; general alarm ( al. w0 a1. ; 7 or 9, <:prep i :>); jl. w3 (j8.) ; end; a1: <:<10>prep i :> ; a2: al w1 x2+i5 ; a3: rl. w0 j0. ; for descr:= recs, blocks, bucks do rl. w3 (j1.) ; begin jl w3 x3+c13 ; putnew(descr, false); rl w0 x1+i10 ; last(descr):= curr(descr); rs w0 x1+6 ; end; al w1 x1-i10 ; sl w1 x2+i3 ; jl. a3. ; resulti:= 0; jl. a7. ; end terminate initialization; \f ; rc 22.01.79 algol6, file-i procedures, ib, segment 8 page ...61... a4: se w1 4<7+f4 ; else <*terminate update or read*> jl. a11. ; begin sh w0 f0+1 ; if readact and zonestate = update then jl. a13. ; updmarks:= 0 jl. a12. ; a11: sl w0 f0+2 ; else if updateact and zonestate = read then jl. a13. ; if gossip then alarm(9) rl w3 x2+i7+14 ; else updmarks:= 1; sz w3 1<1 ; jl. a10. ; am 1 ; a12: al w3 0 ; if new updmarks then rs w3 x2+i7+14 ; shareop(bucks):= writeop; al w3 f14 ; hs w3 (x2+i3+10) ; a13: rl w3 x2+i5+i10 ; sl w0 f0+2 ; jl w2 (x2+i0+6) ; al w1 x2+i5 ; if state >= put then a5: rl. w0 j0. ; restorehead(curr(recs); rl. w3 (j1.) ; jl w3 x3+c7 ; inout(recs, false); a6: sn w1 x2+i3 ; jl. a7. ; if shareop(blocks) = writeop then al w1 x1-i10 ; inout(blocks, false); bl w0 (x1+10) ; se w0 f14 ; if shareop(bucks) = writeop then jl. a6. ; inout(bucks, false); jl. a5. ; end terminate update or read; a7: bl w1 x2+i2+9 ; set newstate and exit via next: al w0 f0 ; sn w1 5<7+f17 ; zonestate:= al w0 f0+2 ; if actno = readact then readonly sn w1 6<7+f3 ; else if actno = putact then put al w0 f0+3 ; else update; rs w0 (x2+i2+2) ; d22: rl. w3 (j1.) ; exitvianext: rl w1 (x3) ; get segment 1; rl w3 x2+i5+i10 ; w3:= recbase:= curr(recs); jl x1+d3 ; goto accessnext i. ; e. ; endblock set read, put, or update \f ; rc 02.01.79 algol7, file-i procedures, ib, segment 8 page ...63... b. a30 ; begin block continue init-start-file w. d26: d27=k-j0 ; continue init-start from other segment rl w3 x2+i2+0 ; set zonereferences: al w0 x3-h3+h2+6 ; rs w0 x2+i2+2 ; set record state addr; al w0 x3+4 ; rs w0 x2+i2+4 ; set record size addr; rl w1 x3-h3+h0+6 ; al w0 x1+h6+h6 ; set zonedescriptor and firstshared: rs w0 x3-h3+h0+8 ; al w3 x2+i7 ; lastshare := firstshare + rs w3 x1+2 ; 2*sharedescrsize; ; firstshared(1) := startbuckhead; wa w3 x2+i3+12 ; firstshared(2) := rs w3 x1+h6+2 ; firstshared(1) + top(bucks); wa w3 x2+i4+0 ; firstshared(3) := rs w3 x1+h6+h6+2 ; firstshared(2) + sharesize(blocks); rl w0 x2+i7+8 ; sharesn(bucks):= rs w0 x1+12 ; sn(file); \f ; rc 02.01.79 algol7, file-i procedures, ib, segment 8 page ...64... al w3 x1+6 ; set absolute addresses in descriptions: al w1 x2+i3 ; complete sharedescriptors: a9: rs w3 x1+10 ; w3:= firstshare+6; al w0 f13 ; for w1:= descr:= bucks, blocks, recs do hs w0 x3 ; begin ac w0 2 ; shareopaddr(descr):= w3; wa w0 x3-4 ; shareop(descr):= readop; wa w0 x1+0 ; lastshared(w3):= lastaddress(w3):= rs w0 x3-2 ; firstshared(w3) + rs w0 x3+4 ; sharesize(descr)-2; rl w0 x3-4 ; firstaddress(w3):= rs w0 x3+2 ; firstshared(w3); wa w0 x1+2 ; first(descr):= rs w0 x1+2 ; first(descr) + firstshared(w3); wa w0 x1+6 ; last(descr):= rs w0 x1+6 ; first(descr) + last(descr); rl w0 x3-4 ; wa w0 x1+12 ; top(descr):= top(descr) + rs w0 x1+12 ; firstshared(w3); al w3 x3+h6 ; w3:= w3 + sharedescrsize; al w1 x1+i10 ; sh w1 x2+i5 ; end; jl. a9. ; rl w0 x3-h6-2 ; testbuffer size: rl w1 x2+i2+0 ; sl w0 (x1-h3+h0+2) ; if lastshared(3) >= lastofbuffer then jl. a23. ; goto buffersmall; wa w0 x2+i5+0 ; sl w0 (x1-h3+h0+2) ; resulti:= if lastshared(3) + am 1 ; sharesize(recs) >= lastofbuffer then al w0 1 ; 2 else 1; sl w0 2 ; if resulti > 1 then hs w0 x2+i1+6 ; shortbuf:= true; rl w1 x2+i7+14 ; if gossip then sz w1 1<1 ; resulti:= resulti +2; ba. w0 -1 ; rs. w0 (j5.) ; rl w1 x2+i2+0 ; rl w3 x3-h6-h6-4 ; topfirstblocks:= wa w3 x2+i2+12 ; topfirstblocks + firstshared(2); rs w3 x2+i2+12 ; al w0 x2+i7+9 ; these(bucks):= rs w0 x2+i3 ; addr(snfile); rl w3 x1-h3+h0+0 ; al w1 x2+i0 ; a10: al w0 x3+1 ; for i:= 0 step 2 until bucks-2 do wa w0 x1 ; entrypoint(i):= rs w0 x1 ; entrypoint(i) + basebuffer +1; al w1 x1+2 ; se w1 x2+i1 ; jl. a10. ; \f ; rc 14.11.78 algol7, file-i procedures, ib, segment 8 page ...65... al w1 0 ; a11: al w1 x1+1 ; al w0 x1 ; leap(bucks):= wm w0 2 ; intsqrt(noofbucks)* sh w0 (x2+i6+4) ; entrysize(bucks); jl. a11. ; al w1 x1-1 ; wm w1 x2+i3+4 ; rs w1 x2+i3+8 ; rl w3 x2+i3+2 ; init bucktable: al w1 x2+i7 ; wa w1 x2+i7+0 ; w0 := segsperbucks; al w0 0 ; a12: ba w0 x2+i5+16 ; for w3:= first(bucks) + entrysize(bucks) wa w3 x2+i3+4 ; step entrysize(bucks) sl w3 (x2+i3+12) ; until top(bucks) do jl. a13. ; begin sl w3 x1 ; if w3 > startbuckhead + maxusedbucks rs w0 x3 ; then sn(w3):= w0; jl. a12. ; w0:= w0 + segsperbucks; ; end; a13: al w0 0 ;finish: rs w0 (x2+i2+4) ; record_size:= 0; comment for initfilei; al w0 f0+4 ; rs w0 (x2+i2+2) ; if actno = initact then bl w0 x2+i2+9 ; begin se w0 3<7+f9 ; zonestate:= initialize; jl. (j9.) ; goto endaddressexpression al w0 f0+0 ; end; rs w0 (x2+i2+2) ; zonestate:= readonly; rl. w3 (j1.) ; goto fromstart; comment in nextreci; jl x3+d9 ; a15: <:isq:>; checksum ; a16: <:<10>prep i<32><32>:> ; ; a17: am 1 ; updatemarks: w1:= 9 else a18: am 1 ; contentserr: w1:= 8 else a19: am 1 ; emptyfile: w1:= 7 else a20: am 1 ; zonestateerr: w1:= 6 else a21: am 1 ; shareerr: w1:= 5 else a22: am 1 ; nothead: w1:= 4 else a23: am 1 ; buffersmall: w1:= 3 else a24: am 1 ; bucktablehead:w1:= 2 else a25: al w1 1 ; areasizeerr: w1:= 1; al. w0 a16. ; general alarm jl. w3 (j8.) ; (w1, <file_i>); m.initfilei, startfilei i. ; e. ; endblock continued initfilei, startfilei ; end of segment j20=k-j0 ; c.j20-506 ; m.code on segment 8 too long z. c.502-j20,0,r.252-j20>1 z.; fill with zeroes <:fileipr. s8<0>:> ; alarmtext m.segment 8 i. e. \f ; rc 10.11.78 algol7, file-i procedures, ib, segment 9 page ...67... ; 01.02.81 eah ; ; insertreci (continued), systemi ; b. g2, j20 ; block for segment 9 k = 10000 h. ; g0=0 ; no of externals +no of globals ; j0: g1, g2 ; rel of last point, rel of last absword j1: -8, 0 ; address of segment 1 j6: g0+13, 0 ; rs entry 13 last used j7: g0+30, 0 ; rs entry 30 saved stackref and w3 j9: g0+8 , 0 ; rs entry 8 end address expression j16: -4, 0 ; address of segment 5 j17: -3, 0 ; - - - 6 ; g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; - - - point w. ; \f ; rc 02.01.79 algol7, file-i procedures, ib, segment 9 page ...68... ; procedure systemi(z, fnc, w0, w1, w3); ; ; entrance to codepieces in the filehead. ; fnc is the piece identification: i0+fnc. ; w0-3 is used for call and return values of the pieces. ; only for internal use. no parameter checking. ; obs. abs. addresses must be arranged from elsewhere. ; b. a0 w. e18: e19=k-j0 ; systemi: ; rl. w2 (j6.) ; w2:= stackref:= lastused; ds. w3 (j7.) ; save stackref and return rl w3 x2+8 ; w3:= zoneaddr; rl w3 x3+h0 ; zonebufref:= w2:= basebuffer(zoneaddr) + wa w3 x3+1 ; zonebufrefrel; rx w2 6 ; w3:= stackref; rl w0 (x3+12) ; work:= word(formal 2.2); rs. w0 a0. ; rl w0 (x3+16) ; w0:= word(formal3.2); rl w1 (x3+20) ; w1:= word(formal4.2); rl w3 (x3+24) ; w3:= word(formal5.2); wa. w2 a0. ; jl w2 (x2+i0) ; goto codepiece(fnc); rl. w2 (j6.) ; rs w0 (x2+16) ; set return values; rs w1 (x2+20) ; rs w3 (x2+24) ; jl. (j9.) ; return ; ; a0: 0 ; working location for fnc ; m.systemi i. ; e. ; end block systemi \f ; rc 02.01.79 algol7, file-i procedures, ib, segment 9 page ...69... ; the code which performs insertions, continued b. a10; begin block move blocks w. ; d30: d31=k-j0 ; move blocks: bl w1 x2+i5+17 ; ls w1 9 ; setbuf(segsper(recs)*segsize); rl. w3 (j17.) ; jl w3 x3+c25 ; rl w0 x2+i4+14 ; rl w3 x2+i3+14 ; w3:= insert(bucks); sn w0 (x2+i4+6) ; if insert(blocks) <> last(blocks) or sh w3 (x2+i3+i10) ; insert(bucks) <= curr(bucks) then jl. a4. ; goto get a block; a1: am (x2+i3+6) ; loop: comment w3 = insert(bucks); sl w3 1 ; if insert(bucks) > last(bucks) then jl. a9. ; goto use empty buck; rl w1 x2+i3+4 ; sh w3 (x2+i3+i10) ; w1:= curr(bucks) + ac w1 x1 ; (if insert(bucks) > curr(bucks) then wa w1 x2+i3+i10 ; entrysize(bucks) else -entrysize(bucks)); ac w0 (x2+i4+4) ; sh w3 (x2+i3+i10) ; insert(blocks):= first(blocks) + rl w0 x1-2 ; (if insert(bucks) > curr(bucks) then wa w0 x2+i4+2 ; -entrysize(blocks) else ub(w1)); rs w0 x2+i4+14 ; rs w1 x2+i3+i10 ; curr(bucks):= w1; a3: al w1 x2+i4+1 ; rl. w3 (j1.) ; rl. w0 j0. ; inout(blocks, true); jl w3 x3+c7 ; rl w3 x2+i3+14 ; w3:= insert(bucks); a4: rl w0 x2+i4+6 ; get a block: comment w3=insert(bucks); se w3 (x2+i3+i10) ; if insert(bucks) = curr(bucks) then jl. a5. ; begin wa w0 x2+i4+4 ; curr(blocks):= last(blocks):= rs w0 x2+i4+6 ; last(blocks) + entrysize(blocks); rs w0 x2+i4+i10 ; ub(curr(bucks)):= ws w0 x2+i4+2 ; last(blocks) - first(blocks) rs w0 x3-2 ; end jl. a6. ; else a5: sh w3 (x2+i3+i10) ; begin rl w0 x2+i4+2 ; curr(blocks):= rs w0 x2+i4+i10 ; if insert(bucks) > curr(bucks) then al w1 x2+i5 ; last(blocks) rl. w0 j0. ; else first(blocks); rl. w3 (j1.) ; inout(recs, false) jl w3 x3+c7 ; end; \f ; rc 02.01.79 algol7, file-i procedures, ib, segment 9 page ...70... ; move blocks, continued a6: al w1 x2+i4 ; move the now empty block: rl. w3 (j16.) ; jl w3 x3+c21 ; move entries(blocks); rl w0 x2+i4+i10 ; se w0 (x2+i4+2) ; if curr(blocks) = first(blocks) then jl. a7. ; rl w0 x2+i3+4 ; movewrds rl w1 x2+i3+i10 ; (curr(blocks), bs w0 x2+i3+16 ; curr(bucks), rl w2 x2+i4+i10 ; entrysize(bucks)-entryheadsz(bucks); rl. w3 (j16.) ; comment updating the keypart of jl w3 x3+c17 ; curr(bucks); a7: rl w0 x2+i4+14 ; wa w0 x2+i4+4 ; curr(blocks):= rs w0 x2+i4+i10 ; insert(blocks)+entrysize(blocks); a8: rl. w3 (j17.) ; write to the now empty block: jl w3 x3+c23 ; al w1 x2+i5 ; switchbuf; rl. w0 j0. ; putnew(recs,false); rl. w3 (j1.) ; jl w3 x3+c13 ; al w0 f14 ; shareop(blocks):= writeop; hs w0 (x2+i4+10) ; rl. w3 (j17.) ; jl w3 x3+c27 ; setkeyparts; rl w0 x2+i5+6 ; rs w0 x2+i5+i10 ; curr(recs):= last(recs); rl w3 x2+i3+14 ; if insert(bucks) <> curr(bucks) then se w3 (x2+i3+i10) ; jl. a1. ; goto loop; al w1 0 ; move completed: am (x2+i5+10) ; sn(share(recs)):= 0; comment forces rs w1 6 ; a new reading of the block if it rl. w3 (j17.) ; jl w3 x3+c25 ; happens to contain the new record; ; setbuf(0); rl. w3 (j1.) ; goto searchrec; jl x3+d1 ; ; end insertreci a9: rx w3 x2+i3+i10 ; use empty buck: rs w3 x2+i3+14 ; swop(insert(bucks), curr(bucks)); al w1 x2+i4 ; rl. w0 j0. ; inout(blocks,false); rl. w3 (j1.) ; comment writes old curr(blocks); jl w3 x3+c7 ; rl. w0 j0. ; rl. w3 (j16.) ; initblocktable; jl w3 x3+c29 ; al w1 x2+i3 ; rl. w3 (j16.) ; jl w3 x3+c21 ; moveentries(bucks,newempty,sn(newempty)); rs w3 x2+i3+i10 ; curr(bucks):= rs w3 x2+i3+14 ; insert(bucks):= newempty; al w1 f14 ; shareop(bucks):= writeop; hs w1 (x2+i3+10) ; am (x2+i4+10) ; sn(share(blocks)):= rs w0 6 ; sn(newempty); rl w3 x2+i4+2 ; rs w3 x2+i4+6 ; last(blocks):= curr(blocks):= rs w3 x2+i4+i10 ; first(blocks); jl. a8. ; goto write a block to the now empty; i. ; e. ; end block move blocks \f ; rc 02.01.79 algol7, file-i procedures, ib, segment 9 page ...71... ; end segment ; end of segment j20=k-j0 ; c.j20-506 ; m. code on segment 9 too long z. c.502-j20,0,r.252-j20>1 z.; fill with zeroes <:fileipr. s9<0>:> m. segment 9 i. e. \f ; rc 02.01.79 algol7, file-i procedures, ib page ...last... m. global file_i segment i. e. ; end global slang segment \f ; rc 03.11.78 algol7, file-i procedures, ib page ...tails 1... ; tails to be inserted in catalog g0: ; first entry: ; getreci ; getreci is the area name b0 ; no of segments 0,r.4 ; 1<23+e1 ; entry: segment 1, e1 1<18+26<12+8<6,0 ; procedure (zone, array) 4<12+b1 ; algol external list b0<12+b2 ; codesegments, b2 bytes permanent ; nextreci ; 1<23+4 ; <:getreci:>, 0 ; 1<23+e3 ; entry: segment 1, e3 1<18+8<12, 0 ; procedure(zone) 4<12 ; b0<12+b2 ; ; setupdatei ; 1<23+4 ; <:getreci:>,0 ; 1<23+7<12+e5 ; entry: segment 8, e5 1<18+8<12, 0 ; procedure(zone) 4<12 ; b0<12+b2 ; ; setreadi ; 1<23+4 ; <:getreci:>, 0 ; 1<23+7<12+e7 ; entry: segment 8, e7 1<18+8<12, 0 ; procedure (zone). 4<12 ; b0<12+b2 ; ; initreci ; 1<23+4 ; <:getreci:>, 0 ; 1<23+1<12+e9 ; entry: segment 2, e9 1<18+26<12+8<6,0 ; procedure(zone, array) 4<12 ; b0<12+b2 ; ; deletereci ; 1<23+4 ; <:getreci:>, 0 ; 1<23+1<12+e11 ; entry: segment 2, e11 1<18+8<12, 0 ; procedure(zone) 4<12 ; b0<12+b2 ; \f ; rc 03.11.78 algol7, file-i procedures, ib page ...tails 2... ; setputi ; 1<23+4 ; <:getreci:>, 0 ; 1<23+7<12+e21 ; entry: segment 8, e21 1<18+8<12,0 ; procedure (zone) 4<12 ; b0<12+b2 ; ; putreci ; 1<23+4 ; <:getreci:>, 0 ; 1<23+1<12+e23 ; entry: segment 2, e23 1<18+8<12,0 ; procedure (zone) 4<12 ; b0<12+b2 ; ; getparamsi ; 1<23+4 ; <:getreci:>, 0 ; 1<23+6<12+e25 ; entry: segment 7, e25 3<18+39<12+8<6,0; integer procedure (zone, general) 4<12 ; b0<12+b2 ; ; setparamsi ; 1<23+4 ; <:getreci:>, 0 ; 1<23+6<12+e27 ; entry: segment 7, e27 3<18+39<12+8<6,0; integer procedure (zone, general) 4<12 ; b0<12+b2 ; ; settesti ; 1<23+4 ; <:getreci:>, 0 ; 1<23+6<12+e29 ; entry: segment 7, e29 3<18+39<12+8<6,0; integer procedure (zone, general) 4<12 ; b0<12+b2 ; \f ; rc 14.11.78 algol7, file-i procedures, ib page ...tails 3... ; 10.02.81 eah ; initfilei ; 1<23+4 ; <:getreci:>, 0 ; 1<23+2<12+e13 ; entry: segment 3, e13 1<18+14<12+14<6+8,0 ; procedure (zone, realval, realval) 4<12 ; b0<12+b2 ; ; startfilei ; 1<23+4 ; <:getreci:>, 0 ; 1<23+2<12+e15 ; entry: segment 3, e15 1<18+8<12,0 ; procedure (zone) 4<12 ; b0<12+b2 ; ; insertreci ; 1<23+4 ; <:getreci:>, 0 ; 1<23+3<12+e17 ; entry: segment 4, e17 1<18+26<12+8<6, 0 ; procedure(zone, array) 4<12 ; b0<12+b2 ; ; systemi ; 1<23+4 ; <:systemi:>, 0 ; 1<23+8<12+e19 ; entry: segm 9, e19 1<18+3<12+3<6+3 ; procedure(zone, integer, integer, integer, 3<18+8<12 ; integer) 4<12 ; b0<12+b2 ; g1: ; last tail: ; resulti ; 1<23+4 ; <:getreci:>, 0 ; 1 ; address: byte 1, permanent core 9<18, 0 ; integer variable 4<12 ; b0<12+b2 ; ▶EOF◀