Mercurial > hg > Members > kono > nitros9-code
comparison 3rdparty/packages/brainfuck/bf.asm @ 3086:83bf26264aa6
Added brainfuck interpreter
author | boisy@tee-boy.com |
---|---|
date | Sat, 03 Oct 2015 14:50:37 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
3085:a9311007b1b2 | 3086:83bf26264aa6 |
---|---|
1 ******************************************************************** | |
2 * bf - Brainfuck Language Interpreter | |
3 * | |
4 * $Id$ | |
5 * | |
6 * This is a simple interpreter for the Brainfuck language: | |
7 * https://en.wikipedia.org/wiki/Brainfuck | |
8 * | |
9 * Edt/Rev YYYY/MM/DD Modified by | |
10 * Comment | |
11 * ------------------------------------------------------------------ | |
12 * 1 2015/10/02 Boisy G. Pitre | |
13 * Created. | |
14 * | |
15 | |
16 ifp1 | |
17 use defsfile | |
18 endc | |
19 | |
20 tylg set Prgrm+Objct | |
21 atrv set ReEnt+rev | |
22 rev set $00 | |
23 edition set 1 | |
24 | |
25 mod eom,name,tylg,atrv,start,size | |
26 | |
27 pSize equ 12000 | |
28 dSize equ 3000 | |
29 | |
30 org 0 | |
31 pmem rmb pSize | |
32 dmem rmb dSize | |
33 stack rmb 200 | |
34 size equ . | |
35 | |
36 name fcs /bfp/ | |
37 fcb edition | |
38 | |
39 * initialize interpreter | |
40 * clear program memory | |
41 start | |
42 lda #READ. | |
43 os9 I$Open | |
44 lbcs error | |
45 ldy #pSize | |
46 leax pmem,u | |
47 os9 I$Read | |
48 lbcs error | |
49 os9 I$Close | |
50 tfr y,d nul terminate program string in memory | |
51 clr d,x | |
52 | |
53 leay dmem,u | |
54 ldd #dSize | |
55 clrloop clr ,y+ | |
56 subd #$0001 | |
57 bne clrloop | |
58 leay dmem,u | |
59 bra parse | |
60 | |
61 ptrInc | |
62 leay 1,y | |
63 bra parse | |
64 | |
65 ptrDec | |
66 leay -1,y | |
67 bra parse | |
68 | |
69 dataInc | |
70 inc ,y | |
71 bra parse | |
72 | |
73 dataDec | |
74 dec ,y | |
75 bra parse | |
76 | |
77 putChar | |
78 pshs d,x,y | |
79 lda #1 | |
80 tfr y,x | |
81 ldy #1 | |
82 os9 I$Write | |
83 puls d,x,y,pc | |
84 | |
85 getChar | |
86 pshs d,x,y | |
87 clra | |
88 tfr y,x | |
89 ldy #1 | |
90 os9 I$Read | |
91 puls d,x,y,pc | |
92 | |
93 | |
94 brOpen lda #1 | |
95 pshs a | |
96 tst ,y | |
97 bne brOpenBye | |
98 brOpenDo | |
99 lda ,x+ | |
100 cmpa #'[ | |
101 bne brOpenCkClose | |
102 inc ,s | |
103 bra brOpenDoTest | |
104 brOpenCkClose | |
105 cmpa #'] | |
106 bne brOpenDoTest | |
107 dec ,s | |
108 brOpenDoTest | |
109 tst ,s | |
110 bne brOpenDo | |
111 brOpenBye | |
112 puls a,pc | |
113 | |
114 brClose | |
115 clr ,-s | |
116 brCloseDo | |
117 lda ,-x | |
118 cmpa #'[ | |
119 bne brCloseCkClose | |
120 inc ,s | |
121 bra brCloseDoCont | |
122 brCloseCkClose | |
123 cmpa #'] | |
124 bne brCloseDoCont | |
125 dec ,s | |
126 brCloseDoCont | |
127 tst ,s | |
128 bne brCloseDo | |
129 puls a,pc | |
130 | |
131 * X = Brainfuck program pointer (nul byte terminates) | |
132 * Y = Brainfuck data pointer | |
133 parse | |
134 lda ,x+ | |
135 beq parseEnd | |
136 cmpa #'> | |
137 bne a1 | |
138 leay 1,y | |
139 bra parse | |
140 a1 cmpa #'< | |
141 bne a2 | |
142 leay -1,y | |
143 bra parse | |
144 a2 cmpa #'+ | |
145 bne a3 | |
146 inc ,y | |
147 bra parse | |
148 a3 cmpa #'- | |
149 bne a4 | |
150 dec ,y | |
151 bra parse | |
152 a4 cmpa #'. | |
153 bne a5 | |
154 bsr putChar | |
155 bra parse | |
156 a5 cmpa #', | |
157 bne a6 | |
158 bsr getChar | |
159 bra parse | |
160 a6 cmpa #'[ | |
161 bne a7 | |
162 bsr brOpen | |
163 bra parse | |
164 a7 cmpa #'] | |
165 bne parse unrecognized character -- keep parsing | |
166 bsr brClose | |
167 bra parse | |
168 | |
169 | |
170 parseEnd | |
171 clrb | |
172 error | |
173 os9 F$Exit | |
174 | |
175 EMOD | |
176 eom EQU * | |
177 END |