.TITLE C18CLU
.IDENT /V1.0/
.SBTTL COVERT 18 CHARACTER STRING TO A CLUNK VALUE

; THIE ROUTINE WILL CONVERT AN 18 CHARACTER ARRAY OF DIGITS BETWEEN
; ZERO AND NINE TO A 64 BIT CLUNK VALUE.
;
; LAST EDIT: 1-JUL-1988 10:48:58 
;
; AUTHOR:	PETER STADICK
;		CARGILL INC.
;		P.O. DRAWER AR
;		RESERVE,LA 70084
;
; EDIT HISTORY:	CREATED JUN-88 PJS
;
;
; CALL PARAMETER LIST
;	2(R5) = ADDRESS TO ARRAY OF 18 DIGITS	( INPUT PRESERVED )
;	4(R5) = ADDRESS TO CLUNK VALUE		( OUTPUT )
;
; THIS ROUTINE STEPS THRU THE LIST OF DIGITS AND THEN MULTIPLIES BY
; THE APPROPRIATE PLACE MULTIPLIER. THE ROUTINE DOES NO ERROR CHECKING
; TO SEE IF THE ARRAY CONTAINS ONLY DIGITS. IF THE ARRAY CONTAINS ANYTHING
; OTHER THEN THE DIGITS 0 THRU 9 UNEXPECTED CLUNK VALUES WILL RESULT.
; REMEMBER THAT CLUNKS ARE UNSIGNED 64 BIT INTEGERS.
;
; AN EXAMPLE OF ANY INPUT VALUE '000000001234567890'.
;
; ALL REGISTERS ARE PRESERVED
;

.PSECT CLUNK,RO,LCL,REL
C18CLU::
	MOV R0, -(SP)		; PRESERVE REGISTERS
	MOV R1, -(SP)		
	MOV R2, -(SP)		
	MOV R3, -(SP)
	MOV R4, -(SP)
	MOV R5, -(SP)
;
; LOAD PLACE MULTIPLIES ONTO STACK
;
; 1
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00000,-(SP)	
	MOV #^D00001,-(SP)	;LSW 
;
; 10
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00000,-(SP)	
	MOV #^D00010,-(SP)	;LSW 
;
; 10^2 - 100
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00000,-(SP)	
	MOV #^D00100,-(SP)	;LSW 
;
; 10^3 - 1,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00000,-(SP)	
	MOV #^D01000,-(SP)	;LSW 
;
; 10^4 - 10,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00000,-(SP)	
	MOV #^D10000,-(SP)	;LSW 
;
; 10^5 - 100,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00001,-(SP)	
	MOV #^D34464,-(SP)	;LSW 
;
; 10^6 - 1,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00015,-(SP)	
	MOV #^D16960,-(SP)	;LSW 
;
; 10^7 - 10,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D00152,-(SP)	
	MOV #^D-27008,-(SP)	;LSW 
;
; 10^8 - 100,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D01525,-(SP)	
	MOV #^D-7936,-(SP)	;LSW 
;
; 10^9 - 1,000,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00000,-(SP)	
	MOV #^D15258,-(SP)	
	MOV #^D-13824,-(SP)	;LSW 
;
; 10^10 - 10,000,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00002,-(SP)	
	MOV #^D21515,-(SP)	
	MOV #^D-7168,-(SP)	;LSW 
;
; 10^11 - 100,000,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00023,-(SP)	
	MOV #^D18550,-(SP)	
	MOV #^D-6144,-(SP)	;LSW 
;
; 10^12 - 1,000,000,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D00232,-(SP)	
	MOV #^D-11099,-(SP)	
	MOV #^D04096,-(SP)	;LSW 
;
; 10^13 - 10,000,000,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D02328,-(SP)	
	MOV #^D20082,-(SP)	
	MOV #^D-24576,-(SP)	;LSW 
;
; 10^14 - 100,000,000,000,000
	MOV #^D00000,-(SP)	;MSW 
	MOV #^D23283,-(SP)	
	MOV #^D04218,-(SP)	
	MOV #^D16384,-(SP)	;LSW 
;
; 10^15 - 1,000,000,000,000,000
	MOV #^D00003,-(SP)	;MSW 
	MOV #^D-29314,-(SP)	
	MOV #^D-23354,-(SP)	
	MOV #^D-32768,-(SP)	;LSW 
;
; 10^16 - 10,000,000,000,000,000
	MOV #^D00035,-(SP)	;MSW 
	MOV #^D-30990,-(SP)	
	MOV #^D28609,-(SP)	
	MOV #^D00000,-(SP)	;LSW 
;
; 10^17 - 100,000,000,000,000,000
	MOV #^D00355,-(SP)	;MSW 
	MOV #^D17784,-(SP)	
	MOV #^D23946,-(SP)	
	MOV #^D00000,-(SP)	;LSW 

	MOV SP,R4		; SET R4 TO START OF PLACE MULIPLIERS

	MOV 2(R5),R0		; START OF INPUT ARRAY
	MOV 4(R5),R1		; OUTPUT CLUNK

	MOV R0,-(SP)		; MULTIPLY AND ADD PARAMETER BLOCK
	MOV R0,-(SP)
	MOV R0,-(SP)
	MOV R0,-(SP)
	MOV R0,-(SP)
	MOV SP,R5

ADDBUF=18.
	MOV R0,-(SP)		; BUFFER FOR ACCUMULATING CLUNK VALUE
	MOV R0,-(SP)
	MOV R0,-(SP)
	MOV R0,-(SP)

PRODUT=10.
	MOV R0,-(SP)		; BUFFER FOR PLACE CLUNK VALUE
	MOV R0,-(SP)
	MOV R0,-(SP)
	MOV R0,-(SP)

DIGIT=2.
	MOV #0,-(SP)		; CREATE DIGIT MULTIPLY BUFFER ON STACK
	MOV #0,-(SP)
	MOV #0,-(SP)
	MOV #0,-(SP)

	MOV R0,-(SP)		; STATUS RETURN SPOT

	MOV #0, (R1)		; ZERO OUT CLUNK
	MOV #0,2(R1)
	MOV #0,4(R1)
	MOV #0,6(R1)		

	MOV #18.,R2		; NUMBER OF DIGITS TO PROCESS

10$:	MOVB (R0),R3		; GET FIRST DIGIT OF ARRAY
	SUB #060,R3		; CONVERT TO INTEGER
	BEQ 20$			; OPTIMIZE - BRANCH IF DIGIT ZERO
	MOV R3,DIGIT(SP)	; MOVE INTEGER TO MULTIPLY BUFFER

	MOV SP,2(R5)		; FIRST MULIPLY VALUE POINTS TO MULBUF
	ADD #DIGIT,2(R5)	
	MOV R4,4(R5)		; SECOND VALUE POINTS TO PLACE MULTIPLYER
	MOV SP,6(R5)		; THIRD VALUE POINTS TO PRODUCT RESULT	
	ADD #PRODUT,6(R5)
	MOV SP,10(R5)		; POINTS TO RETURN STATUS

	JSR PC, MUL64

	MOV SP,2(R5)		; PRODUCT OF PLACE MULIPLY
	ADD #PRODUT,2(R5)
	MOV SP,4(R5)		; SUM FROM PREVIOUS PLACES
	ADD #ADDBUF,4(R5)
	MOV  (R1),ADDBUF(SP)	; MOVE LAST RESULT TO INPUT BUFFER
	MOV 2(R1),ADDBUF+2(SP)
	MOV 4(R1),ADDBUF+4(SP)
	MOV 6(R1),ADDBUF+6(SP)
	MOV R1,6(R5)		; RESULT REGISTER

	JSR PC, ADD64

20$:	INC R0			; POINT TO NEXT DIGIT IN ARRAY
	ADD #8.,R4		; POINT TO NEXT PLACE MULTIPLIER
	SOB R2,10$		; LOOP UNTIL LAST DIGIT PROCESSED

	ADD #180.,SP		; ADJUST STACK BACK

	MOV (SP)+,R5		; RESTORE REGISTERS
	MOV (SP)+,R4
	MOV (SP)+,R3
	MOV (SP)+,R2		
	MOV (SP)+,R1		
	MOV (SP)+,R0		

	RTS PC

	.END
