capsules/v4/sys: the nucleus's fourteen sources as .f18 blobs (made once by v4/tools/v4tof18.py: header becomes the ROM's directives, every other token and line kept), the memory map as map-<width>.f18 (mkmap sys, from one table in host_map.h that host_load reads too), and end.f18, the switch-on state mkimage.c set in C, the image record, and start (IDLE). test_host_rom_nucleus.c: the ROM, fed those blobs through the console, builds RAM identical word for word to mkimage.c's, outside its own state and the image record, and starts at (IDLE), at both widths. The cost: 60.7 million instructions, 1.5 s on the C model. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
141 lines
5.9 KiB
C
141 lines
5.9 KiB
C
/* mkmap.c -- the memory map, as constants the ROM is assembled with.
|
|
*
|
|
* mkmap > rom-map-<width>.f18
|
|
* mkmap sys > capsules/v4/sys/map-<width>.f18
|
|
*
|
|
* Runs on the build machine, built for the host node (HOST_WORDS and the
|
|
* host stack sizes) at one cell width. It writes, as `constant` lines in
|
|
* the text assembler's notation, the addresses and codes of
|
|
* v4/tests/host_map.h that the ROM's source (capsules/v4/rom) uses: the
|
|
* console's receive registers and the ROM's state area (MACHINE.md 2.1).
|
|
* The map has one source, host_map.h; this is how the ROM reads it.
|
|
*/
|
|
#include "../tests/host_map.h"
|
|
#include <stdio.h>
|
|
|
|
static void constant(const char *name, long value)
|
|
{
|
|
printf("constant %s %ld\n", name, value);
|
|
}
|
|
|
|
/* `mkmap sys`: the system's map, the blob the ROM reads before the system's
|
|
* source (capsules/v4/sys/map-<width>.f18): every constant host_load gives
|
|
* the nucleus, and the two its end (capsules/v4/sys/end.f18) needs besides. */
|
|
static int system_map(void)
|
|
{
|
|
printf("\\ map-%d.f18 -- the memory map the system's source is assembled with, %d-bit cells.\n", V4_CELL_BITS, V4_CELL_BITS);
|
|
printf("\\ Generated by v4/tools/mkmap.c (mkmap sys) from v4/tests/host_map.h -- do not edit.\n");
|
|
#define SYS_CONSTANT(name, value) constant(name, (long)(v4_cell)(value));
|
|
HOST_CONSTANTS(SYS_CONSTANT)
|
|
#undef SYS_CONSTANT
|
|
constant("DICT-W", (long)DICT_W);
|
|
constant("(IMG)", (long)ROM_IMG);
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
(void)host_load; /* host_map.h's loader is not this tool's */
|
|
(void)host_branch_slots;
|
|
if (argc == 2 && argv[1][0] == 's') return system_map();
|
|
printf("\\ Generated by v4/tools/mkmap.c from v4/tests/host_map.h -- do not edit.\n");
|
|
constant("CONSOLE-RX", (long)CONSOLE_RX);
|
|
constant("CONSOLE-STATUS", (long)CONSOLE_ST);
|
|
constant("(TOK)", (long)ROM_TOK);
|
|
constant("(TOKN)", (long)ROM_TOKN);
|
|
constant("(PEEK)", (long)ROM_PEEK);
|
|
constant("(LINE)", (long)ROM_LINE);
|
|
constant("(EOF)", (long)ROM_EOF);
|
|
constant("(FAILED)", (long)ROM_FAILED);
|
|
constant("(ERRLINE)", (long)ROM_ERRLINE);
|
|
constant("(NBASE)", (long)ROM_NBASE);
|
|
constant("(NNEG)", (long)ROM_NNEG);
|
|
constant("(NI)", (long)ROM_NI);
|
|
constant("(NU)", (long)ROM_NU);
|
|
constant("(NBIG)", (long)ROM_NBIG);
|
|
constant("(RECN)", (long)ROM_RECN);
|
|
constant("(POOLN)", (long)ROM_POOLN);
|
|
constant("(REC)", (long)ROM_REC);
|
|
constant("(CNT)", (long)ROM_CNT);
|
|
constant("(PTR)", (long)ROM_PTR);
|
|
constant("(I)", (long)ROM_I);
|
|
constant("(WI)", (long)ROM_WI);
|
|
constant("(SYMH)", (long)ROM_SYMH);
|
|
constant("SYMREC", (long)ROM_SYMREC);
|
|
constant("POOLTOP", (long)ROM_POOLTOP);
|
|
constant("ERR-BAD-NAME", (long)ROM_ERR_BAD_NAME);
|
|
constant("ERR-DEFINED", (long)ROM_ERR_DEFINED);
|
|
constant("ERR-NAMES", (long)ROM_ERR_NAMES);
|
|
constant("(HERE)", (long)ROM_HERE);
|
|
constant("(CUR)", (long)ROM_CUR);
|
|
constant("(SLOT)", (long)ROM_SLOT);
|
|
constant("(NLIT)", (long)ROM_NLIT);
|
|
constant("(LITS)", (long)ROM_LITS);
|
|
constant("(PI)", (long)ROM_PI);
|
|
constant("(RS)", (long)ROM_RS);
|
|
constant("(RN)", (long)ROM_RN);
|
|
constant("RAM-WORDS", (long)V4_NODE_WORDS);
|
|
constant("ADDR-TOP", (long)ROM_ADDR_TOP);
|
|
constant("ERR-FIT", (long)ROM_ERR_FIT);
|
|
constant("ERR-OPCODE", (long)ROM_ERR_OPCODE);
|
|
constant("(NREF)", (long)ROM_NREF);
|
|
constant("(NLAB)", (long)ROM_NLAB);
|
|
constant("(WNP)", (long)ROM_WNP);
|
|
constant("(NFOR)", (long)ROM_NFOR);
|
|
constant("(FORS)", (long)ROM_FORS);
|
|
constant("(RDEPTH)", (long)ROM_RDEPTH);
|
|
constant("(RPTRS)", (long)ROM_RPTRS);
|
|
constant("(T1)", (long)ROM_T1);
|
|
constant("(T2)", (long)ROM_T2);
|
|
constant("(T3)", (long)ROM_T3);
|
|
constant("(T4)", (long)ROM_T4);
|
|
constant("(CFROM)", (long)ROM_CFROM);
|
|
constant("(CTO)", (long)ROM_CTO);
|
|
constant("(CN)", (long)ROM_CN);
|
|
constant("(RAW)", (long)ROM_RAW);
|
|
constant("(T5)", (long)ROM_T5);
|
|
constant("(T6)", (long)ROM_T6);
|
|
constant("(MLEN)", (long)ROM_MLEN);
|
|
constant("(REFS)", (long)ROM_REFS);
|
|
constant("(LABELS)", (long)ROM_LABELS);
|
|
constant("(WNAMES)", (long)ROM_WNAMES);
|
|
constant("(TSAVE)", (long)ROM_TSAVE);
|
|
constant("(MTEMP)", (long)ROM_MTEMP);
|
|
constant("(MBODY)", (long)ROM_MBODY);
|
|
constant("ORIGIN", (long)ROM_ORIGIN);
|
|
constant("REFS-MAX", (long)ROM_REFS_MAX);
|
|
constant("WN-SIZE", (long)ROM_WN_SIZE);
|
|
constant("MBODY-SIZE", (long)ROM_MBODY_SIZE);
|
|
constant("DICT-W", (long)DICT_W);
|
|
constant("DICT-END", (long)DICT_END_W);
|
|
constant("BUF0", (long)BUF0_W);
|
|
constant("TIB-W", (long)TIB_W);
|
|
constant("ERR-IN-MACRO", (long)ROM_ERR_IN_MACRO);
|
|
constant("ERR-MACRO", (long)ROM_ERR_MACRO);
|
|
constant("ERR-LABEL-DUP", (long)ROM_ERR_LABEL_DUP);
|
|
constant("ERR-LABELS", (long)ROM_ERR_LABELS);
|
|
constant("ERR-FOR", (long)ROM_ERR_FOR);
|
|
constant("ERR-UNEXT", (long)ROM_ERR_UNEXT);
|
|
constant("ERR-TARGET", (long)ROM_ERR_TARGET);
|
|
constant("ERR-UNDEFINED", (long)ROM_ERR_UNDEFINED);
|
|
constant("ERR-BIG", (long)ROM_ERR_BIG);
|
|
constant("ERR-AMP", (long)ROM_ERR_AMP);
|
|
constant("ERR-FETCH-P", (long)ROM_ERR_FETCH_P);
|
|
constant("ERR-MISSING", (long)ROM_ERR_MISSING);
|
|
constant("ERR-DEEP", (long)ROM_ERR_DEEP);
|
|
constant("ERR-REFS", (long)ROM_ERR_REFS);
|
|
constant("ERR-VALUE", (long)ROM_ERR_VALUE);
|
|
constant("ERR-NO-START", (long)ROM_ERR_NO_START);
|
|
constant("ERR-START", (long)ROM_ERR_START);
|
|
constant("DSTACK-REG", (long)DSTACK_REG);
|
|
constant("RSTACK-REG", (long)RSTACK_REG);
|
|
/* the cell width's constants (NUMBER) needs, written as signed cells */
|
|
constant("MSB", (long)(v4_cell)V4_MSB);
|
|
constant("DEC-LIMIT", (long)(v4_cell)(~(v4_ucell)0 / 10u));
|
|
constant("DEC-NLAST", -(long)(~(v4_ucell)0 % 10u) - 1);
|
|
constant("HEX-HIGH", (long)(v4_cell)~(~(v4_ucell)0 >> 4));
|
|
constant("ERR-TOO-LONG", (long)ROM_ERR_TOO_LONG);
|
|
constant("ERR-COMMENT", (long)ROM_ERR_COMMENT);
|
|
return 0;
|
|
}
|