Google
 

Trailing-Edge - PDP-10 Archives - BB-H506D-SM_1983 - cobol/source/gd.mac
There are 9 other files named gd.mac in the archive. Click here to see a list.
; UPD ID= 2843 on 5/14/80 at 3:18 PM by WRIGHT                          
TITLE	GD FOR LIBOL
SUBTTL	CONVERT DISPLAY TO BINARY	/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:
;V12A *****
;[630] 14-MAY-80 /DAW		FIX CONVERSION OF ITEM WITH LEADING +
;
;V10 *****
;	13-AUG-76	[451] FIX NUMERIC MOVES FOR BIS
;	12-DEC-74	/ACK	CREATION.
;	5/15/75		/DBT	BIS
;	8/4/77		/DAW	ADD CVTDB. ROUTINE - SETUP DONE INLINE
;*****
	SEARCH	LBLPRM		;DEFINE PARAMETERS.
	%%LBLP==:%%LBLP
	EBCMP.==:EBCMP.
	BIS==:BIS
	EXTERN	EASTB.		;FORCE EASTAB TO BE LOADED
	HISEG
COMMENT	\

	THIS ROUTINE CONVERTS A DISPLAY ITEM TO A ONE OR TWO WORD BINARY ITEM.

CALL:
	MOVE	16,[Z	AC,PARAMETER ADDRESS]
	PUSHJ	17,GD6./GD7./GD9.

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 POINTER RESIDUE FOR THE INPUT FIELD.
		BIT	6	1 IF THE FIELD IS SIGNED.
		BITS	7-17	SIZE OF THE INPUT FIELD.
		BITS	18-35	ADDRESS OF THE FIRST CHAR OF THE INPUT FIELD.
RETURNS:
	CALL+1	ALWAYS.
REGISTERS USED:
	CNT, CH, T1(ALIAS CH), T2, AC, AC+1, AC+2, IPTR, SW, JAC, CPTR
\
	ENTRY	GD6.		;IF THE INPUT IS SIXBIT.
	ENTRY	GD7.		;IF THE INPUT IS ASCII.
	ENTRY	GD9.		;IF THE INPUT IS EBCDIC.
	ENTRY	GDSP1.		;SINGLE PRECISION ROUTINE TO ADJUST THE
				; SIGN AND STORE THE RESULT.
	ENTRY	GDDP5.		;DOUBLE PRECISION ROUTINE TO ADJUST THE
				; SIGN AND STORE THE RESULT.

	EXTERN	SPCCH.		;SPECIAL CHARACTER FLAG.
	EXTERN	LDGCH.		;LEADING CHARACTER FLAG.
	EXTERN	IBNCH.		;IMBEDDED "-" FLAG.
	EXTERN	NOLCH.		;MASK USED TO CHANGE CPTR SO IT NO LONGER
				; PICKS UP THE LEADING CHARACTER FLAG.
	EXTERN	RET.1

OPDEF	PJRST	[JRST]

IFN TOPS20,<SEARCH MONSYM>
DEFINE TYPE(ADDR),<
IFE TOPS20,<OUTSTR ADDR>
IFN TOPS20,<PUSH PP,1
	HRROI 1,ADDR
	PSOUT%
	POP	PP,1>
>;END DEFINE TYPE

DEFINE TYPET1,<
IFE TOPS20, OUTCHR 1
IFN TOPS20, PBOUT%
>;END DEFINE TYPET1

IFE	BIS,<

;LOCAL AC DEFINITIONS:

	CPTR==PARM

	EXTERN	PTRNM.		;TABLE OF POINTERS FOR CONVERTING
				; CHARACTERS TO NUMBERS.
	EXTERN	SET1.		;PICKS UP THE PARAMETERS.
	EXTERN	PACFL.		;POINTER TO THE AC FIELD OF AC 16.


GD6.:	JSP	CH,	GD		;ENTER HERE IF THE INPUT IS SIXBIT,
GD7.:	JSP	CH,	GD		; HERE IF IT IS IN ASCII AND
GD9.:	JSP	CH,	GD		; HERE IF IT IS IN EBCIDC.

GD:	SUBI	CH,	GD6.-5		;FIND OUT WHAT THE INPUT LOOKS LIKE.
	JSP	JAC,	SET1.		;GO SET UP THE PARAMETERS.
	LDB	T2,	PACFL.		;FIND OUT WHERE TO PUT THE RESULT.
	MOVE	CPTR,	PTRNM.-6(SW)	;SELECT THE APPROPRIATE CONVERSION
					; POINTER.
	SETZB	AC,	AC+1		;CLEAR A PLACE FOR THE RESULT.
	CAILE	CNT,	^D10		;ONE OR TWO WORD RESULT?
	JRST		GDDP		;TWO WORDS - USE DOUBLE PRECISION
					; ROUTINE.
;HERE WE WORK ON A SINGLE PRECISION RESULT.

GDSP:	JSP	JAC,	GDSKP.		;GO SKIP OVER LEADING CHARS.
	EXP		GDSP2		;RETURN THROUGH HERE IF THERE
					; ARE NO SIGNIFICANT CHARS.
	EXP		GDSP3		;RETURN THROUGH HERE IF WE FOUND
					; A NON-SPECIAL CHAR.
	EXP		GDSP4		;RETURN THROUGH HERE IF WE FOUND
					; A SPECIAL CHAR.

;RETURN HERE FROM GDSKP IF WE SAW A LEADING SIGN.

	JSP	JAC,	GDCSP1		;GO CONVERT THE REMAINING CHARS.
GDSP0:	EXP		GDSP1.		;RETURN THROUGH HERE IF WE SAW
					; A TERMINATING CHAR.

>	;END OF NON-BIS

;RETURN HERE FROM GDCSP IF WE HAVE EXHAUSTED THE STRING.

GDSP1.:	JUMPGE	SW,	GDSP2		;JUMP IF WE CAN'T HAVE A SIGN.
	TLNN	SW,	LS		;LEADING SIGN?
	LSH	SW,	1		;NO, PUT THE IMBEDDED NEGATIVE FLAG
					; WHERE THE LEADING NEGATIVE FLAG WAS.
	TLNE	SW,	LM		;NEGATE RESULTS?
	MOVNS		AC+1		;YES, DO SO.
GDSP2:	MOVEM	AC+1,	(T2)		;STORE RESULTS.
	POPJ	PP,			;RETURN.

IFE	BIS,<


;RETURN HERE FROM GDSKP IF WE SAW A NON-SPECIAL CHAR.

GDSP3:	HRRZI	JAC,	GDSP0		;WHERE TO GO WHEN WE ARE DONE CONVERTING.
	JRST		GDCSP2		;GO START CONVERTING.

;RETURN HERE FROM GDSKP IF WE SAW A SPECIAL CHAR OTHER THAN A LEADING SIGN.

GDSP4:	HRRZI	JAC,	GDSP0		;WHERE TO GO WHEN WE ARE DONE CONVERTING.
	JRST		GDCSP4		;GO START CONVERTING.
;HERE WE WORK ON DOUBLE PRECISION.

GDDP:	JSP	JAC,	GDSKP.		;GO SKIP OVER LEADING CHARS.
	EXP		GDDP6		;RETURN THROUGH HERE IF THERE
					; ARE NO SIGNIFICANT CHARS.
	EXP		GDDP8		;RETURN THROUGH HERE IF WE FOUND
					; A NON-SPECIAL CHAR.
	EXP		GDDP9		;RETURN THROUGH HERE IF WE FOUND
					; A SPECIAL CHAR OTHER THAN
					; A SIGN.

;RETURN HERE IF WE SAW A LEADING SIGN.

GDDP0:	JSP	JAC,	GDDSET		;GO SET UP TO USE THE SINGLE
					; PRECISION ROUTINE.
	EXP		GDCSP1		;WHERE TO ENTER THE SINGLE
					; PRECISION ROUTINE.
GDDSET:	HRRI	SW,	-^D10(CNT)	;HOW MANY CHARS WILL BE LEFT.
	CAILE	CNT,	^D10		;ARE THERE MORE THAN TEN CHARS?
	MOVEI	CNT,	^D10		;WE WILL CONVERT THE FIRST TEN.
	JSP	JAC,	@(JAC)		;GO CONVERT THEM.
	EXP		GDDP5.		;RETURN THROUGH HERE IF WE SAW
					; A TERMINATING CHAR.

;RETURN HERE IF WE HAVE MORE TO CONVERT.

GDDP1:	HRREI	CNT,	(SW)		;SEE HOW MANY MORE CHARS THERE ARE.
	JUMPLE	CNT,	GDDP5.		;JUMP IF NONE.
GDDP2:	ILDB	CH,	IPTR		;GET THE NEXT CHAR.
	LDB	T1,	CPTR		;CONVERT IT.
	TRZE	T1,	SPCCH.		;SPECIAL CHAR?
	JRST		GDDP10		;YES, GO SEE WHAT TO DO WITH IT.
	TLZ	SW,	IS		;CLEAR THE IMBEDDED SIGN SWITCH.
GDDP3:	IMULI	AC,	^D10		;SHIFT THE ACCUMULATION LEFT ONE DIGIT.
	MULI	AC+1,	^D10
	ADD	AC,	AC+1		;TAKE CARE OF THE CROSS PRODUCT.
	MOVE	AC+1,	AC+2		;RESTORE THE LOW ORDER WORD.
	JOV		.+1		;CLEAR THE OVERFLOW FLAG.
	ADDI	AC+1,	(T1)		;ADD IN THE DIGIT.
	JOV	[TLZ	AC+1,	(1B0)	;IF OVERFLOW OCCURS, CLEAR THE SIGN
					; OF THE LOW ORDER WORD
		AOJA	AC,	.+1]	;AND BUMP THE HIGH ORDER WORD.
 GDDP4:	SOJG	CNT,	GDDP2		;LOOP IF THERE ARE MORE CHARS.

>	;END OF NON-BIS
;COME HERE WHEN WE ARE FINISHED CONVERTING.

GDDP5.:	JUMPGE	SW,	GDDP6		;JUMP IF WE CAN'T HAVE A SIGN.
	TLNN	SW,	LS		;LEADING SIGN?
	LSH	SW,	1		;NO, PUT THE IMBEDDED NEGATIVE SWITCH
					; WHERE THE LEADING NEGATIVE SWITCH WAS.
	TLNN	SW,	LM		;NEGATE?
	JRST		GDDP6		;NO, GO STORE THE RESULTS.
	SETCAM	AC,	(T2)		;NEGATE THE HIGH ORDER WORD AND
					; STORE IT.
	MOVNM	AC+1,	1(T2)		;NEGATE THE LOW ORDER WORD AND
					; STORE IT.
	JUMPN	AC+1,	RET.1		;JUMP IF THE LOW ORDER WORD IS
					; NON-ZERO.
	HRLZI	AC+1,	(1B0)		;GET A SIGN BIT.
IFN BIS,<
	MOVEM	AC+1,	1(T2)		;STORE THE LOW ORDER WORD
>
	AOSA		(T2)		;BUMP THE HIGH ORDER WORD AND TURN
					; ON THE SIGN IN THE LOW ORDER WORD.
GDDP6:
IFN BIS,<
	DMOVEM	AC,	(T2)		;STORE THE RESULT
>
IFE BIS,<
	MOVEM	AC,	(T2)		;STORE THE HIGH ORDER WORD.
	MOVEM	AC+1,	1(T2)		;STORE THE LOW ORDER WORD.
>
	POPJ	PP,			;RETURN.

IFE	BIS,<

;COME HERE FROM GDSKP IF WE FIND A NON-SPECIAL CHAR.

GDDP8:	JSP	JAC,	GDDSET		;GO SET UP TO USE THE SINGLE
					; PRECISION ROUTINE.
	EXP		GDCSP2		;WHERE TO ENTER THE SINGLE
					; PRECISION ROUTINE.

;COME HERE FROM GDSKP IF WE FIND A SPECIAL CHAR OTHER THAN A LEADING SIGN.

GDDP9:	JSP	JAC,GDDSET		;GO SET UP TO USE THE SINGLE
					; PRECISION ROUTINE.
	EXP		GDCSP4		;WHERE TO ENTER THE SINGLE
					; PRECISION ROUTINE.
;COME HERE IF WE SEE A SPECIAL CHAR WHILE DOING THE DOUBLE PRECISION
; CONVERSION.

GDDP10:	TRZN	T1,	IBNCH.		;IMBEDDED "-" SIGN?
	JRST		@GDDP11(T1)	;NO, DISPATCH TO APPROPRIATE ROUTINE.
	TLO	SW,	IS		;TURN ON THE IMBEDDED "-" SIGN SWITCH.
	JRST		GDDP3		;GO ADD IN THE DIGIT.

;DISPATCH TABLE FOR SPECIAL CHARS:

GDDP11:	EXP		GDDP4		;NULL - IGNORE IT.
	EXP		GDDP12		;"+" - CLEAR IMBEDDED "-" SWITCH
					; AND TERMINATE.
	EXP		GDDP12+1	;"-" - SET IMBEDDED "-" SWITCH
					; AND TERMINATE.
	EXP		GDDP5.		;TERMINATING CHAR - TERMINATE!

;COME HERE ON TERMINATING SIGNS.

GDDP12:	TLZA	SW,	IS		;"+" TAKES PRECIDENCE OVER
					; IMBEDDED SIGNS.
	TLO	SW,	IS		;"-" TAKES PRECIDENCE OVER
					; IMBEDDED SIGNS.
	JRST		GDDP5.		;TERMINATE!
;SUBROUTINE TO SKIP LEADING CHARACTERS.

COMMENT	\

	THIS ROUTINE SKIPS NON-SIGNIFICANT LEADING CHARACTERS IN A 
DISPLAY FIELD.  THE CONVERSION POINTER (CPTR), IN ADDITION TO PICKING UP THE
NUMBER TO WHICH THE CHARACTER IN CH IS TO BE CONVERTED, PICKS UP
SEVERAL FLAGS.  THE FIRST FLAG IS THE LEADING CHARACTER FLAG.  IF THIS
FLAG IS SET TO 1 THE CHARACTER IS A LEADING CHARACTER AND MAY BE
IGNORED.  ON EXIT FROM THIS ROUTINE, IF WE HAVE SEEN A CHARACTER
WHICH IS NOT A LEADING CHARACTER, CPTR IS MODIFIED SO THAT IT NO
LONGER PICKS UP THE LEADING CHARACTER FLAG.

CALL:
	JSP	JAC,	GDSKP

ENTRY CONDITIONS:
	(IPTR) = BYTE POINTER TO THE FIRST INPUT CHAR.
	(CPTR) = CONVERSION POINTER.
	(CNT) = SIZE OF THE INPUT FIELD.

EXIT CONDITIONS:
	(IPTR) = BYTE POINTER TO THE NEXT INPUT CHAR.
	(CPTR) = CONVERSION POINTER (MODIFIED TO NO LONGER PICK UP THE
		LEADING CHARACTER FLAG.)
	(CNT) = NUMBER OF CHARACTERS REMAINING IN THE INPUT FIELD.
	(SW) = LM IS TURNED ON IF WE SAW A LEADING "-".
		 LS IS TURNED ON IF WE SAW A LEADING "+" OR "-".

RETURNS:
	@CALL+1	IF THERE ARE NO SIGNIFICANT CHARACTERS IN THE FIELD.
	@CALL+2 IF WE FOUND A NON-SPECIAL CHAR.
	@CALL+3	IF WE FOUND A SPECIAL CHARACTER OTHER THAN A LEADING SIGN.
	CALL+4	IF WE FOUND A LEADING SIGN.

\

	ENTRY	GDSKP.
GDSKP.:	ILDB	CH,	IPTR		;GET A CHAR.
	LDB	T1,	CPTR		;CONVERT IT AND PICK UP FLAGS.
	TRZN	T1,	LDGCH.		;LEADING CHAR?
	JRST		GDSKP1		;NO, GO SEE IF IT'S A SIGN.
	SOJG	CNT,	GDSKP.		;LOOP IF THERE ARE MORE CHARS.
	JRST		@(JAC)		;NO SIGNIFICANT CHARS, RETURN
					; THROUGH CALL+1.

;COME HERE WHEN WE FIND A NON-LEADING CHAR.

GDSKP1:	TLC	CPTR,	NOLCH.		;DON'T PICK UP THE LEADING CHAR
					; FLAG ANY MORE.
	TRZE	T1,	SPCCH.		;SOME KIND OF SPECIAL CHAR?
	JRST		GDSKP2		;YES, GO SEE IF IT'S A SIGN.
	JUMPE	T1,	GDSKP4		;IF IT'S A ZERO, GO SKIP IT.
	JRST		@1(JAC)		;MUST BE A DIGIT, RETURN
					; THROUGH CALL+2.

;IT'S A SPECIAL CHAR.

GDSKP2:	CAIN	T1,	2		;MINUS?
	TLOA	SW,	LM		;YES, REMEMBER THAT WE SAW IT.
	CAIN	T1,	1		;PLUS?
	TLOA	SW,	LS		;YES, REMEMBER THAT WE SAW A SIGN.
	JRST		@2(JAC)		;SPECIAL CHAR, OTHER THAN A SIGN
	SOJLE	CNT,	@(JAC)		;IF IT'S ONLY A SIGN, TAKE THE
					; NO SIGNIFICANCE RETURN.

;SKIP OVER LEADING ZEROES.

GDSKP3:	ILDB	CH,	IPTR		;PICK UP THE NEXT CHAR.
	LDB	T1,	CPTR		;CONVERT IT.
	JUMPN	T1,	3(JAC)		;IF IT'S NOT ZERO, RETURN TO
					; CALL+4.
GDSKP4:	SOJG	CNT,	GDSKP3		;IF THERE ARE MORE CHARS, GO
					; SEE IF THEY ARE ALSO ZEROES.
	JRST		@(JAC)		;OTHERWISE, TAKE THE 
					; NO-SIGNIFICANCE RETURN.
;SUBROUTINE TO CONVERT A STRING TO A SINGLE PRECISION NUMBER.

COMMENT	\

	THIS ROUTINE CONVERTS A STRING TO A SINGLE PRECISION NUMBER.  IT IS
USED BY BOTH THE SINGLE AND DOUBLE PRECISION ROUTINES.

CALL:
	JSP	JAC,	GDCSP

ENTRY CONDITIONS:
	(IPTR) = BYTE POINTER TO THE NEXT CHAR.
	(CPTR) = CONVERSION POINTER.
	(CNT) = NUMBER OF CHARACTERS LEFT IN THE INPUT FIELD.
	(AC+1) = 0

EXIT CONDITIONS:
	(IPTR) =BYTE POINTER TO THE NEXT CHAR.
	(CNT) = 0 (UNLESS A TERMINATING CHAR WAS SEEN.)
	(AC+1) = THE CONVERTED NUMBER.

RETURNS:
	@CALL+1	IF THE CONVERSION WAS TERMINATED BECAUSE OF A TERMINATING
		 CHAR.
	CALL+2	IF THE CONVERSION WAS TERMINATED BECAUSE OF NO MORE INPUT.

\
GDCSP:	ILDB	CH,	IPTR		;GET THE NEXT CHAR.
	LDB	T1,	CPTR		;CONVERT IT.
GDCSP1:	TRZE	T1,	SPCCH.		;SPECIAL CHAR?
	JRST		GDCSP4		;YES, GO SEE WHAT TO DO ABOUT IT.
	TLZ	SW,	IS		;CLEAR THE IMBEDDED SIGN SWITCH.
GDCSP2:	IMULI	AC+1,	^D10		;SHIFT THE ACCUMULATION LEFT ONE.
	ADDI	AC+1,	(T1)		;ADD IN THIS DIGIT.
GDCSP3:	SOJG	CNT,	GDCSP		;LOOP IF THERE ARE MORE CHARS
	JRST		1(JAC)		;OTHERWISE RETURN TO CALL+2.

;SAW A SPECIAL CHAR - SEE WHAT TO DO.

GDCSP4:	TRZN	T1,	IBNCH.		;IMBEDDED "-" SIGN?
	JRST		@GDCSP5(T1)	;NO, DISPATCH TO APPROPRIATE ROUTINE.
	TLO	SW,	IS		;TURN ON IMBEDDED "-" SIGN SWITCH.
	JRST		GDCSP2		;GO ADD THE DIGIT IN.

;DISPATCH TABLE FOR SPECIAL CHARS:

GDCSP5:	EXP		GDCSP3		;NULL - IGNORE IT.
	EXP		GDCSP6		;"+" - CLEAR IMBEDDED "-" SWITCH
					; AND TERMINATE.
	EXP		GDCSP6+1	;"-" - SET IMBEDDED "-" SWITCH
					; AND TERMINATE.
	Z		@(JAC)		;TERMINATING CHAR - RETURN THROUGH
					; CALL+1.

;COME HERE ON TERMINATING SIGNS:

GDCSP6:	TLZA	SW,	IS		;"+" TAKES PRECIDENCE OVER
					; IMBEDDED SIGNS.
	TLO	SW,	IS		;"-" TAKES PRECIDENCE OVER
					; IMBEDDED SIGNS.
	JRST		@(JAC)		;TERMINATE!

>	;END OF NON-BIS
IFN	BIS,<
ENTRY GDX.


; FLAGS FOR LEFT SIDE OF SW

LED.SG==3B35		;LEADING SIGN MASK
LED.PL==1B35		;LEADING +
LED.MI==1B34		;LEADING -

EXTERN	BSET1.,PACFL.,BPTNM.

; E0 TABLE FOR EXTEND CNVDB INSTRUCTION

CVDB.T:	CVTDBT	CVDB.6##		;SIXBIT
	CVTDBT	CVDB.7##		;ASCII
	0
	CVTDBT	CVDB.9##		;EBCDIC

GD6.:	JSP	BISCH,	GD		;SIXBIT INPUT
GD7.:	JSP	BISCH,	GD		;ASCII INPUT
	BLOCK	1
GD9.:	JSP	BISCH,	GD		;EBCDIC INPUT

GD:
	SUBI	BISCH,	GD6.-5		;COMPUTE BYTE SIZE
GDX.::	;ENTRY FOR PNZ CALL
	JSP	JAC,	BSET1.		;GET PARAMETER

	LDB	BIST0,	PACFL.		;GET RESULTANT AC

	HRLM	SRCCNT,	(PP)		;SAVE THE SIZE.

GD0:	EXTEND	B.FLAG,	CVDB.T-6(SW)
	JRST	ABRTCK			;ABORT CHECK

	;UN ABORTED EXIT
NUMFIN:
	JUMPL	SW,SIGNED		;CAN IT BE SIGNED

NEGIFM:	TLNE	B.FLAG,	BFLG.M		;NEGATE IF M FLAG ON
	JRST	NEGATE

NONEG:	HLRZ	SRCCNT,	(PP)		;GET THE SIZE BACK.
	CAILE	SRCCNT,	^D10		;ONE OR TWO WORD RESULT.
	JRST		NONEG2		;TWO, GO ON.
	MOVEM	DSTLO,	(BIST0)		;STORE RESULT.
	POPJ	PP,			;RETURN.

SIGNED:	TLNN	SW,LED.SG		;ANY LEADING SIGNS
	JRST	NONEG			;NONE

LEDSGN:	TLNE	SW,LED.PL		;LEADING PLUS???
	JRST	NEGIFM			;YES

NEGNOM:	TLNE	B.FLAG,BFLG.M		;NEGATE IF M NOT ON
	JRST	NONEG

NEGATE:	HLRZ	SRCCNT,	(PP)		;GET THE SIZE BACK.
	CAILE	SRCCNT,	^D10		;ONE OR TWO WORD RESULT.
	JRST		NEGAT2		;TWO, GO ON.
	MOVNM	DSTLO,	(BIST0)		;STORE RESULT.
	POPJ	PP,			;RETURN.

NEGAT2:	DMOVN	DSTHI,DSTHI		;NEGATE THE RESULT
	JUMPGE	DSTHI,NONEG2		;IF 0, DON'T TURN ON SIGN BIT
	TLO	DSTLO,(1B0)		;PUT BACK SIGN BIT
NONEG2:	DMOVEM	DSTHI,	(BIST0)		;STORE RESULT
	POPJ	PP,
ABRTCK:	;INSTRUCTION ABORTED - WHY??
	LDB	BISCH,	SRCPT		;GET OFFENDING CHARACTER
	LDB	BISCH,	BPTNM.-6(SW)	;GET NUMERIC SYMBOL VALUE
	ANDI	BISCH,	3

	; ALL ABORTS WILL COME FROM SPECIAL CHARACTERS
	; AND THUS THE NUMERIC VALUE WILL BE THE SPECIAL VALUE

	JRST	@SPCTA0(BISCH)

SPCTA0:	EXP	GD0			;IGNORE NULLS
	EXP	PLCK			;GRAPHIC PLUS
	EXP	MICK			;GRAPHIC MINUS
	EXP	BKTAB			;TRAILING BLANK OR TAB

MICK:	;GRAPHIC MINUS
	TLNE	SW,LED.SG		;ANY LEADING SIGNS YET
	JRST	LEDSG1			;YES - DONE

	SKIPN	DSTHI			;ANY DIGITS YET?
	SKIPE	DSTHI+1
	JRST	TSTSGN			; [451] YES SEE IF RESULT S/B NEG

	TLO	SW,LED.MI		;NOTE LEADING GRAPHIC -
	JRST	GD0			;RESTART

PLCK:	;GRAPHIC PLUS
	TLNE	SW,LED.SG		;ANY LEADING SIGNS
	JRST	LEDSG1			;YES - DONE

	SKIPN	DSTHI			;ANY DIGITS YET?
	SKIPE	DSTHI+1
	JRST	NONEG			;YES - DONE

	TLO	SW,LED.PL		;NOTE LEADING PLUS
	JRST	GD0			;RESTART

BKTAB:	;ABORT ON BLANK OR TAB
	TLNN	SW,LED.SG		;ANY LEADING SIGNS
	JRST	NEGIFM			;NO - GO BY M FLAG

TSTSGN:	JUMPL	SW,NEGATE	; [451] NEGATIVE IF INPUT IS SIGNED
	JRST	NONEG		; [451] ELSE THE RESULT IS POSITIVE
LEDSG1:	;LEADING SIGN WITH ABORT SO THAT INSTRUCTION NEVER GOT A 
	; CHANCE TO NEGATE THE NUMBER IE. M FLAG MEANS NOTHING

	TLNN	SW,LED.MI		;MINUS
	JRST	NONEG			;NO
	JRST		NEGATE		;YES.
;CVTDB ROUTINE
	ENTRY	CVTDB.		;(BIS) SETUP DONE INLINE
; CALLED FROM INLINE CODE AS FOLLOWS:
;	MOVE	AC5,BYTE.PTR.TO.INPUT.STRING
;	MOVEI	AC4,SIZE.OF.INPUT.STRING
;	MOVE	SW,[XWD FLAGS,BYTE.SIZE]
;	PUSHJ	PP,CVTDB##
;	MOVE AC,AC10  -OR-  DMOVE AC,AC7
CVTDB.:	EXTEND	B.FLAG,CVDB.T-6(SW)
	 JRST	CVABRT		;ABORT CHECK

	JUMPL	SW,SIGN1	;JUMP IF SIGNED

NEGIF1:	TLNN	B.FLAG,BFLG.M	;IF M FLAG ON..
	 POPJ	PP,
	JRST	NEGAT1		;NEGATE

SIGN1:	TLNN	SW,LED.SG	;LEADING SIGN?
	 POPJ	PP,		;NOPE
	TLNE	SW,LED.PL	;LEADING PLUS?
	 JRST	NEGIF1		;YES, USE "M" FLAG
	TLNE	B.FLAG,BFLG.M	;NEGATE IF M NOT ON
	 POPJ	PP,
NEGAT1:	TLNE	SW,(1B1)
	 JRST	NEG2		;TWO WORD RESULT
	MOVN	DSTLO,DSTLO
	POPJ	PP,
NEG2:	DMOVN	DSTHI,DSTHI	;NEGATE 2-WORD RESULT
	JUMPGE	DSTHI,.+2	; 0 - DON'T TURN ON SIGN BIT
	TLO	DSTLO,(1B0)	;PUT BACK SIGN BIT
	POPJ	PP,

;HERE IF CONVERSION ABORTS

CVABRT:	LDB	BISCH,5		;GET OFFENDING CHARACTER
	LDB	BISCH,BPTNM.-6(SW) ;GET NUMBER SYMBOL VALUE
	ANDI	BISCH,3

	JRST	@SPCTA1(BISCH)	;DISPATCH ON CHARACTER TYPE

SPCTA1:	EXP	CVTDB.		;NULL - IGNORE
	EXP	CVPLCK		;GRAPHIC PLUS
	EXP	CVMICK		;GRAPHIC MINUS
	EXP	CVBKTB		;TRAILING BLANKS OR TABS

;PLUS
CVPLCK:	TLNE	SW,LED.SG	;ANY LEADING SIGNS SEEN YET?
	 JRST	LEDSG2		;YES, DONE
	SKIPN	DSTHI		;NO--ANY DIGITS YET?
	SKIPE	DSTHI+1
	 POPJ	PP,		;YES--DONE

	TLO	SW,LED.PL	;REMEMBER LEADING PLUS
	JRST	CVTDB.		;CONTINUE CONVERSION

;MINUS
CVMICK:	TLNE	SW,LED.SG	;ANY LEADING SIGNS SEEN YET?
	 JRST	LEDSG2		;YES--DONE
	SKIPN	DSTHI
	SKIPE	DSTHI+1		;ANY DIGITS YET?
	 JRST	TSTSG1		;YES, DONE
	TLO	SW,LED.MI	;REMEMBER LEADING MINUS
	JRST	CVTDB.		;CONTINUE CONVERSION

;BLANK OR TAB
CVBKTB::	TLNN	SW,LED.SG	;ANY LEADING SIGNS?
	 JRST	NEGIF1		;NO--GO BY "M" FLAG
	TLNE	SW,LED.PL	;[630] LEADING PLUS?
	 POPJ	PP,		;[630] YES, POSITIVE ANSWER, RETURN

TSTSG1:	JUMPL	SW,NEGAT1	;NEGATE IF INPUT IS SIGNED
	 POPJ	PP,		;ELSE RESULT IS POSITIVE

LEDSG2:	TLNN	SW,LED.MI	;MINUS?
	 POPJ	PP,		;NO
	JRST	NEGAT1		;YES--NEGATE RESULT
;;[12B];; IF THERE IS A SEPARATE SIGN, BE REALLY PICKY ABOUT
;WHAT THE DATA LOOKS LIKE.  A RUNTIME WARNING WILL BE GENERATED
; IF THERE IS JUNK.

IFN ANS74,<
ENTRY CVDBL.			;CVTDB. WITH LEADING SIGN
ENTRY CVDBT.			;CVTDB. WITH TRAILING SIGN

;EXTRA FLAGS FOR "SW":
	SW%TER==(1B5)		;ALREADY TYPED ERROR MESSAGE ONCE

;NUMERIC CONVERSION INSTRUCTIONS
CSSCV:	CVTDBT	NUMS.6##	;SIXBIT
	CVTDBT	NUMS.7##	;ASCII
	0
	CVTDBT	NUMS.9##	;EBCDIC

CVDBL.:	DMOVEM	4,CVARGS##	;SAVE ARGS INCASE ERRORS
	PUSH	PP,1		;SAVE AC1
	ILDB	1,5		; GET FIRST CHARACTER - SHOULD BE GRAPHIC SIGN
	PUSHJ	PP,@TYPCA3-6(SW) ;CONVERT TO ASCII CHARACTER
	CAIE	1,"+"		;GRAPHIC PLUS
	CAIN	1,"-"		;OR GRAPHIC MINUS
	 JRST	CVTDL1		;YES, OK SO FAR
	PUSHJ	PP,CVTDL2	;"Numeric conversion check.."
	DMOVE	4,CVARGS##	;GET BACK ARGS..
	IBP	5		;SKIP OVER FIRST CHAR..
CVTDL1:	TLO	SW,LED.PL	;ASSUME LEADING +
	CAIN	1,"-"		;UNLESS IT WAS GRAPHIC MINUS..
	 TLC	SW,LED.PL!LED.MI ; TURN ON LED.MI, OFF LED.PL
	POP	PP,1		;RESTORE AC1
	SUBI	B.FLAG,1	;MAKE IT ONE LESS CHARACTER..
	EXTEND	B.FLAG,CSSCV-6(SW) ;CONVERT THE NUMBER..
	 JRST	CVTDL2		;ABORT CHECK (SHOULDN'T HAPPEN!)
	JUMPL	SW,CVTDL3	;JUMP IF SIGNED.
	POPJ	PP,		;UNSIGNED RESULT - RETURN WITH MAGNITUDE

CVTDL2:	TLOE	SW,SW%TER	;IF ALREADY GAVE ERROR,
	 POPJ	PP,		;JUST RETURN
	TYPE	[ASCIZ/%LBLCVT Numeric conversion check for leading separate sign item
/]
	PJRST	TYPCAG		;TYPE ARGUMENTS TO THE ROUTINE, THEN POPJ

TYPCAG:	DMOVE	4,CVARGS##	;RESTORE INITIAL ARGS.
	TYPE	<[ASCIZ/ [LBLCVD Invalid data was: !/]>
TYPCA1:	SOJL	4,TYPCA2	;JUMP WHEN ALL DONE
	ILDB	1,5		;GET CHARACTER IN AC1
	PUSHJ	PP,@TYPCA3-6(SW) ;CONVERT TO ASCII CHARACTER
	TYPET1			;TYPE IT
	JRST	TYPCA1		;LOOP FOR WHOLE DATA ITEM

TYPCA3:	TYPCA4			;CONVERT SIXBIT TO ASCII
	TYPCA5			;ASCII TO ASCII PRINTABLE
	0
	TYPCA6			;EBCDIC TO ASCII PRINTABLE

;Convert SIXBIT character to ASCII printable
TYPCA4:	ADDI	1,40		;CONVERT SIXBIT TO ASCIZ
	POPJ	PP,		;RETURN - THEY'RE ALL PRINTABLE

;Convert ASCII character to ASCII printable
TYPCA5:	SKIPN	1	;CONVERT NULLS TO
	MOVEI	1," "	;SPACES
	CAIGE	1," "	;IF CONTROL-CHARACTER..
	MOVEI	1,"\"	;WE WILL TYPE BACKSLASH
	POPJ	PP,	;RETURN

;Convert EBCDIC character to ASCII printable
TYPCA6:	LDB	1,IPT971##	;CONVERT EBCDIC TO ASCII
	JRST	TYPCA5		;CONVERT TO PRINTABLE CHARACTER

;HERE WHEN DONE PRINTING THE INVALID DATA
TYPCA2:	TYPE	<[ASCIZ/!]
/]>
	POPJ	PP,		;RETURN WITH WHAT WE GOT.

CVTDL3:	TLNE	SW,LED.PL	;LEADING PLUS?
	 POPJ	PP,		;YES, LEAVE AS IS
	TLNE	SW,(1B1)	;CHECK FOR 2-WORD RESULT
	 JRST	NEG2		;GO NEGATE IT
	MOVN	DSTLO,DSTLO	;NEGATE 1-WORD RESULT
	POPJ	PP,		;RETURN

;CONVERT DECIMAL TO BINARY, TRAILING SEPARATE SIGN
CVDBT.:	DMOVEM	4,CVARGS##	;SAVE ARGUMENTS, INCASE ERRORS
	EXTEND	B.FLAG,CSSCV-6(SW)	;CONVERT..
	 JRST	CVTAT		;ABORT FOR TRAILING SIGN
CVTDT1:	TYPE	[ASCIZ/%LBLCVT Numeric conversion check for trailing separate sign
/]
	PJRST	TYPCAG		;TYPE ARGUMENT TO THE ROUTINE, THEN RETURN

;Normal case should get here as the instruction aborts on
; the last character, which will be + or -.
CVTAT:	TRNE	B.FLAG,-1	;SHOULD BE NO CHARACTERS LEFT!
	 JRST	CVTDT1		;NO, RANDOM CHARACTER IN MIDDLE OF ITEM
	PUSH	PP,1		;SAVE 1
	LDB	1,5		;GET OFFENDING CHARACTER
	PUSHJ	PP,@TYPCA3-6(SW) ;CONVERT TO ASCII CHARACTER
	CAIN	1,"+"		;GRAPHIC PLUS?
	 JRST	CVTAT1		;YES, RETURN
	CAIE	1,"-"		;GRAPHIC MINUS?
	 JRST	[POP PP,1	;No, FIX STACK
		JRST CVTDT1]	;(Error: RANDOM CHARACTER IN SIGN POSITION)
	POP	PP,1		;RESTORE T1
	JUMPL	SW,NEGAT1	;NEGATE IT IF ANSWER IS SIGNED
	POPJ	PP,		;NO, JUST RETURN WITH POSITIVE NUMBER

;Number ends with graphic plus - leave answer as is.
CVTAT1:	POP	PP,1		;RESTORE 1
	POPJ	PP,		;RETURN
>;END IFN ANS74
>	;END OF BIS
	END