From 6339d22f6a2fcfc30db5743858e28161ab642631 Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Mon, 15 Dec 2025 00:47:13 -0800 Subject: disassembly stuff this will pave the way for the copy thing currently it correctly prints out all the actual codeword pointers that are part of the word it's scrutinizing, but it has a placeholder for integers the hard part of this was figuring out the start and end addresses; the iteration was also kinda fiddly Change-Id: I2bb8d7c768ffc4d3d1d2afd83d1fd2227d15cbae Force-Push: yes --- quine.asm | 190 ++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 130 insertions(+), 60 deletions(-) diff --git a/quine.asm b/quine.asm index 990f0ae..e37751f 100644 --- a/quine.asm +++ b/quine.asm @@ -2453,11 +2453,11 @@ cold_start: ; ELF, rather than the copy on the heap. Watch carefully for that, with all ; the lookups from here on. dq litstring, "emitstring", early_create, early_docol_codeword - dq litstring, "dup", early_find, early_comma - dq litstring, "stringlen", early_find, early_comma - dq litstring, "swap", early_find, early_comma - dq litstring, "sys-write", early_find, early_comma - dq litstring, "exit", early_find, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "stringlen", early_find, entry_to_execution_token, early_comma + dq litstring, "swap", early_find, entry_to_execution_token, early_comma + dq litstring, "sys-write", early_find, entry_to_execution_token, early_comma + dq litstring, "exit", early_find, entry_to_execution_token, early_comma dq early_here, fetch, lit, 8, packalign, early_here_store dq litstring, "crash", early_create, early_self_codeword, early_here, fetch @@ -2471,86 +2471,86 @@ cold_start: ; because the user of pack64 and its variants is always doing something ; where exact byte sizes are crucial. dq litstring, "pack64", early_create, early_docol_codeword - dq litstring, "swap", early_find, early_comma - dq litstring, "dup", early_find, early_comma - dq litstring, "3unroll", early_find, early_comma - dq litstring, "store", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "swap", early_find, entry_to_execution_token, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "3unroll", early_find, entry_to_execution_token, early_comma + dq litstring, "!", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 8, early_comma - dq litstring, "+", early_find, early_comma - dq litstring, "exit", early_find, early_comma + dq litstring, "+", early_find, entry_to_execution_token, early_comma + dq litstring, "exit", early_find, entry_to_execution_token, early_comma dq early_here, fetch, lit, 8, packalign, early_here_store dq litstring, "pack32", early_create, early_docol_codeword - dq litstring, "swap", early_find, early_comma - dq litstring, "dup", early_find, early_comma - dq litstring, "3unroll", early_find, early_comma - dq litstring, "store32", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "swap", early_find, entry_to_execution_token, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "3unroll", early_find, entry_to_execution_token, early_comma + dq litstring, "32!", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 4, early_comma - dq litstring, "+", early_find, early_comma - dq litstring, "exit", early_find, early_comma + dq litstring, "+", early_find, entry_to_execution_token, early_comma + dq litstring, "exit", early_find, entry_to_execution_token, early_comma dq early_here, fetch, lit, 8, packalign, early_here_store dq litstring, "pack16", early_create, early_docol_codeword - dq litstring, "swap", early_find, early_comma - dq litstring, "dup", early_find, early_comma - dq litstring, "3unroll", early_find, early_comma - dq litstring, "store16", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "swap", early_find, entry_to_execution_token, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "3unroll", early_find, entry_to_execution_token, early_comma + dq litstring, "16!", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 2, early_comma - dq litstring, "+", early_find, early_comma - dq litstring, "exit", early_find, early_comma + dq litstring, "+", early_find, entry_to_execution_token, early_comma + dq litstring, "exit", early_find, entry_to_execution_token, early_comma dq early_here, fetch, lit, 8, packalign, early_here_store dq litstring, "pack8", early_create, early_docol_codeword - dq litstring, "swap", early_find, early_comma - dq litstring, "dup", early_find, early_comma - dq litstring, "3unroll", early_find, early_comma - dq litstring, "store8", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "swap", early_find, entry_to_execution_token, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "3unroll", early_find, entry_to_execution_token, early_comma + dq litstring, "8!", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 1, early_comma - dq litstring, "+", early_find, early_comma - dq litstring, "exit", early_find, early_comma + dq litstring, "+", early_find, entry_to_execution_token, early_comma + dq litstring, "exit", early_find, entry_to_execution_token, early_comma dq early_here, fetch, lit, 8, packalign, early_here_store dq litstring, "packstring", early_create, early_docol_codeword - dq litstring, "dup", early_find, early_comma - dq litstring, "stringlen", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "stringlen", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 1, early_comma - dq litstring, "+", early_find, early_comma - dq litstring, "dup", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "+", early_find, entry_to_execution_token, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 4, early_comma - dq litstring, "roll", early_find, early_comma - dq litstring, "dup", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "roll", early_find, entry_to_execution_token, early_comma + dq litstring, "dup", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 5, early_comma - dq litstring, "unroll", early_find, early_comma - dq litstring, "+", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "unroll", early_find, entry_to_execution_token, early_comma + dq litstring, "+", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 4, early_comma - dq litstring, "unroll", early_find, early_comma - dq litstring, "memcopy", early_find, early_comma - dq litstring, "exit", early_find, early_comma + dq litstring, "unroll", early_find, entry_to_execution_token, early_comma + dq litstring, "memcopy", early_find, entry_to_execution_token, early_comma + dq litstring, "exit", early_find, entry_to_execution_token, early_comma dq early_here, fetch, lit, 8, packalign, early_here_store dq litstring, "packalign", early_create, early_docol_codeword - dq litstring, "2dup", early_find, early_comma - dq litstring, "/%", early_find, early_comma - dq litstring, "drop", early_find, early_comma - dq litstring, "0branch", early_find, early_comma + dq litstring, "2dup", early_find, entry_to_execution_token, early_comma + dq litstring, "/%", early_find, entry_to_execution_token, early_comma + dq litstring, "drop", early_find, entry_to_execution_token, early_comma + dq litstring, "0branch", early_find, entry_to_execution_token, early_comma dq lit, 8*8, early_comma - dq litstring, "swap", early_find, early_comma - dq litstring, "lit", early_find, early_comma + dq litstring, "swap", early_find, entry_to_execution_token, early_comma + dq litstring, "lit", early_find, entry_to_execution_token, early_comma dq lit, 0, early_comma - dq litstring, "pack8", early_find, early_comma - dq litstring, "swap", early_find, early_comma - dq litstring, "branch", early_find, early_comma + dq litstring, "pack8", early_find, entry_to_execution_token, early_comma + dq litstring, "swap", early_find, entry_to_execution_token, early_comma + dq litstring, "branch", early_find, entry_to_execution_token, early_comma dq lit, -11*8, early_comma - dq litstring, "drop", early_find, early_comma - dq litstring, "exit", early_find, early_comma + dq litstring, "drop", early_find, entry_to_execution_token, early_comma + dq litstring, "exit", early_find, entry_to_execution_token, early_comma dq early_here, fetch, lit, 8, packalign, early_here_store dq litstring, "litpack64", early_create, early_self_codeword @@ -2595,6 +2595,8 @@ cold_start: dq swap, unroll3, pack_beforenext dq lit, 8, packalign, early_here_store + dq litstring, "pack8", early_find, early_show_source, lit, 0, sys_exit + ;;; For triage's sake, here's an inventory of everything else in the file. ;;; ;;; Macros: @@ -3627,6 +3629,10 @@ defword emitstring, 0 dq docol, dup, stringlen, swap, sys_write, exit +defword emitinteger, 0 + dq docol, drop, litstring, "(int goes here)", emitstring, exit + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Development utilities ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -4882,6 +4888,7 @@ defword find_in, 0 ; heap address ; entry address ; Stack out: +; heap address ; entry address or 0 defword early_next_newer_entry, 0 dq docol @@ -4925,9 +4932,40 @@ defword entry_to_name, 0 dq lit, 10, add dq exit +; Stack in: +; heap address +; entry address +; Stack out: +; heap address +; guessed entry end address (first byte that's not part of it) +defword early_guess_entry_end, 0 + dq docol + dq swap, early_here, fetch, swap, early_latest, fetch, swap + ; (entry, here, latest, heap) + dq lit, 4, unroll, roll3 + ; (heap, here, latest, entry) + dq guess_entry_end_in + dq exit + +; Stack in: +; "here" value +; dictionary to search within +; entry address +; Stack out: +; next entry address or 0 +defword guess_entry_end_in, 0 + dq docol + dq next_newer_entry_in + ; (here, next entry address or 0) + dq dup, lit, 0, eq, zbranch, 3*8 + ; This is the branch where it's not found. Return "here". + dq drop, exit + ; This is the branch where it's found. Return the next entry address. + dq swap, drop, exit + ; Jonesforth calls this "CFA>". Jonesforth's implementation searches the ; entire dictionary, since its word header format isn't designed to be -; traversed in reverse as ours is. +; traversed in reverse, but ours is, so it should be fast. defword execution_token_to_entry, 0 dq docol dq lit, 1, sub @@ -4936,6 +4974,38 @@ defword execution_token_to_entry, 0 dq lit, 9, sub dq exit +; Stack in: +; heap address +; entry address +; Stack out: +; heap address +defword early_show_source, 0 + dq docol + dq dup, unroll3, early_guess_entry_end, swap, unroll3 + ; (heap address, entry address, end address) + dq show_source_between + dq exit + +; Stack in: +; entry address +; end address +defword show_source_between, 0 + dq docol + dq swap, entry_to_execution_token, lit, 8, add + ; (end address, current address) + dq dup2, lt, zbranch, 4*8, drop, drop, exit + dq dup, fetch, execution_token_to_entry, entry_to_name + ; (end address, current address, name) + dq dup, emitstring, litstring, " ", emitstring + dq swap, lit, 8, add, swap + dq dup, litstring, "lit", stringcmp, zbranch, 4*8 + ; This is the non-lit branch. + dq drop, branch, -29*8 + ; This is the lit branch. + dq drop, dup, fetch, emitinteger, litstring, " ", emitstring + dq lit, 8, add + dq branch, -41*8 + ; Allocate space by incrementing "here", and output a word header in it. ; Also add it to the "latest" linked list. Use zero as the flag values; ; callers that want something else can do that themselves. -- cgit 1.4.1