;; Press Microcode -- "Main Microcode" (Font, PreScan passes) ; last modified by Ramshaw, March 30, 1981 2:51 PM ; - patches to outermost loop and BCPL return code, (one more instruction). ; modified by Butterfield, March 7, 1980 4:21 PM ; - revamp Routine23's loop control - 3/7 ; - use PressFloatMc's exit sequence for Routine23 - 3/6/80 %0, 1777, 37, TRAP1; RAM trap location $LREG $R40; #TriConMc.Mu; !7,10,RRSHFT,RRSHFT2,,RRSHFT4,,,,RRSHFT8; !7,10,RLSHFT,RLSHFT2,,RLSHFT4,,,,RLSHFT8; !17,20,PStepDone,RMSK1,,RMSK2,,,,RMSK4,,,,,,,,RMSK8; !1,2,ContinueCount,CountDone; !1,2,ContinueI,NextPStep; !1,2,ContinueJ,NextI; #PressFloatMc.Mu; ; modified to include Routine23 (Rotor), and several routines removed ; //------------------------------------------------------------------------- ; let Rotor(Page) be // Page => 16 16*16 bit squares. All are rotated! ; //------------------------------------------------------------------------- ; [ ; let masktable=table [ #125252;#146314;0;#170360;0;0;0;#177400] ; ; for count = 15 to 0 by -1 do ; [ ; let pStepMinus1 = 15 // macro pStep = pStepMinus1 + 1 ; while pStepMinus1 gr 0 do ; [ ; PstepMinus1 = pStepMinus1 rshift 1 ; let mask1 = masktable!pStepMinus1 ; for i = 20 - pStep - pStep to 0 by - pStep - pStep ; [ ; let j = pStepMinus1 ; until j ls 0 do ; [ ; let Word = Page + i + j ; let mask2 = not mask1 ; let t1 = Word!0 ; let Word2 = Word + Pstep ; let t2 = Word2!0 ; Word!0=(t1&mask1)+((t2 rshift Pstep)&mask2) ; Word2!0=(t2&mask2)+((t1 lshift Pstep)&mask1) ; j=j-1 ; ] ; ] ; ] ; Page=Page+16 ; ] ; ] $PAGE $R3; AC0 synonym $PSTEP $R2; AC1 (R register for shifts) $RSLT $R15; R register for shifts $RSLT2 $R16; R register for shifts $WORD $R17; R register for shifts $J $R6; R register for BUS=0 -- shared with PC $MASK1 $R70; $MASK2 $R67; $WORD2 $R66; $I $R65; $T1 $R64; $T2 $R63; $COUNT $R62; Routine23: L_ 17; Initial COUNT and PSTEP NextCount: COUNT_ L; L_ 17, SH<0; NextPStep: PSTEP_ L RSH 1, :ContinueCount; !ContinueCount,CountDone; ContinueCount: SINK_ LREG, BUS; BUS on the last value of PSTEP L_ T_ MASK1, :PStepDone; !PStepDone,RMSK1,RMSK2,RMSK4,RMSK8 PStepDone: T_ 20; L_ PAGE +T; PAGE_ L; L_ COUNT -1, :NextCount; CountDone: L_AC3+1, :PCgetsLret; use PressFloat's error return sequence; RMSK8: L_177400, TASK, :RMSK; RMSK4: L_170360, TASK, :RMSK; RMSK2: RSLT_L RSH 1; L_RSLT; RMSK1: RSLT_L RSH 1; L_RSLT XOR T, TASK; RMSK: MASK1_L; ** L_ 20; NextI: T_ PSTEP; L_ LREG -T-1; L_ LREG -T-1; I_ L, L_ T, SH<0; NextJ: J_ L, SH<0, :ContinueI; !ContinueI,NextPStep ContinueI: T_ L_ I, :ContinueJ; !ContinueJ,NextI; ContinueJ: ;word=page+i+j L_PAGE+T; T_J; ;t1=word!0 MAR_L_LREG+T; WORD_L,T_0-1; ;mask2=not mask1 L_MASK1 XOR T; MASK2_L; L_T_MD, TASK; T1_L; ** T_T1; L_MASK2 AND T; (by the way, mask2=mask1 rshift pstep) ;word2!0=(t2&mask2)+((t1 lshift pstep)&mask1) SINK_PSTEP, BUS; RSLT2_L LSH 1, :RLSHFT; !RLSHFT,2,4,8 RLSHFT4: T_RSLT2; L_RSLT2+T, TASK; RSLT2_L LSH 1; ** RLSHFT2: T_RSLT2; L_RSLT2+T, TASK; RSLT2_L, :RLSHFT; ** RLSHFT8: RSLT2_L LCY 8; RLSHFT: T_PSTEP; ;word2=word+Pstep; t2=Word2!0 MAR_L_WORD+T+1; ("+1" because PSTEP is really PStepMinus1) WORD2_L; L_MD; T2_L; ;word!0=(t1&mask1)+((t2 rshift pstep)&mask2) SINK_PSTEP, BUS, TASK; RSLT_L RSH 1, :RRSHFT; ** !RRSHFT,2,4,8 RRSHFT4: L_RSLT, TASK; RSLT_L RSH 1; ** L_RSLT, TASK; RSLT_L RSH 1; ** RRSHFT2: L_RSLT, TASK; RSLT_ L RSH 1, :RRSHFT; ** RRSHFT8: L_T2, TASK; RSLT_L LCY 8; ** RRSHFT: T_MASK2; L_RSLT AND T; T_T1; MAR_WORD; T_MASK1.T; L_LREG OR T, TASK; MD_LREG; ** T_T2; MAR_WORD2; T_MASK2.T; L_RSLT2 OR T, TASK; MD_LREG; ** ;j=j-1; repeatwhile j ge 0 L_ J -1, :NextJ;