commit cd427e5e56ae771bcbb5ecce3bcbaa82c4c1fc8f
parent 2d53e60fffa5d3293a32729ac56f3d92e9b71bbe
Author: Devine Lu Linvega <aliceffekt@gmail.com>
Date: Fri, 12 Nov 2021 21:51:39 -0500
Added brainfuck.tal
Diffstat:
1 file changed, 117 insertions(+), 0 deletions(-)
diff --git a/projects/examples/exercises/brainfuck.tal b/projects/examples/exercises/brainfuck.tal
@@ -0,0 +1,117 @@
+( brainfuck interpreter )
+
+%!~ { NEQk NIP }
+%DEC { #01 SUB }
+%DEC2 { #0001 SUB2 }
+%DECr { LITr 01 SUBr }
+%RTN { JMP2r }
+%HALT { #0101 #0e DEO2 }
+%EMIT { #18 DEO }
+
+%MEMORY { #8000 }
+
+|0000
+
+@pointer $2
+
+|0100 ( -> )
+
+ MEMORY .pointer STZ2
+
+ ;program
+ &while
+ LDAk ,op JSR
+ INC2 LDAk ,&while JCN
+ POP2
+
+ HALT
+
+BRK
+
+(
+ > Move the pointer to the right
+ < Move the pointer to the left
+ + Increment the memory cell at the pointer
+ - Decrement the memory cell at the pointer
+ [ Jump past the matching ] if the cell at the pointer is 0
+ ] Jump back to the matching [ if the cell at the pointer is nonzero
+ , Input a character and store it in the cell at the pointer
+ . Output the character signified by the cell at the pointer )
+
+@op ( op -- )
+
+ LIT '> !~ ,&right JCN
+ .pointer LDZ2k INC2 ROT STZ2
+ POP RTN &right
+ LIT '< !~ ,&left JCN
+ .pointer LDZ2k DEC2 ROT STZ2
+ POP RTN &left
+ LIT '+ !~ ,&inc JCN
+ .pointer LDZ2 STH2k LDA INC STH2r STA
+ POP RTN &inc
+ LIT '- !~ ,&dec JCN
+ .pointer LDZ2 STH2k LDA DEC STH2r STA
+ POP RTN &dec
+ LIT '. !~ ,&emit JCN
+ .pointer LDZ2 LDA EMIT
+ POP RTN &emit
+ LIT '[ !~ ,&next JCN
+ POP ,goto-next JSR
+ RTN &next
+ LIT '] !~ ,&prev JCN
+ POP ,goto-back JSR
+ RTN &prev
+ POP
+
+RTN
+
+@goto-next ( -- )
+
+ .pointer LDZ2 LDA #00 EQU JMP RTN
+
+ ( depth ) LITr 00
+ INC2
+ &loop
+ LDAk LIT '[ NEQ ,&no-depth JCN
+ INCr
+ &no-depth
+ LDAk LIT '] NEQ ,&no-end JCN
+ STHkr #00 EQU ,&end JCN
+ DECr
+ &no-end
+ INC2 LDAk ,&loop JCN
+ &end
+ ( depth ) POPr
+
+RTN
+
+@goto-back ( -- )
+
+ .pointer LDZ2 LDA #00 NEQ JMP RTN
+
+ ( depth ) LITr 00
+ DEC2
+ &loop
+ LDAk LIT '] NEQ ,&no-depth JCN
+ INCr
+ &no-depth
+ LDAk LIT '[ NEQ ,&no-end JCN
+ STHkr #00 EQU ,&end JCN
+ DECr
+ &no-end
+ DEC2 LDAk ,&loop JCN
+ &end
+ ( depth ) POPr
+
+RTN
+
+@program ( Hello World! )
+
+ 2b 2b 2b 2b 2b 2b 2b 2b 5b 3e 2b 2b 2b 2b 5b 3e
+ 2b 2b 3e 2b 2b 2b 3e 2b 2b 2b 3e 2b 3c 3c 3c 3c
+ 2d 5d 3e 2b 3e 2b 3e 2d 3e 3e 2b 5b 3c 5d 3c 2d
+ 5d 3e 3e 2e 3e 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2b
+ 2e 2e 2b 2b 2b 2e 3e 3e 2e 3c 2d 2e 3c 2e 2b 2b
+ 2b 2e 2d 2d 2d 2d 2d 2d 2e 2d 2d 2d 2d 2d 2d 2d
+ 2d 2e 3e 3e 2b 2e 3e 2b 2b 2e 0a
+