Added brainfuck.tal
This commit is contained in:
parent
2d53e60fff
commit
cd427e5e56
|
@ -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
|
||||
|
Loading…
Reference in New Issue