	.TITLE	RCI		
; JEFFREY KODOSKY	ARL	JUN76
;
; UTILITY:	INTEGER CONVERSION ON INPUT
; ENTRY:	R3 POINTS TO ASCIZ BUFFER CONTAINING SYNTACTICALLY
;		CORRECT DECIMAL INTEGER (OPTIONAL SIGN FOLLOWED BY
;		DIGITS).
; EXIT:		1 ARG (SP)	<I> OR <F>
;		C BIT SET IF FLOATING POINT NUMBER RETURNED
; ERRORS:	NONE
; CALLS:	IDR, DOUBLE INTEGER TO REAL CONVERTER
	.GLOBL	ICI,QIDR
ICI:	MOV	#9.*400,-(SP)	;SIGN SPACE AND DIGIT COUNTER
	CLR	R0	;AC
	CLR	R1
	CMPB	@R3,#'-
	BGT	2$
	BLT	1$
	INC	@SP	;NOTE -
1$:	INC	R3	;BUMP PAST SIGN
2$:	CLR	-(SP)	;EXPONENT IN CASE REAL NEEDED
NXTI:	MOVB	(R3)+,R2
	BEQ	DONE
	DECB	3(SP)
	BGE	1$
	INC	@SP	;TOO MANY DIGITS, INC EXPONENT
	BR	NXTI
1$:	SUB	#60,R2	;BINARY VALUE
	BNE	2$
	TST	R1	;IGNORE LEADING ZEROS
	BNE	2$
	TST	R0
	BNE	2$
	INCB	3(SP)
	BR	NXTI
2$:	JSR	PC,MUL5
	ASL	R1
	ROL	R0
	ADD	R2,R1
	ADC	R0
	BR	NXTI
DONE:	TST	@SP
	BNE	SCLP	;JUMP TO RCI IF EXPONENT
	CMP	(SP)+,R0;TST R0
	BNE	5$	;JUMP IF FLOATING POINT REQUIRED
	NEG	R1
	CLV
	BGT	4$
	ROR	(SP)+
	BCS	1$
	NEG	R1
	BVS	2$	;JUMP IF -NEGMAX
1$:	MOV	R1,-(SP)
	CLC
	JMP	@-(R4)
2$:	CLR	-(SP)	;RETURN -NEGMAX
	MOV	#^F32768.,-(SP)
	BR	OUTR
4$:	NEG	R1
5$:	MOV	R1,-(SP);CONVERT TO FLOATING POINT
	BR	COUTR
	.PAGE
; UTILITY:	REAL CONVERSION ON INPUT
; ENTRY:	R3 POINTS TO ASCIZ BUFFER CONTAINING SYNTACTICALLY
;		CORRECT FLOATING POINT NUMBER (SIGN,DIGITS,DECIMAL
;		POINT,DIGITS,E,SIGN,DIGITS)
; EXIT:		1 ARG (SP)	<F>
;		C BIT ALWAYS SET
; ERRORS:	NONE
; CALLS:	ICI, INTEGER CONVERSION ON INPUT
;		IDR, DOUBLE INTEGER TO REAL CONVERTER
	.GLOBL	RCI,QICI,QIDR
RCI:	MOV	#9.*400,-(SP)	;SIGN SPACE AND DIGIT COUNTER
	CLR	R0	;AC
	CLR	R1
	CMPB	@R3,#'-
	BGT	2$
	BLT	1$
	INC	@SP	;NOTE -
1$:	INC	R3	;BUMP PAST SIGN
2$:	CLR	-(SP)	;EXPONENT
NXTR:	MOVB	(R3)+,R2;NEXT DIGIT
	BEQ	EDONE
	SUB	#60,R2	;BINARY VALUE
	BMI	3$	;JUMP IF . FOUND
	BNE	10$
	TST	R1	;IGNORE LEADING ZEROS
	BNE	10$
	TST	R0
	BEQ	NXTR
10$:	CMP	R2,#9.
	BGT	E	;JUMP IF E FOUND
	DECB	3(SP)
	BGE	1$
	TSTB	2(SP)	;TOO MANY DIGITS, INC EXPONENT IF
	BMI	NXTR	; . WASN'T ALREADY FOUND
	INC	@SP
	BR	NXTR
1$:	JSR	PC,MUL5
	ASL	R1
	ROL	R0
	ADD	R2,R1
	ADC	R0
	TSTB	2(SP)
	BPL	NXTR
	DEC	@SP	;ADJUST EXPONENT IF AFTER .
	BR	NXTR
3$:	BIS	#200,2(SP)	;NOTE . FOUND
	BR	NXTR
E:	MOV	R1,-(SP);SAVE AC
	MOV	R0,-(SP)
	QICI		;GET EXPONENT
	BCS	INF1
	ADD	(SP)+,4(SP)
	MOV	(SP)+,R0;POP AC
	MOV	(SP)+,R1
EDONE:	TST	R0
	BNE	SCAL
	TST	R1
	BNE	SCAL
ZER:	CLR	2(SP)	;ZERO IS TRIVIAL
	CLR	@SP
	BR	OUTR
SCAL:	CLR	R3	;BINARY EXPONENT
	TST	@SP
	BGT	SCLP	;JUMP IF +EXP
	BMI	SCLN	;JUMP IF -EXP
	MOV	R1,@SP	;0 EXP IS EASY
COUTR:	MOV	R0,-(SP)
	QIDR
	ROL	@SP
	ROR	4(SP)
	MOV	2(SP),4(SP)
	MOV	(SP)+,@SP
OUTR1:	ROR	@SP
OUTR:	SEC
	JMP	@-(R4)
SCLP:	CMP	@SP,#40.
	BGE	INF
ML:	CMP	R0,#31462
	BHI	MDV
	JSR	PC,MUL5
	INC	R3
D10:	DEC	@SP
	BGT	ML
	BR	FLOAT
MDV:	JSR	PC,MUL54
	ADD	#3,R3
	BR	D10
SCLN:	CMP	@SP,#-40.
	BLE	ZER
DV:	TST	R0
	BLT	DV2
DV1:	DEC	R3
	ASL	R1
	ROL	R0
	BPL	DV1
DV2:	MOV	#16.,R2
	ROR	R0
	ROR	R1
	MOV	R1,-(SP)
	MOV	R0,-(SP)
DV3:	ROR	R0
	ROR	R1
	CLC
	ROR	R0
	ROR	R1
	CLC
	.REPT	2
	ROR	R0
	ROR	R1
	ADD	2(SP),R1
	ADC	R0
	ADD	@SP,R0
	.ENDR
	DEC	R2
	BGT	DV3
	CMP	(SP)+,(SP)+
	SUB	#3,R3
	INC	@SP
	BLT	DV
	TST	R0
	BGE	FLOAT
	ROR	R0
	ROR	R1
	INC	R3
FLOAT:	MOV	R3,@SP
	MOV	R1,-(SP)
	MOV	R0,-(SP)
	QIDR
	MOV	(SP)+,R0
	MOV	(SP)+,R1
	MOV	@SP,R3
	ASL	R0
	MOV	R0,R2
	CLRB	R2
	SWAB	R2
	ADD	R2,R3
	BLE	ZER
	CMP	R3,#377
	BGT	INF
	SWAB	R0
	CLRB	R0
	BIS	R3,R0
	SWAB	R0
	ROR	2(SP)
	MOV	R1,2(SP)
	MOV	R0,@SP
	BR	OUTR1
INF1:	TST	(SP)+
	BPL	INF2
	ADD	#6,SP
	BR	ZER
INF2:	ADD	#6,SP
INF:	CLR	@SP
	ROR	2(SP)
	MOV	#-1,2(SP)
	BR	OUTR1
MUL54:	CMP	R0,#146314
	BLO	M55
	CLC
	ROR	R0
	ROR	R1
	INC	R3
M55:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	CLC
	ROR	R0
	ROR	R1
	CLC
	ROR	R0
	ROR	R1
	BR	M5A
MUL5:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	ASL	R1
	ROL	R0
	ASL	R1
	ROL	R0
M5A:	ADD	(SP)+,R1
	ADC	R0
	ADD	(SP)+,R0
	RTS	PC
	.END
