Added brainfuck.tal

This commit is contained in:
Devine Lu Linvega 2021-11-12 21:51:39 -05:00
parent 2d53e60fff
commit cd427e5e56
1 changed files with 117 additions and 0 deletions

View File

@ -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