;; 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;