|
|
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: 13824 (0x3600)
Types: TextFile
Names: »gzone63tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »gzone63tx «
; rc 1.12.69.
\f
; algol 6 procedures getzone, getshare, setzone and setshare page 1
b. e20,g1
s. b10,c20,d10,g10,f4
k=0
h.
g1: g2 , g2 ; headword, g1 is 1thlabel in program
g3: 13 , 0 ; rs entry last used
g4: 30 , 0 ; rs entry saved sref
g5: 21 , 0 ; rs entry general alarm
g7: 4 , 0 ; rs entry take expression
g8: 8 , 0 ; rs entry end address expr
g2=k-2-g1 ; length of abs word list
w.
;external list
e0: 0,0, s3, s4
; constant list
c1: 0 ; address of 1th element of ia
c2: 0 ; zone desc addr, z
h.
c3: 32 , h1 ; no of bytes in desc part1-part3,relative part1
w.
c4: 0 ; return address from various b-routines
c5: 0 ; share descriptor address
c6: h6 ; length of share descriptor
c7: 0 ; temporary used
c8: 0 ; -
c9: 1<23 ; mask to remove or set bit 0 in mode-byte
; alarm routine, called when illegal parameters or values
; alarm text
e10: <:<10>index :> ; illegal size of ia
e11: <:<10>share :> ; illegal share number
e12: <:<10>value :> ; illegal value in ia
; alarm entry
e15: am 6 ; entry if value alarm
e16: am 6 ; entry if share alarm
e17: al. w0 e10. ; entry if index alarm
jl. w3 (g5.) ; goto general alarm
e18: ; field alarm:
sh w3 (x1-2) ; if size <= upper index value then
al w3 2 ; field := 2; <*else field = size*>
rl w1 6 ;
ls w1 -1 ; index := field/2;
jl. e17. ; goto index alarm;
\f
; algol 6 procedures getzone, getshare, setzone and setshare page 2
; set addresses for moving zone descriptor
; entry b1. move part1,part2 and part3 from descriptor to ia
; entry b8. move ia to part1,part2 and part3 of descriptor
; w3 contains address of part descriptor
b1: am 1 ; entry from getzone
b8: al w0 1 ; entry from setzone
rs. w1 c4. ; save return address
bz w1 x3 ; w1 := number of bytes in part desc
bl w2 x3+1 ; w2 := relative part of zone desc
wa. w2 c2. ; + base of zone
rl. w3 c1. ; w3 := 1st element of ia
se w0 2 ; if called from getzone then skip
rx w3 5 ; else exchange w2 and w3
al w0 x1 ; w0 := number of bytes to move
jl. w1 b7. ; jump to move
jl. (c4.) ; return
; move share descriptor to integer array ia
b4: rs. w1 c4. ; store return address
rl. w0 c6. ; number of bytes
rl. w2 c5. ; share base
rl. w3 c1. ; 1th ia element address
jl. w1 b7. ; move
jl. (c4.) ; exit
; innermost move loop
; move w0 bytes from w2 to w3 and following
b7: rs. w1 c8. ; store return address
rl w1 0 ;
d2: al w1 x1- 2 ; w1 := no of bytes -2
am x1+ 0 ;
rl w0 x2+ 0 ; move one word
am x1+ 0 ; starting with last word
rs w0 x3+ 0 ;
se w1 0 ; if last byte then skip
jl. d2. ; else move next
jl. (c8.) ; exit
; set addresses for moving ia to share descriptor
; starting with ia(2) and descriptor(2)
b9: rs. w1 c4. ; save return address
rl. w1 c6. ; w1 := length of share descriptor
al w0 x1-2 ; w0 := length-2
rl. w2 c1. ; w2 := address of ia(2)
al w2 x2+2 ;
rl. w3 c5. ; w3 := address of descriptor(2)
al w3 x3+2 ;
jl. w1 b7. ; jump to move
jl. (c4.) ; return
\f
; algol 6 procedures getzone, getshare, setzone and setshare page 3
; unpack zone descriptor, ia, share no
; called with w0 := minimumlength of ia
; w1 := return address
; return with c1 := address of first element of ia
; c2 := address of zone descriptor
; c5 := address of share descriptor
; unpack share number
b2: rl. w2 (g3.) ; w2 := last used
ds. w3 (g4.) ; saved sref
sl w0 34 ; if w0 < 34 then unpack share
jl. b3. ; else skip to z and ia
rx w0 x2+14 ; w0 := first formal of share
rx w1 x2+16 ; w1 := second formal of share
so w0 16 ; if kind = 16 then
jl. w3 (g7.) ; take expression
ds. w3 (g4.) ; save sref
rl w1 x1 ; w1 := share number
sh w1 0 ; if zero then
jl. e16. ; goto alarm
rs. w1 c5. ; else save share no
dl w1 x2+16 ; restore entry values
; unpack zone descriptor and ia
b3: ds. w1 c8. ; save entry values
dl w1 x2+12 ; w0,w1 := formals of ia
ba w1 0 ; w1 := addr of dope
al w0 2 ;
rl. w3 c7. ;
sh w3 (x1-2) ; if size > upper index value
sh w0 (x1) ; or 2 >= lower index value - 2 then
jl. e18. ; goto field alarm;
wa w0 (x2+12) ; addr := 2 +
rs. w0 c1. ; addr element (0, 0, 0, ...);
rl w1 x2+8 ; else w1 := addr of zone desc
rs. w1 c2. ; save address
sl w3 34 ; if not share (w3 > 34)
jl. (c8.) ; then return
rl. w3 c5. ; else w3:= share number
jl. w2 b10. ; unpack share
rs. w0 c5. ; if ok then save addr of sharedesc
jl. (c8.) ; and return
rl. w1 c5. ; else goto alarm
jl. e16. ; alarm
\f
; algol 6 procedures getzone getshare setzone setshare page 4
; compare address in w0 to be within zone buffer limits
; normal return jump if inside limits, else goto alarm
b6: rs. w3 c4. ; save return address
am. (c2.) ;
rl w3 h0 ; w3 := first of buffer
am. (c2.) ;
sh w0 (h0+2) ; if addr > last
sh w0 x3-2 ; or addr < first-2
jl. e15. ; then goto alarm
jl. (c4.) ; else return
; unpack and check share number
; if illegal then return to linkaddress + 4
; called with w1 := address of zone desc
; w2 := link address
; w3 := share number
; return with w0 := address of share desc
b10: al w0 x3-1 ; w0 := address of actual share desc
wm. w0 c6. ;
wa w0 x1+h0+6 ;
sh w0 (x1+h0+8) ; if addr of share =< last share
jl x2 ; then return to link addr
jl x2+4 ; else return to link+4
\f
; algol 6 procedure getzone, getshare, setzone and setshare page 5
; getzone6(z,ia);
; move zone descriptor for z to integer array ia
f1:
e1: al w0 40 ; w0 := min.length of ia -1
jl. w1 b2. ; unpack z and ia
al. w3 c3. ; w3 := part desc (h1)
jl. w1 b1. ; move part to ia
dl. w3 c2. ; w2 := addr of ia,w3 := addr of zone desc
rl w1 x2 ; remove bit 0 in mode-byte
lx. w1 c9. ;
rs w1 x2 ;
rl w1 x3+h0+4 ; w1 := addr of used share
ws w1 x3+h0+6 ; w1 := number of used share
al w0 0 ;
wd. w1 c6. ;
al w1 x1+1 ;
rs w1 x2+32 ; store in ia
rl w1 x3+h0+8 ; w1 := addr of last share
ws w1 x3+h0+6 ; w1 := number of shares
al w0 0 ;
wd. w1 c6. ;
al w1 x1+1 ;
rs w1 x2+34 ; store in ia
rl w0 x3+h0+0 ; w0 := base of buffer
rl w1 x3+h0+2 ; w1 := buffer length
ws w1 x3+h0+0 ;
ls w1 -2 ; divide by 4
ds w1 x2+38 ; store in ia
jl. (g8.) ; exit getzone
; getshare6(z,ia,sh);
; move share descriptor for share sh in zone z to integer array ia
f2:
e2: al w0 24 ; w0 := min.length of ia -1
jl. w1 b2. ; unpack z, ia and share
jl. w1 b4. ; move entire share desc to ia
; compute index for first and last shared
rl. w2 c1. ; w2:= addr of 1st element in ia
am. (c2.) ;
al w3 h0 ; w3:= addr of 1st element in z-descr
dl w1 x2+4 ;
ws w0 x3 ; w0:= first shared-base of buffer
ws w1 x3 ; w1:= last shared-base of buffer+1
al w1 x1+1 ;
ds w1 x2+4 ;
jl. (g8.) ; exit getshare
\f
; algol 6 procedure getzone, getshare, setzone and setshare page 6
; setzone6(z,ia);
; move content of integer array ia to zone descriptor z
f3:
e3: al w0 34 ; w0 := min.length of ia -1
jl. w1 b2. ; unpack z and ia
al. w3 c3. ;
jl. w1 b8. ; move part1 - part3
rl. w2 c2. ; w2:= addr of zone desc
rl w1 x2+h1 ; w1 := mode-byte
lo. w1 c9. ; set bit 0 in mode-byte
rs w1 x2+h1 ;
bz w3 x2+h1+1 ; w3 := kind
al w1 1 ; w1 := ia index in case of alarm
sl w3 0 ; if kind=> 0 and < 19
sl w3 19 ; then ok else
jl. e15. ; goto alarm
sz w3 1 ; else if kind is odd then
jl. e15. ; goto alarm
al w1 14 ; update ia index
rl w0 x2+h3 ; w0 := addr of record base
so w0 1 ; if even address
jl. e15. ; then goto alarm
jl. w3 b6. ; else check within buffer limit
al w1 15 ; update ia index
rl w0 x2+h3+2 ; w0 := addr of last byte
jl. w3 b6. ; check
al w1 16 ; update ia index
rl w0 x2+h3+4 ; w0 := record length
wa w0 x2+h0+0 ; add base of buffer
jl. w3 b6. ; check
am. (c1.) ; check used share
rl w3 +32 ;
sh w3 0 ; if < 0
jl. d4. ; then goto alarm
rl. w1 c2. ; w1 := addr of zone desc
al w2 x2+h0+4 ; set addr of used share
rs. w2 c5. ; to later use
jl. w2 b10. ; check used share no
rs. w0 (c5.) ; if ok then store addr
jl. (g8.) ; and exit setzone
d4: al w1 17 ; else w1 := ia index
jl. e15. ; goto alarm
\f
; algol 6 procedure getzone, getshare, setzone and setshare page 7
; setshare6(z,ia,sh);
; move content of integer array ia to share descriptor for sh
f4:
e4: al w0 24 ; w0 := min.length of ia -1
jl. w1 b2. ; unpack z, ia and sh
jl. w1 b9. ; move ia to descriptor
rl. w2 c5. ; w2 := address of share desc
rl w0 x2+3 ; w0:= abs addr of first shared
am. (c2.) ;
wa w0 h0 ;
rs w0 x2+3 ; store addr in share desc
al w1 2 ; w1 := ia index in case of alarm
jl. w3 b6. ; check addr within buffer limit
rl w1 x2+5 ; w1 := abs addr of last shared
am. (c2.) ;
wa w1 h0+0 ;
al w0 x1-1 ; w0 := abs address of first byte
rs w0 x2+5 ; store addr in share desc
al w1 3 ; update ia index
jl. w3 b6. ; check within limit
bz w0 x2+6 ; w0 := operation
so w0 1 ; if even operation
jl. d3. ; then skip
rl w0 x2+9 ; else check
al w1 5 ; first and last
jl. w3 b6. ; address of block
rl w0 x2+11 ; within
al w1 6 ; zone buffer limit
jl. w3 b6. ;
d3: rl w1 x2+23 ; w0 := top transferred -1
al w0 x1-1 ;
al w1 12 ; update ia index
jl. w3 b6. ; check
al w1 1 ; w1 := ia index
rl w0 x2 ; w0 := old share state
rl. w3 (c1.) ; w3 := new share state
sh w0 1 ; if old state > 1
sh w0 -1 ; or < 0
jl. (g8.) ; then exit
sh w3 1 ; else if new state > 1
sh w3 -1 ; or < 0
jl. e15. ; then goto alarm
rs w3 x2 ; else store new state
jl. (g8.) ; exit setshare
\f
; algol procedure getzone, getshare, setzone and setshare tail part
d10: c. d10-506-g1 m. code too long
z. ; more than one segment
c. g1+502-d10, 0, r. g1+252-d10>1
z. ; fill rest of segment with zeros
<:zone,share6:> ; alarm text
i.
e.
m. rc 1987.07.07 getzone6 getshare6 setzone6 setshare6
; tails
w.
g0: 1, 0, r.4 ; 1th tail, getzone: 1 segment
1<23+e1 ; entry for getzone
1<18+25<12+8<6 ; no type, integer array, zone
0 ;
4<12+e0 ; external list
1<12 ; 1 segment
1<23+4, 0, r.4 ; getshare: 1 segment
1<23+e2 ; entry for getshare
1<18+3<12+25<6+8 ; no type, integer, integer array, zone
0 ;
4<12+e0 ; external list
1<12 ; 1 segment
1<23+4, 0, r.4 ; setzone: 1 segment
1<23+e3 ; entry for setzone
1<18+25<12+8<6 ; no type, integer array, zone
0 ;
4<12+e0 ; external list
1<12 ; 1 segment
g1: 1<23+4, 0, r.4 ; setshare: 1 segment
1<23+e4 ; entry for setshare
1<18+3<12+25<6+8 ; no type, integer, integer array, zone
0 ;
4<12+e0 ; external list
1<12 ; 1 segment
\f
▶EOF◀