diff --git a/projects/examples/exercises/brainfuck.tal b/projects/examples/exercises/brainfuck.tal new file mode 100644 index 0000000..342f4ff --- /dev/null +++ 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 +