.TITLE PECVT -- WRITE OUT A REAL/DOUBLE IN F0 IN E FORMAT .IDENT /831006/ ; $$ECVT: WRITE OUT A REAL/DOUBLE IN F0 IN E FORMAT ; REGISTER USAGE ; R1: @FILEBLOCK, @BUFFER ; R0: SCRATCH ; R2: SCRATCH ; R3: @BUFFER, SCRATCH ; R4: SCRATCH ; F0: REAL ; F1: SCRATCH ; CALLS: P$FPUT ; .GLOBL P$FPUT F0=%0 F1=%1 F2=%2 F3=%3 F4=%4 $$ECVT:: MOV SP,R3 ;R3 -> END OF BUFFER+1 SUB #BSIZ,SP ;MAKE ROOM FOR BUFFER IN STACK MOV SP,R1 ;R1 -> START OF BUFFER CLR R2 ;CLEAR EXPONENT CLR SIGN ;ASSUME > 0.0 CFCC ;GET FCC FROM LOAD IN CALLER BGT 1$ ;IF > 0.0 BEQ 3$ ;IF = 0.0 NEGD F0 ;R < 0.0 MAKE IT POSITIVE INC SIGN ;MAKE < 0.0 1$: STD F0,F1 ;SAVE NUMBER FOR LATER SUBD #ONE,F1 ;IS NUMBER < 1.0 TSTD F1 CFCC BLT 2$ ;YES, NUMBER < 1.0 INC R2 ;NO, INCREMENT EXPONENT MULD TENTH,F0 ;DIVIDE NUMBER BY 10 BR 1$ ;CONTINUE LOOP 2$: STD F0,F1 ;SAVE NUMBER FOR LATER MULD #TEN,F1 ;IS NUMBER >= 0.1 SUBD #ONE,F1 ; TSTD F1 CFCC BGE 3$ ;YES, NUMBER >= 0.1 DEC R2 ;NO, DECREMENT EXPONENT MULD #TEN,F0 ;MULTIPLY NUMBER BY 10 BR 2$ ;CONTINUE LOOP 3$: MOV R2,EXP ;SAVE EXPONENT MOV 12.+BSIZ(SP),R4 ;GET FIELDWIDTH FROM STACK SUB #7,R4 ;IS IT > 7 BGT 4$ ;YES MOV #7,R4 ;NO, SET IT TO DEFAULT (7) 4$: INC R4 ;ALLOW FOR EXTRA DIGIT MOV R4,NRDIG ;SAVE NUMBER OF DIGITS IN FRACTION 5$: MODD #TEN,F0 ;GET DIGIT LEFTMOST DIGIT FROM NUMBER STCDI F1,R0 ;CONVERT DIGIT TO INTEGER ADD #'0,R0 ;CONVERT DIGIT TO CHARACTER MOVB R0,(R1)+ ;PUT DIGIT INTO BUFFER SOB R4,5$ ;ANY DIGITS LEFT MOV R1,R2 ;SAVE CURRENT DIGIT POINTER DEC R2 ;SHOULD POINT AT LAST DIGIT MOV NRDIG,R4 ;GET NUMBER OF DIGITS DEC R4 ;DON'T CARRY FROM HIGHEST DIGIT MOVB (R2),R0 ;GET LAST (EXTRA) DIGIT ADD #5,R0 ;ROUND IT UP MOVB R0,(R2) ;PUT IT BACK IN THE BUFFER 6$: CMPB (R2),#'9 ;DIGIT > 9? BLE 7$ ;NO, ROUNDING UP IS DONE MOVB #'0,(R2) ;MAKE DIGIT A ZERO INCB -(R2) ;AND PROPAGATE CARRY, WHILE BACKING UP SOB R4,6$ ;PTR, CONTINUE FOR WHOLE STRING CMPB (R2),#'9 ;DOES THIS ONE OVERFLOW? BLE 7$ ;IF NOT, SKIP FIX MOVB #'1,(R2) ;ALL OVERFLOWED - SET LEADING DIGIT TO '1' INC EXP ;AND INCREMENT EXPONENT 7$: MOV NRDIG,R4 ;GET NUMBER OF DIGITS MOV 10.+BSIZ(SP),R1 ;GET FILE VARIABLE MOVB #' ,@(R1) ;PRINT THE MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;LEADING BLANK TST SIGN ;IS THE NUMBER NEGATIVE BEQ 8$ ;IF NO, THEN MOVB #'-,@(R1) ;PRINT A '-' BR 9$ ;ELSE 8$: MOVB #' ,@(R1) ;PRINT A ' ' 9$: MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;PRINT THE SIGN CHARACTER MOV SP,R3 ;R3 -> START OF BUFFER MOVB (R3)+,@(R1) ;GET THE FIRST DIGIT MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;AND PRINT IT DEC R4 ;DECREMENT COUNT OF NUMBER OF DIGITS MOVB #'.,@(R1) ;PRINT A '.' MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;IN FRONT OF THE NUMBER DEC R4 ;DON'T PRINT EXTRA DIGIT TST R4 ;CHECK TO SEE IF WE ARE TO PRINT BLE 13$ ;A FRACTIONAL PART 10$: MOVB (R3)+,@(R1) ;GET DIGIT MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;PRINT CHARACTER SOB R4,10$ ;CONTINUE FOR ALL DIGITS 13$: MOVB #'E,@(R1) ;PRINT THE 'E' MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;NEXT MOV EXP,R4 ;GET EXPONENT DEC R4 ;ACCOUNT FOR DIGIT BEFORE THE '.' BLT 11$ ;IS EXPONENT NEGATIVE MOVB #'+,@(R1) ;NO, '+' SIGN TO BE PRINTED BR 12$ ;ELSE 11$: MOVB #'-,@(R1) ;'-' SIGN TO BE PRINTED NEG R4 ;MAKE EXPONENT POSITIVE 12$: MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;PRINT THE SIGN OF THE EXPONENT MOV R4,R3 ;SAVE EXPONENT FOR LATER CLR R2 ;GET FIRST DIGIT DIV #10.,R2 ;OF EXPONENT ADD #'0,R2 ;CONVERT IT TO CHARACTER MOVB R2,@(R1) ;PRINT THE FIRST MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;DIGIT OF THE EXPONENT SUB #'0,R2 ;CONVERT THE FIRST DIGIT BACK TO INTEGER MOV R2,R3 ;PREPARE FOR MULTIPLY MUL #10.,R3 ;GET THE SECOND SUB R3,R4 ;DIGIT OF THE EXPONENT ADD #'0,R4 ;CONVERT IT TO CHARACTER MOVB R4,@(R1) ;PRINT THE SECOND MOV #1,R0 ;(ONE CHARACTER) JSR PC,P$FPUT ;DIGIT OF THE EXPONENT ADD #BSIZ,SP ;ERASE THE BUFFER RTS PC ;RETURN BSIZ = 40. ONE = 40200 TEN = 41040 TENTH: 37314,146314,146314,146317 .PSECT $VARBL ;PUT VARIABLES IN ANOTHER CSECT SIGN: 0 NRDIG: 0 EXP: 0 .END