The boot is now nucleus, forth79.4th, POST, prompt, on both products. - forth79.4th: U* and U/MOD, the capsule's first colon definitions. They are in the FORTH-79 Required Word Set and neither v3 nor v4 had them. - post79.4th: 550 cases, 126 of the 130 required words. 443 are v3's with v3's result. The rest follow three rulings (2026-10-05): address- dependent cases are checked for count, not value; where v3 departs from FORTH-79 the standard's result is expected; words v3 has no case for get cases written by hand. v4/tools/post79_rules.py holds each exception with its reason and docs/v4.0.0/POST79.md lists them all. - every case starts from an empty stack, DECIMAL and FORTH DEFINITIONS - the boot requires POST's tally line with fail=0 Verified: tests=550 pass=550 fail=0 and identical PARITY lines on hosted amd64, aarch64 and riscv64 (make -C v4 hosted-check) and on bare metal, clean qemu with STARFORTH_V4=1, on the same three (logs/20261005-1619xx, -1621xx, -1625xx). A U/MOD broken on purpose fails five cases and stops the boot. make -C v4 test passes. Not shown: all words but those two are still assembled, so POST has so far tested the assembled words. Nothing was typed at a bare-metal prompt. Open: PAD 42 OVER ! faults on v4 (D-1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 lines
1.2 KiB
Forth
29 lines
1.2 KiB
Forth
Block 6000
|
|
( forth79.4th -- the FORTH-79 Required Word Set for v4, )
|
|
( as colon definitions, loaded when the system boots. )
|
|
( docs/v4.0.0/NUCLEUS.md. Blocks 6000 up. )
|
|
( A word moves here from the assembled nucleus, v4/capsule, )
|
|
( once its colon definition passes POST. )
|
|
Block 6001
|
|
( U* U/MOD -- FORTH-79 unsigned multiply and divide. )
|
|
( Neither v3 nor the v4 nucleus had them. )
|
|
( The first two words count the bits in a cell. )
|
|
: (BITS) ( -- n )
|
|
0 1 BEGIN DUP WHILE 2* SWAP 1+ SWAP REPEAT DROP ;
|
|
(BITS) CONSTANT (NB)
|
|
VARIABLE (UD)
|
|
( u1 u2 -- ud the unsigned double product )
|
|
: U* UM* ;
|
|
Block 6002
|
|
( ud u1 -- u2 u3 unsigned: u2 the remainder, u3 the quotient )
|
|
( One bit a step: shift ud left, and take u1 from its high )
|
|
( cell whenever it goes, counting that in the low cell. )
|
|
( A zero divisor is error 11, Division by zero. )
|
|
: U/MOD
|
|
DUP 0= IF DROP DROP DROP 11 NODE-ERROR ! THEN (UD) !
|
|
(NB) 0 DO
|
|
DUP 0< >R 2* OVER 0< IF 1+ THEN SWAP 2* SWAP
|
|
R> IF (UD) @ - SWAP 1+ SWAP
|
|
ELSE DUP (UD) @ U< 0= IF (UD) @ - SWAP 1+ SWAP THEN THEN
|
|
LOOP SWAP ;
|