.TITLE PWEXP .IDENT /840224/ ;PARMS ; 1. POINTER TO FILE BLOCK ; 2. REAL VALUE ; 3. FIELD WIDTH ;REGISTER USAGE ; R0 SCRATCH ; R1 SCRATCH ; R2 SCRATCH ; R3 EXPONENT ; R4 FIELD WIDTH ; R5 POINTER TO STRING SPACE .GLOBL V.SPCE .GLOBL $$$098,$$$220,$$$027 .GLOBL P.RUND .PSECT ; $$$041:: MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) ; MOV #V.SPCE,R5 ;ALLOCATE SPACE FOR STRING MOVB #' ,(R5) MOVB (R5)+,(R5)+ ;ASSUME POSITIVE MOV 16(SP),-(SP) ;GET REAL MOV 16(SP),-(SP) BPL 1$ MOVB #'-,-1(R5) ;NEGATIVE 1$: CLRB (R5)+ ;LEAVE SPACE FOR DECIMAL POINT CLR R3 ;EXPONENT ZERO BIC #100000,(SP) ;USE ABSOLUTE VALUE BEQ 4$ ; 2$: CMP (SP),#41040 ;DIVIDE UNTIL LESS THAN 10.0 BLO 3$ MOV #146315,-(SP) ;MULTIPLY BY 0.1 MOV #37314,-(SP) FMUL SP INC R3 ;*10 BR 2$ ; 3$: CMP (SP),#40200 ;MULTIPLY UNTIL AT LEAST 1.0 BHIS 4$ CLR -(SP) ;MULTIPLY BY 10.0 MOV #41040,-(SP) FMUL SP DEC R3 ;/10 BR 3$ ; 4$: MOV 16(SP),R4 ;GET FIELD WIDTH SUB #7,R4 ;CALCULATE NUMBER OF DIGITS BGT 5$ MOV #7,R4 ;DEFAULT OF SEVEN 5$: INC R4 ;EXTRA FOR ROUNDING CMP R4,#40. ;MAXIMUM ALLOWABLE BLE 6$ MOV #40.,R4 6$: MOV R4,R2 ;RECALCULATE LENGTH ADD #6,R2 ;IGNORE EXTRA DIGIT MOV R2,20(SP) CMP R2,16(SP) ;CHEK FIELD BLT 7$ CLR 16(SP) 7$: BR 9$ ; 8$: CLR -(SP) ;MULTIPLY BY 10.0 MOV #41040,-(SP) FMUL SP 9$: CLR -(SP) ;EXTRACT UNITS DIGIT MOV 4(SP),-(SP) MOV 4(SP),-(SP) JSR PC,$$$098 ADD #'0,(SP) MOVB (SP)+,(R5)+ JSR PC,$$$220 ;EXTRACT FRACTION SOB R4,8$ ; MOV R5,-(SP) ;ROUND UP JSR PC,P.RUND ADD (SP)+,R3 ; MOVB V.SPCE+3,V.SPCE+2 ;MOVE BACK TO FIRST DIGIT MOVB #'.,V.SPCE+3 ;PUT IN A DECIMAL POINT MOVB #'E,-1(R5) ;EXPONENT MOVB #'+,(R5)+ ;ASSUME POSITIVE TST R3 BPL 10$ MOVB #'-,-1(R5) ;NO, NEGATIVE NEG R3 10$: CLR R2 ;PUT IN EXPONENT DIV #10.,R2 ADD #'0,R2 MOVB R2,(R5)+ ADD #'0,R3 MOVB R3,(R5)+ MOV #V.SPCE,22(SP) ; CMP (SP)+,(SP)+ MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 JMP $$$027 ; .END