#[6502 Machine Code (C64)][1] - Felix Palmen The correct answer is >!8bitsareenough The code is rather complicated, involving a lot of self modifying. So instead of fully reverse engineering it, you can just use it to crack itself. Here's a slightly more helpful disassembly of the code, to help understand what happened. The syntax is for KickAssembler. *=$c000 // LOAD ADDRESS jsr $aefd //checks for a comma jsr $ad9e /*Reads in an argument. Stores length of it into $61, with the address of the stored arg in $62-3*/ jsr $b6a3 /*Evaluates the string, leaving the pointer on $22-3 and the length on A*/ //I think ldy #$00 loop: lda thedata,y cpy #$01 beq shuffle cpy #$07 beq shuffle cpy #$0b beq shuffle tricks: jsr output iny bne loop output: eor ($22),y //XOR's A with the y-eth letter of our input jmp $ffd2 //good old CHROUT, returns to tricks above thedata: .byte $f0,$48,$fa,$a2, $1c,$6d,$72,$30 .byte $06,$a9,$03,$48,$7c,$a3 shuffle: sta $c048 //drops A in mystery+4, over the constant lda $c026,y sta $c045 //overwrites the low byte of mystery lda $c027,y sta $c046 //overwrites the high byte of mystery ldx #$00 mystery: lda $aefd,x eor #$23 jsr output iny inx cpx #$03 bne mystery cpy #$0e bne loop eor #$1a sta $d018 rts Labelling it up like this was enough for me to see that the code XORs a bunch of constants that are hidden around in order to print out what we need. Since XOR is reversible, if you input the desired output, it'll tell you what the key is. So I switched the last line /*from sta $d018 to*/ jsr $ffd2 so it would print the last required input instead of crashing on a wrong input. And that's that! If there's any interest, I'll crack the code more. [1]: https://codegolf.stackexchange.com/a/138533/73219