/  LBYT  --  SBYT

/LBYT FUNCTION SUBROUTINE PROGRAMMED BY MIKE ALLEN
/TO LOAD A BYTE OF LENGTH 'ARG3' FROM WORD 'ARG1' AND
/STORE IN THE FIXED ACCUMULATOR, WHERE 'ARG2' IS POSITION
/OF RIGHTMOST (LEAST SIGNIFICANT) BIT OF BYTE.
/(NOTE: LEFTMOST BIT POSITION OF WORD IS ZERO.)
/CALLING SEQUENCE:
/	CALL 3,LBYT	/CALL SUBROUTINE
/	ARG1		/INTEGER FROM WHICH BYTE IS TAKEN
/	ARG2		/LEAST SIG. BIT POSITION OF BYTE
/	ARG3		/BYTE LENGTH

/ MODIFIED BY PHILLIP SIEMENS
/	LAWRENCE LIVERMORE LABORATORY
/	SEPTEMBER 8, 1975

/TO DEFINE NEW SYMBOLS FOR EAE
OPDEF	DVI 7404
OPDEF	NMI 7411
OPDEF	SHL 7413
OPDEF	ASR 7415
OPDEF	LSR 7417
OPDEF	MQL 7421
OPDEF	MUY 7405
OPDEF	MQA 7501
OPDEF	CAM 7621
OPDEF	SCA 7441
OPDEF	JMPI 5400
OPDEF	TADI 1400
OPDEF	DCAI 3400

	ENTRY LBYT
	ENTRY SBYT
/////////////
LBYT,	6140
	0002
	JMS GETARG	/GET WORD CONTAINING BYTE
	SNA		/IS IT ZERO?
	JMP QUXIT	/YES. MAKE A QUICK EXIT
	DCA KWORD	/NO. SAVE IT
	JMS GETARG	/GET BIT POSITION OF LSB
	DCA LFTADJ	/INITIALIZE SHIFT LEFT COMMAND
	TAD KWORD	/GET WORD
	MQL SHL		/PUT RIGHTMOST BIT IN AC11
LFTADJ,	0
	DCA KWORD	/SAVE RIGHT-ADJUSTED BYTE
	JMS GETARG	/GET BYTE LENGTH AND SUBTRACT ONE
	TAD (-1
	SPA		/LOGICAL OR LEGAL BYTE LENGTH?
	CLA CMA
	DCA MSKMOV	/PROBABLY OK
	STA
	MQL SHL		/POSITION MASK IN AC
MSKMOV,	0
	AND KWORD	/MASK OFF UNWANTED BITS
XIT,	MQL		/SAVE AC
	CLA CLL CML RTL	/GET A 2
	TAD LBYT
	DCA XIT2
	MQA		/GET AC BACK
XIT2,	HLT		/DO FAST EXIT
	JMPI LBYT#

QUXIT,	TAD (4
	TAD LBYT#
	DCA LBYT#	/INCREMENT EXIT POINTER BY 4
	JMP XIT
KWORD,	0		/HOLDS BYTE AFTER SHIFTING

GETARG,	0		/GET AN ARGUMENT
	TAD LBYT
	DCA GET1	/SET UP CDF TO FROM FIELD
GET1,	HLT		/CHANGE DF TO FROM FIELD
	TADI LBYT#
	DCA GET2	/SET UP CDF TO ARG FIELD
	INC LBYT#	/BUMP POINTER
	TADI LBYT#
	DCA XIT2	/POINTER TO ARG
	INC LBYT#	/BUMP POINTER
GET2,	HLT		/CHANGE DF TO ARG FIELD
	TADI XIT2	/GET ARG
	JMPI GETARG
////////////
/SBYT SUBROUTINE
/THIS SUBROUTINE WILL LOAD A BYTE FROM 'ARG4',
/LEFT ADJUST BY 'ARG2' PLACES AND STORE IN 'ARG1',
/WHERE 'ARG3' IS THE BYTE LENGTH
/(NOTE: LEFTMOST BIT POSITION OF WORD IS ZERO).
/CALLING SEQUENCE:
/	CALL 4,SBYT	/CALL SUBROUTINE
/	ARG1		/INTGER IN WHICH BYTE IS INSERTED
/	ARG2		/BIT POSITIONS TO LEFT-ADJUST BYTE
/	ARG3		/BYTE LENGTH
/	ARG4		/RIGHT-ADJUSTED BYTE INTEGER



TEMARG,	BLOCK 2
SBYT,	6140
	0002
	TAD SBYT	/MOVE POINTERS
	DCA LBYT	/SO GETARG
	TAD SBYT#	/CAN USE THEM
	DCA LBYT#
	JMS GETARG	/GET STORAGE WORD
	DCA TEMARG	/SAVE IT
	DCA MSKMOV	/CLEAR ZERO SHIFT FLAG
	TAD GET2	/SAVE ARG FIELD
	DCA SB2
	TAD XIT2	/SAVE ARG POINTER
	DCA SBYT#
	JMS GETARG	/GET # OF RIGHT SHIFTS
	TAD (-1
	SPA		/SHIFT REQUIRED?
	JMP NOSHFT	/NO. DON'T SHIFT THIS BYTE
	DCA RSHIFT	/YES. INITIALIZE SHIFTING INSTR.
	TAD TEMARG	/GET ORGINAL WORD
	LSR		/RIGHT ADJUST BYTE POSITION
RSHIFT,	0
	DCA TEMARG	/SAVE UPPER BITS
	MQA		/GET LOW BITS
	DCA TEMARG#	/SAVE THEM ALSO
	TAD RSHIFT	/GET NUMBER OF SHIFTS DONE
	DCA LSHIFT	/INIT SHIFT INSTR TO RESTORE WORD
THDARG,	JMS GETARG	/GET # OF BITS IN BYTE
	TAD (-1
	SPA		/BYTE OF ZERO WIDTH?
	JMP QXIT	/YES. EXIT QUICKLY
	DCA MSKGEN	/NO. INITIALIZE MASK GENERATOR
	JMS GETARG	/GET BYTE
	DCA SBYT	/AND SAVE IT FOR LATER
	STA		/SET AC=-1
	MQL SHL		/GENERATE THE MASK
MSKGEN,	0
	DCA KWORD	/SAVE IT
	TAD KWORD	/GET IT AGAIN
	CMA		/COMPLEMENT IT
	AND TEMARG	/MASK OFF UNDESIRED BITS
	DCA TEMARG	/SAVE IT AGAIN
	TAD MSKMOV	/GET SHIFTING FLAG
	CLL RAL		/INITIALIZE LINK
	CLA
	TAD TEMARG#	/GET LOW BITS OF ORIGINAL WORD
	MQL		/RETURN THEM TO THE MQ
	TAD KWORD	/GET MASK AGAIN
	AND SBYT	/EXTRACT DESIRED BYTE
	TAD TEMARG	/INSERT BYTE INTO ORGINAL WORD
	SZL		/SHIFT THIS WORD TO RESTORE IT?
	JMP LSHIFT#	/NO
	SHL		/YES. REPOSITION WORD IN AC
LSHIFT,	0
SB2,	HLT		/SET TO ARG FIELD
	DCAI SBYT#	/PUT ANSWER THERE
	JMP XIT		/EXIT QUICK

NOSHFT,	STA
	DCA MSKMOV	/INITIALIZE ZERO SHIFT FLAG
	JMP THDARG
QXIT,	CLA
	INC LBYT#	/ADD 2 TO EXIT POINTER
	INC LBYT#	/TO SKIP NEXT ARGUMENT
	JMP XIT
	END
