|
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: »epusingletx«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦787c125fb⟧ »adjprocfile« └─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦787c125fb⟧ »adjprocfile« └─⟦this⟧
; epu_simulator_sin * page 1 7 12 79, 16.13; ( epu_single = set 1 epumode = set bs epusingle workhigh = set bs epusingle worklow = set bs epusingle epu_single = slang entry.no epusingle epumode workhigh worklow ) b. ;outermost block p. <:fpnames:> m. girc 4000 epu_simulator_single_precision 21.11.79 \f ; epu_simulator_sin * page 2 7 12 79, 16.13; ; long procedure epu_single(epu, word); ; _____________________________________ ; ; epu_single (return, long) ; exp_lim shift 36 + status shift 24 ; + bytes processed ; status result ; 0 normal answer ; 1 illegal operation ; 2 illegal stop ; ; epu (call, zone) ; the epu instructions to be executed ; ; word (call, integer) ; the number of bytes peu instructions ; to be executed ; ; the procedure simulates the external processor epu in single ; real precition \f ; epu_simulator_sin * page 3 7 12 79, 16.13; b. g1, e20 ; block with names for tail and insertproc w. k=10000 ; load addr s. g10, j71, a10, b4,c4, d11, i40 ; start of slang segm h. g0=0 ; number of extern. e5: g1: g3, g2 ; headword: rel of last point, absword ; abswords : g2=k-2-g1 ; fin of abswords ; points: g3=k-2-g1 ; fin of points ; fill with aw 0 : w. aw 0 , r. 250-(:+12*g0+4+10:)>1; g10 = 10; ; extern. list: w. e0: g0 ; number of extern. g10 ; number of bytes to be initialied 1 ; epu_mode f. 0.0 ; work high 0.0 ; work low w. g10=k-e0-4 ; continuation address on next segm of ext.list g9 g4: c.g4-e5-506 m. code epu_single too long on segm one z. c.502-g4+e5 jl -1 , r.252-(:g4-e5:)>1 ; fill with -1 z. <:epusingl<0><0>:> ; slut første segm ; ; ******************** ; \f ; epu_simulator_sin * page 4 7 12 79, 16.13; ; start andet segm ; h. e8: g5: g7, g6 ; headword: rel of last point, absword ; abswords: j3: g0+ 3, 0 ; RS entry 3: reserve j4: g0+ 4, 0 ; do 4: take expression j6: g0+ 6, 0 ; do 6: stop register expression j13: g0+13, 0 ; do 13: last used j18: g0+18, 0 ; do 18: zone index alarm j30: g0+30, 0 ; do 30: saved stack ref. saved w3 j70: 0, 5 ; first own : work_high j71: 0, 9 ; second own : work_low g6=k-2-g5 ; fin of abswords ; points : g7=k-2-g5 ; fin of points ; continuation ext. list : w. g9=k-g5 s3 ; date s4 ; time \f ; epu_simulator_sin * page 5 7 12 79, 16.13; ; stack picture : ; addr at entry working ; ; -6 : non addr A(i) ; -4 ; non addr B(i) ; -2 ; non count ; ; last used : stack ref at call the same ; +2 : segm table addr the same ; +4 : appetite, rel returnpoint the same ; ; +6 : 6<12 + 23 first storage ; +8 : absaddr zonedescr last storage ; +10 : 26 continution addr ; +12 : absadddr baseword explim ; d0: -1 < 1 ; remove last bit constant d1: 6 ; d2: 1 949 686 ; constant a <* used in sqrt *> f. d3: 0.0 ; radicand d4: -'280 ; constant at singularity w. \f ; epu_simulator_sin * page 6 7 12 79, 16.13; w. e1: ; entrypoint epu_single ; ********** al w1 -6 ; reserve 6 bytes jl. w3 (j3.) ; al w2 x1+6 ; w2 := last used ds. w3 (j30.) ; saved w3,last used ; take params dl w1 x2+12 ; take bytes used so w0 16 ; if expression jl. w3 (j4.) ; then take this ds. w3 (j30.) ; dl w1 x1 ; take value rl w3 x2+10 ; take first formal sz w3 1 ; if real cf w1 0 ; then convert to integer am (x2+8) ; dl w0 +2 ; load firs, last storage rs w3 x2+10 ; store continuation addr rs w3 x2+6 ; store first storage wa w1 6 ; w1 := w1 + w3 <* last storage used *> sl w0 x1 ; if last storage < last used jl. a0. ; then ws w1 6 ; w1 := index; rs. w2 (j13.) ; index alarm jl. w3 (j18.) ; zone index alarm ; a0: rs w1 x2+8 ; store last used storage rl w3 x1-4 ; w3 := last instruction al w0 35 ; explim := 35; rs w0 x2+12 ; al w0 0 ; w0 := 0; ws w1 x2+6 ; w1 := used bytes; wd. w1 d1. ; rem := (last-first) mod 6; sn. w3 (d9.) ; if last instruction <> legal stop se w0 0 ; or rem <> 0 jl. c0. ; then goto illegal stop jl. b0. ; goto take next op and decode ; illegal stop : c0: am 2 ; illegal stop ; legal stop: i4: al w3 0 ; normal rl w1 x2+10 ; ; set answer : i5: ; bytes:= continuation addr ws w1 x2+6 ; - first storage; rl w0 x2+12 ; take explim hs w0 0 ; shift 12 hl w0 7 ; add status extract 12; rs. w2 (j13.) ; release stack jl. w3 (j6.) ; end register expr. ; illegal : i7: al w3 1 ; illegal rl w1 x2+10 ; take cont addr al w1 x1-6 ; set to last accepted op jl. i5. ; goto set answer \f ; epu_simulator_sin * page 7 7 12 79, 16.13; ; set operation counter : b0: rl w3 x2+10 ; take operation addr al w3 x3+6 ; move to next rs w3 x2+10 ; save addr ; take next operation and decode : rl w1 x3-4 ; load operation sn. w1 (d9.) ; if op = legal stop jl. i4. ; then goto legal stop sl w1 0 ; if clear jl. a2. ; then dl. w0 d11. ; ds. w0 (j70.) ; set zero ds. w0 (j71.) ; a2: bl w3 3 ; load count sn w3 0 ; if count = 0 jl. b0. ; then goto set operation counter; ls w1 1 ; remove clear bit bl w1 2 ; load 2*operation sh w1 10 ; if hardware_op jl. i10. ; then goto take op addr sl w1 17 ; if op > 16 jl. i7. ; then goto illegal sn w1 16 ; if operation = chl jl. i21. ; then goto check cholesky se w1 14 ; if operation = dia jl. i9. ; then goto check count rs w3 x2+12 ; store explim jl. i10. ; goto op addr ; check counter i9: se w3 1 ; if count <> 1 jl. i7. ; then goto illegal ; take operation address : i10: rs w3 x2-2 ; save count dl w0 (x2+10) ; take adresses la. w3 d0. ; remove last bit la. w0 d0. ; remove last bit ds w0 x2-4 ; save op addr sl w1 10 ; if operation MONITOR-ware jl. a8. ; goto branch to monitorware rl. w1 x1+d5. ; load branch addr relative jl. b3. ; goto branch b1: ds. w0 (j70.) ; store result ; load count : loop : b2: rl w3 x2-2 ; load count al w3 x3-1 ; count := count - 1; sh w3 0 ; if count = 0 jl. b0. ; then goto set op count rs w3 x2-2 ; save count al w3 4 ; w3 := al w0 4 ; w0 := 4; aa w0 x2-4 ; w3 := a + 4; ds w0 x2-4 ; w0 := b + 4; and store; ; branch to HARDWARE-operation : b3: jl. x1 ; goto operation \f ; epu_simulator_sin * page 8 7 12 79, 16.13; ; ADD : a3: dl w0 x3 ; load A(i) fa. w0 (j70.) ; add RR jl. b1. ; goto store RR ; SUB : a4: dl. w0 (j70.) ; load RR fs w0 (x2-6) ; sub A(i) jl. b1. ; goto store RR ; MLA : a5: dl w0 x3 ; load A(i) fm w0 (x2-4) ; mult B(i) fa. w0 (j70.) ; add RR jl. b1. ; goto store RR ; MLS : a6: dl. w0 d11. ; fs w0 (x2-6) ; load -A(i) fm w0 (x2-4) ; mult B(i) fa. w0 (j70.) ; add RR jl. b1. ; goto store RR ; STR : a7: dl. w0 (j70.) ; load RR ds w0 (x2-6) ; A(i) := RR dl. w0 (j71.) ; load RR ds w0 (x2-4) ; B(i) := RR jl. b2. ; goto load count \f ; epu_simulator_sin * page 9 7 12 79, 16.13; ; branch to MONITORWARE operation : a8: rl. w3 x1+d5. ; load relative addr; a9: jl. x3 ; branch to operation ; DIV : i12: dl. w0 (j70.) ; load RR fd w0 (x2-4) ; div A ds w0 (x2-6) ; A := RR / B; jl. b0. ; ; DIA : i13: dl. w0 (j70.) ; load RR bl w1 1 ; take exp for zerotest sn w1 -2048 ; if float_zero jl. i15. ; then goto singular by zero ds. w0 d3. ; store radicand al w0 1 ; dia_result := 1; sh w3 -1 ; if negative al w0 2 ; then dia_result := 2; ; test exp loss : i14: am (x2-6) ; bl w1 +1 ; take exp of unreduced bs. w1 d3.+1 ; - exp of radicand; ds w1 (x2-4) ; store dia_result and exploss sl w1 (x2+12) ; if exploss >= explim jl. i16. ; then goto singular dl. w0 d3. ; load radicand; jl. i19. ; goto start sqrt ; singular by zero : i15: al w0 4 ; dia_result := 4; al w1 0 ; exploss := 0; jl. i17. ; goto dia_result ; singular : i16: al w0 3 ; dia_result := 3; ; store dia_result : i17: ds w1 (x2-4) ; dl. w0 d4. ; dia := - '280; jl. i20. ; goto store sqrt \f ; epu_simulator_sin * page 10 7 12 79, 16.13; ; SQRT : i18: dl. w0 (j70.) ; load RR bl w1 1 ; take exp for zerotest sn w1 -2048 ; if float_zero jl. i20. ; then goto store sqrt ds. w0 d3. ; store radicand ; start sqrt : i19: sl w3 0 ; if radicand > 0 jl. a10. ; then goto sqrt dl. w0 d11. ; load zero fs. w0 d3. ; radicand := - radicand ds. w0 d3. ; store radicand ; sqrt : ; see prog index 75015; first appr a+b*x; 2**43 <= x < 2**45 ; given b = 2**(-23) min relative errors ; for a = 0.929 682 927 462 * 2**21 = 1 949 686 ; max rel errors = 0.036 for a=a/b and 2**45 a10: so w0 1 ; if even expo am -1 ; then w3 := w3 // 8 ls w3 -2 ; else w3 := w3 // 4 ; rl w2 6 ; store radicand rl. w1 d2. ; w1 := a; wa w1 6 ; wa w1 6 ; w1 := a + x * 2**(-24); ; newton integer : wd w0 2 ; w3 := w3 // w1; wa w1 0 ; w1 := w0 + w1; ls w1 -1 ; w1 := w1 // 2; rl w3 4 ; load long radicand wd w0 2 ; w3 := w3 // w1 wa w1 0 ; w1 := w0 + w1; sx 2.010 ; iterand := if -, ouflow ls w1 -1 ; w1 else w1//2; ; prepare for newton real dl. w0 d3. ; load real radicand bl w2 1 ; w2 := expo(radicand); al w2 x2+1 ; w2 := w2 + 1; as w2 -1 ; w2 := w2 // 2; bz w2 5 ; expo(iterand) := w2 extract 12; ; newton real : fd w0 4 ; radicand / iterand fa w0 4 ; plus iterand bl w2 1 ; load expo al w2 x2-1 ; expo := expo - 1; hl w0 5 ; iterand := iterand / 2; ; restore w1, w2 am. (j30.) ; rl w2 -2 ; w2 := last used ; store sqrt : i20: ds w0 (x2-6) ; store result; jl. b0. ; goto take next operation \f ; epu_simulator_sin * page 11 7 12 79, 16.13; ; check cholesky : i21: ; test of preceeding operation rs w3 x2+12 ; save explim rl w3 x2+10 ; la. w3 d0. ; remove last bit bz w0 x3-9 ; w0 := count of preceeding operation bl w1 x3-10 ; w1 := precedding operation se w1 -1<11+3 ; if -, zmls sn w1 -1<11+2 ; or -, zmla jl. i33. ; then jl. i32. ; goto test mls i33: as w0 2 ; w0, w1 := 4 * count; rl w1 0 ; w0, w1 := a + 4*count, b + 4*count aa w1 x3-6 ; add addr <* result = dia elem *> la. w0 d0. ; remove last bit la. w1 d0. ; remove last bit ds w1 x2-4 ; save addr ;rl w3 x3-6 ; load addr; ;la. w3 d0. ;se w1 x3 ; if count <> 0 ;jl. i22. ; then goto add A ;dl w0 (x2-6) ; load A ;jl. i23. ; goto store; i22: dl. w0 (j70.) ; load RR fa w0 (x2-6) ; add A i23: ds. w0 (j70.) ; save RR ; decide dia or div se w1 (x2-6) ; if a <> b jl. i12. ; then goto div am (x2+10) ; rl w3 -2 ; w3 := col_status_addr <* = c *> la. w3 d0. ; remove last bit rs w3 x2-4 ; store addr jl. i13. ; goto dia ; test mls or mla : i32: se w1 3 ; if mls sn w1 2 ; or mla jl. i33. ; then goto load addr jl. i7. ; else goto illegal d5: a3 - b3 ; ADD addr rel to jump a4 - b3 ; SUB addr rel to jump a5 - b3 ; MLA addr rel to jump a6 - b3 ; MLS addr rel to jump a7 - b3 ; STR addr rel to jump i12 - a9 ; DIV addr rel to jump i18 - a9 ; SQR addr rel to jump i13 - a9 ; DIA addr rel to jump ; i21 - a9 ; CHL addr rel to jump ( not used ); d9: 4095<12 + 1 ; STP 1 ; legal stop test; f. d11: 0.0 ; float zero w. \f ; epu_simulator_sin * page 12 7 12 79, 16.13; g8: c.g8-e8-506 m. code epusingle too long segm 2 z. c.502-g8+e8 jl -1 , r.252-(:g8-e8:)>1 ; fill with -1 z. <:epusingle<0><0>:> i. e. ; entry tails : e18=1<23+4 e19=-1 e20=4<12 ; epu_single g0: 2 ; first tail : 2 segm 0 , 0, 0, 0 ; fill 1<23+0<12+e1-e8 ; entrypoint 5<18+13<12+8<6+0, 0 ; long proc, integer value, zone 4<12 + e0-e5 ; code proc start of extern. list e17 ; 1 code segm. bytes in perm core ; epu_mode e18 ; modekind bs 0, 0, 0, 0 ; fill e19=e19+2 e19 ; byte addr in own core 9<18, 0 ; spec own integer e20 ; code var, start of ext list e17 ; code segm, bytes in own core ; work_high e18 ; modekind bs 0, 0, 0, 0 ; fill e19=e19+4 e19 ; byte addr in own core 10<18, 0 ; spec own real e20 ; code var, start of ext list e17 ; code segm, bytes in own core ; work_low g1: e18 ; modekind bs 0, 0, 0, 0 ; fill e19=e19+4 e19 ; byte addr in own core 10<18, 0 ; spec own real e20 ; code var, start of ext list e17 ; code segm, bytes in own core e17=1<12+e19+1 p.<:insertproc:> e. ; stop outermost block if ok.no ( mode 0.yes message epusingle not ok lookup epusingle ) if 0.no ( if 1.yes scope project, epumode, workhigh, worklow if 2.yes scope user, epumode, workhigh, worklow ) lookup epusingle epumode , workhigh worklow end finis ▶EOF◀