|
|
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: 11520 (0x2d00)
Types: TextFile
Names: »pumptx«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦80900d603⟧ »giprocfile«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦80900d603⟧ »giprocfile«
└─⟦this⟧
; pump_tx * page 1 4 10 77, 10.02;
(
pump = set 1
movevar = set bs pump
movecase = set bs pump
pump = slang entry.no
pump movevar movecase
)
b. ; outermost block
p.<:fpnames:>
m.girc 4000 pump 07.02.77, 08.21.46
;
;
; procedure movevar( b, a );
; a (return value, undefined simple ).
; The sign-extended or extracted value of b.
; b ( call value, undefined simple ).
;
; procedure movecase( b ) case ( t ) of ( list );
; case t of list (return value, general),
; The sign-extended or extracted value of b.
; ex. of list : boolean1, integer1, boolean2, string;
; t (call value, integer value) pointing the variable in list.
; b ( call value, undefined simple ).
;
;
; real procedure pump( A );
;
; pump (return value, real) the value of the sucessor of the
; last called element of A, at the first call the pos-
; sibly ficticious element A(0) is the last called.
; NB NB NB pump operates on index only, the index is reset to
; zero when the referenced element of A contains a binary
; zero character.
; A (call value, real, long or integer array).
; The array mostly containing a
; text string. If A contains one or more binary zeroes an
; internal own variable in pump will be reset to zero after
; reference to this element, rady for use next time.
; alarm cause : index error.
; ***** For integer array with an odd number of elements the
; index is one too high and the three last characters
; are doubled.
; ***** pump is designed for use in cases where an ordinary
; for-statement is awkward or impossible, e.g. inside a write
; procedure, and very strange effects may occur if the procedure
; is used just for increasing the index.
\f
; pump_tx * page 2 4 10 77, 10.02;
b. g1, e20 ; block with names for tail and insertproc
w.
k=10000 ; load addr
s. g5 , j70, d15, f3, c0, a20 ; start of slang segm
h.
g0=0 ; number of extern.
e0:
g1: g3, g2 ; headword, rel of last point, absword
; abswords:
j4: g0+ 4, 0 ; RS entry 4: take expression
j6: g0+ 6, 0 ; do 6: stop reg expression
j8: g0+ 8, 0 ; do 8: stop by addr expr
j13: g0+13, 0 ; do 13: last used
j17: g0+17, 0 ; do 17: index alarm
j19: g0+19, 0 ; do 19: case alarm
j21: g0+21, 0 ; do 21: general alarm
j29: g0+29, 0 ; do 29: param alarm
j30: g0+30, 0 ; do 30: saved stack ref. saved w3
j0: 0, 1 ; first word in own core
g2=k-2-g1 ; fin of abswords
; points:
g3=k-2-g1 ; fin of points
; ext. list:
w.
e1: g0 ; number of ext
g4 ; number of bytes to initialize
g4 =k-e1-4
s3 ; date
s4 ; time
f3: 7 ; mask
c0: <:<10>few_case:>
\f
; pump_tx * page 3 4 10 77, 10.02;
e5:
; entrypoint move_case
; *********
am 1 ;
e6:
; entrypoint move_var
; ********
al w0 0 ;
rl. w2 (j13.) ; w2:= last used
ds. w3 (j30.) ; saved w3
rl w3 0 ; save entry case
se w0 0 ; if move_case then
jl. a7. ; goto get upper index;
; take addr a:
a1: dl w1 x2+12 ; load formals a ( or t );
hs w3 x2+10 ; save upper index (entry_case)
so w0 16 ; if expr. then
jl. w3 (j4.) ; take this;
ds. w3 (j30.) ;
bl w3 x2+10 ; load upper index ( entry_case)
sl w3 1 ; if move_case then
jl. a11. ; goto take_case_t_of;
a2: rs w1 x2+12 ; save addr( a );
; take value b:
dl w1 x2+8 ; take formals
so w0 16 ; if expressiton then
jl. w3 (j4.) ; take expression
ds. w3 (j30.) ; saved w3
al w0 7 ; extract 3 bits from
la w0 x2+6 ; first formal
se w0 1 ; if -, boolean then
jl. a3. ; goto test integer
bl w0 x1 ; take boolean extend sign
jl. a4. ; goto extend to long
; test integer:
a3: se w0 2 ; if -, integer then
jl. a5. ; goto take 4-byte
rl w0 x1 ; take integer
a4: ad w1 -24 ; extend to 4-byte
jl. a6. ; gotoreslut
a5: dl w1 x1 ; load 4-byte
; result:
a6: al w3 31 ; extract 5 bits from
la w3 x2+10 ; first formal a
sl w3 8 ; if procedure
sl w3 29 ; then
jl. w3 (j29.) ; goto param alarm
la. w3 f3. ; extract 3
sn w3 1 ; if boolean then
hs w1 (x2+12) ; store boolean value else
sn w3 2 ; if integer then
rs w1 (x2+12) ; store integer value
sl w3 1 ;
sl w3 3 ; else
ds w1 (x2+12) ; store 4-byte value
\f
; pump_tx * page 4 4 10 77, 10.02;
; return by addr expr:
jl. (j8.) ; stop addr expr
; ++ movevar slut ++;
a7:
; take upper index
al w3 x2+10 ; first formal addr+2
al w1 x2+7 ; upper limit:= stackref+7+appetite
ba w1 x2+4 ;
a8: rl w0 x3-2 ; load addr of var or expr
sl w0 x2 ; if w0<x1 or w0>upper limit then
sl w0 x1 ;
jl. a9. ; goto next formals
rl w1 0 ; upper limit:= addr of var or expr
a9: al w3 x3+4 ; w3:= next formals addr
sl w1 x3 ; if past upper limit then
jl. a8. ; goto test next formals
a10: ws w3 4 ; upper index is so that the test can
al w3 x3-14 ; be made by : if t <upper index then ok
as w3 -2 ;
sl w3 1 ; if upper index > 0 then
jl. a1. ; return
rl w1 6 ; else general alarm
al. w0 c0. ;
jl. w3 (j21.) ;
a11:
; take case t of
dl w1 x1 ; evaluate case t of
rl w3 x2+10 ; test real
sz w3 1 ; if real then
cf w1 0 ; convert to integer
bl w3 6 ; load upper index
sl w1 1 ; if t < 1 or
sl w1 x3 ; t> upper index then
jl. w3 (j19.) ; casealarm
ls w1 2 ; 4 * t
am x2 ; addr of formals(t-3)
dl w1 x1+12 ;
rs w0 x2+10 ; save kind of param(t)
so w0 16 ;
jl. w3 (j4.) ; take expr
ds. w3 (j30.) ; saved w3
jl. a2. ; return
; ++ movecase slut ++;
\f
; pump_tx * page 5 4 10 77, 10.02;
e7:
; entry pump
; ****
rl. w2 (j13.) ; w2:= last used
ds. w3 (j30.) ; save w3
rl. w1 (j0.) ; load own integer i
al w1 x1+1 ; i := i + 1;
rs. w1 (j0.) ; save own integer i
bz w0 x2+7 ; load kind of array
sh w0 20 ; check type of array
sh w0 17 ;
jl. a18. ; goto check zone.
rl w3 x2+8 ; load second formal A
ba w3 x2+6 ; w3 := abs addr( dope );
sn w0 18 ; if integer array then
jl. a16. ; goto integer check;
as w1 2
sh w1 (x3-2) ; if i > upper index
sh w1 (x3) ; or i < lower index then
jl. w3 (j17.) ; index alarm
a12: rl w3 0 ; move kind;
wa w1 (x2+8) ; addr( A(i) );
dl w1 x1 ; w1:= A(i);
sn w3 17 ; if kind=short then
rl w0 2 ; move w1;
ds w1 x2+8 ; save in stack;
; test for null character
al w3 6 ; chars to check;
jl. a14. ;
a13: al w3 x3-1 ; chars left to check;
sn w3 0 ; if last_char then
jl. a15. ; goto zero char not found;
ld w1 -8 ; shift to next char;
a14: sz w1 255 ; if char <> 0 then
jl. a13. ; goto check next char;
al w1 0 ; set own integer i
rs. w1 (j0.) ; i := 0;
a15: dl w1 x2+8 ; load four-bytes;
jl. (j6.) ; stop reg expr
; integer check;
a16: ls w1 2 ;
sh w1 (x3-2) ; if i<=index then
jl. a17. ; goto check low;
al w0 17 ; kind := short;
al w1 x1-2 ; 4i:= 4i - 2;
a17: as w1 -1 ; to get integer check;
as w1 1 ;
sh w1 (x3-2) ; if i > upper index
sh w1 (x3) ; or i < lower index then
jl. w3 (j17.) ; goto index alarm;
jl. a12. ; goto move kind;
\f
; pump_tx * page 6 4 10 77, 10.02;
; check zone:
a18: bz w3 x2+6 ; load first byte in formal.1;
sn w3 6 ; if w3 <> 6 or
se w0 23 ; not zone then
jl. w3 (j29.) ; goto param alarm
rl w3 x2+8 ; w3 := addr(base addr)
rl w0 x3+h3+6 ; w0 := zone handled as array zero;
se w0 0 ; if w0 <> 0 then
jl. w3 (j29.) ; goto param alarm;
al w0 19 ; kind := real array;
as w1 2 ; w1 := index * 4;
sh w1 (x3+h3+4) ; if w1 <= record length then
jl. a12. ; goto move kind else
jl. w3 (j17.) ; goto index alarm;
; ++ pump slut ++;
g5:
c.g5-e0-506
m. code pump too long
z.
c.502-g5+e0
jl -1 , r.252-(:g5-e0:)>1; fill with -1
z.
<:pump<0>:>, 0, 0
i.
e.
; entry tail:
e10=1<23 + 4 ; mode_kind = backing storage
e11=4<12 + e1 - e0 ; code proc start of ext. list
e12=1<12 + 2 ; 1 code segm, 2 bytes in own core
; pump
g0: 1 ; first tail: 1 segm
0, 0, 0, 0 ; fill
1<23+0<12+e7-e0 ; entrypoint
4<18+41<12+0, 0 ; real proc, undefined
e11 ; code proc start of extern. list
e12 ;
; move_var
e10 ; modekind
0, 0, 0, 0 ; fill
1<23 + e6-e0 ; entrypoint
1<18+41<12+41<6+0, 0 ; no type proc, undefined, undefined
e11 ;
e12 ;
; move_case
g1: e10 ;
0, 0, 0, 0 ; fill
1<23 + e5-e0 ; entrypoint
1<18+39<12+13<6+41, 0 ; no type, general, integer value, undef
e11 ;
e12 ;
p.<:insertproc:>
e. ; stop outermost block
\f
; pump_tx * page 7 4 10 77, 10.02;
if ok.no
( mode 0.yes
message pump not ok
lookup pump )
look_up,
pump,
movevar,
movecase
end
finis
▶EOF◀