( brainfuck interpreter ) %DEC { #01 SUB } %DEC2 { #0001 SUB2 } %DECr { LITr 01 SUBr } %HALT { #0101 #0e DEO2 } %EMIT { #18 DEO } |0100 ( -> ) ;memory ;program &while ( Move the pointer to the right ) LDAk LIT '> NEQ ,&movr JCN [ SWP2 INC2 SWP2 ] &movr ( Move the pointer to the left ) LDAk LIT '< NEQ ,&movl JCN [ SWP2 DEC2 SWP2 ] &movl ( Increment the memory cell at the pointer ) LDAk LIT '+ NEQ ,&incr JCN [ OVR2 STH2k LDA INC STH2r STA ] &incr ( Decrement the memory cell at the pointer ) LDAk LIT '- NEQ ,&decr JCN [ OVR2 STH2k LDA DEC STH2r STA ] &decr ( Output the character signified by the cell at the pointer ) LDAk LIT '. NEQ ,&emit JCN [ OVR2 LDA EMIT ] &emit ( Jump past the matching ] if the cell at the pointer is 0 ) LDAk LIT '[ NEQ ,&next JCN [ ,goto-next JSR ] &next ( Jump back to the matching [ if the cell at the pointer is nonzero ) LDAk LIT '] NEQ ,&prev JCN [ ,goto-back JSR ] &prev INC2 LDAk ,&while JCN POP2 HALT BRK @goto-next ( -- ) OVR2 LDA #00 EQU JMP JMP2r ( depth ) LITr 00 INC2 &loop LDAk LIT '[ NEQ JMP INCr LDAk LIT '] NEQ ,&no-end JCN STHkr #00 EQU ,&end JCN DECr &no-end INC2 LDAk ,&loop JCN &end ( depth ) POPr JMP2r @goto-back ( -- ) OVR2 LDA #00 NEQ JMP JMP2r ( depth ) LITr 00 DEC2 &loop LDAk LIT '] NEQ JMP INCr LDAk LIT '[ NEQ ,&no-end JCN STHkr #00 EQU ,&end JCN DECr &no-end DEC2 LDAk ,&loop JCN &end ( depth ) POPr JMP2r @program ( Hello World! ) "++++++++[>++++[>++>+++>+++>+<<<< "-]>+>+>->>+[<]<-]>>.>---.+++++++ "..+++.>>.<-.<.+++.------.------- "-.>>+.>++. $1 @memory