| ... | ... |
@@ -1,57 +1,39 @@ |
| 1 | 1 |
( brainfuck interpreter ) |
| 2 | 2 |
|
| 3 |
-%!~ { NEQk NIP }
|
|
| 4 | 3 |
%DEC { #01 SUB }
|
| 5 | 4 |
%DEC2 { #0001 SUB2 }
|
| 6 | 5 |
%DECr { LITr 01 SUBr }
|
| 7 |
-%RTN { JMP2r }
|
|
| 8 | 6 |
%HALT { #0101 #0e DEO2 }
|
| 9 | 7 |
%EMIT { #18 DEO }
|
| 10 | 8 |
|
| 11 |
-%MEMORY { #8000 }
|
|
| 12 |
- |
|
| 13 |
-|0000 |
|
| 14 |
- |
|
| 15 |
-@ptr $2 |
|
| 16 |
- |
|
| 17 | 9 |
|0100 ( -> ) |
| 18 | 10 |
|
| 19 |
- MEMORY .ptr STZ2 |
|
| 20 |
- |
|
| 11 |
+ ;memory |
|
| 21 | 12 |
;program |
| 22 | 13 |
&while |
| 23 |
- LDAk ,op JSR |
|
| 14 |
+ ( Move the pointer to the right ) |
|
| 15 |
+ LDAk LIT '> NEQ ,&movr JCN [ SWP2 INC2 SWP2 ] &movr |
|
| 16 |
+ ( Move the pointer to the left ) |
|
| 17 |
+ LDAk LIT '< NEQ ,&movl JCN [ SWP2 DEC2 SWP2 ] &movl |
|
| 18 |
+ ( Increment the memory cell at the pointer ) |
|
| 19 |
+ LDAk LIT '+ NEQ ,&incr JCN [ OVR2 STH2k LDA INC STH2r STA ] &incr |
|
| 20 |
+ ( Decrement the memory cell at the pointer ) |
|
| 21 |
+ LDAk LIT '- NEQ ,&decr JCN [ OVR2 STH2k LDA DEC STH2r STA ] &decr |
|
| 22 |
+ ( Output the character signified by the cell at the pointer ) |
|
| 23 |
+ LDAk LIT '. NEQ ,&emit JCN [ OVR2 LDA EMIT ] &emit |
|
| 24 |
+ ( Jump past the matching ] if the cell at the pointer is 0 ) |
|
| 25 |
+ LDAk LIT '[ NEQ ,&next JCN [ ,goto-next JSR ] &next |
|
| 26 |
+ ( Jump back to the matching [ if the cell at the pointer is nonzero ) |
|
| 27 |
+ LDAk LIT '] NEQ ,&prev JCN [ ,goto-back JSR ] &prev |
|
| 24 | 28 |
INC2 LDAk ,&while JCN |
| 25 | 29 |
POP2 |
| 26 |
- |
|
| 27 | 30 |
HALT |
| 28 | 31 |
|
| 29 | 32 |
BRK |
| 30 | 33 |
|
| 31 |
-@op ( op -- ) |
|
| 32 |
- |
|
| 33 |
- ( Move the pointer to the right ) |
|
| 34 |
- LIT '> !~ ,&movr JCN [ .ptr LDZ2k INC2 ROT STZ2 POP RTN ] &movr |
|
| 35 |
- ( Move the pointer to the left ) |
|
| 36 |
- LIT '< !~ ,&movl JCN [ .ptr LDZ2k DEC2 ROT STZ2 POP RTN ] &movl |
|
| 37 |
- ( Increment the memory cell at the pointer ) |
|
| 38 |
- LIT '+ !~ ,&incr JCN [ .ptr LDZ2 STH2k LDA INC STH2r STA POP RTN ] &incr |
|
| 39 |
- ( Decrement the memory cell at the pointer ) |
|
| 40 |
- LIT '- !~ ,&decr JCN [ .ptr LDZ2 STH2k LDA DEC STH2r STA POP RTN ] &decr |
|
| 41 |
- ( Output the character signified by the cell at the pointer ) |
|
| 42 |
- LIT '. !~ ,&emit JCN [ .ptr LDZ2 LDA EMIT POP RTN ] &emit |
|
| 43 |
- ( Jump past the matching ] if the cell at the pointer is 0 ) |
|
| 44 |
- LIT '[ !~ ,&next JCN [ POP ,goto-next JSR RTN ] &next |
|
| 45 |
- ( Jump back to the matching [ if the cell at the pointer is nonzero ) |
|
| 46 |
- LIT '] !~ ,&prev JCN [ POP ,goto-back JSR RTN ] &prev |
|
| 47 |
- POP |
|
| 48 |
- |
|
| 49 |
-RTN |
|
| 50 |
- |
|
| 51 | 34 |
@goto-next ( -- ) |
| 52 | 35 |
|
| 53 |
- .ptr LDZ2 LDA #00 EQU JMP RTN |
|
| 54 |
- |
|
| 36 |
+ OVR2 LDA #00 EQU JMP JMP2r |
|
| 55 | 37 |
( depth ) LITr 00 |
| 56 | 38 |
INC2 |
| 57 | 39 |
&loop |
| ... | ... |
@@ -64,12 +46,11 @@ RTN |
| 64 | 46 |
&end |
| 65 | 47 |
( depth ) POPr |
| 66 | 48 |
|
| 67 |
-RTN |
|
| 49 |
+JMP2r |
|
| 68 | 50 |
|
| 69 | 51 |
@goto-back ( -- ) |
| 70 | 52 |
|
| 71 |
- .ptr LDZ2 LDA #00 NEQ JMP RTN |
|
| 72 |
- |
|
| 53 |
+ OVR2 LDA #00 NEQ JMP JMP2r |
|
| 73 | 54 |
( depth ) LITr 00 |
| 74 | 55 |
DEC2 |
| 75 | 56 |
&loop |
| ... | ... |
@@ -82,11 +63,13 @@ RTN |
| 82 | 63 |
&end |
| 83 | 64 |
( depth ) POPr |
| 84 | 65 |
|
| 85 |
-RTN |
|
| 66 |
+JMP2r |
|
| 86 | 67 |
|
| 87 | 68 |
@program ( Hello World! ) |
| 88 | 69 |
|
| 89 | 70 |
"++++++++[>++++[>++>+++>+++>+<<<< |
| 90 | 71 |
"-]>+>+>->>+[<]<-]>>.>---.+++++++ |
| 91 | 72 |
"..+++.>>.<-.<.+++.------.------- |
| 92 |
- "-.>>+.>++. |
|
| 73 |
+ "-.>>+.>++. $1 |
|
| 74 |
+ |
|
| 75 |
+@memory |
|
| 93 | 76 |
\ No newline at end of file |