DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦fa1414168⟧ TextFile

    Length: 16896 (0x4200)
    Types: TextFile
    Names: »tofrom3tx   «

Derivation

└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
    └─⟦75ff9bef3⟧ 
        └─⟦this⟧ »tofrom3tx   « 

TextFile

\f


; fgs 1987.06.24 rc4000  code procedure,  tofrom                 page  1
;
; this code procedure is intended as a replacement of the for loops
; commonly used to move data in core.
; it is particularly usefull in connection with arrays holding a
; number of bytes not divideable by 4.
;
b. e1, f2, g1             ; begin    block for insertproc
w.

d.
p.<:fpnames:>
l.

s. l0                     ; begin global slang segment

k=10000
b. g5, j50                ; begin    block segment 1
h.
f1=0                      ;   number of externals := 0

j0:   g1, g2              ; head-word: last-point, last-absword
j1:   1<11o.1,  0         ; own segment, next one
j4:   f1 +  4,  0         ; rs-take-expression
j8:   f1 +  8,  0         ; rs-end-register-expression
j13:  f1 + 13,  0         ; rs-last-used
j21:  f1 + 21,  0         ; rs-general-alarm
j29:  f1 + 29,  0         ; rs-param-alarm
j30:  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
      0                   ; no. of bytes to init in perm. core
;
      s3      , s4        ; date and time of this version
;
;
;
; procedure  tofrom(to_arr, from_arr, move_size)
;
; any type array or zone  to_arr, from_arr
; integer  move_size
;
;
; the procedure moves a number of bytes to to_arr from from_arr.
; the number of bytes is given by the parameter movesize, which
; must be positive or zero.
; the moved area starts at index 1, byte 1 of the array, in both
; arrays.
; the procedure moves strictly in increasing address order, i.e.
; overlapping core areas can be moved in the direction of lower
; index.
;
; the procedure is equivalent to this for loop:
;
;      boolean field  bfld;
;      for bfld:= 1 step 1 until movesize do  toarr.bfld:= fromarr.bfld;
;
; with the exception that byte one in both arrays must correspond to
; the left byte of a computer-word. i.e. boolean arrays having an even
; lower bound, and other arrays fielded with field array variables 
; having odd values are not allowed.
\f


; fgs 1987.06.24 rc4000  code procedure,  tofrom                   page  2
;
;
; the procedure is less timeconsuming than a simple for loop
; of more than approximately 5 steps.
;
; alarms:
;
;      if to_arr or from_arr are not arrays or zones, the alarm param
;      is given.
;
;      if move_size is less than zero, the alarm movesize is given
;      with an integer telling the value of move_size.
;
;      if byte one of one of the arrays is not the left byte of a com-
;      puter-word, the alarm oddfield is given, together with the number
;      of the parameter, 1 or 2.
;
;      if byte 1 or byte move_size exceeds the limits of one of
;      the arrays, the alarm movefld is given, together with the
;      relevant byte number.
;
;
b. a20, c10, i5           ; begin block tofrom segment 1
w.
e0=0                      ;   entry segment
e1=k-j0                   ;   rel entry
      rl. w2 (j13.)       ;   w2:= rs-last-used
      ds. w3 (j30.)       ;   save rs-stackref, and save-w3
;
; check that the two first parameters really contain some type of
; array or zone.
;
      al  w1  2.11111     ;
      la  w1  x2+6        ;
      sh  w1  23          ;   if kind(param-1) > zone or
      sh  w1  16          ;      kind(param-1) < boolean array then
      jl. w3 (j29.)       ;     goto  rs-param-alarm
;
      al  w1  2.11111     ;
      la  w1  x2+10       ;
      sh  w1  23          ;   if kind(param-2) > zone or
      sh  w1  16          ;      kind(param-2) < boolean array then
      jl. w3 (j29.)       ;     goto  rs-param-alarm
;
; take parameter move_size.
;
      dl  w1  x2+16       ; 
      so  w0  16          ;   if expression then
      jl. w3 (j4.)        ;     goto  rs-take-expression
      ds. w3 (j30.)       ;
      rl  w0  x1          ;   w0:= move_size
;
      sh  w0  -1          ;   if move_size < 0 then
      jl.     a9.         ;     goto  alarm(movesize)
\f


; fgs 1987.06.24 rc4000  code procedure,  tofrom                   page  3
;
;
; find base addresses for the two core areas involved in the move,
; and check that byte 1 and byte move_size are within bounds.
;
      rl  w3  x2+8        ;   w3:= base-word-addr-toarr
      rl  w1  x3          ;   w1:= to-base:= array-base
      rs. w1  c0.         ;   save-to-base
;
      so  w1  1           ;   if to-base is even then
      jl.     a11.        ;     goto  alarm(oddfield, 1)
;
      ba  w3  x2+6        ;   w3:= dope:= base-word-addr + dope-rel
;
      al  w1  1           ;
      sh  w0 (x3-2)       ;   if move_size > upper-index or
      sh  w1 (x3)         ;      1 <= lower-index - k then
      jl.     a10.        ;     goto  alarm(movefld)
;
      rl  w3  x2+12       ;   w3:= base-word-addr-fromarr
      rl  w1  x3          ;   w1:= from-base:= array-base
;
      so  w1  1           ;   if from-base is even then
      jl.     a12.        ;     goto  alarm(oddfield, 2)
;
      ba  w3  x2+10       ;   w3:= dope:= base-word-addr + dope-rel
;
      al  w2  1           ;
      sh  w0 (x3-2)       ;   if move_size > upper-index or
      sh  w2 (x3)         ;      1 <= lower-index - k then
      jl.     a10.        ;     goto  alarm(movefld)

\f



; fgs 1987.06.24  rc8000  code procedure,  tofrom         page 4

;
; prepare move
;
      rl. w2  c0.         ;   w2:= save-to-base
      rs. w0  c0.         ;   remaining:= move_size
;
;
      gg  w3  34          ;   
      sh  w3  59          ;   if cpu reg < 60 then
      jl.     a3.         ;     goto repeatmove, next segment;
      am.    (c0.)        ;
      sh  w2  x1-1        ;   if from_base +move_size  <= to_base
      sh  w2  x1          ;   or from_base             >= to_base then
      jl.     a1.         ;     goto setup mh_instruction else
      jl.     a3.         ;     goto repeatmove, next segment;
;
a1:                       ; setup mh_instruction:
      al  w1  x1+1        ;   fromfirst := frombase + 1;
      al  w2  x2+1        ;   to__first := to__base + 1;
      rx  w2  2           ;   swop (wpreg, wreg);
      ds. w2  c4.         ;   save (wpreg, wreg);
      mh  w2 (0)          ;   move halfs (wpreg, wreg, 0);
      al  w3 (:-1:)<1     ; 
      la  w0  6           ;   halfs moved := move_size extract (:-1:)<1; <*even*>
      dl. w2  c4.         ;   restore (wpreg, wreg);
      wa  w1  0           ;   wpreg := wpreg + halfs_moved;
      wa  w2  0           ;   w_reg := w_reg + halfs_moved;
      rx  w2  2           ;   swop (wpreg, wreg);
      ws. w0  c0.         ;   remaining := halfs_moved - move_size;
      sn  w0  0           ;   if remaining <> 0 then   
      jl.     a2.         ;   <*1 half remaining*>
      zl  w0  x1          ;     move 1 half;
      hs  w0  x2          ;     
a2:   jl.    (j8.)        ;   goto end register expr.;

a3:   rl. w3 (j1.)        ; goto repeat move on next segment;
      jl      x3+l0       ;
\f


; fgs 1987.06.24 rc8000  code procedure,  tofrom                   page 5
;
;
;
a9:                       ; alarm(movesize):
      rl  w1  0           ;   alarm-cause:= move_size
      al. w0  c1.         ;   w0:= addr of alarm-text
      jl. w3 (j21.)       ;   goto  rs-general-alarm
;
;
a10:                      ; alarm(movefld):
;
; w0 = move_size, x3 = dope-address.
; determine whether upper or lower bound was exceeded.
;
      sh  w0 (x3-2)       ;   if move_size <= upper-index then
      al  w0  1           ;     move-field:= 1 else move_size
      rl  w1  0           ;   alarm-cause:= move-field
      al. w0  c2.         ;   w0:= addr of alarm-text
      jl. w3 (j21.)       ;   goto  rs-general-alarm
;
;
a11:  am      1-2         ; alarm(oddfield, 1):
a12:  al  w1  2           ; alarm(oddfield, 2):
      al. w0  c3.         ;   w0:= addr of alarm-text
      jl. w3 (j21.)       ;   goto  rs-general-alarm
;
;
c0:   0                   ;   remaining, saved to_base
c1:   <:<10>movesize:>    ;   alarm-text
c2:   <:<10>movefld :>    ;   alarm-text
c3:   <:<10>oddfield:>    ;   alarm-text
      0                   ;   saved wpreg
c4:   0                   ;   saved w_reg
i.
e.                        ; end block tofrom segment 1

\f



; fgs 1987.06.24 rc8000  code procedure,  tofrom                   page  6


g3=k-j0
c. g3-506
   m.  code on segment 1 too long
z.
c. 502-g3
   0, r. 252-g3>1
z.
;
<:tofrom1:>, 0            ;   alarm address
i.
e.                        ; end block segment 1

m. tofrom segment 1


\f



; fgs 1987.06.24 rc8000  code procedure,  tofrom                   page  7



b. g5, j50                ; begin block segment 2
h.

j0:   g1, g2              ; head-word: last-point, last-absword
j8:   f1 +  8,  0         ; rs-end-register-expression
j30:  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.

b. a20, c10, i5           ; begin block tofrom segment 2
w.

;
;
; prepare move
;
;
l0 = k - j0               ; rel entry repeatmove:
      ds. w3 (j30.)       ;   save sref, w3;
      rs. w0  c0.         ;   remaining := move_size;

a0:                       ; repeatmove:
;
;     registers
; w0  remaining (bytes to move)
; w1  from-base
; w2  to-base
; w3  undefined
;
      al  w3  i0          ;   w3:= portion:= - maxbytes in one round
      sl  w0  i1          ;   if remaining >= maxbytes then
      jl.     a1.         ;     goto  move
\f


; fgs 1987.06.24 rc4000  code procedure,  tofrom                   page 8
;
;
; less than the portion, which can be moved by the movelist below,
; is left.
;
      al  w3  (:-1:)<2    ;   portion:= - (remaining
      la  w3  0           ;             - remaining extract 2);
      ac  w3  x3          ;
;
;
a1:                       ; move:
      wa  w0  6           ;   remaining:= remaining + portion
      rs. w0  c0.         ;   obs. obs. portion is negative
;
      ws  w1  6           ;   last-from:= from-base - portion
      ws  w2  6           ;   last-to:= to-base - portion
;
      jl.     x3+a3.      ;   goto  movelist(portion + toplist)
;
a2:                       ; startmovelist:
;
;     registers in movelist
; w0  work
; w1  last-from
; w2  last-to
; w3  work
;
; definition of slang-names used for list-administration.
;
      i1= 424             ;   maxbytes moved in one round
      i0= -i1             ;   maxportion:= - maxbytes
;
      i2= -i1-k+4         ;   constant for load address
      i3= i2-2            ;   constant for store address
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
\f


; fgs 1987.06.24 rc4000  code procedure,  tofrom                   page 9
;
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
\f


; fgs 1987.06.24 rc8000  code procedure,  tofrom                   page  10
;
;
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3
dl w0 x1+k+i2 , ds w0 x2+k+i3 , dl w0 x1+k+i2 , ds w0 x2+k+i3

;
;
; test that the list really can move i1 bytes
;
a3:                       ; toplist:
;
g4= i1 - (:a3-a2:)        ;   g4 should be zero
c. g4-1                   ;   if g4 > 0 then
  m.  movelist too short  ;
z.                        ;
c. -g4-1                  ;   if g4 < 0 then
  m.  movelist too long   ;
z.
;
;
      rl. w0  c0.         ;   w0:= remaining
      sl  w0  4           ;   if remaining >= 4 then
      jl.     a0.         ;     goto  repeatmove
\f


; fgs 1987.06.24 rc4000  code procedure,  tofrom                   page 11
;
;
; now w0 may be either 0, 1, 2, or 3, indicating the number of
; bytes which have still not been moved.
; a case construction is used to speed up the treatment.
;
      ls  w0  3           ; case  remaining  of
      am     (w0)         ;
      jl.     a4.         ;
a4:                       ; begin    comment  8 bytes per case
;
      jl.    (j8.)        ;  0,  goto  rs-end-register-expression
c0:   0                   ;      saved to_base, remaining
      0                   ;      saved wpreg
c4:   0                   ;      saved w_reg
;
      bz  w0  x1+1        ;  1,  one byte left
      hs  w0  x2+1        ;
      jl.    (j8.)        ;
      0                   ;
;
      rl  w0  x1+2        ;  2,  one word left
      rs  w0  x2+2        ;
      jl.    (j8.)        ;
      0                   ;
;
      rl  w0  x1+2        ;  3,  one word and one byte left
      rs  w0  x2+2        ;
      bz  w0  x1+3        ;
      hs  w0  x2+3        ;
      jl.    (j8.)        ; end    case  remaining
i.
e.                        ; end block tofrom segment 2
\f


; fgs 1987.06.24 rc4000  code procedure,  tofrom                   page 12
;
;
g3=k-j0
c. g3-506
   m.  code on segment 2 too long
z.
c. 502-g3
   0, r. 252-g3>1
z.
;
<:tofrom2:>, 0            ;   alarm address
i.
e.                        ; end block segment 2

m. tofrom segment 2


i.
e.                        ; end global slang segment

;
; tail to be inserted in catalog by means of insertproc
;
g0: g1:                   ; first-tail: last-tail:
      2                   ; no. of segments:= 2
      0, r.4              ; <:tofrom:>
      1<23+e0<12+e1       ; code, entry segment, rel entry
      1<18+19<12+41<6+41  ; no_type_proc(undef, undef, intaddr)
      0                   ;
      4<12+f2             ; content, rel start external list
      2<12+0              ; code segments, bytes in permant core
;
m. rc 1987.06.25 tofrom
d.
p.<:insertproc:>
▶EOF◀