Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-04 - decus/20-0125/byte.mac
There are 2 other files named byte.mac in the archive. Click here to see a list.
	TITLE	BYTE - MANIPULATION ROUTINES
	ENTRY	GFIELD,SFIELD
	;
	; THESE ROUTINES ARE FORTRAN-10 AND F40 COMPATIBLE
	; REGISTER DEFINITIONS
	;
RESULT=0
TEMP=1
L=16
P=17
BYTEP:	EXP	0			; BYTE POINTER
	;
	; GFIELD, CALLING SEQUENCE IS:
	;
	; IRESLT = GFIELD(IVAR, IPOS, ILEN)
	;
	; WHERE GFIELD IS AN INTEGER FUNCTION WHICH
	; RETURNS A BYTE WITHIN IVAR DEFINED BY:
	;
	; IPOS - BYTE POSITION (NUMBER OF BITS FROM LEFT)
	; ILEN - THE LENGTH OF THE BYTE IN BITS
	;
GFIELD:	SKIPA			; F40 AND
	PUSH	P,L		; FORTRAN-10 COMPATIBLE
	JSR	POINT		; CREATE BYTE POINTER
	LDB	RESULT,BYTEP	; GET THE BYTE
	POPJ	P,		; RETURN TO FORTRAN
	PAGE
	; SFIELD, CALLING SEQUENCE IS:
	;
	; CALL SFIELD(IVAR, IPOS, ILEN, IVAL)
	;
	; THIS STORES A BYTE (AS DEFINED IN GFIELD)
	; WITH VALUE "IVAL"
	;
SFIELD:	SKIPA			; F40 AND
	PUSH	P,L		; FORTRAN-10 COMPATIBLE
	JSR	POINT		; CREATE BYTE POINTER
	MOVE	TEMP,@3(L)	; GET THE VALUE
	DPB	TEMP,BYTEP	; STORE THE BYTE
	POPJ	P,		; AND RETURN TO FORTRAN
	PAGE
	; POINT, THIS ROUTINE CREATES THE BYTE POINTER
	;
POINT:	EXP	0			; ENTRY POINT
	MOVEI	TEMP,^D36		; 36 BITS IN A WORD
	SUB	TEMP,@1(L)		; MINUS THE POSITION
	SUB	TEMP,@2(L)		; MINUS THE LENGTH
	LSH	TEMP,^D30		; SHIFT TO POSITION FIELD
	MOVEM	TEMP,BYTEP		; AND STORE IN BYTEP
	MOVE	TEMP,@2(L)		; GET THE LENGTH
	LSH	TEMP,^D24		; SHIFT TO SIZE FIELD
	IORM	TEMP,BYTEP		; AND STORE IN BYTEP
	MOVE	TEMP,0(L)		; GET ADDRESS FIELD
	TLNE	TEMP,20			; IF INDIRECT ADDRESSING (I.E. F10)
	MOVE	TEMP,0(TEMP)		; THEN GET ADDRESS
	HRRZ	TEMP,TEMP		; CLEAR LEFT HALF WORD
	IORM	TEMP,BYTEP		; AND FORM THE BYTE POINTER
	JUMPA	@POINT			; RETURN
	END