Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-10 - 43,50517/gc.mac
There are 16 other files named gc.mac in the archive. Click here to see a list.
TITLE	GC FOR LIBOL V10 AND RPGLIB V1
SUBTTL	CONVERT COMP-3 TO BINARY	15-DEC-74	/ACK

;COPYRIGHT 1974, 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
;ALL RPGII MODIFICATIONS COPYRIGHT 1976, BOB CURRIER AND CERRITOS COLLEGE

;REVISION HISTORY:

;V10 *****

;	15-DEC-74	/ACK	CREATION.

;*****

	SEARCH	RPGPRM		;DEFINE PARAMETERS.
	%%LBLP==:%%LBLP

	EXTERN	EASTB.		;FORCE EASTBL TO BE LOADED.

	HISEG

COMMENT	\

	THIS ROUTINE CONVERTS A PACKED DECIMAL STRING TO A ONE OR TWO WORD
BINARY NUMBER.

CALL:
	MOVE	16,[Z	AC,PARAMETER ADDRESS]
	PUSHJ	17,GC3.

PARAMETERS:
	THE ACCUMULATOR FIELD OF AC 16 CONTAINS THE AC INTO WHICH THE
FIRST WORD OF THE RESULT IS TO BE PLACED.
	THE RIGHT HALF OF AC 16 POINTS TO A WORD IN THE FOLLOWING FORMAT:
	BITS	0-5	BYTE RESIDUE FOR THE INPUT FIELD.
	BIT	6	1 IF THE FIELD IS EXPLICITLY SIGNED.
	BITS	7-17	SIZE OF THE FIELD.
	BITS	18-35	ADDRESS OF THE FIRST CHARACTER OF THE INPUT FIELD.
	THE INPUT IS A SEQUENCE OF NINE BIT BYTES, EACH CONSISTING OF TWO
FOUR BIT DECIMAL NUMBERS RIGHT JUSTIFIED IN EACH BYTE.

RETURNS:
	CALL+1	ALWAYS.

REGISTERS USED:
	SW, CNT, IPTR, AC, AC+1, AC+2, CH, T1 (ALIAS CH), T2, JAC

\
	ENTRY	GC3.

	EXTERN	SET1.		;ROUTINE TO PICK UP THE PARAMETERS.
	EXTERN	GDSP1.		;ROUTINE TO NEGATE THE SINGLE PRECISION
				; RESULT, IF NECESSARY, AND STORE IT.
	EXTERN	GDDP5.		;ROUTINE TO NEGATE THE DOUBLE PRECISION
				; RESULT, IF NECESSARY, AND STORE IT.

	EXTERN	PACFL.		;POINTER TO THE NUMBER OF THE AC INTO
				; WHICH WE ARE TO PLACE THE RESULT.

GC3.:	MOVEI	CH,	^D8		;TELL SET1. THAT WE ARE PLAYING
					; WITH EBCDIC.
	JSP	JAC,	SET1.		;GO PICK UP THE PARAMETERS.

GC:	TRNN	CNT,	1		;IS THE NUMBER OF DIGITS TO BE
					; ODD OR EVEN.
	TLO	SW,	OECNT		;EVEN, REMEMBER THAT.

	CAILE	CNT,	^D10		;ONE OR TWO WORD RESULT?
	JRST		GC1		;TWO WORDS - USE DOUBLE
					; PRECISION ROUTINE.

;HERE WE WORK ON A SINGLE PRECISION RESULT.

	ADDI	CNT,	2		;SEE HOW MANY NINE BIT BYTES WE
	LSH	CNT,	-1		; HAVE.
	PUSHJ	PP,	GC3CSP		;GO CONVERT THE NUMBER.
	JSP	JAC,	GC3NEG		;SEE IF WE HAVE TO NEGATE THE RESULT
	EXP		GDSP1.		;RETURN TO THE GET SINGLE PRECISION
					; ROUTINE TO STORE THE RESULT.
;COME HERE IF THE RESULT IS TO BE DOUBLE PRECISION.

GC1:	HRRI	SW,	(CNT)		;SAVE THE COUNT.
	MOVEI	CNT,	5		;SET IT TO 5.
	PUSHJ	PP,	GC3CSP		;GO CONVERT 9 DIGITS.
	IMULI	AC+1,	^D10		;SHIFT THE RESULT ONE DIGIT.
	ADDI	AC+1,	(T1)		;ADD IN THE 9TH DIGIT.
	HRRZI	CNT,	-^D8(SW)	;FIGURE OUT HOW MUCH MORE WE HAVE
	LSH	CNT,	-1		; TO CONVERT.
	SOJE	CNT,	GC2		;ONLY ONE DIGIT?
	JSP	JAC,	GC3G2		;NO, GO GET TWO DIGITS AND MAKE
					; THEM INTO A BINARY NUMBER.
	IMULI	AC,	^D100		;SHIFT THE ACCUMULATION LEFT BY
	MULI	AC+1,	^D100		; TWO DIGITS.
	PUSHJ	PP,	GC3CP		;TAKE CARE OF CROSS PRODUCT AND
					; ADD IN THE TWO DIGITS.
	SOJG	CNT,	GC3G2		;LOOP IF THERE IS MORE THAN ONE
					; DIGIT LEFT.
GC2:	ILDB	T1,	IPTR		;GET THE LAST DIGIT AND THE SIGN.
	LSHC	T1,	-4		;SEPARATE THEM.
	IMULI	AC,	^D10		;SHIFT THE ACCUMULATION LEFT BY
	MULI	AC+1,	^D10		; ONE DIGIT.
	PUSHJ	PP,	GC3CP		;TAKE CARE OF CROSS PRODUCT AND
					; ADD IN THE LAST DIGIT.
	LSHC	T1,	4		;GET THE SIGN BACK.
	ANDI	T1,	17		;ISOLATE IT.
	JSP	JAC,	GC3NEG		;NEGATE THE RESULT?
	EXP		GDDP5.		;RETURN TO GET DOUBLE PRECISION
					; DISPLAY ROUTINE TO STORE
					; THE RESULT.
;SUBROUTINE TO CONVERT A BCD NUMBER OF 9 OR FEWER DIGITS TO A ONE
; WORD BINARY NUMBER.

COMMENT	\

CALL:
	PUSHJ	PP,GC3CSP

ENTRY CONDITIONS:
	(IPTR)	=	BYTE POINTER TO THE INPUT STRING.
	(CNT)	=	(NUMBER OF DIGITS TO BE CONVERTED + 1) / 2

EXIT CONDITIONS:
	(AC)	=	0
	(AC+1)	=	THE RESULT OF THE CONVERSION
	(T1)	=	THE LAST FOUR BITS OF THE LAST BYTE (IF DOING A
			 SINGLE PRECISION CONVERSION, THIS IS THE SIGN.
			 IF DOING THE FIRST PART OF A DOUBLE PRECISION
			 CONVERSION THIS IS THE TENTH DIGIT.)
	(T1+1)	=	GARBAGE.

RETURNS:
	CALL+1	ALWAYS.

\

GC3CSP:	SETZB	AC,	AC+1		;CLEAR A PLACE TO ACCUMULATE
					; THE RESULT
	TLZE	SW,	OECNT		;ODD OR EVEN NUMBER OF DIGITS?
	JRST		GC3CS8		;EVEN, GO GET THE FIRST ONE.
GC3CS2:	SOJE	CNT,	GC3CS5		;JUMP IF ONLY ONE DIGIT TO CONVERT.
	JSP	JAC,	GC3G2		;GET THE NEXT TWO BCD DIGITS IN BINARY.
	IMULI	AC+1,	^D100		;SHIFT THE ACCULULATION LEFT BY TWO DIGITS.
	ADDI	AC+1,	(T1)		;ADD IN THE TWO DIGITS.
	SOJG	CNT,	GC3G2		;JUMP IF THERE IS MORE THAN ONE
					; DIGIT LEFT.

GC3CS5:	ILDB	T1,	IPTR		;GET THE NEXT DIGIT AND THE SIGN
					; (OR TWO DIGITS.)
	LSHC	T1,	-4		;SEPARATE THEM.
	IMULI	AC+1,	^D10		;SHIFT THE ACCULULATION LEFT
					; BY ONE DIGIT.
	ADDI	AC+1,	(T1)		;ACCUMULATE THE RESULT.
	LSHC	T1,	4		;GET THE SIGN (OR TENTH DIGIT.)
	ANDI	T1,	17		;ISOLATE IT.
	POPJ	PP,			;RETURN.

GC3CS8:	ILDB	AC+1,	IPTR		;GET THE FIRST DIGIT.
	ANDI	AC+1,	17		;GET RID OF NANY JUNK.
	SOJA	CNT,	GC3CS2		;GO CONVERT THE REST.
;SUBROUTINE TO GET TWO BCD DIGITS AND CONVERT THEM TO BINARY.

COMMENT	\

CALLS:
	JSP	JAC,	GC3G2		;THE FIRST TIME.
	SOJG	CNT,	GC3G2		;SUBSEQUENT TIMES.

ENTRY CONDITIONS:
	(IPTR)	=	BYTE POINTER TO THE INPUT STRING.

EXIT CONDITIONS:
	(T1)	=	THE RESULT OF THE CONVERSION.
	(T1+1)	=	GARBAGE.

\

GC3G2:	ILDB	T1,	IPTR		;GET	A*16+B
	LDB	T1+1,	[POINT 4,T1,31]	;GET	A
	LSH	T1+1,	1		;FORM	A*2
	SUBI	T1,	(T1+1)		;FORM	A*16+B-A*2
	LSH	T1+1,	1		;FORM	A*4
	SUBI	T1,	(T1+1)		;FORM	A*16+B-A*2-A*4 = A*10+B
	JRST		(JAC)		;RETURN
;SUBROUTINE TO SEE IF WE HAVE TO NEGATE THE RESULT.

COMMENT	\

CALL:
	JSP	JAC,	GC3NEG

ENTRY CONDITIONS:
	(T1)	=	THE SIGN.

EXIT CONDITIONS:
	(T2)	=	THE AC INTO WHICH THE RESULT IS TO BE PLACED.
	(SW)
		LS	ALWAYS 1
		LM	IF THE SIGN WAS SOME FORM OF "-" THIS IS 1.

RETURNS:
	THIS ROUTINE ALWAYS RETURNS TO THE LOCATION SPECIFIED IN CALL+1.

\

GC3NEG:	TLO	SW,	LS		;TURN ON THE LEADING SIGN FLAG.
	CAIE	T1,	13		;SOME FORM OF "-"?
	CAIN	T1,	15
	TLO	SW,	LM		;YES, REMEMBER IT.
	LDB	T2,	PACFL.		;FIND OUT WHERE TO PUT THE RESULT.
	JRST		@(JAC)		;RETURN THROUGH CALL+1.
;SUBROUTINE USED BY THE DOUBLE PRECISION ROUTINE TO HANDLE THE CROSS
; PRODUCT AND ADDING IN THE DIGIT(S).

COMMENT	\

CALL:
	PUSHJ	PP,	GC3CP

ENTRY CONDITIONS:
	(AC)	=	HIGH ORDER WORD LESS THE CROSS PRODUCT.
	(AC+1)	=	CROSS PRODUCT.
	(AC+2)	=	LOW ORDER WORD.
	(T1)	=	DIGITS TO BE ADDED INTO THE ACCUMULATION.

EXIT CONDITIONS:
	(AC)	=	HIGH ORDER WORD.
	(AC+1)	=	LOW ORDER WORD.

\

GC3CP:	ADD	AC,	AC+1		;ADD IN THE CROSS PRODUCT.
	MOVE	AC+1,	AC+2		;GET THE LOW ORDER WORD.
	JOV		.+1		;CLEAR THE OVERFLOW FLAG.
	ADDI	AC+1,	(T1)		;ADD IN THE DIGIT(S).
	JOV		.+2		;DID WE OVERFLOW?
	POPJ	PP,			;NO, RETURN.
	TLZ	AC+1,	(1B0)		;CLEAR THE SIGN BIT OF THE LOW
					; ORDER WORD.
	AOJA	AC,	.-2		;BUMP THE HIGH ORDER WORD AND
					; RETURN

	END