heap_sort:
	ld a,(draw_count)
	ld b,a
	sra a
	dec a
form_heap:
	push af
	call sift
	pop af
	dec a
	jr nz,form_heap	;don't run heapify on root node, this is sifted first in "remove root"
	
	ld a,b
	exx
	ld l,a\ ld h,0
	ld de,draw_queue
	add hl,de
	exx
remove_root:
	xor a
	call sift	;sift up to b
	exx
	dec hl
	ld c,(hl)
	ld a,(de)
	ld (hl),a
	ld a,c
	ld (de),a
	exx
	djnz remove_root
	ret
	
;b = upper bound
;a = root node
sift:	
	ld hl,draw_queue
	ld d,0
	ld e,a		;de = n
	add hl,de	;hl = root
	ex de,hl	;hl = n, de = root
sift_loop:
	add a,a
	inc a
	sub b\ ret nc	;if this were the last one, result would be -1
	inc l		;n + 1
	add hl,de	;base + n + n + 1 = base[2n+1]
	inc a
	ld a,(hl)	;a = first child
	jr z,++_	;make sure second child exists
	inc hl
	cp (hl)		;first - second
	jr c,+_
	ld a,(hl)	;a has smaller child
	inc hl
_	dec hl	
_	ex de,hl
	cp (hl)		;child - root
	ret nc
;now we're swapping
	ld c,(hl)	;root
	ld (hl),a	;root
	ld a,c
	ld (de),a	;child gets root
	ld hl,-draw_queue
	add hl,de	;hl = n, de = root
	ld a,l
	jr sift_loop