{ File name Kiku2MWrite.mc Description: Mesa Write op-codes Author: don charnley Created: February 16, 1980 Fasnacht 21-Jul-83 11:02:18 Fix stack problem during page fault on second word of double writes Daniels 15-Jun-83 18:39:26 New Instruction Set Sandman November 2, 1981 4:11 PM New Instruction Set Last edited: Charnley, March 28, 1980 5:09 PM Last edited: R. Garner, April 2, 1980 10:34 PM Last edited: Johnsson, January 14, 1981 11:04 AM Last edited: I. Yamaura 1-Nov-84 10:44:07 Change for 2M word at {+++} } { Wn Write n = 0 WB Write Byte WLB Write Long Byte WDB Write Double Byte WDLB Write Double Long Byte PSB Put Swapped Byte PSDn Put Swapped Double n = 0 PSDB Put Swapped Double Byte PSLB Put Swapped Long Byte PSDLB Put Swapped Double Long Byte WLIP Write Local Indirect Pair WLILP Write Local Indirect Long Pair WLDILP Write Local Double Indirect Long Pair WOB Write Overhead Byte } {***************************************************************************** WB *****************************************************************************} @W0: TT ← TOS, push, L1←L1.PushDec, c1, opcode[111'b]; STK ← TOS, pop, PC ← PC + PC16, GOTO[Wa], c2; @WB: TT ← TOS + ib, push, L1←L1.PushDec2, c1, opcode[112'b]; STK ← TOS, pop, PC ← PC + 1, c2; Wa: Noop, c3; WMpc1: Map ← Q ← [rhMDS, TT], c1; WMpc2: T ← STK, pop, c2; WMpc3: Rx ← rhRx ← MD, XwdDisp, c3; {+++ Change for 2M +++} {W:} MAR ← [rhRx, Q + 0], DISP2[WMUD], c1,WMFRet[L0.W]; {+++ Change for 2M +++} Wb: MDR ← T, IBDisp, GOTO[SLa], c2,at[1,4,WMUD]; {+++ Change for 2M +++} {WMUD:} CALL[WMapFix1], L0←L0.W, c2,at[0,4,WMUD]; {+++ Change for 2M +++} CALL[WMapFix1], L0←L0.W, c2,at[2,4,WMUD]; {+++ Change for 2M +++} CALL[WMapFix1], L0←L0.W, c2,at[3,4,WMUD]; {+++ Change for 2M +++} {***************************************************************************** PSB *****************************************************************************} @PSB: TT ← STK{ptr}, fXpop, fZpop, push, c1, opcode[113'b]; TT ← TT + ib, push, L1←L1.Dec2, c2; STK ← TOS, PC ← PC + 1, GOTO[WMpc1], c3; {***************************************************************************** WLB *****************************************************************************} @WLB: TT ← STK{ptrL}, pop, L1←L1.Push, c1, opcode[114'b]; TT ← TT + ib, CarryBr, L2←L2.WL, c2; rhTT ← TOS{ptrH} LRot0, BRANCH[WLMpc1, WLa], c3; WLa: CALL[VAHiInc], c1; WLMpc1: Map ← Q ← [rhTT, TT], c1, VAHiRet[L2.WL]; WLMpc2: T ← STK, c2; WLMpc3: Rx ← rhRx ← MD,XwdDisp, c3; {+++ Change for 2M +++} {WL:} MAR ← [rhRx, Q + 0],DISP2[WLMUD], c1, WLMFRet[L0.WL]; {+++ Change for 2M +++} {WLc:} MDR ← T{data}, IBDisp, PC ← PC + 1, pop, GOTO[SLa],c2,at[1,4,WLMUD]; {+++ Change for 2M +++} {WLMUD:}CALL[WLMapFix1],L0 ← L0.WL, c2,at[0,4,WLMUD]; {+++ Change for 2M +++} CALL[WLMapFix1],L0 ← L0.WL, c2,at[2,4,WLMUD]; {+++ Change for 2M +++} CALL[WLMapFix1],L0 ← L0.WL, c2,at[3,4,WLMUD]; {+++ Change for 2M +++} {***************************************************************************** PSLB *****************************************************************************} @PSLB: rhTT ← STK, pop, c1, opcode[115'b]; TT ← STK, fXpop, fZpop, push, c2; TT ← TT + ib, CarryBr, push, c3; PSLc: Map ← Q ← [rhTT, TT], push, BRANCH[PSLa, PSLb], c1; PSLa: STK ← T ← TOS, L1←L1.Pop, GOTO[WLMpc3], c2; PSLb: Q ← rhTT + 1, pop, LOOPHOLE[byteTiming], c2; rhTT ← Q LRot0, GOTO[PSLc], c3; {***************************************************************************** WDB *****************************************************************************} @WDB: Q ← TOS + ib, L1←L1.Push2, c1, opcode[116'b]; T ← STK{data1}, pop, c2; WDd: Noop, c3; WDMpc1: Map ← [rhMDS, Q], c1; WDMpc2: TT ← STK{data0}, pop, c2; WDMpc3: Rx ← rhRx ← MD,XwdDisp, c3; {+++ Change for 2M +++} {WD:} MAR ← [rhRx,Q + 0], DISP2[WDMUD], c1, WMFRet[L0.WD]; {+++ Change for 2M +++} {WDc:} MDR ← TT, TT ← Q + 1, PgCarryBr, c2,at[1,4,WDMUD]; {+++ Change for 2M +++} rhTT ← UvMDS, push, BRANCH[WDLd, WDb], c3; WDb: Map ← Q ← [rhTT, Q + 1], L0←L0.WDB c1; WDe: Noop, c2; Rx ← rhRx ← MD, XwdDisp, c3; {+++ Change for 2M +++} MAR ← [rhRx, Q + 0], DISP2[WLMUD1], c1, WLMFRet[L0.WDB]; {+++ Change for 2M +++} {WDMUD:}CALL[WMapFix2], L0←L0.WD, c2,at[0,4,WDMUD]; {+++ Change for 2M +++} CALL[WMapFix2], L0←L0.WD, c2,at[2,4,WDMUD]; {+++ Change for 2M +++} CALL[WMapFix2], L0←L0.WD, c2,at[3,4,WDMUD]; {+++ Change for 2M +++} MDR ← T{data}, IBDisp, PC ← PC + 1, pop, GOTO[SLa],c2,at[1,4,WLMUD1]; {+++ Change for 2M +++} {WLMUD1:}CALL[WLMapFix2], c2,at[0,4,WLMUD1]; {+++ Change for 2M +++} CALL[WLMapFix2], c2,at[2,4,WLMUD1]; {+++ Change for 2M +++} CALL[WLMapFix2], c2,at[3,4,WLMUD1]; {+++ Change for 2M +++} {***************************************************************************** PSD0 and PSDB *****************************************************************************} @PSD0: Q ← 0, pop, L1←L1.PushInc, c1, opcode[117'b]; T ← STK, fXpop, fZpop, push, c2; PC ← PC - PC16, push, GOTO[PSDa], c3; @PSDB: Q ← ib, pop, c1, opcode[120'b]; T ← STK, fXpop, fZpop, push, c2; L1←L1.Push, push, c3; PSDa: Q ← T + Q, push, c1; STK ← T ← TOS, pop, GOTO[WDd], c2; {***************************************************************************** WDLB *****************************************************************************} @WDLB: TT ← STK{ptrL}, pop, L1←L1.Push2, c1, opcode[121'b]; TT ← TT + ib, CarryBr, L2←L2.WDL, c2; rhTT ← TOS{ptrH} LRot0, BRANCH[WDLMc1, WDLa], c3; WDLa: CALL[VAHiInc], c1; WDLMc1: Map ← Q ← [rhTT,TT], c1, VAHiRet[L2.WDL]; WDLMc2: T ← STK{data1}, pop, L0← L0.WDL, c2; WDLMc3: Rx ← rhRx ← MD, XwdDisp, c3; {+++ Change for 2M +++} MAR ← [rhRx,Q + 0], DISP2[WDLMUD], c1, WLMFRet[L0.WDL]; {+++ Change for 2M +++} MDR ← STK{data0}, c2,at[1,4,WDLMUD]; {+++ Change for 2M +++} [] ← TT + 1, PgCarryBr, c3; WDLd: MAR ← [rhRx,Q + 1], BRANCH[WDLb, WDLc], c1; WDLb: MDR ← T{data1}, PC ← PC + 1, IBDisp, pop, CANCELBR[SLa,0], c2; WDLc: [] ← Q + 1, CarryBr, CANCELBR[$,2], c2; Q ← rhTT + 1, LOOPHOLE[byteTiming], BRANCH[WDLe, WDLf], c3; WDLe: Map ← Q ← [rhTT, TT + 1], GOTO[WDe], c1; WDLf: rhTT ← Q LRot0, GOTO[WDLc], c1; WDLMUD: CALL[WLMapFix], c2,at[0,4,WDLMUD]; {+++ Change for 2M +++} CALL[WLMapFix], c2,at[2,4,WDLMUD]; {+++ Change for 2M +++} CALL[WLMapFix], c2,at[3,4,WDLMUD]; {+++ Change for 2M +++} {***************************************************************************** PSDLB *****************************************************************************} @PSDLB: pop, L1←L1.None, c1, opcode[122'b]; rhTT ← STK, pop, c2; TT ← STK, fXpop, fZpop, push, c3; TT ← TT + ib, CarryBr, push, c1; Q ← rhTT + 1, push, LOOPHOLE[byteTiming], BRANCH[PSDLa, PSLDb], c2; PSDLa: GOTO[PSDLc], c3; PSLDb: rhTT ← Q LRot0,GOTO[PSDLc], c3; PSDLc: Map ← Q ← [rhTT, TT], push, c1; STK ← T ← TOS, pop, L0←L0.WDL, GOTO[WDLMc3], c2; {***************************************************************************** WLIP *****************************************************************************} @WLIP: MAR ← Q ← [rhL, L+alpha.left], L0←L0.WLIP, push, c1, opcode[136'b]; STK ← TOS, PC ← PC + 1, L2←L2.LIP, BRANCH[LIPa,LIPb,1], c2; Map ← Q ← [rhMDS, TT], L1←L1.Dec2, GOTO[WMpc2], c1, IPRet[L0.WLIP]; {***************************************************************************** WLILP *****************************************************************************} @WLILP: MAR ← Q ← [rhL, L+alpha.left], L0←L0.WLILP, push, c1, opcode[137'b]; STK ← TOS, PC ← PC + 1, L2←L2.LILP0, BRANCH[LILPa,LILPb,1], c2; PC ← PC - 1, L1←L1.Pop, c3, ILPRet[L0.WLILP]; Map ← Q ← [rhTT, TT], GOTO[WLMpc2], c1; {***************************************************************************** WLDILP *****************************************************************************} @WLDILP: MAR ← Q ← [rhL, L+alpha.left], L0←L0.WLDILP, push, c1, opcode[140'b]; STK ← TOS, PC ← PC + 1, L2←L2.LILP0, BRANCH[LILPa,LILPb,1], c2; PC ← PC - 1, L1←L1.None, GOTO[WDLMc1], c3, ILPRet[L0.WLDILP]; {***************************************************************************** WOB Write Overhead Byte *****************************************************************************} @WOB: TT ← TOS - ib, L1←L1.PushDec3, c1, at[0F,10,ESC1n]; PC ← PC + PC16, GOTO[Wa], c2; { E N D }