File NUMB.SB (8k SABR macro assembler source file)

Directory of image this file is from
This file as a plain text file

/NUMB.SB
/
/	G.G.	24-FEB-77
/	FUNCTION NUMB(RLNUMB,ALFA,IWIDE,IDEC)
/
/	CONVERTS RLNUMB TO AN ALFA (A1) STRING
/	IWIDE PLACES WIDE
/	WITH IDEC PLACES AFTER THE DECIMAL POINT
/	
/	IF IDEC = -1 THEN NO DECIMAL POINT IS ADDED
/
/	IF IDEC = -2 THEN RLNUMB IS ASSUMED TO BE AN INTEGER
/	AND INTEGER CONVERSION IS DONE. (+2047, -2048)
/
/	IF A CONVERSION ERROR OCCURS ( NUMBER TOO LARGE FOR FIELD)
/	THE FIELD IS '*' FILLED AND THE FUNCTION RETURNS A -1
/	NORMAL VALUE RETURNED IS 0
/
/	....( MOST OF THE CODE IS STOLEN FROM 'IOH')....
///////////////////////////////////////////////////////////////////
	OPDEF TADI 1400
	OPDEF DCAI 3400
	OPDEF ANDI 0400
	OPDEF JMPI 5400
	OPDEF JMSI 4400
	OPDEF ISZI 2400

	ABSYM	SACH	23
	ABSYM	SACM	24
	ABSYM	SACL	25
	ABSYM	N2	175
	ABSYM	ARGUMT	176
	DUMMY	ARGUMT

	LAP			/WE KNOW WHAT WE ARE DOING (DON'T WE?)

/////// DATA AREA
/
BA,	0
CRX,	0
FN,	0
CH,	0
CHCH,	0
CX,	0
FPNT,	0;0
GFRM,	0
N3,	0
DADP,	0
/
/	IARG: GET NEXT INTEGER ARG INTO AC

IARG,	0
CF,	HLT			/CALLING FIELD
	TADI	R
	INC	R
	DCA	ARGF		/GET ARG FIELD
	TADI	R
	INC	R
	DCA	ARGA		/GET ARG ADDR

ARGF,	HLT
	TADI	ARGA
	JMP I	IARG		/RETURN WITH ARG
ARGA,	0
	ENTRY	NUMB
NUMB,	0
R,	0			/ENTRY POINT
	TAD	NUMB
	DCA	CF
	JMS	IARG		/GET REAL NUMBER
	CLA CLL			/IGNORE INTEGER
	TAD	ARGF
	DCA	ARGUMT
	TAD	ARGA
	DCA	ARGUMT#
	JMS	IARG
	CLA CLL			/GET ALFA ADDR, IGNORE VALUE
	TAD	ARGF
	DCA	LITF

	TAD	ARGA
	DCA	LITA		/MOVE ALFA ADDRESS

	JMS	IARG
	DCA	N3
	JMS	IARG
	DCA	DADP		/GET IWIDE, IDEC
	TAD	DADP
	SPA
	CLA
	DCA	N2
	CLA STL RTL		/=2
	TAD	DADP
	SNA CLA
	JMP	INTOUT		/YES

	CALL	0,CLEAR
FF,	JMS	NR		/CHECK IF INPUT - IF NOT, GET NUMBER INTO [.1,1]
	TAD	DADP
	RAL
	CLA			/SAVE SIGN BIT
	TAD	C		/C CONTAINS NUMBER OF MULTS TO RANGE NUMBER
	SMA
	CLA CMA			/0 MULTS NEEDED OR ALREADY THERE
	SZL
	IAC			/IF NO D.P. DESIRED
FFAKE,	TAD	N3		/NUMB3 IS THE FIELD WIDTH
	CIA			/MINUS SPACE FOR DADP+DP
	TAD	N2
	JMS	SA		/PUT OUT REQUIRED BLANKS + SIGN
	TAD	C
	SMA
	JMP	PRZRO		/NO LEADING DIGIT - PRINT A ZERO FOR LOOKS
	CIA
	JMS	DT
PRQDCP,	TAD	DADP
	SPA CLA			/ PRINT "."?
	JMP	FX		/NO, RETURN NOW..
PRDCPT,	TAD	(56
	JMS	LETTER
	TAD	C		/GET MULTIPLY COUNT
	SPA SNA
	JMP	PAS2
	CMA			/THEY WERE MULTIPLIES, 0 TO N OF THEM
	DCA	CRX
	TAD	N2		/DIGITS AFTER DEC POINT, DADP
	CMA
	DCA	NR
	JMP	PASA		/TEST FOR 0 MULTIPLIES
RETR,	TAD	(60		/PUT OUT A ZERO
	JMS	LETTER		/ALL MULTIPLIES REPRESENTED
PASA,	ISZ	CRX		/NO, TRY RUN OFF FIELD
	SKP
	JMP	PASS		/YES
	ISZ	NR		/ALL WIDTH ACCOUNTED FOR%
	JMP	RETR		/NO, TRY NEXT POSITION


PASS,	TAD	C		/YES, GET MULT COUNT
	CIA			/-MULT COUNT
	SKP
PAS2,	CLA
	TAD	N2		/N2-MULT COUNT
	SMA SZA			/IS MULT COUNT .GE. N2?
	JMS	DT		/NO - PRINT REMAINING DIGITS
	JMP	FX		/NO
PRZRO,	CLA
	TAD	(60
	JMS	LETTER
	JMP	PRQDCP		/GO BACK TO PRINT THE DECIMAL POINT



	PAGE			/GG
/	GET REAL # INTO [0.1,1.0]

NR,	0
	CALL	1,IFAD		/OUTPUT - LOAD NUMBER INTO FLOATING AC
	ARG	ARGUMT
	DCA	SN		/CLEAR THESE LOCS
	DCA	C
	TAD	ACH
	SNA
	JMP	NREX		/NUMBER IS ZERO
	SMA			/IS IT A MINUS F P NUMBER
	JMP	RETM
	TAD	(4000		/YES-- MAKE IT POSITIVE
	ISZ	SN		/SET SIGN
	DCA	ACH
RETM,	CLA			/MULTIPLY BY 10 UNTIL NR .GT. (1.0)
	TAD	ACH
	TAD	(5764
	SMA CLA
	JMP	TB		/GOT IT IT IS .GE.1
	CALL	1,FMP
	ARG	TN
	ISZ	C		/AND COUNT
	JMP	RETM		/GO TRY TO DO IT AGAIN
TB,	JMS	SE		/NOTE SE ' XR-1
	CALL	1,STO
	ARG	SV
	TAD	(2004
	DCA	ACH		/200400000000=.50000 IN AC
	TAD	C
	CIA
	TAD	N2		/< DADP
	SMA
	CMA			/NUMBER OF TIMES TO DIVIDE .5 BY 10 TO RND
	JMS	DH		/DO THE DIVIDES
	CALL	1,FAD
	ARG	SV
	JMS	SE		/REDUCE TO NORMAL RANGE AGAIN


GD,	TAD	ACH
	RAL
	SPA CLA
	JMP	ZP		/NUMBER IS ? 1/2
	TAD	ACH
	CLL RAR 		/WE ARE GETTING EXP TO 200
	DCA	ACH
	TAD	ACM
	RAR
	DCA	ACM
	TAD	ACL
	RAR
	DCA	ACL
	TAD	ACH
	AND	(7774
	TAD	ACH
	TAD	(10
	DCA	ACH
	JMP	GD
ZP,	TAD	ACH
	AND	(7
	DCA	ACH
NREX,	JMP I	NR
SN,	0

C,	0			/COUNTER FOR DEC. EXP.
SE,	0			/DIVIDE BY 10 UNTIL N < 1.0
XR,	TAD	ACH		/TEST NUMBER FOR .GE. 1
	TAD	(5764
	SPA CLA
	JMP I	SE		/NUMBER IS IN RANGE, RETURN
	CLA CLL CMA RAL
	JMS	 DH
	CLA CMA	 /REDUCE COUNT
	TAD	 C
	DCA	C
	JMP	XR

SV,	BLOCK	3
TN,	2045;0;0
/	LETTER:	PLACE NEXT CHAR IN OUTPUT ARRAY

LITA,	0

LETTER,	0
LITF,	HLT			/LITERAL OUTPUT FIELD
	RTL
	RTL
	RTL
	AND	(7700
	TAD	(40		/MAKE INTO A1 FORMAT
	DCAI	LITA
	ISZ	LITA
	NOP
	JMP I	LETTER

	PAGE

DT,	0
	CIA
	DCA	CHCH		/STORE COUNT
RETT,	JMS	LS		/LEFT SHIFT 1
	TAD	ACL		/SAVE THE FPAC
	DCA	SACL
	TAD	ACM
	DCA	SACM
	TAD	ACH
	AND	(17
	DCA	SACH
	TAD	SACH
	DCA	ACH		/TRIM AC TO 28 BITS
	JMS	LS		/LEFT SHIFT 2
	JMS	LS
	TAD	ACL		/ADD THE DSAVE TO THE ACC
	TAD	SACL
	DCA	ACL
	RAL			/*
	TAD	ACM
	TAD	SACM
	DCA	ACM
	RAL			/*
	TAD	ACH
	TAD	SACH
	DCA	ACH
	TAD	ACH
	CLL RAR			/ROTATE 3 RIGHT
	RTR
	AND	(17
	TAD	(60		/MAKE DIGIT
	JMS	LETTER		/DUMP IT AND SEE IF ANY MORE
	ISZ	CHCH		/LOOP ON COUNT
	JMP	RETT		/*
	JMP I	DT

LS,	0			/LEFT SHIFT THE FPAC 1
	TAD	ACL
	CLL RAL
	DCA	ACL
	TAD	ACM
	RAL
	DCA	ACM
	TAD	ACH
	RAL
	DCA	ACH
	JMP I	LS		/DONE

DH,	0
	DCA	CX		/DIVIDE FPAC BY TEN CX TIMES
	JMP	DTA
DTB,	CALL	1,FDV
	ARG	TN
DTA,	ISZ	CX
	JMP	DTB
	JMP I	DH

AS3,	CLA			/PRINT ASTERISKS FOR WHOLE FIELD SIZE
	TAD	N3		/GET FIELD SIZE, E OR F
	CMA
	DCA	CX		/-COUNT
	JMP	QQ
QQA,	TAD	(52		/PRINT CX ASTERISKS
	JMS	LETTER
QQ,	ISZ	CX		/INDEX COUNT
	JMP	QQA
	STA			/RETURN -1 IF *** ERROR
FX,	CALL	0,CLEAR
	RETRN	NUMB
/	SA: OUTPUT LEADING BLANKS AND MINUS SIGN

SA,	0
	TAD	SN
	SMA			/THIS IS -(NUMB OF BLANKS)
	JMP	AS3		/POSITIVE, NUMBER TOO BIG FOR FIELD
	DCA	CRX
	SKP CLA
RETC,	JMS	LETTER		/HERE WE PUT OUT THAT MANY BLANKS
	TAD	(40
	ISZ	CRX
	JMP	RETC		/YES
	CLA
	TAD	SN
	SNA CLA			/IS SIGN MINUS?
	JMP I	SA		/EVIDENTLY NOT
	TAD	(55
	JMS	LETTER		/PUT OUT A MINUS SIGN
	JMP I	SA



	PAGE			/INTEGER OUTPUT

BUFPTR,	IBUF
	0;0;0
IBUF,	0;-1

INTOUT,	TAD	BUFPTR
	DCA	SACL		/SET POINTER
	TAD	(-4
	DCA	WHI		/SET WIDTH
	DCA	SN
	TAD I	ARGUMT		/GET INTEGER VALUE
	SMA			/NEGATIVE??
	JMP	DIVLP		/NO
	CIA			/POSITIZE
	INC	SN		/SET SIGN FLAG

DIVLP,	CALL	1,DIV
	ARG	INTTEN		/=10D
	DCA	SACH		/SAVE QUOTIENT
	CPAGE	4
	CALL	0,IREM		/USE DUMMY ARG
INTTEN,	12			/DIVISION CONSTANT FOR BASE 10
WHI,	0			/WIDTH
	DCA I	SACL		/SAVE DIGIT
	STA
	TAD	SACL
	DCA	SACL		/DECREMENT POINTER
	ISZ	WHI		/ALL DONE?
	TAD	SACH		/OR NUMB = 0?
	SZA
	JMP	DIVLP		/NO, DO IT AGAIN

	TAD	N3
	CMA
	TAD	WHI
	TAD	(4		/COMPUTE LEADING SPACE COUNT
	JMS	SA		/PRINT LEADING SPACES AND SIGN

IDIG,	INC	SACL		/POINT TO NEXT DIGIT
	TAD I	SACL
	SPA			/END OF ?
	JMP	NUMBEX		/YES, EXIT
	TAD	(60
	JMS	LETTER		/NO, OUTPUT DIGIT
	JMP	IDIG		/AND LOOP

NUMBEX,	CLA CLL
	RETRN	NUMB		/RETURN OKAY

	END



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search