I have ported L.C. Benschop's Stack Oriented Design processor (1994) to iForth, and extended it so that it can generate 64-bit Forths.
SOD is a very elegant design. Its opcodes are 5 bit long, so
12 of them fit in a single 64 bit CELL. Three bits in the CELL are used to signify RETURN, CALL, LITERAL or packed instructions.SOD64 needs a virtual machine to run. I have written one in
32bit iForth. This means SOD64 executes on 32bit Linux and Windows. The image files on both platforms are bit-for-bit the same (like 4th). You could write an LSE64 in it :-)As you can see, doubles in SOD64 are 128 bits wide:
-1 -1 1 RSHIFT D. 170141183460469231731687303715884105727 OK
SOD64 can metacompile and extend itself. However, because it needs a virtual machine, you need a 32bit Forth to host it.
I may feel inspired to port Lennart's C engine over to Linux. In that case SOD64 would become a standalone 64bit Forth that can can generate efficient and small (20 K) 64-bit executables. Windows64 may be a problem though (I don't have that platform).
SOD64 is a quite complete ANS Forth with some good utilities, as you can see below. There is no floating-point (yet), though.
-marcel
--- ------------------ FORTH> sod64 forth.img
20160 bytes image read Welcome to ForthSEE CR $00000440 $CFE8EF7F 13 1 1 + 32 SPECIAL 10 1 1 + 32 SPECIAL ; OK
SEE WORDS $000042E8 $A09D3FFF 7192 7256 @ 1 NEGATE + 1 1 + 1 + LSHIFT $00004300 $000039D1 + @ @ $00004308 $00000031 DUP $00004310 $0000433A JZ $00004338 $00004318 $00000031 DUP $00004320 $000042B0 CALL $000042B0 $00004328 $0387413D 8 NEGATE + @ 0 $00004330 $0000430A JZ $00004308 $00004338 $00000029 DROP ; OK
0 100 DUMP 00000000: 00 00 00 00 00 00 3A 88 00 00 00 00 00 00 39 B0 ......:.......9¦ 00000010: 00 00 00 00 00 00 00 00 A4 4E 4F 4F 50 00 00 00 ........ñNOOP... 00000020: 80 00 00 00 00 00 00 01 00 00 00 00 00 00 00 18 ................ 00000030: A4 53 57 41 50 00 00 00 80 00 00 00 00 00 00 03 ñSWAP........... 00000040: 00 00 00 00 00 00 00 30 A3 52 4F 54 00 00 00 00 .......0úROT.... 00000050: 80 00 00 00 00 00 00 05 00 00 00 00 00 00 00 48 ...............H 00000060: A2 30 3D 00 00 00 00 00 80 00 00 00 00 00 00 07 ó0=............. OK-1 -1 1 RSHIFT D. 170141183460469231731687303715884105727 OK
CR WORDS SAVE-SYSTEM SEE IDIS DO_SEE seers SDO_SPECIAL SDO_LIT SDO_8 SDO_1 SDO_0 SDO_R> SDO_R@ SDO_OVER SDO_DUP SDO_!A SDO_C!A SDO_>R SDO_DROP SDO_SCAN1 SDO_+CY SDO_UM/MOD SDO_RSHIFT SDO_LSHIFT SDO_< SDO_U< SDO_XOR SDO_OR SDO_AND SDO_+ SDO_@ SDO_C@ SD O_UM* SDO_NEGATE SDO_0= SDO_ROT SDO_SWAP SDO_NOOP H. ir ip cellmask WORDS ID. .S DUMP DL VOCABULARY ONLY ROOT-WORDLIST FORTH DEFINITIONS WORDLIST PREVIOUS ALSO SET-ORDER GET-ORDER PAGE CLS .ELAPSED TIMER-RESET NIP -TRAILING WITHIN BOUNDS
0BODY \ ( IMMEDIATE POSTPONE ABORT ABORT" S" ." RECURSE +LOOP LOOP RESOLVE-LEAVE LEAVE ?DO DO [CHAR] CHAR ['] ' POCKET REPEAT WHILE ELSE THEN IF UNTIL BEGIN : (POSTPONE) ; ?CSP !CSP 'LEAVE CSP COMPILE, EXPAND-MACRO LITERAL INSERT-OPCODE CODEFLUSH OPSHIFT OPLOC [ ] STATE CONSTANT VARIABLE CREATE REVEAL HEADER NAME> >NAME ALIGN C, , ALLOT (ABORT") NUMBER? CONVERT >NUMBER DIGIT? FIND SEARCH-WORDLIST NAME>BUF CURRENT #ORDER CONTEXT LAST FORTH-WORDLIST NAMEBUF WORD PLACE PARSE SKIP SCAN REFILL SOURCE-ID SOURCE QUERY EXPECT #SRC SRC SID >IN #TIB SPAN TIB ACCEPT FILE-SIZE SYSTEM FILE-POSITION REPOSITION-FILE DELETE-FILE READ-FILE WRITE-FILE READ-LINE WRITE-LINE CLOSE-FILE CREATE-FILE OPEN-FILE OSCALL BIN R/W W/O R/O 2SWAP 2OVER FILL MOVE ROLL CMOVE>CMOVE . U. D. #> D */ */MOD * M* FM/MOD SM/REM DABS ABS DNEGATE MAX MIN ?DUP 2DROP 2DUP 2! D+ 2@ +! CELL- CELLS CELL+ CHAR- CHARS CHAR+ 2/ 2* INVERT
1- 1+ ON OFF ! C! PICK BL TRUE FALSE (S") (.") ALIGNED TYPE COUNT -1 (+LOOP) (LOOP) UNLOOP (LEAVE) J I (?DO) (DO) DEPTH RP! RP@ SP! SP@ R0 S0 CR BYE KEY EMIT U> 0>