-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbf.s
More file actions
215 lines (199 loc) · 2.29 KB
/
bf.s
File metadata and controls
215 lines (199 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
; Boot sector brainfuck
cpu 386
section boot
org 0x7c00
tape: equ 0x8200 ; Tape location
stack: equ 0xff00 ; Stack
input: equ 0x7e00 ; Input buffer
start:
mov sp, stack
push cs
push cs
push cs
pop ds
pop es
pop ss
cld
mov bx, tape
.1: mov byte [bx], 0
inc bx
jne .1
mov bp, tape
jmp main
clrf:
push ax
mov ah, 0xe
mov al, 0xa
int 10h
mov al, 0xd
int 10h
pop ax
ret
putc:
push ax
mov ah, 0xe
int 10h
pop ax
ret
puts:
push ax
push si
mov ah, 0xe
.1: lodsb
or al, al
je .2
int 10h
jmp .1
.2: pop si
pop ax
ret
getc:
mov ah, 0x0
int 16h
ret
; Main loop
main:
call getline ; get line
cmp di, input ; Hasn't changed?
je main
mov al, ' '
call putc
call runcode ; run buffered code
jmp main
getline:
call clrf
push ax
mov di, input
.1: call getc ; Get char
cmp al, 8 ; Backspace?
jne .2 ; no?
mov ah, 0x3
int 10h
or dl, dl
je .1
dec dl
mov ah, 0x2
int 10h
mov ah, 0x0
dec di
jmp .1
.2: cmp al, 0xd ; Is it return key then?
je .4
.3: stosb
call putc
jmp .1
.4: mov al, 0
stosb
dec di
pop ax
ret
runcode:
push ax
push si
mov si, input
; switch (*ptr) {
e1: lodsb
cmp al, '+' ; case '+'
je instr_inc
cmp al, '-' ; case '-'
je instr_dec
cmp al, '>' ; ...
je instr_mr
cmp al, '<'
je instr_ml
cmp al, ','
je instr_getc
cmp al, '.'
je instr_putc
cmp al, '['
je instr_ob
cmp al, ']'
je instr_cb
cmp al, '#'
je instr_debug
cmp al, 0
jne e1 ; }
.2: pop si
pop ax
ret
instr_inc:
inc byte [bp]
jmp e1
instr_dec:
dec byte [bp]
jmp e1
instr_mr:
inc bp
jmp e1
instr_ml:
dec bp
jmp e1
instr_getc:
push ax
mov ah, 0x0
int 16h
mov [bp], al
pop ax
jmp e1
instr_putc:
push ax
mov ah, 0xe
mov al, [bp]
int 10h
pop ax
jmp e1
instr_ob:
cmp byte [bp], 0
jne e1
mov cx, 1
.1: lodsb
cmp al, '['
jne .2
inc cx
.2: cmp al, ']'
jne .3
dec cx
je e1
.3: jmp .1
instr_cb:
cmp byte [bp], 0
je e1
mov cx, 1
std
sub si, 2
.1: lodsb
cmp al, ']'
jne .2
inc cx
.2: cmp al, '['
jne .1
dec cx
jne .1
.3: cld
inc si
jmp e1
instr_debug:
push ax
mov al, byte [bp]
mov ah, al
shr al, 4
and al, 0x0f
call .1
mov al, ah
and al, 0x0f
call .1
mov al, ' '
call putc
pop ax
jmp e1
.1: cmp al, 0x0a
jl .2
add al, 'a'
sub al, 0x0a
call putc
ret
.2: add al, '0'
call putc
ret
times 510-($-$$) db 0x4f
db 0x55,0xaa