fix(v4): the final review's six minors in the ROM boot
- Text after start is refused, as text.c refuses it: before it jumps, the ROM reads on to the end of the source; blanks, comments and the ends of blobs may follow, a token is ERR-AFTER (26), "text after start". - A token too long where a name, a target or a value is wanted is "name too long", as text.c says: (MISSING) reports "missing" only when no error came first. `", keeps "missing", which is text.c's word for both. - text.c's "address out of range" names the address, not the value. - The system's source files are one list, v4/sys_files.h: boot.c, the harness and the nucleus test are made from it. - The ROM's error codes and words are one list, v4/rom_errors.h: boot.c's messages, host_map.h's ROM_ERR_* and mkmap's ERR-* are made from it. - node.h says what v4_node_store does with a ROM address (nothing, as for any address outside RAM, D-14); test_host_rom_range pins it. ROM: 2095 words, rom_hash 0x06d0dcb7a0cb41a1. dict_hash unchanged, 0xe5a57f3eb72ff94a. make -C v4 test test-32 hosted-check pass. QEMU: amd64, aarch64, riscv64 to ok>, POST 538/538, POST: PASSED. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
ff75e69e91
commit
a28b5f2230
+12
-18
@@ -8,6 +8,8 @@
|
||||
#include "v4/post.h"
|
||||
#include "v4/blocks.h"
|
||||
#include "v4/boot.h"
|
||||
#include "v4/rom_errors.h"
|
||||
#include "v4/sys_files.h"
|
||||
#include "v4/message.h"
|
||||
#include "v4/wire.h"
|
||||
#include "starkernel/capsule.h"
|
||||
@@ -430,32 +432,24 @@ extern const unsigned v4_rom_32_words;
|
||||
#define EOT 4 /* the end of the source: the ROM's (KEY) sees no more */
|
||||
|
||||
/* The system's source, in the order the ROM reads it: the memory map, then
|
||||
* the system, then its end -- the state it is switched on in, and `start`.
|
||||
* capsules/v4/sys; each blob is a capsule like any other. */
|
||||
* the system (v4/sys_files.h), then its end -- the state it is switched on
|
||||
* in, and `start`. capsules/v4/sys; each blob is a capsule like any other. */
|
||||
#define MAP_NAME_(bits) "v4:sys:map-" #bits ".f18"
|
||||
#define MAP_NAME__(bits) MAP_NAME_(bits)
|
||||
static const char *const system_blobs[] = {
|
||||
#define SYS_BLOB(file) "v4:sys:" #file ".f18",
|
||||
MAP_NAME__(V4_CELL_BITS),
|
||||
"v4:sys:core.f18", "v4:sys:input.f18", "v4:sys:dict.f18", "v4:sys:codegen.f18", "v4:sys:compile.f18",
|
||||
"v4:sys:quit.f18", "v4:sys:forth.f18", "v4:sys:numout.f18", "v4:sys:words.f18", "v4:sys:system.f18",
|
||||
"v4:sys:qmath.f18", "v4:sys:blocks.f18", "v4:sys:log.f18", "v4:sys:acl.f18",
|
||||
V4_SYS_FILES(SYS_BLOB)
|
||||
"v4:sys:end.f18",
|
||||
#undef SYS_BLOB
|
||||
};
|
||||
#define SYSTEM_BLOBS (sizeof system_blobs / sizeof system_blobs[0])
|
||||
|
||||
/* What the ROM's error codes mean (v4/tests/host_map.h, ROM_ERR_*): the ROM
|
||||
* stops with the code, and the loader, which owns the console, says it. */
|
||||
static const char *const rom_errors[] = {
|
||||
"", "name too long", "comment not closed", "cannot be used as a name", "already defined",
|
||||
"too many names", "does not fit: memory is full, or a branch cannot reach", "not an opcode the packer takes there",
|
||||
"not allowed in a macro", "macro without endmacro, or endmacro without macro",
|
||||
"label already defined in this word", "too many labels in one word",
|
||||
"FOR nested too deep, NEXT or UNEXT without FOR, or FOR without NEXT",
|
||||
"FOR ... UNEXT must fit one instruction word and hold no literal", "not something to branch to",
|
||||
"never defined", "number does not fit a cell", "& needs a word that is already defined",
|
||||
"write the number, not @p", "a name, a target, a value or a string is missing", "macros nested too deep",
|
||||
"too many unresolved branches", "not a value", "the source ended with no start", "start of something not a word", "address out of range",
|
||||
};
|
||||
/* What the ROM's error codes mean (v4/rom_errors.h): the ROM stops with the
|
||||
* code, and the loader, which owns the console, says it. Code c is entry c. */
|
||||
#define ROM_ERROR_TEXT(name, code, text) text,
|
||||
static const char *const rom_errors[] = { "", V4_ROM_ERRORS(ROM_ERROR_TEXT) };
|
||||
#undef ROM_ERROR_TEXT
|
||||
#define ROM_ERRORS (sizeof rom_errors / sizeof rom_errors[0])
|
||||
|
||||
/* FNV-1a over the ROM, a cell at a time, low byte first, as the dictionary
|
||||
|
||||
Reference in New Issue
Block a user