{
File name read.mc
Description: Mesa Read op-codes
Author: don charnley
Created: February 16, 1980
Amy Fasnacht, 11-Nov-83 11:15:09, Add labels at R+1 and RL+1
Daniels, 15-Jun-83 18:18:49, new instruction set
Sandman, January 13, 1982 3:32 PM, add L1←L1.PopDec2 in LILP for RLIPF
Sandman, November 2, 1981 3:43 PM, new instruction set
Last edited: Charnley, March 28, 1980 5:06 PM
Last edited: R. Garner, April 2, 1980 4:51 PM
Last edited: Sandman, 26-May-81 10:24:01
}
{
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];
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, CALL[LGMap], c3;
{*****************************************************************************
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, CALL[LGMap], c3;
LILPd: TT ← UvL, L2←L2.LILP1, BRANCH[LGMap, LGMy], c3;
{*****************************************************************************
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, CALL[LGMap], c3;
{*****************************************************************************
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, CALL[LGMap], c3;
GILPd: TT ← UvG, L2←L2.LILP1, BRANCH[LGMap, LGMy], c3;
{*****************************************************************************
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 }