+#define DBG_MARKER_TILE 0x80
+
debug_routines:
dw dbg_nop
dw dbg_rect_draw
; inits the debug interface
dbg_init:
+ ; set first rectangle to display
+ ld a, rectangles LO
+ ld [dbg_rect], a
+ ld a, rectangles HI
+ ld [dbg_rect+1], a
+
ret
; updates debug options
; keys:
; up + select: cycle to next debug rectangle
dbg_rect_draw:
+ ; TODO: add rectangle cycles
+
+ ; draw each corner of the rectangle if it is not 0
+ ld a, [dbg_rect]
+ ld e, a
+ ld a, [dbg_rect+1]
+ ld d, a
+
+ ; de = rectangle ptr
+
+ ; if flags are 0 we exit
+ ld a, [de]
+ cp a, 0
+ jp z, @rect_not_alloced
+
+ push de
+ ld a, 4
+ call oamalloc
+ pop de
+
+ ; hl = oam
+ inc de ; de = y position
+
+ ld a, [de]
+ add a, OBJ_OFF_Y
+ ld b, a ; b = y
+
+ inc de
+ ld a, [de]
+ add a, OBJ_OFF_X
+ ld c, a ; c = x
+ inc de ; de = height
+
+ ; write top left y
+ ld a, b
+ ld [hl+], a
+
+ ; write top left x
+ ld a, c
+ ld [hl+], a
+
+ ; write tile
+ ld a, DBG_MARKER_TILE
+ ld [hl+], a
+
+ ; write flags
+ xor a, a
+ ld [hl+], a
+
+ ; write top left y
+ ld a, [de] ; a = heigth
+ sub a, b ; height - y
+ add a, 16 + OBJ_OFF_Y ; off by one obj height so it won't end up off-screen
+ ld [hl+], a
+
+ ; write top left x
+ ld a, c
+ ld [hl+], a
+
+ ; write tile
+ ld a, DBG_MARKER_TILE
+ ld [hl+], a
+
+ ; write flags
+ xor a, a
+ ld [hl+], a
+
+ ; write bottom right y
+ inc de ; de = width
+ ld a, b ; a = y
+ ld [hl+], a
+
+ ; write bottomt right x
+ ld a, [de]
+ sub a, c
+ add a, OBJ_OFF_X + 8
+ ld [hl+], a
+
+ ; write tile
+ ld a, DBG_MARKER_TILE
+ ld [hl+], a
+
+ ; write flags
+ xor a, a
+ ld [hl+], a
+
+ dec de ; de = height
+
+ ; write top right y
+ ld a, [de] ; a = height
+ sub a, b ; height - y
+ add a, 16 + OBJ_OFF_Y ; off by one obj height so it won't end up off-screen
+ ld [hl+], a
+
+ ; write top left x
+ inc de ; de = width
+ ld a, [de]
+ sub a, c
+ add a, OBJ_OFF_X + 8
+ ld [hl+], a
+
+ ; write tile
+ ld a, DBG_MARKER_TILE
+ ld [hl+], a
+
+ ; write flags
+ xor a, a
+ ld [hl+], a
+
+
+ ret
+@rect_not_alloced:
ret