summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2025-12-15 00:47:13 -0800
committerIrene Knapp <ireneista@irenes.space>2025-12-22 14:55:50 -0800
commit6339d22f6a2fcfc30db5743858e28161ab642631 (patch)
tree2d335e318c578aadca1f49b0cbeef172c558db33
parent17baa2f5ab52e6ce9f7a6af19bfaad0b5cfbc4c1 (diff)
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
-rw-r--r--quine.asm190
1 files 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.