2 ; -----------------------------------------------------
3 ; DOUBLE.4th for MSP_EXP430FR5994
4 ; -----------------------------------------------------
6 ; -----------------------------------------------------------
7 ; requires DOUBLE_INPUT kernel addon, see forthMSP430FR.asm
8 ; -----------------------------------------------------------
12 [DEFINED] {DOUBLE} [IF] {DOUBLE} [THEN]
128 [UNDEFINED] ELSE [IF]
147 [UNDEFINED] DOES> [IF]
157 [UNDEFINED] SPACES [IF]
194 [UNDEFINED] 2DUP [IF]
203 [UNDEFINED] 2DROP [IF]
211 [UNDEFINED] 2SWAP [IF]
223 [UNDEFINED] 2OVER [IF]
271 [UNDEFINED] 2ROT [IF]
400 [UNDEFINED] DNEGATE [IF]
410 [UNDEFINED] DABS [IF]
436 [UNDEFINED] DMAX [IF]
447 [UNDEFINED] DMIN [IF]
456 $1A04 C@ $EF > [IF] ; test tag value for MSP430FR413x devices without hardware_MPY
564 [THEN] ; end of software/hardware_MPY
566 [UNDEFINED] 2VARIABLE [IF]
576 [UNDEFINED] 2CONSTANT [IF]
585 [UNDEFINED] 2VALUE [IF]
600 [UNDEFINED] 2LITERAL [IF]
609 >R SWAP OVER DABS <# #S ROT SIGN #>
610 R> OVER - SPACES TYPE
619 [UNDEFINED] VARIABLE [IF]
629 [UNDEFINED] CONSTANT [IF]
640 [UNDEFINED] CELLS [IF]
647 [UNDEFINED] ALLOT [IF]
655 [UNDEFINED] DEPTH [IF]
754 [UNDEFINED] SOURCE [IF]
768 [UNDEFINED] SWAP [IF]
777 [UNDEFINED] DROP [IF]
791 [UNDEFINED] CHAR [IF]
797 [UNDEFINED] [CHAR] [IF]
799 CHAR POSTPONE LITERAL
810 [UNDEFINED] INVERT [IF]
817 [UNDEFINED] RSHIFT [IF]
853 [UNDEFINED] UM/MOD [IF]
860 [UNDEFINED] SM/REM [IF]
896 [UNDEFINED] FM/MOD [IF]
922 >R DUP 0< R> FM/MOD NIP
926 [UNDEFINED] NEGATE [IF]
934 [UNDEFINED] HERE [IF]
940 [UNDEFINED] CHARS [IF]
946 [UNDEFINED] MOVE [IF]
985 VARIABLE ACTUAL-DEPTH
986 CREATE ACTUAL-RESULTS 20 CELLS ALLOT
992 DEPTH DUP ACTUAL-DEPTH !
994 0 DO ACTUAL-RESULTS I CELLS + ! LOOP
999 DEPTH ACTUAL-DEPTH @ = IF
1002 ACTUAL-RESULTS I CELLS + @
1003 = 0= IF TRUE ABORT" INCORRECT RESULT" THEN
1007 TRUE ABORT" WRONG NUMBER OF RESULTS"
1012 IF DUP >R TYPE CR R> >IN !
1013 ELSE >IN ! DROP [CHAR] * EMIT
1019 0 INVERT 1 RSHIFT CONSTANT MAX-INT ; 011...1
1020 0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT ; 100...0
1021 MAX-INT 2/ CONSTANT HI-INT ; 001...1
1022 MIN-INT 2/ CONSTANT LO-INT ; 110...0
1023 -1 MAX-INT 2CONSTANT MAX-2INT ; 011...1
1024 0 MIN-INT 2CONSTANT MIN-2INT ; 100...0
1025 MAX-2INT 2/ 2CONSTANT HI-2INT ; 001...1
1026 MIN-2INT 2/ 2CONSTANT LO-2INT ; 110...0
1030 ; --------------------------------------------------------------------------------
1032 ; --------------------------------------------------------------------------------
1034 T{ 1 2 2CONSTANT 2c1 -> }T
1036 T{ : cd1 2c1 ; -> }T
1039 T{ : cd2 2CONSTANT ; -> }T
1040 T{ -1 -2 cd2 2c2 -> }T
1043 T{ 4 5 2CONSTANT 2c3 IMMEDIATE 2c3 -> 4 5 }T
1044 T{ : cd6 2c3 2LITERAL ; cd6 -> 4 5 }T
1046 T{ 2VARIABLE 2v1 -> }T
1049 T{ -1 -2 2v1 2! -> }T
1050 T{ 2v1 2@ -> -1 -2 }T
1051 T{ : cd2 2VARIABLE ; -> }T
1053 T{ : cd3 2v2 2! ; -> }T
1055 T{ 2v2 2@ -> -2 -1 }T
1057 T{ 2VARIABLE 2v3 IMMEDIATE 5 6 2v3 2! -> }T
1060 T{ : cd1 [ MAX-2INT ] 2LITERAL ; -> }T
1061 T{ cd1 -> MAX-2INT }T
1062 T{ 2VARIABLE 2v4 IMMEDIATE 5 6 2v4 2! -> }T
1063 T{ : cd7 2v4 [ 2@ ] 2LITERAL ; cd7 -> 5 6 }T
1064 T{ : cd8 [ 6 7 ] 2v4 [ 2! ] ; 2v4 2@ -> 6 7 }T
1066 T{ 1 2 2VALUE t2val -> }T
1068 T{ 3 4 TO t2val -> }T
1070 : sett2val t2val 2SWAP TO t2val ;
1071 T{ 5 6 sett2val t2val -> 3 4 5 6 }T
1073 T{ 0. 5. D+ -> 5. }T
1074 T{ -5. 0. D+ -> -5. }T
1075 T{ 1. 2. D+ -> 3. }T
1076 T{ 1. -2. D+ -> -1. }T
1077 T{ -1. 2. D+ -> 1. }T
1078 T{ -1. -2. D+ -> -3. }T
1079 T{ -1. 1. D+ -> 0. }T
1080 T{ 0 0 0 5 D+ -> 0 5 }T
1081 T{ -1 5 0 0 D+ -> -1 5 }T
1082 T{ 0 0 0 -5 D+ -> 0 -5 }T
1083 T{ 0 -5 -1 0 D+ -> -1 -5 }T
1084 T{ 0 1 0 2 D+ -> 0 3 }T
1085 T{ -1 1 0 -2 D+ -> -1 -1 }T
1086 T{ 0 -1 0 2 D+ -> 0 1 }T
1087 T{ 0 -1 -1 -2 D+ -> -1 -3 }T
1088 T{ -1 -1 0 1 D+ -> -1 0 }T
1090 T{ MIN-INT 0 2DUP D+ -> 0 1 }T
1091 T{ MIN-INT S>D MIN-INT 0 D+ -> 0 0 }T
1093 T{ HI-2INT 1. D+ -> 0 HI-INT 1+ }T
1094 T{ HI-2INT 2DUP D+ -> 1S 1- MAX-INT }T
1095 T{ MAX-2INT MIN-2INT D+ -> -1. }T
1096 T{ MAX-2INT LO-2INT D+ -> HI-2INT }T
1097 T{ LO-2INT 2DUP D+ -> MIN-2INT }T
1098 T{ HI-2INT MIN-2INT D+ 1. D+ -> LO-2INT }T
1100 T{ 0. 5. D- -> -5. }T
1101 T{ 5. 0. D- -> 5. }T
1102 T{ 0. -5. D- -> 5. }T
1103 T{ 1. 2. D- -> -1. }T
1104 T{ 1. -2. D- -> 3. }T
1105 T{ -1. 2. D- -> -3. }T
1106 T{ -1. -2. D- -> 1. }T
1107 T{ -1. -1. D- -> 0. }T
1108 T{ 0 0 0 5 D- -> 0 -5 }T
1109 T{ -1 5 0 0 D- -> -1 5 }T
1110 T{ 0 0 -1 -5 D- -> 1 4 }T
1111 T{ 0 -5 0 0 D- -> 0 -5 }T
1112 T{ -1 1 0 2 D- -> -1 -1 }T
1113 T{ 0 1 -1 -2 D- -> 1 2 }T
1114 T{ 0 -1 0 2 D- -> 0 -3 }T
1115 T{ 0 -1 0 -2 D- -> 0 1 }T
1116 T{ 0 0 0 1 D- -> 0 -1 }T
1117 T{ MIN-INT 0 2DUP D- -> 0. }T
1118 T{ MIN-INT S>D MAX-INT 0 D- -> 1 1S }T
1119 T{ MAX-2INT max-2INT D- -> 0. }T
1120 T{ MIN-2INT min-2INT D- -> 0. }T
1121 T{ MAX-2INT hi-2INT D- -> lo-2INT DNEGATE }T
1122 T{ HI-2INT lo-2INT D- -> max-2INT }T
1123 T{ LO-2INT hi-2INT D- -> min-2INT 1. D+ }T
1124 T{ MIN-2INT min-2INT D- -> 0. }T
1125 T{ MIN-2INT lo-2INT D- -> lo-2INT }T
1127 T{ 0. D0< -> <FALSE> }T
1128 T{ 1. D0< -> <FALSE> }T
1129 T{ MIN-INT 0 D0< -> <FALSE> }T
1130 T{ 0 MAX-INT D0< -> <FALSE> }T
1131 T{ MAX-2INT D0< -> <FALSE> }T
1132 T{ -1. D0< -> <TRUE> }T
1133 T{ MIN-2INT D0< -> <TRUE> }T
1135 T{ 1. D0= -> <FALSE> }T
1136 T{ MIN-INT 0 D0= -> <FALSE> }T
1137 T{ MAX-2INT D0= -> <FALSE> }T
1138 T{ -1 MAX-INT D0= -> <FALSE> }T
1139 T{ 0. D0= -> <TRUE> }T
1140 T{ -1. D0= -> <FALSE> }T
1141 T{ 0 MIN-INT D0= -> <FALSE> }T
1143 T{ 0. D2* -> 0. D2* }T
1144 T{ MIN-INT 0 D2* -> 0 1 }T
1145 T{ HI-2INT D2* -> MAX-2INT 1. D- }T
1146 T{ LO-2INT D2* -> MIN-2INT }T
1150 T{ 0 1 D2/ -> MIN-INT 0 }T
1151 T{ MAX-2INT D2/ -> HI-2INT }T
1152 T{ -1. D2/ -> -1. }T
1153 T{ MIN-2INT D2/ -> LO-2INT }T
1155 T{ 0. 1. D< -> <TRUE> }T
1156 T{ 0. 0. D< -> <FALSE> }T
1157 T{ 1. 0. D< -> <FALSE> }T
1158 T{ -1. 1. D< -> <TRUE> }T
1159 T{ -1. 0. D< -> <TRUE> }T
1160 T{ -2. -1. D< -> <TRUE> }T
1161 T{ -1. -2. D< -> <FALSE> }T
1162 T{ -1. MAX-2INT D< -> <TRUE> }T
1163 T{ MIN-2INT MAX-2INT D< -> <TRUE> }T
1164 T{ MAX-2INT -1. D< -> <FALSE> }T
1165 T{ MAX-2INT MIN-2INT D< -> <FALSE> }T
1166 T{ MAX-2INT 2DUP -1. D+ D< -> <FALSE> }T
1167 T{ MIN-2INT 2DUP 1. D+ D< -> <TRUE> }T
1169 T{ -1. -1. D= -> <TRUE> }T
1170 T{ -1. 0. D= -> <FALSE> }T
1171 T{ -1. 1. D= -> <FALSE> }T
1172 T{ 0. -1. D= -> <FALSE> }T
1173 T{ 0. 0. D= -> <TRUE> }T
1174 T{ 0. 1. D= -> <FALSE> }T
1175 T{ 1. -1. D= -> <FALSE> }T
1176 T{ 1. 0. D= -> <FALSE> }T
1177 T{ 1. 1. D= -> <TRUE> }T
1178 T{ 0 -1 0 -1 D= -> <TRUE> }T
1179 T{ 0 -1 0 0 D= -> <FALSE> }T
1180 T{ 0 -1 0 1 D= -> <FALSE> }T
1181 T{ 0 0 0 -1 D= -> <FALSE> }T
1182 T{ 0 0 0 0 D= -> <TRUE> }T
1183 T{ 0 0 0 1 D= -> <FALSE> }T
1184 T{ 0 1 0 -1 D= -> <FALSE> }T
1185 T{ 0 1 0 0 D= -> <FALSE> }T
1186 T{ 0 1 0 1 D= -> <TRUE> }T
1188 T{ MAX-2INT MIN-2INT D= -> <FALSE> }T
1189 T{ MAX-2INT 0. D= -> <FALSE> }T
1190 T{ MAX-2INT MAX-2INT D= -> <TRUE> }T
1191 T{ MAX-2INT HI-2INT D= -> <FALSE> }T
1192 T{ MAX-2INT MIN-2INT D= -> <FALSE> }T
1193 T{ MIN-2INT MIN-2INT D= -> <TRUE> }T
1194 T{ MIN-2INT LO-2INT D= -> <FALSE> }T
1195 T{ MIN-2INT MAX-2INT D= -> <FALSE> }T
1197 T{ 1234 0 D>S -> 1234 }T
1198 T{ -1234 -1 D>S -> -1234 }T
1199 T{ MAX-INT 0 D>S -> MAX-INT }T
1200 T{ MIN-INT -1 D>S -> MIN-INT }T
1204 T{ -1. DABS -> 1. }T
1205 T{ MAX-2INT DABS -> MAX-2INT }T
1206 T{ MIN-2INT 1. D+ DABS -> MAX-2INT }T
1208 T{ 1. 2. DMAX -> 2. }T
1209 T{ 1. 0. DMAX -> 1. }T
1210 T{ 1. -1. DMAX -> 1. }T
1211 T{ 1. 1. DMAX -> 1. }T
1212 T{ 0. 1. DMAX -> 1. }T
1213 T{ 0. -1. DMAX -> 0. }T
1214 T{ -1. 1. DMAX -> 1. }T
1215 T{ -1. -2. DMAX -> -1. }T
1216 T{ MAX-2INT HI-2INT DMAX -> MAX-2INT }T
1217 T{ MAX-2INT MIN-2INT DMAX -> MAX-2INT }T
1218 T{ MIN-2INT MAX-2INT DMAX -> MAX-2INT }T
1219 T{ MIN-2INT LO-2INT DMAX -> LO-2INT }T
1221 T{ MAX-2INT 1. DMAX -> MAX-2INT }T
1222 T{ MAX-2INT -1. DMAX -> MAX-2INT }T
1223 T{ MIN-2INT 1. DMAX -> 1. }T
1224 T{ MIN-2INT -1. DMAX -> -1. }T
1226 T{ 1. 2. DMIN -> 1. }T
1227 T{ 1. 0. DMIN -> 0. }T
1228 T{ 1. -1. DMIN -> -1. }T
1229 T{ 1. 1. DMIN -> 1. }T
1230 T{ 0. 1. DMIN -> 0. }T
1231 T{ 0. -1. DMIN -> -1. }T
1232 T{ -1. 1. DMIN -> -1. }T
1233 T{ -1. -2. DMIN -> -2. }T
1234 T{ MAX-2INT HI-2INT DMIN -> HI-2INT }T
1235 T{ MAX-2INT MIN-2INT DMIN -> MIN-2INT }T
1236 T{ MIN-2INT MAX-2INT DMIN -> MIN-2INT }T
1237 T{ MIN-2INT LO-2INT DMIN -> MIN-2INT }T
1239 T{ MAX-2INT 1. DMIN -> 1. }T
1240 T{ MAX-2INT -1. DMIN -> -1. }T
1241 T{ MIN-2INT 1. DMIN -> MIN-2INT }T
1242 T{ MIN-2INT -1. DMIN -> MIN-2INT }T
1244 T{ 0. DNEGATE -> 0. }T
1245 T{ 1. DNEGATE -> -1. }T
1246 T{ -1. DNEGATE -> 1. }T
1247 T{ max-2int DNEGATE -> min-2int SWAP 1+ SWAP }T
1248 T{ min-2int SWAP 1+ SWAP DNEGATE -> max-2int }T
1250 T{ 1. 2. 3. 2ROT -> 2. 3. 1. }T
1251 T{ MAX-2INT MIN-2INT 1. 2ROT -> MIN-2INT 1. MAX-2INT }T
1253 T{ 1. 1. DU< -> <FALSE> }T
1254 T{ 1. -1. DU< -> <TRUE> }T
1255 T{ -1. 1. DU< -> <FALSE> }T
1256 T{ -1. -2. DU< -> <FALSE> }T
1257 T{ MAX-2INT HI-2INT DU< -> <FALSE> }T
1258 T{ HI-2INT MAX-2INT DU< -> <TRUE> }T
1259 T{ MAX-2INT MIN-2INT DU< -> <TRUE> }T
1260 T{ MIN-2INT MAX-2INT DU< -> <FALSE> }T
1261 T{ MIN-2INT LO-2INT DU< -> <TRUE> }T
1263 T{ HI-2INT 1 M+ -> HI-2INT 1. D+ }T
1264 T{ MAX-2INT -1 M+ -> MAX-2INT -1. D+ }T
1265 T{ MIN-2INT 1 M+ -> MIN-2INT 1. D+ }T
1266 T{ LO-2INT -1 M+ -> LO-2INT -1. D+ }T
1268 -3 2 / . ; if floored you see -2 -->
1269 : ?floored [ -3 2 / -2 = ] LITERAL IF 1. D- THEN ;
1271 T{ 5. 7 11 M*/ -> 3. }T
1272 T{ 5. -7 11 M*/ -> -3. ?floored }T
1273 T{ -5. 7 11 M*/ -> -3. ?floored }T
1274 T{ -5. -7 11 M*/ -> 3. }T
1276 T{ MAX-2INT 8 16 M*/ -> HI-2INT }T
1277 T{ MIN-2INT 8 16 M*/ -> LO-2INT }T
1278 T{ MAX-2INT -8 16 M*/ -> HI-2INT DNEGATE ?floored }T
1279 T{ MIN-2INT -8 16 M*/ -> LO-2INT DNEGATE }T
1281 T{ MAX-2INT MAX-INT MAX-INT M*/ -> MAX-2INT }T
1282 T{ MAX-2INT MAX-INT 2/ MAX-INT M*/ -> MAX-INT 1- HI-2INT NIP }T
1283 T{ MIN-2INT LO-2INT NIP DUP NEGATE M*/ -> MIN-2INT }T
1284 T{ MIN-2INT LO-2INT NIP 1- MAX-INT M*/ -> MIN-INT 3 + HI-2INT NIP 2 + }T
1285 T{ MAX-2INT LO-2INT NIP DUP NEGATE M*/ -> MAX-2INT DNEGATE }T
1286 T{ MIN-2INT MAX-INT DUP M*/ -> MIN-2INT }T
1288 MAX-2INT 71 73 M*/ 2CONSTANT dbl1
1289 MIN-2INT 73 79 M*/ 2CONSTANT dbl2
1291 DUP >R <# DABS #S R> SIGN #>
1292 HERE SWAP 2DUP 2>R CHARS DUP ALLOT MOVE 2R>
1295 dbl1 d>ascii 2CONSTANT "dbl1"
1296 dbl2 d>ascii 2CONSTANT "dbl2"
1299 CR ." You should see lines duplicated:" CR
1300 5 SPACES "dbl1" TYPE CR
1302 8 SPACES "dbl1" DUP >R TYPE CR
1303 5 SPACES dbl1 R> 3 + D.R CR
1304 5 SPACES "dbl2" TYPE CR
1306 10 SPACES "dbl2" DUP >R TYPE CR
1307 5 SPACES dbl2 R> 5 + D.R CR
1310 T{ DoubleOutput -> }T