13 ABORT" FastForth V4.1 please!"
14 ABORT" build FastForth with DOUBLE_INPUT addon!"
20 ; -----------------------------------------------------
21 ; DOUBLE.4th for MSP_EXP430FR5994
22 ; -----------------------------------------------------
26 [UNDEFINED] {DOUBLE} [IF]
29 ; ------------------------------------------------------------------
30 ; first we download the set of definitions we need (from CORE_ANS)
31 ; ------------------------------------------------------------------
93 MOV #[THEN]+$52,0(R14)
105 [UNDEFINED] ELSE [IF]
109 MOV #[THEN]+$58,-4(R10)
124 [UNDEFINED] SPACE [IF]
133 [UNDEFINED] SPACES [IF]
170 [UNDEFINED] 2DUP [IF]
179 [UNDEFINED] 2DROP [IF]
187 [UNDEFINED] 2SWAP [IF]
199 [UNDEFINED] 2OVER [IF]
238 ; --------------------------
239 ; end of definitions we need
240 ; --------------------------
242 ; ===============================================
244 ; ===============================================
253 [UNDEFINED] 2ROT [IF]
358 [UNDEFINED] DNEGATE [IF]
390 [UNDEFINED] DMAX [IF]
401 [UNDEFINED] DMIN [IF]
426 [IF] ; MSP430FRxxxx with hardware_MPY
449 [ELSE] ; no hardware multiplier
488 [THEN] ; endcase of software/hardware_MPY
520 [UNDEFINED] 2VARIABLE [IF]
530 [UNDEFINED] 2CONSTANT [IF]
539 [UNDEFINED] 2VALUE [IF]
555 [UNDEFINED] 2LITERAL [IF]
565 >R SWAP OVER DABS <# #S ROT SIGN #>
566 R> OVER - SPACES TYPE
574 ; -------------------------------
575 ; Complement to pass DOUBLE TESTS
576 ; -------------------------------
608 [UNDEFINED] SWAP [IF]
617 [UNDEFINED] DROP [IF]
624 [UNDEFINED] VARIABLE [IF]
634 [UNDEFINED] CONSTANT [IF]
645 [UNDEFINED] CELLS [IF]
652 [UNDEFINED] DEPTH [IF]
669 MOV #[THEN]+$52,0(R14)
681 [UNDEFINED] ELSE [IF]
685 MOV #[THEN]+$58,-4(R10)
805 [UNDEFINED] SOURCE [IF]
826 [UNDEFINED] CHAR [IF]
832 [UNDEFINED] [CHAR] [IF]
834 CHAR POSTPONE LITERAL
845 [UNDEFINED] INVERT [IF]
852 [UNDEFINED] RSHIFT [IF]
881 [UNDEFINED] NEGATE [IF]
889 [UNDEFINED] HERE [IF]
895 [UNDEFINED] CHARS [IF]
901 [UNDEFINED] MOVE [IF]
933 [UNDEFINED] DECIMAL [IF]
940 [UNDEFINED] BASE [IF]
950 [UNDEFINED] .( [IF] ; "
970 $180E @ 0< ; test the switch: FLOORED/SYMETRIC DIVISION
972 [UNDEFINED] FM/MOD [IF]
1016 [UNDEFINED] SM/REM [IF]
1052 [UNDEFINED] NIP [IF]
1077 VARIABLE ACTUAL-DEPTH
1078 CREATE ACTUAL-RESULTS 20 CELLS ALLOT
1084 DEPTH DUP ACTUAL-DEPTH !
1086 0 DO ACTUAL-RESULTS I CELLS + ! LOOP
1091 DEPTH ACTUAL-DEPTH @ = IF
1094 ACTUAL-RESULTS I CELLS + @
1095 = 0= IF TRUE ABORT" INCORRECT RESULT" THEN
1099 TRUE ABORT" WRONG NUMBER OF RESULTS"
1104 IF DUP >R TYPE CR R> >IN !
1105 ELSE >IN ! DROP [CHAR] * EMIT
1111 0 INVERT CONSTANT 1SD
1112 1SD 1 RSHIFT CONSTANT MAX-INTD
1113 MAX-INTD INVERT CONSTANT MIN-INTD
1114 MAX-INTD 2/ CONSTANT HI-INT
1115 MIN-INTD 2/ CONSTANT LO-INT
1120 ; ----------------------------------------------------------------------------
1121 TESTING interpreter and compiler reading double numbers, with/without prefixes
1125 T{ : RDL1 3. ; RDL1 -> 3 0 }T
1126 T{ : RDL2 -4. ; RDL2 -> -4 -1 }T
1129 DECIMAL BASE @ OLD-DBASE !
1130 T{ #12346789. -> 12346789. }T
1131 T{ #-12346789. -> -12346789. }T
1132 T{ $12aBcDeF. -> 313249263. }T
1133 T{ $-12AbCdEf. -> -313249263. }T
1134 T{ %10010110. -> 150. }T
1135 T{ %-10010110. -> -150. }T
1136 ; Check BASE is unchanged
1137 T{ BASE @ OLD-DBASE @ = -> TRUE }T
1139 ; Repeat in Hex mode
1140 16 OLD-DBASE ! 16 BASE !
1141 T{ #12346789. -> BC65A5. }T
1142 T{ #-12346789. -> -BC65A5. }T
1143 T{ $12aBcDeF. -> 12AbCdeF. }T
1144 T{ $-12AbCdEf. -> -12ABCDef. }T
1145 T{ %10010110. -> 96. }T
1146 T{ %-10010110. -> -96. }T
1147 ; Check BASE is unchanged
1148 T{ BASE @ OLD-DBASE @ = -> TRUE }T
1151 ; Check number prefixes in compile mode
1152 T{ : dnmp #8327. $-2cbe. %011010111. ; dnmp -> 8327. -11454. 215. }T
1154 ; ----------------------------------------------------------------------------
1157 T{ 1 2 2CONSTANT 2C1 -> }T
1159 T{ : CD1 2C1 ; -> }T
1161 T{ : CD2 2CONSTANT ; -> }T
1162 T{ -1 -2 CD2 2C2 -> }T
1164 T{ 4 5 2CONSTANT 2C3 IMMEDIATE 2C3 -> 4 5 }T
1165 T{ : CD6 2C3 2LITERAL ; CD6 -> 4 5 }T
1167 ; ----------------------------------------------------------------------------
1168 ; Some 2CONSTANTs for the following tests
1170 1SD MAX-INTD 2CONSTANT MAX-2INT
1171 0 MIN-INTD 2CONSTANT MIN-2INT
1172 MAX-2INT 2/ 2CONSTANT HI-2INT
1173 MIN-2INT 2/ 2CONSTANT LO-2INT
1175 ; ----------------------------------------------------------------------------
1178 T{ 0. DNEGATE -> 0. }T
1179 T{ 1. DNEGATE -> -1. }T
1180 T{ -1. DNEGATE -> 1. }T
1181 T{ MAX-2INT DNEGATE -> MIN-2INT SWAP 1+ SWAP }T
1182 T{ MIN-2INT SWAP 1+ SWAP DNEGATE -> MAX-2INT }T
1184 ; ----------------------------------------------------------------------------
1185 TESTING D+ with small integers
1187 T{ 0. 5. D+ -> 5. }T
1188 T{ -5. 0. D+ -> -5. }T
1189 T{ 1. 2. D+ -> 3. }T
1190 T{ 1. -2. D+ -> -1. }T
1191 T{ -1. 2. D+ -> 1. }T
1192 T{ -1. -2. D+ -> -3. }T
1193 T{ -1. 1. D+ -> 0. }T
1195 TESTING D+ with mid range integers
1197 T{ 0 0 0 5 D+ -> 0 5 }T
1198 T{ -1 5 0 0 D+ -> -1 5 }T
1199 T{ 0 0 0 -5 D+ -> 0 -5 }T
1200 T{ 0 -5 -1 0 D+ -> -1 -5 }T
1201 T{ 0 1 0 2 D+ -> 0 3 }T
1202 T{ -1 1 0 -2 D+ -> -1 -1 }T
1203 T{ 0 -1 0 2 D+ -> 0 1 }T
1204 T{ 0 -1 -1 -2 D+ -> -1 -3 }T
1205 T{ -1 -1 0 1 D+ -> -1 0 }T
1206 T{ MIN-INTD 0 2DUP D+ -> 0 1 }T
1207 T{ MIN-INTD S>D MIN-INTD 0 D+ -> 0 0 }T
1209 TESTING D+ with large double integers
1211 T{ HI-2INT 1. D+ -> 0 HI-INT 1+ }T
1212 T{ HI-2INT 2DUP D+ -> 1SD 1- MAX-INTD }T
1213 T{ MAX-2INT MIN-2INT D+ -> -1. }T
1214 T{ MAX-2INT LO-2INT D+ -> HI-2INT }T
1215 T{ HI-2INT MIN-2INT D+ 1. D+ -> LO-2INT }T
1216 T{ LO-2INT 2DUP D+ -> MIN-2INT }T
1218 ; ----------------------------------------------------------------------------
1219 TESTING D- with small integers
1221 T{ 0. 5. D- -> -5. }T
1222 T{ 5. 0. D- -> 5. }T
1223 T{ 0. -5. D- -> 5. }T
1224 T{ 1. 2. D- -> -1. }T
1225 T{ 1. -2. D- -> 3. }T
1226 T{ -1. 2. D- -> -3. }T
1227 T{ -1. -2. D- -> 1. }T
1228 T{ -1. -1. D- -> 0. }T
1230 TESTING D- with mid-range integers
1232 T{ 0 0 0 5 D- -> 0 -5 }T
1233 T{ -1 5 0 0 D- -> -1 5 }T
1234 T{ 0 0 -1 -5 D- -> 1 4 }T
1235 T{ 0 -5 0 0 D- -> 0 -5 }T
1236 T{ -1 1 0 2 D- -> -1 -1 }T
1237 T{ 0 1 -1 -2 D- -> 1 2 }T
1238 T{ 0 -1 0 2 D- -> 0 -3 }T
1239 T{ 0 -1 0 -2 D- -> 0 1 }T
1240 T{ 0 0 0 1 D- -> 0 -1 }T
1241 T{ MIN-INTD 0 2DUP D- -> 0. }T
1242 T{ MIN-INTD S>D MAX-INTD 0 D- -> 1 1SD }T
1244 TESTING D- with large integers
1246 T{ MAX-2INT MAX-2INT D- -> 0. }T
1247 T{ MIN-2INT MIN-2INT D- -> 0. }T
1248 T{ MAX-2INT HI-2INT D- -> LO-2INT DNEGATE }T
1249 T{ HI-2INT LO-2INT D- -> MAX-2INT }T
1250 T{ LO-2INT HI-2INT D- -> MIN-2INT 1. D+ }T
1251 T{ MIN-2INT MIN-2INT D- -> 0. }T
1252 T{ MIN-2INT LO-2INT D- -> LO-2INT }T
1254 ; ----------------------------------------------------------------------------
1257 T{ 0. D0< -> FALSE }T
1258 T{ 1. D0< -> FALSE }T
1259 T{ MIN-INTD 0 D0< -> FALSE }T
1260 T{ 0 MAX-INTD D0< -> FALSE }T
1261 T{ MAX-2INT D0< -> FALSE }T
1262 T{ -1. D0< -> TRUE }T
1263 T{ MIN-2INT D0< -> TRUE }T
1265 T{ 1. D0= -> FALSE }T
1266 T{ MIN-INTD 0 D0= -> FALSE }T
1267 T{ MAX-2INT D0= -> FALSE }T
1268 T{ -1 MAX-INTD D0= -> FALSE }T
1269 T{ 0. D0= -> TRUE }T
1270 T{ -1. D0= -> FALSE }T
1271 T{ 0 MIN-INTD D0= -> FALSE }T
1273 ; ----------------------------------------------------------------------------
1276 T{ 0. D2* -> 0. D2* }T
1277 T{ MIN-INTD 0 D2* -> 0 1 }T
1278 T{ HI-2INT D2* -> MAX-2INT 1. D- }T
1279 T{ LO-2INT D2* -> MIN-2INT }T
1283 T{ 0 1 D2/ -> MIN-INTD 0 }T
1284 T{ MAX-2INT D2/ -> HI-2INT }T
1285 T{ -1. D2/ -> -1. }T
1286 T{ MIN-2INT D2/ -> LO-2INT }T
1288 ; ----------------------------------------------------------------------------
1291 T{ 0. 1. D< -> TRUE }T
1292 T{ 0. 0. D< -> FALSE }T
1293 T{ 1. 0. D< -> FALSE }T
1294 T{ -1. 1. D< -> TRUE }T
1295 T{ -1. 0. D< -> TRUE }T
1296 T{ -2. -1. D< -> TRUE }T
1297 T{ -1. -2. D< -> FALSE }T
1298 T{ 0 1 1. D< -> FALSE }T
1299 T{ 1. 0 1 D< -> TRUE }T
1300 T{ 0 -1 1 -2 D< -> FALSE }T
1301 T{ 1 -2 0 -1 D< -> TRUE }T
1302 T{ -1. MAX-2INT D< -> TRUE }T
1303 T{ MIN-2INT MAX-2INT D< -> TRUE }T
1304 T{ MAX-2INT -1. D< -> FALSE }T
1305 T{ MAX-2INT MIN-2INT D< -> FALSE }T
1306 T{ MAX-2INT 2DUP -1. D+ D< -> FALSE }T
1307 T{ MIN-2INT 2DUP 1. D+ D< -> TRUE }T
1308 T{ MAX-INTD S>D 2DUP 1. D+ D< -> TRUE }T
1310 T{ -1. -1. D= -> TRUE }T
1311 T{ -1. 0. D= -> FALSE }T
1312 T{ -1. 1. D= -> FALSE }T
1313 T{ 0. -1. D= -> FALSE }T
1314 T{ 0. 0. D= -> TRUE }T
1315 T{ 0. 1. D= -> FALSE }T
1316 T{ 1. -1. D= -> FALSE }T
1317 T{ 1. 0. D= -> FALSE }T
1318 T{ 1. 1. D= -> TRUE }T
1320 T{ 0 -1 0 -1 D= -> TRUE }T
1321 T{ 0 -1 0 0 D= -> FALSE }T
1322 T{ 0 -1 0 1 D= -> FALSE }T
1323 T{ 0 0 0 -1 D= -> FALSE }T
1324 T{ 0 0 0 0 D= -> TRUE }T
1325 T{ 0 0 0 1 D= -> FALSE }T
1326 T{ 0 1 0 -1 D= -> FALSE }T
1327 T{ 0 1 0 0 D= -> FALSE }T
1328 T{ 0 1 0 1 D= -> TRUE }T
1330 T{ MAX-2INT MIN-2INT D= -> FALSE }T
1331 T{ MAX-2INT 0. D= -> FALSE }T
1332 T{ MAX-2INT MAX-2INT D= -> TRUE }T
1333 T{ MAX-2INT HI-2INT D= -> FALSE }T
1334 T{ MAX-2INT MIN-2INT D= -> FALSE }T
1335 T{ MIN-2INT MIN-2INT D= -> TRUE }T
1336 T{ MIN-2INT LO-2INT D= -> FALSE }T
1337 T{ MIN-2INT MAX-2INT D= -> FALSE }T
1339 ; ----------------------------------------------------------------------------
1340 TESTING 2LITERAL 2VARIABLE
1342 T{ : CD3 [ MAX-2INT ] 2LITERAL ; -> }T
1343 T{ CD3 -> MAX-2INT }T
1344 T{ 2VARIABLE 2V1 -> }T
1347 T{ -1 -2 2V1 2! -> }T
1348 T{ 2V1 2@ -> -1 -2 }T
1349 T{ : CD4 2VARIABLE ; -> }T
1351 T{ : CD5 2V2 2! ; -> }T
1353 T{ 2V2 2@ -> -2 -1 }T
1354 T{ 2VARIABLE 2V3 IMMEDIATE 5 6 2V3 2! -> }T
1356 T{ : CD7 2V3 [ 2@ ] 2LITERAL ; CD7 -> 5 6 }T
1357 T{ : CD8 [ 6 7 ] 2V3 [ 2! ] ; 2V3 2@ -> 6 7 }T
1359 ; ----------------------------------------------------------------------------
1362 T{ 1. 2. DMAX -> 2. }T
1363 T{ 1. 0. DMAX -> 1. }T
1364 T{ 1. -1. DMAX -> 1. }T
1365 T{ 1. 1. DMAX -> 1. }T
1366 T{ 0. 1. DMAX -> 1. }T
1367 T{ 0. -1. DMAX -> 0. }T
1368 T{ -1. 1. DMAX -> 1. }T
1369 T{ -1. -2. DMAX -> -1. }T
1371 T{ MAX-2INT HI-2INT DMAX -> MAX-2INT }T
1372 T{ MAX-2INT MIN-2INT DMAX -> MAX-2INT }T
1373 T{ MIN-2INT MAX-2INT DMAX -> MAX-2INT }T
1374 T{ MIN-2INT LO-2INT DMAX -> LO-2INT }T
1376 T{ MAX-2INT 1. DMAX -> MAX-2INT }T
1377 T{ MAX-2INT -1. DMAX -> MAX-2INT }T
1378 T{ MIN-2INT 1. DMAX -> 1. }T
1379 T{ MIN-2INT -1. DMAX -> -1. }T
1382 T{ 1. 2. DMIN -> 1. }T
1383 T{ 1. 0. DMIN -> 0. }T
1384 T{ 1. -1. DMIN -> -1. }T
1385 T{ 1. 1. DMIN -> 1. }T
1386 T{ 0. 1. DMIN -> 0. }T
1387 T{ 0. -1. DMIN -> -1. }T
1388 T{ -1. 1. DMIN -> -1. }T
1389 T{ -1. -2. DMIN -> -2. }T
1391 T{ MAX-2INT HI-2INT DMIN -> HI-2INT }T
1392 T{ MAX-2INT MIN-2INT DMIN -> MIN-2INT }T
1393 T{ MIN-2INT MAX-2INT DMIN -> MIN-2INT }T
1394 T{ MIN-2INT LO-2INT DMIN -> MIN-2INT }T
1396 T{ MAX-2INT 1. DMIN -> 1. }T
1397 T{ MAX-2INT -1. DMIN -> -1. }T
1398 T{ MIN-2INT 1. DMIN -> MIN-2INT }T
1399 T{ MIN-2INT -1. DMIN -> MIN-2INT }T
1401 ; ----------------------------------------------------------------------------
1404 T{ 1234 0 D>S -> 1234 }T
1405 T{ -1234 -1 D>S -> -1234 }T
1406 T{ MAX-INTD 0 D>S -> MAX-INTD }T
1407 T{ MIN-INTD -1 D>S -> MIN-INTD }T
1410 T{ -1. DABS -> 1. }T
1411 T{ MAX-2INT DABS -> MAX-2INT }T
1412 T{ MIN-2INT 1. D+ DABS -> MAX-2INT }T
1414 ; ----------------------------------------------------------------------------
1417 T{ HI-2INT 1 M+ -> HI-2INT 1. D+ }T
1418 T{ MAX-2INT -1 M+ -> MAX-2INT -1. D+ }T
1419 T{ MIN-2INT 1 M+ -> MIN-2INT 1. D+ }T
1420 T{ LO-2INT -1 M+ -> LO-2INT -1. D+ }T
1422 ; To correct the result if the division is floored, only used when
1423 ; necessary i.e. negative quotient and remainder <> 0
1425 : ?FLOORED [ -3 2 / -2 = ] LITERAL IF 1. D- THEN ;
1427 T{ 5. 7 11 M*/ -> 3. }T
1428 T{ 5. -7 11 M*/ -> -3. ?FLOORED }T
1429 T{ -5. 7 11 M*/ -> -3. ?FLOORED }T
1430 T{ -5. -7 11 M*/ -> 3. }T
1431 T{ MAX-2INT 8 16 M*/ -> HI-2INT }T
1432 T{ MAX-2INT -8 16 M*/ -> HI-2INT DNEGATE ?FLOORED }T
1433 T{ MIN-2INT 8 16 M*/ -> LO-2INT }T
1434 T{ MIN-2INT -8 16 M*/ -> LO-2INT DNEGATE }T
1435 T{ MAX-2INT MAX-INTD MAX-INTD M*/ -> MAX-2INT }T
1436 T{ MAX-2INT MAX-INTD 2/ MAX-INTD M*/ -> MAX-INTD 1- HI-2INT NIP }T
1437 T{ MIN-2INT LO-2INT NIP 1+ DUP 1- NEGATE M*/ -> 0 MAX-INTD 1- }T
1438 T{ MIN-2INT LO-2INT NIP 1- MAX-INTD M*/ -> MIN-INTD 3 + HI-2INT NIP 2 + }T
1439 T{ MAX-2INT LO-2INT NIP DUP NEGATE M*/ -> MAX-2INT DNEGATE }T
1440 T{ MIN-2INT MAX-INTD DUP M*/ -> MIN-2INT }T
1442 ; ----------------------------------------------------------------------------
1445 ; Create some large double numbers
1446 MAX-2INT 71 73 M*/ 2CONSTANT DBL1
1447 MIN-2INT 73 79 M*/ 2CONSTANT DBL2
1449 : D>ASCII ( D -- CADDR U )
1450 DUP >R <# DABS #S R> SIGN #> ( -- CADDR1 U )
1451 HERE SWAP 2DUP 2>R CHARS DUP ALLOT MOVE 2R>
1454 DBL1 D>ASCII 2CONSTANT "DBL1"
1455 DBL2 D>ASCII 2CONSTANT "DBL2"
1458 CR ." You should see lines duplicated:" CR
1459 5 SPACES "DBL1" TYPE CR
1461 8 SPACES "DBL1" DUP >R TYPE CR
1462 5 SPACES DBL1 R> 3 + D.R CR
1463 5 SPACES "DBL2" TYPE CR
1465 10 SPACES "DBL2" DUP >R TYPE CR
1466 5 SPACES DBL2 R> 5 + D.R CR
1469 T{ DOUBLEOUTPUT -> }T
1470 ; ----------------------------------------------------------------------------
1471 TESTING 2ROT DU< (Double Number extension words)
1473 T{ 1. 2. 3. 2ROT -> 2. 3. 1. }T
1474 T{ MAX-2INT MIN-2INT 1. 2ROT -> MIN-2INT 1. MAX-2INT }T
1476 T{ 1. 1. DU< -> FALSE }T
1477 T{ 1. -1. DU< -> TRUE }T
1478 T{ -1. 1. DU< -> FALSE }T
1479 T{ -1. -2. DU< -> FALSE }T
1480 T{ 0 1 1. DU< -> FALSE }T
1481 T{ 1. 0 1 DU< -> TRUE }T
1482 T{ 0 -1 1 -2 DU< -> FALSE }T
1483 T{ 1 -2 0 -1 DU< -> TRUE }T
1485 T{ MAX-2INT HI-2INT DU< -> FALSE }T
1486 T{ HI-2INT MAX-2INT DU< -> TRUE }T
1487 T{ MAX-2INT MIN-2INT DU< -> TRUE }T
1488 T{ MIN-2INT MAX-2INT DU< -> FALSE }T
1489 T{ MIN-2INT LO-2INT DU< -> TRUE }T
1491 ; ----------------------------------------------------------------------------
1494 T{ 1111 2222 2VALUE 2VAL -> }T
1495 T{ 2VAL -> 1111 2222 }T
1496 T{ 3333 4444 TO 2VAL -> }T
1497 T{ 2VAL -> 3333 4444 }T
1498 T{ : TO-2VAL TO 2VAL ; 5555 6666 TO-2VAL -> }T
1499 T{ 2VAL -> 5555 6666 }T
1501 CR .( End of Double-Number word tests) CR