{
File name StringField.mc
Description: Mesa String op-codes
Author: don charnley
Created: February 26, 1980
Last edited: Charnley, April 8, 1980 5:44 PM
Last edited: R. Garner, April 8, 1980 7:09 PM
Last edited: Johnsson, March 13, 1981 5:43 PM
}
{The string mesa op-codes consist of the following:
OPvalbytesstktime
RSTR120’b2—2+14
RSTRL153’b2—3+15
WSTR121’b2—35
WSTRL154’b2—46
}
{The field mesa op-codes consist of the following:
OPvalfieldbytesstacktime
RF112’bs3̄1+1 4
RF0xxxs2̄1+1 4
RFL155’bs3̄2+1 5
RFS135’bd1̄2+1 5
RFSL157’bd1̄3+1 6
RFC134’bs3̄1+1 5
RILFxxxs2+1 5
RILPFxxxs3+1 6
RBITxxxs2̄1+1 4
RILBITxxxs2+1 5
WF113’bs3̄2 9
WFL156’bs3̄310
WFS136’bd1̄310
WFSL160’bd1̄411
WSF132’bs3̄210
PSFxxxs3̄2+110
smeans uses Field Seletor
dmeans uses Field Descriptor
}
{codes used for L0
indicate where to return from fixing the map flags
return is relative to RMapFixCaller
}
{codes used for L1
indicate how to reset state if page fault encountered
return is relative to RFixForTrap
}
{codes used for L3
indicate where to return from long string common code
return is relative to strL
}
Set[ L3.rstrl, 0 ],
Set[ L3.wstrl, 2 ];
{——————————————————————————————————————————————————————
RSTR
——————————————————————————————————————————————————————}
{@RSTR, alpha}
{Timing:4 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| inx|| byte|
STK =| ~|| ~|
-->| ptr|| ~|
| v| -->| v|}
@RSTR:T ← TOS{inx} + ib, L0 ← L0.RstrR,c1, opcode[120’b];
Q ← STK{ptr}, pop, L1 ← L1r.PushDecDec,c2;
TT ← RShift1 T, pop,c3;
Map ← Q ← [rhMDS,TT + Q], push,c1;
PC ← PC + 1,c2;
Rx ← rhRx ← MD, XRefBr,c3;
RstrR:MAR ← [rhRx,Q + 0], BRANCH[rstrMapUD,$],c1, at[L0.RstrR,10, RMapFixCaller];
[] ← T and 1, ZeroBr,c2;
rstrEnd:T ← MD, BRANCH[rD.right,rD.left],c3;
rD.left:T ← T and ~0FF,c1;
TOS ← T LRot8{byte}, IBDisp, GOTO[strCom],c2;
rD.right:TOS ← T and 0FF, GOTO[IBDispOnly],,c1;
DISPNIonly:
strCom:DISPNI[OpTable],c3;
rstrMapUD:CALL[RMapFix] {will return to RstrR},c2;
{——————————————————————————————————————————————————————
RSTRL
——————————————————————————————————————————————————————}
{@RSTRL, alpha}
{Timing:5 clicks, + 1 if ptrH needs fix, + 2 if fix map flags}
{entry:exit:
TOS =| inx|| byte|
STK =| ~|| ~|
-->| ptrH|| ptrH|
| ptrL|| ~|
| v| -->| v|}
@RSTRL:T ← TOS{inx} + ib, CarryBr, L3 ← L3.rstrl,c1, opcode[153’b];
rhTT ← STK{ptrH}, BRANCH[rstrlNoC,rstrlC],c2;
rstrlNoC:Rx ← RShift1 T, SE←0, pop, GOTO[xstrlCom],c3;
rstrlC:Rx ← RShift1 T, SE←1, pop, GOTO[xstrlCom],c3;
xstrlCom:TT ← STK{ptrL}, pop, L2 ← L2.xSTRL,c1;
TT ← TT + Rx, CarryBr, L1 ← L1.Push2DecDec,c2;
PC ← PC + 1, pop, BRANCH[rstrlRhOk,$],c3;
rhTTIncB:Q ← rhTT,c1;
rhTTIncBx:Q ← Q + 1, pRet2,c2;
rhTT ← Q LRot0, RET[rhTTIncBRets],c3;
rstrlRhOk:Map ← Q ← [rhTT,TT], L3Disp,c1, at[L2.xSTRL,10,rhTTIncBRets];
push, DISP2[strL,1],c2;
strL:Rx ← rhRx ← MD, XRefBr,c3, at[Or[L3.rstrl,1],4,strL];
RstrlR:MAR ← [rhRx,Q + 0], L0 ← L0.RstrlR, BRANCH[rstrlMapUD,$],c1, at[L0.RstrlR,10, RMapFixCaller];
[] ← T and 1, ZeroBr, GOTO[rstrEnd],c2;
rstrlMapUD:CALL[RLMapFix] {will return to RstrlR},c2;
{——————————————————————————————————————————————————————
WSTR
——————————————————————————————————————————————————————}
{@WSTR, alpha}
{Timing:5 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| inx|| v|
STK =| ~|| ~|
-->| ptr|| ptr|
| byte|| byte|
| v|| v|
| u| -->| u|}
@WSTR:T ← TOS{inx} + ib, L0 ← L0.WstrR,c1, opcode[121’b];
Q ← STK{ptr}, L1 ← L1w.PushDecDec,c2;
TT ← RShift1 T,c3;
Map ← Q ← [rhMDS,TT + Q],c1;
PC ← PC + 1,c2;
Rx ← rhRx ← MD, XDirtyDisp, pop,c3;
WstrR:MAR ← [rhRx,Q + 0], BRANCH[wstrMapUD,$,1],c1, at[L0.WstrR,10, WMapFixCaller];
Ybus ← T, T ← STK{byte}, pop, YDisp,c2;
wstrTail:TT ← MD, DISP4[wD.left,0E] {test odd/even},c3;
wD.left:T ← T{byte} and 0FF,c1, at[0E,10,wD.left];
T ← T LRot8,c2;
TT ← TT{mem} and 0FF, GOTO[WstrW],c3;
wD.right:T ← T{byte} and 0FF,c1, at[0F,10,wD.left];
TT ← TT{mem} and ~0FF,c2;
wsrtrX:Noop, GOTO[WstrW],c3;
WstrW:MAR ← [rhRx,Q + 0],c1;
MDR ← TT or T, IBDisp, GOTO[SLTail],,c2;
wstrMapUD:CALL[WMapFix] {will return to WstrR},c2;
{——————————————————————————————————————————————————————
WSTRL
——————————————————————————————————————————————————————}
{@WSTRL, alpha}
{Timing:6 clicks, + 1 if ptrH needs fix, + 2 if fix map flags}
{entry:exit:
TOS =| inx|| v|
STK =| ~|| ~|
-->| ptrH|| ~|
| ptrL|| ptrL|
| byte|| byte|
| v|| v|
| u| -->| u|}
@WSTRL:T ← TOS{inx} + ib, CarryBr, L3 ← L3.wstrl,c1, opcode[154’b];
rhTT ← STK{ptrH}, BRANCH[wstrlNoC,wstrlC],c2;
wstrlNoC:Rx ← RShift1 T, SE←0, pop, GOTO[xstrlCom],c3;
wstrlC:Rx ← RShift1 T, SE←1, pop, GOTO[xstrlCom],c3;
Rx ← rhRx ← MD, XDirtyDisp,c3, at[Or[L3.wstrl,1],4,strL];
WstrlR:MAR ← [rhRx,Q + 0], L0 ← L0.WstrlR, BRANCH[wstrlMapUD,$,1],c1, at[L0.WstrlR,10, WMapFixCaller];
Ybus ← T, T ← STK{byte}, pop, YDisp, GOTO[wstrTail],c2;
wstrlMapUD:CALL[WLMapFix] {will return to WstrlR},c2;
{——————————————————————————————————————————————————————
RF
——————————————————————————————————————————————————————}
{@RF, alpha, fd}
{Timing:4 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| ptr|| field|
STK =| ~|| ~|
-->| u| -->| u|}
@RF:TT ← TOS + ib{alpha}, L1 ← L1r.NoFixes,c1, opcode[112’b];
rhTT ← UvMDS,c2;
Noop,c3;
rfMap:Map ← Q ← [rhTT,TT], L0 ← L0.rflR,c1, at[L2.RFL,10,rhTTIncBRets];
rfX:T ← fd.pos, pop,c2;
Rx ← rhRx ← MD, XRefBr, push,c3;
rfR:MAR ← [rhRx,Q + 0], BRANCH[rfRMapUD,$],c1, at[L0.rflR,10, RxMapFixCaller];
T ← T + ib{fd.size} + 1, rhT ← ib{fd.size},c2;
rfA:T ← MD{data}, Ybus ← T{shift}, YDisp, L2 ← L2.rfRetPC3,c3;
rfB:TT ← LRot1 T, Xbus ← 1, XDisp, DISP4[CycleMask],c1;
{CycleMask Subroutine Here}
rfRetPC3:TOS ← TOS and TT, IBDisp,c2, at[L2.rfRetPC3,10,MaskRet];
PC ← 1 + PC + 1, Cin←pc16, DISPNI[OpTable],c3;
rfRMapUD:CALL[RLxMapFix] {will return to rfR},c2;
{——————————————————————————————————————————————————————
RF0
——————————————————————————————————————————————————————}
{@RF0, fd}
{Timing:4 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| ptr|| field|
STK =| ~|| ~|
-->| u| -->| u|}
{ UNUSED AT PRESENT
@RF0:Map ← Q ← [rhMDS,TOS], L1 ← L1r.NoFixes,c1, opcode[3D];
T ← fd.pos, pop,c2;
Rx ← rhRx ← MD, XRefBr, push,c3;
rfR0:MAR ← [rhRx,Q + 0], L0 ← L0.rfR0, BRANCH[rfR0MapUD,$],c1, at[L0.rfR0,10, RxMapFixCaller];
T ← T + ib{fd.size} + 1, rhT ← ib{fd.size},c2;
rfA1:T ← MD{data}, Ybus ← T{shift}, YDisp, L2 ← L2.rfRetPC2,c3;
rfB1:TT ← LRot1 T, Xbus ← 1, XDisp, DISP4[CycleMask],c1;
{CycleMask Subroutine Here}
rfRetPC2:TOS ← TOS and TT, IBDisp,c2, at[L2.rfRetPC2,10,MaskRet];
PC ← PC + 1, Cin←pc16, DISPNI[OpTable],c3;
rfR0MapUD:CALL[RxMapFix] {will return to rfR0},c2;
}
{——————————————————————————————————————————————————————
RFL
——————————————————————————————————————————————————————}
{@RFL, alpha, fd}
{Timing:5 clicks, + 2 if fix map flags, + 1 if fix rh}
{entry:exit:
TOS =| ptrH|| field|
STK =| ~|| ~|
-->| ptrL|| ~|
| u| -->| u|}
@RFL:TT ← STK{ptrL}, pop, L1 ← L1r.PushOnly,c1, opcode[155’b];
TT ← TT + ib{alpha}, CarryBr, L2 ← L2.RFL,c2;
rhTT ← TOS{ptrH} LRot0, BRANCH[rfMap,$],c3;
Q ← rhTT, CALL[rhTTIncBx]{returns to rfMap},c1;
{——————————————————————————————————————————————————————
RFS
——————————————————————————————————————————————————————}
{@RFS}
{Timing:5 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| desc|| field|
STK =| ~|| ~|
-->| ptr|| ~|
| u| -->| u|}
@RFS:T ← TOS{desc} LRot8,c1, opcode[135’b];
Q ← 0FF and T{desc.offset},c2;
TT ← STK, pop, L0 ← L0.rfsR,c3;
Map ← Q ← [rhMDS,TT + Q], L1 ← L1r.PushOnly,c1;
T ← TOS LRot12{desc.pos} + TOS{desc.size} + 1,c2, Suppress Timing Warning {low 4 bits only};
Rx ← rhRx ← MD, XRefBr,c3;
rfsR:MAR ← [rhRx,Q + 0], BRANCH[rfsRMapUD,$],c1, at[L0.rfsR,10, RxMapFixCaller];
rhT ← TOS{desc.size} LRot0,c2;
rfsA:T ← MD{data}, Ybus ← T{shift}, YDisp, L2 ← L2.rfRetPC1,c3;
TT ← LRot1 T, Xbus ← 1, XDisp, DISP4[CycleMask],c1;
{CycleMask Subroutine Here}
rfRetPC1:TOS ← TOS and TT, IBDisp, fXpop, push,,c2, at[L2.rfRetPC1,10,MaskRet];
PC ← PC + 0, Cin←pc16, DISPNI[OpTable],c3;
rfsRMapUD:CALL[RxMapFix] {will return to rfsR},c2;
{——————————————————————————————————————————————————————
RFSL
——————————————————————————————————————————————————————}
{@RFSL}
{Timing:6 clicks, + 2 if fix map flags, + 1 if rh fix}
{entry:exit:
TOS =| desc|| field|
STK =| ~|| ~|
-->| ptrH|| ~|
| ptrL|| ~|
| u| -->| u|}
@RFSL:T ← TOS{desc} LRot8, L1 ← L1r.Push2Only,c1, opcode[157’b];
T ← 0FF and T{desc.offset},c2;
rhTT ← STK{ptrH}, pop,c3;
TT ← STK{ptrL}, pop, L0 ← L0.rfslR,c1;
TT ← TT + T, CarryBr, L2 ← L2.RFSL,c2;
BRANCH[rfslMap,$],c3;
Q ← rhTT, CALL[rhTTIncBx],c1;
rfslMap:Map ← Q ← [rhTT,TT],c1, at[L2.RFSL,10,rhTTIncBRets];
T ← TOS LRot12{desc.pos} + TOS{desc.size} + 1,c2, Suppress Timing Warning {low 4 bits only};
Rx ← rhRx ← MD, XRefBr,c3;
rfslR:MAR ← [rhRx,Q + 0], BRANCH[rfslRMapUD,$],c1, at[L0.rfslR,10, RxMapFixCaller];
rhT ← TOS{desc.size} LRot0, GOTO[rfsA],c2;
rfslRMapUD:CALL[RLxMapFix] {will return to rfslR},c2;
{——————————————————————————————————————————————————————
RFC
——————————————————————————————————————————————————————}
{@RFC, alpha, fd}
{Timing:5 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| offset|| field|
STK =| ~|| ~|
-->| u| -->| u|}
@RFC:TT ← UvC{codeBase low}, L1 ← L1r.NoFixes,c1, opcode[134’b];
TT ← TT + ib,c2;
rhTT ← UvChigh{codeBase high},c3;
Map ← Q ← [rhTT,TOS + TT], L0 ← L0.rflR, GOTO[rfX],c1;
{——————————————————————————————————————————————————————
RILF
——————————————————————————————————————————————————————}
{@RILF, fd}
{Timing:5 clicks, + 2 if fix map flags}
{A page cross doens’t occur for local 0}
{entry:exit:
TOS =| v|| field|
STK =| ~|| ~|
| ~| -->| v|
-->| u|| u|}
{ UNUSED AT PRESENT
@RILF:MAR ← Q ← [rhL,L + Lbias], push,c1, opcode[xxx];
STK ← TOS{v}, CANCELBR[$,2],c2;
TT ← MD,c3;
rilfMap:Map ← Q ← [rhMDS,TT], L1 ← L1r.PopOnly,c1;
T ← fd.pos,c2;
Rx ← rhRx ← MD, XRefBr, GOTO[rfR0],c3;
}
{——————————————————————————————————————————————————————
RILPF
——————————————————————————————————————————————————————}
{@RILPF, alpha, fd}
{Timing:6 clicks, + 2 if fix map flags, + 3 if remap L}
{A page cross doens’t occur for local 0}
{entry:exit:
TOS =| v|| field|
STK =| ~|| ~|
| ~| -->| v|
-->| u|| u|}
{ UNUSED AT PRESENT
@RILPF:TT ← Lbias, push, L2 ← L2.rilpfMap,c1, opcode[xxx];
TT ← alpha.left + TT, L1 ← L1r.PopOnly,c2;
T ← alpha.right ,c3;
MAR ← Q ← [rhL,L + TT],c1;
STK ← TOS{v}, BRANCH[$,LRemaprf1,1],c2;
Q ← MD, GOTO[rilpfX],c3;
rilpfMap:Q ← TT,c1, at[L2.rilpfMap,10,LGRemapCaller];
Noop,c2;
Noop,c3;
rilpfX:Map ← Q ← [rhMDS,T + Q], Xbus ← ib{alpha},c1;
T ← fd.pos,c2;
Rx ← rhRx ← MD, XRefBr, GOTO[rfR],c3;
LRemaprf1:CALL[LGxRemap] {will return to rilpfMap},c3;
}
{——————————————————————————————————————————————————————
RBIT
——————————————————————————————————————————————————————}
{@RBIT, alpha(alpha.left, fd.pos)}
{Timing:4 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| ptr|| field|
STK =| ~|| ~|
-->| u| -->| u|}
{ UNUSED AT PRESENT
@RBIT:Map ← Q ← [rhMDS,TOS + alpha.left], L1 ← L1r.NoFixes,c1, opcode[xxx];
T ← ib{fd.pos} + 1, pop,c2;
Rx ← rhRx ← MD, XRefBr, push,c3;
rbitR:MAR ← [rhRx,Q + 0], L0 ← L0.rbitR, BRANCH[rbitRMapUD,$],c1, at[L0.rbitR,10, RxMapFixCaller];
rhT ← 0, GOTO[rfA1],c2;
rbitRMapUD:CALL[RMapFix] {will return to rbitR},c2;
}
{——————————————————————————————————————————————————————
RILBIT
——————————————————————————————————————————————————————}
{@RILBIT, alpha(alpha.left, fd.pos)}
{Timing:5 clicks, + 2 if fix map flags}
{A page cross can’t occur or local 0}
{entry:exit:
TOS =| v|| field|
STK =| ~|| ~|
| ~| -->| v|
-->| u|| u|}
{ UNUSED AT PRESENT
@RILBIT:MAR ← Q ← [rhL,L + Lbias], push,c1, opcode[xxx];
STK ← TOS{v}, L1 ← L1r.PopOnly, CANCELBR[$,2],c2;
TT ← MD,c3;
rilbitMap:Map ← Q ← [rhMDS,TT + alpha.left],c1;
T ← ib{fd.pos} + 1, L1 ← L1r.PopOnly,c2;
Rx ← rhRx ← MD, XRefBr, GOTO[rbitR],c3;
}
{——————————————————————————————————————————————————————
WF
——————————————————————————————————————————————————————}
{@WF, alpha, fd}
{Timing:9 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| ptr|| v|
STK =| ~|| ptr|
-->| field|| field|
| v|| v|
| u| -->| u|}
@WF:TT ← TOS + ib{alpha}, L1 ← L1w.NoFixes,c1, opcode[113’b];
rhTT ← UvMDS, push,c2;
STK ← TOS, pop,c3;
wfMap:Map ← Q ← [rhTT, TT],c1, at[L2.WFL,10,rhTTIncBRets];
T ← Q,c2;
wfMapx:Rx ← rhRx ← MD, XDirtyDisp,c3;
wfR:MAR ← [rhRx,Q + 0], L0 ← L0.wfR, BRANCH[wfRMapUD,$,1],c1, at[L0.wfR,10, WxMapFixCaller];
TOS ← ib{fd}, uTemp ← T,c2;
wfA:Q ← MD{data},c3;
T ← STK,c1;
Xbus ← ~TOS LRot12, XDisp,c2;
Xbus ← MaskRetA, XDisp, DISP4[MaskTbl],c3;
{MaskTbl Subroutine here,c1:}
uFrame ← TT,c2, at[MaskRetA,10,MaskRet];
TOS ← TOS LRot12 + TOS,c3, Suppress Timing Warning {only low 4 bits used};
rhT ← ~TOS LRot0,c1;
Ybus ← ~TOS, YDisp, L2 ← L2.MaskRetB,c2;
TT ← LRot1 T, Xbus ← 1, XDisp, DISP4[CycleMask],c3;
{CycleMask Subroutine Here}
wfRet:TT ← RShift1 ~TT, SE←1,c1, at[L2.MaskRetB,10,MaskRet];
TT ← uFrame and TT{TT now has mem alligned mask},c2;
Q ← Q and ~TT, L1Disp,c3;
wfSpec:PC ← PC + 1 + PC16, DISP4[wfSpecA],c1;
wfSpecA:TOS ← TOS and TT,c2, at[L1w.NoFixes,10,wfSpecA];
wfSpecB:T ← uTemp,c3;
wfW:MAR ← [rhRx,T + 0],c1;
MDR ← Q or TOS, pop, IBDisp, GOTO[SLTail],c2;
wfRMapUD:CALL[WLxMapFix] {will return to wfR},c2;
{——————————————————————————————————————————————————————
WFL
——————————————————————————————————————————————————————}
{@WFL, alpha, fd}
{Timing:10 clicks, + 2 if fix map flags, + 1 if fix rh}
{entry:exit:
TOS =| ptrH|| v|
STK =| ~|| ~|
-->| ptrL|| ptrL|
| field|| field|
| v|| v|
| u| -->| u|}
@WFL:TT ← STK{ptrL}, pop, L2 ← L2.WFL,c1, opcode[156’b];
TT ← TT + ib{alpha}, CarryBr, L1←L1w.PushOnly,c2;
rhTT ← TOS{ptrH} LRot0, BRANCH[wfMap,$],c3;
Q ← rhTT, CALL[rhTTIncBx],c1;
TOS ← TOS and TT, GOTO[wfSpecB],c2, at[L1w.PushOnly,10,wfSpecA];
{——————————————————————————————————————————————————————
WFS
——————————————————————————————————————————————————————}
{@WFS}
{Timing:10 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| desc|| v|
STK =| ~|| ~|
-->| ptr|| ptr|
| field|| field|
| v|| v|
| u| -->| u|}
@WFS:T ← TOS{desc} LRot8,c1, opcode[136’b];
Q ← 0FF and T{desc.offset},c2;
TT ← STK, pop, L0 ← L0.wfsR,c3;
Map ← Q ← [rhMDS,TT + Q],c1;
uTemp ← Q, L1 ← L1w.PushOnly,c2;
Rx ← rhRx ← MD, XDirtyDisp,c3;
wfsR:MAR ← [rhRx,Q + 0], BRANCH[wfsRMapUD,$,1],c1, at[L0.wfsR,10, WxMapFixCaller];
PC ← PC - 1, L1 ← L1w.NoFixes, GOTO[wfA],c2;
wfsRMapUD:CALL[WxMapFix] {will return to wfsR},c2;
{——————————————————————————————————————————————————————
WFSL
——————————————————————————————————————————————————————}
{@WFSL}
{Timing:11 clicks, + 2 if fix map flags, + 1 if fix rh}
{entry:exit:
TOS =| desc|| v|
STK =| ~|| ~|
-->| ptrH|| ptrH|
| ptrL|| ptrL|
| field|| field|
| v|| v|
| u| -->| u|}
@WFSL:T ← TOS{desc} LRot8, pop,c1, opcode[160’b];
Q ← 0FF and T{desc.offset},c2;
TT ← STK{ptrL}, push,c3;
L2 ← L2.WFSL,c1,;
TT ← TT + Q{desc.offset}, CarryBr, L0←L0.wfslR,c2;
rhTT ← STK{ptrH}, pop, BRANCH[wfslMap,$],c3;
Q ← rhTT, CALL[rhTTIncBx],c1;
wfslMap:Map ← Q ← [rhTT,TT],c1, at[L2.WFSL,10,rhTTIncBRets];
uTemp ← Q, L1 ← L1w.Push2Only,c2;
Rx ← rhRx ← MD, XDirtyDisp, pop,c3;
wfslR:MAR ← [rhRx,Q + 0], BRANCH[wfslRMapUD,$,1],c1, at[L0.wfslR,10, WxMapFixCaller];
PC ← PC - 1, L1 ← L1w.NoFixes, GOTO[wfA],c2;
wfslRMapUD:CALL[WLxMapFix] {will return to wfslR},c2;
{——————————————————————————————————————————————————————
WSF
——————————————————————————————————————————————————————}
{@WSF, alpha, fd}
{Timing:9 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| field|| v|
STK =| ~|| field|
-->| ptr|| ptr|
| v|| v|
| u| -->| u|}
@WSF:Q ← STK, push,c1, opcode[132’b];
TT ← Q + ib{alpha}, L1 ← L1w.PopOnly,c2;
rhTT ← UvMDS ,c3;
Map ← Q ← [rhTT, TT],c1;
T ← Q, STK ← TOS, GOTO[wfMapx],c2;
TOS ← TOS and TT, pop, GOTO[wfSpecB],c2, at[L1w.PopOnly,10,wfSpecA];
{——————————————————————————————————————————————————————
PSF
——————————————————————————————————————————————————————}
{@WSF, alpha, fd}
{Timing:10 clicks, + 2 if fix map flags}
{entry:exit:
TOS =| field|| ptr|
STK =| ~|| field|
-->| ptr|| ~|
| v| -->| v|}
{ UNUSED AT PRESENT
@PSF:TT ← STK, push,c1, opcode[xxx];
STK ← TOS{field}, L1 ← L1w.PopOnly,c2;
Noop,c3;
Map ← Q ← [rhMDS,TT + ib{alpha}],c1;
Noop,c2;
Rx ← rhRx ← MD, XDirtyDisp, GOTO[wfR],c3;
PC ← 1 + PC + 1, Cin←pc16, GOTO[wfSpecA],c1, at[L2.MaskRetC,10,wfSpec];
}
{ E N D }