initial checkin of my experimental disassembler. Still pretty flaky and very slow.
doing reachingMerge in-place is considerably more efficient.
combining reachingMerge and reachingMatches nets slightly better performance and simplifies the traversal algorithm.
added a short circuit for the predicate tests in preciseSkip
created a table of register names so that I can avoid map element iterations in apply() and reachingMerge()
replaced for...in constructs with iteration over Object.keys() in hot spots.
fixed a typo in the prettyprinter.
more correct semantics for returns and support for half-labels via :next
improved handing of addresses which are both subroutine heads and normal labels, which actually happens pretty frequently. For example, whenever a loop head is the first statement in a subroutine.
ordering on writes to the carry flag are unspecified, but Octo writes the flag before the result value- the decompiler should match those semantics.
I'm not always chasing subroutine returns, leading to falsely identified dead code.
restructuring the decompiler so that it can be used in a browser. Output no longer makes use of console.log, global state is reset when an analysis pass begins and analysis can be split into slices so as to avoid locking up a browser decompiling a large program.
integrating the decompiler with the Octo web UI.
added plumbing so that both octo frontends can configure decompiler quirks modes.
made it possible to run a local rom without decompiling it.
fixing scroll-right and scroll-left semantics.
made flag registers persistent across octo sessions.
whoops, wasn't properly handling uninitialized flags.
all of the functionality of the standalone pixel editor has been subsumed and improved on in Octo itself, so there's no reason to keep it around.
reorganized a bunch of stuff to make the root of the repo less cluttered and added a proper CLI frontend for octo.