OSDN Git Service

V4.0
[fast-forth/master.git] / MSP430-FORTH / SD_430FR5994 / DOUBLE.4TH
index dc05dd8..1721b9a 100644 (file)
@@ -7,11 +7,11 @@
     0<> IF MOV #0,R14 THEN
     MOV R14,0(R15)
     MOV &$180A,R14
-    SUB #309,R14
+    SUB #400,R14
     COLON
     $0D EMIT
-    ABORT" FastForth V3.9 please!"
-    ABORT" build FastForth with DOUBLE_INPUT addon !"
+    ABORT" FastForth V4.0 please!"
+    ABORT" build FastForth with DOUBLE_INPUT addon!"
     RST_RET
     ;
 
 ; -----------------------------------------------------
 ; DOUBLE.4th for MSP_EXP430FR5994
 ; -----------------------------------------------------
+    [DEFINED] {DOUBLE} 
+    [IF] {DOUBLE} [THEN]
 
+    [UNDEFINED] {DOUBLE} [IF]
     MARKER {DOUBLE}
 
-    [UNDEFINED] >R
-    [IF]
+; ------------------------------------------------------------------
+; first we download the set of definitions we need (from CORE_ANS)
+; ------------------------------------------------------------------
+
+    [UNDEFINED] >R [IF]
     CODE >R
     PUSH R14
     MOV @R15+,R14
@@ -32,8 +38,7 @@
     ENDCODE
     [THEN]
 
-    [UNDEFINED] R>
-    [IF]
+    [UNDEFINED] R> [IF]
     CODE R>
     SUB #2,R15
     MOV R14,0(R15)
@@ -42,8 +47,7 @@
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 0<
-    [IF]
+    [UNDEFINED] 0< [IF]
     CODE 0<
     ADD R14,R14
     SUBC R14,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DROP
-    [IF]
+    [UNDEFINED] DROP [IF]
     CODE DROP
     MOV @R15+,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DUP
-    [IF]
+    [UNDEFINED] DUP [IF]
     CODE DUP
 BW1 SUB #2,R15
     MOV R14,0(R15)
@@ -75,149 +77,124 @@ BW1 SUB #2,R15
     ENDCODE
     [THEN]
 
-    [UNDEFINED] NIP
-    [IF]
+    [UNDEFINED] NIP [IF]
     CODE NIP
     ADD #2,R15
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] UM/MOD
-    [IF]
+    [UNDEFINED] UM/MOD [IF]
     CODE UM/MOD
         PUSH #DROP
-        MOV #$403E,R0
+        MOV #$4028,R0
     ENDCODE
     [THEN]
 
-    $180E @ 0<   ; test the switch: $8000 / SYMETRIC DIVISION
-    [IF]                ; $8000 DIVISION
-    [UNDEFINED] FM/MOD
+    $180E @ 0<   ; test the switch: FLOORED/SYMETRIC DIVISION
     [IF]
-    CODE FM/MOD
-    MOV R14,R12
-    MOV @R15,R11
-    CMP #0,R14
-    S< IF
-        XOR #-1,R14
-        ADD #1,R14
-    THEN
-    CMP #0,0(R15)
-    S< IF
-        XOR #-1,2(R15)
-        XOR #-1,0(R15)
-        ADD #1,2(R15)
-        ADDC #0,0(R15)
-    THEN
-    PUSHM #3,R13
-    LO2HI
-        UM/MOD
-    HI2LO
-    POPM #3,R13
-    CMP #0,R11
-    S< IF
-        XOR #-1,0(R15)
-        ADD #1,0(R15)
-    THEN
-    XOR R12,R11
-    CMP #0,R11
-    S< IF
-        XOR #-1,R14
-        ADD #1,R14
-    THEN
-
-    CMP #0,0(R15)
-    0<> IF
-        CMP #1,R14
+        [UNDEFINED] FM/MOD [IF]
+        CODE FM/MOD
+        MOV R14,R12
+        MOV @R15,R11
+        CMP #0,R14
         S< IF
-        ADD R12,0(R15)
-        SUB #1,R14
+            XOR #-1,R14
+            ADD #1,R14
         THEN
-    THEN
-    MOV @R13+,R0
-    ENDCODE
-    [THEN]
+        CMP #0,0(R15)
+        S< IF
+            XOR #-1,2(R15)
+            XOR #-1,0(R15)
+            ADD #1,2(R15)
+            ADDC #0,0(R15)
+        THEN
+        PUSHM #3,R13
+        LO2HI
+            UM/MOD
+        HI2LO
+        POPM #3,R13
+        CMP #0,R11
+        S< IF
+            XOR #-1,0(R15)
+            ADD #1,0(R15)
+        THEN
+        XOR R12,R11
+        CMP #0,R11
+        S< IF
+            XOR #-1,R14
+            ADD #1,R14
+        THEN
+    
+        CMP #0,0(R15)
+        0<> IF
+            CMP #1,R14
+            S< IF
+            ADD R12,0(R15)
+            SUB #1,R14
+            THEN
+        THEN
+        MOV @R13+,R0
+        ENDCODE
+        [THEN]
 
-    [ELSE]              ; SYMETRIC DIVISION
-    [UNDEFINED] SM/REM
-    [IF]
-    CODE SM/REM
-    MOV R14,R12
-    MOV @R15,R11
-    CMP #0,R14
-    S< IF
-        XOR #-1,R14
-        ADD #1,R14
-    THEN
-    CMP #0,0(R15)
-    S< IF
-        XOR #-1,2(R15)
-        XOR #-1,0(R15)
-        ADD #1,2(R15)
-        ADDC #0,0(R15)
-    THEN
-    PUSHM #3,R13
-    LO2HI
-        UM/MOD
-    HI2LO
-    POPM #3,R13
-    CMP #0,R11
-    S< IF
-        XOR #-1,0(R15)
-        ADD #1,0(R15)
-    THEN
-    XOR R12,R11
-    CMP #0,R11
-    S< IF
-        XOR #-1,R14
-        ADD #1,R14
-    THEN
-    MOV @R13+,R0
-    ENDCODE
-    [THEN]
+    [ELSE]
+        [UNDEFINED] SM/REM [IF]
+        CODE SM/REM
+        MOV R14,R12
+        MOV @R15,R11
+        CMP #0,R14
+        S< IF
+            XOR #-1,R14
+            ADD #1,R14
+        THEN
+        CMP #0,0(R15)
+        S< IF
+            XOR #-1,2(R15)
+            XOR #-1,0(R15)
+            ADD #1,2(R15)
+            ADDC #0,0(R15)
+        THEN
+        PUSHM #3,R13
+        LO2HI
+            UM/MOD
+        HI2LO
+        POPM #3,R13
+        CMP #0,R11
+        S< IF
+            XOR #-1,0(R15)
+            ADD #1,0(R15)
+        THEN
+        XOR R12,R11
+        CMP #0,R11
+        S< IF
+            XOR #-1,R14
+            ADD #1,R14
+        THEN
+        MOV @R13+,R0
+        ENDCODE
+        [THEN]
     [THEN]
 
-    [UNDEFINED] /
-    [IF]
+    [UNDEFINED] / [IF]
     : /
     >R DUP 0< R>
-    [ $180E @ 0< ] [IF]
-        FM/MOD
-    [ELSE]
-        SM/REM
+    [ $180E @ 0< ]
+    [IF]    FM/MOD
+    [ELSE]  SM/REM
     [THEN]
     NIP
     ;
     [THEN]
 
-    [UNDEFINED] @
-    [IF]
-    CODE @
-    MOV @R14,R14
-    MOV @R13+,R0
-    ENDCODE
-    [THEN]
-
-    [UNDEFINED] !
-    [IF]
-    CODE !
-    MOV @R15+,0(R14)
-    MOV @R15+,R14
-    MOV @R13+,R0
-    ENDCODE
-    [THEN]
-
-    [UNDEFINED] C@
-    [IF]
+    [UNDEFINED] C@ [IF]
     CODE C@
     MOV.B @R14,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] SWAP
-    [IF]
+    [UNDEFINED] SWAP [IF]
     CODE SWAP
     MOV @R15,R10
     MOV R14,0(R15)
@@ -226,8 +203,7 @@ BW1 SUB #2,R15
     ENDCODE
     [THEN]
 
-    [UNDEFINED] OVER
-    [IF]
+    [UNDEFINED] OVER [IF]
     CODE OVER
     MOV R14,-2(R15)
     MOV @R15,R14
@@ -236,8 +212,7 @@ BW1 SUB #2,R15
     ENDCODE
     [THEN]
 
-    [UNDEFINED] ROT
-    [IF]
+    [UNDEFINED] ROT [IF]
     CODE ROT
     MOV @R15,R10
     MOV R14,0(R15)
@@ -247,8 +222,7 @@ BW1 SUB #2,R15
     ENDCODE
     [THEN]
 
-    [UNDEFINED] -
-    [IF]
+    [UNDEFINED] - [IF]
     CODE -
     SUB @R15+,R14
     XOR #-1,R14
@@ -257,8 +231,7 @@ BW1 SUB #2,R15
     ENDCODE
     [THEN]
 
-    [UNDEFINED] <
-    [IF]
+    [UNDEFINED] < [IF]
     CODE <
     SUB @R15+,R14
     S< ?GOTO FW1
@@ -276,31 +249,29 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] IF
-    [IF]
+    [UNDEFINED] IF [IF]
     CODE IF
     SUB #2,R15
     MOV R14,0(R15)
-    MOV &$1DC8,R14
-    ADD #4,&$1DC8
-    MOV #$40AC,0(R14)
+    MOV &$1DC0,R14
+    ADD #4,&$1DC0
+    MOV #$4096,0(R14)
     ADD #2,R14
     MOV @R13+,R0
     ENDCODE IMMEDIATE
 
     CODE THEN
-    MOV &$1DC8,0(R14)
+    MOV &$1DC0,0(R14)
     MOV @R15+,R14
     MOV @R13+,R0
     ENDCODE IMMEDIATE
     [THEN]
 
-    [UNDEFINED] ELSE
-    [IF]
+    [UNDEFINED] ELSE [IF]
     CODE ELSE
-    ADD #4,&$1DC8
-    MOV &$1DC8,R10
-    MOV #$40B2,-4(R10)
+    ADD #4,&$1DC0
+    MOV &$1DC0,R10
+    MOV #$409C,-4(R10) 
     MOV R10,0(R14)
     SUB #2,R10
     MOV R10,R14
@@ -308,18 +279,16 @@ FW1 AND #0,R14
     ENDCODE IMMEDIATE
     [THEN]
 
-    [UNDEFINED] TO
-    [IF]
+    [UNDEFINED] TO [IF]
     CODE TO
     BIS #$200,R2
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DOES>
-    [IF]
+    [UNDEFINED] DOES> [IF]
     CODE DOES>
-    MOV &$1DB8,R10
+    MOV &$1DDC,R10
     MOV #$1285,0(R10)
     MOV R13,2(R10)
     MOV @R1+,R13
@@ -327,8 +296,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] SPACES
-    [IF]
+    [UNDEFINED] SPACES [IF]
     CODE SPACES
     CMP #0,R14
     0<> IF
@@ -347,8 +315,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2@
-    [IF]
+    [UNDEFINED] 2@ [IF]
     CODE 2@
     SUB #2,R15
     MOV 2(R14),0(R15)
@@ -357,8 +324,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2!
-    [IF]
+    [UNDEFINED] 2! [IF]
     CODE 2!
     MOV @R15+,0(R14)
     MOV @R15+,2(R14)
@@ -367,8 +333,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2DUP
-    [IF]
+    [UNDEFINED] 2DUP [IF]
     CODE 2DUP
     SUB #4,R15
     MOV R14,2(R15)
@@ -377,8 +342,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2DROP
-    [IF]
+    [UNDEFINED] 2DROP [IF]
     CODE 2DROP
     ADD #2,R15
     MOV @R15+,R14
@@ -386,8 +350,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2SWAP
-    [IF]
+    [UNDEFINED] 2SWAP [IF]
     CODE 2SWAP
     MOV @R15,R10
     MOV 4(R15),0(R15)
@@ -399,8 +362,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2OVER
-    [IF]
+    [UNDEFINED] 2OVER [IF]
     CODE 2OVER
     SUB #4,R15
     MOV R14,2(R15)
@@ -410,8 +372,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2>R
-    [IF]
+    [UNDEFINED] 2>R [IF]
     CODE 2>R
     PUSH @R15+
     PUSH R14
@@ -420,8 +381,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2R@
-    [IF]
+    [UNDEFINED] 2R@ [IF]
     CODE 2R@
     SUB #4,R15
     MOV R14,2(R15)
@@ -431,8 +391,7 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2R>
-    [IF]
+    [UNDEFINED] 2R> [IF]
     CODE 2R>
     SUB #4,R15
     MOV R14,2(R15)
@@ -442,17 +401,22 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
+; --------------------------
+; end of definitions we need
+; --------------------------
 
-    [UNDEFINED] D.
-    [IF]
+; ===============================================
+; DOUBLE word set
+; ===============================================
+
+    [UNDEFINED] D. [IF]
     CODE D.
     MOV R14,R12
-    MOV #U.+10,R0
+    MOV #U.+$0A,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2ROT
-    [IF]
+    [UNDEFINED] 2ROT [IF]
     CODE 2ROT
     MOV 8(R15),R9
     MOV 6(R15),R8
@@ -466,100 +430,70 @@ FW1 AND #0,R14
     ENDCODE
     [THEN]
 
-    [UNDEFINED] D>S
-    [IF]
+    [UNDEFINED] D>S [IF]
     CODE D>S
     MOV @R15+,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] D0=
-    [IF]
+    [UNDEFINED] D0= [IF]
+
     CODE D0=
+    ADD #2,R15
     CMP #0,R14
     MOV #0,R14
     0= IF
-        CMP #0,0(R15)
+        CMP #0,-2(R15)
         0= IF
-            MOV #-1,R14
+BW1         MOV #-1,R14
         THEN
     THEN
-    ADD #2,R15
+BW2 AND #-1,R14
     MOV @R13+,R0
     ENDCODE
-    [THEN]
 
-    [UNDEFINED] D0<
-    [IF]
     CODE D0<
+    ADD #2,R15
     CMP #0,R14
     MOV #0,R14
-    S< IF
-        MOV #-1,R14
-    THEN
-    ADD #2,R15
-    AND #-1,R14
-    MOV @R13+,R0
+    S< ?GOTO BW1
+    GOTO BW2
     ENDCODE
-    [THEN]
 
-    [UNDEFINED] D=
-    [IF]
     CODE D=
-    CMP R14,2(R15)
-    MOV #0,R14
-    0= IF
-        CMP @R15,4(R15)
-        0= IF
-        MOV #-1,R14
-        THEN
-    THEN
     ADD #6,R15
-    MOV @R13+,R0
+    CMP R14,-4(R15)
+    MOV #0,R14
+    0<> ?GOTO BW2
+    CMP -6(R15),-2(R15)
+    0= ?GOTO BW1
+    GOTO BW2
     ENDCODE
-    [THEN]
 
-    [UNDEFINED] D<
-    [IF]
     CODE D<
-    CMP R14,2(R15)
+    ADD #6,R15
+    CMP R14,-4(R15)
     MOV #0,R14
     S< IF
-        MOV #-1,R14
+BW1     MOV #-1,R14
     THEN
-    0= IF
-        CMP @R15,4(R15)
-        U< IF
-            MOV #-1,R14
-        THEN
-    THEN
-    ADD #6,R15
-    MOV @R13+,R0
+BW3 0<> ?GOTO BW2
+    CMP -6(R15),-2(R15)
+    U>= ?GOTO BW2
+    U< ?GOTO BW1
     ENDCODE
-    [THEN]
 
-    [UNDEFINED] DU<
-    [IF]
     CODE DU<
-    CMP R14,2(R15)
-    MOV #0,R14
-    U< IF
-        MOV #-1,R14
-    THEN
-    0= IF
-        CMP @R15,4(R15)
-        U< IF
-            MOV #-1,R14
-        THEN
-    THEN
     ADD #6,R15
-    MOV @R13+,R0
+    CMP R14,-4(R15)
+    MOV #0,R14
+    U>= ?GOTO BW3
+    U< ?GOTO BW1
     ENDCODE
     [THEN]
 
-    [UNDEFINED] D+
-    [IF]
+    [UNDEFINED] D+ [IF]
     CODE D+
 BW1 ADD @R15+,2(R15)
     ADDC @R15+,R14
@@ -578,8 +512,7 @@ BW1 ADD @R15+,2(R15)
     ENDCODE
     [THEN]
 
-    [UNDEFINED] D-
-    [IF]
+    [UNDEFINED] D- [IF]
     CODE D-
     SUB @R15+,2(R15)
     SUBC R14,0(R15)
@@ -588,30 +521,23 @@ BW1 ADD @R15+,2(R15)
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DNEGATE
-    [IF]
+    [UNDEFINED] DNEGATE [IF]
     CODE DNEGATE
-    XOR #-1,0(R15)
+BW1 XOR #-1,0(R15)
     XOR #-1,R14
     ADD #1,0(R15)
     ADDC #0,R14
     MOV @R13+,R0
     ENDCODE
-    [THEN]
 
-    [UNDEFINED] DABS
-    [IF]
     CODE DABS
     CMP #0,R14
-    0>= IF
-        MOV @R13+,R0
-    THEN
-    MOV #DNEGATE,R0
+    0< ?GOTO BW1
+    MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] D2/
-    [IF]
+    [UNDEFINED] D2/ [IF]
     CODE D2/
     RRA R14
     RRC 0(R15)
@@ -619,8 +545,7 @@ BW1 ADD @R15+,2(R15)
     ENDCODE
     [THEN]
 
-    [UNDEFINED] D2*
-    [IF]
+    [UNDEFINED] D2* [IF]
     CODE D2*
     ADD @R15,0(R15)
     ADDC R14,R14
@@ -628,8 +553,7 @@ BW1 ADD @R15+,2(R15)
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DMAX
-    [IF]
+    [UNDEFINED] DMAX [IF]
     : DMAX
     2OVER 2OVER
     D< IF
@@ -640,8 +564,7 @@ BW1 ADD @R15+,2(R15)
     ;
     [THEN]
 
-    [UNDEFINED] DMIN
-    [IF]
+    [UNDEFINED] DMIN [IF]
     : DMIN
     2OVER 2OVER
     D< IF
@@ -652,83 +575,81 @@ BW1 ADD @R15+,2(R15)
     ;
     [THEN]
 
-    RST_SET
+    [UNDEFINED] M*/ [IF]
 
-    CODE TSTBIT
-    MOV @R15+,R9
-    AND @R9,R14
-    MOV @R13+,R0
-    ENDCODE
+        RST_SET
 
-    $180E 1 TSTBIT
+        CODE TSTBIT
+        MOV @R15+,R9
+        AND @R9,R14
+        MOV @R13+,R0
+        ENDCODE
 
-    RST_RET
+        $180E 8 TSTBIT
 
-    [IF]   ; MSP430FRxxxx with hardware_MPY
-
-        [UNDEFINED] M*/
-        [IF]
-    CODE M*/
-    MOV 4(R15),&$4D4
-    MOV 2(R15),&$4D6
-    MOV @R15+,&$4C8
-    MOV R14,R11
-    MOV R0,R0
-    MOV &$4E4,R12
-    MOV &$4E6,R14
-    MOV &$4E8,R10
-    MOV #0,R6
-    CMP #0,R10
-    S< IF
-        XOR #-1,R12
-        XOR #-1,R14
-        XOR #-1,R10
-        ADD #1,R12
-        ADDC #0,R14
-        ADDC #0,R10
-        MOV #-1,R6
-    THEN
+        RST_RET
 
-    [ELSE]  ; no hardware multiplier
-        [UNDEFINED] M*/
-        [IF]
-    CODE M*/
-    MOV #0,R6
-    CMP #0,2(R15)
-    S< IF
-        XOR #-1,4(R15)
-        XOR #-1,2(R15)
-        ADD #1,4(R15)
-        ADDC #0,2(R15)
-        MOV #-1,R6
-    THEN
-    CMP #0,0(R15)
-    S< IF
-        XOR #-1,0(R15)
-        ADD #1,0(R15)
-        XOR #-1,R6
-    THEN
-                MOV 4(R15),R8
-                MOV 2(R15),R11
-                MOV @R15+,R12
-                MOV #0,R5
-                MOV #0,2(R15)
-                MOV #0,0(R15)
-                MOV #0,R10
-                MOV #1,R9
-    BEGIN       BIT R9,R12
-        0<> IF  ADD R8,2(R15)
-                ADDC R11,0(R15)
-                ADDC R5,R10
-        THEN    ADD R8,R8
-                ADDC R11,R11
-                ADDC R5,R5
-                ADD R9,R9
-    U>= UNTIL
-    MOV R14,R11
-    MOV @R15,R14
-    MOV 2(R15),R12
-        [THEN]
+        [IF]   ; MSP430FRxxxx with hardware_MPY
+
+        CODE M*/
+        MOV 4(R15),&$4D4
+        MOV 2(R15),&$4D6
+        MOV @R15+,&$4C8
+        MOV R14,R11
+        MOV R0,R0
+        MOV &$4E4,R12
+        MOV &$4E6,R14
+        MOV &$4E8,R10
+        MOV #0,R6
+        CMP #0,R10
+        S< IF
+            XOR #-1,R12
+            XOR #-1,R14
+            XOR #-1,R10
+            ADD #1,R12
+            ADDC #0,R14
+            ADDC #0,R10
+            MOV #-1,R6
+        THEN
+
+        [ELSE]  ; no hardware multiplier
+
+        CODE M*/
+        MOV #0,R6
+        CMP #0,2(R15)
+        S< IF
+            XOR #-1,4(R15)
+            XOR #-1,2(R15)
+            ADD #1,4(R15)
+            ADDC #0,2(R15)
+            MOV #-1,R6
+        THEN
+        CMP #0,0(R15)
+        S< IF
+            XOR #-1,0(R15)
+            ADD #1,0(R15)
+            XOR #-1,R6
+        THEN
+                    MOV 4(R15),R8
+                    MOV 2(R15),R11
+                    MOV @R15+,R12
+                    MOV #0,R5
+                    MOV #0,2(R15)
+                    MOV #0,0(R15)
+                    MOV #0,R10
+                    MOV #1,R9
+        BEGIN       BIT R9,R12
+            0<> IF  ADD R8,2(R15)
+                    ADDC R11,0(R15)
+                    ADDC R5,R10
+            THEN    ADD R8,R8
+                    ADDC R11,R11
+                    ADDC R5,R5
+                    ADD R9,R9
+        U>= UNTIL
+        MOV R14,R11
+        MOV @R15,R14
+        MOV 2(R15),R12
 
         [THEN]  ; endcase of software/hardware_MPY
 
@@ -736,9 +657,9 @@ BW1 ADD @R15+,2(R15)
     CMP #0,R10
     0= IF
         MOV R14,R10
-        CALL #$4050
+        CALL #$403A
     ELSE
-        CALL #$4058
+        CALL #$4042
     THEN
     MOV @R15+,0(R15)
     CMP #0,R6
@@ -756,25 +677,23 @@ BW1 ADD @R15+,2(R15)
             THEN
         THEN
     THEN
-    MOV #$40B6,R5
-    MOV #$40C4,R6
+    MOV #$40A0,R5
+    MOV #$40AE,R6
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2VARIABLE
-    [IF]
+    [UNDEFINED] 2VARIABLE [IF]
     : 2VARIABLE
     CREATE
     HI2LO
-    ADD #4,&$1DC8
+    ADD #4,&$1DC0
     MOV @R1+,R13
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 2CONSTANT
-    [IF]
+    [UNDEFINED] 2CONSTANT [IF]
     : 2CONSTANT
     CREATE
     , ,
@@ -783,8 +702,7 @@ BW1 ADD @R15+,2(R15)
     ;
     [THEN]
 
-    [UNDEFINED] 2VALUE
-    [IF]
+    [UNDEFINED] 2VALUE [IF]
     : 2VALUE
     CREATE , ,
     DOES>
@@ -800,17 +718,15 @@ BW1 ADD @R15+,2(R15)
     [THEN]
 
 
-    [UNDEFINED] 2LITERAL
-    [IF]
-        CODE 2LITERAL
-        BIS #$200,R2
-        MOV #LITERAL,R0
-        ENDCODE IMMEDIATE
+    [UNDEFINED] 2LITERAL [IF]
+    CODE 2LITERAL
+    BIS #$200,R2
+    MOV #LITERAL,R0
+    ENDCODE IMMEDIATE
     [THEN]
 
 
-    [UNDEFINED] D.R
-    [IF]
+    [UNDEFINED] D.R [IF]
     : D.R
     >R SWAP OVER DABS <# #S ROT SIGN #>
     R> OVER - SPACES TYPE
@@ -819,10 +735,22 @@ BW1 ADD @R15+,2(R15)
 
     RST_SET
 
+    [THEN]
+
+; -------------------------------
 ; Complement to pass DOUBLE TESTS
+; -------------------------------
 
-    [UNDEFINED] VARIABLE
-    [IF]
+    [UNDEFINED] SWAP [IF]
+    CODE SWAP
+    MOV @R15,R10
+    MOV R14,0(R15)
+    MOV R10,R14
+    MOV @R13+,R0
+    ENDCODE
+    [THEN]
+
+    [UNDEFINED] VARIABLE [IF]
     : VARIABLE
     CREATE
     HI2LO
@@ -832,8 +760,7 @@ BW1 ADD @R15+,2(R15)
     ENDCODE
     [THEN]
 
-    [UNDEFINED] CONSTANT
-    [IF]
+    [UNDEFINED] CONSTANT [IF]
     : CONSTANT
     CREATE
     HI2LO
@@ -844,16 +771,14 @@ BW1 ADD @R15+,2(R15)
     ENDCODE
     [THEN]
 
-    [UNDEFINED] CELLS
-    [IF]
+    [UNDEFINED] CELLS [IF]
     CODE CELLS
     ADD R14,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DEPTH
-    [IF]
+    [UNDEFINED] DEPTH [IF]
     CODE DEPTH
     MOV R14,-2(R15)
     MOV #$1C80,R14
@@ -864,8 +789,37 @@ BW1 ADD @R15+,2(R15)
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DO
-    [IF]
+    [UNDEFINED] IF [IF]
+    CODE IF
+    SUB #2,R15
+    MOV R14,0(R15)
+    MOV &$1DC0,R14
+    ADD #4,&$1DC0
+    MOV #$4096,0(R14)
+    ADD #2,R14
+    MOV @R13+,R0
+    ENDCODE IMMEDIATE
+
+    CODE THEN
+    MOV &$1DC0,0(R14)
+    MOV @R15+,R14
+    MOV @R13+,R0
+    ENDCODE IMMEDIATE
+    [THEN]
+
+    [UNDEFINED] ELSE [IF]
+    CODE ELSE
+    ADD #4,&$1DC0
+    MOV &$1DC0,R10
+    MOV #$409C,-4(R10)
+    MOV R10,0(R14)
+    SUB #2,R10
+    MOV R10,R14
+    MOV @R13+,R0
+    ENDCODE IMMEDIATE
+    [THEN]
+
+    [UNDEFINED] DO [IF]
 
     HDNCODE XDO
     MOV #$8000,R9
@@ -880,8 +834,8 @@ BW1 ADD @R15+,2(R15)
     CODE DO
     SUB #2,R15
     MOV R14,0(R15)
-    ADD #2,&$1DC8
-    MOV &$1DC8,R14
+    ADD #2,&$1DC0
+    MOV &$1DC0,R14
     MOV #XDO,-2(R14)
     ADD #2,&$1C00
     MOV &$1C00,R10
@@ -903,8 +857,8 @@ BW1 BIT #$100,R2
 
     CODE LOOP
     MOV #XLOOP,R9
-BW2 ADD #4,&$1DC8
-    MOV &$1DC8,R10
+BW2 ADD #4,&$1DC0
+    MOV &$1DC0,R10
     MOV R9,-4(R10)
     MOV R14,-2(R10)
     BEGIN
@@ -931,8 +885,7 @@ BW2 ADD #4,&$1DC8
     ENDCODE IMMEDIATE
     [THEN]
 
-    [UNDEFINED] I
-    [IF]
+    [UNDEFINED] I [IF]
     CODE I
     SUB #2,R15
     MOV R14,0(R15)
@@ -942,16 +895,14 @@ BW2 ADD #4,&$1DC8
     ENDCODE
     [THEN]
 
-    [UNDEFINED] +
-    [IF]
+    [UNDEFINED] + [IF]
     CODE +
     ADD @R15+,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] =
-    [IF]
+    [UNDEFINED] = [IF]
     CODE =
     SUB @R15+,R14
     0<> IF
@@ -963,8 +914,7 @@ BW2 ADD #4,&$1DC8
     ENDCODE
     [THEN]
 
-    [UNDEFINED] 0=
-    [IF]
+    [UNDEFINED] 0= [IF]
     CODE 0=
     SUB #1,R14
     SUBC R14,R14
@@ -972,62 +922,54 @@ BW2 ADD #4,&$1DC8
     ENDCODE
     [THEN]
 
-    [UNDEFINED] SOURCE
-    [IF]
+    [UNDEFINED] SOURCE [IF]
     CODE SOURCE
     SUB #4,R15
     MOV R14,2(R15)
-    MOV &$1DC2,R14
-    MOV &$1DC4,0(R15)
+    MOV &$1DBA,R14
+    MOV &$1DBC,0(R15)
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] >IN
-    [IF]
-    $1DC6 CONSTANT >IN
+    [UNDEFINED] >IN [IF]
+    $1DBE CONSTANT >IN
     [THEN]
 
-    [UNDEFINED] 1+
-    [IF]
+    [UNDEFINED] 1+ [IF]
     CODE 1+
     ADD #1,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] CHAR
-    [IF]
+    [UNDEFINED] CHAR [IF]
     : CHAR
         $20 WORD 1+ C@
     ;
     [THEN]
 
-    [UNDEFINED] [CHAR]
-    [IF]
+    [UNDEFINED] [CHAR] [IF]
     : [CHAR]
         CHAR POSTPONE LITERAL
     ; IMMEDIATE
     [THEN]
 
-    [UNDEFINED] 2/
-    [IF]
+    [UNDEFINED] 2/ [IF]
     CODE 2/
     RRA R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] INVERT
-    [IF]
+    [UNDEFINED] INVERT [IF]
     CODE INVERT
     XOR #-1,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] RSHIFT
-    [IF]
+    [UNDEFINED] RSHIFT [IF]
     CODE RSHIFT
     MOV @R15+,R10
     AND #$1F,R14
@@ -1043,23 +985,20 @@ BW2 ADD #4,&$1DC8
     ENDCODE
     [THEN]
 
-    [UNDEFINED] S>D
-    [IF]
+    [UNDEFINED] S>D [IF]
     : S>D
         DUP 0<
     ;
     [THEN]
 
-    [UNDEFINED] 1-
-    [IF]
+    [UNDEFINED] 1- [IF]
     CODE 1-
     SUB #1,R14
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] NEGATE
-    [IF]
+    [UNDEFINED] NEGATE [IF]
     CODE NEGATE
     XOR #-1,R14
     ADD #1,R14
@@ -1067,22 +1006,19 @@ BW2 ADD #4,&$1DC8
     ENDCODE
     [THEN]
 
-    [UNDEFINED] HERE
-    [IF]
+    [UNDEFINED] HERE [IF]
     CODE HERE
-    MOV #$4032,R0
+    MOV #BEGIN,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] CHARS
-    [IF]
+    [UNDEFINED] CHARS [IF]
     CODE CHARS
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] MOVE
-    [IF]
+    [UNDEFINED] MOVE [IF]
     CODE MOVE
     MOV R14,R10
     MOV @R15+,R8
@@ -1114,40 +1050,37 @@ BW2 ADD #4,&$1DC8
     ENDCODE
     [THEN]
 
-    [UNDEFINED] DECIMAL
-    [IF]
+    [UNDEFINED] DECIMAL [IF]
     CODE DECIMAL
-    MOV #$0A,&$1DBE
+    MOV #$0A,&$1DB6
     MOV @R13+,R0
     ENDCODE
     [THEN]
 
-    [UNDEFINED] BASE
-    [IF]
-    $1DBE CONSTANT BASE
+    [UNDEFINED] BASE [IF]
+    $1DB6 CONSTANT BASE
     [THEN]
 
-    [UNDEFINED] ( ; )
-    [IF]
+    [UNDEFINED] ( [IF]
     : (
     ')' WORD DROP
     ; IMMEDIATE
     [THEN]
 
-    [UNDEFINED] .( ; "
-    [IF]
+    [UNDEFINED] .( [IF] ; "
     CODE .(        ; "
-    MOV #0,&$1DC0
+    MOV #0,&$1DB8
     COLON
     ')' WORD
     COUNT TYPE
-    $20 $1DC0 !
+    $20 $1DB8 !
     ; IMMEDIATE
     [THEN]
 
-    [UNDEFINED] CR
-    [IF]
-    DEFER CR
+    [UNDEFINED] CR [IF]
+    CODE CR
+    MOV #$409E,R0
+    ENDCODE
 
     :NONAME
     $0D EMIT $0A EMIT
@@ -1204,6 +1137,7 @@ MIN-INTD 2/     CONSTANT LO-INT
 
 ECHO
 
+; ----------------------------------------------------------------------------
 TESTING interpreter and compiler reading double numbers, with/without prefixes
 
 T{ 1. -> 1 0 }T
@@ -1219,8 +1153,10 @@ T{ $12aBcDeF. -> 313249263. }T
 T{ $-12AbCdEf. -> -313249263. }T
 T{ %10010110. -> 150. }T
 T{ %-10010110. -> -150. }T
+; Check BASE is unchanged
 T{ BASE @ OLD-DBASE @ = -> TRUE }T
 
+; Repeat in Hex mode
 16 OLD-DBASE ! 16 BASE !
 T{ #12346789. -> BC65A5. }T
 T{ #-12346789. -> -BC65A5. }T
@@ -1228,11 +1164,14 @@ T{ $12aBcDeF. -> 12AbCdeF. }T
 T{ $-12AbCdEf. -> -12ABCDef. }T
 T{ %10010110. -> 96. }T
 T{ %-10010110. -> -96. }T
+; Check BASE is unchanged
 T{ BASE @ OLD-DBASE @ = -> TRUE }T
 
 DECIMAL
+; Check number prefixes in compile mode
 T{ : dnmp  #8327. $-2cbe. %011010111. ; dnmp -> 8327. -11454. 215. }T
 
+; ----------------------------------------------------------------------------
 TESTING 2CONSTANT
 
 T{ 1 2 2CONSTANT 2C1 -> }T
@@ -1245,12 +1184,15 @@ T{ 2C2 -> -1 -2 }T
 T{ 4 5 2CONSTANT 2C3 IMMEDIATE 2C3 -> 4 5 }T
 T{ : CD6 2C3 2LITERAL ; CD6 -> 4 5 }T
 
+; ----------------------------------------------------------------------------
+; Some 2CONSTANTs for the following tests
 
 1SD MAX-INTD 2CONSTANT MAX-2INT
 0   MIN-INTD 2CONSTANT MIN-2INT
 MAX-2INT 2/  2CONSTANT HI-2INT
 MIN-2INT 2/  2CONSTANT LO-2INT
 
+; ----------------------------------------------------------------------------
 TESTING DNEGATE
 
 T{ 0. DNEGATE -> 0. }T
@@ -1259,6 +1201,7 @@ T{ -1. DNEGATE -> 1. }T
 T{ MAX-2INT DNEGATE -> MIN-2INT SWAP 1+ SWAP }T
 T{ MIN-2INT SWAP 1+ SWAP DNEGATE -> MAX-2INT }T
 
+; ----------------------------------------------------------------------------
 TESTING D+ with small integers
 
 T{  0.  5. D+ ->  5. }T
@@ -1292,6 +1235,7 @@ T{ MAX-2INT LO-2INT D+ -> HI-2INT }T
 T{ HI-2INT MIN-2INT D+ 1. D+ -> LO-2INT }T
 T{ LO-2INT 2DUP D+ -> MIN-2INT }T
 
+; ----------------------------------------------------------------------------
 TESTING D- with small integers
 
 T{  0.  5. D- -> -5. }T
@@ -1327,6 +1271,7 @@ T{ LO-2INT  HI-2INT  D- -> MIN-2INT 1. D+ }T
 T{ MIN-2INT MIN-2INT D- -> 0. }T
 T{ MIN-2INT LO-2INT  D- -> LO-2INT }T
 
+; ----------------------------------------------------------------------------
 TESTING D0< D0=
 
 T{ 0. D0< -> FALSE }T
@@ -1345,6 +1290,7 @@ T{ 0. D0= -> TRUE }T
 T{ -1. D0= -> FALSE }T
 T{ 0 MIN-INTD D0= -> FALSE }T
 
+; ----------------------------------------------------------------------------
 TESTING D2* D2/
 
 T{ 0. D2* -> 0. D2* }T
@@ -1359,6 +1305,7 @@ T{ MAX-2INT D2/ -> HI-2INT }T
 T{ -1. D2/ -> -1. }T
 T{ MIN-2INT D2/ -> LO-2INT }T
 
+; ----------------------------------------------------------------------------
 TESTING D< D=
 
 T{  0.  1. D< -> TRUE  }T
@@ -1409,6 +1356,7 @@ T{ MIN-2INT MIN-2INT D= -> TRUE }T
 T{ MIN-2INT LO-2INT  D=  -> FALSE }T
 T{ MIN-2INT MAX-2INT D= -> FALSE }T
 
+; ----------------------------------------------------------------------------
 TESTING 2LITERAL 2VARIABLE
 
 T{ : CD3 [ MAX-2INT ] 2LITERAL ; -> }T
@@ -1428,6 +1376,7 @@ T{ 2V3 2@ -> 5 6 }T
 T{ : CD7 2V3 [ 2@ ] 2LITERAL ; CD7 -> 5 6 }T
 T{ : CD8 [ 6 7 ] 2V3 [ 2! ] ; 2V3 2@ -> 6 7 }T
 
+; ----------------------------------------------------------------------------
 TESTING DMAX DMIN
 
 T{  1.  2. DMAX -> 2. }T
@@ -1469,6 +1418,7 @@ T{ MAX-2INT -1. DMIN -> -1. }T
 T{ MIN-2INT  1. DMIN -> MIN-2INT }T
 T{ MIN-2INT -1. DMIN -> MIN-2INT }T
 
+; ----------------------------------------------------------------------------
 TESTING D>S DABS
 
 T{  1234  0 D>S ->  1234 }T
@@ -1481,6 +1431,7 @@ T{ -1. DABS -> 1. }T
 T{ MAX-2INT DABS -> MAX-2INT }T
 T{ MIN-2INT 1. D+ DABS -> MAX-2INT }T
 
+; ----------------------------------------------------------------------------
 TESTING M+ M*/
 
 T{ HI-2INT   1 M+ -> HI-2INT   1. D+ }T
@@ -1488,6 +1439,8 @@ T{ MAX-2INT -1 M+ -> MAX-2INT -1. D+ }T
 T{ MIN-2INT  1 M+ -> MIN-2INT  1. D+ }T
 T{ LO-2INT  -1 M+ -> LO-2INT  -1. D+ }T
 
+; To correct the result if the division is floored, only used when
+; necessary i.e. negative quotient and remainder <> 0
 
 : ?$8000 [ -3 2 / -2 = ] LITERAL IF 1. D- THEN ;
 
@@ -1506,8 +1459,10 @@ T{ MIN-2INT LO-2INT NIP 1- MAX-INTD M*/ -> MIN-INTD 3 + HI-2INT NIP 2 + }T
 T{ MAX-2INT LO-2INT NIP DUP NEGATE M*/ -> MAX-2INT DNEGATE }T
 T{ MIN-2INT MAX-INTD DUP M*/ -> MIN-2INT }T
 
+; ----------------------------------------------------------------------------
 TESTING D. D.R
 
+; Create some large double numbers
 MAX-2INT 71 73 M*/ 2CONSTANT DBL1
 MIN-2INT 73 79 M*/ 2CONSTANT DBL2
 
@@ -1532,7 +1487,7 @@ DBL2 D>ASCII 2CONSTANT "DBL2"
 ;
 
 T{ DOUBLEOUTPUT -> }T
-
+; ----------------------------------------------------------------------------
 TESTING 2ROT DU< (Double Number extension words)
 
 T{ 1. 2. 3. 2ROT -> 2. 3. 1. }T
@@ -1553,6 +1508,7 @@ T{ MAX-2INT MIN-2INT DU< -> TRUE }T
 T{ MIN-2INT MAX-2INT DU< -> FALSE }T
 T{ MIN-2INT LO-2INT  DU< -> TRUE }T
 
+; ----------------------------------------------------------------------------
 TESTING 2VALUE
 
 T{ 1111 2222 2VALUE 2VAL -> }T
@@ -1562,5 +1518,4 @@ T{ 2VAL -> 3333 4444 }T
 T{ : TO-2VAL TO 2VAL ; 5555 6666 TO-2VAL -> }T
 T{ 2VAL -> 5555 6666 }T
 
-
 CR .( End of Double-Number word tests) CR