; Row Rotation Microcode for Spruce ; This code, merged with OrbitMc and TriconBodyMc into SpruceMc, will rotate eight rows ; of data bytes, producing (in a new location) the rotated values. ; Input: ; AC1: start address-1 ; AC2: ending address-1 ; AC3: words per row (WPR) ; Each row contains WPR words. In the output array, the first output byte is formed from the ; high-order bits of the first words of each input row, the second byte comes from bit 1, etc; in ; other words, "horizontal" samples have been converted to "vertical" samples. !1,2, NEXTCOL, ROTDONE; Columns exhausted test (outer) !1,2, NEXTWD, WDDONE; All registers filled from memory test (inner) !1,2, NextIt, TRYNEXT; Rows exhausted test (inner) !1,2, ItGo, Update; Inner-Inner loop finish test ROWROT: L_WPR-1, :TESTDONE; let RowRotate(inBufM1, outBufM1, wPL) be TRYNEXT: L_RCNT-1; for column = 1 to wPL do TESTDONE: RCNT_L, SH<0; [oneColumn L_INBUF+1, :NEXTCOL; [NEXTCOL, ROTDONE] NEXTCOL: INBUF_L, TASK; INADR_L; ** inBufM1, inAdr = inBufM1+1, inBufM1 L_7, :TESTWD; for i = 0 to 7 do TRYWD: L_WDCNT-1; [ TESTWD: WDCNT_L, SH<0; SHR!(7-i) = @inAdr MAR_T_INADR, :NEXTWD; [NEXTWD, WDDONE] NEXTWD: L_WPR+T; inAdr = inAdr+wPL INADR_L; ] SINK_WDCNT, BUS; !7,10, LDSH1, LDSH2, LDSH3, LDSH4, LDSH5, LDSH6, LDSH7, LDSH8; L_MD, TASK, :LDSH1; ; Register load dispatch LDSH1: SHR1_L, :TRYWD; ** LDSH2: SHR2_L, :TRYWD; ** LDSH3: SHR3_L, :TRYWD; ** LDSH4: SHR4_L, :TRYWD; ** LDSH5: SHR5_L, :TRYWD; ** LDSH6: SHR6_L, :TRYWD; ** LDSH7: SHR7_L, :TRYWD; ** LDSH8: SHR8_L, :TRYWD; ** WDDONE: L_7, :TESTIT; for wd = 1 to 8 do TRYIT: L_WDCNT-1; TESTIT: WDCNT_L, SH<0; [oneOutputWord L_17,:NextIt; [NextIt, TRYNEXT] ItLoop: L_BITCNT-1, BUS=0; NextIt: SINK_LASTL, BUS, :ItGo; [ItGo, Update] !17, 10, UseSH8, UseSH7, UseSH6, UseSH5, UseSH4, UseSH3, UseSH2, UseSH1; ItGo: BITCNT_L, :UseSH8; UseSH1: T_L_SHR1; SHR1_L LSH 1, :ItDo; HOLD = HOLD lshift 1 + UseSH2: T_L_SHR2; HOLD = HOLD lshift 1 + SHR2_L LSH 1, :ItDo; SHR2 rshift 15 UseSH3: T_L_SHR3; . . . SHR3_L LSH 1, :ItDo; UseSH4: T_L_SHR4; SHR4_L LSH 1, :ItDo; UseSH5: T_L_SHR5; SHR5_L LSH 1, :ItDo; UseSH6: T_L_SHR6; SHR6_L LSH 1, :ItDo; UseSH7: T_L_SHR7; SHR7_L LSH 1, :ItDo; UseSH8: T_L_SHR8; HOLD = HOLD lshift 1 + SHR8_L LSH 1, :ItDo; SHR8 rshift 15 ItDo: L_HOLD, TASK; SHR1 rshift 15 HOLD_L MLSH 1, :ItLoop; ** SHR1 = SHR1 lshift 1 !1777, 1, KillBus; some things have to change if anybody else needs 1777 Update: MAR_L_OUTBUF+1, :KillBus; KillBus: OUTBUF_L, TASK; ; available if can also do task MD_HOLD, :TRYIT; ** ROTDONE: :NOVEM; // return ;; DCS, March 6, 1978 2:57 PM, Created to speed up Spruce bit map processing ;; March 6, 1978 6:27 PM, repair initial bugs ;; March 8, 1978 3:54 PM, word fetch in a loop, reverse order of register fill to reverse rotation direction ;; March 9, 1978 2:18 PM, tisk where you used to task, and vice versa ;; October 17, 1978 3:12 PM, collapse open code into loop ;; October 20, 1978 11:58 AM, move defs to SpruceDefs.Mu ;; November 6, 1978 9:51 PM, UseSH* table was backward ;;