

Nice timing, I just finished it!
I was able to adjust the bit mask format to be easier to work with by hand and got it most of the way, then used the SAT solver to quickly finish the rest when I got stuck.


Nice timing, I just finished it!
I was able to adjust the bit mask format to be easier to work with by hand and got it most of the way, then used the SAT solver to quickly finish the rest when I got stuck.


Based on my other comment, do you have any in mind that would be more appropriate?


For each operation my CPU’s ALU can do, I need to find a bit mask that turns it on only for the desired set of 8 bit opcodes. The bit mask is of the form [01_].[01_][01_][01_][01_][01_][01_][01_][01_] where 0 and 1 mean the bit has to match and _ means it doesn’t matter. The bit before the . is the xor of all the other bits in the opcode.
The solver has to figure out both which opcodes represent each instruction and what bit masks are needed to give them the desired operations.
I ultimately switched to a slightly different approach. It turns out the xor part of the mask isn’t very useful since the combinations I need aren’t super complicated. The trouble was that an operation could only trigger for a power of 2 of opcodes, so I added a secondary mask to each operation:
Base mask: still [] x8\
Secondary mask: [] x8 (x means both 0 and 1)
For the secondary mask, 1 matches only if the current bit or the one to the left is true (left of the leftmost is the rightmost). 0 is the same but with nand in stead of or. x, requiring both, only matches if exactly one matches.
Using 1 or 0 multiplies the number of matching opcodes by 3/4 (or a more complicated fraction if their areas of influence overlap), which allows much more freedom.
Due to restrictions in the game and my "hard"ware, I’m only able to use [] for the secondary mask, since a nand gate doesn’t respond right to being hooked up to a bunch of toggleable and inputs but xor/or gates do (xor is just as fast in game).
Counterargument: ctrl+f is a great place for regex. Write once read never problems are a great application for unreadable languages. Imagine if people wrote scripts in the language vi uses for editnig<escape>bceediting, which mostly isn’t even displayed as it’s typed! <escape>
But yeah, it’s kind of terrible for anything else.