dw heap_start: 196608
dw heap_end: 262144
dw heap_current: 196608

new:
	push bpr
	mov spr, bpr

	ldw bpr, rg0, 8
	lli 12, rg1
	add rg0, rg1, rg2
	ldw heap_current, rg1
	add rg1, rg2, rg3
	ldw heap_end, rg4
	cmp rg3, rg4
	lli 0, rg5
	jle _cmp_end_2
	lli 1, rg5
_cmp_end_2:
	cmp rg5, zero
	jeq _else_4
_then_3:
	lli 0, rg4
	stw rg4, bpr, 8
	jmp _ret
	jmp _end_5
_else_4:
	nop
_end_5:
	lli 12, rg4
	add rg1, rg4, rg5
	add rg1, rg2, rg4
	stw rg5, rg1
	lli 4, rg6
	add rg1, rg6, rg7
	stw rg5, rg7
	lli 8, rg6
	add rg1, rg6, rg7
	stw rg4, rg7
	stw rg3, heap_current
	stw rg1, bpr, 8
	jmp _ret

alloc:
	push bpr
	mov spr, bpr

	ldw bpr, rg0, 8
	ldw bpr, rg1, 12
	lli 4, rg2
	add rg0, rg2, rg3
	ldw rg3, rg2
	lli 8, rg3
	add rg0, rg3, rg4
	ldw rg4, rg3
	add rg2, rg1, rg4
	cmp rg4, rg3
	lli 0, rg5
	jle _cmp_end_6
	lli 1, rg5
_cmp_end_6:
	cmp rg5, zero
	jeq _else_8
_then_7:
	lli 0, rg5
	stw rg5, bpr, 8
	jmp _ret
	jmp _end_9
_else_8:
	nop
_end_9:
	lli 4, rg5
	add rg0, rg5, rg6
	stw rg4, rg6
	stw rg2, bpr, 8
	jmp _ret

destroy:
	push bpr
	mov spr, bpr

	ldw bpr, rg0, 8
	lli 0, rg1
	stw rg1, bpr, 8
	jmp _ret

reset_all:
	push bpr
	mov spr, bpr

	ldw heap_start, rg0
	stw rg0, heap_current
	lli 0, rg0
	stw rg0, bpr, 8
	jmp _ret

_ret:
    mov bpr, spr
    pop bpr
    return
