|
|
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: 23808 (0x5d00)
Types: TextFile
Names: »copyareatx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »copyareatx «
mode list.yes listing.no
(
if listing.yes
(listcopy=set 50
if ok.no
finis
o listcopy
(copyarea=slang xref.yes
copyarea)
if ok.no
c=message ok.no
o c
convert listcopy std)
if listing.no
(copyarea=slang
copyarea)
)
copyarea)
\f
;
; fgs 1984.01.19 algol 8, copy area page ... 1...
;
;
;integer
;procedure copyarea (zmaster, zarea, ztape, blocksize);
;value blocksize ;
;zone zmaster, zarea, ztape ;
;integer blocksize ;
;
;call : copyarea (zmaster, zarea, ztape, blocksize);
;
;function :
;
;The procedure sends a copy message to the process determined
;by the zone zmaster concerning the backing storage area deter-
;mined by the zone zarea and the magnetic tape determined by
;the zone ztape.
;The message is sent in used share and a possible pending next
;share is waited for and checked by the runtime system procedu-
;re check.
;
; copyarea
; return value, integer. The number of segments speci-
; fied in the message sent.
;
; zmaster call and return value, zone. Determines the document,
; the buffering (no of shares) and the position of the
; document (used share).
; The zonestate must be after open, the mode 0 or 1
; meaning without or with tapemark after completion
; and the kind must be 0 (internal process) to ensure
; proper standard actions on stopped (repeat transfer).
; At call the position of the tape must be recorded in
; file and block count of the zone, at return the new
; position is recorded, i.e. just remember to set the
; position in file and block count once before the first
; call.
; At call the length of used share must be at least 20 hwds
; (room to contain twice name and name table address)
; At return (and in the block procedure) the zone record of
; 20 hwds contains the names and name table addresses of the
; documents concerned in the copy operation described in the
; next share, which is now used share.
;
; zarea call value, zone. Determines the document and the
; position of the document (backing storage area).
; The zone kind must be 4 (backing storage area).
; The zone state must be after open and the position
; determines the first segment to be transferred,
; while the no of segments to be transferred is de-
; termined by the first segment and the size of the
; area.
;
; ztape call value, zone. Determines the document , the
; buffering and the position of the document (mag
; tape).
; The zone kind must be 18 (magnetic tape).
; At call the zone state must be after open and po-
; sition.
; The zone mode determines the tape mode to be used.
;
; blocksize
; call value, integer. The blocksize in segments per
; block to be used.
;\f
;
; fgs 1984.03.08 algol 8, copy area page ... 2...
;
;
;Details :
;
; The message sent in used share of zmaster will be :
;
; zmaster.used share.message : 14<12 + mode
; + 2 : (reserved)
; + 4 : addr of area process
; + 6 : first segment
; + 8 : number of segments
; +10 : addr of tape process
; +12 : tape mode
; +14 : blocksize
;
; where :
;
; mode is taken from zmaster.modekind and means :
; 0 : no file mark is written
; 1 : a file mark is written on the tape after the area
;
; reserved is reserved for the procedure copyarea (= first shared)
;
; addr area process is the address of the area process whose document is
; to be transferred to tape. It is taken from zarea.name
; table address The name is taken from ztape.document
; name and stored together with name table address in
; zmaster.used share.first shared + 0:8
;
; first segment is the first segment of the area to be transferred and
; is taken from zarea.segment count
;
; no of segments is the number of segments to be transferred to tape and
; is computed as area size - zarea.segment count
;
; addr tape process is the address of the magnetic tape process where to
; to transfer the backing storage area segments It is
; taken from ztape.name table address while the name is
; taken from ztape.docname and stored together with name
; table address in zmaster.used share.first shared + 10.
;
;\f
;
; fgs 1984.02.09 algol 8, copy area page ... 3...
;
;
;
; tape mode is the tape mode to be used in the operation and is ta-
; ken from ztape.modekind :
;
; mode =
; block gap length < 9 + speed < 7 + density < 2 + parity
;
; block gap length being
;
; 0 : standard gap length
; 1 : long gap length
;
; speed being
;
; 0 : automatic velocity control
; 1 : high speed (100/75 ips) when strapped for avc
;
; 0 : start/stop (25 ips)
; 1 : streaming (100/75 ips) when strapped for fixed
;
; density being
;
; 0 : high density (mto/mte or gcr)
; 1 : low density (nrz/nrze)
;
; parity being
;
; 0 : odd parity
; 1 : even parity
;
; blocksize is the blocksize in segments/block to be used on
; the tape
;
; The message is sent with current activity number in w2, the used share
; is incremented modulo no of shares in zmaster and used share is waited
; for and checked by means of rs entry check, possibly implicitly passi-
; vated before the wait, governed by the give up mask in zmaster
;
;\f
;
; fgs 1984.02.09 algol 8, copy area page ... 4...
;
;
;
; The answer is supposed to be :
;
; answer : status
; + 2 : no of segments transferred
; + 4 : (unused)
; + 6 : file count
; + 8 : block count
;
; where :
;
; status means :
;
; 1 shift 0 : give up
; 1 shift 1 : normal answer
;
; 1 shift 2 :
; 1 shift 3 :
; 1 shift 4 : dummy answer from monitor concerning the master
; 1 shift 5 : process, no other status error
;
; 1 shift 6 :
; 1 shift 7 : are not generated by the check routine
;
; 1 shift 8 : stopped is generated by the master process
;
; 1 shift 12: are the device status bits
; to
; 1 shift 23: coming from the device
;
; no of segments transferred is the number of segments transferred with-
; out status error
;
; file count is the position of the next block on the tape after the
; block count operation, being :
;
; next file, block no zero if tape mark was requested
; curr file, next block if tape mark was not requested
;
; In case of status error, the position is after the last
; block transferred without error
; If no of segments transferred = 0, file and block count
; are undefined
;
;\f
;
; fgs 1985.02.09 algol 8, copy area page ... 5...
;
;
;
; The answer is received by the runtime system procedure check in the
; resident runtime system entry "latest answer", entry no 101, and the
; check according to kind = zero implies that :
;
; - the block procedure of the zone zmaster is called in case of user bits
; found in the status word or in case of hard error bits among the re-
; maining bits (i.e. all except special, write enable and normal answ-
; er), but first after
;
; - standard error actions are performed on special bits among the remai-
; ning bits (stopped, end of document) being :
;
; stopped : repeat all the shares and recheck used share
; e. o. d.: call users block procedure with hard error bit set
;
; The stopped action, though, will be prevented by user specified :
; parity error, timer, data overrun, blocklength, end of document,
; tape mark/attention, read error (disc error after recovery), word
; defect, all dummy answers
;
; - the block procedure of the zone zmaster should take over all op-
; erations returned with normal answer in order to keep file count
; and block count of the zone updated
;
; - the block procedure of the zone zmaster may take over operations
; returned with status error, having at its disposal :
;
; +the original message in used share with the addr of the processes
; +the names and name table addresses in used share part of the
; zone buffer
; +the complete answer in rs entry "latest answer"
; +the position after the last checked operation in file and block
; count of zmaster
; +the zone zarea, which maybe has to be closed and reopened (in case
; of multishare operation in zmaster) before it is positioned
; +the zone ztape, which just has to be positioned
;
;\f
;
; fgs 1984.02.09 algol 8, copy area page ... 6...
;
;
;
; If the document in the zone zmaster is an ida process, the dummy an-
; swers from the monitor will be :
;
; result 2 : rejected
; sender not reserver of ida process
; sender not reserver of tape process
; sender not user of area process
;
; result 3 : unintelligible
; illegal mode/tape mode/blocksize
; area/tape process does not exist
; area/tape process not mastered by the same ida process
;
; result 4 : malfunction
;
; result 5 : receiver does not exist
;
; Then, a giveup mask of 1<5 + 1<4 + 1<3 + 1<2 + 1<1 in zmaster will
; cause :
;
; - normal answers to lead to call of block procedure without hard er-
; ror bit set in the status word
;
; - dummy answers to lead to call of block procedure without hard er-
; ror bit set in the status word
;
; - any device status error to lead to call of block procedure with
; hard error bit set in the status word
;
; - the stopped bit (1<8) in status to lead to repeat action (all pend-
; ing shares repeated and used share rechecked) before a possible call
; of block procedure
;
; The block procedure of zmaster should keep file and block count of
; the zone zmaster updated for all normal answers
;
; The block procedure of zmaster may just reposition the zones zarea and
; ztape after a possible reopen of zarea and take over the transfer of
; the area by means of standard i/o (in/out/inoutrec) in the zones, lea-
; ving the proper handling of the device status to the i/o system accord-
; ing to the proper kind and the proper block procedures in the two zo-
; nes
; The share length in ztape, then, should equal blocksize * 512 halfs
; during the transfer
;
;\f
;
; fgs 1984.02.09 algol 8, copy area page ... 7...
;
;
; Note :
;
; The field "first address" of the message built up in the shares of
; zmaster are used internally to equal "first shared" of the actual share
; in order to be able to benefit from the repeat action in check.
; Since it it always initialized by open and assigned by "start transfer"
; in the i/o system, no special care needs to be taken by reuse of the
; zone
;
;
;\f
; fgs 1984.02.09 algol 8, copy area page ... 8...
b. ; block fpnames
d.
p. <:fpnames:>
l.
b. g1, i6 ; block for insertproc
w.
i4 = 0 ; segment count := 0;
i5 = 0 ; own byte count := 0;
s. g4 ; slang segment
w.
b. c3, j94 ; block for segment
w.
g0 = 0 ; no of externals := 0;
k = 1000 ; k assignment to catch missing relatives
h.
c1 : c2 , c3 ; rel last point, tel last abs word
j4 : g0 + 4, 0 ; rs entry 4, take expression
j5 : g0 + 5, 0 ; rs entry 5, goto point
j6 : g0 + 6, 0 ; rs entry 6, end register expression
j13: g0 + 13, 0 ; rs entry 13, last used
j21: g0 + 21, 0 ; rs entry 21, general alarm
j30: g0 + 30, 0 ; rs entry 30, saved sref, w3
j85: g0 + 85, 0 ; rs entry 80, current activity no
j94: g0 + 94, 0 ; rs entry 94, take value integer
c3 = k-2-c1 ; rel last abs word
j33: g0 + 33, 0 ; rs entry 33, check
c2 = k-2-c1 ; rel last point
w.
i2 = k-c1 ; start external list
0 ; no of globals, no of externals
0 ; no of bytes to copy to own core
s3 ; date
s4 ; time
\f
; fgs 1984.02.27 algol 8, copy area page ... 9...
b. a20, b20, d20 ; block for local names in copyarea
w.
i0 = k-c1 ; entry copy area:
rl. w2 (j13.) ; get sref;
ds. w3 (j30.) ; save sref, w3;
jl. a1. ; goto start transfer;
a0: jl. w3 a3. ; wait: wait transfer;
ds. w3 (j30.) ; save sref, w3;
a1: jl. w3 a2. ; start: start transfer;
jl. a0. ; if not startet then goto wait;
jl. w3 a3. ; wait transfer;
; <*w0 = top xferred = recbase + segs xferred*>
ds. w3 (j30.) ; save sref, w3;
rl w1 x2+6 ; w1 := 1.formal (1); <*no of segments in message*>
jl. (j6.) ; goto end register expression;
\f
; fgs 1984.03.08 alol 8, copy area page ...10...
; procedure start transfer;
;
; call: return started: return not started:
;
; w0 : - undefined undefined
; w1 : - next share used share
; w2 : sref sref sref
; w3 : link undefined master zone
;
a2: rs. w3 b2. ; entry: save return;
rl w3 x2+8 ; zone := master zone;
rl w1 x3+h2+6 ; if zone.state except
la. w1 d0. ; buflength error bit <>
se w1 0 ; after open and position then
jl. a10. ; goto state alarm;
rl w1 x3+h0+8 ; no of shares :=
ws w1 x3+h0+6 ; (zone.last share -
al w0 0 ; zone.first share ) //
wd. w1 d1. ; share descr length +
al w1 x1+1 ; 1 ;
rs. w1 b1. ;
rl w1 x3+h0+2 ; buflength :=
ws w1 x3+h0+0 ; (zone.last of buffer -
al w0 0 ; zone.base buffer) //
wd. w1 b1. ; no of shares;
sh w1 19 ; if buflength < 20 then
jl. a9. ; goto buflength alarm;
zl w1 x3+h1+1 ;
se w1 0 ; if zone.kind <> 0 then
jl. a12. ; goto kind alarm;
zl w1 x3+h1+0 ;
sz w1 8.3776 ; if zone.mode logical and 0..01111111110 <> 0 then
jl. a11. ; goto mode alarm;
\f
; fgs 1984.02.29 algol 8, copy area page ...11...
rl w1 x3+h0+4 ; share := zone.used share;
rl w0 x1 ; w0 := master zone.used share.state;
se w0 0 ; if w0 <> 0 then
jl. (b2.) ; goto link;
al w1 x1+6 ; message addr :=
rs. w1 b0. ; zone.used share + 6;
dl w1 x2+20 ; w0w1 := formals (blocksize);
so w0 16 ; if expression then
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; save sref, w3;
al w0 3 ;
la w0 x2+18 ; w0 := type (formal);
jl. w3 (j94.) ; w1 := take value integer (w1);
am. (b0.) ; message.blocksize :=
rs w1 +14 ; w1;
\f
; fgs 1984.10.31 algol 8, copy area page ...12...
rl w3 x2+16 ; zone := tape zone;
zl w1 x3+h1+1 ;
se w1 18 ; if zone.kind <> 18 then
jl. a12. ; goto kind alarm;
rl w1 x3+h2+6 ; if zone.state
la. w1 d0. ; except buflength error bit <>
se w1 0 ; after open and position then
jl. a10. ; goto state alarm;
sn w1 (x3+h1+10) ; if zone.name table addr = 0 then
jl. a8. ; goto connect alarm;
rl w0 (x3+h1+10) ; message.tape process addr :=
; cont (name table addr);
el w1 x3+h1+0 ; message.tapemode :=
la. w1 d2. ; zone.mode
am. (b0.) ; extract 11;
ds w1 +12 ;
rl w3 x2+12 ; zone := area zone;
zl w1 x3+h1+1 ;
se w1 4 ; if zone.kind <> 4 then
jl. a12. ; goto kind alarm;
rl w1 x3+h2+6 ; if zone.state
la. w1 d0. ; except buflengtheror bit <>
se w1 0 ; after open and positioned then
jl. a10. ; goto state alarm;
sn w1 (x3+h1+10) ; if zone.name table addr = 0 then
jl. a8. ; goto connect alarm;
rl w1 (x3+h1+10) ;
am. (b0.) ; message.area process addr :=
rs w1 +4 ; cont (name table addr);
rl w1 x1+18 ; segs := area proc.no of segments;
; message.no of segments :=
rl w0 x3+h1+16 ; segs -
ws w1 0 ; zone.segment count;
am. (b0.) ; message.first segment :=
ds w1 +8 ; zone.segment count;
rs w1 x2+6 ; 1.formal (1) := message.no of segments;
\f
; fgs 1984.03.08 algol 8, copy area page ...13...
rl w3 x2+8 ; zone := master zone;
rl w1 x3+h0+4 ; share := zone.used share;
rl w1 x1+2 ; w1 := share.first shared;
rl w3 x2+12 ; zone := area zone;
al w3 x3+h1+2 ; w3 := zone.document name addr;
al w2 x1 ; w2 := w1;
dl w1 x3+2 ; move
ds w1 x2+2 ; name at w3
dl w1 x3+6 ; to
ds w1 x2+6 ; name space at w2;
rl w1 x3+8 ;
rs w1 x2+8 ; move name table address;
rl. w3 (j13.) ;
rl w3 x3+16 ; zone := tape zone;
al w3 x3+h1+2 ; w3 := zone.document name addr;
dl w1 x3+2 ; move
ds w1 x2+12 ; name at w3
dl w1 x3+6 ; to
ds w1 x2+16 ; name space at w2 + 8;
rl w1 x3+8 ;
rs w1 x2+18 ; move name table address;
rl. w2 (j13.) ; restore sref;
\f
; fgs 1984.02.29 algol 8, copy area page ...14...
rl w3 x2+8 ; zone := master zone;
zl w1 x3+h1+0 ;
al w0 14 ; w0 :=
ls w1 +13 ; 14 shift 12 +
ls w1 -1 ; zone.mode extract
ld w1 +12 ; 11;
rl w1 x3+h0+4 ; w1 :=
rl w1 x1+2 ; zone.used share.first shared;
am. (b0.) ; message.opmode := w0;
ds w1 +2 ; message.reserved := w1;
; <*used in repeat transfer in check to *>
; <*handle stopped *>
rl. w1 b0. ; w1 := message addr;
rl. w2 (j85.) ; w2 := current activity no;
al w3 x3+h1+2 ; w3 := addr (zone.docname);
jd 1<11+16 ; send message (w1, w2, w3);
sn w2 0 ; if buffer claim exceeded then
jd 1<11+18 ; provoke break 6;
al w1 x1-6+h6 ; w1 := used share + share descr length;
rs w2 x1- h6 ; used share.state := message buffer addr;
al w2 x3-h1-2 ; zone := w2 := master zone;
sh w1 (x2+h0+8) ; if w1 > zone.last share then
jl. a4. ; w1 := zone.first share;
rl w1 x2+h0+6 ;
a4: rs w1 x2+h0+4 ; used share := w1;
al w3 20 ;
rl w0 x1+2 ; rec base :=
es. w0 1 ; zone.used share.first shared - 1;
rl w1 0 ; last byte :=
wa w1 6 ; rec base + 20;
ds w1 x2+h3+2 ;
rs w3 x2+h3+4 ; rec length := 20;
rl. w2 (j13.) ; w2 := sref;
am. (b2.) ;
jl +2 ; return to link + 2;
\f
; fgs 1984.02.29 algol 8, copy area page ...15...
; procedure wait transfer
;
; call : return :
;
; w0 : - top transferred (area name address)
; w1 : used share undefined
; w2 : sref sref
; w3 : link undefined
;
a3: rl w0 x2+8 ; entry:
ls w0 4 ; w0 := master zone shift 4;
rl. w1 j33. ; w1 := point (rs check);
jl. (j4.) ; goto take expression (point);
; return to link;
; procedure connect/length/state/mode/kind alarm;
;
; call : return :
;
; w0 : - -
; w1 : param -
; w2 : - -
; w3 : - -
;
d8 : <:<10>z.connect :>
d9 : <:<10>z.length :>
d10: <:<10>z.state :>
d11: <:<10>z.mode :>
d12: <:<10>z.kind :>
a8 : am d8 -d9 ; connect alarm:
a9 : am d9 -d10 ; length alarm:
a10: am d10-d11 ; state alarm:
a11: am d11-d12 ; mode alarm:
a12: al. w0 d12. ; kind alarm: w0 := alarm text;
jl. w3 (j21.) ; general alarm (text, param);
; constants :
d0: -1-64 ; mask for removal of buflength error bit
d1: h6 ; share descr length
d2: 8.3777 ; mask for extract 11
; variables :
b0: 0 ; address of message area (share + 6);
b1: 0, r.10 ; tail area
b2: 0 ; saved return
\f
; fgs 1984.02.09 algol 8, copy area page ...16...
i.
e. ; end block for local names in copy area
c0 = k-c1
c. c0 - 506
m. code on segment 1 too long
z.
c. 502 - c0
0, r. (:504 - c0:) > 1 ; fill segment with zeroes
z.
<:copy area<0>:> ; alarm text
m. segment 1
i.
e. ; end block segment 1
i4 = i4 + 1 ; increase segment count
i.
e. ; end block for segment
\f
; fgs 1984.02.09 algol 8, copy area page ...18...
; tails for insertproc
h.
g0:g1: ; first and last tail
0 , i4 ; size
0 , r.8 ; name
1<11+0 , i0 ; entry point
w. 3<18+13<12+8<6+8 ; integer proc (zone, zone, zone,
8<18 ; value integer)
h. 4 , i2 ; kind<12 + start external list
i4 , i5 ; code segments<12 + own bytes
m. fgs 1984.10.31 copy area
d.
p. <:insertproc:>
l.
i.
e. ; end slang segment
finis
▶EOF◀