{
File name Read.mc
Description: Mesa Read op-codes
Author: DXC     
Created: February 16, 1980
AHL/JPM, 6-Jan-87 8:28:38, Changes for MDS relief
DEG,  1-Sep-84 19:46:40, Add copyright notice
AEF, 11-Nov-83 11:15:09, Add labels at R+1 and RL+1
AXD, 15-Jun-83 18:18:49, new instruction set
JGS, January 13, 1982  3:32 PM, add L1←L1.PopDec2 in LILP for RLIPF
JGS, November 2, 1981  3:43 PM, new instruction set
Last edited: DXC, March 28, 1980  5:06 PM
Last edited: RXG, April 2, 1980  4:51 PM
Last edited: JGS, 26-May-81 10:24:01
}

{ 	Copyright (C) 1980, 1981, 1982, 1983 by Xerox Corporation.  All rights reserved.}

{
Rn	Read n = 0-1
RB	Read Byte
RLn	Read Long n = 0
RLB	Read Long Byte
RDn	Read Double n = 0
RDB	Read Double Byte
RDLn	Read Double Long n = 0
RDLB	Read Double Long Byte
RC	Read Code

RLI0n	Read Local Indirect Zero n = 0-3
RLIP	Read Local Indirect Pair
RLILP	Read Local Indirect Long Pair
RLDI0n	Read Local Double Indirect Zero n = 0
RLDIP	Read Local Double Indirect Pair
RLDILP	Read Local Double Indirect Long Pair

RGIP	Read Global Indirect Pair
RGILP	Read Global Indirect Long Pair

ROB	Read Overhead Byte
}

{*****************************************************************************
	Rn{n:[0..1]}
*****************************************************************************}

@R0:	Map ← Q ← [rhMDS, TOS + 0], L1←L1.Dec, pop, GOTO[Rn],	c1, opcode[100'b];
@R1:	Map ← Q ← [rhMDS, TOS + 1], L1←L1.Dec, pop, GOTO[Rn],	c1, opcode[101'b];

Rn:	push, PC ← PC + PC16,						c2;
RMpc3:	Rx ← rhRx ← MD, XRefBr,						c3;

R:	MAR ← [rhRx, Q + 0], L0←L0.R, BRANCH[RMUD,$],		c1,  RMFRet[L0.R];
Ra:	IBDisp, GOTO[LLa],						c2;

RMUD:	CALL[RMapFix],							c2;


{*****************************************************************************
	RB
*****************************************************************************}

@RB:	TT ← TOS + ib, L1←L1.Dec2,				c1, opcode[102'b];
	pop,								c2;
RBa:	rhTT ← UvMDS, push, GOTO[RLMpc1],				c3;


{*****************************************************************************
	RL0 and RLB
*****************************************************************************}

@RL0:	TT ← STK{ptrL}, pop, L1←L1.PushDec,			c1, opcode[103'b];
	PC ← PC - PC16, pop, GOTO[RLa],					c2;

@RLB:	TT ← STK{ptrL}, pop, L1←L1.PushDec2,			c1, opcode[104'b];
	TT ← TT + ib, CarryBr, pop,					c2;
RLa:	rhTT ← TOS{ptrH} LRot0, push, BRANCH[RLMpc1,RLb],		c3;

RLb:	Noop,								c1;
	Q ← rhTT + 1, LOOPHOLE[byteTiming],				c2;
	rhTT ← Q LRot0,							c3;

RLMpc1:	Map ← Q ← [rhTT,TT],						c1;
RLMpc2:	PC ← PC + 1,							c2;
RLMpc3:	Rx ← rhRx ← MD, XRefBr,						c3;

RL:	MAR ← [rhRx, Q + 0], L0←L0.RL, BRANCH[RLMUD,$],		c1, RLMFRet[L0.RL];
RLc:	IBDisp, GOTO[LLa],						c2;

RLMUD:	CALL[RLMapFix],							c2;


{*****************************************************************************
	RD0 and RDB
*****************************************************************************}

@RD0:	Map ← Q ← [rhMDS, TOS + 0], L1←L1.PopDec,		c1, opcode[105'b];
	PC ← PC + PC16, fXpop, push, GOTO[RDMpc3],			c2;

@RDB:	TT ← TOS + ib, L1←L1.PopDec2,				c1, opcode[106'b];
	PC ← PC + 1, fXpop, push,					c2;
	Noop,								c3;

RDMpc1:	Map ← Q ← [rhMDS, TT],						c1;
RDMpc2:	Noop,								c2;
RDMpc3:	Rx ← rhRx ← MD, XRefBr, push,					c3;

RD:	MAR ← [rhRx, Q + 0], L0←L0.RD, BRANCH[RDMUD,$],		c1, RMFRet[L0.RD];
	Q ← Q + 1, PgCarryBr,						c2;
	T ← MD, BRANCH[RDa, RDb],					c3;

RDa:	MAR ← [rhRx, Q + 0],						c1;
RDc:	IBDisp, STK ← T, GOTO[LLa],					c2;

RDb:	Map ← Q ← [rhMDS, Q],						c1; 
	rhTT ← UvMDS, GOTO[RDLe],					c2;

RDMUD:	CALL[RMapFix],							c2;


{*****************************************************************************
	RDL0 and RDLB
*****************************************************************************}

@RDL0:	TT ← STK{ptrL}, pop, L1←L1.Dec,				c1, opcode[107'b];
	PC ← PC - PC16, pop, GOTO[RDLa], 				c2;

@RDLB:	TT ← STK{ptrL}, pop, L1←L1.Dec2,			c1, opcode[110'b];
	TT ← TT + ib, CarryBr, pop,					c2;
RDLa:	rhTT ← TOS{ptrH} LRot0, BRANCH[RDLMc1,RDLb],			c3;

RDLb:	L2←L2.RDL, CALL[VAHiInc],					c1;
VAHiInc:
	Q ← rhTT + 1, L2Disp, LOOPHOLE[byteTiming],			c2;
	rhTT ← Q LRot0, RET[VAHiRtn],					c3;

RDLMc1:	Map ← Q ← [rhTT,TT],					c1, VAHiRet[L2.RDL];
RDLMc2:	PC ← PC + 1, push,						c2;
RDLMc3:	Rx ← rhRx ← MD, XRefBr, push,					c3;

RDL:	MAR ← [rhRx,Q + 0], L0←L0.RDL0, BRANCH[RDLM0,$],	c1, RLMFRet[L0.RDL0];
	[] ← Q + 1, PgCarryBr,						c2;
	T ← MD, BRANCH[RDLc, RDLd],					c3;

RDLc:	MAR ← [rhRx, Q + 1],						c1;
RDLg:	STK ← T, IBDisp, CANCELBR[LLa,0],				c2;

RDLd:	Map ← Q ← [rhTT, Q + 1], CarryBr,				c1;
RDLh:	TT ← rhTT + 1, LOOPHOLE[byteTiming], BRANCH[RDLe, RDLf],	c2;
RDLe:	Rx ← rhRx ← MD, XRefBr,						c3;

	MAR ← [rhRx,Q + 0], L0←L0.RDL1, BRANCH[RDLM1,RDLg],	c1, RLMFRet[L0.RDL1];

RDLf:	rhTT ← TT LRot0,						c3;

	Map ← Q ← [rhTT, Q + 0], GOTO[RDLh],				c1;

RDLM0:	CALL[RLMapFix],							c2;
RDLM1:	CALL[RLMapFix],							c2;


{*****************************************************************************
	RC
*****************************************************************************}

@RC:	rhTT ← UvChigh,					c1, at[0B,10,ESC1n];
	TT ← UvC, pop,							c2;
	TT ← TT + ib, L1←L1.Dec3, push,					c3;

	Map ← Q ← [rhTT, TT + TOS],					c1;
	PC ← PC + PC16, GOTO[RLMpc3],					c2;


{*****************************************************************************
	RLI0n{n:[0..3]}
*****************************************************************************}

@RLI00:	MAR ← [rhL, L+0], push,					c1, opcode[123'b];
	T ← 0, STK ← TOS, L1←L1.PopDec, GOTO[RLI0n],			c2;

@RLI01:	MAR ← [rhL, L+0], push,					c1, opcode[124'b];
	T ← 1, STK ← TOS, L1←L1.PopDec, GOTO[RLI0n],			c2;

@RLI02:	MAR ← [rhL, L+0], push,					c1, opcode[125'b];
	T ← 2, STK ← TOS, L1←L1.PopDec, GOTO[RLI0n],			c2;

@RLI03:	MAR ← [rhL, L+0], push,					c1, opcode[126'b];
	T ← 3, STK ← TOS, L1←L1.PopDec, GOTO[RLI0n],			c2;

RLI0n:	Q ← MD, push, fZpop,						c3;

	Map ← Q ← [rhMDS, Q + T], pop, GOTO[Rn],			c1;


{*****************************************************************************
	RLIP
*****************************************************************************}

@RLIP:	MAR ← Q ← [rhL, L+alpha.left], L0←L0.RLIP, push,	c1, opcode[127'b];
	STK ← TOS, PC ← PC + 1, L2←L2.LIP, BRANCH[LIPa,LIPb,1],		c2;

	Map ← Q ← [rhMDS, TT], L1←L1.PopDec2,		c1, IPRet[L0.RLIP];
LIPe:	GOTO[RMpc3],							c2;

LIPa:	TT ← MD,							c3;

LIPc:	TT  ← TT + alpha.right, L1←L1.PopDec2,		c1, LGMRet[L2.LIPx];
	Xbus ← ib, Q ← TT, L0Disp,					c2;
	rhTT ← UvMDS, RET[IPRtn],					c3;

LIPb:	TT ← UvL,							c3;

LIPd:	rhTT ← UvMDS, CALL[LGMap],					c1;


{*****************************************************************************
	RLILP
*****************************************************************************}

@RLILP:	MAR ← Q ← [rhL, L+alpha.left], L0←L0.RLILP, push,	c1, opcode[130'b];
	STK ← TOS, PC ← PC + 1, L2←L2.LILP0, BRANCH[LILPa,LILPb,1],	c2;

	Rx ← rhRx ← MD, XRefBr, GOTO[RL],		c3, ILPRet[L0.RLILP];

LILPa:	TT ← MD,							c3;

	MAR ← Q ← [rhL, L+alpha.left+1], L1←L1.PopDec2,		c1, LGMRet[L2.LILP0x];
	T ← TT + alpha.right, CarryBr, BRANCH[LILPc,LILPd,1],		c2;
LILPc:	rhTT ← MD, BRANCH[LILPe, LILPf],				c3;

LILPe:	Map ← Q ← [rhTT, T], L0Disp, GOTO[LILPg],		c1, LGMRet[L2.LILP1];
LILPg:	TT ← T, Xbus ← ib, RET[ILPRtn],					c2;

LILPf:	Noop,							c1, LGMRet[L2.LILP1x];

	Q ← rhTT + 1, LOOPHOLE[byteTiming],				c2;
	rhTT ← Q LRot0, GOTO[LILPe],					c3;

LILPb:	TT ← UvL, GOTO[LIPd],						c3;
LILPd:	TT ← UvL, L2←L2.LILP1, BRANCH[LIPd,$],				c3;

	rhTT ← UvMDS, CALL[LGMap],					c1;


{*****************************************************************************
	RLDI00
*****************************************************************************}

@RLDI00:
	MAR ← [rhL, L+0], push, L1←L1.Pop2Dec,			c1, opcode[131'b];
	STK ← TOS, PC ← PC + PC16,					c2;
	TT ← MD, GOTO[RDMpc1],						c3;


{*****************************************************************************
	RLDIP
*****************************************************************************}

@RLDIP:	MAR ← Q ← [rhL, L+alpha.left], L0←L0.RLDIP, push,	c1, opcode[132'b];
	STK ← TOS, PC ← PC + 1, L2←L2.LIP, BRANCH[LIPa,LIPb,1],		c2;

	Map ← Q ← [rhMDS, TT], L1←L1.Pop2Dec2, GOTO[RDMpc2],	c1, IPRet[L0.RLDIP];


{*****************************************************************************
	RLDILP
*****************************************************************************}

@RLDILP:
	MAR ← Q ← [rhL, L+alpha.left], L0←L0.RLDILP, push,	c1, opcode[133'b];
	STK ← TOS, PC ← PC + 1, L2←L2.LILP0, BRANCH[LILPa,LILPb,1],	c2;

	PC ← PC - 1, pop, L1←L1.Pop2Dec2, GOTO[RDLMc1],	c3, ILPRet[L0.RLDILP];



{*****************************************************************************
	RGIP
*****************************************************************************}

@RGIP:	MAR ← Q ← [rhG, G+alpha.left], L0←L0.RLIP, push,	c1, opcode[134'b];
	STK ← TOS, PC ← PC + 1, L2←L2.LIP, BRANCH[GIPa,GIPb,1],	c2;
GIPa:	TT ← MD, GOTO[LIPc],						c3;

GIPb:	TT ← UvG,							c3;

GIPc:	rhTT ← UvGhigh, CALL[LGMap],					c1;


{*****************************************************************************
	RGILP
*****************************************************************************}

@RGILP:	MAR ← Q ← [rhG, G+alpha.left], L0←L0.RLILP, push,	c1, opcode[135'b];
	STK ← TOS, PC ← PC + 1, L2←L2.GILP0, BRANCH[GILPa,GILPb,1],	c2;

GILPa:	TT ← MD,							c3;

	MAR ← Q ← [rhG, G+alpha.left+1], L1←L1.PopDec2,		c1, LGMRet[L2.GILP0x];
	T ← TT + alpha.right, CarryBr, BRANCH[GILPc,GILPd,1],		c2;
GILPc:	rhTT ← MD, BRANCH[LILPe, LILPf],				c3;

GILPb:	TT ← UvG, GOTO[GIPc],						c3;
GILPd:	TT ← UvG, L2←L2.LILP1, BRANCH[GIPc, $],				c3;

	rhTT ← UvGhigh, CALL[LGMap],					c1;


{*****************************************************************************
	ROB	Read Overhead Byte
*****************************************************************************}

@ROB:	TT ← TOS - ib, L1←L1.Dec3,			c1, at[0E,10,ESC1n];
	PC ← PC - PC16, pop, GOTO[RBa],					c2;


	{ E N D }