]> code.bitgloo.com Git - bitgloo/alee-forth.git/commitdiff
add native definition bit
authorClyne Sullivan <clyne@bitgloo.com>
Sat, 18 Nov 2023 01:27:33 +0000 (20:27 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Sat, 18 Nov 2023 01:27:33 +0000 (20:27 -0500)
forth/tools.fth
libalee/corewords.cpp
libalee/dictionary.cpp
libalee/dictionary.hpp

index b27955d40cd13421c023290d96b9c70e329e9ce6..3cee2bff85b5947d5906795a7fbaca03c42a2f2b 100644 (file)
@@ -6,8 +6,8 @@
 : words    _latest @ begin
            dup @ dup 31 &
            2 pick cell+ \ lt l len ws
-           2 pick 6 >> 1023 < if \ lt l len ws
-           rot 6 >> else \ lt len ws adv
+           2 pick 7 >> 1023 < if \ lt l len ws
+           rot 7 >> else \ lt len ws adv
            >r cell+ rot drop r> @ then
            -rot swap type space \ lt adv
            over _begin <> while - repeat 2drop ;
index d47e0929408b7c64c82ac40ca8e09e4b14a80fac..8ff7ac6dc942ee756eadcfcd15e880b933d84775 100644 (file)
@@ -241,7 +241,7 @@ void CoreWords::word_semic(State& state) { // Concludes word definition.
         dcell = Dictionary::MaxDistance;
     }
     state.dict.write(cell,
-        (state.dict.read(cell) & 0x1F) | static_cast<Cell>(dcell << 6));
+        (state.dict.read(cell) & 0x1F) | static_cast<Cell>(dcell << Dictionary::DistancePos));
     state.dict.latest(cell);
 }
 void CoreWords::word_jmp0(State& state) { // Jump if popped value equals zero.
index b1cbc5f17a3696c58a21c47bbdfa6fe671164b61..e4f6761082cf79d549bc554690515f488f98d344 100644 (file)
@@ -91,14 +91,14 @@ Addr Dictionary::find(Word word) noexcept
         const Addr len = l & 0x1F;
         Word lw;
 
-        if ((l >> 6) < MaxDistance) {
+        if ((l >> DistancePos) < MaxDistance) {
             lw = Word::fromLength(lt + sizeof(Cell), len);
             if (equal(word, lw))
                 return lt;
             else if (lt == Begin)
                 break;
             else
-                lt -= l >> 6;
+                lt -= l >> DistancePos;
         } else {
             lw = Word::fromLength(lt + 2 * sizeof(Cell), len);
             if (equal(word, lw))
@@ -120,7 +120,7 @@ Addr Dictionary::getexec(Addr addr) noexcept
     const Addr len = l & 0x1Fu;
 
     addr += sizeof(Cell);
-    if ((l >> 6) == MaxDistance)
+    if ((l >> DistancePos) == MaxDistance)
         addr += sizeof(Cell);
 
     addr += len;
index ad1ee02afd42f658a5dc602286d3cfd5ace88be4..092026bf7192c3423b8c69fe19948c7378fbc78e 100644 (file)
@@ -73,8 +73,12 @@ public:
 
     /** "Immediate" marker bit for a word's definition. */
     constexpr static Cell Immediate = (1 << 5);
+    /** TODO */
+    constexpr static Cell Native = (1 << 6);
+    /** TODO */
+    constexpr static Cell DistancePos = 7;
     /** Maximum "short" distance between two definitions. */
-    constexpr static Cell MaxDistance = (1 << (sizeof(Cell) * 8 - 6)) - 1;
+    constexpr static Cell MaxDistance = (1 << (sizeof(Cell) * 8 - DistancePos)) - 1;
 
     /** Returns the value of the cell at the given address. */
     virtual Cell read(Addr) const noexcept = 0;