changeset 10: |
79737134254d |
author: |
ellis <ellis@rwest.io> |
date: |
Fri, 12 May 2023 22:58:05 -0400 |
permissions: |
-rw-r--r-- |
description: |
messing with UI and rust codegen |
3 \ Date: Mon, 27 Nov 95 13:10 5 \ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY 6 \ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS. 8 \ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM. 9 \ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE 10 \ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND 11 \ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1. 12 \ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"... 13 \ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?... 19 \ ------------------------------------------------------------------------ 20 TESTING BASIC ASSUMPTIONS 22 T{ -> }T \ START WITH CLEAN SLATE 23 ( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 ) 24 T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T 25 T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR ) 26 T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT ) 27 T{ -1 BITSSET? -> 0 0 }T 29 \ ------------------------------------------------------------------------ 30 TESTING BOOLEANS: INVERT AND OR XOR 37 T{ 0 INVERT 1 AND -> 1 }T 38 T{ 1 INVERT 1 AND -> 0 }T 61 \ ------------------------------------------------------------------------ 62 TESTING 2* 2/ LSHIFT RSHIFT 64 ( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER ) 65 1S 1 RSHIFT INVERT CONSTANT MSB 66 T{ MSB BITSSET? -> 0 0 }T 71 T{ 1S 2* 1 XOR -> 1S }T 77 T{ 1S 2/ -> 1S }T \ MSB PROPOGATED 78 T{ 1S 1 XOR 2/ -> 1S }T 79 T{ MSB 2/ MSB AND -> MSB }T 84 T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT 85 T{ 1S 1 LSHIFT 1 XOR -> 1S }T 86 T{ MSB 1 LSHIFT -> 0 }T 92 T{ 8000 F RSHIFT -> 1 }T \ BIGGEST 93 T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS 94 T{ MSB 1 RSHIFT 2* -> MSB }T 96 \ ------------------------------------------------------------------------ 97 TESTING COMPARISONS: 0= = 0< < > U< MIN MAX 98 0 INVERT CONSTANT MAX-UINT 99 0 INVERT 1 RSHIFT CONSTANT MAX-INT 100 0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT 101 0 INVERT 1 RSHIFT CONSTANT MID-UINT 102 0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1 108 T{ 1 0= -> <FALSE> }T 109 T{ 2 0= -> <FALSE> }T 110 T{ -1 0= -> <FALSE> }T 111 T{ MAX-UINT 0= -> <FALSE> }T 112 T{ MIN-INT 0= -> <FALSE> }T 113 T{ MAX-INT 0= -> <FALSE> }T 115 T{ 0 0 = -> <TRUE> }T 116 T{ 1 1 = -> <TRUE> }T 117 T{ -1 -1 = -> <TRUE> }T 118 T{ 1 0 = -> <FALSE> }T 119 T{ -1 0 = -> <FALSE> }T 120 T{ 0 1 = -> <FALSE> }T 121 T{ 0 -1 = -> <FALSE> }T 123 T{ 0 0< -> <FALSE> }T 124 T{ -1 0< -> <TRUE> }T 125 T{ MIN-INT 0< -> <TRUE> }T 126 T{ 1 0< -> <FALSE> }T 127 T{ MAX-INT 0< -> <FALSE> }T 129 T{ 0 1 < -> <TRUE> }T 130 T{ 1 2 < -> <TRUE> }T 131 T{ -1 0 < -> <TRUE> }T 132 T{ -1 1 < -> <TRUE> }T 133 T{ MIN-INT 0 < -> <TRUE> }T 134 T{ MIN-INT MAX-INT < -> <TRUE> }T 135 T{ 0 MAX-INT < -> <TRUE> }T 136 T{ 0 0 < -> <FALSE> }T 137 T{ 1 1 < -> <FALSE> }T 138 T{ 1 0 < -> <FALSE> }T 139 T{ 2 1 < -> <FALSE> }T 140 T{ 0 -1 < -> <FALSE> }T 141 T{ 1 -1 < -> <FALSE> }T 142 T{ 0 MIN-INT < -> <FALSE> }T 143 T{ MAX-INT MIN-INT < -> <FALSE> }T 144 T{ MAX-INT 0 < -> <FALSE> }T 146 T{ 0 1 > -> <FALSE> }T 147 T{ 1 2 > -> <FALSE> }T 148 T{ -1 0 > -> <FALSE> }T 149 T{ -1 1 > -> <FALSE> }T 150 T{ MIN-INT 0 > -> <FALSE> }T 151 T{ MIN-INT MAX-INT > -> <FALSE> }T 152 T{ 0 MAX-INT > -> <FALSE> }T 153 T{ 0 0 > -> <FALSE> }T 154 T{ 1 1 > -> <FALSE> }T 155 T{ 1 0 > -> <TRUE> }T 156 T{ 2 1 > -> <TRUE> }T 157 T{ 0 -1 > -> <TRUE> }T 158 T{ 1 -1 > -> <TRUE> }T 159 T{ 0 MIN-INT > -> <TRUE> }T 160 T{ MAX-INT MIN-INT > -> <TRUE> }T 161 T{ MAX-INT 0 > -> <TRUE> }T 163 T{ 0 1 U< -> <TRUE> }T 164 T{ 1 2 U< -> <TRUE> }T 165 T{ 0 MID-UINT U< -> <TRUE> }T 166 T{ 0 MAX-UINT U< -> <TRUE> }T 167 T{ MID-UINT MAX-UINT U< -> <TRUE> }T 168 T{ 0 0 U< -> <FALSE> }T 169 T{ 1 1 U< -> <FALSE> }T 170 T{ 1 0 U< -> <FALSE> }T 171 T{ 2 1 U< -> <FALSE> }T 172 T{ MID-UINT 0 U< -> <FALSE> }T 173 T{ MAX-UINT 0 U< -> <FALSE> }T 174 T{ MAX-UINT MID-UINT U< -> <FALSE> }T 180 T{ MIN-INT 0 MIN -> MIN-INT }T 181 T{ MIN-INT MAX-INT MIN -> MIN-INT }T 182 T{ 0 MAX-INT MIN -> 0 }T 189 T{ 0 MIN-INT MIN -> MIN-INT }T 190 T{ MAX-INT MIN-INT MIN -> MIN-INT }T 191 T{ MAX-INT 0 MIN -> 0 }T 197 T{ MIN-INT 0 MAX -> 0 }T 198 T{ MIN-INT MAX-INT MAX -> MAX-INT }T 199 T{ 0 MAX-INT MAX -> MAX-INT }T 206 T{ 0 MIN-INT MAX -> 0 }T 207 T{ MAX-INT MIN-INT MAX -> MAX-INT }T 208 T{ MAX-INT 0 MAX -> MAX-INT }T 210 \ ------------------------------------------------------------------------ 211 TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP 214 T{ 1 2 2DUP -> 1 2 1 2 }T 215 T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T 216 T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T 219 T{ -1 ?DUP -> -1 -1 }T 222 T{ 0 1 DEPTH -> 0 1 2 }T 226 T{ 1 2 OVER -> 1 2 1 }T 227 T{ 1 2 3 ROT -> 2 3 1 }T 228 T{ 1 2 SWAP -> 2 1 }T 230 \ ------------------------------------------------------------------------ 233 T{ : GR1 >R R> ; -> }T 234 T{ : GR2 >R R@ R> DROP ; -> }T 237 T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS ) 239 \ ------------------------------------------------------------------------ 240 TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE 251 T{ MID-UINT 1 + -> MID-UINT+1 }T 262 T{ MID-UINT+1 1 - -> MID-UINT }T 267 T{ MID-UINT 1+ -> MID-UINT+1 }T 272 T{ MID-UINT+1 1- -> MID-UINT }T 283 T{ MIN-INT ABS -> MID-UINT+1 }T 285 \ ------------------------------------------------------------------------ 286 TESTING MULTIPLY: S>D * M* UM* 291 T{ -1 S>D -> -1 -1 }T 292 T{ -2 S>D -> -2 -1 }T 293 T{ MIN-INT S>D -> MIN-INT -1 }T 294 T{ MAX-INT S>D -> MAX-INT 0 }T 296 T{ 0 0 M* -> 0 S>D }T 297 T{ 0 1 M* -> 0 S>D }T 298 T{ 1 0 M* -> 0 S>D }T 299 T{ 1 2 M* -> 2 S>D }T 300 T{ 2 1 M* -> 2 S>D }T 301 T{ 3 3 M* -> 9 S>D }T 302 T{ -3 3 M* -> -9 S>D }T 303 T{ 3 -3 M* -> -9 S>D }T 304 T{ -3 -3 M* -> 9 S>D }T 305 T{ 0 MIN-INT M* -> 0 S>D }T 306 T{ 1 MIN-INT M* -> MIN-INT S>D }T 307 T{ 2 MIN-INT M* -> 0 1S }T 308 T{ 0 MAX-INT M* -> 0 S>D }T 309 T{ 1 MAX-INT M* -> MAX-INT S>D }T 310 T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T 311 T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T 312 T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T 313 T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T 315 T{ 0 0 * -> 0 }T \ TEST IDENTITIES 325 T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T 326 T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T 327 T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T 336 T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T 337 T{ MID-UINT+1 2 UM* -> 0 1 }T 338 T{ MID-UINT+1 4 UM* -> 0 2 }T 339 T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T 340 T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T 342 \ ------------------------------------------------------------------------ 343 TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD 345 T{ 0 S>D 1 FM/MOD -> 0 0 }T 346 T{ 1 S>D 1 FM/MOD -> 0 1 }T 347 T{ 2 S>D 1 FM/MOD -> 0 2 }T 348 T{ -1 S>D 1 FM/MOD -> 0 -1 }T 349 T{ -2 S>D 1 FM/MOD -> 0 -2 }T 350 T{ 0 S>D -1 FM/MOD -> 0 0 }T 351 T{ 1 S>D -1 FM/MOD -> 0 -1 }T 352 T{ 2 S>D -1 FM/MOD -> 0 -2 }T 353 T{ -1 S>D -1 FM/MOD -> 0 1 }T 354 T{ -2 S>D -1 FM/MOD -> 0 2 }T 355 T{ 2 S>D 2 FM/MOD -> 0 1 }T 356 T{ -1 S>D -1 FM/MOD -> 0 1 }T 357 T{ -2 S>D -2 FM/MOD -> 0 1 }T 358 T{ 7 S>D 3 FM/MOD -> 1 2 }T 359 T{ 7 S>D -3 FM/MOD -> -2 -3 }T 360 T{ -7 S>D 3 FM/MOD -> 2 -3 }T 361 T{ -7 S>D -3 FM/MOD -> -1 2 }T 362 T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T 363 T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T 364 T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T 365 T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T 366 T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T 367 T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T 368 T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T 369 T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T 370 T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T 371 T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T 372 T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T 373 T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T 374 T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T 375 T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T 376 T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T 377 T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T 378 T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T 380 T{ 0 S>D 1 SM/REM -> 0 0 }T 381 T{ 1 S>D 1 SM/REM -> 0 1 }T 382 T{ 2 S>D 1 SM/REM -> 0 2 }T 383 T{ -1 S>D 1 SM/REM -> 0 -1 }T 384 T{ -2 S>D 1 SM/REM -> 0 -2 }T 385 T{ 0 S>D -1 SM/REM -> 0 0 }T 386 T{ 1 S>D -1 SM/REM -> 0 -1 }T 387 T{ 2 S>D -1 SM/REM -> 0 -2 }T 388 T{ -1 S>D -1 SM/REM -> 0 1 }T 389 T{ -2 S>D -1 SM/REM -> 0 2 }T 390 T{ 2 S>D 2 SM/REM -> 0 1 }T 391 T{ -1 S>D -1 SM/REM -> 0 1 }T 392 T{ -2 S>D -2 SM/REM -> 0 1 }T 393 T{ 7 S>D 3 SM/REM -> 1 2 }T 394 T{ 7 S>D -3 SM/REM -> 1 -2 }T 395 T{ -7 S>D 3 SM/REM -> -1 -2 }T 396 T{ -7 S>D -3 SM/REM -> -1 2 }T 397 T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T 398 T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T 399 T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T 400 T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T 401 T{ 1S 1 4 SM/REM -> 3 MAX-INT }T 402 T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T 403 T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T 404 T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T 405 T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T 406 T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T 407 T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T 408 T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T 409 T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T 411 T{ 0 0 1 UM/MOD -> 0 0 }T 412 T{ 1 0 1 UM/MOD -> 0 1 }T 413 T{ 1 0 2 UM/MOD -> 1 0 }T 414 T{ 3 0 2 UM/MOD -> 1 1 }T 415 T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T 416 T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T 417 T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T 420 [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ; 423 [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ; 425 \ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION. 426 \ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST. 428 IFFLOORED : T/MOD >R S>D R> FM/MOD ; 429 IFFLOORED : T/ T/MOD SWAP DROP ; 430 IFFLOORED : TMOD T/MOD DROP ; 431 IFFLOORED : T*/MOD >R M* R> FM/MOD ; 432 IFFLOORED : T*/ T*/MOD SWAP DROP ; 433 IFSYM : T/MOD >R S>D R> SM/REM ; 434 IFSYM : T/ T/MOD SWAP DROP ; 435 IFSYM : TMOD T/MOD DROP ; 436 IFSYM : T*/MOD >R M* R> SM/REM ; 437 IFSYM : T*/ T*/MOD SWAP DROP ; 439 T{ 0 1 /MOD -> 0 1 T/MOD }T 440 T{ 1 1 /MOD -> 1 1 T/MOD }T 441 T{ 2 1 /MOD -> 2 1 T/MOD }T 442 T{ -1 1 /MOD -> -1 1 T/MOD }T 443 T{ -2 1 /MOD -> -2 1 T/MOD }T 444 T{ 0 -1 /MOD -> 0 -1 T/MOD }T 445 T{ 1 -1 /MOD -> 1 -1 T/MOD }T 446 T{ 2 -1 /MOD -> 2 -1 T/MOD }T 447 T{ -1 -1 /MOD -> -1 -1 T/MOD }T 448 T{ -2 -1 /MOD -> -2 -1 T/MOD }T 449 T{ 2 2 /MOD -> 2 2 T/MOD }T 450 T{ -1 -1 /MOD -> -1 -1 T/MOD }T 451 T{ -2 -2 /MOD -> -2 -2 T/MOD }T 452 T{ 7 3 /MOD -> 7 3 T/MOD }T 453 T{ 7 -3 /MOD -> 7 -3 T/MOD }T 454 T{ -7 3 /MOD -> -7 3 T/MOD }T 455 T{ -7 -3 /MOD -> -7 -3 T/MOD }T 456 T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T 457 T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T 458 T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T 459 T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T 461 T{ 0 1 / -> 0 1 T/ }T 462 T{ 1 1 / -> 1 1 T/ }T 463 T{ 2 1 / -> 2 1 T/ }T 464 T{ -1 1 / -> -1 1 T/ }T 465 T{ -2 1 / -> -2 1 T/ }T 466 T{ 0 -1 / -> 0 -1 T/ }T 467 T{ 1 -1 / -> 1 -1 T/ }T 468 T{ 2 -1 / -> 2 -1 T/ }T 469 T{ -1 -1 / -> -1 -1 T/ }T 470 T{ -2 -1 / -> -2 -1 T/ }T 471 T{ 2 2 / -> 2 2 T/ }T 472 T{ -1 -1 / -> -1 -1 T/ }T 473 T{ -2 -2 / -> -2 -2 T/ }T 474 T{ 7 3 / -> 7 3 T/ }T 475 T{ 7 -3 / -> 7 -3 T/ }T 476 T{ -7 3 / -> -7 3 T/ }T 477 T{ -7 -3 / -> -7 -3 T/ }T 478 T{ MAX-INT 1 / -> MAX-INT 1 T/ }T 479 T{ MIN-INT 1 / -> MIN-INT 1 T/ }T 480 T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T 481 T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T 483 T{ 0 1 MOD -> 0 1 TMOD }T 484 T{ 1 1 MOD -> 1 1 TMOD }T 485 T{ 2 1 MOD -> 2 1 TMOD }T 486 T{ -1 1 MOD -> -1 1 TMOD }T 487 T{ -2 1 MOD -> -2 1 TMOD }T 488 T{ 0 -1 MOD -> 0 -1 TMOD }T 489 T{ 1 -1 MOD -> 1 -1 TMOD }T 490 T{ 2 -1 MOD -> 2 -1 TMOD }T 491 T{ -1 -1 MOD -> -1 -1 TMOD }T 492 T{ -2 -1 MOD -> -2 -1 TMOD }T 493 T{ 2 2 MOD -> 2 2 TMOD }T 494 T{ -1 -1 MOD -> -1 -1 TMOD }T 495 T{ -2 -2 MOD -> -2 -2 TMOD }T 496 T{ 7 3 MOD -> 7 3 TMOD }T 497 T{ 7 -3 MOD -> 7 -3 TMOD }T 498 T{ -7 3 MOD -> -7 3 TMOD }T 499 T{ -7 -3 MOD -> -7 -3 TMOD }T 500 T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T 501 T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T 502 T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T 503 T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T 505 T{ 0 2 1 */ -> 0 2 1 T*/ }T 506 T{ 1 2 1 */ -> 1 2 1 T*/ }T 507 T{ 2 2 1 */ -> 2 2 1 T*/ }T 508 T{ -1 2 1 */ -> -1 2 1 T*/ }T 509 T{ -2 2 1 */ -> -2 2 1 T*/ }T 510 T{ 0 2 -1 */ -> 0 2 -1 T*/ }T 511 T{ 1 2 -1 */ -> 1 2 -1 T*/ }T 512 T{ 2 2 -1 */ -> 2 2 -1 T*/ }T 513 T{ -1 2 -1 */ -> -1 2 -1 T*/ }T 514 T{ -2 2 -1 */ -> -2 2 -1 T*/ }T 515 T{ 2 2 2 */ -> 2 2 2 T*/ }T 516 T{ -1 2 -1 */ -> -1 2 -1 T*/ }T 517 T{ -2 2 -2 */ -> -2 2 -2 T*/ }T 518 T{ 7 2 3 */ -> 7 2 3 T*/ }T 519 T{ 7 2 -3 */ -> 7 2 -3 T*/ }T 520 T{ -7 2 3 */ -> -7 2 3 T*/ }T 521 T{ -7 2 -3 */ -> -7 2 -3 T*/ }T 522 T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T 523 T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T 525 T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T 526 T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T 527 T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T 528 T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T 529 T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T 530 T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T 531 T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T 532 T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T 533 T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T 534 T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T 535 T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T 536 T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T 537 T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T 538 T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T 539 T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T 540 T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T 541 T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T 542 T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T 543 T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T 545 \ ------------------------------------------------------------------------ 546 TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT 552 T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT 553 T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT 554 ( MISSING TEST: NEGATIVE ALLOT ) 560 T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT 561 T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL 562 T{ 1ST 1 CELLS + -> 2ND }T 563 T{ 1ST @ 2ND @ -> 1 2 }T 565 T{ 1ST @ 2ND @ -> 5 2 }T 567 T{ 1ST @ 2ND @ -> 5 6 }T 571 T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE 577 T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT 578 T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR 579 T{ 1STC 1 CHARS + -> 2NDC }T 580 T{ 1STC C@ 2NDC C@ -> 1 2 }T 582 T{ 1STC C@ 2NDC C@ -> 3 2 }T 584 T{ 1STC C@ 2NDC C@ -> 3 4 }T 586 ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT 587 CONSTANT A-ADDR CONSTANT UA-ADDR 588 T{ UA-ADDR ALIGNED -> A-ADDR }T 589 T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T 590 T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T 591 T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T 592 T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T 593 T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T 594 T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T 595 T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T 598 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ; 599 ( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS ) 600 T{ 1 CHARS 1 < -> <FALSE> }T 601 T{ 1 CHARS 1 CELLS > -> <FALSE> }T 602 ( TBD: HOW TO FIND NUMBER OF BITS? ) 604 ( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS ) 605 T{ 1 CELLS 1 < -> <FALSE> }T 606 T{ 1 CELLS 1 CHARS MOD -> 0 }T 607 T{ 1S BITS 10 < -> <FALSE> }T 612 T{ -1 1ST +! 1ST @ -> 0 }T 614 \ ------------------------------------------------------------------------ 615 TESTING CHAR [CHAR] [ ] BL S" 619 T{ CHAR HELLO -> 48 }T 620 T{ : GC1 [CHAR] X ; -> }T 621 T{ : GC2 [CHAR] HELLO ; -> }T 624 T{ : GC3 [ GC1 ] LITERAL ; -> }T 626 T{ : GC4 S" XY" ; -> }T 627 T{ GC4 SWAP DROP -> 2 }T 628 T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T 630 \ ------------------------------------------------------------------------ 631 TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE 634 T{ ' GT1 EXECUTE -> 123 }T 635 T{ : GT2 ['] GT1 ; IMMEDIATE -> }T 636 T{ GT2 EXECUTE -> 123 }T 637 HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING 638 HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING 639 T{ GT1STRING FIND -> ' GT1 -1 }T 640 T{ GT2STRING FIND -> ' GT2 1 }T 641 ( HOW TO SEARCH FOR NON-EXISTENT WORD? ) 642 T{ : GT3 GT2 LITERAL ; -> }T 644 T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T 646 T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T 649 T{ : GT6 345 ; IMMEDIATE -> }T 650 T{ : GT7 POSTPONE GT6 ; -> }T 653 T{ : GT8 STATE @ ; IMMEDIATE -> }T 655 T{ : GT9 GT8 LITERAL ; -> }T 656 T{ GT9 0= -> <FALSE> }T 658 \ ------------------------------------------------------------------------ 659 TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE 661 T{ : GI1 IF 123 THEN ; -> }T 662 T{ : GI2 IF 123 ELSE 234 THEN ; -> }T 670 T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T 671 T{ 0 GI3 -> 0 1 2 3 4 5 }T 676 T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T 677 T{ 3 GI4 -> 3 4 5 6 }T 681 T{ : GI5 BEGIN DUP 2 > 682 WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T 685 T{ 3 GI5 -> 3 4 5 123 }T 686 T{ 4 GI5 -> 4 5 123 }T 689 T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T 693 T{ 3 GI6 -> 0 1 2 3 }T 694 T{ 4 GI6 -> 0 1 2 3 4 }T 696 \ ------------------------------------------------------------------------ 697 TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT 699 T{ : GD1 DO I LOOP ; -> }T 700 T{ 4 1 GD1 -> 1 2 3 }T 701 T{ 2 -1 GD1 -> -1 0 1 }T 702 T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T 704 T{ : GD2 DO I -1 +LOOP ; -> }T 705 T{ 1 4 GD2 -> 4 3 2 1 }T 706 T{ -1 2 GD2 -> 2 1 0 -1 }T 707 T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T 709 T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T 710 T{ 4 1 GD3 -> 1 2 3 }T 711 T{ 2 -1 GD3 -> -1 0 1 }T 712 T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T 714 T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T 715 T{ 1 4 GD4 -> 4 3 2 1 }T 716 T{ -1 2 GD4 -> 2 1 0 -1 }T 717 T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T 719 T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T 724 T{ : GD6 ( PAT: T{0 0},{0 0}{1 0}{1 1},{0 0}{1 0}{1 1}{2 0}{2 1}{2 2} ) 726 I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP 732 \ ------------------------------------------------------------------------ 733 TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY 735 T{ 123 CONSTANT X123 -> }T 737 T{ : EQU CONSTANT ; -> }T 738 T{ X123 EQU Y123 -> }T 745 T{ : NOP : POSTPONE ; ; -> }T 746 T{ NOP NOP1 NOP NOP2 -> }T 750 T{ : DOES1 DOES> @ 1 + ; -> }T 751 T{ : DOES2 DOES> @ 2 + ; -> }T 754 T{ ' CR1 >BODY -> HERE }T 762 T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T 764 T{ ' W1 >BODY -> HERE }T 768 \ ------------------------------------------------------------------------ 771 : GE1 S" 123" ; IMMEDIATE 772 : GE2 S" 123 1+" ; IMMEDIATE 773 : GE3 S" : GE4 345 ;" ; 774 : GE5 EVALUATE ; IMMEDIATE 776 T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE ) 777 T{ GE2 EVALUATE -> 124 }T 778 T{ GE3 EVALUATE -> }T 781 T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE ) 783 T{ : GE7 GE2 GE5 ; -> }T 786 \ ------------------------------------------------------------------------ 787 TESTING SOURCE >IN WORD 789 : GS1 S" SOURCE" 2DUP EVALUATE 790 >R SWAP >R = R> R> = ; 791 T{ GS1 -> <TRUE> <TRUE> }T 794 : RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ; 800 : GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ; 801 T{ GS2 -> 123 123 123 123 123 }T 803 : GS3 WORD COUNT SWAP C@ ; 804 T{ BL GS3 HELLO -> 5 CHAR H }T 805 T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T 807 DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING 809 : GS4 SOURCE >IN ! DROP ; 813 \ ------------------------------------------------------------------------ 814 TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL 816 : S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS. 817 >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH 818 R> ?DUP IF \ IF NON-EMPTY STRINGS 820 OVER C@ OVER C@ - IF 2DROP <FALSE> UNLOOP EXIT THEN 821 SWAP CHAR+ SWAP CHAR+ 824 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH 826 R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH 829 : GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ; 832 : GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ; 835 : GP3 <# 1 0 # # #> S" 01" S= ; 838 : GP4 <# 1 0 #S #> S" 1" S= ; 841 24 CONSTANT MAX-BASE \ BASE 2 .. 36 843 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ; 844 COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD 848 MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE 849 I BASE ! \ TBD: ASSUMES BASE WORKS 850 I 0 <# #S #> S" 10" S= AND 857 MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY 858 R> BASE ! \ S: C-ADDR U 860 0 DO \ S: C-ADDR FLAG 861 OVER C@ [CHAR] 1 = AND \ ALL ONES 867 BASE @ >R MAX-BASE BASE ! 871 1 = SWAP C@ I 30 + = AND AND 875 1 = SWAP C@ 41 I A - + = AND AND 883 : GN-STRING GN-BUF 1 ; 884 : GN-CONSUMED GN-BUF CHAR+ 0 ; 885 : GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ; 887 T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T 888 T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T 889 T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T 890 T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE 891 T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T 892 T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T 895 BASE @ >R BASE ! >NUMBER R> BASE ! ; 897 T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T 898 T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T 899 T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T 900 T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T 901 T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T 902 T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T 904 : GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO. 907 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY 909 T{ 0 0 2 GN1 -> 0 0 0 }T 910 T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T 911 T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T 912 T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T 913 T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T 914 T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T 917 BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ; 920 \ ------------------------------------------------------------------------ 923 CREATE FBUF 00 C, 00 C, 00 C, 924 CREATE SBUF 12 C, 34 C, 56 C, 925 : SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ; 927 T{ FBUF 0 20 FILL -> }T 928 T{ SEEBUF -> 00 00 00 }T 930 T{ FBUF 1 20 FILL -> }T 931 T{ SEEBUF -> 20 00 00 }T 933 T{ FBUF 3 20 FILL -> }T 934 T{ SEEBUF -> 20 20 20 }T 936 T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE 937 T{ SEEBUF -> 20 20 20 }T 939 T{ SBUF FBUF 0 CHARS MOVE -> }T 940 T{ SEEBUF -> 20 20 20 }T 942 T{ SBUF FBUF 1 CHARS MOVE -> }T 943 T{ SEEBUF -> 12 20 20 }T 945 T{ SBUF FBUF 3 CHARS MOVE -> }T 946 T{ SEEBUF -> 12 34 56 }T 948 T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T 949 T{ SEEBUF -> 12 12 34 }T 951 T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T 952 T{ SEEBUF -> 12 34 34 }T 954 \ ------------------------------------------------------------------------ 955 TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U. 958 ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR 959 41 BL DO I EMIT LOOP CR 960 61 41 DO I EMIT LOOP CR 961 7F 61 DO I EMIT LOOP CR 962 ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR 963 9 1+ 0 DO I . LOOP CR 964 ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR 965 [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR 966 ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR 967 [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR 968 ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR 969 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR 970 ." YOU SHOULD SEE TWO SEPARATE LINES:" CR 971 S" LINE 1" TYPE CR S" LINE 2" TYPE CR 972 ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR 973 ." SIGNED: " MIN-INT . MAX-INT . CR 974 ." UNSIGNED: " 0 U. MAX-UINT U. CR 980 \ ------------------------------------------------------------------------ 981 TESTING INPUT: ACCEPT 983 CREATE ABUF 50 CHARS ALLOT 986 CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR 988 CR ." RECEIVED: " [CHAR] " EMIT 989 ABUF SWAP TYPE [CHAR] " EMIT CR 994 \ ------------------------------------------------------------------------ 995 TESTING DICTIONARY SEARCH RULES 997 T{ : GDX 123 ; : GDX GDX 234 ; -> }T 1001 CR .( End of Core word set tests) CR