|
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: 291840 (0x47400) Types: TextFile Names: »tcf «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »tcf «
\f ; rc 26.02.71 rc4000 code procedure, connected files page 0.1 ; ; release 12.1, 18.10.79 ; ; content page ; ; preface 0.1 ; slang-names 0.1 ; a-names, local labels 0.1 ; b-names, zone-buf variables 0.2 ; master-file buffer 0.2 ; list-file buffer 0.4 ; c-names, local variables 0.5 ; d-names, global subroutines 0.6 ; e-names, code procedures 0.7 ; f-names, global constants 0.8 ; master-file record 0.8 ; list-file record 0.9 ; chain-tables 0.10 ; list-file block-table 0.11 ; list-file block 0.12 ; zone-states 0.14 ; reference to file-i buffer 0.14 ; g-names, tails, head-word, code-segment 0.16 ; h-names, zone-descriptor 0.16 ; i-names, unused 0.16 ; j-names, abs-words, points, chain-for-rel 0.17 ; content of segments 0. ; code segments 1.1 ; ; obs. pages are numbered <segment>.<page>, the preface is ; regarded as segment 0. ; ;b. h50 ; fp-names dummy block ; b. b70, e70, f60, g1 ; insertproc-block w. ; ; slang-names. ; ; a-names ; ; procedure-, subroutine-, or makro-block. ; ; they are used as labels at the innermost block-levels, they should ; preferably label instructions. \f ; rc 28.10.74 rc4000 code procedure, connected files page 0.2 ; ; ; b-names ; ; insertproc-block. ; ; a b-name will always define a displacement relative to cf-buf-ref, ; the absolute address, normally held in w2, pointing to the current ; zone-buffer. ; ; b0 to b49 the variables of cf-procedures and subroutines in ; the socalled cf-buffer. ; ; b50 and up the variables of the file-n procedures, the basic ; list-file administration, in the socalled file-n ; buffer. ; ; master-file buffer. ; ; base-buffer-area: !====================================! ; ! i-buf-ref-rel (>0) ! ; !------------------------------------! ; ! cf-buf-ref-rel ! ; !------------------------------------! ; first-m-ch-addr - 2:! reference to db-table. ! ; ! -1 in file head, ! ; ! abs addr after call of init-dbtable! ; !------------------------------------! ; first-m-ch-addr: ! first-mother-chain-table ! ; ! . ! ; ! . ! ; ! . ! ; !------------------------------------! ; ! 0 (ends the mother-tables) ! ; !------------------------------------! ; ! return address (split-key-code) ! ; split-key-code: ! compiled piece of code, which ! ; ! can split a key-part into a ! ; ! record. ! ; ! jl. (split-key-code. - 2) ! ; !------------------------------------! ; ! cf-variables used for master- ! ; ! files only. ! ; !------------------------------------! ; cf-buf-ref: ! cf-variables common to master- ! ; ! files and list-files. ! ; !------------------------------------! ; ! min-rec-size-zb (master-file only)! ; !====================================! ; ! save-head, the compressed key ! ; ! (or key-part) of the current re- ! ; ! cord, saved by the file-i procs. ! ; ! this is the file-i buffer. ! ; ! . ! \f ; rc 10.09.71 rc4000 code procedure, connected files page 0.3 ; ; ; definition of common b-names. ; ; b-name ; content in zone-buf ; in file-head ; init by ; b1=0 ; jl x3 (return-1-zb) ; jl x3 ; - ; b1+2 ; segm-tbl-addr (ret.1) ; 0 ; - b3=b1+4 ; jump-spec-1-zb ; 0 ; set-jumps-cf ; b3+2 ; jump-spec-2-zb ; 0 ; set-jumps-cf ; b3+4 ; jump-spec-3-zb ; 0 ; set-jumps-cf b4=b3+6 ; formal.1-jump-proc-zb ; 0 ; set-jumps-cf ; b4+2 ; formal.2-jump-proc-zb ; 0 ; set-jumps-cf b5=b4+4 ; rec-base-addr-zb ; 0 ; open-cf b6=b5+2 ; mode-zb ; 0 ; - b8=b6+2 ; ch-part-base-zb ; 0 ; - b9=b8+2 ; ch-part-size-zb ; - ; - b14=b9+2 ; save-head-size-zb ; - ; - b15=b14+2 ; file-no<4+file-type-zb; - ; - b16=b15+2 ; first-m-ch-addr-zb ; rel. cf-buf-ref; open-cf b19=b16+2 ; curr-m-ch-zb ; 0 ; 0 ; ; definition of master-file variables. ; ; b-name ; content in zone-buf ; in file-head ; init by ; b7=b1-6 ; split-key-code-zb ; rel. cf-buf-ref; open-cf b10=b7+2 ; rec-length-type-zb ; - ; - b11=b10+2 ; rec-length-pos-zb ; - ; - ; ; b12=b19+2 ; min-rec-size-zb ; - ; - b21=b12+2 ; first word, save-head ; in file-i buf ; ; ; attention! ; if one of the values of b-names 0 to 16 is changed, the same ; change has to be made in dbrecdecode, because all the b-names up ; to 16 are copied there. ; \f ; rc 01.10.77 rc4000 code procedure, connected files page 0.4 ; ; ; list-file buffer. ; ; base-buffer-area: !====================================! ; ! 0 (as opposed to master-file) ! ; !------------------------------------! ; ! cf-buf-ref-rel ! ; !------------------------------------! ; first-m-ch-addr - 2:! reference to db-table. ! ; ! as in masterfiles. ! ; !------------------------------------! ; first-m-ch-addr: ! first-mother-chain-table ! ; ! . ! ; ! . ! ; ! . ! ; !------------------------------------! ; ! 0 (ends the mother-tables) ! ; !------------------------------------! ; first-d-ch-addr: ! first-daughter-chain-table ! ; ! . ! ; ! . ! ; ! . ! ; !------------------------------------! ; ! cf-variables used for list-files ! ; ! only. ! ; !------------------------------------! ; cf-buf-ref: ! cf-variables common to master- ! ; ! files and list-files. ! ; !====================================! ; file-n-buf. ! save-size-zb ! ; ! save-rec-no-zb (save-head) ! ; !------------------------------------! ; ! file-n ! ; ! variables ! ; !------------------------------------! ; share-list. ! block-table-share-zb ! ; (variable size). ! last-used-share-zb ! ; ! . ! ; ! . ! ; victim-zb: ! victim-share ! ; !====================================! ; block-table. ! dead-bytes ! ; ! used-bytes upper part ! ; ! used-bytes low part ! ; ! fill-percentage,blocks-in-file ! ; !------------------------------------! ; victim-zb + f18: ! first word of block-table ! ; ! . ! ; ! . ! ; ! . ! ; !====================================! ; block-shares. ! first word of first block-share ! ; ! . ! ; ! . ! ; ! . ! \f ; rc 10.09.71 rc4000 code procedure, connected files page 0.5 ; ; ; definition of list-file variables. ; ; b-name ; content in zone-buf ; in file-head ; init by ; b2=b1-10 ; jl x3 (return-2-zb) ; jl x3 ; - ; b2+2 ; segm-tbl-addr (ret.2) ; 0 ; - b13=b2+4 ; max-rec-size-zb ; - ; - b17=b13+2 ; first-d-ch-addr-zb ; rel. cf-buf-ref; open-cf b20=b17+2 ; curr-d-ch-zb ; 0 ; - ; ; definition of file-n variables. ; ; b-name ; content in zone-buf ; in file-head ; init by ; b50=b19+2 ; save-size-zb ; fix-rec-size ; - b51=b50+2 ; save-rec-no-zb ; 0 ; - b52=b51+2 ; segs-in-head-zb ; - ; - b53=b52+2 ; segs-in-block-zb ; - ; - b54=b53+2 ; recs-in-block-zb ; - ; - b55=b54+2 ; max-free-shift-3-zb ; - ; - b56=b55+2 ; fix-rec-size-zb ; - ; - b57=b56+2 ; block-ref-zb ; first-segs-zb ; - b58=b57+2 ; rec-no-rel-zb ; block-size+2-zb; - b59=b58+2 ; new-blocks-in-file-zb ; max-blocks-zb ; open-cf b60=b59+2 ; last-rec-no-zb ; 0 ; open-cf b64=b60+2 ; block-zb ; 0 ; - b61=b64+2 ; victim-zb ; checksum ; open-cf b62=b61+2 ; block-table-share-zb ; not-in-head ; open-cf b63=b62+2 ; last-used-share-zb ; not-in-head ; open-cf ; ; ; note on share-list: ; ; each word in the share-list points to the first byte of the message ; in a share-descriptor, i.e. the normal address of the share- ; descriptor is found by subtracting 6 from the share-list entry. ; ; ; c-names. ; ; procedure-, subroutine-, or makro-block. ; ; they are used for variables and constants at the innermost block- ; levels. \f ; rc 06.12.74 rc4000 code procedure, connected files page 0.6 ; ; ; ; d-names. ; ; slang-segment. ; ; global entries of subroutines, and other global labels. ; ; d0 to d60 cf-subroutines and -labels. ; d60 and up file-n procedures and subroutines. ; ; two d-names are used for each entry or label. ; ; d<2n> normal slang-label, used for reference from own ; segment. ; d<2n+1> relative address on segment, used for reference ; from other segments. ; ; d-name ; cf-subroutine page ; ; d0 - d1 ; prepare 2.2 ; d4 - d5 ; check-chain 5. ; d6 - d7 ; set-rec-pointers 2.3 ; d8 - d9 ; move-word 5. ; d10 - d11 ; compare 5. ; d14 - d15 ; next-l-int 6.5 ; d16 - d17 ; return-algol 2.4 ; d18 - d19 ; new-head-chain 5. ; d20 - d21 ; adjust-prior-rec 6.8 ; d22 - d23 ; get-mother-rec-int 11. ; d24 - d25 ; decode-rec 11.9 ; d26 - d27 ; delete-l-int 7. ; d28 - d29 ; delete-chain-int 7. ; d30 - d31 ; move-double 5. ; d32 - d33 ; put-cf-int 2.10 ; d34 - d35 ; alarm 1.2 ; d36 - d37 ; call-file-i 2.6 ; d38 - d39 ; test-shift-table 2.4 ; d40 - d41 ; get-m-int 2.8 ; d42 - d43 ; read-only-cf-int 14.4 ; d44 - d45 ; open-cf-continued 13.2 ; d46 - d47 ; get-param 15.5 ; d48 - d49 ; set-param 15.7 ; d50 - d51 ; call-protect-cf 13.9 ; d52 - d53 ; call-alarmproc 15.8 ; d54 - d55 ; call-jump-proc 3.8 ; d56 - d57 ; call-init-file-i 13.5 ; d58 - d59 ; return-from-call-init-file-i 12.3.1 \f ; rc 06.12.74 rc4000 code procedure, connected files page 0.6.1 ; ; ; d-name ; file-n procedure page ; ; d60 - d61 ; set-mode-n 14.6 ; d62 - d63 ; get-rec-n 4. ; d64 - d65 ; set-free-n 5. ; d66 - d67 ; insert-n 10.2 ; d68 - d69 ; find-rec-no-n 8.2 ; ; d-name ; file-n subroutine page ; ; d72 - d73 ; get-block-r 4. ; d74 - d75 ; get-block-b 4. ; d76 - d77 ; log-func 5. ; d78 - d79 ; squeeze 10.5 ; d80 - d81 ; find-most-free 8.5 ; d82 - d83 ; init-blocks 15.2 ; d84 - d85 ; return-from-init-blocks 14.7 ; d86 - d87 ; log-func-r 5. ; d88 - d89 ; get-rec-n-int 4. ; d90 - d91 ; write-back 14.9 \f ; rc 06.12.74 rc4000 code procedure, connected files page 0.7 ; ; ; ; e-names. ; ; insertproc-block. ; ; only used for the algol procedures. ; ; two e-names are used for each entry, they are only used in the tails. ; ; e<2n> segment-number relative to first code segment. ; ; e<2n+1> relative entry-address on code segment. ; ; n = cf-proc-no ; ; e-name ; code procedure page ; ; e4 - e5 ; init-file-m 12.2 ; e6 - e7 ; open-cf 12.2 ; e8 - e9 ; set-jumps-cf 16.2 ; e10 - e11 ; init-chain 13.6 ; e12 - e13 ; close-cf 14.2 ; e14 - e15 ; - ; e16 - e17 ; get-m 2.8 ; e18 - e19 ; get-l 6.2 ; e20 - e21 ; get-head 3.6 ; e22 - e23 ; insert-m 3.2 ; e24 - e25 ; insert-l 9.2 ; e26 - e27 ; connect 11. ; e28 - e29 ; delete-m 7. ; e30 - e31 ; delete-l 7. ; e32 - e33 ; delete-chain 7. ; e34 - e35 ; next-m 2.9 ; e36 - e37 ; put-cf 2.10 ; e38 - e39 ; read-only-cf 14.4 ; e40 - e41 ; read-upd-cf 14.4 ; e42 - e43 ; update-all-cf 14.4 ; e44 - e45 ; move-chain x. ; e46 - e47 ; get-numb-l 4. ; e48 - e49 ; new-recl-cf x. ; ; e56 - e57 ; init-rec-m 3.2 ; e58 - e59 ; disconnect 15. ; e60 - e60 ; get-param-cf 16.2 ; e62 - e63 ; set-param-cf 16.2 \f ; rc 10.09.71 rc4000 code procedure, connected files page 0.8 ; ; ; ; f-names. ; ; insertproc-block. ; ; used for global administrative counters and constants, such as ; zone-states and format-defining displacements. ; ; f-name ; counter or constant ; f0=0 ; segment count ; f1 ; number of externals, defined on segment 1 ; f2 ; start of external list, defined on segment 1 ; f3 ; number of bytes in permanent core, defined under ; j-names f4=10000 ; first k-value on a code segment f5=5 ; write-oper, a write-operation on backing store f6=3 ; read-oper, a read-operation on backing store ; ; format of master-file record. ; ; record-base: !====================================! ; ! user-part, ! ; ! an integral number of ! ; ! double-words. ! ; !------------------------------------! ; + key-field-pos(i): ! key-field(i) ! ; !------------------------------------! ; ! . ! ; !------------------------------------! ; + rec-length-pos-zb:! length-field (may be absent) ! ; !------------------------------------! ; ! . ! ; chain-part-base-zb: !------------------------------------! ; ! chain-part, ! ; ! an integral number of double- ! ; ! words. ! ; !------------------------------------! ; ! next-chfld (mother) ! ; + chfld-rel-tbl: !------------------------------------! ; ! (chfld-rel-tbl points to the last ! ; ! byte of next-chfld). ! ; ! . ! ; !====================================! ; ; if variable length is defined, the length-field is changed by ; cf-procs to let the record appear to the user as if it only con- ; sisted of the user-part, the file-i procs will always restore the ; original length-field. ; ; values of the 24-bit integer next-chfld (mother). ; ; = 0 end of chain ; > 0 the number of the first daughter-record \f ; rc 10.09.71 rc4000 code procedure, connected files page 0.9 ; ; ; format of list-file record. ; ; 1. fixed record-length. ; ; record-base: !====================================! ; ! user-part, ! ; ! an integral number of double- ! ; ! words. ! ; ! . ! ; chain-part-base-zb: !====================================! ; ! chain-part, ! ; ! an integral number of words. ! ; !------------------------------------! ; ! next-chfld (mother) ! ; + chfld-rel-tbl: !------------------------------------! ; ! (chfld-rel-tbl points to the last ! ; ! byte of the next-chfld). ! ; ! . ! ; !------------------------------------! ; ! next-chfld (daughter) ! ; + chfld-rel-tbl: !------------------------------------! ; ! head-fld, ! ; ! an integral number of words (evt. ! ; ! none) holding a compressed key of ! ; ! the mother-record. ! ; !------------------------------------! ; ! (chfld-rel-tbl defines the base ! ; ! of the head-fld). ! ; ! . ! ; !====================================! ; ; values of the 24-bit integer next-chfld (daughter). ; ; bit(0) = 0 active record ; bit(0) = 1 dead record ; bit(1 to 23) = ; 2**23 - 1 record not connected to this chain ; bit(1 to 23) = 0 this record ends the chain ; bit(1 to 23) <> 0 number of next record in chain ; f7=1<23 ; dead-bit f8=1<23-1 ; not connected f9=f7 o. f8 ; dead not connected ; ; ; 2. variable record-length. ; ; the first double-word of the user-part is used for administration. ; ; administrative double-word in file. ; ; !====================================! ; ! rec-size + free-bit ! ; !------------------------------------! ; ! record-number ! ; !====================================! ; ; values of free-bit. ; ; 0 a used record (active or dead) ; 1 a free record, i.e. the record has been set free, but ; the surrounding records have still not been squeezed ; together. \f ; rc 10.09.71 rc4000 code procedure, connected files page 0.10 ; ; ; administrative double-word in zone-record. ; ; record-base: !====================================! ; ! length of user-part(double-words) ! ; !------------------------------------! ; ! record-number ! ; !====================================! ; ; ; ; chain-tables. ; ; 1. mother-tables. ; ; !====================================! ; chain-addr: ! d-ch-addr-tbl (-1 = not-init) ! ; + 2 ! d-cf-buf-ref-tbl (-1 = not-init) ! ; + 4 ! chfld-rel-tbl ! ; + 6 ! chain-number-tbl (byte) ! ; + 7 ! chain-seq-number-tbl (byte) ! ; !====================================! ; + f10 ! next mother-table or zero ! ; f10=8 ; size of mother-chain-table ; ; 2. daughter-tables. ; ; !====================================! ; chain-addr: ! m-ch-addr-tbl (-1 = not-init) ! ; + 2 ! m-cf-buf-ref-tbl (-1 = not-init) ! ; + 4 ! chfld-rel-tbl ! ; + 6 ! chain-number-tbl (byte) ! ; + 7 ! chain-seq-number-tbl (byte) ! ; !------------------------------------! ; + 8 ! next-d-ch-tbl ! ; + 10 ! head-fld-size-tbl ! ; !------------------------------------! ; + f11 ! prior-tbl ! ; + f12 ! last-acc-tbl ! ; + f13 ! next-tbl ! ; + f14 !------------------------------------! ; ! head-tbl, an integral number of ! ; ! words holding the compressed key ! ; ! of the current mother-record. ! ; !====================================! ; f11=12 ; prior-tbl f12=f11 + 2 ; last-acc-tbl f13=f12 + 2 ; next-tbl f14=f13 + 1 ; base of head-tbl \f ; rc 01.10.77 rc4000 code procedure, connected files page 0.11 ; ; ; ; list-file block-table in zone-buffer. ; ; victim-zb: ; !====================================! ; + 2 ! dead-bytes ! ; + 4 ! used-bytes upper part ! ; + 6 ! used-bytes low part ! ; + 8 ! fill-percentage,blocks-in-file ! ; !------------------------------------! ; + f18 ! first word of block-table ! ; ! . ! ; ! . ! ; ! the block-table occupies: ! ; ! (blocks-in-file + 3)//4 words. ! ; ! . ! ; !====================================! ; ! first shared of first block-share ! ; ! . ! ; f51=(:-1:)>7 ; mask for blocks-in-file f52=(:-1:)<17 ; - fill-percentage f53=7 ; shiftcount f18=10 ; first block-table-word rel. to victim-zb ; ; list-file blocks are numbered from 0 and up, the block-table holds ; a 6-bit entry for each block giving a logarithmic derivative of the ; amount of free room. ; ; first byte of block-table: ; free(block-0) shift 6 add free(block-1) ; ; last word of block-table: ; unused 6-bit entries are set to zero ; ; free(block-n):= if free-rec-nos(block-n) = 0 then 0 ; else log-func(free-bytes(block-n)); ; ; log-func works upon the quantity max-free-shift-3-zb and yields a ; result in the range 1 to 63, the latter only for a completely empty ; block. ; \f ; rc 10.09.71 rc4000 code procedure, connected files page 0.12 ; ; ; list-file block. ; ; list-file blocks are numbered from 0 and up to blocks-in-file - 1. ; ; !====================================! ; block-ref + f20: ! free-bytes (byte) ! ; block-ref + f21: ! free-rec-nos (byte) ! ; block-ref + f22: ! free-base-rel ! ; block-ref + f23: ! over-flow-block ! ; !------------------------------------! ; block-ref: ! rec-base-rel(0) (byte) ! ; + 1 ! rec-base-rel(1) (byte) ! ; ! . ! ; ! . ! ; ! rec-base-rel(recs-in-block - 1) ! ; !------------------------------------! ; + recs-in-block ! first word available for records ! ; ! . ! ; ! . ! ; + rec-base-rel(n) !------------------------------------! ; ! the record of the number: ! ; ! rec-no:= block-number * ! ; ! recs-in-block + n + 1; ! ; !------------------------------------! ; ! . ! ; ! . ! ; + free-base-rel !------------------------------------! ; ! consecutive free area, a new rec- ! ; ! cord is always inserted here in ! ; ! case of variable record-length. ! ; !------------------------------------! ; last-shared: ! 1 (stop-record for squeeze, only ! ; ! needed for variable rec-length) ! ; !====================================! ; ; f20= -6 ; free-bytes, rel. to block-ref f21=f20 + 1 ; free-rec-nos, - f22=f21 + 1 ; free-base-rel, - f23=f22 + 2 ; over-flow-block, - \f ; rc 10.09.71 rc4000 code procedure, connected files page 0.13 ; ; ; comment on even and odd addresses: ; ; block-ref = first-shared - f20, i.e. block-ref is even. ; ; the base of a used record is calculated thus: ; ; rec-base-rel(rec-no):= byte(block-ref ; + (rec-no - 1) mod recs-in-block); ; ; rec-base(rec-no):= block-ref + rec-base-rel(rec-no); ; ; i.e. rec-base-rel is odd for a used record. ; ; a record-number is marked free = not-used by subtracting the last ; bit, the used-bit, thereby making rec-base-rel even. ; ; free-base-rel is odd, and the size of the consecutive free area ; is calculated thus: ; ; free-size:= last-shared - 1 - free-base-rel - block-ref; ; ; recs-in-block-zb is even in the case of variable record-length in ; order to let the address of the first word available for records be ; calculated as: block-ref + recs-in-block. ; ; value of over-flow-block. ; ; = -1 no overflow occurred ; >= 0 last overflow occurred to the block of this number \f ; rc 20.04.79 rc4000 code procedure, connected files page 0.14 ; ; ; zone-states. ; ; f28=16 - 10 ; read-only-m - read-only-i, difference between ; corresponding file-cf- and file-i-states. ; f29=16 + 8 ; max-cf-state, used in calculating check-bits ; ; each cf-zone-state is represented by two f-names: ; ; f<even> ; abs value of zone-state ; f<even + 1> ; check-bit = 1<(:max-cf-state - f<even>:) ; ; the check-bits are added in w0 as a parameter for the subroutine ; prepare. ; if for example update-all-m and read-update-m are the allowed states, ; the code will look like this: ; ; al w0 f35+f37 ; prepare(update-all-m, ; jl prepare ; read-update-m) ; ; in prepare: ; ls w0 zone-state - max-cf-state ; so w0 1 ; ; jl zone-state-error ; ; f<even> , f<even + 1> ; zone-state ; f30=16 , f31=1<(:f29-f30:) ; read-only-m f32=f30 + 1 , f33=1<(:f29-f32:) ; not-used (read-next-i) f34=f32 + 1 , f35=1<(:f29-f34:) ; read-update-m f36=f34 + 1 , f37=1<(:f29-f36:) ; update-all-m f38=f36 + 1 , f39=1<(:f29-f38:) ; init-m f40=f38 + 1 ; f41 ; not-used f42=f40 + 1 , f43=1<(:f29-f42:) ; read-only-l f44=f42 + 1 , f45=1<(:f29-f44:) ; read-update-l f46=f44 + 1 , f47=1<(:f29-f46:) ; update-all-l ; ; f49=f31 + f35 + f37 + f43 + f45 + f47 ; check-bits for all cf-states ; except init-m ; ; ; reference to file-i buffer. ; ; f50 and up are used for reference to file-i buf (very few such ; references should ever be needed). \f ; rc 10.09.79 rc8000 code procedure connected files page 0.15 ; ; b. i15 w. ; isq version 12 ; i0=0 i1=i0+14 i2=i1+20 i10=18 i3=i2+26 i4=i3+i10 i5=i4+i10 \f ; rc 18.10.78 rc4000 code procedure, connected files page 0.16 ; ;======================================================================= f50= i5 + i10 ; curr(recs), used in init-m f55= i5 + 4 ; entrysize(recs), used in init_m i. e. ; ; ; g-names. ; ; insert-proc-block. ; ; g0 first tail ; g1 last tail ; ; code-segment-block. ; ; g1 rel of last point ; g2 rel of last abs work ; ; g3 administration at end segment ; ; g4 and up labels common to one segment only ; ; ; h-names. ; ; fp-name-block. ; ; they are all defined by the standard text-file, fp-names. ; they are used for definition of zone- and share-descriptor-formats. ; see rcsl no: 55-d74, code procedures ....: ; ; ; i-names. ; ; not used yet. \f ; rc 04.01.72 rc4000 code procedure, connected files page 0.17 ; ; ; ; j-names. ; ; code-segment-block. ; ; they are entirely used for abs-words, points, and chain-for-rel. ; ; j-name use ; ; j0 head word, segment-table-address, own segment ; j1 - j20 reference to own segments, j<n>, abs word referring ; to segment <n> ; j21 - j40 reference to own permanent core: ; byte-no content ; j21 1 return-1-p, init to jl x3 ; j22 3 return-1-p, (segment tbl address) ; j23 5 return-2-p, init to jl x3 ; j24 7 return-2-p, (segment tbl address) ; j25 9 zero, first word of real rec-no-cf ; j26 11 rec-no-cf ; j27 13 size-p, used by file-n procs ; j28 15 over-flow-p, - ; j29 17 unused ; j30 19 work-0-p, used by cf-procs ; j31 21 work-1-p, - ; j32 23 work-2-p, - ; j33 25 proc-no-p, - ; j34 27 result-cf ; j35 29 save-cf-buf-ref-p, used by file-n procs ; j36 31 alarmno-p, j36 to j38 are used by the ; j37 33 subroutine alarm for saving its parameters. ; j38 35 ; ; f3=35 + 1 ; number of bytes in permanent core ; ; j41 - j80 reference to external procedures and variables, ; j<40 + n>, reference to external no. n, see page ; 1.1, the external list. ; j81 - j100 chain for rel ; ; j101 - reference to running system entries, j<100 + n>, ; reference to rs-entry n. ; ; ; s. d110 ; slang segment. w. ; ; ; ; end segment 0 \f ; rc 18.10.78 rc4000 code procedure, connected files page 1.1 ; b. g10,j150 ; code segment 1: head admini labels, abswords ; points, and chain_for_rels f0=f0+1 ; increase segm.count f1=16 ; initialize no. of externals k=f4 ; k:= first k-value h. j0: g1, g2 ; headword: last point, last absword j2: 1<11 o.(:2-f0:), 0 ; ref. to segm. 2 j13: 1<11 o.(:13-f0:), 0 ; ref. to segm. 13, call protectcf j15: 1<11 o.(:15-f0:), 0 ; ref. to segm. 15 j33: 0 , 25 ; procno_p j36: 0 , 31 ; alarm-no-p j121: f1 + 21, 0 ; RS general alarm j130: f1 + 30, 0 ; rs saved stackref, saved w3 ; ; g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. f2=k-j0 ; rel. start of external list: f1 ; no. of externals 8 ; no. of bytes to init in own perm. core jl x3 ; return_1_p 0 jl x3 ; return_2_p 0 ; \f ; rc 18.10.78 rc4000 code procedure, connected files page 1.1.1 ; ; ; externals: file_i_procs and _std.var., same sequence as in RCSL ; 55-D99, i_proc 14 is not called but simulated. <:initfilei:>,0 ; ext.no.1 1<18+14<12+14<6+8,0 ; proc(zone,realval,realval) <:initreci:>,0 ; ext.no.2 1<18+26<12+8<6,0 ; proc(zone,array) <:startfilei:> ; ext.no.3 1<18+8<12,0 ; proc(zone) <:setreadi:>,0 ; ext.no.4 1<18+8<12,0 ; proc(zone) <:setputi:>,0 ; ext.no.5 1<18+8<12,0 ; proc(zone) <:setupdatei:> ; ext.no.6 1<18+8<12,0 ; proc(zone) <:getreci:>,0 ; ext.no.7 1<18+26<12+8<6,0 ; proc(zone,array) <:nextreci:>,0 ; ext.no.8 1<18+8<12,0 ; proc(zone) <:deletereci:> ; ext.no.9 1<18+8<12,0 ; proc(zone) <:insertreci:> ; ext.no.10 1<18+26<12+8<6,0 ; proc(zone,array) <:dbrecdecode:> ; ext.no.11 3<18+26<12, 0 ; integer proc(array) <:resulti:>,0 ; ext.no.12 9<18,0 ; integer variable ; ; external: algol std.proc. <:open:>,0,0 ; ext.no.13 1<18+19<12+41<6+19,8<18 ; proc(zone,intaddr,undef,intaddr) ; ; externals: file_i_procs no.12-13. <:getparamsi:> ; ext.no.14 3<18+39<12+8<6,0 ; proc(zone,general) <:setparamsi:> ; ext.no.15 3<18+39<12+8<6,0 ; proc(zone,general) ; ; external: algol procedure <:protectcf:>,0 ; ext.no.16 1<18+ 3<12+8<6,0 ; proc(zone,intname) ; ; external: db-procedures ; ext.no.11 is misused for this purpose s3 ,s4 ; date and time of this version \f ; rc 18.10.78 rc4000 code procedure, connected files page 1.2 ; ; ; subroutine alarm(alarmno); ; ; the routine tests whether the alarm number corresponds to a ; tested cf filehead. ; if that is the case, the jump-specification of the zone ; corresponding to the call of the cf-procedure is inspected to ; see whether the bit corresponding to (procno, result) = (1, 1) ; is one. ; if this bit has been set to one, (by setjumpscf), then a user ; alarm procedure is called with procno-p and alarmno as the pa- ; rameters. ; if the conditions above are not fulfilled, or the user procedu- ; re returns through its final end, then the alarm routine will ; continue in this way: ; protectcf is called with the action procno shift 12 add alarmno ; in order to have a good alarmprint. ; after that ; the routine finds an alarmtext to alarmno, and calls RS general ; alarm. Note that saved_stack_ref (j130) must correspond to the ; cf_proc entry. (Alarmno 1-7 are not used by the cf_system.) ; call ; w0: undef. ; w1: alarmno ; w2: integer ; only used if alarmno = 8 or 38; ; w3: call addr +2 \f ; rc 04.01.72 rc4000 code procedure, connected files page 1.2.1 ; ; b. a10, c5 ; alarm: w. d34: d35=k-f4 ; if alarmno = se w1 8 ; 8 zonestate or sn w1 25 ; 25 zone-buffer-error (opencf) or jl. a1. ; se w1 26 ; 26 wrong filehead (opencf) or sn w1 32 ; 32 not 2 shares (opencf) jl. a1. ; then goto call_alarm; ; ; ; save the parameters for alarm in permanent core, and inspect the ; jump-spec-bit corresponding to (procno, result) = (1, 1) for the ; zone corresponding to the cf-buf-ref saved in formal1.1, to see ; whether a user alarm procedure should be called. ; rs. w1 (j36.) ; save the parameters, w1 to w3 am. (j36.) ; ds w3 +4 ; ; ; load cf-buf-ref from formal1.1 of the cf procedure call. dl. w3 (j130.) ; w2:= rs saved stackref rl w2 x2+6 ; w2:= cf-buf-ref:= formal1.1 ; rl. w3 (j2.) ; w1:= testshifts(procno = 1, result = 1) bz w1 x3+d39 ; := table(1 - 1) + 1; al w1 x1+1 ; see subroutine return-algol. ; dl w0 x2+b3+2 ; w3w0:= jumpspec-1-zb, jumpspec-2-zb ld w0 x1-24 ; w3w0:= w3w0 shift (testshifts - 24) sl w0 0 ; if signbit(w0) = 0 then jl. a0. ; goto continue-alarm ; ; now it is known that the user alarm procedure should be called, ; but because segment 1 is rather crowded, the call is performed on ; segment 15 by call-alarmproc. ; the return from the user procedure is at a2 below. ; al w0 a2 ; w0:= rel.return, to this segment rl. w3 (j15.) ; jl x3+d53 ; call-alarmproc \f ; jw 05.02.79 rc4000 code procedure, connected files page 1.2.2 ; ; a2=k-j0 ; return-from-alarm-proc: ds. w3 (j130.) ; restore rs saved stackref, saved w3 rl w2 x2+6 ; w2:= cf_bufref:= formal1.1 ; a0: ; continue-alarm: rl. w1 (j33.) ; action for protectcf:= ls w1 12 ; procno_p shift 12 wa. w1 (j36.) ; + alarmno_p; rl. w0 j0. ; call protectcf for alarmprint rl. w3 (j13.) ; jl w3 x3+d51 ; rl. w1 (j36.) ; fetch the alarm parameters am. (j36.) ; dl w3 +4 ; ; a1: ; call-alarm: al w0 x1 wa w0 2 wa w0 2 wa w0 0 ; w0:= alarmno*6 am (0) ; al. w0 c0. ; w0:= w0+textbase-8*6 se w1 8 ; if alarmno = 8 or alarmno = 38 then sn w1 38 ; w1:= int_errorno; al w1 x2 ; comment zonestate or param-pair-no; jl. (j121.) ; goto general alarm c0=k-8*6 <:<10>z.state :> ; start of alarmtexts, 3 words each, first <:<10>ch.ass. :> ; text = alarmno 8 <:<10>cf-error:> ; alarm 10 <:<10>mode p :> <:<10>cf-error:> <:<10>array p :> <:<10>no.curr.:> \f ; rc 28.10.74 rc4000 code procedure, connected files page 1.3 ; ; <:<10>chain p :> ; alarm 15 <:<10>ch.state:> <:<10>ch.state:> <:<10>ch.head :> <:<10>rec.no. :> <:<10>ch.type :> ; alarm 20 <:<10>fixed l :> <:<10>rec.no. :> <:<10>a-23 :> <:<10>prep_cf :> <:<10>prep_cf :> ; alarm 25 <:<10>prep_cf :> <:<10>a-27 :> <:<10>m.state :> <:<10>d.state :> <:<10>rec.type:> ; alarm 30 <:<10>zrecsize:> <:<10>prep-cf :> <:<10>prep-cf :> <:<10>a-34 :> <:<10>a-35 :> ; alarm 35 <:<10>express.:> <:<10>cf-error:> <:<10>par.pair:> i. e. \f ; rc 28.06.71 rc4000 code procedure, connected files page 1.4 ; ; g3=k-j0 c. g3-506 m. code on segment 1 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system 1:> i. e. m. end segment 1 \f ; rc 18.10.78 rc4000 code procedure, connected files page 2.1 b. g10, j150 ; code segment 2: f0=f0+1 ; increase segm.count k=f4 h. j0: g1, g2 ; headword: last point, last absword j1: 1<11 o.(:1-f0:), 0 ; ref. to segm.1 j3: 1<11 o.(:3-f0:), 0 ; ref. to segm.3 j33: 0 , 25 ; own core byte 24-25, proc_no_p j34: 0 , 27 ; own core byte 26-27, result_cf j35: 0 , 29 ; own core byte 28-29, save-cf-buf-ref-p j42: 2 , j82 ; ext.no.2 , init_rec_i j44: 4 , j84 ; ext.no.4 , set_read_i j45: 5 , j85 ; ext.no.5 , set_put_i j46: 6 , j86 ; ext.no.6 , set_update_i j47: 7 , j87 ; ext.no.7 , get_rec_i j48: 8 , j88 ; ext.no.8 , next_rec_i j49: 9 , j89 ; ext.no.9 , delete_rec_i j50: 10, j90 ; ext.no.10, insert_rec_i j51: 11, j91 ; ext.no.11, dbrecdecode j52: 12, 0 ; ext.no.12, result_i j54: 14, j94 ; ext.no.14, get_params_i j55: 15, j95 ; ext.no.15, set_params_i j103: f1+3 , 0 ; rs reserve j108: f1+8 , 0 ; rs end address expression j113: f1+13, 0 ; rs last used j130: f1+30, 0 ; rs saved stack ref, saved w3 ; g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. \f ; rc 28.10.74 rc4000 code procedure, connected files page 2.2 ; ; ; subroutine prepare (statebits); ; ; the routine is called at the start of every cf_procedure. ; it fetches and saves stack_ref, stores proc.no. in permanent core, ; takes the zone-parameter, checks the zone-state against a mask ; given as call quantity. Finally it calculates cf_buf_ref, stores ; this in formal 1.1, and sets result_cf:= 1. ; call return ; w0: state-bits undef. ; w1: proc.no. undef. ; w2: undef. cf_buf_ref ; w3: return address stack_ref ; ; b. a5 w. d0: d1=k-f4 ; prepare: rl. w2 (j113.) ; ds. w3 (j130.) ; w2:= stackref:= lastused rs. w1 (j33.) ; put proc.no. in permanent core rl w3 x2+8 ; w3:= base of zonedescr. am (x3+h2+6) ls w0 -f29 ; if statebits shift (z.state - maxstate) so w0 1 ; <> 1 then jl. a0. ; goto zonestate_error; rl w3 x3+h0+0 ; w3:= basebuffer wa w3 x3+3 ; +cf_buf_ref_rel; rs w3 x2+6 ; formal1.1:= cf_buf_ref:= w3; al w2 x3 ; w2:= w3; al w0 1 ; rs. w0 (j34.) ; result_cf:= w0:= 1; dl. w0 (j130.) ; w3:= saved_stack_ref jl (0) ; goto return a0: ; zonestate_error: w3 contains base of z.des. rl w2 x3+h2+6 ; w2:= zonestate; al w1 8 ; g6: rl. w3 (j1.) ; jl w3 x3+d35 ; goto alarm(8); e. ; end block prepare; \f ; rc 18.10.78 rc4000 code procedure, connected files page 2.3 ; ; ; subroutine set_rec_pointers ; the routine adjusts rec_size_zd to size of userpart and sets ch_ ; part_base_zb to point to the base of the chain_part, and at last ; it adjusts the record-length in the userpart, if variable length ; is specified. ; call return (simple) ; w0: undef. undef. ; w1: undef. undef. ; w2: cf_buf_ref cf_buf_ref ; w3: return addr. undef. ; ; b. a5, c5 ; set_rec_pointers: w. d6: d7=k-f4 rs. w3 c0. ; save_return:= w3 rl w3 x2+b5 ; w3:= rec_base_addr_zb rl w1 x3+4 ; w1:= rec_size_zd:= ws w1 x2+b9 ; rec_size_zd -ch_part_size_zb rs w1 x3+4 ; rl w3 x3 ; w3:= rec_base_zd al w0 x3 ; ch_part_base_zb:= w0:= rec_base_zb wa w0 2 ; +rec_size_zd rs w0 x2+b8 ; wa w3 x2+b11 ; w3:= length_addr:= rec_base_zd ; +rec_length_pos_zb am (x2+b10) ; jl. a0. ; case rec_length_type_zb of a0: jl. (c0.) ; 0: fixed length, goto return 0 ; caution! * these two words are used 0 ; ********** by return-algol j91=k-j0-1 ; dummy chain for rel for dbrecdecode ; hs w1 x3 ; 6: byte jl. (c0.) 0 ; rs w1 x3 ; 12: word jl. (c0.) 0 ; rs w1 x3 ; 18: double-word jl. (c0.) c0: 0 ; used for save return; ; ci w1 0 ; 24: real ds w1 x3 jl. (c0.) e. ; end block set_rec_pointers \f ; rc 01.11.77 rc4000 code procedure, connected files page 2.4 ; ; ; subroutine return_algol ; ; the routine inspects result_cf and performs a call of the jump- ; procedure, if it is indicated by jump_spec. ; Returns to the calling program through RS 8. ; call no return ; w0: undef. ; w1: undef. ; w2: cf_buf_ref ; w3: undef. ; b. a5, c50 ; begin block return_algol c0 = 6 ,c1 =c0 +1 ; this table with c-names specifies the c2 =c1 +0,c3 =c2 +0 ; highest testshift-value for each cf_proc. c4 =c3 +0,c5 =c4 +1 ; the value is assigned by adding the no. of c6 =c5 +1,c7 =c6 +1 ; results to the testshiftvalue of the pre- c8 =c7 +3,c9 =c8 +3 ; vious proc. An empty proc.no. or proc.s c10=c9 +2,c11=c10+6 ; that cannot be jump_specified have no._of_ c12=c11+4,c13=c12+2 ; results = 0. c0 is a pseudo-proc used to c14=c13+3,c15=c14+2 ; avoid call of jump_proc, when a cf-proc c16=c15+2,c17=c16+2 ; is called internally. c18=c17+1,c19=c18+1 ; the testshift-table is stored in halfwords c20=c19+1,c21=c20+1 ; c22=c21+4,c23=c22+3 ; c24=c23+6,c25=c24+0 ; c26=c25+0,c27=c26+0 ; c28=c27+4,c29=c28+4 ; c30=c29+0,c31=c30+0 ; c32=c31+0 ; ; ; c1 should correspond to the procedure buflengthcf, and should have ; the value c0+0, because buflengthcf can never call the jumpproc. ; but c1 is instead set to c0+1, because the jumpspecification bit ; corresponding to (procno, result) = (1, 1) is used to specify ; whether a user alarm-procedure should be called in case of an alarm. ; h. 0 d38: d39=k-f4 ; the table is also addressed from the seg- c0 , c1 ; ment containing set_jumps_cf, which re- c2 , c3 ; quires that the table is preceded by a c4 , c5 ; zero and ended with an extra empty test- c6 , c7 ; shift-value c8 , c9 c10, c11 c12, c13 c14, c15 c16, c17 c18, c19 c20, c21 c22, c23 c24, c25 c26, c27 c28, c29 c30, c31 c32 \f ; rc 18.10.78 rc4000 code procedure, connected files page 2.5 ; ; w. d16: d17=k-f4 ; return_algol: rl w1 x2+b16 ; rl w1 x1-2 ; w1:= addr2 in db-table; ;ks -10 ; comment w1 = addr 2, w2 = cfbufref sh w1 2047 ; if addr2 < 2048 then jl. a2. ; goto continue; rs. w2 (j35.) ; save cfbufref in cf-bufref-p; rl w2 x2+b5 ; w2:= recbase addr; rl w3 x2+4 ; w3:= zonerecsize; rl w2 x2 ; w2:= recbase; al w0 -13 ; w0:= itype:= se w3 0 ; if zonerecsize = 0 then secret rl w0 x2+6 ; else z.indivtype; ;ks -11 ; comment w0 = itype, w1 = addr2, ; w2 = recbase, w3 = recsize se w3 (x1-2) ; if zrecsize <> length-of-last-decoded jl. a3. ; or sn w0 (x1) ; indivtype <> last-decoded-indivtype then jl. a1. ; begin a3: al w2 x3 ; comment w0 = indivtype , w1 = addr2, ; w2 = zonerecsize, w3 = unused; ;ks -12 ; comment see above rl. w3 (j51.) ; external entry dbrecdecode; jl w3 x3+502 ; call decodeinternal in dbrecdecode; ; comment w1 = addr2 in dbtable rl w3 (x1+8) ; w3:= value of indivclass; ; -2: illegal itype ; -1: illegal length ; >=0: ok sh w3 -1 ; if iclass <= -1 then jl. a5. ; goto iclass_alarm; ; end; a1: rl. w2 (j35.) ; restore cfbufref and continue; a2: ; continue: dl w0 x2+b3+2 ; w3w0:= first pair of testwords; ; ks 1 sl w3 0 ; if signbit(w3) = 0 then goto end_addr_expr; jl. (j108.) ; comment no testshifts at all; ; rl. w1 (j33.) ; w1:= cf_proc_no_p; bz. w1 x1+d38.-1 ; testshifts:= w1:= wa. w1 (j34.) ; tbl(cf_proc_no_p - 1) + result_cf; ; ks 2 sh w1 47 ; if testshifts >= 48 then jl. a0. ; begin al w1 x1-48 ; w1:= testshifts mod 48; dl w0 x2+b3+6 ; w3w0:= next pair of testshiftwords; ; ks 3 ; end; \f ; rc 20.06.75 rc4000 code procedure, connected files page 2.5.1 ; ; ; ; now the registers contain: ; w3w0 = the actual pair of testwords ; w1 = testshifts mod 48 ; w2 = cf_buf_ref ; a0: ld w0 x1-24 ; w3w0:= 1 shift (testshifts mod 48) - 24); ; ks 4 sl w0 0 ; if signbit(w0) = 0 then jl. (j108.) ; goto end_addr_expr; ; ; call the users jump_proc: ; rl. w3 (j3.) ; load segm.3 rel; jl w3 x3+d55 ; call-jump-proc; a5: ; iclass_alarm: ; w3 = -2 illegal itype, -1 ill. length al w1 x3+32 ; alarm(30) rec.type, alarm(31) zrecsize jl. g6. ; goto alarmcall in prepare i. e. ; end return-algol; \f ; rc 28.10.74 rc4000 code procedure, connected files page 2.6 ; ; ; subroutine call_file_i(i_proc_no); ; the routine calls the file_i_proc given as parameter. ; it sets up the top 5 words of the stack, i.e. the return point and ; the zoneparam, adjusts appetite, changes zonestate before and ; after the file_i_call, and releases back to the old stack_ref. ; Note that the stack-bytes must be reserved in before-hand and evt. ; other parameters be moved and adjusted accordingly. ; call return ; w0: return segm tbl addr undef. ; w1: i_proc_no<2 result_i ; w2: cf_buf_ref cf_buf_ref ; w3: return addr undef. ; ; b. a5,c5 ; call file i: w. d36: rl. w0 j0. ; entry this segm: d37=k-j0 ; entry other segm.: ws w3 (0) ; save return_inf hs w3 x2+b1+1 ; rel. on segm. rs w0 x2+b1+2 ; segm.no. rs. w2 (j35.) ; save-cf-buf-ref-p:= cf-buf-ref ; rl w3 x2+b5 ; w3:= rec-base-addr-zb rl. w2 (j113.) ; w2:= rs-last-used rs w3 x2+8 ; formal1.2:= zone-address:= w3 ; al w0 -f28 ; file-i-zone-state:= wa w0 x3+h2+6 ; cf-zone-state - cf-increment rs w0 x3+h2+6 ; ; dl. w0 (j130.) ; w3:= rs-saved-stack-ref rl. w0 j0. ; w0:= segm-tbl-addr-this-segm ds w0 x2+2 ; store first double-word of file-i call ; ws w3 4 ; appetite:= stack-ref - last-used - 6 al w0 x3-6 ; al w3 a0 ; w3:= rel-return-this-segm hs w0 6 ; + appetite<12 ; rl. w0 c0. ; w0:= formal1.1:= zone-formal.1 ds w0 x2+6 ; store second double-word of file-i call ; jl. x1-6 ; case i_proc_no of rl. w3 (j42.) ; 2, init_rec_i j82=k+1-j0 jl x3+0 aw 0 ; 3, start_file_i, not called jl x3+0 rl. w3 (j44.) ; 4, set_read_i j84=k+1-j0 jl x3+0 rl. w3 (j45.) ; 5, set_put_i \f ; rc 28.10.74 rc4000 code procedure, connected files page 2.7 ; ; j85=k+1-j0 jl x3+0 rl. w3 (j46.) ; 6, set_update_i j86=k+1-j0 jl x3+0 rl. w3 (j47.) ; 7, get_rec_i j87=k+1-j0 jl x3+0 rl. w3 (j48.) ; 8, next_rec_i j88=k+1-j0 jl x3+0 rl. w3 (j49.) ; 9, delete_rec_i j89=k+1-j0 jl x3+0 rl. w3 (j50.) ; 10, insert_rec_i j90=k+1-j0 jl x3+0 aw 0 ; 11, put_rec_i, not called jl x3+0 rl. w3 (j54.) ; 12, get_params_i j94=k+1-j0 jl x3+0 rl. w3 (j55.) ; 13, set_params_i j95=k+1-j0 jl x3+0 a0=k-j0 ; re_entry after call of file_i: ds. w3 (j130.) ; save_stack_ref, save_w3:= w2w3 ; rl. w2 (j35.) ; fetch save-cf-buf-ref-p rl w3 x2+b5 ; w3:= rec-base-zb rl w1 x3+h2+6 ; w1:= zonestate al w1 x1+f28 ; zonestate:= i_state + cf_increment rs w1 x3+h2+6 ; rl. w1 (j52.) ; w1:= result_i rl w3 (x2+b1+2) ; w3:= segm_tbl_addr return jl x2+b1 ; goto return_int c0: 6<12 +23 ; first formal of zone parameter e. ; end call_file_i \f ; rc 20.04.79 rc4000 code procedure, connected files page 2.8 ; ; ; procedure get_m(zm,key); ; zone zm; array key; ; ; searches a record in a masterfile with a specified key and makes ; it current record. ; if the internal entry is used, the stack_top must hold correct ; return points, as exit is made through return_algol. ; w1 = a dummy_proc_no. ; ; result_cf current record ; 1 found the found ; 2 not found the successor to the specified ; 3 - - , end of file the first ; b. a5, c5 ; begin block get_m w. e16=f0-1 ; get_m: e17=k-f4 al w1 8 ; proc_no:= 8 d40: d41=k-f4 ; get_m_int: al w0 f31+f35+f37 ; statebits:= read_only_m,update_all_m, ; read_upd_m jl. w3 d0. ; goto prepare this segm. al w1 -14 ; reserve(14 bytes) jl. w3 (j103.) ; w1:= lastused:= newtop ; old_stack_top = w1 + 14 dl w0 x1+14+12 ; move formals.2 ds w0 x1+12 al w1 7<2 ; goto call_file_i(get_rec_i) this segm. jl. w3 d36. rs. w1 (j34.) jl. w3 d6. ; goto set_rec_pointers this segm. jl. d16. ; goto return_algol this segm. i. e. ; end get_m \f ; rc 28.06.71 rc4000 code procedure, connected files page 2.9 ; ; ; procedure next_m(zm); ; zone zm; ; ; makes the next record in a masterfile current record. ; result_cf current record ; 1 found the next ; 2 found, end of file the first ; b. a5, e5 ; begin block next_m w. e34=f0-1 ; next_m: e35=k-f4 al w1 17 ; proc_no:= 17 al w0 f31+f35+f37 ; statebits:= read_only_m, update_all_m, ; read_upd_m jl. w3 d0. ; goto prepare this segm. rl w0 x2+b6 ; sz w0 3 ; if modebits_zb extract 2 = 0 then jl. a0. rl w1 x2+b5 ; w1:= rec_base_addr_zb al w0 f34 rs w0 x1+h2+6 ; zonestate_zd:= read_upd_m a0: al w1 -10 ; reserve(10 bytes) jl. w3 (j103.) ; w1:= lastused:= newtop al w1 8<2 jl. w3 d36. ; goto call_file_i(next_rec_i) this segm. rs. w1 (j34.) ; result_cf:= result_i rl w0 x2+b6 ; sz w0 3 ; if modebits_zb extract 2 = 0 then jl. a1. rl w1 x2+b5 al w0 f30 rs w0 x1+h2+6 ; zonestate_zd:= read_only_m a1: jl. w3 d6. ; goto set_rec_pointers this segm. jl. d16. ; goto return_algol this segm. m.nextm i. e. ; end next_m \f ; rc 27.07.76 rc4000 code procedure, connected files page 2.10 ; ; ; subroutine put_cf_int ; ; sets a write_operation into the share used for the current block. ; if the file is a listfile, the share will be last_used_share else ; last_share. ; call return (simple) ; w0: undef. undef. ; w1: undef. undef. ; w2: cf_buf_ref cf_buf_ref ; w3: return addr undef. ; b. a5, c5 ; begin block put_cf_int w. d32: d33=k-f4 al w0 f5 ; w0:= write_operation rl w1 x2+b15 ; if file_type_zb = 0 then sz w1 1 jl. a0. ; masterfile: rl w1 x2+b5 ; w1:= rec_base_addr_zb (z+h3+0) rl w1 x1+h0+8 ; w1:= addr_of_last_share hs w0 x1+6 ; sd(last_share,oper):= write jl x3 ; return a0: ; listfile: am (x2+b5) ; rl w1 +4 ; w1:= rec_size_zd sl w1 1 ; if rec_size_zd >= 1 then hs w0 (x2+b63) ; sd(last_used_share,oper):= write jl x3 ; return e. ; end put_cf_int ; procedure put_cf(zm); ; zone zm; ; ; ensures that the current record will be transferred to the file. ; result_cf current record ; 1 ok unchanged ; b. ; begin block put_cf w.e36=f0-1 e37=k-f4 al w0 f35+f37+f45+f47 ; statebit:= update_all_m,read_upd_m, al w1 18 ; read_upd_l,update_all_l;proc_no:= 18 jl. w3 d0. ; goto prepare this segm. jl. w3 d32. ; goto put_cf_int - - jl. d16. ; goto return_algol - - m.putcf e. ; end put_cf \f ; rc 28.06.71 rc4000 code procedure, connected files page 2.11 ; ; g3=k-j0 c. g3-506 m. code on segment 2 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system 2:> m. segment 2 i. e. \f ; rc 28.10.74 rc4000 code procedure connected files page 3.1 ; ; this segment contains. ; insert-m ; init-rec-m ; get-head ; call-jump-proc ; b. g10, j150 ; code segment 3: f0=f0+1 ; increase segm.count k=f4 h. j0: g1, g2 ; headword: last point, last absword j1: 1<11 o.(:1-f0:), 0 ; ref. to segm.1 j2: 1<11 o.(:2-f0:), 0 ; ref. to segm.2 j5: 1<11 o.(:5-f0:), 0 ; ref. to segm.5 j31: 0 , 21 ; own core byte 20-21, work_1_p j32: 0 , 23 ; own core byte 22-23, work_2_p j33: 0 , 25 ; own core byte 24-25, proc_no_p j34: 0 , 27 ; own core byte 26-27, result_cf j103: f1+3 , 0 ; rs reserve j105: f1+5 , 0 ; rs goto point j108: f1+8 , 0 ; rs end address expression j113: f1+13, 0 ; rs last used j130: f1+30, 0 ; rs saved stack ref, saved w3 g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. \f ; rc 11.12.74 rc4000 code procedure, connected files page 3.2 ; ; ; procedure insert_m(zm,record); ; procedure init_rec_m(zm,record); ; zone zm; array record; ; ; the procedures are placed in one block, as the treatment of formal 2 ; is the same. ; ; insert_m-specification: ; inserts a new record in an existing masterfile. ; result_cf current record ; 1 record inserted the inserted ; 2 not inserted, already in file the one in the file ; 3 - - , too expensive next higher record ; 4 - - , file is full - - - ; 5 - - , length error - - - ; 6 - - , no buffer - - - ; ; init_rec_m-specification: ; adds records to the m_file in the in the key-order. ; result_cf current record ; 1 record added none ; 2 not added, file is full - ; 3 - - , improper length - ; 4 - - , - key - ; b. a20, c10 ; begin block w. e22=f0-1 ; insert_m: e23=k-f4 al w0 f35+f37 ; statebits:= update_all_m and read_upd_m al w1 11 ; proc_no:= 11 rl. w3 (j2.) ; prepare(state-bits) jl w3 x3+d1 ; jl. a0. e56=f0-1 ; init_rec_m: e57=k-f4 al w0 f39 ; statebits:= init_m al w1 28 ; proc_no:= 28 rl. w3 (j2.) ; prepare(statebits) jl w3 x3+d1 ; w2:= cf_buf_ref upon return ; w3:= stack_ref - - ; a0: ; treat-record-array: dl w1 x3+12 ; w1:= dope-address rl w3 x1 ; w3:= array-base ba w1 0 ; dl w1 x1 ; w0, w1:= ba. w0 1 ; upper + 1, lower-k sh w1 0 ; if lower-k > 0 or sh w0 (x2+b12) ; upper + 1 <= min_rec_size_zb then jl. a10. ; goto alarm(array p) \f ; rc 28.06.71 rc4000 code procedure, connected files page 3.3 ; ; ; wa w3 x2+b11 ; w3:= abs-length-position:= ; array-base + rec-length-pos-zb ; am (x2+b10) ; case rec-length-type-zb of jl. a1. ; begin a1: jl. a3. ; 0: fixed 0 0 ; bl w1 x3 ; 6: byte rs. w1 (j31.) ; save user-size for later restauration jl. a11. ; ; rl w1 x3 ; 12: word rs. w1 (j31.) ; jl. a11. ; ; rl w1 x3 ; 18: double-word rs. w1 (j31.) ; jl. a11. ; ; dl w1 x3 ; 24: real ds. w1 (j31.) ; cf w1 0 ; a11: ; end case rec-length-type-zb ; rs. w3 (j32.) ; work-2-p:= save-abs-length-position ; ; snapshot ; w1 user-part-size ; work-0-p, work-1-p save-significant-part-of-user-array ; w3 = work-2-p abs-address-of-this-part ; al w1 x1+3 ; add 3 to user-part-size; (start round up) sl w1 (x2+b12) ; if user-part-size >= min-rec-size-zb wa w1 x2+b9 ; then add ch-part-size-zb ; this will ensure a length-error from ; insert-rec-i in the case: ; user-part-size < min-rec-size <= ; user-part-size + chain-part-size ; ; rec-length:= rec-size//4; because as w1 -2 ; file-i measures length in zone-elements ; am (x2+b10) ; case rec-length-type-zb of jl. a2. ; begin a2=k-6 hs w1 x3 ; 6: byte jl. a3. ; 0 ; rs w1 x3 ; 12: word jl. a3. ; 0 \f ; rc 20.04.79 rc4000 code procedure, connected files page 3.4 ; ; ; rs w1 x3 ; 18: double-word jl. a3. ; 0 ; ci w1 0 ; 24: real ds w1 x3 ; ; ; end case rec-length-type-zb a3: al w1 -14 ; ready for file_i: reserve(14 bytes) jl. w3 (j103.) ; w1:= lastused:= newtop ; old_stack_ref = w1 + 14 dl w0 x1+14+12 ; move formals.2 ds w0 x1+12 rl. w1 (j33.) ; w1:= proc_no_p sn w1 11 ; skip if not insert_m am 8<2 ; al w1 2<2 ; w1:= proc_no_i shift 2 rl. w0 j0. ; w0:= return segm. rl. w3 (j2.) ; jl w3 x3+d37 ; goto call_file_i(proc_no_i) rs. w1 (j34.) ; result_cf:= result_i:= w1 rl. w0 (j33.) se w0 11 ; skip if insert_m jl. a6. ; goto spec. init_rec_m \f ; rc 18.10.78 rc4000 code procedure, connected files page 3.4.1 ; spec. insert_m rl. w3 (j2.) ; set_rec_pointers; jl w3 x3+d7 rl. w1 (j34.) ; w1:= result-cf se w1 1 ; if record not inserted then goto finis jl. a8. ; put 0 in chainfields (insert) al w0 0 ; w0:= 0; rl w1 x2+b8 ; w1:= w3:= chain_part_base_zb al w3 x1 wa w3 x2+b9 ; addr:= w3:= w3 +chain_part_size_zb a4: sh w3 x1 ; if addr = chain_part_base_zb then jl. a5. ; end loop rs w0 x3 ; w(addr):= 0 al w3 x3-2 ; addr:= addr -2 jl. a4. ; a5: rl w0 x2+b6 ; test zonestate = read_upd_m: so w0 1 ; if mode_bits_zb extract 1 = 1 then jl. a8. ; rl. w3 (j2.) ; put_cf_int jl w3 x3+d33 ; jl. a8. ; goto finis ; ; spec. init_rec_m a6: se w1 1 ; if record not added then goto finis jl. a8. ; ; rl w3 x2+b5 ; i-buf-ref:= base-buffer-area rl w3 x3+h0+0 wa w3 x3+1 ; +i_buf_ref_rel rl w0 x3+f50 ; w0:= recbase:= base_of_next_free_i ws w0 x3+f55 ; - entrysize(recs)_i; rs w0 (x2+b5) ; recbase_zd:= w0 rl w0 x3+f55 ; w0:= entrysize(recs)_i ws w0 x2+b9 ; - chain_part_size_zb am (x2+b5) ; rs w0 +4 ; recsize_zd:= w0 rl w3 x3+f50 ; w3:= base_of_next_free_i \f ; rc 20.04.79 rc4000 code procedure, connected files page 3.5 ; ; ; put 0 in chainfields (init) al w0 0 ; w0:= 0; al w1 x3 ; addr:= w3; w1:= w3 ws w1 x2+b9 ; w1:= chain_part_base:= w1-chainpartsize_zb a7: sh w3 x1 ; if addr = chain_part_base then jl. a8. ; goto finis; rs w0 x3 ; w(addr):= 0 al w3 x3-2 ; addr:= addr -2 jl. a7. a8: ; finis: ; if variable length then restore length in formal 2 rl. w3 (j32.) ; w3:= save-abs-length-position ; am (x2+b10) ; case rec-length-type-zb of jl. a9. ; begin a9: ; return: rl. w3 (j2.) ; 0: fixed jl x3+d17 ; return-algol 0 ; rl. w1 (j31.) ; 6: byte hs w1 x3 ; jl. a9. ; ; rl. w1 (j31.) ; 12: word rs w1 x3 ; jl. a9. ; ; rl. w1 (j31.) ; 18: double-word rs w1 x3 ; jl. a9. ; ; dl. w1 (j31.) ; 24: real ds w1 x3 ; jl. a9. ; ; ; end case rec-length-type-zb ; a10: al w1 13 ; rl. w3 (j1.) ; goto alarm(13) jl w3 x3+d35 ; i. ; e. ; end block init_, insert_ \f ; rc 26.09.72 rc4000 code procedure, connected files page 3.6 ; ; ; get-head(zl, chain, key). ; ; file-cf procedure. ; ; the procedure is used on current record of a list-file to return the ; key of the mother-record of a chain to which the record is connected. ; ; result-cf current record ; 1 ok unchanged ; 2 record not connected unchanged ; b. a40, c10 ; begin get-head w. e20=f0-1 e21=k-j0 al w1 10 ; proc-no:= 10 al w0 f43+f45+f47 ; prepare(read-only-l, read-update-l, rl. w3 (j2.) ; update-all-l) jl w3 x3+d1 ; ; rl w3 x2+b5 ; rl w3 x3+4 ; sh w3 0 ; if rec-size-zd = 0 then jl. a14. ; goto alarm(no.curr.) ; al w0 12+0 ; check-chain(param-2, daughter) rl. w3 (j5.) ; jl w3 x3+d5 ; ; rl w0 x1+10 ; if head-fld-size-tbl = 0 then sh w0 0 ; goto alarm(chain.not.headed) jl. a20. ; ; rl w3 x2+b8 ; w3:= addr-of-next-chfld wa w3 x1+4 ; ; rl w0 x3 ; if next-chfld = not-connected then sn. w0 (c0.) ; goto result-2 jl. a10. ; ; ds. w3 c2. ; save original cf-buf-ref ; save-base-1:= addr-of-next-chfld rl w2 x1+2 ; cf-buf-ref:= m-cf-buf-ref-tbl ; rl. w3 (j113.) ; take key-array, obs. rs last-used..... dl w1 x3+16 ; rl w3 x1 ; w3:= addr-of-element-0 ba w1 0 ; w1:= dope-addr dl w1 x1 ; w0, w1:= upper, lower-k sl w1 1 ; if lower-k > 0 then jl. a13. ; alarm(array p) ; w0 is checked later (size) ; rl w1 x2+b15 ; sz w1 1 ; if file-type = list (1) then jl. a1. ; goto list-file ; \f ; rc 28.06.71 rc4000 code procedure, connected files page 3.7 ; ; ; master-file. ; rl w1 x2+b12 ; sh w0 x1-1 ; if size-of-array < min-rec-size-zb jl. a13. ; then goto alarm(array p) ; rl w1 x2+b7 ; w1:= split-key-code-zb al. w0 a2. ; store return-address rs w0 x1-2 ; rl. w2 c2. ; w2:= save-base-1 ; ; obs. w3 = base-2 = base-of-array-key ; jl x1 ; split-key-code ; ; split-key-code returns to a2 ; ; a1: ; list-file. ; sh w0 3 ; if size < 4 then jl. a13. ; goto alarm(array p) ; al w0 0 ; rl. w1 c2. ; w1:= save-base-1 rl w1 x1+1 ; double-word(base-2 + 3):= ds w1 x3+3 ; 0, word(base-1 + 1) ; a2: ; return: rl. w2 c1. ; fetch original cf-buf-ref ; a3: ; return(from result-2): rl. w3 (j2.) ; jl x3+d17 ; return algol ; a10: ; result-2: al w0 2 ; result-cf:= 2 rs. w0 (j34.) ; jl. a3. ; goto return(from result-2) ; a13: am 13-14 ; alarm(array p): a14: am 14-20 ; alarm(no.curr.): a20: al w1 20 ; alarm(chain not headed): rl. w3 (j1.) ; jl w3 x3+d35 ; alarm ; c0: f8 ; not connected c1: 0 ; save original cf-buf-ref c2: 0 ; save base-1 i. e. ; end get-head \f ; rc 01.11.74 rc4000 code procedure, connected files page 3.8 ; ; ; call jump-proc: ; ; a new stack picture is set up with the zone and cf-proc-no-p as ; parameters, and the jump-proc is called. ; because of fortran, the jump proc must return to this point, else ; the reserved bytes would not be released correctly. ; b. a10, c10 w. d54: d55=k-f4 ; call jump-proc: rl. w2 (j113.) ; w2:= last used; al w1 -16 ; reserve 16 bytes and jl. w3 (j103.) ; set up call of jump-proc: ; ks 11 rs w2 x1 ; stack-ref rl. w3 j0. ; segm.table addr. and al w0 a1 ; rel. return addr. ds w0 x1+4 ; ; ks 12 al w0 10 ; appetite:= 10; hs w0 x1+4 ; rl. w3 c1. ; new formal 1.1:= zone-kind; rl w0 x2+8 ; new formal 1.2:= old formal 1.2; ds w0 x1+8 ; (rec-base-addr) ; ks 13 al w3 26 ; new formal 2.1:= integer kind; al w0 x2-1 ; new formal 2.2:= addr. of cf-proc-no; ds w0 x1+12 ; ; ks 14 rl. w0 (j33.) ; store cf-proc-no-p as litteral; rs w0 x2-1 ; ; ks 15 rl w2 x2+6 ; w2:= cf-buf-ref; dl w1 x2+b4+2 ; w0w1:= stackref, entry-point of jump-proc; jl. (j105.) ; call jump proc; comment goto point; a1=k-j0 ; re_entry after call of jump-proc: ds. w3 (j130.) ; save stackref, w3; jl. (j108.) ; goto end-address-expression; ; c1: 6<12 + 23 ; first formal of zone-parameter; i. e. ; end call-jump-proc; g3=k-j0 c. g3-506 m. code on segment 3 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system 3:> m. segment 3 i. e. \f ; rc 10.09.79 rc4000 code procedure, connected files page 4.1 ; ; this segment contains: ; get-block-r and get-block-b ; get-rec-n and get-rec-n-int ; get-numb-l ; b. g3, j185 ; code segment 4 w. f0=f0+1 ; increase segm.count k=f4 ; k:= first k-value h. j0: g1, g2 ; head-word: last point, last abs word j1: 1<11 o.(:1-f0:), 0 ; ref. to segm.1 j2: 1<11 o.(:2-f0:), 0 ; ref. to segm.2 j21: 0 , 1 ; own core, return-1-p j22: 0 , 3 ; own core, return-1-p j23: 0 , 5 ; own core, return-2-p j24: 0 , 7 ; own core, return-2-p j26: 0 , 11 ; own core, rec-no-cf j34: 0 , 27 ; own core, result-cf j35: 0 , 29 ; own core, save-cf-buf-ref-p j104: f1 + 4, 0 ; rs, take expression j130: f1 +30, 0 ; rs, saved stackref, saved w3 j185: f1 +85, 0 ; rs, current activity g2=k-2-j0 ; rel last abs word ; j133: f1 +33, 0 ; rs, check g1=k-2-j0 ; rel last point w. ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 4.2 ; get-block-r and get-block-b ; ; file-n subroutine ; ; these are the basic list-file administration routines, used each ; time a certain record or block is wanted. ; the block-fetching routine updates the sorted list of block-shares, ; and initiates the transfer back to the file of a new victim provided ; that at least 3 block-shares are available. ; ; if save-rec-no-zb <> 0, i.e. a current record exists internally, the ; administrative double-word in current record is restored if variable ; record-length, the last used block is put if update-all-mode, and ; save-rec-no-zb is set to zero. ; ; entry exit ; w0 return-segm-tbl-addr undef ; w1 rec-no or block-no undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-addr undef ; ; return quantities: ; block-ref-zb points to the first byte of the record-table ; of the wanted block. ; rec-no-rel-zb is returned by get-block-r, gives the ; address of the entry in the record-table ; corresponding to the record-number given as ; parameter, relative to block-ref-zb. ; block-zb the number of the block fetced. ; ; b. a20, c20 ; begin get-block-r and get-block-b w. d72: rl. w0 j0. ; get-block-r: d73=k-j0 ; ws w3 (0) ; save return in return-2-p hs. w3 (j23.) ; rs. w0 (j24.) ; ; al w0 0 ; calculate block-zb and rec-no-rel-zb al w1 x1-1 ; (rec-no - 1)//recs-in-block-zb wd w1 x2+b54 ; rs w0 x2+b58 ; store rec-no-rel-zb = division-rest jl. a0. ; goto common-code ; d74: rl. w0 j0. ; get-block-b: d75=k-j0 ; ws w3 (0) ; save return in return-2-p hs. w3 (j23.) ; rs. w0 (j24.) ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 4.3 a0: ; common-code: ; dl w0 x2+b51 ; w3, w0:= save-size-zb, save-rec-no-zb sn w0 0 ; if no-current-record then jl. a10. ; goto continue ; sn w3 (x2+b56) ; if fixed-rec-length then jl. a9. ; goto reset-save-rec-no-zb (save-size-zb ; = fix-rec-size-zb only in this case) am (x2+b5) ; restore administrative double-word at am (0) ; record-base + 3 ds w0 +3 ; ; a9: ; reset-save-rec-no-zb: al w0 0 ; rs w0 x2+b51 ; ; al w0 f5 ; rl w3 x2+b6 ; sn w3 2 ; if mode-zb = update-all then hs w0 (x2+b63) ; put-block ; a10: ; continue: ; w1 = block-no rs w1 x2+b64 ; store block-no in block-zb rs. w2 (j35.) ; save cf-buf-ref in permanent ; wm w1 x2+b53 ; use block-ref-zb for searched-segm-no:= wa w1 x2+b52 ; block-zb * segs-in-block-zb rs w1 x2+b57 ; + segs-in-head-zb ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 4.4 ; search-share ; ; this is a makro which searches for the segment-number of the wanted ; block through the list of block-shares. ; while searching the list is pushed one word forward, so that the ; address of the found share can be inserted as last-used-share-zb. ; ; entry ; w0 undef ; w1 searched-segm-no ; w2 cf-buf-ref ; w3 undef ; ; the makro makes use of the slang-names: ; a1 to a3, and c0 to c1 ; rl w3 (x2+b61) ; insert searched-segm-no in victim-share, rl w0 x3+6 ; and save the addr of the victim-share and ds. w0 c1. ; the segm-no of the victim-share. rs w1 x3+6 ; this will ensure a successfull search ; in any case. ; ; registers for search and push ; w0 searched-segm-no ; w1 share-addr ; w2 cf-buf-ref ; w3 list-addr ; al w0 x1 ; searched-segm-no rl w1 x2+b63 ; share-addr of last-used-share ; sn w0 (x1+6) ; if segm-no(last-used-share) = searched- jl. a2. ; segm-no then goto found-in-last-used ; al w3 x2+b63 ; list-addr of last-used-share ; a1: ; search-and-push: rx w1 x3+2 ; 1, push share-list one word, and fetch sn w0 (x1+6) ; next share-addr, if this share contains jl. a3. ; searched-segm-no then goto found-elsewhere ; rx w1 x3+4 ; 2. sn w0 (x1+6) ; jl. a3. ; ; rx w1 x3+6 ; 3. sn w0 (x1+6) ; jl. a3. ; ; rx w1 x3+8 ; 4. sn w0 (x1+6) ; jl. a3. ; ; rx w1 x3+10 ; 5. sn w0 (x1+6) ; jl. a3. ; ; al w3 x3+10 ; not found in this game jl. a1. ; goto search-and-push \f ; rc 02.08.72 rc4000 code procedure, connected files page 4.5 ; constants c0: 0 ; save victim-share-addr c1: 0 ; save segm-no(victim) ; a3: ; found-elsewhere: rs w1 x2+b63 ; last-used-share-zb:= addr-of-found-share ; a2: ; found-in-last-used: dl. w0 c1. ; restore segm-no of old victim-share rx w0 x3+6 ; ; ; registers ; w0 searched-segm-no ; w1 addr-of-last-used-share ; w2 cf-buf-ref ; w3 undef ; ; end search share makro ; ; insert last-used-share as used-share in the zone-descriptor ; al w3 x1-6 ; obs. an address in the share-list points am (x2+b5) ; to the message of the share-descriptor rs w3 h0+4 ; ; ; if the found share is unchecked then check it ; rl w3 x1-6 ; if share-state(last-used-share) = 0 then sn w3 0 ; jl. a5. ; goto check-segm-no ; a4: ; check-transfer: ;ks 400 ; call rs-check rl w0 x2+b5 ; w0:= zone-descriptor-addr shift 4 ls w0 4 ; rl. w1 j133. ; w1:= entry point check dl. w3 (j130.) ; w2:= saved-stack-ref jl. w3 (j104.) ; goto rs-take-expression ds. w3 (j130.) ; save stack-ref ; rl. w2 (j35.) ; fetch cf-buf-ref rl w1 x2+b63 ; last-used-share-zb al w0 f6 ; hs w0 x1 ; operation(last-used-share):= read-oper rl w0 x2+b57 ; w0:= searched-segm-no:= (block-ref-zb) ; \f ; rc 10.09.79 rc4000 code procedure, connected files page 4.6 a5: ; check-segm-no: ; check that last-used-share contains the right block ; ; registers ; w0 searched-segm-no ; w1 last-used-share ; w2 cf-buf-ref ; w3 undef ; sn w0 (x1+6) ; if right segm-no then jl. a6. ; goto set-block-ref ; ; now it is evident that a transfer must be initiated, but perhaps the ; block must be written back in the first place bz w3 x1 ; w3:= operation(last-used-share) sn w3 f6 ; if operation = read-oper then rs w0 x1+6 ; segm-no(last-used-share):= ; searched-segm-no ; ; now the transfer will be initiated by a call of send message. ; w1 points already to the message, w3 should point to the name ; of the area process. rl w3 x2+b5 ; al w3 x3+h1+2 ; rl. w2 (j185.) ; w2:= rs_current_activity jd 1<11+16 ; send message ; ; if no message buffer available (w2=0) then provoke break 6 by wait answer sn w2 0 ; jd 1<11+18 ; wait-answer ; rs w2 x1-6 ; share-state:= w2:= buffer-address rl. w2 (j35.) ; fetch cf-buf-ref jl. a4. ; goto check-transfer ; a6: ; set-block-ref: ; now the searched-segm-no saved in block-ref-zb is superfluous, and ; block-ref can be set. rl w1 x1+2 ; block-ref-zb:= first-storage-address al w1 x1-f20 ; (last-used-share) - f20 rs w1 x2+b57 ; ; \f ; rc 18.10.79 rc4000 code procedure, connected files page 4.7 ; if more than 2 block-shares are available the transfer of an ; updated victim is initiated now, provided that the transfer is ; not already initiated. rl w1 x2+b61 ; if victim-zb <= addr last-used-zb + 2 sh w1 x2+b63+2 ; then jl. a7. ; goto return ; rl w1 x1 ; w1:= share-addr(victim) bz w0 x1 ; sn w0 f5 ; if operation<>write-oper sh w0 (x1-6) ; or f5<share-state (f5=5) then jl. a7. ; goto return ; ; initiate transfer of victim by send-message rl w3 x2+b5 ; al w3 x3+h1+2 ; rl. w2 (j185.) ; w2 := rs_current_activity jd 1<11+16 ; send message ; ; no message buffer available (w2=0) is ignored, share-state will ; still be 0 in that case, and it is in fact very unlikely that the ; process should have lost a message buffer since input of the wanted ; block. rs w2 x1-6 ; share-state:= w2:= buffer-address rl. w2 (j35.) ; fetch cf-buf-ref ; a7: ; return: rl. w3 (j24.) ; return-2-p rl w3 x3 ; jl. (j23.) ; ; i. e. ; end get-block-r and get-block-b ; ; ; ; \f ; rc 01.11.77 rc4000 code procedure, connected files page 4.8 ; get-rec-n ; ; file-n procedure ; ; the procedure fetches the record given by rec-no-cf, provided that ; it is a legal record-number describing a used record. ; chain-part-base-zb, rec-base-zd, rec-size-zd, and the length-field of ; a variable length record are set. ; ; entry exit ; w0 return-segm-tbl-addr undef ; w1 undef undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; call quantities: ; rec-no-cf specifies the wanted record ; ; alarms: 19, 22, 37. ; b. a37, c20 ; begin get-rec-n w. d62: rl. w0 j0. ; d63=k-j0 ; ws w3 (0) ; save-return-1-p hs. w3 (j21.) ; rs. w0 (j22.) ; d89=k-j0 ; get-rec-n-int: (called from set-mode-n) rl. w1 (j26.) ; w1:= rec-no-cf sh w1 (x2+b60) ; if rec-no>last-rec-no-zb sh w1 0 ; or rec-no<=0 then jl. a19. ; goto alarm(ill. rec-no) ; jl. w3 d72. ; get-block-r(rec-no), on this segment ; d92: ; entry from get_numb_l rl w3 x2+b57 ; w3:= block-ref-zb am (x2+b58) ; rec-base-rel:= bz w0 x3 ; halfword(block-ref-zb + rec-no-rel-zb) so w0 1 ; if used-bit = 0 then jl. a22. ; goto alarm(rec-not-used) ; wa w3 0 ; w3:= rec-base:= block-ref + rec-base-rel rl. w1 (j26.) ; w1:= rec-no-cf ; rl w0 x2+b56 ; se w0 0 ; if fix-rec-size-zb <> 0 then jl. a0. ; goto fix-rec-size ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 4.9 ; variable rec-size se w1 (x3+3) ; if rec-no-cf <> rec-no(record) then jl. a37. ; goto alarm(wrong rec-no-rec) ; rl w0 x3+1 ; load size(record) in w0 ds w1 x2+b51 ; save-size-zb, save-rec-no-zb:= w0, w1 ; ws w0 x2+b9 ; size:= size(record) - ch-part-size-zb rs w0 x3+1 ; size(record):= size jl. a1. ; goto set-pointers ; a0: ; fix-rec-size. rs w1 x2+b51 ; save-rec-no-zb:= rec-no-cf ws w0 x2+b9 ; size:= fix-rec-size-zb - ch-part-size-zb a1: ; set-pointers: rl w1 x2+b5 ; w1:= rec-base-addr-zb rs w3 x1 ; rec-base-zd:= rec-base rs w0 x1+4 ; rec-sise-zd:= size wa w3 0 ; ch-part-base-zb:= rs w3 x2+b8 ; rec-base + size ; return. rl. w3 (j22.) ; return-1-p rl w3 x3 ; jl. (j21.) ; ; ; alarms: a19: am 19-22 ; alarm(ill. rec-no) a22: am 22-37 ; alarm(rec-not-used) a37: al w1 37 ; alarm(wrong rec-no-rec) rl. w3 (j1.) ; jl w3 x3+d35 ; alarm(alarm-no) i. e. ; end get-rec-n ; \f ; rc 01.11.77 rc4000 code procedure, connected files page 4.10 ; get-numb-l(zl, rec-no) ; ; file-cf procedure ; ; makes the list-file record given by recno available as current record, ; provided the recno is legal and the record is not dead. ; ; result-cf current record ; 1 record active the wanted ; 2 record not found the rec. with next higher no. ; 3 no more recs. none ; b. a19, c10 ; begin get-numb-l w. e46=f0-1 e47=k-j0 al w1 23 ; proc-no:= 23 al w0 f43+f45+f47 ; prepare(read-only-l, read-update-l, rl. w3 (j2.) ; update-all-l) jl w3 x3+d1 ; ; dl w1 x3+12 ; take param 2 so w0 16 ; if expression then jl. a10. ; goto take-expression ; a0: ; take-value: rl w1 x1 ; get parameter=rec_no rs. w1 (j26.) ; rec_no_cf := rec_no sh w1 0 ; if rec_no <= 0 jl. a19. ; then alarm(ill. rec_no) ; while rec_no_cf <= last_rec_no_zb search blocks a1: am (x2+b60) ; if rec_no > last_rec_no sl w1 +1 ; jl. a4. ; then result_3 jl. w3 d72. ; else get_block_r(rec_no) ; prepare calc. of position of next_chfld ; c0 := chain_part_size - chfld_rel_tbl rl w3 x2+b17 ; w3 := first_d_ch_addr_zb rl w0 x2+b9 ; chain_part_size ws w0 x3+4 ; -chfld_rel_tbl rs. w0 c0. ; ; rl w3 x2+b58 ; rec_no_rel_zb ; while rec_no_rel <= recs_in_block search halfwords a2: am (x2+b57) ; add block_ref bz w1 x3 ; to get halfword so w1 1 ; if not_used jl. a3. ; then next halfword ; else check dead or alive wa w1 x2+b57 ; rec_base := block_ref + rec_base_rel rl w0 x2+b56 ; if fix_rec_size_zb = 0 sn w0 0 ; rl w0 x1+1 ; then get var_size \f ; rc 18.10.78 rc4000 code procedure, connected files page 4.10.1 ; ; a:next_chfld := size-(chain_part_size - chfld_rel_tbl) + rec_base ws. w0 c0. ; -(chain_part_size - chfld_rel_tbl) wa w1 0 ; + rec_base rl w0 x1 ; w0 := c:next_chfld sl w0 0 ; if >= 0 jl. a5. ; then found (not dead) ; else next rec_no a3: al w1 1 ; rec_no_cf := wa. w1 (j26.) ; rec_no_cf +1 rs. w1 (j26.) ; al w0 2 ; result_cf := 2 rs. w0 (j34.) ; al w3 x3+1 ; adj. for next halfword sl w3 (x2+b54) ; if rec_no_rel >= recs_in_block jl. a1. ; then next block jl. a2. ; else continue (inner while) ; ; result_3 a4: al w0 3 ; rec_no > last_rec_no rs. w0 (j34.) ; result_cf := 3 al w0 0 ; rec_size_zd := 0 rl w1 x2+b5 ; rs w0 x1+4 ; rl. w3 (j2.) ; return_algol jl x3+d17 ; ; ; found (wanted or next higher) ; return_algol via last part of get_rec_n a5: rs w3 x2+b58 ; update rec_no_rel_zb rl. w0 j2. ; segm. 2 rs. w0 (j22.) ; al w0 d17 ; return_algol hs. w0 (j21.) ; jl. d92. ; go get_rec_n ; a10: ; take-expression: al w2 x3 ; w2:= stack-ref jl. w3 (j104.) ; goto rs-take-expression ds. w3 (j130.) ; save stack-ref rl w2 x2+6 ; cf_bufref:= formal.1.1 jl. a0. ; goto take-value ; alarms a19: al w1 19 ; alarm(ill. rec_no) rl. w3 (j1.) ; jl w3 x3+d35 ; ; c0: 0 ; temp: chain_part_size - chfld_rel_tbl \f ; rc 02.08.72 rc4000 code procedure, connected files page 4.11 i. e. ; end get-numb-l g3=k-j0 c. g3-506 m. code on segment 4 too long z. c. 502-g3 0, r. 252-g3>1 ; zero fill z. <:cf-system 4:> i. e. m. end segment 4 \f ; rc 03.05.71 rc4000 code procedure, connected files page 5.1 ; ; this segment contains. ; check-chain ; set-free-n ; log-func - log-func-r ; move-word - move-double ; compare ; new-head-chain ; b. g3, j150 ; code segment 5 f0=f0+1 ; increase segm.count k=f4 ; k:= first k-value h. j0: g1, g2 ; head-word: last point, last abs word j1: 1<11 o.(:1-f0:), 0 ; ref. to segm. 1 j32: 0 , 23 ; own core, work-2-p j130: f1 +30, 0 ; rs, saved stackref, saved w3 g2=k-2-j0 ; rel last abs word g1=k-2-j0 ; rel last point w. ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.2 ; check-chain ; ; file-cf subroutine ; ; takes the chain-parameter indicated by the parameter, and performs ; the following checks: ; ; 1: the parameter must not be an expression. ; ; 2: chain address for this zone greater or equal to address of ; first mother chain and less than cf-buf-ref ; ; 3: other-ch-addr(chain-param) = other-ch-addr-tbl and ; other-ch-addr(chain-param) > address of formal. ; ; if 2 is fulfilled, but 3 not, it is checked whether ; word(chain-addr) = word(chain-addr + 2) = -1, in that case, the ; alarm 16, chain not initialized, will be given. ; ; entry exit ; w0 formal-rel + mother-bit undef ; w1 undef chain-addr ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; call quantities: ; formal-rel 8 chain is parameter no. 1 ; 12 chain is parameter no. 2, etc. ; mother-bit 0 this zone is daughter ; 1 this zone is mother ; ; return quantities: ; curr-d-ch-zb chain-addr (if mother-bit = 0) ; curr-m-ch-zb chain-addr (if mother-bit = 1) ; ; alarms: 15, 16, 36. ; b. a36, c10 ; begin check-chain w. d4: d5=k-j0 ; rs. w3 c0. ; save return am. (j130.) ; rl w3 -2 ; w3:= saved stackref ; wa w3 0 ; w3:= formal-2-addr + mother-bit dl w1 x3 ; w0, w1:= formals so w0 16 ; if expression then jl. a36. ; goto alarm(express.) ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.3 so w3 1 ; if mother-bit then jl. a0. ; begin rl w0 x1 ; other-ch-addr-param:= second-word rl w1 x1-2 ; chain-addr:= first-word rs w1 x2+b19 ; curr-m-ch-zb:= chain-addr jl. a1. ; end ; else a0: ; begin dl w1 x1 ; other-ch-addr-param:= first-word ; chain-addr:= second-word rs w1 x2+b20 ; curr-d-ch-zb:= chain-addr a1: ; end ; w0 = other-ch-addr-param ; w1 = chain-addr sl w1 (x2+b16) ; if chain-addr < first-m-ch-addr-zb sl w1 x2 ; or chain-addr >= cf-buf-ref then jl. a15. ; goto alarm(chain-p) ; sn w0 (x1) ; if other-ch-addr-param <> other-ch-addr- ; tbl sh w0 x3 ; or other-ch-addr-param <= addr-of-formal jl. a3. ; then goto check-not-init ; jl. (c0.) ; goto return ; a15: am 15-16 ; alarm(chain-p): a16: am 16-36 ; alarm(not-init): a36: al w1 36 ; alarm(express.): rl. w3 (j1.) ; jl w3 x3+d35 ; alarm ; a3: ; check-not-init: rl w0 x1 ; w0:= other-ch-addr-tbl sn w0 -1 ; if other-ch-addr-tbl <> -1 se w0 (x1+2) ; or other-ch-addr-tbl <> other-cf-buf- ; ref-tbl then jl. a15. ; goto alarm(chain-p) jl. a16. ; else goto alarm(not-init) ; c0: 0 ; save-return i. e. ; end check-chain ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.4 ; set-free-n ; ; file-n procedure ; ; the procedure releases the current list-file record, and adjusts the ; various counters, but it does not access any new record. ; ; entry exit ; w0 undef undef ; w1 undef undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; b. a10, c10 ; begin set-free-n w. d64: d65=k-j0 rs. w3 c2. ; save return ; rl w3 x2+b57 ; subtract used-bit from wa w3 x2+b58 ; byte(block-ref-zb + rec-no-rel-zb) bz w1 x3 ; = rec-base-rel(current record) al w1 x1-1 ; hs w1 x3 ; ; rl w3 x2+b57 ; w3:= block-ref-zb bz w1 x3+f21 ; free-rec-nos:= al w1 x1+1 ; free-rec-nos + 1 hs w1 x3+f21 ; ; bz w0 x3+f20 ; free-bytes:= wa w0 x2+b50 ; free-bytes + save-size-zb hs w0 x3+f20 ; ; jl. w3 d76. ; free:= w0:= log-func(free-bytes), (>=1) ; rl w3 x2+b57 ; w3:= block-ref-zb al w1 -1 ; erase the overflow pointer of the sl w0 55 ; block, if the block is now at least rs w1 x3+f23 ; half empty (w0 >= 55) ; \f ; rc 01.10.77 rc4000 code procedure, connected files page 5.5 rl w3 x2+b64 ; w3:= block-zb so w3 1 ; if even block-number then ls w0 6 ; shift free left, (w0>= 64) ; ls w3 -1 ; block-table-entry-address - f18:= wa w3 x2+b61 ; block-zb//2 + victim-zb ; bz w1 x3+f18 ; load left and right old entries sh w0 63 ; mask out one of them am 2 ; mask right entry la. w1 c0. ; mask left entry lo w1 0 ; add old and new entries hs w1 x3+f18 ; store the updated double-entry ; rl w3 x2+b61 ; now decr. dead-bytes and used-bytes ac w1 (x2+b50) ; dead_bytes:= - save_size_zb am (x3+2) ; + dead_bytes al w1 x1 ; rs w1 x3+2 ; ac w0 (x2+b50) ; used-bytes := - save_size_zb ad w1 -24 ; extend aa w1 x3+6 ; + used_bytes ds w1 x3+6 ; ; rl w1 x2+b5 ; w1:= rec-base-addr-zb ; dl w0 x2+b51 ; load save-size-zb, save-rec-no-zb sn w3 (x2+b56) ; if save-size-zb = fix-rec-size-zb then jl. a2. ; goto reset-save-rec-no-zb ; (only possible for fixed rec-size) al w3 x3+1 ; restore administrative double-word with am (x1) ; free-bit added to size ds w0 +4 ; ; a2: ; reset-save-rec-no-zb: al w0 0 ; rs w0 x2+b51 ; save-rec-no-zb:= 0 ; al w0 f5 ; hs w0 (x2+b62) ; put blocktable; hs w0 (x2+b63) ; put block ; jl. (c2.) ; goto return ; c0: 8.0077 ; mask for removing left block-table entry c1: 8.7700 ; mask for removing right block-table entry c2: 0 ; save-return-address i. e. ; end set-free-n ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.6 ; log-func and log-func-r ; ; file-n subroutines ; ; the subroutines compute a logarithmic function of the number of free ; bytes in a block and the number of bytes wanted for a record respec- ; tively. ; the value of the function is intended for use as a block-table entry ; and for comparison with block-table entries. ; ; entry exit ; w0 byte-quantity <= max-free-bytes log-func or log-func-r ; w1 undef undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address unchanged ; ; value of the function: ; 1 <= log-func <= 63 ; 63 is only obtained for free-bytes = max-free-bytes, i.e. for ; a completely free block. ; ; 0 <= log-func-r <= 62 ; 0 is only obtained for records of fixed size. ; ; the safe condition for insertion of a record in a block is this: ; ; log-func-r(rec-size) < block-table-entry(block) ; ; where block-table-entry(block) should be calculated thus: ; ; block-table-entry(block):= ; if free-rec-nos(block) > 0 then log-func(free-bytes(block)) ; else 0 ; b. a10, c10 ; begin log-func and log-func-r w. d86: d87=k-j0 ; log-func-r: rl w1 x2+b56 ; w1:= fix-rec-size-zb se w1 0 ; if fix-rec-size-zb <> 0 then jl. a0. ; goto result-zero ws. w0 c1. ; byte-quantity:= byte-quantity - 2 ; (to enable insertion of max record) ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.7 d76: d77=k-j0 ; log-func: al w1 0 ; w1:= byte-quantity * 2**24 wd w1 x2+b55 ; //max-free-shift-3-zb ; al w0 -1 ; w0:= all ones ns w1 1 ; w0:= - shifts (-2048 <= w0 <= -1) ; w1:= norm ( 0.25 <= w1 < 0.5) ; ls w1 2 ; remove bit 0-1 ( 0.0 <= w1 < 1.0) ld w1 3 ; w0:= (-shifts + (norm - 0.5) shift 2) ; shift 3 (-2048*8 <= w0 <= -8) wa. w0 c0. ; + 71 ( w0 <= 63) ; sh w0 0 ; al w0 1 ; ( 1 <= w0 <= 63) jl x3 ; goto return ; a0: ; result-zero: al w0 0 ; jl x3 ; ; c0: 71 ; 63 - (-8) c1: 2 ; 2 bytes i. e. ; end log-func and log-func-r ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.8 ; move-word ; ; file-cf subroutine ; ; moves an even number of bytes (perhaps zero) between two separate ; core areas (1 and 2) identified by the address of the last preceding ; byte or the address of the first byte. ; ; entry exit ; w0 size >= 0 undef ; w1 base-1 undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; call quantity: ; work-2-p base-2 ; b. a20, c20 ; begin move-word, move-double w. d8: d9=k-j0 ; ds. w3 c0. ; save cf-buf-ref, save return rl. w2 (j32.) ; w2:= base-2 so w0 2.10 ; if size mod 4 = 0 then jl. a0. ; goto from-even-no-of-words ; the first word is moved separately rl w3 x1+1 ; move the word rs w3 x2+1 ; ; wa w0 4 ; last-2:= size + base-2 al w1 x1+2 ; increment base-1 and base-2 al w2 x2+2 ; jl. a5. ; goto from-odd-no-of-words ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.9 ; move-double ; ; file-cf subroutine ; ; moves an even number of words (perhaps zero) between two separate ; core areas (1 and 2) identified by the address of the last preceding ; byte or the address of the first byte. ; ; entry exit ; w0 size >= 0 undef ; w1 base-1 undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; call quantity: ; work-2-p base-2 ; d30: d31=k-j0 ; ds. w3 c0. ; save cf-buf-ref, save return rl. w2 (j32.) ; w2:= base-2:= work-2-p ; a0: ; from-even-no-of-words: wa w0 4 ; last-2:= w0:= size + base-2 a5: ; from-odd-no-of-words: rs. w0 c1. ; save last-2 ; c2=40 ; portion:= 10 double-words ; this is the max portion moved in one game by the move-list. sl w0 x2+c2 ; if last-2 >= base-2 + portion then jl. a3. ; goto move-list a1: ; remaining: al w3 x2 ; ws w3 0 ; jl. x3+a4. ; goto (end-list - (last-2 - base-2)) a2: ; repeat: al w1 x1+c2 ; base-1:= base-1 + portion al w2 x2+c2 ; base-2:= base-2 + portion sh w0 x2+c2-1 ; if last-2 < base-2 + portion then jl. a1. ; goto remaining ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.10 ; registers for move ; w0 work ; w1 base-1 ; w2 base-2 ; w3 work ; ; word(c1.) = last-2 ; c2 = portion ; ; obs. the last moved double-word is that at the lowest address, this ; simplifies the administration of remaining. ; a3: ; move-list: c3=k+c2-1 ; used in move-list c4=c3+2 ; ; dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k ; dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k dl w0 x1+c3-k , ds w0 x2+c4-k ; a4: ; end-list: rl. w0 c1. ; w0:= last-2 sl w0 x2+c2+1 ; if last-2 > base-2 + portion then jl. a2. ; goto repeat ; dl. w3 c0. ; w2:= cf-buf-ref jl x3 ; goto save-return ; 0 ; save-cf-buf-ref c0: 0 ; save-return c1: 0 ; save-last-2 i. e. ; end move-word, move-double ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.11 ; compare ; ; file-cf subroutine ; ; compares an even number of bytes in two core areas, identified by ; the address of the last preceding byte or the address of the first ; byte. ; (optimized for size <= 20 (10 words)). ; ; entry exit ; w0 size >= 0 result ; w1 base-1 undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; call quantity: ; work-2-p base-2 ; ; return quantity: ; result = w0 1 the two areas are equal ; 0 the two areas are not equal ; b. a10, c10 ; begin compare w. d10: d11=k-j0 ; ds. w3 c0. ; save cf-buf-ref, save return rl. w2 (j32.) ; w2:= base-2:= work-2-p wa w0 4 ; w0:= last-2:= size + base-2 c2=20 ; portion:= 10 words ; this is the max portion compared in one game by the compare-list. sl w0 x2+c2 ; if last-2 >= base-2 + portion then jl. a3. ; goto compare-list ; a1: ; remaining: al w3 x2 ; ws w3 0 ; am x3 ; am x3 ; jl. x3+a4. ; goto (end-list - (last-2 - base-2)*3) ; a2: ; repeat: al w1 x1+c2 ; base-1:= base-1 + portion al w2 x2+c2 ; base-2:= base-2 + portion sh w0 x2+c2-1 ; if last-2 < base-2 + portion then jl. a1. ; goto remaining ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.12 ; registers for compare ; w0 last-2 ; w1 base-1 ; w2 base-2 ; w3 work ; ; the last compared is at the lowest address. ; a3: ; compare-list: c3=k + (:c2-1:)*3 ; used in compare-list c4=c3+2 ; ; rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. ; rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. rl w3 x1+(:c3-k:)/3 , se w3 (x2+(:c4-k:)/3) , jl. a6. ; a4: ; end-list: sl w0 x2+c2+1 ; if last-2 > base-2 + portion then jl. a2. ; goto repeat al w0 1 ; result:= equal dl. w3 c0. ; w2:= save-cf-buf-rel jl x3 ; goto save-return ; a6: ; not-equal: al w0 0 ; result:= not equal dl. w3 c0. ; jl x3 ; ; 0 ; save-cf-buf-ref c0: 0 ; save-return i. e. ; end compare ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 5.13 ; new-head-chain ; ; file-cf subroutine ; ; the subroutine is called in a mother-zone, where current record ; must exist. ; it moves save_key to the chain-table in a daughter-zone correspon- ; ding to curr_m_ch_zb. ; it initializes the prior_ and last_acc_fields of the chain-table ; to zero, and the next_field to the value of next_chfld of the ; record. ; at last it includes the makro, back_to_daughter,. ; call return ; w0: undef undef ; w1: undef curr_ch (daughter) ; w2: cf_buf_ref (mother) cf_buf_ref(daughter) ; w3: return_addr undef ; ; b. c0 ; new_head_chain: w. d18: d19=k-f4 rs. w3 c0. ; save_return:= w3; rl w1 x2+b19 ; chain_addr:= w1:= curr_m_ch_zb; rl w3 x1 ; base_2:= work_2_p:= al w3 x3+f14 ; d_ch_addr_tbl + f14 rs. w3 (j32.) ; rl w0 x2+b14 ; size:= w0:= save_head_size_zb; al w1 x2+b21-1 ; base_1:= cf_buf_ref + b21 - 1; jl. w3 d8. ; call move_word; ; rl w1 x2+b19 ; curr_ch:= w1:= curr_m_ch_zb; rl w3 x2+b8 ; w3:= addr of next_chfld wa w3 x1+4 ; rl w0 x3 ; w0:= next_chfld ; ; back_to_daughter: dl w2 x1+2 ; w1:= chain_addr (daughter); ; w2:= cf_buf_ref (daughter); rs w0 x1+f13 ; next_tbl:= w0:= next_chfld(mother_rec) al w0 0 ; last_acc_tbl (daughter):= al w3 0 ; prior_tbl (daughter):= 0; ds w0 x1+f12 ; jl. (c0.) ; c0: 0 ; save return i. e. ; end block new_head_chain g3=k-j0 c. g3-506 m. code on segment 5 too long z. c. 502-g3 0, r. 252-g3>1 ; zero fill z. <:cf-system 5:> i. e. m. segment 5 \f ; rc 15.06.71 rc4000 code procedure, connected files page 6.1 ; ; this segment contains: ; get_l ; next_l_int ; adjust_prior_rec ; b. g10, j150 ; code segment 6: f0=f0+1 ; increase segm.count k=f4 h. j0: g1, g2 ; headword: last point, last absword j1: 1<11 o.(:1-f0:), 0 ; segment 1 j2: 1<11 o.(:2-f0:), 0 ; - 2 j4: 1<11 o.(:4-f0:), 0 ; - 4 j5: 1<11 o.(:5-f0:), 0 ; - 5 j7: 1<11 o.(:7-f0:), 0 ; - 7 j26: 0 , 11 ; rec_no_cf j31: 0 , 21 ; work_1_p j32: 0 , 23 ; work_2_p j34: 0 , 27 ; result_cf j104: f1+ 4, 0 ; rs-entry 4, take_expression j113: f1+13, 0 ; - 13, last_used j130: f1+30, 0 ; - 30, saved_stack_ref, saved_w3 g2 = k-2-j0 ; relative of last abs-word g1 = k-2-j0 ; - - - point w. \f ; rc 01.11.77 rc4000 code procedure, connected files page 6.2 ; ; ; ; procedure get_l(zl, chain, gmode); ; zone zl; real chain; integer gmode; ; ; the procedure searches a new current record in a listfile. the ; wanted record is specified by gmode in the following way: ; gmode = 1: the first member of the chain from current record ; in the motherfile. ; gmode = 2: the record next to the last accessed record in the ; chain. ; gmode = 3: the last accessed record in the chain. ; gmode = 4: the record next to the current record. ; ; result_cf: current record ; 1 record found the wanted ; 2 record not found if gmode = 2 then the last accessed ; else none ; 3 record not connected ; or last undefined unchanged ; b. a20,c0 ; begin block get_l w. e18=f0-1 e19=k-j0 al w0 f43+f45+f47 ; statebits:= read_only_l + read_update_l al w1 9 ; + update_all_l; rl. w3 (j2.) ; call prepare; jl w3 x3+d1 ; at return w2 = stackref+6 = cf_buf_ref; ; rl. w2 (j113.) ; w2:= stack_ref; dl w1 x2+16 ; get parameter gmode; so w0 16 ; if expression then jl. w3 (j104.) ; goto take_expression; ds. w3 (j130.) ; save w2,w3; rl w1 x1 ; rs w1 x2+16 ; formal 3.2:= gmode; rl w2 x2+6 ; w2:= cf_buf_ref; al w0 12 ; w0:= formal_rel; (chain = sec.param.) rl. w3 (j5.) ; call check_chain; jl w3 x3+d5 ; at return w1 = chain_addr (daughter) ; rl. w3 (j113.) ; w3:= stack_ref; rl w3 x3+16 ; w3:= gmode sl w3 1 ; if gmode < 1 or gmode > 4 then sl w3 5 ; alarm(11); jl. a11. ; comment wrong mode-parameter; sn w3 4 ; if gmode=4 jl. a4. ; then goto mode_4 se w3 1 ; if gmode <> 1 then jl. a0. ; goto mode_2_or_3; ; ; mode_one: ; ; move_to_mother: ; ks 1 dl w2 x1+2 ; w1:= chain_addr(m); w2:= cf_buf_ref(m); rs w1 x2+b19 ; curr_m_ch_zb:= curr_ch; ; rl w3 x2+b5 ; w3:= zone_descr_addr (mother); rl w0 x3+4 ; if -, rec_size_zd(m) > 0 then sh w0 0 ; alarm(14); jl. a14. ; comment no curr.rec. in motherfile; \f ; rc 01.11.77 rc4000 code procedure, connected files page 6.3 ; rl. w0 j0. ; rl. w3 (j5.) ; jl w3 x3+d19 ; call new_head_chain; ; at return w1 = curr_ch (daughter) ; and w2 = cf_buf_ref (daughter) al w0 0 ; work_1_p:= 0; comment no last_in_chain; rs. w0 (j31.) ; jl. a2. ; goto all_modes; ; ; mode_2_or_3: ; a0: rl w0 x1+f12 ; w0:= last_acc_tbl; ; ks 2 se w3 3 ; if gmode = 3 then goto mode_3 jl. a1. ; else goto mode_2; ; mode_3: sh w0 0 ; if last_acc_tbl not defined jl. a5. ; then go set result_cf rl w3 x1+f11 ; next_tbl:= last_acc_tbl; (stored in w0) ds w0 x1+f13 ; last_acc_tbl:= prior_tbl; ; ks 3 jl. a2. ; goto all_modes; ; mode_2: a1: sh w0 0 ; if last_acc_tbl not defined jl. a17. ; then alarm(17) rl w3 x1+f11 ; work_1_p:= last_acc_tbl; (stored in w0) ds. w0 (j31.) ; work_0_p:= prior_tbl; ; comment save chain_state for last_in_ch; ; ks 4 jl. a2. ; goto all_modes ; ; mode_4 ; check current record a4: rl w3 x2+b5 ; rec_base_addr rl w3 x3+4 ; if rec_size_zd = 0 sh w3 0 ; jl. a14. ; then alarm(no curr.) ; check connected rl w3 x2+b8 ; a: ch_part_base_zb wa w3 x1+4 ; add displ. for next_chfld rl w0 x3 ; if next_chfld indicates not_connected sn. w0 (c0.) ; jl. a5. ; then go set result_cf ; update table rs w0 x1+f13 ; else next_chfld_tbl := next_chfld al w0 0 ; work_1_p := 0 for rs. w0 (j31.) ; no last_in_chain rl w0 x2+b51 ; last_acc_tbl := rs w0 x1+f12 ; save_rec_no_zb ; prepare call of move_word (segm.5) ; for moving of head_field al w0 f14 ; base_2 := wa w0 2 ; rs. w0 (j32.) ; chain_addr + f14 rl w0 x1+10 ; size := head_fld_size ; w3 still points to next_chfld in record al w1 x3+1 ; base_1 := a:next_chfld + 1 rl. w3 (j5.) ; jl w3 x3+d9 ; call move_word \f ; rc 01.11.77 rc4000 code procedure, connected files page 6.3.1 ; ; ; all_modes: ; a2: jl. w3 d14. ; call next_l_int; ; ks 5 se w0 2 ; if result (in w0) = 1 then goto return; jl. a3. ; comment the wanted record found; ; result_2: ; ks 6 rs. w0 (j34.) ; result_cf:= result; rl. w0 (j31.) ; w0:= saved last_acc_tbl; ; ks 7 sh w0 0 ; if saved_last_acc = 0 then goto return; jl. a3. ; comment no records left in then chain; ; fetch last_in_chain: rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; dl. w0 (j31.) ; last_acc_tbl:= work_0_p; ds w0 x1+f13 ; next_tbl:= work_1_p; ; ks 8 jl. a2. ; goto all_modes; ; a5: al w0 3 ; rs. w0 (j34.) ; result_cf := 3 ; return: ; a3: rl. w3 (j2.) ; call return_algol; jl x3+d17 ; \f ; rc 01.11.77 rc4000 code procedure, connected files page 6.4 ; ; ; alarm_call: ; a17: am 3 ; alarmno:= 17 else a14: am 3 ; alarmno:= 14 else a11: al w1 11 ; alarmno:= 11; rl. w3 (j1.) ; jl w3 x3+d35 ; call alarm; ; c0: f8 ; not connected i. e. ; end block get_l \f ; rc 15.06.71 rc4000 code procedure, connected files page 6.5 ; ; ; subroutine next_l_int ; the routine reads the list_file_record given by the next_field ; in the chain_table given by curr_d_ch_zb. ; if this record is dead, it is either set free or marked not con- ; nected in the current chain, the prior record is adjusted, and ; the next record is read as above. ; if end_of_chain is met, the last accessed field of the chain-table ; is set to zero and w0 is set to 2. (1 otherwise). ; ; call return ; w0: return segm_tbl_addr result ; w1: undef undef ; w2: cf_buf_ref cf_buf_ref ; w3: return_addr undef ; b. a20, c5 ; next_l_int: w. d14: rl. w0 j0. ; entry this segm: d15=k-j0 ; entry other segm: ws w3 (0) ; save return inf hs w3 x2+b1+1 ; rel. on segm. rs w0 x2+b1+2 ; segm.no. rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; ; adj_prior_tbl: a0: dl w0 x1+f13 ; prior_tbl:= last_acc_tbl; ds w0 x1+f12 ; last_acc_tbl:= next_tbl; ; adj_rec_no_cf: a1: rs. w0 (j26.) ; rec_no_cf:= last_acc_tbl; ; ks 102 sh w0 0 ; if last_acc_tbl <= 0 then jl. a8. ; goto end_of_chain; ; rl. w0 j0. ; call of get_rec_n; rl. w3 (j4.) ; comment at return the registers contain: jl w3 x3+d63 ; w1 = addr. of rec_no_cf ; w2 = cf_buf_ref ; ; check_head: ; ; this makro checks that the head-field of curr_d_ch_zb in a record ; is the same as the head of the chain-table. ; rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; rl w3 x2+b8 ; base_2:= work_2_p:= wa w3 x1+4 ; ch_part_base_zb + chfld_rel_tbl; rs. w3 (j32.) ; rl w0 x1+10 ; size:= w0:= head_fld_size_tbl; al w1 x1+f14 ; base_1:= w1:= chain_addr + f14; ; ks 103 rl. w3 (j5.) ; call compare; jl w3 x3+d11 ; comment at return w0 contains the ; result: 0: not_equal, 1: equal se w0 1 ; if result <> equal then jl. a18. ; alarm(18); ; comment wrong head of list_file_rec; \f ; rc 15.06.71 rc4000 code procedure, connected files page 6.6 ; ; rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; rl w3 x2+b8 ; w3:= addr of next_chfld; comment, wa w3 x1+4 ; chain_part_base_zb + chfld_rel_tbl; rl w0 x3 ; ; ks 104 sl w0 0 ; if next_chfld >= 0 then jl. a7. ; goto record_found; la. w0 c0. ; record_dead: rs w0 x1+f13 ; next_tbl:= next_chfld - dead_bit ; ks 105 rl w0 x2+b6 ; if mode_zb = 0 then goto adj_prior_tbl; sn w0 0 ; comment mode = read_only, jl. a0. ; record cannot be removed; rl w0 x1+f11 ; ; ks 106 se w0 0 ; if prior_tbl <> 0 then jl. a3. ; goto dead_or_free; am (x1+2) ; if mode_zb(mother) = 0 then sn w0 (b6) ; goto adj_prior_tbl; jl. a0. ; comment mother_mode = read_only, ; record cannot be removed; ; ; dead_or_free: ; ; this makro sets the next_chain_field of current record and ; curr_d_ch_zb to dead_not_connected. if all next_chain_fields of ; daughter_chains are in the same state, the result will be free ; (w1:=0), otherwise the result will be dead (w1:=1). ; a3: rl w0 x1+f13 ; last_acc_tbl:= next_tbl; rs w0 x1+f12 ; al w0 f9 ; next_chfld:= dead_not_connected; rs w0 x3 ; rl w1 x2+b17 ; chain_addr:= w1:= first_d_ch_addr_zb; rl w3 x2+b8 ; w3:= chain_part_base_zb; ; ks 108 a4: am (x1+4) ; rl w0 x3 ; ; ks 109 se w0 f9 ; if next_chfld <> dead_not_connected then jl. a5. ; goto result_dead; rl w1 x1+8 ; chain_addr:= w1:= next_d_ch_tbl; ; ks 110 se w1 0 ; if chain_addr <> 0 then jl. a4. ; goto test_next else ; result:= free; comment w1=0; ; ; result_free: ; ks 111 rl. w3 (j5.) ; call set_free_n; jl w3 x3+d65 ; jl. a6. ; goto adjust_prior; ; ; result_dead: a5: al w0 f5 ; put_block; hs w0 (x2+b63) ; set write_oper in last_used_share; ; ks 112 \f ; rc 15.06.71 rc4000 code procedure, connected files page 6.7 ; ; adjust_prior: ; a6: jl. w3 d20. ; call adjust_prior_rec; ; comment at return w1 = chain_addr; rl w0 x1+f12 ; w0:= last_acc_tbl; ; ks 113 jl. a1. ; goto adj_rec_no_cf; ; ; record_found: ; w0 = next_chfld ; w1 = curr_d_ch_zb ; a7: rs w0 x1+f13 ; next_tbl:= next_chfld; ; ks 114 al w0 1 ; result:= w0:= 1; jl. a9. ; goto return; ; ; end_of_chain: ; w2 = cf_buf_ref ; a8: al w0 0 ; am (x2+b5) ; rec_size_zd:= 0; rs w0 4 ; al w0 2 ; result:= w0:= 2; ; ks 115 ; a9: rl w3 (x2+b1+2) ; return: jl x2+b1 ; goto return_1_zb; ; ; alarm_call: ; a18: al w1 18 ; alarmno:= 18; rl. w3 (j1.) ; jl w3 x3+d35 ; ; ; local constants: ; c0: 1<23-1 ; mask for dead_bit (= 01111....) i. e. ; end block next_l_init \f ; rc 15.06.71 rc4000 code procedure, connected files page 6.8 ; ; ; ; subroutine adjust_prior_rec ; ; the routine adjusts the next_chain_field of the prior record of ; a chain, so that it will be identical with the last_accessed_field ; of the chaintable. if the prior record is the mother-record, it ; must be the current record of the mother-file. ; ; call return ; w0: return_segm_tbl_addr undef ; w1: undef chain_addr ; w2: cf_buf_ref cf_buf_ref ; w3: return_address undef ; ; b. a5, c0 ; adjust_prior_rec w. d20: rl. w0 j0. ; entry this segm: d21=k-j0 ; entry other segm: ws w3 (0) ; save return inf hs w3 x2+b2+1 ; rel.on segm. rs w0 x2+b2+2 ; segm.no ; rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; rl w3 x1+f11 ; if prior_tbl > 0 then ; ks 201 sh w3 0 ; goto adjust_list_rec else jl. a1. ; goto adjust_mother_rec; ; ; adjust_list_rec: ; rs. w3 (j26.) ; rec_no_cf:= prior_tbl; rl. w0 j0. ; rl. w3 (j4.) ; jl w3 x3+d63 ; call get_rec_n; rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; rl w3 x2+b8 ; w3:= addr of next_chfld; comment wa w3 x1+4 ; ch_part_base_zb(d) + chfld_rel_tbl; rl w0 x3 ; w0:= next_chfld; rl w1 x1+f12 ; w1:= last_acc_tbl; ; ks 202 sh w0 -1 ; next_chfld:= last_acc_tbl + lo. w1 c0. ; (if next_chfld < 0 then dead_bit else 0); rs w1 x3 ; ; ks 203 al w0 f5 ; hs w0 (x2+b63) ; put_block; rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; ; ks 204 jl. a2. ; goto return; \f ; rc 15.06.71 rc4000 code procedure, connected files page 6.9 ; ; adjust_mother_rec: ; a1: rl w0 x1+f12 ; w0:= last_acc_tbl; ; move_to_mother: dl w2 x1+2 ; w1:= m_ch_addr_tbl; w2:= m_cf_buf_ref; rs w1 x2+b19 ; curr_m_ch_zb:= curr_ch; rl w3 x2+b8 ; w3:= addr of next_chfld(mother); comment wa w3 x1+4 ; ch_part_base_zb(m) + chfld_rel_tbl; rs w0 x3 ; next_chfld:= last_acc_tbl(daughter); ; ks 205 rl. w3 (j2.) ; jl w3 x3+d33 ; call put_cf_int; ; back_to_daughter: rl w1 x2+b19 ; w1:= curr_m_ch_zb; dl w2 x1+2 ; w1:= d_ch_addr_tbl; w2:= d_cf_buf_ref; ; ks 206 ; a2: rl w3 (x2+b2+2) ; return: jl x2+b2 ; goto return_jump; ; ; local constants: ; c0: f7 ; dead_bit i. e. ; end adjust_prior; \f ; rc 15.06.71 rc4000 code procedure, connected files page 6.10 ; g3=k-j0 c. g3-506 m. code on segment 6 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system 6:> m. segment 6 i. e. \f ; rc 27.5.71 rc4000 code procedure, connected files page 7.1 ; ; this segment contains. ; delete-m ; delete-l ; delete-chain ; delete-l-int ; delete-chain-int ; b. g3, j150 ; code segment 7 w. f0=f0+1 ; increase segm.count k=f4 ; k:= first k-value h. j0: g1, g2 ; head-word: last point, last abs word j1: 1<11 o.(:1-f0:), 0 ; ref. to segm. 1 j2: 1<11 o.(:2-f0:), 0 ; ref. to segm. 2 j4: 1<11 o.(:4-f0:), 0 ; ref. to segm. 4 j5: 1<11 o.(:5-f0:), 0 ; ref. to segm. 5 j6: 1<11 o.(:6-f0:), 0 ; ref. to segm. 6 j11: 1<11 o.(:11-f0:),0 ; ref. to segm. 11 j26: 0 , 11 ; own core, rec-no-cf j30: 0 , 19 ; own core, work-0-p j34: 0 , 27 ; own core, result-cf j103: f1 + 3, 0 ; rs, reserve g2=k-2-j0 ; rel last abs word g1=k-2-j0 ; rel last point w. \f ; rc 02.08.72 rc4000 code procedure, connected files page 7.2 ; delete-m(zm) ; ; file-cf procedure ; ; deletes the current record of the file, and all records in chains ; originating in the master-record. ; ; result-cf current record ; 1 deleted the next in the file ; 2 deleted, end of file the first in the file ; 3 not deleted, only one left the one ; b. a10, c10 ; begin delete-m w. e28=f0-1 e29=k-j0 al w1 14 ; proc-no:= 14 al w0 f35+f37 ; prepare(update-all-m, read-update-m) rl. w3 (j2.) ; jl w3 x3+d1 ; ; rl w1 x2+b16 ; chain-addr:= first-m-ch-addr-zb ; a0: ; test-end-mother-tables: rl w0 x1 ; sn w0 0 ; if word(chain-addr) = 0 then jl. a1. ; goto delete-master-rec ; jl. w3 d28. ; delete-chain-int al w1 x1+f10 ; chain-addr:= next-m-ch jl. a0. ; goto test-end-mother-tables ; a1: ; delete-master-rec: al w1 -10 ; reserve(10 bytes) jl. w3 (j103.) ; ; al w1 9<2 ; call-file-i(delete-rec-i) rl. w0 j0. ; rl. w3 (j2.) ; jl w3 x3+d37 ; ; rs. w1 (j34.) ; result-cf:= result-i ; rl. w3 (j2.) ; obs. for result 3 file-i dont touch zone sn w1 3 ; if result-i = 3 then jl. a3. ; goto put-and-reset ; jl w3 x3+d7 ; set-rec-pointers ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 7.3 a2: ; return: rl. w3 (j2.) ; jl x3+d17 ; return-algol ; a3: ; put-and-reset: jl w3 x3+d33 ; put-cf-int ; al w0 0 ; reset all chain-fields to zero rl w1 x2+b8 ; w1:= w3:= chain-part-base-zb al w3 x1 ; wa w3 x2+b9 ; addr:= w3:= w3 + chain-part-size-zb ; a4: ; rep: sh w3 x1 ; if addr <= chain-part-base then jl. a2. ; goto return rs w0 x3 ; al w3 x3-2 ; jl. a4. ; i. e. ; end delete-m \f ; rc 02.08.72 rc4000 code procedure, connected files page 7.4 ; delete-l(zl, chain) ; ; file-cf procedure ; ; deletes the last accessed record in the chain and all records in ; chains originating in the record. ; the next record in the chain becomes current record of the file. ; ; result-cf current record ; 1 deleted next in chain ; 2 deleted, last in chain none ; b. a30, c10 ; begin delete-l w. e30=f0-1 e31=k-j0 al w1 15 ; proc-no:= 15 al w0 f45+f47 ; prepare(read-update-l, update-all-l) rl. w3 (j2.) ; jl w3 x3+d1 ; ; al w0 12+0 ; check-chain(param-2, daughter) rl. w3 (j5.) ; jl w3 x3+d5 ; ; am (x1+2) ; rl w0 +b6 ; sn w0 0 ; if mode-zb(mother) = read-only then jl. a28. ; goto alarm(m.state) ; rl w0 x1+f12 ; sn w0 0 ; if last-acc-tbl = 0 then jl. a17. ; goto alarm(ch.state) ; sn w0 (x2+b51) ; if last-acc-tbl = save-rec-no-zb then jl. a0. ; goto delete ; rs. w0 (j26.) ; rec-no-cf:= last-acc-tbl rl. w0 j0. ; rl. w3 (j4.) ; jl w3 x3+d63 ; get-rec-n ; a0: ; delete: jl. w3 d26. ; delete-l-int ; rl w1 x2+b20 ; chain-addr:= curr-d-ch-zb rl w0 x1+f13 ; last-acc-tbl:= next-tbl rs w0 x1+f12 ; ; rl w0 x1+f11 ; se w0 0 ; if prior-tbl <> 0 then jl. a1. ; goto adjust-prior ; rl. w0 j0. ; rl. w3 (j11.) ; get-mother-rec-int jl w3 x3+d23 ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 7.5 a1: ; adjust-prior: rl. w0 j0. ; rl. w3 (j6.) ; adjust-prior-rec jl w3 x3+d21 ; ; rl w0 x1+f11 ; last-acc-tbl:= prior-tbl rs w0 x1+f12 ; ; rl. w0 j0. ; rl. w3 (j6.) ; next-l-int jl w3 x3+d15 ; rs. w0 (j34.) ; result-cf:= result ; rl. w3 (j2.) ; return-algol jl x3+d17 ; ; a28: am 28-17 ; alarm(m.state): a17: al w1 17 ; alarm(ch.state): rl. w3 (j1.) ; jl w3 x3+d35 ; alarm i. e. ; end delete-l \f ; rc 02.08.72 rc4000 code procedure, connected files page 7.6 ; delete-chain(z, chain) ; ; file-cf procedure ; ; deletes all records in a chain starting at current record of the zone, ; and all records in chains originating in records of the chain speci- ; fied. ; ; result-cf current record ; 1 chain deleted unchanged ; 2 no chain to delete unchanged ; b. a20, c10 ; begin delete-chain w. e32=f0-1 e33=k-j0 al w1 16 ; proc-no:= 16 al w0 f35+f37+f45+f47 rl. w3 (j2.) ; prepare(update-all-m, read-update-m, jl w3 x3+d1 ; read-update-l, update-all-l) ; al w0 12+1 ; check-chain(param-2, mother) rl. w3 (j5.) ; jl w3 x3+d5 ; ; rl w3 x2+b5 ; rl w3 x3+4 ; sn w3 0 ; if rec-size-zd = 0 then jl. a14. ; goto alarm(no.curr) ; jl. w3 d28. ; delete-chain-int ; sn w0 0 ; if result = no-active-recs-in-chain (0) jl. a2. ; then goto result-2 ; rl w3 x2+b8 ; next-chfld:= 0 wa w3 x1+4 ; al w0 0 ; rs w0 x3 ; ; rl. w3 (j2.) ; put-cf-internal jl w3 x3+d33 ; ; a1: ; return: rl. w3 (j2.) ; return-algol jl x3+d17 ; ; a2: ; result-2: al w0 2 ; rs. w0 (j34.) ; result-cf:= 2 jl. a1. ; goto return ; a14: al w1 14 ; alarm(no.curr): rl. w3 (j1.) ; jl w3 x3+d35 ; alarm i. e. ; end delete-chain \f ; rc 02.08.72 rc4000 code procedure, connected files page 7.7 ; delete-l-int ; ; file-cf subroutine ; ; the subroutine deletes current record of a list-file by: ; 1. delete all chains of which the record is the mother, ; 2. mark the record not-connected for curr-d-ch-zb and ; dead in all next-chflds of daughter-chains, ; 3. set last-acc-tbl of all daughter-tables to zero, and ; 4. if all chains are not-connected, then set the record free. ; ; prior record is not touched. ; ; entry exit ; w0 return-segm-tbl-address undef ; w1 undef undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; b. a10, c10 ; begin delete-l-int w. d26: rl. w0 j0. ; d27=k-j0 ; ws w3 (0) ; save-return-int-2 hs w3 x2+b2+1 ; rs w0 x2+b2+2 ; ; rl w1 x2+b16 ; chain-addr:= first-m-ch-addr-zb a0: ; test-end-mother-tables: rl w0 x1 ; sn w0 0 ; if word(chain-addr) = 0 then jl. a2. ; goto mark-dead ; jl. w3 d28. ; delete-chain-int al w1 x1+f10 ; chain-addr:= next-m-ch jl. a0. ; goto test-end-mother-tables ; \f ; rc 01.10.77 rc4000 code procedure, connected files page 7.8 a2: ; ; mark-dead ; ; this makro marks next-chfld of curr-d-ch-zb not-connected, and all ; next-chflds of daughter-chains dead. ; if they are all not-connected, the result will be free, otherwise ; dead. ; it sets last-acc-tbl of all daughter-tables to zero. ; the counter dead-bytes is incremented with save-size-zb. ; ; at exit w0 = result 0 free ; 1 dead ; rl w1 x2+b61 ; incr. dead_byte rl w3 x1+2 ; dead_bytes := dead_bytes am (x2+b50) ; + save_size_zb al w3 x3 ; rs w3 x1+2 ; ; rl w3 x2+b8 ; w3:= chain-part-base-zb rl w1 x2+b20 ; chain-addr:= curr-d-ch-zb al w0 f9 ; next-chfld:= dead-not-connected am (x1+4) ; rs w0 x3 ; ; ; registers in loop exit ; w0 result result ; w1 chain-addr 0 ; w2 work, next-chfld and zero cf-buf-ref ; w3 chain-part-base chain-part-base ; rs. w2 c0. ; save cf-buf-ref al w0 0 ; result:= free rl w1 x2+b17 ; chain-addr:= first-d-ch-zb ; w3 contains already chain-part-base a3: ; next-daughter-table: am (x1+4) ; next-chfld:= rl w2 x3 ; next-chfld or dead-bit lo. w2 c1. ; am (x1+4) ; rs w2 x3 ; ; se w2 f9 ; if next-chfld <> dead-not-connected then al w0 1 ; result:= dead ; al w2 0 ; reset last-acc-tbl rs w2 x1+f12 ; ; rl w1 x1+8 ; chain-addr:= next-d-ch-tbl se w1 0 ; if chain-addr <> 0 then jl. a3. ; goto next-daughter-table ; rl. w2 c0. ; restore cf-buf-ref ; ; end mark-dead ; \f ; rc 04.11.74 rc4000 code procedure, connected files page 7.9 se w0 0 ; if result <> free then jl. a4. ; goto put ; rl. w3 (j5.) ; set-free-n jl w3 x3+d65 ; rl w3 (x2+b2+2) ; return-int-2 jl x2+b2 ; ; a4: ; put: al w0 f5 ; hs w0 (x2+b62) ; put blocktable; hs w0 (x2+b63) ; put block; rl w3 (x2+b2+2) ; return-int-2 jl x2+b2 ; ; c0: 0 ; save cf-buf-ref c1: f7 ; dead-bit i. e. ; end delete-l-int \f ; rc 02.08.72 rc4000 code procedure, connected files page 7.10 ; delete-chain-int ; ; file-cf subroutine ; ; the subroutine deletes the chain given by current record of a mother- ; file and chain-addr of the mother-table (in w1). ; the subroutine calls delete-l-int which in turn may call delete- ; chain-int etc.. ; if no daughter-records exist the subroutine will perform a fast return, ; otherwise the subroutine will check that the chain specified is initi- ; alized, and that the daughter-file is in an update-mode. ; ; entry exit ; w0 return-segm-tbl-addr result ; w1 chain-addr(mother) chain-addr(mother) ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; return quantity: ; result = 0 no active record in chain ; <> 0 some active record in chain ; b. a30, c10 ; begin delete-chain-int w. d28: rl. w0 j0. ; d29=k-j0 ; rs w0 x2+b1+2 ; save-segm-tbl-addr(save-return-int-1) ; ; perform fast return if next-chfld is zero. ; rl w0 x2+b8 ; chain-part-base-zb wa w0 x1+4 ; chfld-rel-tbl rl w0 (0) ; w0:= next-chfld sn w0 0 ; if next-chfld = 0 then jl x3 ; perform-fast-return ; ws w3 (x2+b1+2) ; save-rel-return(save-return-int-1) hs w3 x2+b1+1 ; ; al w0 0 ; work-0-p:= 0 rs. w0 (j30.) ; ; rs w1 x2+b19 ; curr-m-ch-zb:= chain-addr ; rl w3 x1+2 ; sh w3 0 ; if d-cf-buf-ref-tbl <= 0 then jl. a16. ; goto alarm(ch.state) ; rl w3 x3+b6 ; sn w3 0 ; if mode-zb(daughter) = read-only then jl. a29. ; goto alarm(d.state) ; rl. w3 (j5.) ; new-head-chain; moves-to-daughter jl w3 x3+d19 ; rs w1 x2+b20 ; curr-d-ch-zb:= chain-addr ; \f ; rc 06.11.74 rc4000 code procedure, connected files page 7.11 a0: ; fetch-next-record: rl. w0 j0. ; rl. w3 (j6.) ; next-l-int jl w3 x3+d15 ; sn w0 2 ; if result = 2 = end-of-chain then jl. a1. ; goto return ; jl. w3 d26. ; delete-l-int ; ; now it is known that at least one active record did exist in the chain. ; save-result is changed after delete-l-int because delete-chain-int ; may be called recursively. rs. w2 (j30.) ; work-0-p:= cf-buf-ref (<> 0) ; jl. a0. ; goto fetch-next-record ; a1: ; return: rl. w0 j0. ; rl. w3 (j11.) ; addr. segm. 11; jl w3 x3+d25 ; call decoderec; rl w1 x2+b20 ; back-to-mother dl w2 x1+2 ; ; rl. w0 (j30.) ; w0:= result:= work-0-p rl w3 (x2+b1+2) ; return-int-1 jl x2+b1 ; ; a16: am 16-29 ; alarm(ch.state): a29: al w1 29 ; alarm(d.state): rl. w3 (j1.) ; jl w3 x3+d35 ; alarm i. e. ; end delete-chain-int g3=k-j0 c. g3-506 m. code on segment 7 too long z. c. 502-g3 0, r. 252-g3>1 ; zero fill z. <:cf-system 7:> i. e. m. end segment 7 \f ; rc 18.05.71 rc4ooo code procedure, connected files page 8.1 b. g10,j150 ; code segment 8: f0=f0+1 ; increase segm.count k=f4 ; h. ; j0: g1, g2 ; headword: last point, last absword j4: 1<11 o.(:4-f0:), 0 ; ref. to segm.4 j5: 1<11 o.(:5-f0:), 0 ; ref. to segm.5 j21: 0 , 1 ; return_1_p j22: 0 , 3 ; return_2_p j26: 0 , 11 ; rec_no_cf j27: 0 , 13 ; size_p j28: 0 , 15 ; overflow_p j34: 0 , 27 ; result_cf ; g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. \f ; rc 01.10.77 rc4000 code procedure, connected files page 8.2 ; ; ; file_n procedure find_rec_no_n ; the procedure finds a record-number to be used for an insertion. ; it will not update the block to be used for the insertion, but the ; overflow-pointer of the block containing the neighbour-record ; (i.e. the record which is going to be prior to the inserted one, ; or in case of next-to-mother-insertion, then the next to the in- ; serted) will be updated, if overflow occurs. this updating is per- ; formed before retrival of the overflow-block, if overflow_p is 0, ; i.e. overflow has not occurred earlier, but after retrieval, if ; overflow_p is greater than 0. ; ; reg. entry exit ; w0 return segm.tbl.addr undef. ; w1 undef. undef. ; w2 cf_buf_ref cf_buf_ref ; w3 return addr undef. ; ; call quantities: ; rec_no_cf the neighbour-record or zero, if no neighbour ; size_p the wanted record-size, incl. chainpart ; overflow_p = 0 in case of overflow, overflow_block will be ; updated before access to the overflow-block. ; = rec_no_cf overflow_block is updated after access to ; the overflow-block. ; return_quantities: ; rec_no_cf the found record-number or zero. ; result_cf unchanged if rec_no_cf > 0. ; = 2 fill limit exceeded. ; = 4 no block can take this record. ; b. a20, c10 ; begin block find_rec_no_n w. d68: rl. w0 j0. d69=k-j0 ; find_rec_no_n: ws w3 (0) ; save return in return_1_p hs. w3 (j21.) ; rs. w0 (j22.) ; ; check used_bytes against fill_limit ; fill_limit := (blocks_in _file * max_free) *fill_percentage div 100 rl w3 x2+b61 ; pointer to block_table al w0 0 ; rl w1 x3+8 ; fill_percentage , blocks_in_file ld w1 f53 ; extract fill_percentage rs. w0 c2. ; save it ls w1 -f53 ; blocks_in_file wm w1 x2+b55 ; * max_bytes_per_block_shift_3 wd. w1 c3. ; div 100 shift 3 wm. w1 c2. ; * fill_percentage ss w1 x3+6 ; w0,w1 := fill_limit - used_bytes sh w0 -1 ; if used_bytes > fill_limit jl. a9. ; goto fill limit exceeded rl. w1 (j26.) ; sh w1 0 ; if rec_no_cf <= 0 then jl. a1. ; goto find the best block rl. w0 j0. ; rl. w3 (j4.) ; get_block_r(rec_no_cf) jl w3 x3+d73 ; rl w1 x2+b57 ; w1:= block_ref_zb bz w3 x1+f20 ; rl. w0 (j27.) ; ; ks 31 sh w0 x3 ; if size <= free_bytes then jl. a4. ; goto try rec_nos \f ; jw 05.01.79 rc4000 code procedure, connected files page 8.3 ; ; a0: rl w3 x1+f23 ; not room in neighbour-block: sh w3 -1 ; if overflow_block < 0 then jl. a1. ; find the best block rs w3 x2+b64 ; else block_no_zb:= overflow_block rl. w0 (j27.) ; w0:= size_p rl. w3 (j5.) ; w0:= free_rec:= jl w3 x3+d87 ; log_func(size) rl w1 x2+b64 ; block_tbl_addr:= ls w1 -1 ; block_no_zb//2 wa w1 x2+b61 ; +victim_zb +f18 bz w3 x1+f18 ; free(block_no):= ; ks 32 rl w1 x2+b64 ; entry(block_tbl_addr) so w1 1 ; ls w3 -6 ; la. w3 c0. ; sl w0 x3 ; if free_rec >= free(block_no) then jl. a2. ; find the best block else ; room in overflow_block al w0 0 ; overflow_p:= 0 rs. w0 (j28.) ; jl. a3. ; goto get_block a1: ; find the best block: rl. w0 (j27.) ; w0:= size_p rl. w3 (j5.) ; w0:= free_rec:= jl w3 x3+d87 ; log_func(size) a2: ; find the best block ( w0 = free_rec ) rs. w0 c1. ; save free_rec jl. w3 d80. ; find_most_free (this segm.) ; w1 = free(block_no), w3 = block_no sh. w1 (c1.) ; if free(block_no) <= free_rec then jl. a8. ; goto no_block al w1 x3 ; w1:= block_no rl. w0 (j28.) ; se w0 0 ; if overflow_p <> 0 then jl. a3. ; update overflow later rl. w0 (j26.) ; if rec_no_cf > 0 sh w0 0 ; (i.e. a neighbour-record is given) jl. a3. ; am (x2+b57) ; then update overflow immediately rs w1 f23 ; overflow_block:= block_no al w0 f5 ; put write_oper in overflow_block hs w0 (x2+b63) ; a3: ; get_block: ; ks 34 rl. w0 j0. ; rl. w3 (j4.) ; get_block_b(block_no) jl w3 x3+d75 ; jl. a5. ; goto find rec_no a4: ; try rec_nos: bz w3 x1+f21 ; sn w3 0 ; if free_rec_nos = 0 then jl. a0. ; not room in neighbour-block ; room in neighbour_block al w0 0 ; rs. w0 (j28.) ; overflow_p:= 0 a5: rl w1 x2+b57 ; find rec_no: w1:= block_ref_zb \f ; rc 02.08.72 rc4000 code procedure, connected files page 8.3.1 ; it is attempted to have a random distribution of used recnos in ; a block, in order to facilitate simple reorganization of list ; files of variable record length. ; ; the search for a free record number is started at a pseudo random ; position in the rec-base table. ; the search goes backwards to the start of the rec-base table, and ; then, if that did not succeed, the search is continued from the ; end of the table, still in the backwards direction. ; al w0 117 ; w0:= (117 ba w0 x1+f21 ; + free-rec-nos) wm w0 0 ; **2 wd w0 x2+b54 ; w3:= w0 mod recs-in-block-zb wa w3 x2+b57 ; + block-ref-zb ; w3 is now the pseudo random starting address for the search. a11: bz w0 x3 ; search-1: so w0 1 ; if rec-base-rel extract 1 = unused jl. a7. ; then goto found al w3 x3-1 ; next byte sl w3 x1 ; if addr >= block-ref then jl. a11. ; goto search-1 ; now search from the end of the rec-base table am (x2+b54) ; (search from w3 to w1) al w3 x1-1 ; w3:= block_ref +recs_in_block_zb -1 ; ks 35 \f ; rc 01.10.77 rc4000 code procedure, connected files page 8.4 ; ; a6: bz w0 x3 ; so w0 1 ; if rec_base_rel extract 1 = unused then jl. a7. ; goto found al w3 x3-1 ; next byte sl w3 x1 ; if addr >= block_ref then jl. a6. ; continue ic 63 ; emergency: no found a7: ; found: ws w3 2 ; rec_no_rel:= w3 - w1 al w3 x3+1 ; rec_no_cf:= rec_no_rel + 1 rl w1 x2+b64 ; +block_no_zb wm w1 x2+b54 ; *recs_in_block_zb wa w3 2 ; rs. w3 (j26.) ; ; ks 36 rl. w1 (j28.) ; sh w1 0 ; skip if the so called later updating jl. a10. ; goto return rl w0 x2+b64 ; overflow_p:= block_no_zb rs. w0 (j28.) ; rl. w0 j0. ; rl. w3 (j4.) ; get_block_r(old overflow_p) jl w3 x3+d73 ; ; ks 37 rl. w0 (j28.) ; overflow_block:= am (x2+b57) ; overflow_p rs w0 f23 ; al w0 f5 ; put write_oper hs w0 (x2+b63) ; jl. a10. ; goto return a8: am 2 ; no block can take this record a9: al w0 2 ; fill limit exceeded rs. w0 (j34.) ; al w0 0 ; rs. w0 (j26.) ; rec_no_cf:= rl w1 x2+b5 ; rec_size_zd:= 0 rs w0 x1+h3+4 ; a10: ; return_n rl. w3 (j22.) ; rl w3 x3 ; jl. (j21.) ; c0: 8.0077 ; mask for block_tbl_entry c1: 0 ; save free_rec c2: 0 ; save fill_percentage c3: 800 ; 100 percent shift 3 ; m.find_rec_no_n i. e. ; end block find_rec_no_n \f ; rc 01.10.77 rc4000 code procedure, connected files page 8.5 ; ; ; file_n subroutine find_most_free ; the subroutine searches the block-table from bottom to top to find ; the block of most free room. the search stops if an empty block is ; found. ; ; reg. entry exit (simple return) ; w0 undef. undef. ; w1 undef. free(block_no) ; w2 cf_buf_ref cf_buf_ref ; w3 return address block_no ; b. a5, c10 ; begin block find most free w. ; d80: d81=k-j0 ; find_most_free: ds. w3 c5. ; save cf_buf_ref, save return_addr:= w2,w3 rl w3 x2+b61 ; w3:= victim_zb rl w2 x3+8 ; w2:= blocks_in_file la. w2 c6. ; remove fill_percentage al w3 x3+f18 ; w3:= first_of_block_tbl:= victim_zb +f18 rs. w3 c3. ; save that al w2 x2-1 ; last_of_block_tbl:= tbl_addr:= w2:= ls w2 -2 ; (block_in_file -1)//4 ls w2 1 ; *2 wa w2 6 ; +first_of_block_tbl al w1 0 ; max_plus_one:= 0 (good for a skip_low) ; ks 11 ; a0: ; repeat: bz w0 x2+1 ; w0:= byte(tbl_addr+1) al w3 2.111111 ; take odd entry: la w3 0 ; w3:= w0 extract 6 ; ks 12 sl w3 x1 ; if entry >= max_plus_one then jl. w3 a2. ; goto found_odd ls w0 -6 ; take even entry: w0:= w0 shift (-6) sl w0 x1 ; if entry >= max_plus_one then jl. w3 a3. ; goto found_even bz w0 x2 ; w0:= byte(tbl_addr); (comments as above) al w3 2.111111 ; take odd entry: la w3 0 ; ; ks 13 sl w3 x1 ; jl. w3 a4. ; ls w0 -6 ; take even entry: sl w0 x1 ; jl. w3 a5. ; al w2 x2-2 ; tbl_addr:= tbl_addr -1 sl. w2 (c3.) ; if tbl_addr >= first_of_block_tbl then jl. a0. ; goto repeat ; finis: al w1 x1-1 ; free(block_no):= max:= max_plus_one -1 ; ks 14 \f ; rc 01.10.77 rc4000 code procedure, connected files page 8.6 ; ; a1: ; spec. an empty block is found rl. w3 c2. ; w3:= block_no:= ws. w3 c3. ; (tbl_addr -first_of_block_tbl) ls w3 1 ; *2 wa. w3 c1. ; +entry rl. w2 c4. ; w2:= cf_buf_ref ; ks 15 jl. (c5.) ; return c1: 0 ; save entry c2: 0 ; save tbl_addr c3: 0 ; save first_of_block_tbl c4: 0 ; save cf_buf_ref c5: 0 ; save return_addr c6: f51 ; mask for blocks-in-file ; macro: a new max_plus_one is found, w0 = byte(tbl_addr), w2 = tbl_addr a2: am 1 ; odd found: right byte a3: am 1 ; even - : - - a4: am 1 ; odd - : left - a5: al w1 0 ; even - : - - ds. w2 c2. ; save entry and tbl_addr al w1 2.111111 ; w1:= la w1 0 ; free(block_no) sn w1 2.111111 ; if w1 = an empty block then jl. a1. ; stop searching al w1 x1+1 ; max_plus_one:= w1:= free(block_no) +1 ; ks 16 jl x3 ; continue ; m.findmostfree i. e. ; end block find_most_free \f ; rc 28.06.71 rc4000 code procedure, connected files page 8.7 ; ; g3=k-j0 c. g3-506 m. code on segment 8 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system 8:> m. segment 8 i. e. \f ; rc 18.05.71 rc4000 code procedure, connected files page 9.1 b. g10,j150 ; code segment 9: f0=f0+1 ; increase segm.count k=f4 ; h. ; j0: g1, g2 ; headword: last point, last absword j1: 1<11 o.(:1-f0:), 0 ; ref. to segm.1 j2: 1<11 o.(:2-f0:), 0 ; ref. to segm.2 j5: 1<11 o.(:5-f0:), 0 ; ref. to segm.5 j6: 1<11 o.(:6-f0:), 0 ; ref. to segm.6 j8: 1<11 o.(:8-f0:), 0 ; ref. to segm.8 j10: 1<11 o.(:10-f0:), 0 ; ref. to segm.10 j11: 1<11 o.(:11-f0:), 0 ; ref. to segm.11 j26: 0 , 11 ; rec_no_cf j27: 0 , 13 ; size_p j28: 0 , 15 ; overflow_p j31: 0 , 21 ; work_1_p j32: 0 , 23 ; work_2_p j34: 0 , 27 ; result_cf j113: f1+13, 0 ; rs last used ; g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. \f ; rc 26.09.72 rc4000 code procedure, connected files page 9.2 ; ; ; procedure insert_l(zl, chain, icmode, record); ; zone zl; real chain; integer icmode; array record; ; ; inserts a record in a listfile according to a spcecified mode, and ; clusters it in the specified chain. the inserted record is made ; available as zone-record, and may be retrieved by its record_no ; (return-value of rec_no_cf), or via the specified chain. ; ; result_cf current record ; 1 inserted the inserted ; 2 fill limit exceeded none ; 3 length error none ; 4 no block can take this record none ; b. a30, c10 ; begin block insert_l: w. e24=f0-1 ; insert_l: e25=k-j0 ; al w0 f45+f47 ; al w1 12 ; proc_no:= 12 rl. w3 (j2.) ; prepare(read_upd_d,update_all_l) jl w3 x3+d1 ; al w0 12+0 ; rl. w3 (j5.) ; check_chain(param2, daughterzone) jl w3 x3+d5 ; ; take param 4, calc rec-base rl. w3 (j113.) ; w3:= stack_top rl w1 x3+20 ; w1:= formal 4.2:= base_word_addr rl w0 x1 ; w0:= addr_of_base_element rs. w0 (j31.) ; work_1_p:= addr_of_element_0 ba w1 x3+18 ; w0, w1:= dl w1 x1 ; upper, lower-k sh w1 0 ; if lower-k > 0 or sh w0 1 ; upper <= 1 then jl. a13. ; goto alarm(array p) ; take param3, icmode rl w0 x3+14 ; w0:= formal 3.1:= kind so w0 2.10000 ; if expression then jl. a20. ; alarm(36) rl w1 (x3+16) ; w1:= icmode se w1 1 ; if icmode <> 1 then jl. a0. ; goto next_or_prior else ; insert as first in chain. ; macro move to mother rl w1 x2+b20 ; dl w2 x1+2 ; rs w1 x2+b19 ; ; end macro, we are in the mother-zone rl w0 x2+b6 ; sn w0 0 ; if mode_zb = read_only then jl. a21. ; goto alarm(28) rl w3 x2+b5 ; rl w0 x3+h3+4 ; sh w0 0 ; if rec_size_zd <= 0 then jl. a23. ; goto alarm(14) ; ks 23 rl. w3 (j5.) ; new_head_chain jl w3 x3+d19 ; w1 = curr_ch \f ; rc 28.06.71 rc4000 code procedure, connected files page 9.3 ; ; ; we are in the daughter-zone again rl w0 x1+f13 ; rec_no_cf:= next_tbl rs. w0 (j26.) ; al w0 0 ; overflow_p:=0 rs. w0 (j28.) ; update overflow immediately jl. a4. ; goto common part a0: ; next_or_prior: rl w3 x2+b20 ; chain_addr:= w3:= curr_d_ch_zb rl w0 x3+f12 ; sh w0 0 ; if last_acc_tbl <=0 then jl. a22. ; goto alarm(17) ; ks 24 sn w1 2 ; if icmode = 2 then jl. a1. ; goto next se w1 3 ; if icmode > 3 then jl. a24. ; goto alarm(11) ; insert as prior to last_acc: rl w0 x3+f11 ; w0:= prior_tbl ; ks 25 se w0 0 ; if prior_tbl = 0 then jl. a2. ; rs. w0 (j28.) ; insert as next to mother: rl w1 x3+2 ; rl w0 x1+b6 ; sn w0 0 ; if mode_zb(mother-zone) = read_only then jl. a21. ; goto alarm(28) rl. w0 j0. ; rl. w3 (j11.) ; get_mother_rec_int jl w3 x3+d23 ; mother-rec is curr-rec in mother-zone ; we are in the daughter-zone rl w0 x1+f12 ; rec_no_cf:= w0:= last_acc_tbl rs. w0 (j26.) ; jl. a3. ; a1: ; next: rs. w0 (j26.) ; overflow_p:= rs. w0 (j28.) ; rec_no_cf:= rs w0 x3+f11 ; prior_tbl:= last_acc_tbl jl. a4. ; goto common part a2: rs. w0 (j26.) ; not the first in chain: rs. w0 (j28.) ; rec_no_cf:= overflow_p:= prior_tbl rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb rl w0 x1+f12 ; w0:= last_acc_tbl a3: rs w0 x1+f13 ; next_tbl:= last_acc_tbl a4: ; now everything is made common to all insertion-modes rl w1 x2+b56 ; size:= fix_rec_size_zb ; ks 26 se w1 0 ; if size = 0 then jl. a5. ; rl. w3 (j31.) ; w3:= rec_base rl w1 x3+1 ; size:= word(rec_base +1) sh w1 (x2+b13) ; if size > max_rec_size_zb or size < 4 then sh w1 3 ; jl. a11. ; goto length-error sz w1 1 ; if size extract 1 = 1 then al w1 x1+1 ; size:= size +1 wa w1 x2+b9 ; size:= size +chain_part_size_zb \f ; rc 28.06.71 rc4000 code procedure, connected files page 9.4 ; ; a5: rs. w1 (j27.) ; size_p:= size rl. w0 j0. ; rl. w3 (j8.) ; find_rec_no_n jl w3 x3+d69 ; rl. w0 (j26.) ; sh w0 0 ; if rec_no_cf <= 0 then jl. a10. ; goto return ; rec_no found: rl w1 x2+b20 ; last_acc_tbl:= rec_no_cf rs w0 x1+f12 ; rl. w0 j0. ; rl. w3 (j6.) ; adjust_prior_rec jl w3 x3+d21 ; rec_no_cf = prior_tbl rl w0 x1+f12 ; rec_no_cf:= last_acc_tbl rs. w0 (j26.) ; ; ks 28 rl. w0 j0. ; rl. w3 (j10.) ; insert_n jl w3 x3+d67 ; rl w3 x2+b5 ; move: rl w0 x3+h3+4 ; size:= w0:= rec_size_zd rl w1 x3+h3+0 ; base_2:= work_2_p:= rec_base_zd rs. w1 (j32.) ; rl. w1 (j31.) ; base_1:= w1:= work_1_p rl. w3 (j5.) ; move_word jl w3 x3+d9 ; rl w0 x2+b56 ; se w0 0 ; if fix_rec_size_zb = 0 then jl. a6. ; rl w0 x2+b51 ; word(rec_base_zd +3):= rl. w1 (j32.) ; save_rec_no_zb rs w0 x1+3 ; a6: ; put zero in mother-ch-fields rl w1 x2+b16 ; w1:= ch_addr:= first_m_ch_addr_zb al w0 0 ; rl w3 x2+b8 ; w3:= chain_part_base_zb ; ks 29 a7: ; continue loop sn w0 (x1) ; if word(ch_addr) = 0 then jl. a8. ; end loop am (x1+4) ; next_ch_fld:= 0 rs w0 x3 ; al w1 x1+f10 ; ch_addr:= ch_addr +size_of_m_ch_tbl jl. a7. ; continue a8: ; end loop ; put not_connected in daughter-ch-fields rl w1 x2+b17 ; w1:= ch_addr:= first_d_ch_addr_zb rl. w0 c0. ; w0:= not_connected ; ks 21 \f ; rc 26.09.72 rc4000 code procedure, connected files page 9.5 ; ; a9: ; continue loop am (x1+4) ; rs w0 x3 ; next_ch_fld:= not_connected rl w1 x1+8 ; ch_addr:= word(ch_addr +8) se w1 0 ; if ch_addr <> 0 then jl. a9. ; continue ; end loop ; connect the inserted record to the chain, move head_field rl w1 x2+b20 ; ch_addr:= w1:= curr_d_ch_zb rl w0 x1+f13 ; wa w3 x1+4 ; next_ch_fld:= next_tbl rs w0 x3 ; base_2:= work_2_p:= chain_part_base_zb rs. w3 (j32.) ; +ch_fld_rel_tbl rl w0 x1+10 ; size:= head_fld_size_tbl al w1 x1+f14 ; base_1:= w1:= ch_addr +base_of_head_tbl ; ks 22 rl. w3 (j5.) ; move_word jl w3 x3+d9 ; a10: ; return: rl. w3 (j2.) ; return_algol jl x3+d17 ; a11: ; length-error: al w0 3 ; result_cf:= 3 rs. w0 (j34.) ; al w0 0 ; rl w3 x2+b5 ; rs w0 x3+h3+4 ; rec_size_zd:= rs. w0 (j26.) ; rec_no_cf:= 0 jl. a10. ; goto return ; c0: f8 ; not_connected ; a13: am 13-36 ; alarm 13, array p a20: am 8 ; alarm 36, expression a21: am 11 ; alarm 28, m.zone in read_only a22: am 3 ; alarm 17, last acc. not def. a23: am 3 ; alarm 14, no curr.rec a24: al w1 11 ; alarm 11, wrong mode rl. w3 (j1.) ; alarm jl w3 x3+d35 ; m.insertl i. e. ; end block insert_l \f ; rc 28.06.71 rc4000 code procedure, connected files page 9.6 ; ; g3=k-j0 c. g3-506 m. code on segment 9 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system 9:> m. segment 9 i. e. \f ; jw 05.01.79 rc4000 code procedure, connected files page 10.1 b. g10,j150 ; code segment 10 f0=f0+1 ; increase segm.count k=f4 ; h. ; j0: g1, g2 ; headword: last point, last absword j1: 1<11 o.(:1-f0:), 0 ; ref. to segm.1 j4: 1<11 o.(:4-f0:), 0 ; ref. to segm.4 j5: 1<11 o.(:5-f0:), 0 ; ref. to segm.5 j21: 0 , 1 ; return_1_p j22: 0 , 3 ; return_2_p j26: 0 , 11 ; rec_no_cf j27: 0 , 13 ; size_p ; g2=k-2-j0 ; rel of last absword g1=k-2-j0 ; rel of last point w. \f ; jw 05.02.79 rc4000 code procedure, connected files page 10.2 ; ; ; file_n procedure insert_n ; inserts a record of a given size at a given record-number. ; the procedure assumes that the record-number is free, and that there ; is enough room in the block. ; the record may be made available as a normal zone-record retrieved ; by get_rec_n, but the first zoneelement will not be initialized ; in case of variable recordlength. ; updates the counters free_bytes, free(block), free_rec_nos, and ; used_bytes. ; ; reg. entry exit ; w0 return segm.tbl.addr undef. ; w1 undef. undef. ; w2 cf_buf_ref cf_buf_ref ; w3 return addr undef. ; call quantities: rec_no_cf, size_p holding the quantities men- ; tioned above. b. a12,c5 ; begin block insert_n w. d66: rl. w0 j0. d67=k-j0 ; insert_n: ws w3 (0) ; save return in return_1_p hs. w3 (j21.) ; rs. w0 (j22.) ; rl. w1 (j26.) ; w1:= rec_no_cf rl. w0 j0. ; get_block_r(rec_no_cf) rl. w3 (j4.) ; jl w3 x3+d73 ; rl. w0 (j27.) ; save size_p and rec_no_cf in _zb rl. w1 (j26.) ; ds w1 x2+b51 ; rl w0 x2+b56 ; se w0 0 ; skip if var.length jl. a1. ; goto fixed_length ; var.length record: calc. free_size, i.e. the adjoining free area in ; the bottom of the block. am (x2+b63) ; w0:= last_storage(last_used_share_zb) rl w0 +4 ; rl w1 x2+b57 ; w1:= block_ref wa w1 x1+f22 ; +free_base_rel ; check for safety that free_base_rel is positive sh w1 (x2+b57) ; if block_ref + free_base_rel jl. a12. ; <= block_ref then goto alarm(cf_error 12) al w1 x1+1 ; ws w0 2 ; free_size:= w0:= w0 - (w1 + 1) ; ks 2 sl w0 (x2+b50) ; if free_size < save_rec_size_zb then jl. a0. ; ; check for safety that free_size is not negative sh w0 -1 ; if free_size <= -1 then jl. a12. ; goto alarm(cf_error 12) jl. w3 d78. ; goto squeeze \f ; jw 05.02.79 rc4000 code procedure, connected files page 10.3 ; ; a0: ; calc. rec_base for var.length rl w3 x2+b57 ; w3:= block_ref rl w1 x3+f22 ; w1:= free_base_rel am (x2+b58) ; rec_base_rel(this rec):= free_base_rel hs w1 x3 ; ; update free_base_rel am (x2+b50) ; free_base_rel:= al w0 x1 ; save_rec_size_zb +free_base_rel rs w0 x3+f22 ; am x3 ; rec_base:= w1:= block_ref al w0 x1 ; +old_free_base_rel ; ks 3 jl. a2. ; ; fix.length record, calc. rec_base a1: rl w0 x2+b57 ; w0:= block_ref rl w3 x2+b58 ; w3:= rec_no_rel_zb wa w3 0 ; rec_base_rel(this rec):= bz w1 x3 ; rec_base_rel(this rec) +1 al w1 x1+1 ; hs w1 x3 ; wa w0 2 ; rec_base:= w0:= block_ref + rec_base_rel ; ks 4 ; all records: update zone descr. and file_n counters. a2: rl w3 x2+b5 ; w3:= zone_descr_base rs w0 x3+h3 ; rec_base_zd:= rec_base rl w1 x2+b50 ; rec_size_zd:= w1:= ws w1 x2+b9 ; save_rec_size_zb - chain_part_size_zb rs w1 x3+h3+4 ; wa w0 2 ; chain_part_base_zb:= rs w0 x2+b8 ; rec_size_zd +rec_base_zd ; ks 5 ; ; check for safety reasons that the inserted record does not extend ; beyond the upper limit of the current block. wa w0 x2+b9 ; w0:= record_top:= chainpartbase + ch_part_size_zb am (x2+b63) ; if record_top >= rl w1 +4 ; last_storage_addr(last_used_share_zb) sl w0 x1+2 ; +2 jl. a12. ; then goto alarm(cf_error 12) rl w3 x2+b61 ; w3:= victim_zb al w0 0 ; used_bytes := rl w1 x2+b50 ; save_rec_size_zb aa w1 x3+6 ; + used_bytes ds w1 x3+6 ; rl w3 x2+b57 ; w3:= block_ref bz w0 x3+f20 ; free_bytes:= ws w0 x2+b50 ; free_bytes -save_size_zb hs w0 x3+f20 ; bz w1 x3+f21 ; free_rec_nos:= w1:= al w1 x1-1 ; free_rec_nos -1 hs w1 x3+f21 ; ; ks 6 sh w1 0 ; skip if free_rec_nos > 0 jl. a3. ; ; update the block-table rl. w3 (j5.) ; w0:= log_func(free_bytes) jl w3 x3+d77 ; jl. a4. ; a3: ; block is filled, erase old log_func in the block-table. rl w3 x2+b64 ; w3:= block_no_zb sz w3 1 ; even block_no is a left-part-byte-entry am 2 ; rl. w0 c0. ; w0:= an erase-mask \f ; jw 05.02.79 rc4000 code procedure, connected files page 10.4 ; ; ls w3 -1 ; w3:= blocktbladdr -f18:= wa w3 x2+b61 ; block_no//2 +victim_zb bz w1 x3+f18 ; w1:= block_tbl_byte la w1 0 ; erase old entry hs w1 x3+f18 ; ; ks 7 jl. a5. ; a4: ; erase old log_func and insert the new one (w0) in the block_tbl. rl w3 x2+b64 ; w3:= block_no_zb so w3 1 ; even block_no is a left-part-byte entry ls w0 6 ; shift for even block_no ls w3 -1 ; w3:= blocktbladdr -f18:= wa w3 x2+b61 ; block_no//2 +victim_zb bz w1 x3+f18 ; w1:= block_tbl_byte sh w0 63 ; choose an erase-mask, am 2 ; la. w1 c0. ; erase old value and lo w1 0 ; insert the new one hs w1 x3+f18 ; ; ks 8 ; put write-operation in sharedescriptors a5: al w0 f5 ; w0:= write hs w0 (x2+b62) ; put blocktable; hs w0 (x2+b63) ; oper(last_used_share_zb):= write ; macro return_n rl. w3 (j22.) ; rl w3 x3 ; ; ks 9 jl. (j21.) ; ; c0: 8.0077 ; even entry erase-mask 8.7700 ; odd - - - a12: al w1 12 ; alarm 12, cf-error rl. w3 (j1.) ; alarm jl w3 x3+d35 ; m.insertn i. e. ; end insert_n ; \f ; rc 28.06.71 rc4000 code procedure, connected files page 10.5 ; ; ; squeeze ; ; file-n subroutine ; ; the subroutine is called from insert-n, in case the used records of a ; list-file block are spread so much that a new record cannot be inser- ; ted after the last used record. (this can only happen for files of ; variable record-length). ; ; entry exit ; w0 undef undef ; w1 undef undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; return quantities (in last-used block): ; free-base-rel is adjusted to point to the new free area ; rec-base-table a used entry is changed to point to the ; new position of the record. ; ; picture of list-file-block: ; ; ! ! ; ! squeezed area ! ; ! ! ; free-base: !------------------------------------! ; ! ! ; ! free area, one or more records ! ; ! ! ; used-base: !------------------------------------! ; ! ! ; ! used area, one or more records ! ; ! ! ; last-used: !------------------------------------! ; ! ! ; ! free area, or stop-record ! ; ! ! ; ; algorithm of squeeze: ; ; 1. insert stop-record at free-base, and calculate rec-table-base ; (a variable, which added to a record-number gives the absolute ; address of the corresponding entry in the record-table). ; ; 2. find free-base, by stepping until the first free record ; (bit-23 of first word = free-bit = 1). ; ; 3. find used-base, by stepping until the first used record ; (bit-23 = free-bit = 0), if the stop-record (size = 0) is met ; then goto 7. ; ; 4. find last-used, by stepping until the first free record, and ; at the same time adjusting the record-table entries of the ; records encountered. ; ; 5. move the used area to free-base. ; ; 6. adjust free-base, goto 3. ; ; 7. adjust free-base-rel, and return. ; \f ; rc 28.06.71 rc4000 code procedure, connected files page 10.6 ; ; b. a20, c30 ; begin squeeze w. d78: d79=k-j0 ; ds. w3 c1. ; save cf-buf-ref, save return ; ; 1. insert stop-record for squeeze, and calculate rec-table-base. ; rl w3 x2+b57 ; w3:= block-ref-zb ; al w0 1 ; store stop-record at am (x3+f22) ; word(free-base-rel + block-ref + 1) rs w0 x3+1 ; ; rl w1 x2+b64 ; rec-table-base:= wm w1 x2+b54 ; - (block-zb * recs-in-block-zb + 1) ac w1 x1+1 ; + block-ref-zb wa w1 6 ; rs. w1 c4. ; save it ; ; 2. find free-base, by stepping until the first free record. ; ; registers exit ; w0 size + free-bit size + free-bit ; w1 rec-table-base rec-table-base ; w2 - block-ref-zb free-base-rel ; w3 old-rec-base old-rec-base ; ac w2 x3 ; w2:= - block-ref-zb am. (c0.) ; wa w3 +b54 ; w3:= base-of-first-record + 1 ; ; obs. recs-in-block-zb is always even in case of variable rec-length. al w0 -1 ; -1 is added to w3 in the first place to ; let w3 point to the base of the first record ; a1: ; find-free-base: ;ks 500 wa w3 0 ; old-rec-base:= old-rec-base + size rl w0 x3+1 ; w0:= size + free-bit so w0 1 ; if free-bit = 0 then jl. a1. ; goto find-free-base ; rs. w3 c2. ; save free-base:= old-rec-base wa w2 6 ; w2:= free-base-rel:= ; free-base - block-ref-zb ; \f ; rc 28.06.71 rc4000 code procedure, connected files page 10.7 ; ; ; 3. find used-base, by stepping until the first used record. ; ; registers exit ; w0 size + free-bit size + free-bit ; w1 rec-table-base rec-table-base ; w2 free-base-rel free-base-rel ; w3 old-rec-base old-rec-base ; a3: ; find-used-base: sn w0 1 ; if size = 0 (stop-record) then jl. a10. ; goto finish wa w3 0 ; old-rec-base:= old-rec-base al w3 x3-1 ; + size + free-bit - free-bit rl w0 x3+1 ; w0:= size + free-bit sz w0 1 ; if free-bit = 1 then jl. a3. ; goto find-used-base ; rs. w3 c3. ; save used-base ; ; 4. find last-used and adjust the record-table. ; ; registers exit ; wo size + free-bit size + free-bit ; w1 rec-table-base rec-table-base ; w2 free-base-rel free-base-rel ; w3 old-rec-base old-rec-base ; a4: ; find-last-used: am (x3+3) ; rec-base-rel(rec-no + rec-table-base):= hs w2 x1 ; free-base-rel ; wa w2 0 ; free-base-rel:= free-base-rel + size wa w3 0 ; old-rec-base:= old-rec-base + size rl w0 x3+1 ; w0:= size + free-bit so w0 1 ; if free-bit = 0 then jl. a4. ; goto find-last-used ; ; obs. now old-rec-base = last-used ; ds. w3 c6. ; save free-base-rel, old-rec-base ; ; 5. move the used area to free-base. ; ; registers exit ; w0 work undef ; w1 free-base free-base ; w2 used-base old-rec-base ; w3 work and last-used old-rec-base ; \f ; rc 28.06.71 rc4000 code procedure, connected files page 10.8 ; ; dl. w2 c3. ; fetch the two base-addresses: ; free-base and used-base ; c20=80 ; portion:= 20 double-words ; max portion moved in one game by the move-list. ; a5: ; move-adm: sl w3 x2+c20 ; if last-used >= used-base + portion jl. a7. ; then goto move-list ; ; remaining: ac w3 x3-c20 ; w3:= portion - remaining:= wa w3 4 ; - (old-rec-base - portion) + used-base so w3 2.10 ; if remaining is an even no of words then jl. a6. ; goto continue ; rl w0 x2+1 ; move one word rs w0 x1+1 ; al w1 x1+2 ; increment the two bases with 2 al w2 x2+2 ; al w3 x3+2 ; increment portion - remaining with 2 ; a6: ; continue: ws w1 6 ; decrement free-base, used-base with ws w2 6 ; portion - remaining jl. x3+a7. ; increment start address of move-list with ; portion - remaining. ; a7: ; move-list: ; an even number of words are move in increasing address order, the ; first double-word moved being given by the address: base + 3. c21=3-k ; help constant for move-list c22=c21-2 ; ; dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k ; dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k dl w0 x2+c21+k , ds w0 x1+c22+k , dl w0 x2+c21+k , ds w0 x1+c22+k \f ; rc 28.06.71 rc4000 code procedure, connected files page 10.9 ; ; ; rl. w3 c6. ; fetch old-rec-base = last-used al w1 x1+c20 ; increment both bases with portion al w2 x2+c20 ; the bases now are the bases of the next ; unmoved double-word sl w3 x2+1 ; if last-used > used-base jl. a5. ; then goto move-adm ; ; now the move is completed. ; ; 6. adjust free-base, goto 3. ; ; registers exit ; w0 undef size + free-bit ; w1 free-base rec-table-base ; w2 old-rec-base free-base-rel ; w3 old-rec-base old-rec-base ; rs. w1 c2. ; save free-base rl w0 x3+1 ; w0:= size + free-bit dl. w2 c5. ; w1:= save rec-table-base ; w2:= save free-base-rel jl. a3. ; goto find-used-base ; ; 7. adjust free-base-rel, and return. ; ; registers ; w0 1 ; w1 rec-table-base ; w2 free-base-rel ; w3 old-rec-base ; a10: ; finish: rl. w3 c0. ; w3:= save-cf-buf-ref am (x3+b57) ; free-base-rel(block):= rs w2 +f22 ; free-base-rel al w2 x3 ; w2:= cf-buf-ref jl. (c1.) ; goto save return ; ; variables. ; c0: 0 ; save cf-buf-ref c1: 0 ; save return c2: 0 ; save free-base c3: 0 ; save used base c4: 0 ; save rec-table-base c5: 0 ; save free-base-rel c6: 0 ; save old-rec-base i. e. ; end squeeze \f ; rc 28.06.71 rc4000 code procedure, connected files page 10.10 ; ; g3=k-j0 c. g3-506 m. code on segment 10 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system10:> m. segment 10 i. e. \f ; rc 18.10.78 rc4000 code procedure, connected files page 11.1 ; ; this segment contains. ; connect ; get-mother-rec-int ; decode-rec ; b. g3, j150 ; code segment 11 w. f0=f0+1 ; increase segm.count k=f4 ; k:= first k-value h. j0: g1, g2 ; headword: last point, last abs word j1: 1<11 o.(:1-f0:), 0 ; ref. to segm.1 j2: 1<11 o.(:2-f0:), 0 ; ref. to segm.2 j4: 1<11 o.(:4-f0:), 0 ; ref. to segm.4 j5: 1<11 o.(:5-f0:), 0 ; ref. to segm.5 j6: 1<11 o.(:6-f0:), 0 ; ref. to segm.6 j26: 0 , 11 ; own core, rec-no-cf j31: 0 , 21 ; own core, work-1-p j32: 0 , 23 ; own core, work-2-p j34: 0 , 27 ; own core, result-cf j35: 0 , 29 ; own core, byte 28-29, save cf-buf-ref-p j51: 11, j91 ; ext.no.11, dbrecdecode j103: f1+ 3, 0 ; rs reserve j130: f1+30, 0 ; rs saved stack-ref, saved-w3 g2=k-2-j0 ; rel last abs word g1=k-2-j0 ; rel last point w. ; j91=k-j0+1 ; dummy chain for rel for dbrecdecode 0 ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 11.2 ; connect(zl, chain_1, chain_2, ic_mode) ; ; file-cf procedure ; ; the procedure connects the last accessed record of chain_1 to chain_2 ; according to the mode specified. ; b. a40, c20 ; begin connect w. e26=f0-1 e27=k-j0 al w1 13 ; proc-no:= 13 al w0 f45+f47 ; prepare(read-update-l, update-all-l) rl. w3 (j2.) ; jl w3 x3+d1 ; ; al w0 12+0 ; check-chain(param-2, daughter) rl. w3 (j5.) ; jl w3 x3+d5 ; ; rl w0 x1+f12 ; w0:= last-acc-tbl:= the number of the ; record to be connected. sh w0 0 ; if last-acc-tbl = 0 then jl. a17. ; goto alarm(last.acc.not def.) rs. w0 (j31.) ; save record-number in work-1-p ; al w0 16+0 ; check-chain(param-3, daughter) rl. w3 (j5.) ; jl w3 x3+d5 ; ; dl. w0 (j130.) ; take ic-mode rl w0 x3+18 ; so w0 16 ; if expression then jl. a36. ; goto alarm(express.) rl w0 (x3+20) ; w0:= ic-mode ; ; obs. w1 = chain-addr(chain-2), from check-chain ; se w0 1 ; if ic-mode <> 1 then jl. a0. ; goto not-mode-1 ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 11.3 ; ic-mode 1, next to mother. ; dl w2 x1+2 ; move to mother rs w1 x2+b19 ; curr-m-ch-zb:= chain-addr rl w0 x2+b6 ; sn w0 0 ; if mode-zb = read-only then jl. a28. ; goto alarm(m.state)) ; rl w3 x2+b5 ; rl w0 x3+4 ; if rec-size-zd = 0 then sn w0 0 ; goto alarm(no.curr.) jl. a14. ; ; rl. w3 (j5.) ; new-head-chain jl w3 x3+d19 ; jl. a5. ; goto adjust-prior ; a0: ; not-mode-one: ; registers ; w0 ic-mode <> 1 ; w1 chain-addr(chain-2) ; w2 cf-buf-ref ; w3 undef ; rl w3 x1+f12 ; sh w3 0 ; if last-acc-tbl = 0 then jl. a17. ; goto alarm(last.acc.not.def) ; se w0 2 ; if ic-mode <> 2 then jl. a1. ; goto not-mode-one-or-two ; ; ic-mode 2, next to last accessed. ; rs w3 x1+f11 ; prior-tbl:= last-acc-tbl jl. a5. ; goto adjust-prior ; a1: ; not-mode-one-or-two: ; registers ; w0 ic-mode <> 1 and <> 2 ; w1 chain-addr(chain-2) ; w2 cf-buf-ref ; w3 last-acc-tbl ; se w0 3 ; if ic-mode <> 3 then jl. a11. ; goto alarm(mode p) ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 11.4 ; ic-mode 3, prior to last accessed. ; rs w3 x1+f13 ; next-tbl:= last-acc-tbl rl w0 x1+f11 ; if prior-tbl <> 0 then se w0 0 ; goto adjust-prior jl. a5. ; ; am (x1+2) ; rl w0 +b6 ; if mode-zb(mother-zone) = read-only then sn w0 0 ; goto alarm(m.state) jl. a28. ; ; jl. w3 d22. ; get-mother-rec-int ; a5: ; adjust-prior: ; registers ; w0 undef ; w1 chain-addr(chain-2) ; w2 cf-buf-ref ; w3 undef ; rl. w0 (j31.) ; last-acc-tbl:= saved-record-number rs w0 x1+f12 ; ; rl. w0 j0. ; rl. w3 (j6.) ; adjust-prior-rec jl w3 x3+d21 ; ; rl w0 x1+f12 ; rs. w0 (j26.) ; rec-no-cf:= last-acc-tbl ; rl. w0 j0. ; rl. w3 (j4.) ; get-rec-n jl w3 x3+d63 ; ; rl w1 x2+b20 ; chain-addr:= curr-d-ch-zb rl w3 x2+b8 ; wa w3 x1+4 ; w3:= addr-of-next-chfld rl w0 x3 ; se. w0 (c0.) ; if nextchfld <> not-connected then jl. a10. ; goto already-connected ; ; insert daughter-chain-field. ; ; registers ; w0 undef ; w1 chain-addr(chain-2) ; w2 cf-buf-ref ; w3 addr-of-next-chfld = base-of-head-field ; rl w0 x1+f13 ; next-chfld:= next-tbl rs w0 x3 ; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 11.5 ; move head-field from chain-table to record. ; rs. w3 (j32.) ; base-2:= work-2-p:= base-of-head-field rl w0 x1+10 ; size:= head-fld-size-tbl al w1 x1+f14 ; base-1:= head-fld-size-tbl rl. w3 (j5.) ; jl w3 x3+d9 ; move-word ; al w0 f5 ; hs w0 (x2+b63) ; put block ; a8: ; return: rl. w3 (j2.) ; jl x3+d17 ; return-algol ; a10: ; already-connected: al w0 2 ; result-cf:= 2 rs. w0 (j34.) ; rl w0 x1+f13 ; last-acc-tbl:= next-tbl rs w0 x1+f12 ; ; rl. w0 j0. ; reset the prior record to original state rl. w3 (j6.) ; adjust-prior-rec jl w3 x3+d21 ; ; al w0 0 ; rs w0 x1+f12 ; last-acc-tbl:= rl w3 x2+b5 ; rs w0 x3+4 ; rec-size-zd:= rs. w0 (j26.) ; rec-no-cf:= 0 jl. a8. ; goto return ; a11: am 11-14 ; alarm(mode p): a14: am 14-17 ; alarm(no.curr.): a17: am 17-28 ; alarm(last.acc.not.def.): a28: am 28-36 ; alarm(m.state): a36: al w1 36 ; alarm(express.): rl. w3 (j1.) ; jl w3 x3+d35 ; alarm ; c0: f8 ; not-connected i. e. ; end connect ; \f ; rc 05.11.74 rc4000 code procedure, connected files page 11.6 ; ; ; ; ; subroutine get_mother_rec_int; ; ; makes the mother-record of the current daughter-chain available as ; current record of the motherfile if it is not current already. ; ; call return ; w0: return_segm_tbl_addr undef ; w1: undef chain_addr(daughter) ; w2: cf_buf_ref(daughter) cf_buf_ref(daughter) ; w3: return_addr undef ; ; b. a10, c10 ; begin get_mother_rec_int w. d22: rl. w0 j0. ; entry this segm: d23=k-f4 ; entry other segm: ws w3 (0) ; save return inf hs w3 x2+b1+1 ; rel. on segm. rs w0 x2+b1+2 ; ; ; move to mother rl w1 x2+b20 ; chain_addr:= w1:= curr_d_ch_zb; dl w2 x1+2 ; w1:= m_ch_addr_tbl; w2:= m_cf_buf_ref_tbl; rs w1 x2+b19 ; curr_m_ch_zb:= chain_addr; ; rl w0 x2+b15 ; so w0 1 ; if file_type_zb = masterfile then jl. a1. ; goto get_masterfile_record; ; ; get_listfile_record: ; rl w1 x1 ; w0:= word(d_ch_addr_tbl + f14 + 1); rl w0 x1+f14+1 ; comment rec_no of mother-record; se w0 (x2+b51) ; if w0 <> save_rec_no_zb then jl. a0. ; goto adjust_rec_no; rl w3 x2+b5 ; w3:= rec_base_addr_zb; rl w3 x3+h3+4 ; w3:= rec_size_zd; se w3 0 ; if rec_size_zd <> 0 then goto record_found; jl. a4. ; comment current rec. is the wanted; ; a0: ; adjust_rec_no: ;ks 1100 rs. w0 (j26.) ; rec_no_cf:= w0 rl. w0 j0. ; rl. w3 (j4.) ; call get_rec_n; jl w3 x3+d63 ; jl. a6. ; goto call decode_rec; ; \f ; rc 02.08.72 rc4000 code procedure, connected files page 11.7 ; get_masterfile_record: ; a1: rl w1 x1 ; base_2:= work_2_p:= al w1 x1+f14 ; d_ch_addr_tbl + f14; rs. w1 (j32.) ; rl w0 x2+b14 ; size:= w0:= save_head_size_zb; al w1 x2+b21-1 ; base_1:= w1:= cf_buf_ref + b21 - 1; rl. w3 (j5.) ; call compare; jl w3 x3+d11 ; se w0 0 ; if result = equal then goto record_found; jl. a4. ; ;ks 1101 ; a2: rl w1 x2+b12 ; reserve (20 + min_rec_size_zb) bytes; ac w1 x1+20 ; comment w1:= new_stack_top; jl. w3 (j103.) ; ; ; set up stack_picture for call of get_rec_i. ; the first 5 words are set up by call_file_i, the last contains the ; formals, base_word, dope_vector, and content of array key. ; ; last_used ; + 10: dope-rel<12 + 19 ; 4<12 + 19 ; + 12: abs-addr-of-base-word ; last-used + 14 ; + 14: base-word ; last-used + 19 ; + 16: upper-index ; min-rec-size-zb ; + 18: lower-index - 4 ; 0 ; + 20: array key ; set by split-key-code ; rl. w3 c1. ; dope_rel shift 12 + 19 al w0 x1+14 ; abs.addr.of base_word (last_used + 14) ds w0 x1+12 ; al w3 x1+19 ; base_word (last_used + 19) rl w0 x2+b12 ; upper_index (min_rec_size_zb) ds w0 x1+16 ; al w0 0 ; lower_index (0) rs w0 x1+18 ; ; set_up array in stack: (call split_key_code) ; obs. w3 = base-2 = base-of-array-key ; rs. w2 c2. ; save cf-buf-ref rl w1 x2+b7 ; w1:= addr-of-split-key-code al. w0 a3. ; rs w0 x1-2 ; store return-addr before split-key-code rl w2 (x2+b19) ; base-1:= d-ch-add-tbl(curr-m-ch-zb) al w2 x2+f14 ; + f14 jl x1 ; call split_key_code; ; \f ; rc 05.11.74 rc4000 code procedure, connected files page 11.8 a3: rl. w2 c2. ; return: restore cf_buf_ref rl. w0 j0. ; al w1 7<2 ; rl. w3 (j2.) ; call_file_i(get_rec_i); jl w3 x3+d37 ; comment at return w1 = result_i; se w1 1 ; if result_i <> 1 then alarm(10); jl. a5. ; comment mother_record does not exist; ; rl. w3 (j2.) ; jl w3 x3+d7 ; call set_rec_pointers ; ; call decode_rec: ; a6: jl. w3 d24. ; goto decode_rec; ; ; record_found: ; a4: rl w1 x2+b19 ; back_to_daughter: w1:= curr_m_ch_zb; dl w2 x1+2 ; w1:= curr_ch(d); w2:= cf_buf_ref(d); rl w3 (x2+b1+2) ; return jl x2+b1 ; goto return_1_zb; ; ; alarm_call: ; a5: al w1 10 ; alarmno:= 10; rl. w3 (j1.) ; jl w3 x3+d35 ; call alarm ; ; local constants: ; c1: 4<12+19 ; formal2.1 c2: 0 ; save cf_buf_ref i. e. ; end get_mother_rec_int; \f ; rc 18.10.78 rc4000 code procedure, connected files page 11.9 ; ; ; subroutine decode_rec ; ; checks indivtype and length and calls decodeinternal if ; necessary. uses return_1_zb to save return addr. ; ; call: return: ; w0: segm_table_addr undef ; w1: undef undef ; w2: cf_buf_ref cf_buf_ref ; w3: return_addr undef ; ; b. a10, c10 ; begin decode_rec: w. d24: rl. w0 j0. ; entry from this segm: d25= k-f4 ; entry from other segm: ws w3 (0) ; save return inf hs w3 x2+b1+1 ; rel. on segm.; rs w0 x2+b1+2 ; rl w1 x2+b16 ; rl w1 x1-2 ; w1:= addr2 in dbtable; ;ks -20 ; comment w1 = addr2, w2 = cfbufref sh w1 2047 ; if addr2 < 2048 then jl. a3. ; goto return; rs. w2 (j35.) ; save cf_buf_ref in cf_buf_ref_p; rl w2 x2+b5 ; w2:= recbase addr; rl w3 x2+4 ; w3:= zone rec size; rl w2 x2 ; w2:= recbase; al w0 -13 ; w0:= indivtype:= se w3 0 ; if zonerecsize = 0 then secret rl w0 x2+6 ; else z.indivtype; ;ks -21 ; comment w1 = addr2, w2 = recbase, ; w3 = recsize, w0 = indivtype se w3 (x1-2) ; if zonerecsize <> length_of_last_decoded jl. a2. ; or sn w0 (x1) ; itype <> last_decoded_itype then jl. a1. ; begin a2: ; comment w0 = itype, w1 = addr2, al w2 x3 ; w2 = zrecsize, w3 = unused; ;ks -22 ; comment see above rl. w3 (j51.) ; entry point dbrecdecode; jl w3 x3+502 ; call decodeinternal; ; comment w1 = addr2 in dbtable rl w3 (x1+8) ; w3:= value of indivclass; ; -2: illegal itype ; -1: illegal length ; >=0: ok sh w3 -1 ; if iclass <= -1 then jl. a5. ; goto iclass_alarm; ; end; \f ; rc 20.06.75 rc4000 code procedure, connected files page 11.10 ; ; a1: rl. w2 (j35.) ; restore cfbufref and continue; a3: rl w3 (x2+b1+2) ; return: jl x2+b1 ; ; a5: ; iclass_alarm: ; w3 = -2 illegal itype, -1 ill. length al w1 x3+32 ; alarm(30) rec.type, alarm(31) zrecsize rl. w3 (j1.) ; call alarm on segment 1. jl w3 x3+d35 ; i. e. ; end decode_rec; ; g3=k-j0 c. g3-506 m. code on segment 11 too long z. c. 502-g3 0, r. 252-g3>1 ; zero fill z. <:cf-system11:> i. e. m. end segment 11 \f ; rc 06.12.74 rc4000 code procedure, connected files page 12.1 ; ; open_cf (first part) ; init_file_m (first part) ; b. j134, g3 ; block for segment 12 f0=f0+1 ; segment count k=f4 ; first k-value h. ; ; abs-words for this segment ; j0: g1, g2 ; head-word, last point and last absword j1: 1<11o.(:1-f0:), 0 ; segment 1 j2: 1<11o.(:2-f0:), 0 ; segment 2 j13: 1<11o.1 , 0 ; next segment j31: 0, 21 ; work_1_p j32: 0, 23 ; work_2_p j33: 0, 25 ; proc_no_p j34: 0, 27 ; result_cf j43: 3, j82 ; ext.no. 3, start_file_i j52: 12, 0 ; ext.no.12, result_i j53: 13, j81 ; ext.no.13, open ; j103: f1+ 3, 0 ; rs-entry 3, reserve j104: f1+ 4, 0 ; - 4, take_expression j113: f1+13, 0 ; - 13, last_used j130: f1+30, 0 ; - 30, saved_stack_ref, saved_w3 g2 = k-2-j0 ; relative of last abs-word j134: f1+34, 0 ; - 34, inblock g1 = k-2-j0 ; relative of last point w. \f ; rc 06.12.74 rc4000 code procedure, connected files page 12.2 ; ; procedure open_cf(z, file_name, give_up); ; zone z; string file_name; integer give_up; ; ; opens the zone z for the specified file and prepares it for use ; by the other file_cf procedures. ; ; procedure init_file_m(zm, filename, giveup, buckfactor, blockfactor) ; value buckfactor, blockfactor; ; zone zm; ; string filename; ; integer giveup; ; real buckfactor, blockfactor; ; ; prepares a masterfile for initialization. opens the zone and calls ; init_file_i, which will check the filehead and the call parameters. ; finally zone state is set to init_m. A part of the code is placed ; on the next segment. ; b. a33, c9 ; begin block open_cf w. e4=f0-1 ; init_file_m: e5=k-j0 am 27-3 ; procno init_file_m e6=f0-1 ; open_cf: e7=k-j0 al w0 3 ; procno open_cf rs. w0 (j33.) ; save procno; rl. w2 (j113.) ; w2 := stack_ref := last_used; ds. w3 (j130.) ; saved_stack_ref, saved_w3 := w2,w3; rl w1 x2+8 ; w1 := zone_descriptor_address; rl w2 x1+h2+6 ; if zone_state <> 4 then se w2 4 ; alarm(8); jl. a8. ; rl w0 x1+h0+2 ; if last_of_buffer - base_buffer_area ws w0 x1+h0 ; < 512 then sh w0 511 ; alarm(25); jl. a25. ; dl w0 x1+h0+8 ; w3:= first_share; w0:= last_share; sh w0 x3 ; if -,(last_share > first_share) then jl. a32. ; alarm(32); rs. w0 (j31.) ; work_1_p:= last_share; rs w3 x1+h0+8 ; last_share:= used_share:= first_share; rs w3 x1+h0+4 ; comment cheat open and inblock; ; rl. w2 (j113.) ; w2:= last_used; al w1 -26 ; set up call of open: jl. w3 (j103.) ; reserve 26 bytes; rs w2 x1 ; stack_ref rl. w3 j0. ; segm.table addr. and al w0 a0 ; rel.return addr. ds w0 x1+4 ; al w0 20 ; appetite:= 20 hs w0 x1+4 ; dl w0 x2+8 ; new formal 1:= old formal 1; ds w0 x1+8 ; al w3 26 ; new formal 2.1:= 26; comment integer; al w0 x2-1 ; new formal 2.2:= addr. of mode-kind; ds w0 x1+12 ; dl w0 x2+12 ; new formal 3:= old formal 2; ds w0 x1+16 ; dl w0 x2+16 ; new formal 4:= old formal 3; ds w0 x1+20 ; \f ; rc 06.12.74 rc4000 code procedure, connected files page 12.3 al w0 4 ; mode_kind:= 4; rs w0 x2-2 ; rl. w3 (j53.) ; call open j81=k+1-j0 ; chain for rel jl x3+0 ; ; a0=k-j0 ; return from open: ds. w3 (j130.) ; save w2,w3 again rl w0 x2+8 ; call inblock; ls w0 4 ; comment read into the whole buffer; rl. w1 j134. ; jl. w3 (j104.) ; ds. w3 (j130.) ; save w2,w3 again rl w1 x2+8 ; w1:= zone_descriptor_addr; rl. w0 (j31.) ; restore last_share; rs w0 x1+h0+8 ; rl w0 x1+h2+0 ; set the end-of-document-bit lo. w0 c7. ; in give-up-mask rs w0 x1+h2+0 ; rl. w0 (j33.) ; get saved procno; rl. w3 (j13.) ; sn w0 27 ; if procno = init_file_m jl x3+d57 ; then goto call_init_file_m on next segment; am (x1+h0) ; if word(base_buffer_area + 1) = 0 then rl w0 1 ; goto list_file; sn w0 0 ; comment test i_buf_ref_rel; jl. a3. ; \f ; rc 09.05.75 rc4000 code procedure, connected files page 12.3.1 ; ; ; ; master_file: ; al w1 -10 ; set up call of start_file_i: jl. w3 (j103.) ; reserve 10 bytes; rs w2 x1 ; stack_ref rl. w3 j0. ; segm.table addr. and al w0 a1 ; rel.return addr. ds w0 x1+4 ; al w0 4 ; appetite:= 4 hs w0 x1+4 ; dl w0 x2+8 ; new formal 1:= old formal 1; ds w0 x1+8 ; rl. w3 (j43.) ; call start_file_i; j82=k+1-j0 ; chain for rel jl x3+0 ; ; a1=k-j0 ; return from start_file_i: ds. w3 (j130.) ; save w2,w3 again al w0 f30 ; zone_state_zd:= read_only_m; am (x2+8) ; rs w0 h2+6 ; al w0 f31 ; set up call of prepare al w1 3 ; rl. w3 (j2.) ; prepare; at return the registers contain: jl w3 x3+d1 ; w2 = cf_buf_ref ; w3 = stack_ref rl w0 x3+8 ; rec_base_addr_zb:= zone_descr_addr; rs w0 x2+b5 ; comment formal 1.2; rl w0 x2+b7 ; split_key_code_zb:= wa w0 4 ; split_key_code_zb + cf_buf_ref rs w0 x2+b7 ; rl. w3 (j2.) ; call set_rec_pointers; jl w3 x3+d7 ; rl. w0 (j52.) ; result_cf:= result_i; rs. w0 (j34.) ; a2: rl w0 x2+b16 ; first_m_ch_addr_zb:= wa w0 4 ; first_m_ch_addr_zb + cf_buf_ref; rs w0 x2+b16 ; al w1 1 ; action:= 1; rl. w0 j0. ; rl. w3 (j13.) ; call-protect-cf; jl w3 x3+d51 ; rl. w3 (j2.) ; call return_algol; jl x3+d17 ; \f ; rc 16.03.78 rc4000 code procedure, connected files page 12.4 ; ; ; list_file: ; a3: rl w1 x2+8 ; al w0 f42 ; w1:= zone_descriptor_addr; rs w0 x1+h2+6 ; zone_state_zd:= read_only_l; al w0 0 ; rec_size_zd:= 0; rs w0 x1+h3+4 ; am (x1+h0) ; if cf_buf_ref_rel < 1 or rl w0 3 ; cf_buf_ref_rel > 2046 then sl w0 1 ; alarm(26); sl w0 2047 ; comment cf_buf_ref_rel = jl. a26. ; word(base_buf_area + 3) al w0 f43 ; set up call of prepare; al w1 3 ; rl. w3 (j2.) ; prepare; at return the registers contain: jl w3 x3+d1 ; w2 = cf_buf_ref ; w3 = stack_ref rs. w2 c3. ; save cf_buf_ref; rl w3 x3+8 ; w3:= zone_descr_addr; comment formal 1.2; rl w1 x3+h0+2 ; if last_of_buffer <= cf_buf_ref + b63 then sh w1 x2+b63 ; alarm(25); jl. a25. ; ; checksum_control: al w0 x3 ; save zone-descr-addr in w0 al w1 0 ; checksum:= 0 rl w3 x3+h0+0 ; for addr:= base-buffer + 2 a4: al w3 x3+2 ; step 2 until cf-buf-ref + b61 do am (x3) ; checksum:= word(addr) al w1 x1 ; + checksum sh w3 x2+b61-1 ; (address arithmetic gives no overflow) jl. a4. ; rl w3 0 ; w3:= saved zone-descr-addr se. w1 (c0.) ; if checksum <> <:lst:> then jl. a26. ; alarm(26); ; al w0 h6 ; no_of_shares_minus_1:= (w1:=) rs. w0 c6. ; (last_share - first_share) al w0 0 ; // share_descr_size; rl w1 x3+h0+8 ; ws w1 x3+h0+6 ; wd. w1 c6. ; rs. w1 c6. ; save no_of_shares_minus_1; rs w3 x2+b5 ; rec_base_addr_zb:= zone_descr_addr; ; al w3 x3+h1+2 ; call monitor-proc. process-description; jd 1<11+4 ; comment w0:= process_descr_addr; am (0) ; rl w1 18 ; if segs_in_file ws w1 x2+b52 ; - segs_in_head_zb am (x2+b53) ; <= segs_in_block_zb sh w1 -1 ; -1 jl. a24. ; then alarm(24); \f ; rc 11.01.72 rc4000 code procedure, connected files page 12.5 ; al w0 0 ; new_blocks_in_file:= (w1:=) wd w1 x2+b53 ; (segs_in_file - segs_in_head_zb) ; // segs_in_block_zb; am (x2+b59) ; if new_blocks_in_file > max_blocks_zb then sl w1 +1 ; alarm(33); jl. a33. ; rs w1 x2+b59 ; new_blocks_in_file_zb:= new_blocks_in_file; al w1 x1+3 ; block_table_size:= ls w1 -2 ; (new_blocks_in_file + 3) // 4 * 2 ls w1 1 ; + f18 - 2; al w1 x1+f18-2 ; rs. w1 (j31.) ; work_1_p:= block_table_size; am (x2+b5) ; rl w1 h0+2 ; room_for_blocks:= (w1:=) al w1 x1-1 ; last_of_buffer - 1 al w0 x2+b62 ; - (cf_buf_ref + b62) ws w1 0 ; - block_table_size; ws. w1 (j31.) ; rl w3 x2+b53 ; blocks_in_core:= (w1:=) ls w3 9 ; room_for_blocks al w3 x3+2 ; // (segs_in_block_zb * 512 + 2); bl w0 2 ; bl w0 0 ; comment extend sign of w1 to w0; wd w1 6 ; sh w1 0 ; if blocks_in_core <= 0 then jl. a25. ; alarm(25); rl. w3 c6. ; if blocks_in_core > no_of_shares_minus_1 sl w1 x3+1 ; then blocks_in_core:= al w1 x3 ; no_of_shares_minus_1; ls w1 1 ; victim_zb:= al w1 x1+b62 ; cf_buf_ref + b62 + blocks_in_core * 2; wa w1 4 ; rs w1 x2+b61 ; ; \f ; rc 01.10.77 rc4000 code procedure, connected files page 12.6 ; ; ; read the block_table from the file (stored at segm.no. first_segs_zb) ; to the zone_buffer (at the address victim_zb+2 and on). ; rl w0 x2+b57 ; segm_count_zd:= first_segs_zb; rl w3 x2+b5 ; w3:= zone_descr_addr; rs w0 x3+h1+16 ; al w0 x1+2 ; first-shared, last-shared(first-share) rl w1 x3+h0+2 ; := first-addr, last-addr(first-share) am (x3+h0+6) ; := victim-zb + 2, last-of-buffer ds w1 +4 ; am (x3+h0+6) ; ds w1 +4+6 ; ; ; dl w1 x3+h0+8 ; w0:= first_share; w1:= last_share; rs. w1 (j32.) ; work_2_p:= last_share; (save last_share) rs w0 x3+h0+8 ; last_share:= first_share; rl. w2 (j113.) ; w2:= stack_ref; al w0 x3 ; call inblock; ls w0 4 ; comment read the blocktable to the rl. w1 j134. ; zone-buffer; jl. w3 (j104.) ; ds. w3 (j130.) ; save w2,w3 again; ; dl w3 x2+8 ; w2:= cf_buf_ref; w3:= zone_descr_addr; rl. w0 (j32.) ; rs w0 x3+h0+8 ; last_share:= work_2_p; (saved_last_share) ; ; check blocks_in_file: rl w3 x2+b61 ; w2:= cf_buf_ref; rl w1 x3+8 ; w3:= victim_zb; comment victim_entry; al w0 0 ; extract fill_percentage ld w1 +f53 ; w0:= - ls w1 -f53 ; w1:= blocks_in_file ; check fill_percentage initialized sh w0 0 ; if > 0 jl. a5. ; sh w0 100 ; and =< 100 jl. a6. ; then ok a5: rl. w0 c8. ; else set standard fill_percentage lo w0 2 ; merge with blocks_in_file rs w0 x3+8 ; ; could be an old file with block_table_head of old format ; change format of used_bytes , *ju-hu* al w0 0 ; rx w0 x3+4 ; move old used_bytees rs w0 x3+6 ; a6: ; am (x2+b59) ; w1:= blocks_in_file; sl w1 1 ; if blocks_in_file > new_blocks_in_file_zb then jl. a24. ; alarm(24); rl. w3 (j13.) ; jl x3+d45 ; goto next segment; \f ; rc 01.10.77 rc4000 code procedure, connected files page 12.7 ; ; alarm_call: a33: am 1 ; alarmno := 33 else a32: am 6 ; alarmno := 32 else a26: am 1 ; alarmno := 26 else a25: am 1 ; alarmno := 25 else a24: am 16 ; alarmno := 24 else a8: al w1 8 ; alarmno := 8; rl. w3 (j1.) ; jl w3 x3+d35 ; call alarm; ; ; ; local constants in open_cf (first part): ; c0: <:lst:> ; testword for checksum c3: 0 ; cf_buf_ref c4: 0 ; last_from_address c5: 0 ; word_entries c6: 0 ; no_of_shares_minus_1 c7: 1<18 ; end-of-document-bit c8: 80 < 17 ; standard fill_percentage ; i. e. ; end block open_cf (first part) \f ; rc 13.05.71 rc4000 code procedure, connected files page 12.8 ; g3=k-j0 c. g3-506 m. code on segment 12 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system12:> m. segment 12 i. e. \f ; rc 09.05.75 rc4000 code procedure, connected files page 13.1 ; ; b. j130, g3 ; block for segment 13 f0=f0+1 k=f4 h. ; ; abs-words for this segment ; j0: g1, g2 ; head-word, last point and last abs-word j1: 1<11o.(:1-f0:), 0 ; segment 1 j2: 1<11o.(:2-f0:), 0 ; segment 2 j31: 0 , 21 ; work-1-p j33: 0 , 25 ; proc_no_p j34: 0 , 27 ; result_cf j35: 0 , 29 ; save-cf-buf-ref-p j41: 1 , j81 ; ext.no.1 , init_file_i j52: 12, 0 ; ext.no.12, result_i j56: 16, j96 ; ext.no.16, protect-cf j103: f1+ 3, 0 ; rs-entry 3, reserve j104: f1+ 4, 0 ; - 4, take-expression j113: f1+13, 0 ; - 13, last_used j130: f1+30, 0 ; - 30, saved_stack_ref, saved_w3 g2 = k-2-j0 ; relative of last abs-word g1 = k-2-j0 ; - - - point w. \f ; rc 13.05.71 rc4000 code procedure, connected files page 13.2 ; ; ; procedure open_cf (second part) ; b. a16, c12 ; begin block open_cf continued w. d44: d45=k-j0 ; ; at entry to this segment the registers contain: ; w1 = blocks_in_file ; w2 = cf_buf_ref ; rl w3 x2+b61 ; w3:= victim_zb; ds. w3 c11. ; save cf_buf_ref and victim_zb; ; sn w1 (x2+b59) ; if blocks_in_file = new_blocks_in_file_zb jl. a12. ; then goto initialize_share_list; ; ; the following code is used when the file to be opened is greater than ; the file stored in the backing store area. new entries in the blocktable ; are created and initialized to the value ,63, (i.e. an empty block). ; al w3 x3+f18 ; w3:= victim_zb + f18; al w2 2.11 ; word_entries:= (w0:=) al w0 x1 ; blocks_in_file extract 2; la w0 4 ; ls w1 -2 ; addr:= (w1:=) ls w1 1 ; blocks_in_file // 4 * 2 wa w1 6 ; + victim_zb + f18; ; al w3 -6 ; word(addr):= word(addr) wm w3 0 ; or (-1 shift (-6*word_entries)); al w0 -1 ; comment new entries in the last used ls w0 x3 ; blocktable-word are set to 63; rl w3 x1 ; lo w3 0 ; rs w3 x1 ; am. (c10.) ; last_addr:= (w2:=) rl w2 b59 ; new_blocks_in_file_zb // 4 * 2 ls w2 -2 ; + victim_zb + f18; ls w2 1 ; wa. w2 c11. ; al w2 x2+f18 ; al w0 -1 ; w0:= -1; a10: sl w1 x2 ; for addr:= addr + 2 while addr <= last_addr jl. a11. ; do word(addr):= -1; al w1 x1+2 ; comment new entries in the next rs w0 x1 ; block-table-words are set to 63; jl. a10. ; \f ; rc 13.05.71 rc4000 code procedure, connected files page 13.3 ; a11: al w0 2.11 ; word_entries:= (w1:=) am. (c10.) ; new_blocks_in_file_zb extract 2; rl w1 b59 ; la w1 0 ; al w0 6 ; bits:= (w1:=) al w1 x1-4 ; (word_entries - 4) * 6 wm w1 0 ; rl w3 x2 ; word(last_addr):= word(last_addr) ls w3 x1 ; shift bits shift (-bits); ac w1 x1 ; comment unused entries in the last ls w3 x1 ; new blocktableword are set to zero; rs w3 x2 ; rl. w2 c10. ; w2:= cf_buf_ref; ; ; initialize_share_list: ; a12: rl w3 x2+b5 ; get zone_descr_addr from rec_base_addr_zb rl w3 x3+h0+6 ; share_addr:= (w3:=) first_share + 6; al w3 x3+6 ; al w0 f6 ; for list_addr:= (w2:=) block_table_share step 2 al w1 0 ; until victim_zb do al w2 x2+b62 ; begin a13: rs w3 x2 ; comment set the share_descr_addr in the share- hs w0 x3 ; list and init.operation in share-descr; rs w1 x3+6 ; word(list_addr):= share_addr; al w3 x3+h6 ; operation(share_addr):= read_operation; al w2 x2+2 ; sh. w2 (c11.) ; segm_no(share_addr):= 0; jl. a13. ; share_addr:= share_addr + share_descr_size; ; end; ; ; now the first share-descriptor is initialized to describe ; the block_table_share; ; rl. w2 c10. ; w2:= cf_buf_ref; rl w3 x2+b62 ; share_addr:= (w3:=) block_table_share_zb; rl w0 x2+b57 ; segm_no(share_addr):= first_segs_zb; rs w0 x3+6 ; rl. w1 c11. ; first_shared:= al w1 x1+2 ; first_storage_addr(share_addr):= rs w1 x3-6+2 ; victim_zb + 2; rs w1 x3+2 ; ; rl. w1 (j31.) ; share_size:= (w0:=) al w0 x1+511 ; (block_table_size + 511) // 512 * 512; ls w0 -9 ; comment block_table_size is stored ls w0 9 ; in work_1_p; wa. w0 c11. ; last_shared:= rs w0 x3-6+4 ; last_storage_addr(share_addr):= rs w0 x3+4 ; victim_zb + share_size; al w1 x1+2 ; first:= (w1:=) wa. w1 c11. ; block_table_size + victim_zb + 2; rl w0 x2+b53 ; block_size:= segs_in_block_zb * 512; ls w0 9 ; ; \f ; rc 01.10.77 rc4000 code procedure, connected files page 13.4 ; ; ; in the following code the share-descriptors are initialized to describe ; the rest of the zone in accordance with the blocktablesize and the ; blocksize. the registers are used as follows: ; w0 = block-size ; w1 = start-addr of share in the zone_buffer (first) ; w2 = share-descriptor-address + 6 (share_addr) ; w3 = pointer to the share-list (list_addr) ; al w3 x2+b63 ; for list_addr:= addr of last_used_share_zb a14: rl w2 x3 ; step 2 until victim_zb do rs w1 x2-6+2 ; begin rs w1 x2+2 ; share_addr:= word(list_addr); wa w1 0 ; first_shared:= first_storage_addr:= al w1 x1-2 ; first; rs w1 x2-6+4 ; first:= first + block_size; rs w1 x2+4 ; last_shared:= last_storage_addr:= al w1 x1+2 ; first - 2; al w3 x3+2 ; end; sh. w3 (c11.) ; comment now w3 contains the address jl. a14. ; victim_zb + 2; ; rl. w2 c10. ; w2:= cf_buf_ref; rl w1 x3+6 ; last_rec_no_zb:= la. w1 c12. ; remove fill_percentage wm w1 x2+b54 ; blocks_in_file * recs_in_block_zb; rs w1 x2+b60 ; al w0 0 ; rl w1 x3+6 ; if new_blocks_in_file_zb = blocks_in_file la. w1 c12. ; remove fill_percentage sn w1 (x2+b59) ; then new_blocks_in_file_zb:= 0; rs w0 x2+b59 ; al w1 x2 ; chain_addr (w1):= first_d_ch_addr_zb:= wa w1 x2+b17 ; first_d_ch_addr_zb + cf_buf_ref rs w1 x2+b17 ; ; a15: rl w0 x1+8 ; init_next_daughter_chain_table: sn w0 0 ; chain_addr:= next_d_ch_tbl; jl. a16. ; if chain_addr=0 then goto init_mother_chain; wa w0 4 ; next_d_ch_tbl:= chain_addr:= rs w0 x1+8 ; chain_addr + cf_buf_ref; rl w1 0 ; jl. a15. ; goto init_next_daughter_chain_table; ; a16: rl w0 x2+b16 ; init_mother_chain: wa w0 4 ; first_m_ch_addr_zb:= rs w0 x2+b16 ; first_m_ch_addr_zb + cf_buf_ref; al w0 0 ; set zone_rec_size_zb to zero; rl w3 x2+b5 ; rs w0 x3+h3+4 ; ; al w1 1 ; action:= 1; jl. w3 d50. ; call-protect-cf; (this segment) ; rl. w3 (j2.) ; jl x3+d17 ; call return_algol; \f ; rc 01.10.77 rc4000 code procedure, connected files page 13.5 ; ; ; local constants in open_cf (second part): ; c10: 0 ; cf_buf_ref c11: 0 ; victim_zb c12: f51 ; mask for blocks_in_file ; i. \f ; rc 09.05.75 rc4000 code procedure, connected files page 13.5.1 e. ; end block open_cf (second part) ; ; init_file_m (second part) , ; call_init_file_i: ; ; at entry at exit ; w0 procno 0 ; w1 zone_descr_addr rec_base_addr_zb ; w2 last used cf_buf_ref ; w3 undefined undefined ; b. a10 ; block call_init_file_i w. d56: d57=k-j0 ;ks -30 al w1 -18 ; set up call jl. w3 (j103.) ; reserve 18 bytes rs w2 x1 ; stack ref rl. w3 j0. ; segm table addr al w0 a1 ; rel return addr ds w0 x1+4 ; al w0 12 ; appetite = 12 bytes (3 parameters) hs w0 x1+4 ; dl w0 x2+8 ; ds w0 x1+8 ; new formal 1 := old formal 1 (zone) dl w0 x2+20 ; ds w0 x1+12 ; new formal 2:= old formal 4 (buckfactor) dl w0 x2+24 ; ds w0 x1+16 ; new formal 3:= old formal 5 (blockfactor) rl. w3 (j41.) ; call init_file_i; j81=k+1-j0 ; chain for rel jl x3+0 ; a1=k-j0 ; return from init_file_i: ;ks -31 ds. w3 (j130.) ; save w2, w3 again; al w0 f38 ; zone_state_zb:= init_m; rl w3 x2+8 ; w3:= base of zone descr = formal 1.2 rs w0 x3+h2+6 ; rl w2 x3+h0+0 ; w2:= cf_buf_ref:= base_buffer wa w2 x2+3 ; + cf_buf_ref_rel; rs w3 x2+b5 ; rec_base_addr_zb:= zone_descr_addr; al w0 0 ; rs w0 x3+h3+4 ; rec_size_zd:= 0; rl. w0 (j52.) ; result_cf:= result_i; rs. w0 (j34.) ; rl w0 x2+b16 ; first_m_ch_addr_zb:= wa w0 4 ; first_m_ch_addr_zb + cf_buf_ref; rs w0 x2+b16 ; rl. w3 (j2.) ; call return_algol jl x3+d17 ; e. ; end block \f ; rc 01.06.71 rc4000 code procedure, connected files page 13.6 ; ; ; procedure init_chain(zm, zl, chainno, chain); ; zone zm,zl; integer chainno; real chain; ; ; establishes the connection between the two zones used for the ; motherfile (zm) and the daughterfile (zl) of a chain; ; b. a40 ; begin procedure init_chain w. e10=f0-1 ; init_chain: e11=k-j0 ; rl. w2 (j113.) ; w2:= stack_ref:= last_used; ds. w3 (j130.) ; save w2,w3; dl w1 x2+16 ; get parameter chainno so w0 16 ; if expression then jl. w3 (j104.) ; goto take_expression; rl w1 x1 rs w1 x2+16 ; formal 3.2:= chainno; ds. w3 (j130.) ; save w2,w3; ; dl w1 x2+20 ; get parameter chain so w0 16 ; if expression then jl. a36. ; alarm(36); ; ; ; set up call of prepare for the first parameter (zone zm) ; al w0 f49 ; prepare; al w1 5 ; at return the registers contain: rl. w3 (j2.) ; w2:= formal_1.1:= cf_buf_ref (zm); jl w3 x3+d1 ; w3:= stack_ref; ; ; copy the function of prepare for the second parameter (zone zl) ; rl w1 x3+12 ; w1:= base of zonedescr. al w0 f43+f45+f47 ; w0:= state-bits of allowed zonestates; am (x1+h2+6) ; ls w0 -f29 ; if statebits shift (z.state - maxstate) so w0 1 ; <> 1 then alarm(8); jl. a4. ; comment zonestate-error; rl w1 x1+h0+0 ; formal_2.1:= x1:= cf_buf_ref(zl):= wa w1 x1+3 ; base_buffer(zl) + cf_buf_ref_rel(zl); rs w1 x3+10 ; \f ; rc 03.05.72 rc4000 code procedure, connected files page 13.7 ; ; ; find and check actual mother_chain_tbl: ; rl w2 x2+b16 ; m_addr:= (w2:=) first_m_ch_addr_zb(zm); ; comment addr of first mother_chain_tbl; a0: al w0 0 ; test_chainno_m: sn w0 (x2) ; if mother_tbl exhausted then alarm(9); jl. a9. ; comment file and chain not associated; bz w0 x2+6 ; if chain_number_tbl = chainno then sn w0 (x3+16) ; goto mother_tbl_found; jl. a1. ; al w2 x2+f10 ; m_addr:= addr of next mother_chain_tbl; jl. a0. ; goto test_chainno_m; ; a1: ; mother_tbl_found: ; ; find and check actual daughter_chain_tbl: ; rl w1 x1+b17 ; d_addr:= (w1:=) first_d_ch_addr_zb(zl); ; comment addr of first daughter_ch_tbl; a2: bz w0 x1+6 ; test_chainno_d: sn w0 (x3+16) ; if chain_number_tbl = chainno then jl. a3. ; goto daughter_tbl_found; rl w1 x1+8 ; d_addr:= next_d_ch_tbl; sn w1 0 ; if daughter_tbl exhausted then alarm(9); jl. a9. ; comment file and chain not associated; jl. a2. ; goto test_chainno_d; ; a3: ; daughter_tbl_found: ; ; initialize actual mother_chain_tbl and daughter_chain_tbl: ; rs w2 x1 ; m_ch_addr_tbl:= m_addr; rl w0 x3+6 ; m_cf_buf_ref_tbl:= cf_buf_ref(zm); rs w0 x1+2 ; rs w1 x2 ; d_ch_addr_tbl:= d_addr; rl w0 x3+10 ; d_cf_buf_ref_tbl:= cf_buf_ref(zl); rs w0 x2+2 ; rx w1 4 ; exchange m_addr and d_addr; ds w2 (x3+20) ; chain:= m_addr shift 24 add d_addr; ; comment return-parameter; rl w2 x2+2 ; w2:= cf_buf_ref(zm); rl. w3 (j2.) ; jl x3+d17 ; call return_algol; \f ; rc 03.05.72 rc4000 code procedure, connected files page 13.8 ; ; ; alarm_call: ; a4: rl w2 x1+h2+6 ; zonestateerror: w1 = zone_descr_addr; a8: am 8-9 ; alarm(z.state): a9: am 9-36 ; alarm(ch.ass.): a36: al w1 36 ; alarm(express.): rl. w3 (j1.) ; jl w3 x3+d35 ; call alarm; ; i. e. ; end block init_chain \f ; rc 05.11.71 rc4000 code procedure, connected files page 13.9 ; ; subroutine call-protect-cf ; ; the routine reserves and sets up a new stack top and calls the ; external procedure protect-cf(z, action). ; action indicates where the routine was called from: ; action = 1: from open-cf just before call of return-algol ; = 2: from update-all-cf or read-upd-cf before call ; of update-i-proc or set-mode-n, if old mode ; was read-only. ; = 3: from read-only-cf just before return-algol, if ; old-mode was some update-mode. ; ; call return ; w0: call segm-tbl-addr undef ; w1: action undef ; w2: cf-buf-ref cf-buf-ref ; w3: return-addr undef ; b. a5, c5 ; begin block call-protect-cf w. d50: rl. w0 j0. ; entry this segment: d51=k-j0 ; entry other segment: ws w3 (0) ; save return-inf hs w3 x2+b1+1 ; rel.on segm. rs w0 x2+b1+2 ; segm.no. rs. w2 (j35.) ; save-cf-buf-ref-p:= cf-buf-ref; al w0 x1 ; save action in w0 ; al w1 -16 ; set up call of protect-cf jl. w3 (j103.) ; reserve 16 bytes ; w0 and w2 are unchanged, w1 = new stack top al w3 x1+15 ; addr of action and action as ds w0 x1+14 ; formal2.2 and literal1 ; rl w3 x2+b5 ; rec-base-addr-zb and integer-variable al w0 26 ; as formal1.2 and formal2.1 ds w0 x1+10 ; ; dl. w3 (j130.) ; w2:= saved-stack-ref ; store return point and formal1.1 rl. w3 j0. ; stack-ref and ds w3 x1+2 ; segm-table-addr; dl. w0 c1. ; appetite < 12 + rel.return and ds w0 x1+6 ; zone-formal.1; ; rl. w3 (j56.) ; call protect-cf j96=k+1-j0 ; chain for rel jl x3+0 ; ; a0=k-j0 ; return from protect-cf: ds. w3 (j130.) ; save stack-ref,w3 again rl. w2 (j35.) ; w2:= cf-buf-ref rl w3 (x2+b1+2) ; jl x2+b1 ; goto return-int; \f ; rc 05.11.71 rc4000 code procedure, connected files page 13.10 ; ; ; local constants: ; c0: 10<12 + a0 ; appetite shift 12 + rel.return c1: 6<12 + 23 ; zone-formal.1 i. e. ; end block call-protect-cf; g3=k-j0 c. g3-506 m. code on segment 13 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system13:> m. segment 13 i. e. \f ; rc 10.09.79 rc4000 code procedure, connected files page 14.1 b. g10, j185 ; code segment 14: f0=f0+1 ; increase segment count k=f4 h. j0: g1, g2 ; headword: last point, last absword j1: 1<11 o.(:1-f0:), 0 ; ref. to segm. 1 j2: 1<11 o.(:2-f0:), 0 ; ref. to segm. 2 j4: 1<11 o.(:4-f0:), 0 ; ref. to segm. 4 j13: 1<11 o.(:13-f0:), 0 ; ref. to segm. 13 j15: 1<11 o.(:15-f0:), 0 ; ref. to segm. 15 j21: 0 , 1 ; own core, return-1-p j22: 0 , 3 ; own core, return-1-p j23: 0 , 5 ; own core, return-2-p j24: 0 , 7 ; own core, return-2-p j26: 0 , 11 ; own core, rec-no-cf j30: 0 , 19 ; own core byte 18-19, work_0_p j31: 0 , 21 ; own core byte 20-21, work_1_p j33: 0 , 25 ; own core byte 24-25, proc_no_p j35: 0 , 29 ; own core, save-cf-buf-ref-p j103: f1+3 , 0 ; rs reserve j104: f1+4 , 0 ; rs take expression j113: f1+13, 0 ; rs last used j130: f1+30, 0 ; rs saved stack ref, saved w3 j185: f1+85, 0 ; rs current activity g2=k-2-j0 ; rel of last absword j133: f1+33, 0 ; rs entry point for check g1=k-2-j0 ; rel of last point w. \f ; rc 05.11.71 rc4000 code procedure, connected files page 14.2 ; ; ; procedure close_cf(z,rel); ; zone z; boolean rel; ; ; terminates the use of the zone by writing back eventual updated ; blocks. releases the document if it is specified by param.2. rec_ ; size_zd is set to 0, say, no zone-record available. ; chain_states for all associated chains are set to not_init, simply ; by putting -1 in the corresponding chaintabels of the other zones. ; result_cf = 1, ok ; b. a10 ; begin block close_cf w. e12=f0-1 ; close_cf: e13=k-f4 al w1 6 ; proc_no:= 6 al w0 f39+f49 rl. w3 (j2.) ; jl w3 x3+d1 ; prepare(all_cf_states) rl w1 x3+8 ; ; rs w1 x2+b5 ; rec-base-addr-zb:= formal1.2 ; obs. not done in init-file-m, but used ; in call-file-i rl w1 x1+h2+6 ; w1:= zonestate al w2 x3 ; w2:= stack_ref se w1 f38 ; if zonestate <> init_m then jl. a0. ; goto other_states; al w1 -10 ; init_state: jl. w3 (j103.) ; reserve(10 bytes) rl. w0 j0. al w1 4<2 rl w2 x2+6 rl. w3 (j2.) ; call_file_i(set_read_i) jl w3 x3+d37 dl. w3 (j130.) ; w2:= stack_ref jl. a2. a0: al w1 -10 ; other_states: reserve(10 bytes) jl. w3 (j103.) ; rs w2 x1 ; w(newtop):= oldtop rl. w3 j0. ; return segm tbl addr:= this segm al w0 a1 ; appetite<12 +rel_return:= ds w0 x1+4 ; 4<12 +rel_this_segm al w0 4 ; hs w0 x1+4 ; ; rl w3 x2+8 ; move formal 1.2 rs w3 x1+8 ; al w1 0 ; proc_no:= 0 jl. d42. ; read_only_cf_int this segm. a1=k-j0 ; rel_this_segm: ds. w3 (j130.) al w0 6 ; proc_no_p:= 6 rs. w0 (j33.) \f ; rc 05.11.71 rc4000 code procedure, connected files page 14.3 ; a2: dl w1 x2+12 ; take param 2, release so w0 16 ; jl. w3 (j104.) ; ds. w3 (j130.) ; bl w0 x1 ; rl w1 x2+8 ; w1:= addr of zd so w0 1 ; if w0 then goto release; jl. a3. ; al w3 x1+h1+2 ; release: w3:= name addr jd 1<11+64 ; goto monitor procedure remove process a3: al w0 4 ; rs w0 x1+h2+6 ; zonestate:= 4 al w0 0 rs w0 x1+h3+4 ; rec_size_zd:= 0 rl w2 x2+6 ; w2:= formal1.1:= cf_buf_ref rl w0 x2+b16 ; test after init_m-state sh w0 0 ; if first-m-ch-addr-zb <= 0 then jl. a7. ; goto finis; al w0 -1 ; rl w3 x2+b15 so w3 1 ; if file_type_zb = master then jl. a5. ; goto mother_chains else ; daughter_chains: rl w1 x2+b17 ; chain_addr:= w1:= first_d_ch_addr_zb a4: rl w3 x1 ; w3:= w(chain_addr) se w0 x3 ; if w(chain_addr) <> -1 then rs w0 x3 ; w(w(chain_addr):= se w0 x3 ; w(w(chain-addr)+2):= -1 rs w0 x3+2 ; ; rl w1 x1+8 ; chain_addr:= w(chain_addr +8) se w1 0 ; if chain_addr <> end of ch_tbl then jl. a4. ; continue loop a5: ; mother_chains: rl w1 x2+b16 ; chain_addr:= w1:= first_m_ch_addr_zb a6: rl w3 x1 ; w3:= w(chain_addr) sn w3 0 ; if w(chain_addr) = end of ch_tbl then jl. a7. ; goto finis; se w0 x3 ; if w(chain_addr) <> -1 then rs w0 x3 ; w(w(chain_addr)):= se w0 x3 ; w(w(chain-addr)+2):= -1 rs w0 x3+2 ; ; al w1 x1+f10 ; chain_addr:= chain_addr +size_of_m_ch_tbl jl. a6. ; continue loop a7: rl. w3 (j2.) ; finis: jl x3+d17 ; return_algol i. e. ; end block close_cf \f ; rc 05.11.71 rc4000 code procedure, connected files page 14.4 ; ; procedure update_all_cf(z); ; procedure read_upd_cf(z); ; procedure read_only_cf(z); ; subroutine read_only_cf_int(z); ; zone z; ; ; the mode is changed according to the procedure called, and blocks are ; transferred to or from the file as required, see the manual. ; result_cf = 1, ok. ; ; note for call of read_only_cf_int: ; the stack-top must hold a correct return-point and formal.2 of the ; zone-parameter.w1:= proc_no:= 0. ; b. a5 ; begin block mode-procs. w. e42=f0-1 ; update_all_cf: e43=k-f4 am 1 e40=f0-1 ; read_upd_cf: e41=k-f4 am 1 e38=f0-1 ; read_only_cf: e39=k-f4 al w1 19 ; d42: d43=k-j0 ; read_only_cf_int: al w0 f49 rl. w3 (j2.) ; jl w3 x3+d1 ; prepare(all states except init_m) rl. w1 (j33.) ; w1:= proc_no_p se w1 0 ; w1:= work-1-p:= new-mode:= al w1 x1-19 ; if proc-no-p <> 0 then proc-no-p - 19 rl w0 x2+b6 ; else 0; ds. w1 (j31.) ; w0:= work-0-p:= old-mode:= mode-zb; ; sn w0 0 ; if old-mode = 0 (read-only) and sn w1 0 ; new-mode <> 0 (read-upd/update-all) jl. a0. ; then al w1 2 ; begin rl. w0 j0. ; action:= 2; rl. w3 (j13.) ; call-protect-cf; jl w3 x3+d51 ; end; ; a0: rl w0 x2+b15 ; w0:= file_type_zb sz w0 1 ; if file_type = 1 then jl. a2. ; goto listfile; \f ; rc 05.11.71 rc4000 code procedure, connected files page 14.5 ; rl. w1 (j31.) ; rs w1 x2+b6 ; masterfile: mode_zb:= work_1_p al w1 -10 ; jl. w3 (j103.) ; reserve(10 bytes) rl. w0 j0. ; rl w1 x2+b6 ; w1:= (work_1_p +4)<2 al w1 x1+4 ; ls w1 2 ; rl. w3 (j2.) ; call_file_i(set_read_i,set_put_i, or jl w3 x3+d37 ; set_update_i) rl. w3 (j2.) ; jl w3 x3+d7 ; set_rec_pointers jl. a3. ; goto finis; ; a2: ; listfile: comment work-1-p holds new_mode; jl. w3 d60. ; goto set_mode_n this segment ; a3: ; finis: rl. w0 (j30.) ; w0:= old-mode:= work-0-p; rl w1 x2+b6 ; w1:= new-mode:= mode-zb; sn w1 0 ; if new-mode = 0 (read-only) and sn w0 0 ; old-mode <> 0 (read-upd/update-all) jl. a4. ; then al w1 3 ; begin rl. w0 j0. ; action:= 3; rl. w3 (j13.) ; call-protect-cf; jl w3 x3+d51 ; end; ; a4: rl. w3 (j2.) ; jl x3+d17 ; return_algol i. ; e. ; end block mode-procs \f ; rc 05.11.74 rc4000 code procedure, connected files page 14.6 ; ; ; set-mode-n ; ; file-n procedure ; ; set-mode-n changes the mode of a list-file. ; two sigificant different changes are possible: ; ; 1. from read-only to any state. ; in all block-shares the non-possible segment-number zero is ; inserted. ; ; 2. from some update-mode to any mode. ; all updated blocks are ; written back to the file. ; ; in any case mode-zb is changed to the new mode, the zone-state ; is altered, and current record, if any, is read again. ; if the new mode is an update-mode, new-blocks-in-file-zb is ; inspected to see if the file has grown bigger since the previous ; run, and the new blocks not included yet, if that is the case the ; new blocks are initialized by a call of init-blocks, which will reset ; new-blocks-in-file-zb to zero. ; ; entry exit ; w0 return segm tbl address undef ; w1 undef undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; call quantities: ; work-1-p specifies the new mode by the same values as ; mode-zb: ; 0: read-only ; 1: read-update ; 2: update-all ; b. a20, c20 ; begin set-mode-n w. d60: rl. w0 j0. ; d61=k-j0 ; ws w3 (0) ; save-return-1-p hs. w3 (j21.) ; rs. w0 (j22.) ; ; rl w3 x2+b5 ; rl w3 x3+4 ; if rec-size-zd = 0 then se w3 0 ; rec-no-cf:= 0 rl w3 x2+b51 ; else rec-no-cf:= save-rec-no-zb rs. w3 (j26.) ; ; rl w1 x2+b51 ; if save-rec-no-zb <> 0 then last-used- rl. w3 (j4.) ; block is properly updated by means of se w1 0 ; an otherwise dummy call of get-block-r jl w3 x3+d73 ; \f ; rc 05.11.71 rc4000 code procedure, connected files page 14.7 ; ; rl w0 x2+b6 ; old-mode:= w0:= mode-zb rl. w1 (j31.) ; mode-zb:= new-mode:= w1:= rs w1 x2+b6 ; work-1-p ; al w3 x1+f42 ; zone-state-zd:= am (x2+b5) ; new-mode + read-only-l rs w3 h2+6 ; ; se w0 0 ; if old-mode <> read-only then jl. a2. ; goto from-some-update-mode ; a1: ; 1. from read-only to any state. ; insert zero as segment-number in all block-shares. ; rl w3 x2+b61 ; list-addr:= victim-zb ; a3: ; rep1: rl w1 x3 ; segm-no(share(list-addr)):= 0 rs w0 x1+6 ; obs. w0 = 0 = read-only-mode al w3 x3-2 ; list-addr:= list-addr - 2 sl w3 x2+b63 ; if list-addr >= addr of last-used-share jl. a3. ; then goto rep1 ; ; now all block-shares contains the dummy segment-number zero. ; if new-mode <> read-only and new-blocks-in-file-zb <> 0 then ; the new blocks should be initialized. se w0 (x2+b6) ; if new-mode = read-only (=0) sn w0 (x2+b59) ; or new-blocks-in-file-zb = 0 then jl. a10. ; goto fetch current record (obs. w0=0) ; rl. w3 (j15.) ; jl x3+d83 ; init-blocks d84: d85=k-j0 ; return-from-init-blocks: jl. a10. ; goto fetch current record \f ; rc 11.12.74 rc4000 code procedure, connected files page 14.8 ; ; a2: ; 2. from some update-mode to any mode. ; all updated blocks are written back and checked ; by means of subroutine write-back. ; jl. w3 d90. ; write-back, this segm. ; a10: ; fetch current record: ; if rec-no-cf > 0 the current record is reestablished by a return ; via get-rec-n-int, otherwise a normal return is performed. al w0 0 ; set zone_rec_size_zd to zero; rl w3 x2+b5 ; rs w0 x3+h3+4 ; rl. w3 (j4.) ; rl. w0 (j26.) ; se w0 0 ; if rec-no-cf <> 0 then jl x3+d89 ; get-rec-n-int ; normal return: rl. w3 (j22.) ; return-1-p rl w3 x3 ; jl. (j21.) ; ; i. e. ; end set-mode-n \f ; rc 05.11.71 rc4000 code procedure, connected files page 14.9 ; ; ; ; write-back ; ; file-n subroutine ; ; the subroutine writes back all updated shares, i.e. all shares con- ; taining a write-operation. ; a read-operation is inserted after check of a transfer. ; ; entry exit ; w0 return-segm-tbl-address undef ; w1 undef undef ; w2 cf-buf-ref cf-buf-ref ; w3 return-address undef ; ; ; the subroutine uses return-2-p and rec-no-rel-zb ; b. a20, c20 ; begin write-back w. d90: rl. w0 j0. ; d91=k-j0 ; ws w3 (0) ; save return in return-2-p hs. w3 (j23.) ; rs. w0 (j24.) ; ; ; registers in loop ; w0 work ; w1 share-addr ; w2 cf-buf-ref also saved in save-cf-buf-ref-p ; w3 list-addr also saved in rec-no-rel-zb ; rs. w2 (j35.) ; save-cf-buf-ref-p:= cf-buf-ref rl w3 x2+b61 ; list-addr:= victim-zb a4: ; rep: rl w1 x3 ; bz w0 x1 ; if operation(share(list-addr)) <> se w0 f5 ; write-oper then jl. a7. ; goto next share ; ; the share has been updated, and perhaps the transfer has been ini- ; tialized but not checked. ; rs w3 x2+b58 ; save-list-addr in rec-no-rel-zb al w0 x1-6 ; w0:= normal share-descriptor address rl w3 x2+b5 ; w3:= rec-base-addr-zb rs w0 x3+h0+4 ; used-share-zd:= current share rl w0 x1-6 ; se w0 0 ; if share-state <> checked then \f ; rc 10.09.79 rc4000 code procedure, connected files page 14.10 ; jl. a6. ; goto check-transfer ; ; init transfer by send message. ; w1 points already to the message, w3 should point to the name of the ; area process. al w3 x3+h1+2 ; rl. w2 (j185.) ; w2:= rs_current_activity jd 1<11+16 ; send message ; ; if no message buffer available then provoke break 6 by wait answer sn w2 0 ; jd 1<11+18 ; wait-answer ; rs w2 x1-6 ; share-state:= w2:= buffer-address rl. w2 (j35.) ; fetch save-cf-buf-ref-p ; a6: ; check-transfer: rl w0 x2+b5 ; w0:= zone-descriptor address ls w0 4 ; shift 4 rl. w1 j133. ; w1:= entry point check dl. w3 (j130.) ; w2:= saved-stack-ref jl. w3 (j104.) ; goto rs take expression ds. w3 (j130.) ; save stack-ref rl. w2 (j35.) ; fetch save-cf-buf-ref-p rl w3 x2+b58 ; fetch list-addr from rec-no-rel-zb al w0 f6 ; operation(share(list-addr)):= hs w0 (x3) ; read-oper ; a7: ; next share: al w3 x3-2 ; list-addr:= list-addr - 2 sl w3 x2+b62 ; if list-addr >= addr of block-table-share jl. a4. ; then goto rep ; rl. w3 (j24.) ; goto return-2-p rl w3 x3 ; jl. (j23.) ; ; i. e. ; end write-back \f ; rc 05.11.71 rc4000 code procedure, connected files page 14.11 ; g3=k-j0 c. g3-506 m. code on segment 14 too long z. c. 502-g3 0,r. 252-g3>1 ; fill the segment with zeroes z. <:cf-system14:> i. e. m. end segment 14 \f ; rc 05.01.72 rc4000 code procedure, connected files page 15.1 ; ; this segment contains: ; init-blocks ; subroutine getparam ; subroutine setparam ; call-alarmproc ; b. g3, j150 ; code segment 15 w. f0=f0+1 ; increase segm.count k=f4 ; k:= first k-value h. j0: g1, g2 ; head-word: last point, last abs word j1: 1<11 o.(: 1-f0:), 0 ; ref. to segm.1 j4: 1<11 o.(: 4-f0:), 0 ; ref. to segm.4 j14: 1<11 o.(:14-f0:), 0 ; ref. to segm.14 j31: 0 , 21 ; work_1_p j32: 0 , 23 ; work_2_p j33: 0 , 25 ; proc-no-p j36: 0 , 31 ; alarmno-p j103: f1 + 3, 0 ; rs reserve j105: f1 + 5, 0 ; rs goto point j130: f1 + 30, 0 ; rs saved stack ref, saved w3 g2=k-2-j0 ; rel last abs word g1=k-2-j0 ; rel last point w. \f ; rc 21.04.71 rc4000 code procedure, connected files page 15.2 ; ; init-blocks ; ; file-n subroutine. ; ; the procedure initializes all the blocks, which are included in a ; list-file. ; the procedure is only called from set-mode-n, and returns to a speci- ; fic point in that procedure. ; ; entry exit ; w2 cf-buf-ref cf-buf-ref ; other registers are undef ; ; no current record must exist when init-blocks is called, and no cur- ; rent record exists at return. ; b. a20, c20 ; begin init-blocks w. d82: d83=k-j0 ; entry: ; ; use last-used-share for the initialization, no updated block is in ; the share. ; rl w1 x2+b63 ; rl w3 x1+2 ; w3:= block-ref-zb:= al w3 x3-f20 ; first-storage-address - f20 rs w3 x2+b57 ; rl w1 x1+4 ; w1:= last-storage-address ; al w0 1 ; word(last-storage-address):= rs w0 x1 ; marking-of-last-word:= 1 ; al w0 0 ; a0: ; set-zeroes: al w1 x1-2 ; put zeroes from last-storage-address - 2 rs w0 x1 ; until block-ref sl w1 x3+2 ; if addr > block-ref then jl. a0. ; goto set-zeroes ; rl w1 x2+b55 ; free-bytes:= ls w1 -3 ; max-free-shift-3-zb shift (-3) hs w1 x3+f20 ; ; rl w1 x2+b54 ; free-rec-nos:= hs w1 x3+f21 ; recs-in-block-zb ; so w1 1 ; free-base-rel:= al w1 x1-1 ; if recs-in-block is odd then rs w1 x3+f22 ; recs-in-block else recs-in-block - 1 ; al w1 -1 ; over-flow-block:= -1 rs w1 x3+f23 ; \f ; rc 01.10.77 rc4000 code procedure, connected files page 15.3 ; ; initialize the record-table, the table is initialized in the same ; way for fix-rec-size and variable rec-size ; ; registers ; w0 rec-base-rel (even = not used record) ; w1 rec-no-rel ; w2 cf-buf-ref ; w3 block-ref ; al w0 -1 ; wa w0 x3+f22 ; rec-base-rel:= free-base-rel - used-bit al w1 0 ; rec-no-rel:= 0 ; a1: ; next-rec-no: am x3 ; rec-base-rel(block-ref hs w0 x1 ; + rec-no-rel):= rec-base-rel ; wa w0 x2+b56 ; rec-base-rel:= rec-base-rel ; + fix-rec-size-zb al w1 x1+1 ; rec-no-rel:= rec-no-rel + 1 se w1 (x2+b54) ; if rec-no-rel < recs-in-block-zb then jl. a1. ; goto next-rec-no ; ; now last-used share has been initialized, and it should be written ; back in the needed number of copies by means of write-back. am (x2+b61) ; rl w0 +8 ; block-no:= old-blocks-in-file la. w0 c0. ; remove fill_percentage a2: ; next-block: rs w0 x2+b64 ; save block-no in block-zb wm w0 x2+b53 ; segm-no:= block-no * segs-in-block-zb wa w0 x2+b52 ; + segs-in-head-zb rl w1 x2+b63 ; w1:= share-addr(last-used-share) rs w0 x1+6 ; store-segm-no in share ; al w0 f5 ; put-block hs w0 x1 ; ; rl. w0 j0. ; rl. w3 (j14.) ; jl w3 x3+d91 ; write-back ; al w0 1 ; block-no:= block-zb + 1 wa w0 x2+b64 ; se w0 (x2+b59) ; if block-no < new-blocks-in-file-zb then jl. a2. ; goto next-block \f ; rc 01.10.77 rc4000 code procedure, connected files page 15.4 ; ; set constants: ; all new blocks have now been initialized, and it only remains to ; adjust the block-table accordingly. ; rl w3 x2+b61 ; pointer to block_table rl w1 x3+8 ; fill_percentage , blocks_in_file la. w1 c1. ; change blocks_in_file to lo w1 x2+b59 ; new_blocks_in_file rs w1 x3+8 ; ; rl w1 x2+b59 ; w1:= new_blocks_in_file_zb wm w1 x2+b54 ; last-rec-no-zb:= new-blocks-in-file-zb rs w1 x2+b60 ; * recs-in-block-zb rs w0 x2+b59 ; new-blocks-in-file-zb:= 0 (wm w1) ; al w0 f5 ; hs w0 (x2+b62) ; put block-table; rl. w3 (j14.) ; jl x3+d85 ; goto return-from-init-blocks ; ; constants and variables: c0: f51 ; mask for blocks_in_file c1: f52 ; - fill_percentage i. e. ; end init-blocks \f ; rc 01.10.77 rc4000 code procedure, connected files page 15.5 ; ; ; subroutine get_param ; ; the routine is called from the parameter-administration ; in get_param_cf (segment 16) ; ; the routine takes a parameter-value from the zonebuffer of a ; list-file, and stores it at the wanted value-address. work_1_p ; contains the parameter-no: ; 1 = dead-bytes ; 2 = used-bytes ; 3 = fill-percentage ; ; call return ; w0: undef result (1 = ok, 0 = not_ok) ; w1: value-address undef ; w2: cf_buf_ref undef ; w3: return_address undef ; b. a5, c5 ; begin block get_param w. d46: d47=k-f4 ; get_param: al w3 x3+2 ; modify return_addr; rs. w3 c0. ; save return_addr; rs. w1 (j32.) ; work_2_p:= value_address; rl. w1 (j31.) ; param_no:= w1:= work_1_p; ; ks 101 sl w1 1 ; if param_no < 1 or param_no > 3 then sl w1 4 ; goto result_not_ok; jl. a2. ; ; ls w1 1 ; new_param_no:= w1:= param_no * 2; am (x2+b61) ; addr:= victim_zb + new_param_no; dl w0 x1+2 ; w3w0:= dbl_word(addr+2); ; comment dead_bytes - used_bytes.upper part, ; used_bytes , ; used_bytes.low part - fill_percentage, blocks_in_file; ; ks 102 sn w1 4 ; if used_bytes rx w3 0 ; ** then return only low part ** se w1 6 ; if new_param_no <> 6 then jl. a1. ; goto store_param; \f ; rc 01.10.77 rc4000 code proce ure, connected files page 15.6 ; ; extract fill_percentage: ; w0 = fill_percentage,blocks_in_file ; w1 = param_no ; w2 = cf_buf_ref ; al w3 0 ; move fill_percentage ld w0 f53 ; to w3 ; ks 115 ; a1: rl. w2 (j32.) ; store_param: rs w3 x2 ; addr:= work_2_p; ; word(addr):= param_value; ; (dead_bytes, used_bytes or fill_percent) ; ks 121 ; am 1 ; result_ok: a2: al w0 0 ; result_not_ok: ; ks 122 jl. (c0.) ; goto return; ; c0: 0 ; save return c1: 100 ; i. e. ; end block get_param; \f ; rc 01.10.77 rc4000 code procedure, connected files page 15.7 ; ; ; subroutine set_param ; ; the routine is called from the parameter-administration ; in set_param_cf (segment 16) ; ; the routine inserts a new fill_percentage in the zonebuffer of a ; listfile. the fill_percentage is ; given in work_2_p. work_1_p contains the param_no which must ; be = 3. ; ; call return ; w0: undef result (1 = ok, 0 = not_ok) ; w1: undef undef ; w2: cf_buf_ref undef ; w3: return_address undef ; b. a5, c5 ; begin block set_param w. d48: d49=k-f4 ; set_param: rs. w3 c0. ; save return; rl. w0 (j31.) ; param_no:= work_1_p; ; ks 151 se w0 3 ; if param_no <> 3 then jl. a0. ; goto result_not_ok; ; rl. w1 (j32.) ; fill_percentage:= work_2_p; ; ks 152 sl w1 1 ; if fill_percentage < 1 or sl w1 101 ; fill_percentage > 100 then jl. a0. ; goto result_not_ok; ; al w0 f5 ; put-block-table; hs w0 (x2+b62) ; rl w2 x2+b61 ; pointer to block_table rl w0 x2+8 ; old fill_percentage , blocks_in_file la. w0 c1. ; remove - ls w1 24-f53 ; position new - lo w0 2 ; merge with blocks_in_file rs w0 x2+8 ; ; ks 164 ; am 1 ; result_ok: a0: al w0 0 ; result_not_ok: ; ks 171 jl. (c0.) ; goto return; ; c0: 0 ; save return c1: f51 ; mask for blocks_in_file i. e. ; end block set_param; \f ; rc 05.01.72 rc4000 code procedure, connected files page 15.8 ; ; ; subroutine call-alarmproc. ; ; the subroutine is called from alarm on segment 1, it will call the ; user procedure specified in formal-jump-proc-zb. ; the return from the user procedure is directed directly to alarm. ; ; call ; w0 relative return on segment 1 ; w1 undef ; w2 undef ; w3 undef ; b. a5, c5 ; begin call-alarmproc w. d52: d53=k-j0 ; al w1 -22 ; jl. w3 (j103.) ; rs reserve(22 bytes) ; dl. w3 (j130.) ; w2:= rs saved stackref rs w2 x1 ; store it in stacktop ; rl. w3 j1. ; segm.tbl.addr. of segm.1 ds w0 x1+4 ; store segm.tbl.addr. and rel.return ; al w0 22-6 ; store appetite hs w0 x1+4 ; ; rl. w3 c0. ; formal 1.1:= zone formal.1 rl w0 x2+8 ; formal 1.2:= old formal 1.2:= z ds w0 x1+8 ; ; al w3 26 ; formal 2.1:= integer kind al w0 x1+19 ; formal 2.2:= literal-1 ds w0 x1+12 ; ; al w0 x1+21 ; formal 3.1:= integer kind ds w0 x1+16 ; formal 3.2:= literal-2 ; rl. w3 (j33.) ; literal-1:= - procno-p ac w3 x3 ; rl. w0 (j36.) ; literal-2:= alarmno-p ds w0 x1+21 ; ; rl w2 x2+6 ; w2:= cf-buf-ref:= old formal 1.1 dl w1 x2+b4+2 ; w0w1:= formals-jump-proc-zb jl. (j105.) ; rs goto point ; c0: 6<12 + 23 ; zone formal.1 i. e. ; end call-alarmproc \f ; rc 05.01.72 rc4000 code procedure, connected files page 15.9 ; g3=k-j0 c. g3-506 m. code on segment 15 too long z. c. 502-g3 0, r. 252-g3>1 ; zero fill z. <:cf-system15:> i. e. m. end segment 15 \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.1 ; ; this segment contains the cf-procedures: ; set_jumps_cf ; get_param_cf ; set_param_cf ; and the subroutine: ; change_bit ; b. g20, j150 ; code segment 16: f0=f0+1 ; increase segment count k=f4 h. j0: g1, g2 ; headword: last_point, last_absword j1: 1<11 o.(:1-f0:), 0 ; segment 1 j2: 1<11 o.(:2-f0:), 0 ; - 2 j5: 1<11 o.(:5-f0:), 0 ; - 5 j15: 1<11 o.(:15-f0:),0 ; - 15 j31: 0 , 21 ; work_1_p j32: 0 , 23 ; work_2_p j33: 0 , 25 ; cf_proc_no j103: f1+ 3, 0 ; rs-entry 3, reserve j104: f1+ 4, 0 ; - 4, take_expression j108: f1+ 8, 0 ; - 8, end_address_expression j112: f1+12, 0 ; - 12, uv j113: f1+13, 0 ; - 13, last_used j130: f1+30, 0 ; - 30, saved_stack_ref, saved_w3 g2 = k-2-j0 ; relative of last abs-word g1 = k-2-j0 ; - - - point w. ; ; ; ; work_1_p and work_2_p are used for storing param-pairs: ; content in cf-proc: set_jumps get_param set_param ; ; work_1_p: procno paramno paramno ; work_2_p: results value-addr value ; ; ; obs. the segment does only contain room enough for ; 30 of the 44 ks-instructions. ; ; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.2 ; ; ; ; procedure set_jumps_cf(z, jump_proc) ; one or more pairs:(cf_proc_no, results); ; procedure get_param_cf(z) one or more pairs:(paramno, val); ; procedure set_param_cf(z) one or more pairs:(paramno, val); ; ; zone z; ; procedure jump_proc; ; integer cf_procno, results, paramno, val; ; ; the procedures are placed in one block, as they have a common ; entry-administration get_parameter_pair, but the very getting and ; setting of parameter-values by get-/set-param-cf in a listfile ; is placed at segment 15. ; ; ; set_jumps_cf: ; makes the procedure jump_proc be called at exit from a cf_proce- ; dure with the number cf_proc_no, when result_cf equals one of the ; digits in results. ; ; get_param_cf: ; yields the values of the specified parameters from the zonebuffer ; of an opened cf-file ; ; set_param_cf: ; inserts the values for the specified parameters into the zonebuffer ; of an opened cf-file; ; ; b. a20 ; begin block common administration w. e8=f0-1 ; set_jumps_cf: e9=k-f4 ; am -30+4 ; procno:= 4; ; e60=f0-1 ; get_param_cf: e61=k-f4 ; am -31+30 ; procno:= 30; ; e62=f0-1 ; set_param_cf: e63=k-f4 ; al w1 31 ; procno:= 31; al w0 f39+f49 ; statebits:= all_cf_states; rl. w3 (j2.) ; call prepare; jl w3 x3+d1 ; at return w2 = stackref+6 = cf_buf_ref ; w3 = stackref ; ks 1 rl w0 x2+b15 ; sz w0 1 ; if file_type_zb = 1 (list_file) jl. a2. ; or procno = 4 then rl. w1 (j33.) ; goto check_params; sn w1 4 ; jl. a2. ; ; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.3 ; ; set up stack_picture for call of get_params_i or set_params_i. ; the first five words are set up by call_file_i, the last are moved ; from the original stack; ; ; find new appetite, i.e. the size of the stack without litterals, as ; these are not moved to the new stack. ; the registers are used as follows: ; w0 = param-kind (formal.1) ; w1 = param-addr (formal.2) ; w2 = addr. of formal-pair + 1 ; w3 = stack-ref ; and w3+6 = cf-buf-ref ; w3+8 = formal-limit ; al w0 x3+6+3 ; formal-limit:= w0:= ba w0 x3+4 ; stack-ref + 6 + appetite + 3; rs w0 x3+8 ; al w2 x3+14 ; addr:= w2:= addr of formal-2.2 + 2; ; ks 11 a0: ; next-param: dl w1 x2-2 ; w0w1:= formal-pair; ; ks 12 so w0 16 ; if -,expression then jl. a1. ; begin comment perhaps literal, but in ; any case an address in the stack; sh w1 (x3+8) ; if param-addr <= formal-limit then rs w1 x3+8 ; formal-limit:= param-addr; ; end; a1: al w2 x2+4 ; addr:= addr + 4; ; ks 13 sh w2 (x3+8) ; if addr < formal-limit then jl. a0. ; goto next-param; ; ks 14 ws w2 6 ; w2:= addr - stack-ref; ac w1 x2-4 ; reservation-size:= w1:= -(w2 - 4); al w0 x2-14 ; move-size:= w0:= w2 - 14; ; ks 15 jl. w3 (j103.) ; reserve (reservation-size) bytes; al w1 x1+9 ; base-2:= work-2-p:= new-stack-top + 9; rs. w1 (j32.) ; ; ks 16 dl. w2 (j130.) ; w1:= old-stack-ref; rl w2 x1+6 ; w2:= cf-buf-ref; al w1 x1+9 ; base-1:= w1:= old-stack-top + 9; ; ks 17 rl. w3 (j5.) ; call move_word; jl w3 x3+d9 ; ; rl. w1 (j33.) ; w1:= (cf_proc_no - 18) * 4; al w1 x1-18 ; comment file_i_procno shift 2; ls w1 2 ; rl. w0 j0. ; rl. w3 (j2.) ; call_file_i(get_/set_params_i); jl w3 x3+d37 ; ; ; at return from get_params_i or set_params_i, the procedure-value is ; stored in the uv-register. if the value <> 0, the file_i_proc found ; an parameter-error, and the cf_procedure will call alarm. ; rl. w2 (j112.) ; w2:= uv; ; ks 18 se w2 0 ; if result <> 0 then jl. a8. ; goto exit_i jl. (j108.) ; else goto end-addr-expression; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.4 ; ; check_params: ; ; here the parameter_list for set_jumps_cf or set_/get_param_cf for a ; list_file is checked. the registers are used as follows: ; w0 = working reg. ; w1 = formal_limit ; w2 = stack_ref ; w3 = param_address ; a2: rx w2 6 ; w2:= stack_ref; w3:= cf_buf_ref; al w1 x2+7 ; formal_limit:= formal_1.2:= ba w1 x2+4 ; stack_ref + appetite(stack_ref) + 7; rs w1 x2+8 ; ; ks 21 sh w1 x2+13 ; if formal_limit <= stack_ref + 13 then jl. g7. ; goto exit_zero; comment too few params; rl. w0 (j33.) ; ; ks 22 sn w0 4 ; if cf_proc_no <> 4 then jl. a3. ; begin al w3 x2+14 ; param_addr:= w3:= addr.of formal_2.1; ; ks 23 jl. a5. ; goto first_pair; ; end ; else a3: dl w1 x2+12 ; begin comment check jump_proc_parameter; sz w0 2.11111 ; w0w1:= formal_2; jl. g7. ; if kind(w0) <> procedure then ls w0 -4 ; goto exit_zero; comment no proc; ; ks 25 sh w0 x3 ; if stack_ref(w0) < cf_buf_ref then jl. g7. ; goto exit_zero; comment scope-error; rl w0 x2+10 ; ds w1 x3+b4+2 ; formal_pair_zb:= formal_2; al w3 x2+18 ; param_addr:= w3:= addr.of formal_3.1; ; ks 26 jl. a5. ; goto first_pair; ; end; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.5 ; ; get_parameter_pair: ; checks the next pair of parameters and switches to the proper action ; get_param, set_param or set_jumps ; g4: rl. w2 (j113.) ; next_param_pair: rl w3 x2+10 ; w2:= stack_ref; ; ks 31 am 2 ; param_addr:= w3:= saved_param_addr + 2; a4: al w3 x3+3 ; second_param: param_addr:= param_addr + 3; ; ks 32 a5: sl w3 (x2+8) ; first_pair: jl. g5. ; if param_addr >= formal_limit then ; goto exit_normal; dl w1 x3-1 ; w0w1:= formal_x.1,x.2; rs w3 x2+10 ; save param_addr in formal_2.1; al w3 2.11111 ; la w3 0 ; ; ks 33 sn w3 10 ; if param_kind(w0) <> integer expr then jl. a6. ; begin ; ks 34 se w3 26 ; if param_kind(w0) <> integer_variable jl. g6. ; then goto exit_n; sh w1 (x2+8) ; if param_addr(w1) < formal_limit then rs w1 x2+8 ; formal_limit:= param_addr(w1); ; ks 35 jl. a7. ; end ; else a6: jl. w3 (j104.) ; take_expression and ds. w3 (j130.) ; save_stack_ref; ; ks 36 ; a7: rl w3 x2+10 ; w3:= param_addr; rl w0 x1 ; formal_2(param_addr):= w0:= value(addr); rs w0 x3-1 ; ; ks 37 so w3 1 ; if param_addr even then jl. a4. ; goto second_param; ; rl w3 x3-5 ; work_1_p:= w3:= value(first_param); ds. w0 (j32.) ; work_2_p:= w0:= value(second_param); ; w1 = addr (second_param); ; ks 38 rl w2 x2+6 ; w2:= cf_buf_ref; rl. w0 (j33.) ; ; ks 39 sn w0 4 ; if cf_proc_no = 4 then jl. g8. ; goto set_jumps rl. w3 (j15.) ; else sn w0 30 ; if cf_proc_no =30 then jl w3 x3+d47 ; goto get_param jl w3 x3+d49 ; else goto set_param; ; ; return from get_param or set_param: se w0 0 ; if result_ok then jl. g4. ; goto next_param_pair else jl. g6. ; goto exit_n; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.6 ; ; exits: ; g5: ; exit_normal: so w3 1 ; jl. (j108.) ; if param_addr even then goto end_addr_expr; ; comment result ok; g6: rl. w2 (j113.) ; exit_n: (error at param-pair no n) rl w3 x2+10 ; w2:= stack_ref; w3:= param_addr; ws w3 4 ; w2:= param_pair_no:= al w2 x3-6 ; (param_addr - stack_ref - 6) // 8; ls w2 -3 ; jl. a9. ; goto alarm_38; a8: sn w2 -1 ; exit_i: if error_no = -1 then g7: al w2 0 ; exit_zero: error_no:= 0; a9: al w1 38 ; alarm_38: rl. w3 (j1.) ; alarm_no:= 38; jl w3 x3+d35 ; call alarm; ; i. e. ; end common administration; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.7 ; ; set_jumps: ; insert testbits in jumpspec-words in the zonebuffer. ; the actual parameter-pair is stored in g12, g13: ; g12 = procno (first parameter) ; g13 = results (second param), each resultno is one decimal digit. ; cf_buf_ref is taken from formal_1.1 (at entry w2 = stack_ref). ; b. a20, c20 ; begin block set_jumps w. g8: rl. w1 (j32.) ; set_jumps: sh w1 -1 ; result:= w1:= second_parameter; jl. g6. ; if result < 0 then goto exit_n; rs. w2 c0. ; store cf_buf_ref; ; next_setbit: a0: al w0 0 ; setbit:= w0:= result mod 10; (last digit) wd. w1 c1. ; result:= result // 10; ds. w1 c6. ; save setbit and new result; rl. w3 (j31.) ; procno:= w3:= first_parameter; ; ks 103 sh w3 0 ; al w3 30 ; if procno <= 0 then procno:= max_procno; ; ks 104 rs. w3 c3. ; save new_procno; ; ; load segment 2 into the core and add the segm.table-address to ; procno, so that the testshift-value-table can be addressed directly. ; rl. w3 (j2.) ; w3:= segm_tbl_addr(segm_2); rl w2 x3+d39 ; now the testshift-table will stay in core ; as long as segm.alloc. is not changed. ; ks 105 wa. w3 c3. ; w3:= segm_tbl_addr + procno ; ; find the relevant testshift_word for actual procno and setbit. ; the registers are used as follows: ; w0 = setbit ; w1 = addr. of testshift-word in zonebuffer ; w2 = working reg. and bitno ; w3 = procno + segm_tbl_addr(segm_2) ; a1: bl w2 x3+d39 ; find_test_shift_word: rs. w2 c2. ; save last_bitno for procno; bs w2 x3+d39-1 ; w2:= no_of_results for procno; ; ks 112 se w2 0 ; if no_of_results = 0 or sl w0 x2+1 ; setbit > no_of_results then jl. a5. ; goto next_proc; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.8 ; ; ; rl. w1 c0. ; find addr.of testshift_word: bl w2 x3+d39-1 ; w1:= cf_buf_ref; wa w2 0 ; bitno:= w2:= ; ks 113 sh w2 23 ; testshift_value(procno) + setbit; jl. a2. ; comment 7 <= bitno <= 59; sl w2 48 ; am 2 ; w1:= addr_of_testshift_word:= am 2 ; cf_buf_ref + b3 + a2: al w1 x1+b3 ; (if bitno >= 48 then 4 else ; if bitno >= 24 then 2 else 0); ; ks 114 ; sn w0 0 ; if setbit <> 0 then goto set_testbit jl. a3. ; else goto clear_testbits; ; ; set_testbit: ; snapshot: w1 = addr.of relevant testshift-word ; w2 = bitno for setbit ; al w0 1 ; bitmode:= 1; ; ks 121 jl. w3 g11. ; call change_bit (set_mode); jl. a5. ; goto next_proc; ; ; clear_testbits: ; snapshot: w0 = 0 (setbit) ; w1 = addr.of relevant testshift-word ; w2 = bitno before first bit to be removed ; w3 = c4 = procno + segm_tbl_addr(segm_2) ; a3: al w2 x2+1 ; clear_next: ; ks 131 se w2 24 ; bitno:= bitno + 1; sn w2 48 ; if bitno = 24 or bitno = 48 then al w1 x1+2 ; addr_of_testshift_word:= next_addr; ; ks 132 jl. w3 g11. ; call change_bit (clear_mode); sl. w2 (c2.) ; if bitno < last_bitno then jl. a5. ; goto clear_next else jl. a3. ; goto next_proc; ; ; next_proc: ; a5: rl. w3 c3. ; w3:= procno; al w3 x3-1 ; procno:= procno - 1; ; ks 141 am. (j31.) ; sh w3 (0) ; if procno <= procparam then jl. a6. ; goto next_result; rs. w3 c3. ; save procno; wa. w3 (j2.) ; modified_procno:= procno + segm_tbl_addr; rl. w0 c5. ; w0:= setbit; jl. a1. ; goto find_testshift_word; \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.9 ; ; next_result: ; a6: rl. w1 c6. ; ; ks 151 se w1 0 ; if result <> 0 then jl. a0. ; goto next_setbit; ; ; set or clear bit 0 in first testshift_word, to indicate if any test- ; shifts at all. ; am. (c0.) ; w1:= addr_of_1.testshift_word; al w1 b3 ; al w2 0 ; bitno:= 0; dl. w0 (j32.) ; w3w0:= first_param, sec_param; ; ks 161 sn w0 0 ; se w3 0 ; if first_param <> 0 or sec_param <> 0 al w0 1 ; then call change_bit (set_mode) ; ks 162 jl. w3 g11. ; else call change_bit (clear_mode); ; ; ks 163 jl. g4. ; goto next_param_pair; ; ; local constants: ; c0: 0 ; save cf_buf_ref c1: 10 ; divisor:= 10; c2: 0 ; save last_bitno for procno c3: 0 ; save procno c5: 0 ; save setbit c6: 0 ; save result i. e. ; end block set_jumps \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.10 ; ; subroutine change_bit; ; the routine inserts or removes a bit in one of the 3 testshift- ; words in the zonebuffer. bitno is a number in the interval 0-71, ; which depicts a bit in testshiftword 1 (bitno < 24), 2 or 3. ; if bitmode = 1 a 1-bit will be inserted at this place, otherwise ; a zero will be inserted. ; ; call return ; w0: bitmode undef ; w1: addr_of_testshift_word addr_of_testshift_word ; w2: bitno bitno ; w3: return_addr undef ; b. a5, c5 ; begin block change_bit w. g11: rs. w3 c0. ; save return; ; ks 201 ac w3 x2 ; w3:= reduc_bitno:= sh w3 -48 ; - (bitno mod 24); al w3 x3+48 ; sh w3 -24 ; al w3 x3+24 ; ; ks 202 se w0 1 ; if bitmode = 1 then goto set_one jl. a1. ; else goto set_zero; ; ; set_one: ls w0 x3+23 ; testbit:= 1 shift (reduc_bitno + 23); ; ks 203 lo w0 x1 ; testshift_word:= ; ks 204 rs w0 x1 ; testshift_word add testbit; jl. (c0.) ; goto return; ; a1: rs. w3 c2. ; set_zero: ; ks 211 dl. w0 c1. ; c2:= reduc_bitno; ; ks 212 am. (c2.) ; testbit:= mask shift (reduc_bitno + 23); ld w0 23 ; comment 11...101...11; ; ks 213 la w3 x1 ; testshift_word:= ; ks 214 rs w3 x1 ; testshift_word minus testbit; jl. (c0.) ; goto return; ; c0: 0 ; save return_address -2 ; mask for clear testbit, first word c1: -1 ; - - - - , sec. - c2: 0 ; save reduc_bitno i. e. ; end change_bit \f ; rc 01.11.71 rc4000 code procedure, connected files page 16.11 ; ; g3=k-j0 c. g3-506 m. code on segment 16 too long z. c. 502-g3 0,r. 252-g3>1 z. <:cf-system16:> m. segment 16 i. e. \f ; rc 06.12.74 rc4000 code procedure, connected files page tails.1 \f ; rc 06.12.74 rc4000 code procedure, connected files page t.1 i. ; e. ; end slang segment ; ; tails to be inserted in catalog g0: ; first tail: ; result_cf ; result_cf becomes the area entry in cat. f0 ; no of segments 0,r.4 ; dummy 27 ; address: byte 27 permanent core 9<18, 0 ; integer variable 4<12+f2 ; rel start of external list f0<12+f3 ; code segments, bytes in permanent core ; rec_no_cf 1<23+4, 0,r.4 11 9<18, 0 ; integer variable 4<12+f2, f0<12+f3 ; init_file_m 1<23+4 0,r.4 1<23+e4<12+e5 1<18+14<12+14<6+19 ; procedure(zone, string, intaddr, 9<18+8<12 ; realval, realval) 4<12+f2, f0<12+f3 ; open_cf 1<23+4 0,r.4 1<23+e6<12+e7 ; rel segm, rel entry 1<18+19<12+9<6+8,0 ; procedure(zone,string,intaddr) 4<12+f2 f0<12+f3 ; set_jumps_cf 1<23+4, 0,r.4 1<23+e8<12+e9 1<18+39<12+31<6+8,0 ; procedure(zone,procedure,general) 4<12+f2, f0<12+f3 ; ; init_chain 1<23+4, 0,r.4 1<23+e10<12+e11 1<18+20<12+19<6+8 ; procedure(zone,zone,intaddr,realaddr) 8<18 4<12+f2, f0<12+f3 ; close_cf 1<23+4, 0,r.4 1<23+e12<12+e13 1<18+12<12+8<6, 0 ; procedure(zone,boolean) 4<12+f2, f0<12+f3 ; get_m 1<23+4, 0,r.4 1<23+e16<12+e17 1<18+26<12+8<6, 0 ; procedure(zone, real array) 4<12+f2, f0<12+f3 ; get_l 1<23+4, 0,r.4 1<23+e18<12+e19 1<18+19<12+20<6+8,0 ; procedure(zone,realaddr,intaddr) 4<12+f2, f0<12+f3 ; get_head 1<23+4, 0,r.4 1<23+e20<12+e21 1<18+26<12+20<6+8,0 ; procedure(zone,realaddr,real array) 4<12+f2, f0<12+f3 ; insert_m 1<23+4, 0,r.4 1<23+e22<12+e23 1<18+26<12+8<6, 0 ; procedure(zone, real array) 4<12+f2, f0<12+f3 ; insert_l 1<23+4, 0,r.4 1<23+e24<12+e25 1<18+26<12+19<6+20 ; procedure(zone,realaddr,intaddr,real array) 8<18 4<12+f2, f0<12+f3 ; connect 1<23+4, 0,r.4 1<23+e26<12+e27 1<18+19<12+20<6+20 ; procedure(zone,realaddr,realaddr,intaddr) 8<18 4<12+f2, f0<12+f3 ; delete_m 1<23+4, 0,r.4 1<23+e28<12+e29 ; 1<18+8<12, 0 ; procedure(zone) 4<12+f2, f0<12+f3 ; delete_l 1<23+4, 0,r.4 1<23+e30<12+e31 1<18+20<12+8<6, 0 ; procedure(zone,realaddr) 4<12+f2, f0<12+f3 ; delete_chain 1<23+4, 0,r.4 1<23+e32<12+e33 1<18+20<12+8<6, 0 ; procedure(zone,realaddr) 4<12+f2, f0<12+f3 ; next_m 1<23+4, 0,r.4 1<23+e34<12+e35 1<18+8<12, 0 ; procedure(zone) 4<12+f2, f0<12+f3 ; put_cf 1<23+4, 0,r.4 1<23+e36<12+e37 1<18+8<12, 0 ; procedure(zone) 4<12+f2, f0<12+f3 ; read_only_cf 1<23+4, 0,r.4 1<23+e38<12+e39 1<18+8<12, 0 ; procedure(zone) 4<12+f2, f0<12+f3 ; read_upd_cf 1<23+4, 0,r.4 1<23+e40<12+e41 1<18+8<12, 0 ; procedure(zone) 4<12+f2, f0<12+f3 ; update_all_cf 1<23+4, 0,r.4 1<23+e42<12+e43 1<18+8<12, 0 ; procedure(zone) 4<12+f2, f0<12+f3 ; get_numb_l 1<23+4, 0,r.4 1<23+e46<12+e47 1<18+19<12+8<6, 0 ; procedure(zone,intaddr) 4<12+f2, f0<12+f3 ; init_rec_m 1<23+4, 0,r.4 1<23+e56<12+e57 1<18+26<12+8<6, 0 ; procedure(zone,real array) 4<12+f2, f0<12+f3 ; get_param_cf 1<23+4, 0,r.4 1<23+e60<12+e61 1<18+39<12+8<6, 0 ; procedure(zone,general) 4<12+f2, f0<12+f3 ; set_param_cf g1: 1<23+4, 0,r.4 ; last tail: 1<23+e62<12+e63 1<18+39<12+8<6, 0 ; procedure(zone,general) 4<12+f2, f0<12+f3 m. rc 10.9.71 cf-system ▶EOF◀