Google
 

Trailing-Edge - PDP-10 Archives - BB-H506D-SM_1983 - cobol/source/pc.mac
There are 10 other files named pc.mac in the archive. Click here to see a list.
TITLE	PC FOR LIBOL.
SUBTTL	CONVERT BINARY TO COMP-3	/ACK



;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1974, 1981 BY DIGITAL EQUIPMENT CORPORATION

;REVISION HISTORY:

;V10 *****

;	15-DEC-74	/ACK	CREATION.

;*****

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

	EXTERN	EASTB.		;FORCE EASTBL TO BE LOADED.

	HISEG

COMMENT	\

	THIS ROUTINE CONVERTS A ONE OR TWO WORD BINARY NUMBER TO A
COMP-3 ITEM.

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

PARAMETERS:
	THE ACCUMULATOR FIELD OF AC 16 CONTAINS THE AC WHICH CONTAINS THE
FIRST WORD OF THE NUMBER TO BE CONVERTED.  THE SECOND WORD, IF ANY, IS IN
THE FOLLOWING AC.
	THE RIGHT HALF OF AC 16 POINTS TO A WORD IN THE FOLLOWING FORMAT:
	BITS	0-5	BYTE RESIDUE FOR THE OUTPUT FIELD.
	BIT	6	1 IF THE FIELD IS EXPLICITLY SIGNED.
	BITS	7-17	SIZE OF THE OUTPUT FIELD.
	BITS	18-35	ADDRESS OF THE FIRST BYTE OF THE OUTPUT FIELD.
	THE OUTPUT IS A SEQUENCE OF NINE BIT BYTES EACH OF WHICH,EXCEPT
THE LAST, CONSISTS OF TWO FOUR BIT DECIMAL DIGITS, RIGHT JUSTIFIED IN EACH
BYTE.  THE LAST BYTE CONSTISTS OF A DECIMAL DIGIT IN BITS 1 THROUGH 4 AND 
A SIGN IN BITS 5 THROUGH 8.

RETURNS:
	CALL+1	ALWAYS.

REGISTERS USED:
	JAC, AC, AC+1, AC+2, CNT, SAV9, SW, IPTR

\
;LOCAL AC DEFINITIONS.

	SAV9==TAC2
	OPTR==IPTR

	ENTRY	PC3.

	EXTERN	SET1.		;ROUTINE TO PICK UP THE PARAMETERS.

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

PC3.:	MOVEI	CH,	^D8		;TELL SET1. THAT WE ARE PLAYING
					; WITH EBCDIC.
	JSP	JAC,	SET1.		;GO PICK UP THE PARAMETERS.
	LDB	AC+2,	PACFL.		;FIND OUT WHERE THE INPUT IS.
	MOVE	AC+1,	(AC+2)		;PICK IT UP.
	MOVE	AC+2,	1(AC+2)		;(JUST IN CASE IT'S DOUBLE PRECISION.)

	JUMPL	AC+1,	PC4		;JUMP IF THE INPUT IS NEGATIVE.
	CAIG	CNT,	^D10		;ONE WORD?
	JRST		PC3		;YES, GO TO SINGLE PRECISION ROUTINE.

;HERE WE CONVERT A TWO WORD BINARY NUMBER TO COMP-3.

PC1:	DIV	AC+1,	PC3T1+5		;BREAK OFF NINE DIGITS.
	MOVE	SAV9,	AC+2		;SAVE THEM.
	IDIVI	AC+1,	^D10		;GET THE TENTH DIGIT.
	HRRI	SW,	(AC+2)		;SAVE IT.
	MOVEI	CNT,	-^D10(CNT)	;FIGURE OUT HOW MANY CHARS TO CONVERT.
	JSP	JAC,	PC3CVT		;GO CONVERT THEM.
	ORI	AC+1,	(SW)		;COMBINE THE ELEVENTH AND TENTH DIGITS.
	DPB	AC+1,	OPTR		;STORE THEM.
	MOVE	AC+1,	SAV9		;GET THE OTHER NINE DIGITS BACK.
	SKIPA	CNT,	[EXP ^D9]		;SET THE COUNT.

;WE COME HERE TO CONVERT A SINGLE PRECISION NEGATIVE NUMBER.

PC2:	MOVMS		AC+1		;MAKE IT POSITIVE.

;WE COME HERE TO CONVERT A SINGLE PRECISION POSITIVE NUMBER.

PC3:	JSP	JAC,	PC3CVT		;CONVERT THE DIGITS.
	ORI	AC+1,	17		;ASSUME THE RESULT IS UNSIGNED.
	JUMPGE	SW,	PC3A		;JUMP IF IT IS.
	TLNN	SW,	LS!LM		;WAS THE INPUT NEGATIVE?
	TRZA	AC+1,	3		;NO, MAKE THE SIGN 14.
	TRZ	AC+1,	2		;YES, SIGN BECOMES 15.
PC3A:	DPB	AC+1,	OPTR		;STORE THE FIRST DIGIT AND THE SIGN.
	POPJ	PP,			;RETURN.
;WE COME HERE IF THE INPUT IS NEGATIVE.

PC4:	TLO	SW,	LS!LM		;TURN ON THE NEGATIVE SIGN SWITCHES.
	CAIG	CNT,	^D10		;ONE WORD?
	JRST		PC2		;YES, GO MAKE THE INPUT POSITIVE.

	SETCA	AC+1,	AC+1		;NEGATE THE HIGH ORDER WORD.
	MOVNS		AC+2		;NEGATE THE LOW ORDER WORD.
	TLZ	AC+2,	(1B0)		;CLEAR THE SIGN OF THE LOW ORDER WORD.
	JUMPN	AC+2,	PC1		;IF THE LOW ORDER WORD IS NOT
					; ZERO, GO START CONVERTING.
	AOJA	AC+1,	PC1		;OTHERWISE BUMP THE HIGH ORDER
					; WORD AND GO START CONVERTING.
;SUBROUTINE TO CONVERT A BINARY NUMBER TO PACKED DECIMAL.

COMMENT	\

CALL:
	JSP	JAC,	PC3CVT

ENTRY CONDITIONS:
	(AC+1)	=	THE NUMBER TO BE CONVERTED.
	(CNT)	=	NUMBER OF DIGITS TO BE CONVERTED

EXIT CONDITIONS:
	(AC)	=	THE LAST DIGIT STORED IN BITS 32-35.
	(AC+1)	=	THE LAST DIGIT STORED IN BITS 28-31.
	(AC+2)	=	0
	(CNT)	=	0

RETURNS:
	CALL+1	ALWAYS.

\

PC3CVT:	IDIV	AC+1,	DECTAB##(CNT)	;MAKE SURE THE NUMBER IS IN RANGE.
	ADDI	CNT,	2		;SEE HOW MANY NINE BIT BYTES WE
	LSH	CNT,	-1		; HAVE.
PC3CV1:	MOVE	AC,	AC+2		;GET THE REMAINING DIGITS.
	IDIV	AC,	PC3T2-1(CNT)	;GET THE NTH DIGIT.
	IDIV	AC+1,	PC3T1-1(CNT)	;GET THE N+1ST DIGIT.
	DPB	AC,	[POINT 4,AC+1,31]	;COMBINE THEM.
	IDPB	AC+1,	OPTR		;STORE THEM.
	SOJG	CNT,	PC3CV1		;LOOP IF THERE ARE MORE.
	JRST		(JAC)		;OTHERWISE RETURN.
	SUBTTL	TABLES.

PC3T1:	DEC	1
	DEC	10
	DEC	1000
	DEC	100000
	DEC	10000000
	DEC	1000000000

PC3T2:	DEC	1
	DEC	100
	DEC	10000
	DEC	1000000
	DEC	100000000
	DEC	10000000000

	END