diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2023-03-08 19:57:26 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2023-03-08 19:57:26 -0500 |
commit | dcd5e792b1d84afd1bea9780781674b6e6ad8dc3 (patch) | |
tree | 6b841cd741c3d8df6cb7b22f1423a5c814e0add9 /libalee/dictionary.hpp | |
parent | 1960aa8773e51a76f0a5a653c8a4eb4fbef5e4ba (diff) |
move libalee into folder
Diffstat (limited to 'libalee/dictionary.hpp')
-rw-r--r-- | libalee/dictionary.hpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/libalee/dictionary.hpp b/libalee/dictionary.hpp new file mode 100644 index 0000000..4dcae77 --- /dev/null +++ b/libalee/dictionary.hpp @@ -0,0 +1,79 @@ +/** + * Alee Forth: A portable and concise Forth implementation in modern C++. + * Copyright (C) 2023 Clyne Sullivan <clyne@bitgloo.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef ALEEFORTH_DICTIONARY_HPP +#define ALEEFORTH_DICTIONARY_HPP + +#include "types.hpp" + +#include <cstddef> +#include <cstdint> + +/** + * Dictionary entry format: + * - 1 information byte + * bits 0..4: Length of name (L) + * bit 5: Immediate? + * bits 6..15: Distance to next entry (negative) + * - L bytes of name + * - 0+ bytes for address alignment + * - 0+ bytes of entry's data... + */ + +class Dictionary +{ +public: + constexpr static Addr Base = 0; + constexpr static Addr Here = sizeof(Cell); + constexpr static Addr Latest = sizeof(Cell) * 2; + constexpr static Addr Compiling = sizeof(Cell) * 3; + constexpr static Addr Source = sizeof(Cell) * 4; + constexpr static Addr SourceLen = sizeof(Cell) * 5; + constexpr static Addr Input = sizeof(Cell) * 6; // len data... + constexpr static Addr InputCells = 80; // bytes! + constexpr static Addr Begin = sizeof(Cell) * 7 + InputCells; + + void initialize(); + + Addr here() const noexcept { return read(Here); } + void here(Addr l) noexcept { write(Here, l); } + + Addr latest() const noexcept { return read(Latest); } + void latest(Addr l) noexcept { write(Latest, l); } + + virtual Cell read(Addr) const noexcept = 0; + virtual void write(Addr, Cell) noexcept = 0; + virtual uint8_t readbyte(Addr) const noexcept = 0; + virtual void writebyte(Addr, uint8_t) noexcept = 0; + + Addr alignhere() noexcept; + Addr aligned(Addr) const noexcept; + Addr allot(Cell) noexcept; + void add(Cell) noexcept; + void addDefinition(Word) noexcept; + + Addr find(Word) noexcept; + Addr getexec(Addr) noexcept; + Word input() noexcept; + + bool equal(Word, const char *, unsigned) const noexcept; + bool equal(Word, Word) const noexcept; +}; + +#endif // ALEEFORTH_DICTIONARY_HPP + |