{
File : NEWLSH.mc
Author : Gwan Santosa
Date :   5-Nov-85  9:47:30

(LSH A B)

Performs left shift A by B position,
where A and B are smallpl

Procedure :
After preliminary checking for valid arguments, rotate A by 8 position (swap h and l byte),
For B between 0 and 7, check h byte to see if it is ok to shift.
For B between 8 and 15, as long as h byte is 00, it is ok to shift 8 position first, then
do the remainder by going to subroutine that process shifting between 0 and 7 positions.
}
	
@LSHOP:	Ybus ← TOSH xor smallpl, ZeroBr,	c1, opcode[347'b];  {Check if B is smallpl}
	Rx ← 10, BRANCH[LSHER1, $],		c2;
	Q ← 0FF,				c3; {Q contains mask for B>=8}	

	MAR ← [rhS, S - 1], 				c1;
	Ybus ← TOS - Rx, CarryBr, CANCELBR[$, 2],	c2; {Check if B>15}
	TT ← MD, BRANCH[$, LSHER3]			c3; {Fetch A Hi}
	
	MAR ← [rhS, S + 0], 			c1;
	Ybus ← TT xor smallpl, ZeroBr,		c2; {Check if A is smallpl}
	Rx ← MD, BRANCH[LSHER2, $],		c3; {Fetch A Lo}

	TT ← Rx LRot8,				c1; {Rotate A by 8}
	uTOS ← TOS, YDisp,			c2; {Select how many shifting}
	TOS ← TOS and 07, DISP4[SHSEL],		c3; 

L0SH:	TOS ← Rx, GOTO[LSHF4],			c1, at[0, 10, SHSEL];
			
L1SH:	Q ← 80,						c1, at[1, 10, SHSEL];
	TT ← TT and Q, ZeroBr,				c2;	
	TT ← Rx LShift1, SE ← 0, BRANCH[LSER0, $],	c3;
		
	TOS ← TT, GOTO[LSHF3],				c1;
	
L2SH:	Q ← 0C0,					c1, at[2, 10, SHSEL];		
	TT ← TT and Q, ZeroBr,				c2;	
	TT ← Rx LShift1, SE ← 0, BRANCH[LSER1, $],	c3;
		
	TOS ← TT LShift1, SE ← 0, GOTO[LSHF3],		c1;
	
L3SH:	Q ← 0E0,				c1, at[3, 10, SHSEL];
	TT ← TT and Q, ZeroBr,			c2;	
	TT ← Rx LRot4, BRANCH[LSER2, $],	c3;
		
	TOS ← TT RShift1, SE ← 0, GOTO[LSHF3],	c1;	

L4SH:	Q ← 0F0,				c1, at[4, 10, SHSEL];
	TT ← TT and Q, ZeroBr,			c2;	
	TT ← Rx LRot4, BRANCH[LSER3, $],	c3;
		
	TOS ← TT, GOTO[LSHF3],			c1;

L5SH:	Q ← 0F8,				c1, at[5, 10, SHSEL];
	TT ← TT and Q, ZeroBr,			c2;	
	TT ← Rx LRot4, BRANCH[LSER4, $],	c3;
		
	TOS ← TT LShift1, SE ← 0, GOTO[LSHF3],	c1;

L6SH:	Q ← 0FC,				c1, at[6, 10, SHSEL];
	TT ← TT and Q, ZeroBr,			c2;	
	TT ← Rx LRot4, BRANCH[LSER5, $],	c3;
		
	TT ← TT LShift1, SE ← 0, 		c1;
	TT ← TT LShift1, SE ← 0, GOTO[LSHF5],	c2;

L7SH:	Q ← 0FE,				c1, at[7, 10, SHSEL];
	Ybus ← TT and Q, ZeroBr,		c2;	
	BRANCH[LSER6, $],			c3;
		
	TOS ← TT RShift1,SE ← 0,  GOTO[LSHF3],	c1;
	
L8SH:	Ybus ← TT and Q, ZeroBr, GOTO[CNR8],	c1, at[8, 10, SHSEL]; 
									
L9SH:	Ybus ← TT and Q, ZeroBr, GOTO[CNR8],	c1, at[9, 10, SHSEL];

LASH:	Ybus ← TT and Q, ZeroBr, GOTO[CNR8], 	c1, at[0A, 10, SHSEL];
	
LBSH:	Ybus ← TT and Q, ZeroBr, GOTO[CNR8], 	c1, at[0B, 10, SHSEL];
		
LCSH:	Ybus ← TT and Q, ZeroBr, GOTO[CNR8],	c1, at[0C, 10, SHSEL];
		
LDSH:	Ybus ← TT and Q, ZeroBr, GOTO[CNR8],	c1, at[0D, 10, SHSEL];
		
LESH:	Ybus ← TT and Q, ZeroBr, GOTO[CNR8], 	c1, at[0E, 10, SHSEL];
		
	Ybus ← Rx xor 1, ZeroBr,	c1, at[0F, 10, SHSEL];
	BRANCH[LSER7, $],		c2; {Can only shift 15 position if A=1}
	TOS ← Rx RRot1,			c3;
	
	S ← S - 2, GOTO[IB.pc1],	c1;
	
CNR8:	BRANCH[LSER8, $],	c2;
	Q ← Rx,			c3; {Exchange Rx and TT}
	
	Rx ← TT,		c1;
	Ybus ← TOS, YDisp,	c2; {Process the remainding shifting}	
	TT ← Q, DISP4[SHSEL],	c3;
	
LSHER1:	GOTO[ufnX1],	c3;

LSHER3: GOTO[ufnX2],	c1;

LSHER2:	GOTO[ufnX2],	c1;

LSER7:	uTOSH ← TOSH, GOTO[ufnZ1],	c3;

LSER0:	uTOSH ← TOSH, GOTO[ufnZ2],	c1;

LSER1:	uTOSH ← TOSH, GOTO[ufnZ2],	c1;

LSER2:	uTOSH ← TOSH, GOTO[ufnZ2],	c1;

LSER3:	uTOSH ← TOSH, GOTO[ufnZ2],	c1;

LSER6:	uTOSH ← TOSH, GOTO[ufnZ2],	c1;

LSER8:	uTOSH ← TOSH, GOTO[ufnZ1],	c3;

LSER4:	uTOSH ← TOSH, GOTO[ufnZ2],	c1;

LSER5:	uTOSH ← TOSH, GOTO[ufnZ2],	c1;

LSHF5:	TOS ← TT, GOTO[B2FN],	c3;

LSHF4:	S ← S - 2,		c2;
	GOTO[B1FN],		c3;
	
B2FN:	S ← S - 2, GOTO[IB.pc1],	c1;
	
LSHF3:	S ← S - 2, 			c2;
	Noop,				c3;
		
B1FN:	GOTO[IB.pc1],			c1;