|
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: 16896 (0x4200) Types: TextFile Names: »tofrom3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »tofrom3tx «
\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◀