distancepos constant

native
Clyne 12 months ago
parent 22a89e9949
commit 2261914a6b
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -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.

@ -91,14 +91,14 @@ Addr Dictionary::find(Word word) noexcept
const Addr len = l & 0x1F;
Word lw;
if ((l >> 6) < MaxDistance) {
if ((l >> Dictionary::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 >> Dictionary::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 >> Dictionary::DistancePos) == MaxDistance)
addr += sizeof(Cell);
addr += len;

@ -73,8 +73,10 @@ public:
/** "Immediate" marker bit for a word's definition. */
constexpr static Cell Immediate = (1 << 5);
constexpr static Cell DistancePos = 6;
/** 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;

Loading…
Cancel
Save