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