{File name:  <Workstation>mc>Misc.mc
Description: Miscellaneous Mesa  opcodes,
Author: R. Garner,
Created: April 3, 1980,
Last Edited: Amy Fasnacht, 31-Aug-83 10:50:05 Move IOPage for larger VM
Last Edited: Daniels, 15-Jun-83 19:01:49 new instruction set
Last Edited: Amy Fasnacht,  4-Jan-83 10:52:30 Fix typo in BLTLR comment
Last Edited: Amy Fasnacht, 22-Dec-82 10:49:15 Make BLTLR microcode implementation
Last Edited: Amy Fasnacht, September 2, 1982  12:19 PM Do STK←TOS at Unimplemented Opcodes
Last Edited: Amy Fasnacht, August 2, 1982  11:41 AM MaintenancePanelOffset
Last Edited: Amy Fasnacht, April 29, 1982  1:48 PM Add TStatus to @INPUT and TAddr to @OUTPUT
Last Edited: Amy Fasnacht, April 23, 1982  2:01 PM  Add conditional assembly for MagTape
Edited: Sandman, February 24, 1982  2:18 PM Add SPP inst
Edited: Sandman, November 17, 1981  5:04 PM new instruction set
Edited: Sandman, April 23, 1981  8:46 AM: Fix Stack on Misc ~IN[0..15]
Last Edited: Jim Frandeen, March 16, 1981  11:51 AM: Allow Block to catch Checksum Misc
Last Edited: Johnsson, January 22, 1981  1:11 PM}

{Assembly Configs:

Config#		File
0	Mesa.db
1	RavenMesa.db
2	TridentMesa.db
3	TridentRavenMesa.db
4	MagTapeMesa.db
5	TridentMagTapeMesa.db}

{*****************************************************************************
	ESC(L) - Escape operations
*****************************************************************************}

@ESCL:	Xbus ← ibHigh, XDisp, GOTO[ESCx],		c1, opcode[371'b];

@ESC:	Xbus ← ibHigh, XDisp,				c1, opcode[370'b];
ESCx:	TT ← ib, XDisp, push, DISP4[ESCHi],			c2;
	PC ← PC + 1, STK ← TOS, pop, DISP4[ESC0n],	c3, at[0,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, DISP4[ESC1n],	c3, at[1,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, DISP4[ESC2n],	c3, at[2,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[3,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[4,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[5,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[6,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, DISP4[ESC7n],	c3, at[7,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, DISP4[ESC8n],	c3, at[8,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[9,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[0A,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[0B,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[0C,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[0D,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[0E,10,ESCHi];
	PC ← PC + 1, STK ← TOS, pop, CANCELBR[ESCa,0F],	c3, at[0F,10,ESCHi];

ESCa:	PC ← PC - 1,							c1;
ESCb:	T ← 0FF + TT + 1,						c2;
ESCc:	G ← 1, GOTO[Trapc1],						c3;

ESC0n:	PC ← PC - 1, GOTO[ESCb],			c1, at[0,10,ESC0n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[1,10,ESC0n];
	{@MW in Process					c1, at[2,10,ESC0n];}
	{@MR in Process					c1, at[3,10,ESC0n];}
	{@NC in Process					c1, at[4,10,ESC0n];}
	{@BC in Process					c1, at[5,10,ESC0n];}
	{@REQ in Process				c1, at[6,10,ESC0n];}
	{@SM in Misc					c1, at[7,10,ESC0n];}
	{@SMF in Misc					c1, at[8,10,ESC0n];}
	{@GMF in Misc					c1, at[9,10,ESC0n];}
	{@AF in Xfer					c1, at[0A,10,ESC0n];}
	{@FF in Xfer					c1, at[0B,10,ESC0n];}
	{@PI in Xfer					c1, at[0C,10,ESC0n];}
	{@PO in Xfer					c1, at[0D,10,ESC0n];}
	{@POR in Xfer					c1, at[0E,10,ESC0n];}
	{@SPP in Process				c1, at[0F,10,ESC0n];}

	{@DI in Xfer					c1, at[0,10,ESC1n];}
	{@EI in Xfer					c1, at[1,10,ESC1n];}
	{@XOR in Stack					c1, at[2,10,ESC1n];}
	{@DAND in Stack					c1, at[3,10,ESC1n];}
	{@DIOR in Stack					c1, at[4,10,ESC1n];}
	{@DXOR in Stack					c1, at[5,10,ESC1n];}
	{@ROTATE in Stack				c1, at[6,10,ESC1n];}
	{@DSHIFT in Stack				c1, at[7,10,ESC1n];}
	{@LINT in Stack					c1, at[8,10,ESC1n];}
	{@JS in Jump					c1, at[9,10,ESC1n];}
	{@RCFS in StringField				c1, at[0A,10,ESC1n];}
	{@RC in Read					c1, at[0B,10,ESC1n];}
	{@UDIV in Stack					c1, at[0C,10,ESC1n];}
	{@LUDIV in Stack				c1, at[0D,10,ESC1n];}
	{@ROB in Read					c1, at[0E,10,ESC1n];}
	{@WOB in Write					c1, at[0F,10,ESC1n];}

	{@DSK in Xfer					c1, at[0,10,ESC2n];}
	{@XE in Xfer					c1, at[1,10,ESC2n];}
	{@XF in Xfer					c1, at[2,10,ESC2n];}
	{@LSK in Xfer					c1, at[3,10,ESC2n];}
	{@BNDCKL in Stack				c1, at[4,10,ESC2n];}
	{@NILCK in Stack				c1, at[5,10,ESC2n];}
	{@NILCKL in Stack				c1, at[6,10,ESC2n];}
	{@BLTLR in Block				c1, at[7,10,ESC2n];}
	{@BLEL in Block					c1, at[8,10,ESC2n];}
	{@BLECL in Block				c1, at[9,10,ESC2n];}
	{@CKSUM in Block				c1, at[0A,10,ESC2n];}
	{@BITBLT in BBInit				c1, at[0B,10,ESC2n];}

IfEqual[Config, 0, SkipTo[TextBltImpl], ];

@TXTBLT:
	PC ← PC - 1, GOTO[ESCb],			c1, at[0C,10,ESC2n];

TextBltImpl!

@BYTBLT:
	PC ← PC - 1, GOTO[ESCb],			c1, at[0D,10,ESC2n];
@BYTBLTR:
	PC ← PC - 1, GOTO[ESCb],			c1, at[0E,10,ESC2n];
@VERSION:
	PC ← PC - 1, GOTO[ESCb],			c1, at[0F,10,ESC2n];

@a177:	PC ← PC - 1, GOTO[ESCb],			c1, at[0F,10,ESC7n];

	{@INPUT in Misc					c1, at[0,10,ESC8n];}
	{@OUTPUT in Misc				c1, at[1,10,ESC8n];}
@LOADRAMJ:
	PC ← PC - 1, GOTO[ESCb],			c1, at[2,10,ESC8n];

IfEqual[Config, 1, SkipTo[BandBltImpl], ];
IfEqual[Config, 3, SkipTo[BandBltImpl], ];

@BANDBLT:
	PC ← PC - 1, GOTO[ESCb],			c1, at[3,10,ESC8n];

BandBltImpl!

	PC ← PC - 1, GOTO[ESCb],			c1, at[4,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[5,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[6,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[7,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[8,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[9,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[0A,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[0B,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[0C,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[0D,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[0E,10,ESC8n];
	PC ← PC - 1, GOTO[ESCb],			c1, at[0F,10,ESC8n];



{*****************************************************************************
	SM	Set Map
*****************************************************************************}

@SM:	TOS ← TOS and 7, pop,				c1, at[7,10,ESC0n];
	TT ← STK, pop,							c2;
	TT ← TT LRot8,							c3;

	Xbus ← STK, pop,						c1;
	T ← STK, pop, 							c2;
	rhT ← T ← T LRot8,						c3;

	TOS ← TOS LRot4, fXpop, push,					c1;
	TT ← TT and ~0F0,						c2;
	TT ← TT or TOS, Xbus ← TOS LRot12, XDisp,			c3;

SMd:	Map ← [rhT,T], T ← 80, DISP4[SMc,8],				c1;
SMc:	MDR ← TT and ~T, IBDisp, GOTO[SLa],			c2, at[08,10,SMc];
	MDR ← TT and ~T, IBDisp, GOTO[SLa],			c2, at[09,10,SMc];
	MDR ← TT or T, IBDisp, GOTO[SLa],			c2, at[0A,10,SMc];
	MDR ← TT or T, IBDisp, GOTO[SLa],			c2, at[0B,10,SMc];
	MDR ← TT and ~T, IBDisp, GOTO[SLa],			c2, at[0C,10,SMc];
	MDR ← TT and ~T, IBDisp, GOTO[SLa],			c2, at[0D,10,SMc];
	MDR ← TT and ~T, IBDisp, GOTO[SLa],			c2, at[0E,10,SMc];
	MDR ← TT or T, IBDisp, GOTO[SLa],			c2, at[0F,10,SMc];



{*****************************************************************************
	SMF	Set Map Flags
*****************************************************************************}

@SMF:	pop, L0←0,					c1, at[8,10,ESC0n];
	T ← STK, pop,							c2;
SMFa:	TOS ← TOS and 7, fXpop, push,							c3;

	rhT ← T ← T LRot8,						c1;
	Rx ← ~80,							c2;
	TT ← TOS{map flags} LRot4,					c3;

	Map ← [rhT,T],							c1;
	Q ← ~0F0,							c2;
	TOS ← Rx and MD,						c3;

	Rx ← TOS LRot12, XDisp{disp old flags},	c1;
	TOS ← TOS and Q, DISP4[SMFb,8],					c2;
SMFb:	TT ← TOS or TT, GOTO[SMFc],			c3, at[08,10,SMFb];
	TT ← TOS or TT, GOTO[SMFc],			c3, at[09,10,SMFb];
	TT ← TOS or TT, GOTO[SMFc],			c3, at[0A,10,SMFb];
	TT ← TOS or TT, GOTO[SMFc],			c3, at[0B,10,SMFb];
	TT ← TOS or TT, GOTO[SMFc],			c3, at[0C,10,SMFb];
	TT ← TOS or TT, GOTO[SMFc],			c3, at[0D,10,SMFb];
	TT ← TOS or 60, GOTO[SMFc],			c3, at[0E,10,SMFb];
	TT ← TOS or TT, GOTO[SMFc],			c3, at[0F,10,SMFb];

SMFc:	Rx ← Rx and 7,							c1;
	TOS ← TOS LRot8, push,						c2;
	STK ← Rx, push, L0Disp,						c3;

	STK ← TOS, push,BRANCH[SMFd, GMFa],				c1;
SMFd:	STK ← 0,							c2;
	Xbus ← TT LRot12, XDisp, GOTO[SMd],				c3;


{*****************************************************************************
	GMF	Get Map Flags
*****************************************************************************}

@GMF:	T ← STK, pop, L0←1,				c1, at[9,10,ESC0n];
	GOTO[SMFa],							c2;

GMFa:	STK ← 0, IBDisp, GOTO[SLa],					c2;


{*****************************************************************************
	INPUT	Input
*****************************************************************************}

@INPUT:	Ybus ← TOS, YDisp,				c1, at[0,10,ESC8n];
	fXpop, push, IBDisp, DISP4[Input],				c2;
Input:	TOS ← EIData, DISPNI[OpTable],			c3, at[0,10,Input];
	TOS ← EStatus, DISPNI[OpTable],			c3, at[1,10,Input];
	TOS ← KIData, DISPNI[OpTable],			c3, at[2,10,Input];
	TOS ← KStatus, DISPNI[OpTable],			c3, at[3,10,Input];
	TOS ← MStatus, DISPNI[OpTable],			c3, at[5,10,Input];
	TOS ← KTest, DISPNI[OpTable],			c3, at[6,10,Input];
	TOS ← IOPIData, DISPNI[OpTable],		c3, at[8,10,Input];
	TOS ← IOPStatus, DISPNI[OpTable],		c3, at[9,10,Input];
	TOS ← TStatus, DISPNI[OpTable],			c3, at[0A,10,Input];


{*****************************************************************************
	OUTPUT	Output
*****************************************************************************}

@OUTPUT:
	T ← STK, pop, Ybus ← TOS, YDisp,		c1, at[1,10,ESC8n];
	TOS ← STK, pop, IBDisp, DISP4[Output],				c2;

Output:	IOPOData ← T LRot0, DISPNI[OpTable],		c3, at[0,10,Output];
	IOPCtl ← T LRot0, DISPNI[OpTable],		c3, at[1,10,Output];
	KOData ← T LRot0, DISPNI[OpTable],		c3, at[2,10,Output];
	KCtl ← T LRot0, DISPNI[OpTable],		c3, at[3,10,Output];
	EOData ← T LRot0, DISPNI[OpTable],		c3, at[4,10,Output];
	EICtl ← T LRot0, DISPNI[OpTable],		c3, at[5,10,Output];
	PCtl ← T LRot0, DISPNI[OpTable],		c3, at[9,10,Output];
	MCtl ← T, DISPNI[OpTable],			c3, at[0A,10,Output];
	EOCtl ← T LRot0, DISPNI[OpTable],		c3, at[0C,10,Output];
	KCmd ← T LRot0, DISPNI[OpTable],		c3, at[0D,10,Output];
	TAddr ← T LRot0, DISPNI[OpTable],		c3, at[0E,10,Output];
	POData ← T LRot0, DISPNI[OpTable],		c3, at[0F,10,Output];


{*****************************************************************************
	WR - Write Registers
*****************************************************************************}

@WRPSB:	uPSB ← TOS,					c1, at[0,10,ESC7n];
WRx:	TOS ← STK, pop, IBDisp, GOTO[DISPNIonly],		c2;

@WRMDS:	UvMDS ← TOS, L0 ← 0,				c1, at[1,10,ESC7n];
	Q ← UvL,						c2;
WRMDSc:	rhMDS ← UvMDS,						c3;

	Map ← Q ← [rhMDS, Q], L0Disp,				c1;
	BRANCH[WRMDSa, WRMDSb],					c2;
WRMDSa:	L ← rhL ← MD,						c3;

	MAR ← L ← [rhL, Q+0],					c1;
	Q ← UvG, L0 ← 1, GOTO[WRMDSc],				c2;

WRMDSb:	G ← rhG ← MD,						c3;

	MAR ← G ← [rhG, Q+0], GOTO[WRx],			c1;

@WRWP:	uWP ← TOS, GOTO[WRx],				c1, at[2,10,ESC7n];

@WRWDC:	uWDC ← TOS, GOTO[WRx],				c1, at[3,10,ESC7n];

@WRPTC:	uPTC ← TOS, GOTO[WRx],				c1, at[4,10,ESC7n];

@WRIT:	T ← STK, pop,					c1, at[5,10,ESC7n];
	TT ← TOS,						c2;
	TOS ← STK, pop,						c3;

	{must write all three clock regs in single click}
	uClockHigh ← TT,					c1;
	uClockLow ← T, IBDisp,					c2;
	uClockBits ← 0, DISPNI[OpTable],			c3;


@WRXTS:	uXTS ← TOS, GOTO[WRx],					c1, at[6,10,ESC7n];

@WRMP:	Rx ← uIOPage,						c1, at[7,10,ESC7n];
	Q ← MaintenancePanelOffset,				c2;
	rhRx ← IOPageHigh,					c3;

	MAR ← [rhRx, Q + 0],					c1;
	MDR ← TOS, IBDisp, GOTO[SLa],				c2;
	

{*****************************************************************************
	RR - Read Registers
*****************************************************************************}

@RRPSB:	TOS ← uPSB, push, GOTO[RRx],			c1, at[8,10,ESC7n];
RRx:	push, fZpop, IBDisp, GOTO[DISPNIonly],			c2;

@RRMDS:	TOS ← UvMDS, push, GOTO[RRx],			c1, at[9,10,ESC7n];

@RRWP:	TOS ← uWP, push, GOTO[RRx],			c1, at[0A,10,ESC7n];
@RRWDC:	TOS ← uWDC, push, GOTO[RRx],			c1, at[0B,10,ESC7n];
@RRPTC:	TOS ← uPTC, push, GOTO[RRx],			c1, at[0C,10,ESC7n];
@RRXTS:	TOS ← uXTS, push, GOTO[RRx],			c1, at[0E,10,ESC7n];
@RRIT:	Q ← uClockHigh, push,				c1, at[0D,10,ESC7n];
	TOS ← RShift1 uClockBits, SE←0,				c2;
	TT ← uClockLow, push, GOTO[ADCa],			c3;


{*****************************************************************************
	Unimplemented Opcodes
*****************************************************************************}

Unimp:	TT ← 76'b, push, GOTO[OpcodeTrap],			c1, opcode[76'b];
	TT ← 77'b, push, GOTO[OpcodeTrap],			c1, opcode[77'b];
	TT ← 175'b, push, GOTO[OpcodeTrap],			c1, opcode[175'b];
	TT ← 176'b, push, GOTO[OpcodeTrap],			c1, opcode[176'b];
	TT ← 177'b, push, GOTO[OpcodeTrap],			c1, opcode[177'b];
	TT ← 277'b, push, GOTO[OpcodeTrap],			c1, opcode[277'b];
	TT ← 372'b, push, GOTO[OpcodeTrap],			c1, opcode[372'b];
	TT ← 373'b, push, GOTO[OpcodeTrap],			c1, opcode[373'b];
	TT ← 374'b, push, GOTO[OpcodeTrap],			c1, opcode[374'b];
	TT ← 375'b, push, GOTO[OpcodeTrap],			c1, opcode[375'b];
	TT ← 376'b, push, GOTO[OpcodeTrap],			c1, opcode[376'b];
OpcodeTrap:
	T ← sOpcodeTrap, STK ← TOS, pop, GOTO[ESCc],			c2;


	{ E N D }