.TITLE CDDMG .IDENT /00/ ; ; CONVERT A DOUBLE PRECISION, UNSIGNED QUANTITY TO DECIMAL ASCII ; ; LOCAL MACROS ; ; SET ASCII CONVERTION PARAMETERS ; ; CBTA RADIX,WIDTH,SIGN,BLANK ; ; WHERE ; ; RADIX=CONVERSION RADIX ; ; WIDTH=FIELD WIDTH ; ; SIGN='SIGNED' FOR SIGNED CONVERSION, ANYTHING ELSE IMPLIES ; UNSIGNED CONVERSION ; ; BLANK='BLANKS' TO CONVERT LEADING ZEROS TO BLANKS. ANYTHING ELSE ; IMPLIES NO CONVERSION ; .MACRO CBTA RADIX,WIDTH,SIGN,BLANK $$$BLK= 0*2000 $$$SGN= 0*400 .IF IDN,, $$$BLK= 1*2000 .ENDC .IF IDN,, $$$SGN= 1*400 .ENDC MOV #!$$$SGN!$$$BLK!RADIX,R5 TST R2 BEQ .+4 BIS #1*1000,R5 .ENDM ;+ ; **-$CDDMG-CONVERT DOUBLE PRECISION NUMBER TO ASCII ; ; THIS SUBROUTINE IS CALLED TO CONVERT A DOUBLE PRECISON UNSIGNED ; NUMBER TO ASCII. THE NUMBER MUST FIT IN 9 DIGITS OR LESS. IF THE VALUE ; IS TOO LARGE, THE ROUTINE INSERTS A STRING OF 5 ASTERISKS IN THE ; OUTPUT STREAM ; ; INPUTS: ; ; R0=POINTER TO ASCII OUTPUT STRING ; R1=ADDRESS OF DOUBLE PRECISION VALUE ; R2=ZERO COMPRESS FLAG, 0=COMPRESS LEADING ZEROS, ANYTHING ELSE ; CAUSES LEADING ZEROS TO BE DISPLAYED. ; ; LEADING ZEROS ARE ALWAYS COMPRESSED WHEN THE 5 MOST SIGNIFICANT DIGITS ; ARE ZERO ; ; OUTPUTS ; ; R0=UPDATED STRING POINTER ; ; REGISTERS R3 - R5 ARE PRESERVED. ; ;- $CDDMG:: JSR R5,$SAVRG ;SAVE REGISTERS R3-R5 MOV R0,R3 ;COPY STRING POINTER MOV #10000.,R4 ;SET DIVISOR CBTA 10.,0,NOSIGN,NOBLANKS ;SET CONVERSION PARAMETERS .IF NDF,R$$EIS CMP (R1)+,R4 ;TEST FOR OVERFLOW BHIS 40$ ;IF HIS, OVERFLOW MOV (R1),R2 ;GET LOW PART OF NUMBER MOV -(R1),R1 ;GET HIGH PART OF NUMBER MOV R4,R0 ;COPY DIVISOR CALL $DDIV ;DO DOUBLE-PRECISION DIVIDE MOV R0,-(SP) ;SAVE REMAINDER MOV R2,R1 ;COPY QUOTIENT BEQ 20$ ;IF EQ, NOTHING TO PRINT .IFF CMP (R1),R4 ;NUMBER TOO BIG? BHIS 40$ ;IF HIS YES MOV (R1)+,R0 ;GET HIGH PART OF NUMBER MOV (R1),R1 ;GET LOW PART OF NUMBER DIV R4,R0 ;DIVIDE MOV R1,-(SP) ;SAVE REMAINDER MOV R0,R1 ;COPY QUOTIENT BEQ 20$ ;IF EQ NOTHING TO PRINT .ENDC MOV #5*4000,R2 ;SET FIELD WIDTH CALL 30$ ;OUTPUT HIGH-ORDER DIGITS BIS #1*1000,R5 ;DISABLE ZERO COMPRESSION MOV R0,R3 ;SET STRING POINTER 20$: MOV (SP)+,R1 ;GET LOW ORDER VALUE MOV #4*4000,R2 ;SET FIELD WIDTH 30$: MOV R3,R0 ;GET STRING POINTER BIS R5,R2 ;INCLUDE RADIX AND BLANK SUPPRESS CALL $CBTA ;CONVERT TO ASCII BR 60$ ;EXIT 40$: MOV #5,R2 ;GET COUNT 50$: MOVB #'*,(R0)+ ;FILL FIELD WITH ASTERISKS SOB R2,50$ ;... 60$: RETURN .END