diff --git a/VersionASM b/VersionASM index 09b03f0fcc12ac2f287b78516a6c704da8c1fadd..aff3c95a52190665e70abe729b99c600425a8fac 100644 --- a/VersionASM +++ b/VersionASM @@ -11,13 +11,13 @@ GBLS Module_HelpVersion GBLS Module_ComponentName GBLS Module_ComponentPath -Module_MajorVersion SETS "1.64" -Module_Version SETA 164 +Module_MajorVersion SETS "1.65" +Module_Version SETA 165 Module_MinorVersion SETS "" -Module_Date SETS "04 Mar 2017" -Module_ApplicationDate SETS "04-Mar-17" +Module_Date SETS "30 Mar 2017" +Module_ApplicationDate SETS "30-Mar-17" Module_ComponentName SETS "BASIC" Module_ComponentPath SETS "castle/RiscOS/Sources/Programmer/BASIC" -Module_FullVersion SETS "1.64" -Module_HelpVersion SETS "1.64 (04 Mar 2017)" +Module_FullVersion SETS "1.65" +Module_HelpVersion SETS "1.65 (30 Mar 2017)" END diff --git a/VersionNum b/VersionNum index 98227ca397abf42559a9fa33aea4cc03a5991932..667714277a5de1830f37295ac5344cfd9415ca8b 100644 --- a/VersionNum +++ b/VersionNum @@ -1,23 +1,23 @@ -/* (1.64) +/* (1.65) * * This file is automatically maintained by srccommit, do not edit manually. * Last processed by srccommit version: 1.1. * */ -#define Module_MajorVersion_CMHG 1.64 +#define Module_MajorVersion_CMHG 1.65 #define Module_MinorVersion_CMHG -#define Module_Date_CMHG 04 Mar 2017 +#define Module_Date_CMHG 30 Mar 2017 -#define Module_MajorVersion "1.64" -#define Module_Version 164 +#define Module_MajorVersion "1.65" +#define Module_Version 165 #define Module_MinorVersion "" -#define Module_Date "04 Mar 2017" +#define Module_Date "30 Mar 2017" -#define Module_ApplicationDate "04-Mar-17" +#define Module_ApplicationDate "30-Mar-17" #define Module_ComponentName "BASIC" #define Module_ComponentPath "castle/RiscOS/Sources/Programmer/BASIC" -#define Module_FullVersion "1.64" -#define Module_HelpVersion "1.64 (04 Mar 2017)" -#define Module_LibraryVersionInfo "1:64" +#define Module_FullVersion "1.65" +#define Module_HelpVersion "1.65 (30 Mar 2017)" +#define Module_LibraryVersionInfo "1:65" diff --git a/s/fp2 b/s/fp2 index 3594b2c9ee2962ecdc5b39203d99a1904773e804..06e49d71b4ba7d8d4b55345e8e9ebc3b393b181b 100644 --- a/s/fp2 +++ b/s/fp2 @@ -329,17 +329,15 @@ FRANGE MOV FWGRD,FACC,LSL #30 ; to cope with the leading zeros that 'G' format might add (0.0XXXX) before it ; switches to 'E' format. [ FPOINT=0 -MAXDIGS * 10 ; There are some accuracy issues to resolve before we can sensibly use 11 + 2, so stick with historic value of 10 +MAXDIGS * 11 + 2 | MAXDIGS * 17 + 2 ] ;format 0: General format nnnn.nnn fixes maximum number of digits [or use 1] ;format 1: Exponent format n.nnEnn fixes number of digits ;format 2: Fixed format nnnnnn.nnn fixes number of digits after . [or use 1] -FMAT RN R5 +FMAT RN R5 ;Format number FDIGS RN R4 ;(no harm the way currently written) -FPRTDX RN R7 -FPRTWN RN R6 FCONFP TEQ R5,#0 BNE FCONHX MOV FMAT,R4,LSR #16 @@ -359,212 +357,15 @@ FCONFP TEQ R5,#0 BNE FCONA TEQ FMAT,#2 ORRNE FDIGS,FDIGS,#MAXDIGS ;if not in format 2 use maximum digits instead of 0 -FCONA MOV FPRTDX,#0 - STMFD SP!,{FDIGS,R14} ;May need fdigs again +FCONA STMFD SP!,{FDIGS,R14} ;May need fdigs again BL FLOATY - ADD TYPE,ARGP,#STRACC - [ FPOINT=0 - CMP FACC,#0 - BNE FPRTA - TEQ FMAT,#0 - MOVEQ R6,#"0" - STREQB R6,[TYPE],#1 - LDMEQFD SP!,{R6,PC} ;discard fdigs and return for 0 in E format - TEQ FMAT,#1 - BEQ FPRTH - B FPRTZR -FPRTA MOV FGRD,#0 - TEQ FSIGN,#0 - MOVMI FSIGN,#"-" - STRMIB FSIGN,[TYPE],#1 - MOVMI FSIGN,#0 -FPRTC CMP FACCX,#&81 - BCS FPRTD - BL FTENFX - SUB FPRTDX,FPRTDX,#1 - B FPRTC -FPRTD CMP FACCX,#&84 - BCC FPRTF - BNE FPRTE - CMP FACC,#&A0000000 - BCC FPRTF -FPRTE BL FTENFQ - ADD FPRTDX,FPRTDX,#1 - B FPRTC -FPRTEE BL FONE - ADD FPRTDX,FPRTDX,#1 - B FPRTC -;table of round up constant values -FPRTROUNDTAB - & &A0000000 - & &00000083 - & &00000000 - & &00000000 - & &80000000 - & &00000080 - & &00000000 - & &00000000 - & &CCCCCCCC - & &0000007C - & &CCCCCCCD - & &00000000 - & &A3D70A3D - & &00000079 - & &70A3D707 - & &00000000 - & &83126E97 - & &00000076 - & &8D4FDF38 - & &00000000 - & &D1B71758 - & &00000072 - & &E2196525 - & &00000000 - & &A7C5AC47 - & &0000006F - & &1B47841B - & &00000000 - & &8637BD05 - & &0000006C - & &AF6C69AE - & &00000000 - & &D6BF94D5 - & &00000068 - & &E57A42AE - & &00000000 - & &ABCC7711 - & &00000065 - & &8461CEEF - & &00000000 - & &89705F41 - & &00000062 - & &36B4A589 - & &00000000 -FPRTF LDR FDIGS,[SP] ;stacked fdigs - CMP FMAT,#2 - BNE FPRTFH - AND R6,FDIGS,#255 - ADCS R6,R6,FPRTDX ;fix up precision by adding exponent digit count - BMI FPRTZR - CMP R6,#MAXDIGS+1 ;how many digits? - MOVCS R6,#MAXDIGS - MOVCS FMAT,#0 ;treat as G10 format if unreasonable - BIC FDIGS,FDIGS,#255 - ORR FDIGS,FDIGS,R6 -FPRTFH STMFD SP!,{FMAT,FPRTDX,FDIGS,FACC,FGRD,FSIGN,FACCX} ;facc stuff closest - [ {FALSE} -;code to compute round up constants if FTENFQ precision changes - MOV FACC,#&A0000000 - MOV FACCX,#&83 - MOV FGRD,#0 - MOV FSIGN,#0 ;5 to acc - BL FSHOW - ANDS FWACCX,FDIGS,#255 - BEQ FPRTGJ -FPRTGG BL FTENFQ - BL FSHOW - SUBS FWACCX,FWACCX,#1 - BNE FPRTGG - | - ADR FACC,FPRTROUNDTAB - AND R7,FDIGS,#255 - ADD FACC,FACC,R7,LSL #4 - LDMIA FACC,{FACC,FACCX,FGRD,FSIGN} - ] -FPRTGJ LDMFD SP!,{FWACCX,FWSIGN,FWGRD,FWACC} ;since facc stuff was closest - BL FADDW1 -FPRTFF CMP FACCX,#&84 - BLCC FTENFA - BCC FPRTFF ;note that this relies on ftenfa preserving C on exit - LDMFD SP!,{FDIGS,FPRTDX,FMAT} - CMP FACC,#&A0000000 - BCS FPRTEE ;see if unnormalised: fix up if so - TST FDIGS,#255 - BNE FPRTH -FPRTZR LDR FDIGS,[SP] - ADD FDIGS,FDIGS,#1 - BL FCLR - MOV FPRTDX,#0 -FPRTH MOV FPRTWN,#1 - TEQ FMAT,#1 - BEQ FPRTK - TEQ FPRTDX,#0 - BMI FPRTKK - AND FSIGN,FDIGS,#255 - CMP FPRTDX,FSIGN - BCS FPRTK - ADD FPRTWN,FPRTDX,#1 - MOV FPRTDX,#0 - B FPRTK -FPRTKK TEQ FMAT,#2 - BEQ FPRTKL - CMN FPRTDX,#1 - CMNNE FPRTDX,#2 - BNE FPRTK -FPRTKL MOV FPRTWN,FDIGS,LSR #24 ;get . or , - STRB FPRTWN,[TYPE,#1] ;store "0." in string (interestingly!) - MOV FPRTWN,#"0" - STRB FPRTWN,[TYPE],#2 ;put the zero at the beginning and then skip the . -FPRTKM ADDS FPRTDX,FPRTDX,#1 - STRNEB FPRTWN,[TYPE],#1 ;put in 0 if ne 0 - BNE FPRTKM ;round again - MOV FPRTWN,#&80 -FPRTK MOV FSIGN,FACC,LSR #32-4 - ORR FSIGN,FSIGN,#"0" - STRB FSIGN,[TYPE],#1 - BIC FACC,FACC,#&F0000000 - ADDS FGRD,FGRD,FGRD ;40 bit mantissa * 10.0 - ADC FACC,FACC,FACC - MOV FSIGN,FGRD,LSR #32-2 - ORR FSIGN,FSIGN,FACC,LSL #2 - ADDS FGRD,FGRD,FGRD,LSL #2 - ADCS FACC,FACC,FSIGN - SUBS FPRTWN,FPRTWN,#1 - MOVEQ FSIGN,FDIGS,LSR #24 - STREQB FSIGN,[TYPE],#1 - SUB FDIGS,FDIGS,#1 - TST FDIGS,#255 - BNE FPRTK - TEQ FMAT,#1 - BEQ FPRTTX - TEQ FMAT,#2 - BEQ FPRTTY -FPRTTZ LDRB FSIGN,[TYPE,#-1]! - CMP FSIGN,#"0" - BEQ FPRTTZ - CMP FSIGN,FDIGS,LSR #24 - ADDNE TYPE,TYPE,#1 -FPRTTY TEQ FPRTDX,#0 - BEQ FPRTX -FPRTTX MOV FSIGN,#"E" - STRB FSIGN,[TYPE],#1 - ADDS FPRTWN,FPRTDX,#0 - MOVMI FSIGN,#"-" - STRMIB FSIGN,[TYPE],#1 - RSBMI FPRTWN,FPRTWN,#0 - MOV FSIGN,#"0" -IPRTA SUBS FPRTWN,FPRTWN,#10 - ADDCS FSIGN,FSIGN,#1 - BCS IPRTA - TEQ FSIGN,#"0" - STRNEB FSIGN,[TYPE],#1 - ADD FPRTWN,FPRTWN,#"0"+10 - STRB FPRTWN,[TYPE],#1 - TEQ FMAT,#0 - BEQ FPRTX - MOV FGRD,#" " - TEQ FPRTDX,#0 - STRPLB FGRD,[TYPE],#1 - TEQ FSIGN,#"0" - STREQB FGRD,[TYPE],#1 -FPRTX LDMFD SP!,{FDIGS,PC} - | -;format 0: General format nnnn.nnn fixes maximum number of digits [or use 1] -;format 1: Exponent format n.nnEnn fixes number of digits -;format 2: Fixed format nnnnnn.nnn fixes number of digits after . [or use 1] -;FDIGS=R4, FMAT=R5 + [ FPOINT=1 STFP FACC,[SP,#-12]! - LDMFD SP,{R0,R1,R2} + LDMFD SP!,{R0,R1,R2} + | + BL FACCtoBCD + ] + ADD TYPE,ARGP,#STRACC TEQ R0,#0 MOVMI R6,#"-" STRMIB R6,[TYPE],#1 @@ -632,13 +433,15 @@ FPRTFGO MOV R6,R0,LSR #8 BL FPRTBYTE MOV R7,R2,LSR #8 BL FPRTBYTE + [ FPOINT <> 0 ; Last two digits known to be zero for FPOINT=0 MOV R7,R2 BL FPRTBYTE + ] ; For rounding to work we must make sure we have more digits in the ; buffer than MAXDIGS. So just add an extra zero. MOV R6,#0 BL FPRTNIBBLEDOT - LDR R2,[SP],#4 + LDR R2,[SP],#4 ;Recover stashed buffer ptr (could just use ARGP,#STRACC again??) AND R7,FDIGS,#255 ADD TYPE,R2,R7 ADD TYPE,TYPE,#1 ;. must be somewhere @@ -686,12 +489,15 @@ FPRTTX MOV R6,#"E" MOV R6,#" " TST R0,#TINTEGER STREQB R6,[TYPE],#1 + [ FPOINT <> 0 ;1 less char of exponent padding for 5-byte TST R0,#&F00000 STREQB R6,[TYPE],#1 TSTEQ R0,#&F0000 + | + TST R0,#&F0000 + ] STREQB R6,[TYPE],#1 FPRTNOEXPNT - ADD SP,SP,#12 LDMFD SP!,{FDIGS,PC} FPRTRNDPANIC MOV R6,TYPE @@ -727,8 +533,132 @@ FPRTNIBBLE ADD R6,R6,#&30 STRB R6,[TYPE],#1 MOV PC,R14 - ] [ FPOINT=0 +; In: FACC = 5-byte float +; Out: R0-R2 = FPA format packed decimal +; R3,R6-R7,R9 corrupt +; Although packed decimal has room for 19 digits, we only calculate to a precision of 16, to keep things within two registers (and the accuracy of anything beyond digit 11 is questionable anyway) +; Note that no rounding is performed when the mantissa grows to over 16 decimal digits in length; the result is truncated +FACCtoBCD ROUT + AND FSIGN,FSIGN,#&80000000 + STMFD R13!,{FSIGN,FDIGS,FMAT,LR} + MOV R2,#0 ; Digits 0-7 + MOV R3,#0 ; Digits 8-15 + MOVS R4,FACC + BEQ %FT90 + ; Convert FACC to BCD + ADR R5,tens + MOV R7,#0 + MOV R9,#&80000000 + LDR R6,[R5],#4 +10 + CMP R0,R6 + ADDHS R3,R3,R9,LSR #3 + ADDHS R2,R2,R7 + BEQ %FT20 + SUBHI R0,R0,R6 + BHI %BT10 + MOVS R9,R9,LSR #4 + MOV R7,R7,RRX + MOV R7,R7,LSR #3 + LDR R6,[R5],#4 + B %BT10 +20 + MOV R4,#9 ; Decimal exponent + SUBS R1,R1,#129+31 + LDR R9,=&88888888 + LDRGT R7,=&33333333 + BGT %FT50 + BEQ %FT90 + MOV R7,R9,LSR #3 ; &11111111 + ; Divide BCD number by two +30 + AND R0,R3,R7 + BIC R3,R3,R7 + MOVS R0,R0,LSR #1 + MOV R3,R3,LSR #1 + ORR R0,R0,R0,LSR #2 + ADD R3,R3,R0,LSR #1 + + AND R0,R2,R7 + BIC R2,R2,R7 + MOV R0,R0,RRX + MOV R2,R2,LSR #1 + ORR R0,R0,R0,LSR #2 + ADD R2,R2,R0,LSR #1 + + ; Shift left one digit to keep first digit non-zero + TST R3,#&F0000000 + SUBEQ R4,R4,#1 + MOVEQ R3,R3,LSL #4 + ORREQ R3,R3,R2,LSR #28 + MOVEQ R2,R2,LSL #4 + + ADDS R1,R1,#1 + BNE %BT30 + B %FT90 + + ; Multiply BCD number by two +50 + ADD R2,R2,R7 + MVN R0,R2 + AND R0,R0,R9 + MOVS R2,R2,LSL #1 + ORR R0,R0,R0,LSR #1 + SUB R2,R2,R0,LSR #1 + + ADD R3,R3,R7 + MVN R0,R3 + AND R0,R0,R9 + ADCS R3,R3,R3 + ORR R0,R0,R0,LSR #1 + SUB R3,R3,R0,LSR #1 + + ; Shift right one digit if we overflowed + MOVCS R2,R2,LSR #4 + ORRCS R2,R2,R3,LSL #28 + MOVCS R3,R3,LSR #4 + ORRCS R3,R3,#&10000000 + ADDCS R4,R4,#1 + + SUBS R1,R1,#1 + BNE %BT50 + ; Now convert to STFP format +90 + LDR R0,[R13],#4 + MOV R1,R3,LSL #12 + ORR R0,R0,R3,LSR #32-12 + ORR R1,R1,R2,LSR #32-12 + MOV R2,R2,LSL #12 + CMP R4,#0 + ORRLT R0,R0,#1:SHL:30 + RSBLT R4,R4,#0 + BEQ %FT99 + ; Convert exponent to BCD, noddy approach +91 + CMP R4,#100 + SUBHS R4,R4,#100 + ADDHS R0,R0,#1:SHL:20 + BHI %BT91 +92 + CMP R4,#10 + SUBHS R4,R4,#10 + ADDHS R0,R0,#1:SHL:16 + BHI %BT92 + ADD R0,R0,R4,LSL #12 +99 + LDMFD R13!,{FDIGS,FMAT,PC} +tens + DCD 1000000000 + DCD 100000000 + DCD 10000000 + DCD 1000000 + DCD 100000 + DCD 10000 + DCD 1000 + DCD 100 + DCD 10 + DCD 1 ;40 bit FACC:=FACC*10 ;uses only FWGRD FTENFX MOV FWGRD,FACC,ASL #30 @@ -1067,10 +997,7 @@ FRDFPEXPBIN2 SUBHS R7,R7,#10 ADDHS R3,R3,#1:SHL:16 BHS FRDFPEXPBIN2 -FRDFPEXPBIN3 - SUBS R7,R7,#1 - ADDHS R3,R3,#1:SHL:12 - BHS FRDFPEXPBIN3 + ADD R3,R3,R7,LSL #12 STR R3,[SP] B FRDFPDONE ]