{  BBLoops.mc, HGM,  4-Nov-84  2:28:23,  WriteOK => LOOPHOLE[wok]

File name bbLoops.mc
Description: BitBlt op-code
Author: don charnley
Created: January, 1980
Last edited by Fasnacht: June 18, 1981  8:47 AM: Delete L1Tldaw at
Last edited: October 8, 1980  6:35 PM
}

	{L4IClick1 -- ReadSource1}
L4I1lsar:
	MAR ← [rhSrcA,SrcA + 0], sfDisp, BRANCH[L4I1noop1,L4I2noop1X]	,c1;
L4I1noop1:	Dst ← Dst xor ~Dst, scDisp, sfDISP[L4I1rs]	,c2;
L4I1rs:	Src ← MD, scDisp, sc2DISP[L4I1sc2]	,c3, at[sf.true,sfM,L4I1rs];
	Src ← ~MD, scDisp, sc2DISP[L4I1sc2]	,c3, at[sf.comp,sfM,L4I1rs];

	{L4IClick2 -- ShiftSource1}
L4I1sc2:	Src ← Src LRot0, scDisp, sc1DISP[L4I1sc1]	,c1, at[3,10,L4I1sc2];
	Src ← Src LRot4, scDisp, sc1DISP[L4I1sc1]	,c1, at[7,10,L4I1sc2];
	Src ← Src LRot8, scDisp, sc1DISP[L4I1sc1]	,c1, at[0B,10,L4I1sc2];
	Src ← Src LRot12, scDisp, sc1DISP[L4I1sc1]	,c1, at[0F,10,L4I1sc2];

L4I1sc1:	Src ← RRot1 Src, dirDisp, sc3DISP[L4I1sc3b]	,c2, at[0E,10,L4I1sc1];
	Src ← Src, dirDisp, sc3DISP[L4I1sc3b]	,c2, at[0F,10,L4I1sc1];

L4I1sc3b:	Dst ← RRot1 (Src or Q), dirDISP[L4I2lsar]	,c3, at[0D,10,L4I1sc3b];
	Dst ← LRot1 (Src or Q), dirDISP[L4I2lsar]	,c3, at[0F,10,L4I1sc3b];

	{L4IClick3 -- ReadSource2}
L4I2lsar:	SrcA ← MAR ← [rhSrcA,SrcA + 1], sfDisp, GOTO[L4I2noop1]	,c1, at[dir.forward,dirM,L4I2lsar];
	SrcA ← MAR ← [rhSrcA,SrcA - 1], sfDisp, GOTO[L4I2noop1]	,c1, at[dir.backwards,dirM,L4I2lsar];
L4I2noop1:	scDisp, sfDISP[L4I2rs]	,c2;
L4I2noop1X:	Dst ← Dst xor ~Dst, scDisp, sfDISP[L4I2rs]	,c2;
L4I2rs:	Src ← MD, scDisp, sc2DISP[L4I2sc2]	,c3, at[sf.true,sfM,L4I2rs];
	Src ← ~MD, scDisp, sc2DISP[L4I2sc2]	,c3, at[sf.comp,sfM,L4I2rs];

	{L4IClick4 -- ShiftSource2}
L4I2sc2:	Src ← Src LRot0, scDisp, sc1DISP[L4I2sc1]	,c1, at[3,10,L4I2sc2];
	Src ← Src LRot4, scDisp, sc1DISP[L4I2sc1]	,c1, at[7,10,L4I2sc2];
	Src ← Src LRot8, scDisp, sc1DISP[L4I2sc1]	,c1, at[0B,10,L4I2sc2];
	Src ← Src LRot12, scDisp, sc1DISP[L4I2sc1]	,c1, at[0F,10,L4I2sc2];

L4I2sc1:	Src ← RRot1 Src, sc3DISP[L4I2sc3a]	,c2, at[0E,10,L4I2sc1];
	Src ← Src, sc3DISP[L4I2sc3a]	,c2, at[0F,10,L4I2sc1];

L4I2sc3a:	Hold ← RRot1 (~Src and Q), GOTO[L4I3ldar]	,c3, at[0D,10,L4I2sc3a];
	Hold ← LRot1 (~Src and Q), GOTO[L4I3ldar]	,c3, at[0F,10,L4I2sc3a];

	{L4IClick5 -- ReadDest}
L4I3ldar:	DstA ← MAR ← [rhDstA,DstA + 0]	,c1;
L4I3com:	Hold ← Hold xor Dst	,c2;
L4I3rd:	Dst ← MD	,c3;

	{L4IClick6 -- Mask}
L4I4m1:	Lcount ← Lcount - 1, NegBr	,c1;
L4I4m2:	dfDisp, BRANCH[L4I4m3,L4Tshort]	,c2;
L4I4m3:	Mask1 ← ~Mask1, dfDISP[L4I5m1]	,c3;

	{L4IClick7 -- Mask}
L4I5m1:	Hold ← Hold and ~Mask1, GOTO[L4I5m2]	,c1, at[df.null,dfM,L4I5m1];
L4I5m2:	Dst ← Dst and Mask1, dirDisp, GOTO[L4I5m3]	,c2;
L4I5m3:	Hold ← Hold or Dst, scDisp, dirDISP[L4lsar]	,c3;

	Hold ← Hold or Mask1, GOTO[L4I5m2A]	,c1, at[df.and,dfM,L4I5m1];
	Hold ← Hold and ~Mask1, GOTO[L4I5m2A]	,c1, at[df.or,dfM,L4I5m1];
	Hold ← Hold and ~Mask1, GOTO[L4I5m2A]	,c1, at[df.xor,dfM,L4I5m1];
L4I5m2A:	dirDisp	,c2;
	scDisp, dirDISP[L4lsar]	,c3;


	{  L4 INNER LOOP }

	{L4Click1 -- ReadSource}
L4lsar:	SrcA ← MAR ← [rhSrcA,SrcA + 1], sfDisp, sc3DISP[L4sc3b]	,c1, at[dir.forward,dirM,L4lsar];
L4lsarA:	SrcA ← MAR ← [rhSrcA,SrcA - 1], sfDisp, sc3DISP[L4sc3b]	,c1, at[dir.backwards,dirM,L4lsar];

L4sc3b:	Save ← RRot1 (Src or Q), sfDISP[L4rs]	,c2, at[0D,10,L4sc3b];
	Save ← LRot1 (Src or Q), sfDISP[L4rs]	,c2, at[0F,10,L4sc3b];

L4rs:	Src ← MD, dfDisp, GOTO[L4ldaw]	,c3, at[sf.true,sfM,L4rs];
	Src ← ~MD, dfDisp, GOTO[L4ldaw]	,c3, at[sf.comp,sfM,L4rs];

	{L4Click2 -- StoreDest}
L4ldaw:	MAR ← [rhDstA,DstA + 0], scDisp, dfDISP[L4dw]	,c1;

L4dw:	MDR ← Hold , scDisp, sc1DISP[L4sc1], LOOPHOLE[wok]	,c2, at[df.null,dfM,L4dw];
	MDR ← Hold and Dst, scDisp, sc1DISP[L4sc1], LOOPHOLE[wok]	,c2, at[df.and,dfM,L4dw];
	MDR ← Hold or Dst, scDisp, sc1DISP[L4sc1], LOOPHOLE[wok]	,c2, at[df.or,dfM,L4dw];
	MDR ← Hold xor Dst, scDisp, sc1DISP[L4sc1], LOOPHOLE[wok]	,c2, at[df.xor,dfM,L4dw];

L4sc1:	Src ← RRot1 (Src), sc2DISP[L4sc2]	,c3, at[0E,10,L4sc1];
	Src ← (Src), sc2DISP[L4sc2]	,c3, at[0F,10,L4sc1];

	{L4Click3 -- ShiftSource}
L4sc2:	Src ← Src LRot0, scDisp, GOTO[L4Lcnt]	,c1, at[3,10,L4sc2];
	Src ← Src LRot4, scDisp, GOTO[L4Lcnt]	,c1, at[7,10,L4sc2];
	Src ← Src LRot8, scDisp, GOTO[L4Lcnt]	,c1, at[0B,10,L4sc2];
	Src ← Src LRot12, scDisp, GOTO[L4Lcnt]	,c1, at[0F,10,L4sc2];

L4Lcnt:	Lcount ← Lcount - 1, dirDisp, NegBr, sc3DISP[L4sc3a]	,c2;

L4sc3a:	Hold ← RRot1 (~Src and Q), dirDISP[L4ldar]	,c3, at[0D,10,L4sc3a];
	Hold ← LRot1 (~Src and Q), dirDISP[L4ldar]	,c3, at[0F,10,L4sc3a];

	{L4Click4 -- ReadDest}
L4ldar:	DstA ← MAR ← [rhDstA,DstA + 1], GOTO[L4com]	,c1, at[dir.forward,dirM,L4ldar];
	DstA ← MAR ← [rhDstA,DstA - 1], GOTO[L4com]	,c1, at[dir.backwards,dirM,L4ldar];
L4com:	Hold ← Hold xor Save, dirDisp, BRANCH[L4rd,L4rdA,1]	,c2;
L4rd:	Dst ← MD, scDisp, dirDISP[L4lsar]	,c3;

	{L4Tshort }
L4Tshort:	Src ← Hold, CANCELBR[$,Sub[dfM,1] ]	,c3;

	Mask2 ← Umask2, dfDisp	,c1;
	Mask2 ← Mask2 and Mask1, dfDISP[L12Tdf]	,c2;

	{L4TClick1 -- ReadDest}
L4TermF:	DstA ← MAR ← [rhDstA,DstA + 1], GOTO[L4Tcom]	,c1, at[Or[dir.forward,LCeq0],dirM,L4ldar];
	DstA ← MAR ← [rhDstA,DstA - 1], GOTO[L4Tcom]	,c1, at[Or[dir.backwards,LCeq0],dirM,L4ldar];
L4Tcom:	Hold ← Hold xor Save, DISP2[L4Trd]	,c2;
L4Trd:	Dst ← MD, GOTO[L4Tm1]	,c3, at[NoPgCr,4,L4Trd];

	{L4TClick2 -- Mask}
L4Tm1:	Src ← Hold, dfDisp	,c1;
	Mask2 ← Umask2, dfDISP[L12Tdf]	,c2;


	{initialization for loops L1 and L2D}

	{L1/2 Init Click1 -- ReadSource}
L1I1lsar:	MAR ← [rhSrcA,SrcA + 0], sfDisp	,c1, at[gr.gray,grM,chooseLoop];

	scDisp, sfDISP[L1sf]	,c2;

	Src ← MD, scDisp, sc2DISP[L1I1sc2]	,c3, at[sf.true,sfM,L1sf];
	Src ← ~MD, scDisp, sc2DISP[L1I1sc2]	,c3, at[sf.comp,sfM,L1sf];


	{L1/2 Init Click2 -- CycleSource}
L1I1sc2:	Src ← Src LRot0, scDisp, sc1DISP[L1I1sc1]	,c1, at[3,10,L1I1sc2];
	Src ← Src LRot4, scDisp, sc1DISP[L1I1sc1]	,c1, at[7,10,L1I1sc2];
	Src ← Src LRot8, scDisp, sc1DISP[L1I1sc1]	,c1, at[0B,10,L1I1sc2];
	Src ← Src LRot12, scDisp, sc1DISP[L1I1sc1]	,c1, at[0F,10,L1I1sc2];

	Src ← RRot1 Src, sc3DISP[L1I1sc3b]	,c2, at[0E,10,L1I1sc1];
	Src ← Src, sc3DISP[L1I1sc3b]	,c2, at[0F,10,L1I1sc1];

	Src ← RRot1 Src, GOTO[L1I3ldar]	,c3, at[0D,10,L1I1sc3b];
	Src ← LRot1 Src, GOTO[L1I3ldar]	,c3, at[0F,10,L1I1sc3b];


	{L1/2 Init Click3 -- ReadDest}
L1I3ldar:	MAR ← [rhDstA,DstA + 0]	,c1;
	Lcount ← Lcount - 1, NegBr	,c2;
	Dst ← MD, BRANCH[L1I4mask1,SingleDstWExit]	,c3;

	{L1/2 Init Click4 -- Mask}
L1I4mask1:	Noop	,c1;
	dfDisp	,c2;
	dfDISP[L12df]	,c3;

	{L1 Init Click5 -- Mask}
	{df.null  -- will go to loop L1}
	Q ← Src	,c1, at[df.null,dfM,L12df];
	Q ← Q and Mask1	,c2;
	Dst ← Dst and ~Mask1	,c3;

	{L1 Init Click6 -- store first end chunk}
	MAR ← [rhDstA,DstA + 0]	,c1;
	MDR ← Dst or Q, GOTO[L1Entry]	,c2;

	{L2 Init Click5 -- Mask}
	{df.not null  -- will go to loop L2}
	Q ← Src and Dst, GOTO[L2dfnext]	,c1, at[df.and,dfM,L12df];
	Q ← Src or Dst, GOTO[L2dfnext]	,c1, at[df.or,dfM,L12df];
	Q ← Src xor Dst, GOTO[L2dfnext]	,c1, at[df.xor,dfM,L12df];

L2dfnext:	Q ← Q and Mask1	,c2;

	Dst ← Dst and ~Mask1	,c3;


	{L2 Init Click6 -- store first end chunk}
	MAR ← [rhDstA,DstA + 0]	,c1;
	MDR ← Dst or Q, GOTO[L2Entry]	,c2;

	{  L1 INNER LOOP }

	{L1Click1 -- StoreDest}
L1Loop:	DstA ← MAR ← [rhDstA,DstA + 1], BRANCH[$,L1Exit]	,c1;
L1pcrGo:	MDR ← Src, BRANCH[L1Entry,L1pcr,1]	,c2;
L1Entry:	Lcount ← Lcount - 1, NegBr, GOTO[L1Loop]	,c3;



	{  L2 INNER LOOP }

	{L2DClick1 -- StoreDest}
L2Loop:	MAR ← [rhDstA,DstA + 0], dfDISP[L2Ddw]	,c1;

	MDR ← Src and Dst, GOTO[L2Entry]	,c2, at[df.and,dfM,L2Ddw];
	MDR ← Src or Dst, GOTO[L2Entry]	,c2, at[df.or,dfM,L2Ddw];
	MDR ← Src xor Dst, GOTO[L2Entry]	,c2, at[df.xor,dfM,L2Ddw];

L2Entry:	Noop, GOTO[L2LCk2]	,c3;


	{L2DClick2 -- ReadDest}
L2LCk2:	MAR ← DstA ← [rhDstA,DstA + 1]	,c1;
	Lcount ← Lcount - 1, NegBr, BRANCH[$,L2pcr,1]	,c2;
L2pcrGo:	Dst ← MD, dfDisp, BRANCH[L2Loop,L2Exit]	,c3;


	{L1/2  Termination }
	{L1 Exit Click1 -- ReadDest}

L1Exit:	Noop, BRANCH[$,L1Tpcr,1]	,c2;
	Dst ← MD, GOTO[L12Tmask]	,c3;

	{L1/2 Single dest word exit}
SingleDstWExit:
	Mask2{Mask1andMask2} ← Mask1 and Mask2, dfDisp	,c1;
	Noop, dfDISP[L12Tdf]	,c2;

	{L2 Exit Click1 -- ReadDest}
L2Exit:	dfDisp, CANCELBR[$,0F]	,c1;
	dfDISP[L12Tdf]	,c2;

	Src ← Src, GOTO[L12Tmask]	,c3, at[df.null,dfM,L12Tdf];
	Src ← Src and Dst, GOTO[L12Tmask]	,c3, at[df.and,dfM,L12Tdf];
	Src ← Src or Dst, GOTO[L12Tmask]	,c3, at[df.or,dfM,L12Tdf];
	Src ← Src xor Dst, GOTO[L12Tmask]	,c3, at[df.xor,dfM,L12Tdf];

L12Tmask:	Src ← Src and Mask2	,c1;
	Dst ← Dst and ~Mask2	,c2;
	Noop	,c3;

	{L1TClick3 --StoreDest}
	MAR ← [rhDstA,DstA + 0]	,c1;
	MDR ← Src or Dst, GOTO[ItemRefill3]	,c2;

{	Src  PageCross	}

	rhRet ← SRaRet, CANCELBR{CALL}[SrcLRemap,0F] {PageCross}	,c3, at[Or[sf.true,PgCr],sfM,L4I2rs];
	rhRet ← SRaRet, CANCELBR{CALL}[SrcLRemap,0F] {PageCross}	,c3, at[Or[sf.comp,PgCr],sfM,L4I2rs];

{rtn here}	SrcA ← MAR ← [rhSrcA,SrcA + 0], sfDisp, GOTO[L4I2noop1]	,c1, at[SRaRet,10,SrcRemapReturn];

	rhRet ← SRcRet, CALL[SrcLRemap] {PageCross}	,c3, at[Or[sf.true,PgCr],sfM,L4rs];
	rhRet ← SRcRet, CALL[SrcLRemap] {PageCross}	,c3, at[Or[sf.comp,PgCr],sfM,L4rs];

{rtn here}	MAR ← [rhSrcA,SrcA + 0], sfDisp	,c1, at[SRcRet,10,SrcRemapReturn];
	sfDISP[L4rs]	,c2;

{	Dst  PageCross	}

{L4TrdA:}	{Page Cross}
	rhRet ← DRaRet, CALL[DstLRemap]	,c3, at[PgCr,4,L4Trd];

{rtn here}	DstA ← MAR ← [rhDstA,DstA + 0]	,c1, at[DRaRet,10,DstRemapReturn];
	Noop, GOTO[L4Trd]	,c2;

L4rdA:	{Page Cross}
	rhRet ← DRbRet, CANCELBR[DstLRemap,Sub[dirM,1] ]	,c3;

{rtn here}	DstA ← MAR ← [rhDstA,DstA + 0]	,c1, at[DRbRet,10,DstRemapReturn];
	dirDisp, GOTO[L4rd]	,c2;

L1pcr:	{Page Cross}
	rhRet ← ret.L1pcr, CALL[DstLRemap] {PageCross}	,c3;

{rtn here}	DstA ← MAR ← [rhDstA,DstA + 0], GOTO[L1pcrGo]	,c1, at[ret.L1pcr,10,DstRemapReturn];

L2pcr:	{Page Cross}
	rhRet ← ret.L2pcr, {CALL}CANCELBR[DstLRemap]	,c3;

{rtn here}	DstA ← MAR ← [rhDstA,DstA + 0]	,c1, at[ret.L2pcr,10,DstRemapReturn];
	Lcount ← Lcount, NegBr, GOTO[L2pcrGo]	,c2;

L1Tpcr:	{Page Cross}
	rhRet ← ret.L1Tpcr, CALL[DstLRemap]	,c3;

{rtn here}	DstA ← MAR ← [rhDstA,DstA + 0], GOTO[L1Exit]	,c1, at[ret.L1Tpcr,10,DstRemapReturn];

	{END}