From e6ca85f4f6cc8eeedbdc6c8893f4e531b69cf1ee Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Sat, 4 Jun 2022 20:38:36 -0700 Subject: [PATCH 1/3] Introducing ARSHIFT (Arithmetic Shift Right) to fix heart game. --- common/base_tests.fs | 5 +++++ common/forth_namespace_tests.fs | 1 + common/graphics_utils.fs | 8 ++++---- common/heart.fs | 8 ++++---- common/opcodes.h | 1 + examples/bezier_test.fs | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/common/base_tests.fs b/common/base_tests.fs index c414990..ce2ab44 100644 --- a/common/base_tests.fs +++ b/common/base_tests.fs @@ -138,3 +138,8 @@ e: test-rshift $1234 4 rshift $123 =assert -1 cell 8 * 1- rshift 1 =assert ;e + +e: test-arshift + $1234 4 arshift $123 =assert + -1 cell 8 * 1- arshift -1 =assert +;e diff --git a/common/forth_namespace_tests.fs b/common/forth_namespace_tests.fs index 7aaac6f..3fe2e3c 100644 --- a/common/forth_namespace_tests.fs +++ b/common/forth_namespace_tests.fs @@ -220,6 +220,7 @@ e: check-core-opcodes out: */MOD out: LSHIFT out: RSHIFT + out: ARSHIFT out: AND out: OR out: XOR diff --git a/common/graphics_utils.fs b/common/graphics_utils.fs index 38781d3..0b53281 100644 --- a/common/graphics_utils.fs +++ b/common/graphics_utils.fs @@ -65,10 +65,10 @@ gstack value gp graphics definitions also internals : box { left top w h } - left sx * tx + 16 rshift - top sy * ty + 16 rshift - w sx * 16 rshift - h sy * 16 rshift + left sx * tx + 16 arshift + top sy * ty + 16 arshift + w sx * 16 arshift + h sy * 16 arshift raw-box ; diff --git a/common/heart.fs b/common/heart.fs index b67f08d..3c95e15 100644 --- a/common/heart.fs +++ b/common/heart.fs @@ -85,10 +85,10 @@ graphics internals definitions graphics definitions also internals : heart 0 { x y s r } - x sx * tx + 16 rshift - y sy * ty + 16 rshift - s sx * 16 rshift - s sy * 16 rshift + x sx * tx + 16 arshift + y sy * ty + 16 arshift + s sx * 16 arshift + s sy * 16 arshift raw-heart ; diff --git a/common/opcodes.h b/common/opcodes.h index bfa55ca..6b41217 100644 --- a/common/opcodes.h +++ b/common/opcodes.h @@ -83,6 +83,7 @@ typedef struct { X("*/MOD", SSMOD, SSMOD_FUNC) \ Y(LSHIFT, tos = (*sp-- << tos)) \ Y(RSHIFT, tos = (((ucell_t) *sp--) >> tos)) \ + Y(ARSHIFT, tos = (*sp-- >> tos)) \ Y(AND, tos &= *sp--) \ Y(OR, tos |= *sp--) \ Y(XOR, tos ^= *sp--) \ diff --git a/examples/bezier_test.fs b/examples/bezier_test.fs index 7d68ad5..fc65f88 100755 --- a/examples/bezier_test.fs +++ b/examples/bezier_test.fs @@ -68,7 +68,7 @@ scanlines max-scanlines cells erase : draw-spans max-scanlines 0 do i draw-row loop ; : 0.<< ( n -- n ) 16 lshift ; -: 0.>> ( n -- n ) 16 rshift ; +: 0.>> ( n -- n ) 16 arshift ; : line ( x1 y1 x2 y2 ) 0 0 0 0 { x1 y1 x2 y2 dx dy sy ey } From 4b20986bd83d3fefa7d2cccbac406077d1c5ac86 Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Sat, 4 Jun 2022 21:34:58 -0700 Subject: [PATCH 2/3] Improve web version. --- Makefile | 10 +++++++++- common/source_to_string.js | 7 +++++++ web/fuse_web.js | 6 +++--- web/web.template.js | 2 -- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 80ae068..35c78d3 100644 --- a/Makefile +++ b/Makefile @@ -238,6 +238,14 @@ $(GEN)/web_cases.js: $(GEN)/dump_web_opcodes | $(GEN) $(GEN)/web_dict.js: $(GEN)/dump_web_opcodes | $(GEN) $< dict >$@ +WEB_BOOT = $(COMMON_PHASE1) \ + posix/posix.fs posix/allocation.fs posix/termios.fs \ + $(COMMON_PHASE2) \ + posix/autoboot.fs \ + common/fini.fs +$(GEN)/web_boot.js: common/source_to_string.js $(WEB_BOOT) | $(GEN) + $< -web boot $(VERSION) $(REVISION) $(WEB_BOOT) >$@ + # ---- RESOURCES ---- $(RES): @@ -283,7 +291,7 @@ $(WEB)/terminal.html: web/terminal.html | $(WEB) $(WEB)/ueforth.js: \ web/fuse_web.js \ web/web.template.js \ - common/boot.fs \ + $(GEN)/web_boot.js \ $(GEN)/web_dict.js \ $(GEN)/web_cases.js | $(WEB) $^ >$@ diff --git a/common/source_to_string.js b/common/source_to_string.js index 9ad5d82..e10415e 100755 --- a/common/source_to_string.js +++ b/common/source_to_string.js @@ -31,12 +31,17 @@ function DropCopyright(source) { } var is_windows = false; +var is_web = false; var args = process.argv.slice(2); if (args.length > 0 && args[0] == '-win') { is_windows = true; args.shift(); } +if (args.length > 0 && args[0] == '-web') { + is_web = true; + args.shift(); +} var name = args.shift(); var version = args.shift(); var revision = args.shift(); @@ -55,6 +60,8 @@ if (is_windows) { source = source.replace(/["] ["]/g, ''); source = source.replace(/["] [(] ([^)]*)[)] ["]/g, '// $1'); source = 'const char ' + name + '[] =\n' + source + ';\n'; +} else if (is_web) { + source = 'const ' + name + ' = `\n' + source + '`;\n'; } else { source = 'const char ' + name + '[] = R"""(\n' + source + ')""";\n'; } diff --git a/web/fuse_web.js b/web/fuse_web.js index 8af072f..dcf7dc1 100755 --- a/web/fuse_web.js +++ b/web/fuse_web.js @@ -33,9 +33,9 @@ cases = ReplaceAll(cases, 'DROP', 'tos = *sp--'); cases = ReplaceAll(cases, 'DUP', '*++sp = tos'); cases = ReplaceAll(cases, 'tos += *sp--', 'tos = (tos + *sp)|0; --sp'); cases = ReplaceAll(cases, /tos (.)= /, 'tos = tos $1 '); -cases = ReplaceAll(cases, /[*](.)p[+][+]/, '*$1p; ++$1p'); -cases = ReplaceAll(cases, /[*](.)p[-][-]/, '*$1p; --$1p'); -cases = ReplaceAll(cases, /[*][+][+](.)p/, '++$1p; *$1p'); +cases = ReplaceAll(cases, /[*](.)p[+][+]/, '*$1p, ++$1p'); +cases = ReplaceAll(cases, /[*](.)p[-][-]/, '*$1p, --$1p'); +cases = ReplaceAll(cases, /[*][+][+](.)p/, '++$1p, *$1p'); cases = ReplaceAll(cases, '*(cell_t *) tos = ', 'i32[tos>>2] = '); cases = ReplaceAll(cases, '*(int32_t *) tos = ', 'i32[tos>>2] = '); cases = ReplaceAll(cases, '*(uint8_t *) tos = ', 'u8[tos] = '); diff --git a/web/web.template.js b/web/web.template.js index f59032b..a066a2b 100644 --- a/web/web.template.js +++ b/web/web.template.js @@ -19,9 +19,7 @@ const HEAP_SIZE = (1024 * 1024); const STACK_CELLS = 4096; -const boot = ` {{boot}} -`; var heap = new ArrayBuffer(HEAP_SIZE); var i32 = new Int32Array(heap); From 3ea159bbcf299935efe1dbc48164784b5e03c384 Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Sat, 4 Jun 2022 21:45:02 -0700 Subject: [PATCH 3/3] Tweak to web version. --- web/fuse_web.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/fuse_web.js b/web/fuse_web.js index dcf7dc1..42d88e6 100755 --- a/web/fuse_web.js +++ b/web/fuse_web.js @@ -53,7 +53,7 @@ cases = ReplaceAll(cases, '(void *) ', ''); cases = ReplaceAll(cases, '(const char *) ', ''); cases = ReplaceAll(cases, '(cell_t *) ', ''); cases = ReplaceAll(cases, '(cell_t) ', ''); -cases = ReplaceAll(cases, /[(]ucell_t[)] ([^ ;]+)/, '($1>>>0)'); +cases = ReplaceAll(cases, /[(]ucell_t[)] ([^ ;)]+)/, '($1>>>0)'); cases = ReplaceAll(cases, 'g_sys.state', 'i32[(i32[g_sys>>2] + (3 * 4))>>2]'); cases = ReplaceAll(cases, 'g_sys.DOLIT_XT', 'i32[(i32[g_sys>>2] + (10 * 4))>>2]|0'); cases = ReplaceAll(cases, 'g_sys.DOEXIT_XT', 'i32[(i32[g_sys>>2] + (11 * 4))>>2]|0');