;; PrintMc.mu - "Print Microcode" (Print pass) %0, 1777, 637, TRAPX10; X10 microcode locn of TRAP %0, 1777, 645, TRAPX13; X13 location %0, 1777, 37, TRAP1; X21 location #SlotMc.Mu; #DispatchMc.Mu; ; PrintVersatecTrap ; Ac0 => pointer to buffer for scan line ; Ac1 = count of bytes to spit out. !1,2,VLOOP,VDONE; !1,2,SB2,SBDONE; $VAL1 $R15; $VAL2 $R16; $PCOMM $R70; $OUTADR $R67; TRP0: T_4000; L_10000+T, TASK; PCOMM_L; ** T_177000; L_16+T, TASK; OUTADR_L; ** TRPC: L_AC1-1, BUS=0, TASK; AC1_L, :VLOOP; ** VLOOP: MAR_AC0; L_AC0+1; AC0_L; T_ALLONES; L_MD XOR T; VAL2_L, TASK; Right 8 bits here VAL1_L LCY 8; ** Left 8 bits here SB1: T_377; T_VAL1.T; L_PCOMM+T; PiClkBit+NotPrintBit MAR_OUTADR; T_10000; MD_LREG; MAR_OUTADR; L_LREG XOR T; MD_LREG; MAR_OUTADR; L_LREG XOR T, TASK; MD_LREG; ** L_AC1-1, BUS=0, TASK; AC1_L, :SB2; SB2: T_377; T_VAL2.T; L_PCOMM+T; PiClkBit+NotPrintBit MAR_OUTADR; T_10000; MD_LREG; MAR_OUTADR; L_LREG XOR T; MD_LREG; MAR_OUTADR; L_LREG XOR T, TASK; MD_LREG, :TRPC; ** VDONE: :BCPLRET; SBDONE: :BCPLRET; ; ; ; PrintHgTrap ; AC0 = # bytes to try to spit out ; AC1 = Pointer to end of buffer +1 ; Returns in AC0 the number of bytes remaining to spit out $INADR $R70; $ABITS $40000; First send: extConnect + data $BBITS $400; Then XOR this (dataStrobe) !1,2,HGB1,HGB2; !1,2,HGB1A,HGDONE; !1,2,HGB1B,HG1DONE; !1,2,HGB2B,HG2DONE; TRP1: T_177000; L_101+T; OUTADR_L; #177101 L_100+T, TASK; INADR_L; ** #177201 L_AC0; Number of bytes remaining VAL1_L RSH 1; Convert to number of words T_VAL1; L_AC1-T-1, TASK; AC1_L; ** Pointer to first word -1 MAR_AC1; T_377; L_MD AND T, TASK; VAL2_L; ** In case first is odd byte ; Main loop. AC0 = number of bytes remaining to do. HGB: L_AC0-1, BUSODD; AC0_L, :HGB1; ; Sending VAL1 (high-order byte) HGB1: MAR_L_AC1+1, SH<0; Test for all done (AC0=-1) AC1_L, :HGB1A; HGB1A: T_377; L_MD; VAL1_L LCY 8; L_LREG AND T; VAL2_L; L_VAL1 AND T, TASK; VAL1_L; ** MAR_INADR; Check to see if FIFO empty (sign bit=0) T_ABITS; L_MD; L_VAL1+T, SH<0; VAL1_L, :HGB1B; HGB1B: MAR_OUTADR; T_BBITS; MD_VAL1; Ship value to Hg MAR_OUTADR; L_VAL1 XOR T, TASK; MD_LREG; ** Ship value to Hg with dataStrobe on MAR_OUTADR; NOP; MD_VAL1, :HGB; ; Sending VAL2 (low-order byte) HGB2: MAR_INADR; T_ABITS; L_MD; L_VAL2+T, SH<0; VAL2_L, :HGB2B; HGB2B: MAR_OUTADR; T_BBITS; MD_VAL2; Ship value to Hg MAR_OUTADR; L_VAL2 XOR T, TASK; MD_LREG; ** Ship value to Hg with dataStrobe on MAR_OUTADR; NOP; MD_VAL2, :HGB; HGDONE: L_MD, :HG1DONE; HG1DONE: L_AC0+1, :HGXIT; HG2DONE: L_AC0+1; HGXIT: AC0_L, :BCPLRET; ; Unused traps: TRP2: NOP, :BUMTRAP; TRP3: NOP, :BUMTRAP; TRP4: NOP, :BUMTRAP; TRP5: NOP, :BUMTRAP; TRP6: NOP, :BUMTRAP; TRP7: NOP, :BUMTRAP;