593 lines
13 KiB
Plaintext
593 lines
13 KiB
Plaintext
; ==== symbols ====
|
|
; _print_hex_nibble 0x00000328 TEXT global
|
|
; increment 0x000000ec TEXT global
|
|
; _clear_loop 0x000003ec TEXT global
|
|
; end 0x000000c0 TEXT global
|
|
; reset 0x000003bc TEXT global
|
|
; _print_end 0x00000288 TEXT global
|
|
; decrement 0x000000f4 TEXT global
|
|
; open_left 0x000001c8 TEXT global
|
|
; open_right 0x0000017c TEXT global
|
|
; expr_end 0x00000198 TEXT global
|
|
; newline 0x00000378 TEXT global
|
|
; input 0x0000013c TEXT global
|
|
; loop_start 0x00000050 TEXT global
|
|
; loop_end 0x000000e4 TEXT global
|
|
; _traverse_right 0x00000158 TEXT global
|
|
; dec_ptr 0x0000010c TEXT global
|
|
; expr_start 0x0000014c TEXT global
|
|
; print_hex_byte 0x000002e4 TEXT global
|
|
; print_byte 0x000002b0 TEXT global
|
|
; success 0x000009e8 DATA global
|
|
; data 0x000005e8 DATA global
|
|
; error 0x000005c4 DATA global
|
|
; clear 0x000003d4 TEXT global
|
|
; _print_hex_byte 0x00000304 TEXT global
|
|
; _bf_reset_clear_data 0x00000208 TEXT global
|
|
; bf_reset 0x000001e4 TEXT global
|
|
; _end 0x00000404 TEXT global
|
|
; _traverse_left_start 0x000001a0 TEXT global
|
|
; _init 0x00000000 TEXT global
|
|
; counter 0x000005dc DATA global
|
|
; _print_loop 0x0000026c TEXT global
|
|
; print_whitespace 0x00000354 TEXT global
|
|
; inc_ptr 0x000000fc TEXT global
|
|
; current 0x000009f8 DATA global
|
|
; _traverse_right_start 0x00000154 TEXT global
|
|
; print 0x00000244 TEXT global
|
|
; init 0x00000010 TEXT global
|
|
; stack 0x000005e0 DATA global
|
|
; _traverse_left 0x000001a4 TEXT global
|
|
; start 0x0000001c TEXT global
|
|
; close_left 0x000001dc TEXT global
|
|
; input_addr 0x000005e4 DATA global
|
|
; close_right 0x00000184 TEXT global
|
|
; display 0x000009f4 DATA global
|
|
; _newline_done 0x000003b0 TEXT global
|
|
; program 0x0000041c DATA global
|
|
; _newline_mod 0x000003a0 TEXT global
|
|
; _print_hex_nibble_number 0x00000344 TEXT global
|
|
; output 0x0000011c TEXT global
|
|
|
|
; ==== data ====
|
|
db "++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++>++++++++++++++++>>+<<[>>>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[<+>-]>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-]<<<<<<<.>.>>[>>+<<-]>[>+<<+>-]>[<+>-]<<<-]<<++..."
|
|
db "Invalid Instruction!"
|
|
dw 0x00000000
|
|
dw 0x000000ff
|
|
dw 0x00000000
|
|
dw 0x00000001
|
|
dw 0x00000003
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
db "Success!"
|
|
dw 0x00000000
|
|
dw 0x00000000
|
|
dw 0x00000002
|
|
dw 0x00000002
|
|
|
|
; ==== text ====
|
|
_init:
|
|
ldw stack, Bpr, 0x0000
|
|
mov Bpr, Spr
|
|
init:
|
|
ldw counter, Rg7, 0x0000
|
|
start:
|
|
call bf_reset
|
|
lwi program, Rg0
|
|
lwi data, Rg1
|
|
lli Rg8, 0x002b
|
|
lli Rg9, 0x002d
|
|
lli Rga, 0x003e
|
|
lli Rgb, 0x003c
|
|
lli Rgc, 0x002e
|
|
lli Rgd, 0x002c
|
|
lli Rge, 0x005b
|
|
lli Rgf, 0x005d
|
|
loop_start:
|
|
ldb Rg0, Rg3, 0x0000
|
|
ieq Rg3, Rg8, Rg4
|
|
jnz Rg4, increment
|
|
ieq Rg3, Rg9, Rg4
|
|
jnz Rg4, decrement
|
|
ieq Rg3, Rga, Rg4
|
|
jnz Rg4, inc_ptr
|
|
ieq Rg3, Rgb, Rg4
|
|
jnz Rg4, dec_ptr
|
|
ieq Rg3, Rgc, Rg4
|
|
jnz Rg4, output
|
|
ieq Rg3, Rgd, Rg4
|
|
jnz Rg4, input
|
|
ieq Rg3, Rge, Rg4
|
|
jnz Rg4, expr_start
|
|
ieq Rg3, Rgf, Rg4
|
|
jnz Rg4, expr_end
|
|
ieq Rg3, Zero, Rg4
|
|
jnz Rg4, end
|
|
lwi error, Rg2
|
|
push Rg0
|
|
push Rg1
|
|
push Rg2
|
|
call print
|
|
pop Zero
|
|
pop Rg1
|
|
pop Rg0
|
|
end:
|
|
call newline
|
|
lwi success, Rg0
|
|
push Rg0
|
|
call print
|
|
pop Zero
|
|
subi Rg7, Rg7, 0x0001
|
|
jnz Rg7, start
|
|
hlt
|
|
loop_end:
|
|
addi Rg0, Rg0, 0x0001
|
|
jmp loop_start
|
|
increment:
|
|
addi Rg2, Rg2, 0x0001
|
|
jmp loop_end
|
|
decrement:
|
|
subi Rg2, Rg2, 0x0001
|
|
jmp loop_end
|
|
inc_ptr:
|
|
stw Rg2, Rg1, 0x0000
|
|
addi Rg1, Rg1, 0x0004
|
|
ldw Rg1, Rg2, 0x0000
|
|
jmp loop_end
|
|
dec_ptr:
|
|
stw Rg2, Rg1, 0x0000
|
|
subi Rg1, Rg1, 0x0004
|
|
ldw Rg1, Rg2, 0x0000
|
|
jmp loop_end
|
|
output:
|
|
push Rg0
|
|
push Rg1
|
|
push Rg2
|
|
call print_byte
|
|
pop Zero
|
|
pop Rg1
|
|
pop Rg0
|
|
jmp loop_end
|
|
input:
|
|
ldw input_addr, Rg2, 0x0000
|
|
jmp loop_end
|
|
expr_start:
|
|
ieq Rg2, Zero, Rg4
|
|
jez Rg4, loop_end
|
|
_traverse_right_start:
|
|
push Rg8
|
|
_traverse_right:
|
|
addi Rg0, Rg0, 0x0001
|
|
ldb Rg0, Rg3, 0x0000
|
|
ieq Rg3, Rge, Rg4
|
|
jnz Rg4, open_right
|
|
ieq Rg3, Rgf, Rg4
|
|
jnz Rg4, close_right
|
|
ieq Rg3, Zero, Rg4
|
|
jnz Rg4, end
|
|
jmp _traverse_right
|
|
open_right:
|
|
push Zero
|
|
jmp _traverse_right
|
|
close_right:
|
|
pop Rg4
|
|
ieq Rg4, Zero, Rg5
|
|
jnz Rg5, _traverse_right
|
|
addi Rg0, Rg0, 0x0001
|
|
jmp loop_start
|
|
expr_end:
|
|
ieq Rg2, Zero, Rg4
|
|
jnz Rg4, loop_end
|
|
_traverse_left_start:
|
|
push Rg8
|
|
_traverse_left:
|
|
subi Rg0, Rg0, 0x0001
|
|
ldb Rg0, Rg3, 0x0000
|
|
ieq Rg3, Rge, Rg4
|
|
jnz Rg4, open_left
|
|
ieq Rg3, Rgf, Rg4
|
|
jnz Rg4, close_left
|
|
ieq Rg3, Zero, Rg4
|
|
jnz Rg4, end
|
|
jmp _traverse_left
|
|
open_left:
|
|
pop Rg4
|
|
ieq Rg4, Zero, Rg5
|
|
jnz Rg5, _traverse_left
|
|
addi Rg0, Rg0, 0x0001
|
|
jmp loop_start
|
|
close_left:
|
|
push Zero
|
|
jmp _traverse_left
|
|
bf_reset:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
push Rg0
|
|
push Rg1
|
|
call clear
|
|
call reset
|
|
lli Rg0, 0x0100
|
|
lwi data, Rg1
|
|
_bf_reset_clear_data:
|
|
subi Rg0, Rg0, 0x0001
|
|
stw Zero, Rg1, 0x0000
|
|
addi Rg1, Rg1, 0x0004
|
|
igt Rg0, Zero, Rg4
|
|
jnz Rg4, _bf_reset_clear_data
|
|
pop Rg1
|
|
pop Rg0
|
|
lwi program, Rg0
|
|
lwi data, Rg1
|
|
lli Rg2, 0x0000
|
|
mov Bpr, Spr
|
|
pop Bpr
|
|
ret
|
|
print:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
push Rg0
|
|
push Rg1
|
|
push Rg2
|
|
push Rg3
|
|
ldw Bpr, Rg0, 0x0008
|
|
ldw current, Rg1, 0x0000
|
|
_print_loop:
|
|
ldb Rg0, Rg2, 0x0000
|
|
ieq Rg2, Zero, Rg3
|
|
jnz Rg3, _print_end
|
|
stb Rg2, Rg1, 0x0000
|
|
addi Rg0, Rg0, 0x0001
|
|
addi Rg1, Rg1, 0x0001
|
|
jmp _print_loop
|
|
_print_end:
|
|
stw current, Rg1, 0x0000
|
|
pop Rg3
|
|
pop Rg2
|
|
pop Rg1
|
|
pop Rg0
|
|
mov Bpr, Spr
|
|
pop Bpr
|
|
ret
|
|
print_byte:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
push Rg0
|
|
push Rg1
|
|
ldw Bpr, Rg0, 0x0008
|
|
ldw current, Rg1, 0x0000
|
|
stb Rg0, Rg1, 0x0000
|
|
addi Rg1, Rg1, 0x0001
|
|
pop Rg1
|
|
pop Rg0
|
|
jmp _end
|
|
print_hex_byte:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
ldw Bpr, Rg0, 0x0008
|
|
ldw current, Rg1, 0x0000
|
|
call _print_hex_byte
|
|
jmp _end
|
|
_print_hex_byte:
|
|
lli Rg2, 0x000f
|
|
push Rg0
|
|
shr Rg0, Rg0, Zero, 4
|
|
and Rg0, Rg2, Rg0
|
|
call _print_hex_nibble
|
|
pop Rg0
|
|
and Rg0, Rg2, Rg0
|
|
call _print_hex_nibble
|
|
ret
|
|
_print_hex_nibble:
|
|
lli Rg3, 0x000a
|
|
ilt Rg0, Rg3, Rg4
|
|
jnz Rg4, _print_hex_nibble_number
|
|
addi Rg0, Rg0, 0x0037
|
|
stb Rg0, Rg1, 0x0000
|
|
addi Rg1, Rg1, 0x0001
|
|
ret
|
|
_print_hex_nibble_number:
|
|
addi Rg0, Rg0, 0x0030
|
|
stb Rg0, Rg1, 0x0000
|
|
addi Rg1, Rg1, 0x0001
|
|
ret
|
|
print_whitespace:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
ldw current, Rg1, 0x0000
|
|
lli Rg0, 0x0020
|
|
stb Rg0, Rg1, 0x0000
|
|
addi Rg1, Rg1, 0x0001
|
|
jmp _end
|
|
newline:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
ldw display, Rg0, 0x0000
|
|
ldw current, Rg1, 0x0000
|
|
sub Rg1, Rg0, Rg2
|
|
lli Rg3, 0x0050
|
|
_newline_mod:
|
|
ilt Rg2, Rg3, Rg4
|
|
jnz Rg4, _newline_done
|
|
sub Rg2, Rg3, Rg2
|
|
jmp _newline_mod
|
|
_newline_done:
|
|
sub Rg1, Rg2, Rg1
|
|
addi Rg1, Rg1, 0x0050
|
|
jmp _end
|
|
reset:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
ldw display, Rg1, 0x0000
|
|
jmp _end
|
|
clear:
|
|
push Bpr
|
|
mov Spr, Bpr
|
|
lli Rg0, 0x01f4
|
|
ldw display, Rg1, 0x0000
|
|
_clear_loop:
|
|
subi Rg0, Rg0, 0x0001
|
|
stw Zero, Rg1, 0x0000
|
|
addi Rg1, Rg1, 0x0004
|
|
igt Rg0, Zero, Rg4
|
|
jnz Rg4, _clear_loop
|
|
jmp _end
|
|
_end:
|
|
stw current, Rg1, 0x0000
|
|
mov Bpr, Spr
|
|
pop Bpr
|
|
ret
|