.TITLE CVSF .MCALL .TLQ ;CONVERTS STRING CVSFS TO REAL CVSFF .GLOBL .CVSF PT=R4 A0=R0 A1=R1 CVSFF: .BLKW 2 CVSFS: .BLKW 1 .CVSF: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) STF A0,-(SP) STF A1,-(SP) MOV CVSFS,R0 ;R0 = ADDR. OF STRING S CLRF A0 ;A0 WILL CONTAIN END RESULT CLR R3 ;R3 WILL CONTAIN THE EXPONENT CLR NEGEXP ;NEGEXP = ZERO FOR NONNEGATIVE EXPONENT CMPB (R0),#'- ;-? BNE NEXDIG INC R0 ;SKIP OVER MINUS SIGN FOR NOW NEXDIG: TSTB (R0) BEQ FINALE CMPB (R0),#'E ;E? BEQ AFTERE CMPB (R0),#'e ;e? BEQ AFTERE CMPB (R0),#'. ;.? BEQ AFTERD CALL TSTDIG BNE ILLEG MOVB (R0)+,R1 SUB #60,R1 ;IF LEGAL,CONVERTS ASCII CODE TO DIGIT LDCIF R1,A1 MULF TEN,A0 CFCC BVS ILLEG ADDF A1,A0 CFCC BVS ILLEG BR NEXDIG AFTERD: CLR R2 ;R2 = ADDR FOR TABLE LOOKUP OF POWER OF 10 LOOPAD: INC R0 TSTB (R0) BEQ FINALE CMPB (R0),#'E ;E? BEQ AFTERE CMPB (R0),#'e ;e? BEQ AFTERE CALL TSTDIG BNE ILLEG MOVB (R0),R1 SUB #60,R1 LDCIF R1,A1 SUB #4,R2 ;MOVE TO NEXT PLACE TO LEFT OF DECIMAL POINT CMP R2,#-38.*4 ;IS NUMBER WITHIN RANGE? BLT LOOPAD ;DISCARD DIGITS IF TOO SMALL MULF POWR10(R2),A1 ;DO TABLE LOOKUP OF POWER OF 10 FOR THIS DIGIT CFCC BVS ILLEG ADDF A1,A0 CFCC BVS ILLEG BR LOOPAD AFTERE: INC R0 TSTB (R0) BEQ FINALE CMPB (R0),#'- ;-? BNE PASS DEC NEGEXP INC R0 PASS: TSTB (R0) BEQ FINALE CALL TSTDIG BNE ILLEG MOVB (R0)+,R1 SUB #60,R1 MUL #10.,R3 ADD R1,R3 CMP R3,#38. ;EXPONENT < +- 38 BGT ILLEG BR PASS FINALE: TST NEGEXP BEQ QWB NEG R3 ;NEGATE EXPONENT QWB: ASH #2,R3 ;DO TABLE LOOKUP OF POWER OF TEN FROM POWR10 MULF POWR10(R3),A0 ;MULTIPLY POWER OF TEN BY FRACTIONAL PART CFCC BVS ILLEG ;OVERFLOW CMPB @CVSFS,#'- ;LAST STEP, TEST FOR MINUS BNE OKAY NEGF A0 OKAY: STF A0,CVSFF ;RESULT RETURNED IN CVSFF CLC BR RETUR ILLEG: .TLQ SEC ;SET C-BIT RETUR: LDF (SP)+,A1 LDF (SP)+,A0 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ;SUBROUTINE TSTDIG TESTS WHETHER THE BYTE AT LOCATION (R0) IS A DIGIT TSTDIG: CMPB (R0),#'0 ;CONDITION CODES: = IF IT IS A DIGIT BLT RET ; < IF LESS THAN ZERO CMPB (R0),#'9 ; > IF MORE THAN NINE BGT RET TST #0 ;CONDITION CODES SET FOR ZERO RET: RETURN NEGEXP: .BLKW 1 ONE: .FLT2 1.0 TEN: .FLT2 10.0 .FLT2 1.0E-38,1.0E-37,1.0E-36,1.0E-35,1.0E-34,1.0E-33,1.0E-32 .FLT2 1.0E-31,1.0E-30,1.0E-29,1.0E-28,1.0E-27,1.0E-26,1.0E-25 .FLT2 1.0E-24,1.0E-23,1.0E-22,1.0E-21,1.0E-20,1.0E-19,1.0E-18 .FLT2 1.0E-17,1.0E-16,1.0E-15,1.0E-14,1.0E-13,1.0E-12,1.0E-11 .FLT2 1.0E-10,1.0E-9,1.0E-8,1.0E-7,1.0E-6,1.0E-5,1.0E-4,1.0E-3 .FLT2 1.0E-2,1.0E-1 POWR10: .FLT2 1.0,1.0E1,1.0E2,1.0E3,1.0E4,1.0E5,1.0E6,1.0E7,1.0E8,1.0E9 .FLT2 1.0E10,1.0E11,1.0E12,1.0E13,1.0E14,1.0E15,1.0E16,1.0E17 .FLT2 1.0E18,1.0E19,1.0E20,1.0E21,1.0E22,1.0E23,1.0E24,1.0E25 .FLT2 1.0E26,1.0E27,1.0E28,1.0E29,1.0E30,1.0E31,1.0E32,1.0E33 .FLT2 1.0E34,1.0E35,1.0E36,1.0E37,1.0E38 IFF: .BLKW 2 .END