.TITLE CVFS ; .MACRO .CVFS F,S ;CONVERTS REAL F TO STRING S .GLOBL .CVFS ;PRODUCES 16 CHAR LEFT JUSTIFIED A0=R0 A1=R1 EXP=R3 PT=R5 S: .BLKW 1 F: .BLKW 2 .CVFS: MOV R0,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R5,-(SP) STF A0,-(SP) STF A1,-(SP) LDF F,A0 MOV S,PT ;R5=PT IS POINTER FOR STRING S CLR EXP ;R3=EXPONENT TSTF A0 CFCC BGT POS BLT NEG MOVB #'0,(PT)+ BR RETU NEG: MOVB #'-,(PT)+ ;MINUS SIGN ABSF A0 POS: CMPF #10,A0 ;10 > NUMBER >= 1? CFCC BLE BIG CMPF #1,A0 CFCC BGT LITTLE BR PR BIG: DIVF #10,A0 ;NUMBER>=10; DIV BY 10 INC EXP ;INCREMENT EXPONENT CMPF #10,A0 ;NUMBER STILL >=10? CFCC BLE BIG BR PR LITTLE: MULF #10,A0 ;NUMBER<1; MUL BY 10 DEC EXP CMPF #1,A0 ;IS NUMBER STILL <1? CFCC BGT LITTLE ;NUMBER IS NOW IN FORM: G* 10**EXP, WHERE 10 > G >= 1 ;EXP IS EXPONENT. IF 6 >= EXP >= 0, PRINT WITH DECIMAL PT ;IF 0 > EXP >= -5, NUMBER IS < 1; PRINT IN 0.00... FORM ;OTHERWISE, PRINT IN SCIENTIFIC NOTATION PR: CMP EXP,#6 ;USE E IF EXP > 6 BGT SC CMP EXP,#-5 ;USE E IF EXP < -5 BLT SC CALL NOEXP BR RETU SC: CALL SCIENC ;CONVERT USING E, EXPONENT RETU: MOV S,R0 ADD #16.,R0 LSP: CMP PT,R0 ;FILL REST OF 16 PLACES WITH SPACES BHIS FINIS MOVB #40,(PT)+ BR LSP FINIS: CLRB (PT) ;ZERO BYTE TERMINATES STRING LDF (SP)+,A1 LDF (SP)+,A0 MOV (SP)+,R5 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R0 RETURN ;SUBROUTINE SCIENC; CONVERTS INTO SCIENTIFIC NOTATION WITH E. HERE 10 > A0 >=1 SCIENC: CALL HACK ;HACK MOVES ONE'S DIGIT INTO STRING S MOVB #'.,(PT)+ ;MOVE DECIMAL PT TO S MOV #8.,R2 ;PRINT 8 SIGNIFICANT FIGURES L: CALL HACK ;HACK OFF & MOVE 8 DIGITS TO OUTPUT BFLOAT SOB R2,L MOVB #'E,(PT)+ ;NEXT TYPE OUT EXPONENT TST EXP ;EXPONENT < 0? BGT POSEXP NEG EXP MOVB #'-,(PT)+ ;MINUS SIGN POSEXP: CLR R2 ;PUT DIVIDEND IN R2 & R3 (EXP IN R3) DIV #10.,R2 ;"TENS" DIGIT IS IN R2; "ONES" DIGIT IS IN R3 TST R2 ;IF TEN'S DIGIT OF EXPONENT = 0, DON'T PRINT BLE ZZZ ADD #60,R2 ;CONVERT "TENS" DIGIT TO ASCII MOVB R2,(PT)+ ZZZ: ADD #60,R3 ;CONVERT "ONES" DIGIT TO ASCII MOVB R3,(PT)+ RETURN ;SUBR HACK CONVERTS ONE'S DIGIT IN A0 TO ASCII CHARAC & PUTS INTO S-STRING HACK: MODF #1,A0 ;MODULO: MUL A0 BY 1. INTEGER PART-->A1 ;FRACTIONAL PART-->A0 (BOTH FLOATING PT) STCFI A1,R0 ;CONVERT A1 TO INTEGER & STORE IN R0 ADD #60,R0 ;CONVERT INTEGER TO CORRESPONDING ASCII CHARAC MOVB R0,(PT)+ ;MOVE BYTE INTO S-STRING MULF #10,A0 ;MULF BY 10 TO PUT NEXT DIGIT INTO ONE'S PLACE RETURN ;SUBROUTINE NOEXP: TYPES OUT WITHOUT AN EXPONENT NOEXP: TST EXP BLT LT0 ;6>=EXP>=0. PRINT OUT WITH DECIMAL PT INC EXP ;EG, 1E6=1000000. HAS 7 DIGITS TO LEFT OF PT LG: CALL HACK ;HACK SUBROUTINE HACKS OFF ONE DIGIT FROM A0 SOB EXP,LG ;LOOP UNTIL DIGITS IN FRONT OF DECIMAL PT DONE MOVB #'.,(PT)+ ;MOVE DECIMAL PT INTO S-STRING BR DIGITS ;NOW 0 > EXP >= -5 LT0: MOVB #'0,(PT)+ MOVB #'.,(PT)+ L0: INC EXP BGE DIGITS MOVB #'0,(PT)+ ;ANOTHER 0 NEEDED BR L0 DIGITS: MOV #8.,R2 ;DO 8 MORE DIGITS LGG: CALL HACK SOB R2,LGG RETURN .END