{
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:
OP
valbytesstktime
RSTR
120’b22+14
RSTRL
153’b23+15
WSTR
121’b235
WSTRL
154’b246
}
{The field mesa op-codes consist of the following:
OP
valfieldbytesstacktime
RF
112’bs3̄1+1 4
RF0
xxxs2̄1+1 4
RFL
155’bs3̄2+1 5
RFS
135’bd1̄2+1 5
RFSL
157’bd1̄3+1 6
RFC
134’bs3̄1+1 5
RILF
xxxs2+1 5
RILPF
xxxs3+1 6
RBIT
xxxs2̄1+1 4
RILBIT
xxxs2+1 5
WF
113’bs3̄2 9
WFL
156’bs3̄310
WFS
136’bd1̄310
WFSL
160’bd1̄411
WSF
132’bs3̄210
PSF
xxxs3̄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 }