Skip to content

Instantly share code, notes, and snippets.

@classilla
Last active January 4, 2023 02:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save classilla/794cfa1806da30e244fc4b81e9261562 to your computer and use it in GitHub Desktop.
Save classilla/794cfa1806da30e244fc4b81e9261562 to your computer and use it in GitHub Desktop.
Minimal Brainf*ck compiler that turns BF into 6502 assembly but is Turing complete without A, X or Y. http://oldvcr.blogspot.com/2023/01/the-mos-6502-is-mostly-turing-complete.html
#!/usr/bin/perl -s
#
# Takes BF, emits 6502 that only clobbers PC, S, and the N and V flags
# Requires an assembler (I recommend xa65)
#
# Cameron Kaiser
# Public domain
# http://oldvcr.blogspot.com/2023/01/the-mos-6502-is-mostly-turing-complete.html
#
$sa ||= 49152;
$tl ||= "label";
$sl ||= 0;
print STDOUT <<"EOF";
; generated by no-reg-6502-bf.pl
; http://oldvcr.blogspot.com/2023/01/the-mos-6502-is-mostly-turing-complete.html
; this generator assumes a Commodore 64
; starting address in file
; your assembler may use another syntax to indicate a 16-bit word
.word $sa
; starting address in memory
; your assembler may require .org or another syntax
* = $sa
; prologue
dec plus+1
bne *-3
dec minus+1
bne *-3
dec plus+2
bne *-3
dec minus+2
bne *-3
inc plus+2
inc plus+2
inc plus+2
inc plus+2
inc minus+2
inc minus+2
inc minus+2
inc minus+2
EOF
$lsl = $sl;
$ssl = $sl;
$/ = \1; while(<>) {
if ($_ eq '+') {
print "\tjsr plus\n";
} elsif ($_ eq '-') {
print "\tjsr minus\n";
} elsif ($_ eq '[') {
$lsl++ if ($sl == $ssl);
print <<"EOF";
jsr plus
jsr minus
bne *+5
jmp end${tl}${lsl}${sl}
top${tl}${lsl}${sl}:
EOF
$sl++;
} elsif ($_ eq ']') {
$sl--;
print <<"EOF";
jsr plus
jsr minus
bne *+5
jmp end${tl}${lsl}${sl}
jmp top${tl}${lsl}${sl}
end${tl}${lsl}${sl}:
EOF
} elsif ($_ eq '>') {
print <<"EOF";
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
EOF
} elsif ($_ eq '<') {
print <<"EOF";
inc plus+1
dec plus+1
bne *+5
dec plus+2
dec plus+1
inc minus+1
dec minus+1
bne *+5
dec minus+2
dec minus+1
EOF
}
}
die("unbalanced [ ]\n") if ($sl != $ssl);
print STDOUT <<'EOF';
; epilogue
rts
plus inc $0400
rts
minus dec $0400
rts
EOF
[-]>[-]>[-]>[-]>[-]>[-]
<<<<<
++++++++>
+++++>
++++++++++++>
++++++++++++>
+++++++++++++++>
++++++++++++++++++++++++++++++++
; generated by no-reg-6502-bf.pl
; http://oldvcr.blogspot.com/2023/01/the-mos-6502-is-mostly-turing-complete.html
; this generator assumes a Commodore 64
; starting address in file
; your assembler may use another syntax to indicate a 16-bit word
.word 49152
; starting address in memory
; your assembler may require .org or another syntax
* = 49152
; prologue
dec plus+1
bne *-3
dec minus+1
bne *-3
dec plus+2
bne *-3
dec minus+2
bne *-3
inc plus+2
inc plus+2
inc plus+2
inc plus+2
inc minus+2
inc minus+2
inc minus+2
inc minus+2
jsr plus
jsr minus
bne *+5
jmp endlabel10
toplabel10:
jsr minus
jsr plus
jsr minus
bne *+5
jmp endlabel10
jmp toplabel10
endlabel10:
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr minus
bne *+5
jmp endlabel20
toplabel20:
jsr minus
jsr plus
jsr minus
bne *+5
jmp endlabel20
jmp toplabel20
endlabel20:
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr minus
bne *+5
jmp endlabel30
toplabel30:
jsr minus
jsr plus
jsr minus
bne *+5
jmp endlabel30
jmp toplabel30
endlabel30:
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr minus
bne *+5
jmp endlabel40
toplabel40:
jsr minus
jsr plus
jsr minus
bne *+5
jmp endlabel40
jmp toplabel40
endlabel40:
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr minus
bne *+5
jmp endlabel50
toplabel50:
jsr minus
jsr plus
jsr minus
bne *+5
jmp endlabel50
jmp toplabel50
endlabel50:
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr minus
bne *+5
jmp endlabel60
toplabel60:
jsr minus
jsr plus
jsr minus
bne *+5
jmp endlabel60
jmp toplabel60
endlabel60:
inc plus+1
dec plus+1
bne *+5
dec plus+2
dec plus+1
inc minus+1
dec minus+1
bne *+5
dec minus+2
dec minus+1
inc plus+1
dec plus+1
bne *+5
dec plus+2
dec plus+1
inc minus+1
dec minus+1
bne *+5
dec minus+2
dec minus+1
inc plus+1
dec plus+1
bne *+5
dec plus+2
dec plus+1
inc minus+1
dec minus+1
bne *+5
dec minus+2
dec minus+1
inc plus+1
dec plus+1
bne *+5
dec plus+2
dec plus+1
inc minus+1
dec minus+1
bne *+5
dec minus+2
dec minus+1
inc plus+1
dec plus+1
bne *+5
dec plus+2
dec plus+1
inc minus+1
dec minus+1
bne *+5
dec minus+2
dec minus+1
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
inc plus+1
bne *+5
inc plus+2
inc minus+1
bne *+5
inc minus+2
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
jsr plus
; epilogue
rts
plus inc $0400
rts
minus dec $0400
rts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment