SECTION "Utilities", ROM0
|
|
|
|
; Busy-wait until vertical blank occurs
|
|
wait_for_vblank::
|
|
ld a, [$ff41]
|
|
and 3
|
|
cp 1
|
|
jr nz, wait_for_vblank
|
|
ret
|
|
|
|
; Copy data between two regions (takes 40*N+12 cycles)
|
|
; @param bc Pointer to the destination region
|
|
; @param hl Pointer to the source region
|
|
; @param d Size (in bytes) to copy. Must be >0
|
|
; @destroy a, b, c, d, h, l
|
|
memcpy::
|
|
ld a, [hli] ; 8
|
|
ld [bc], a ; 8
|
|
inc bc ; 8
|
|
dec d ; 4
|
|
jr nz, memcpy ; 12/8
|
|
ret ; 16
|
|
|
|
; Fill a memory region with a value
|
|
; @param hl Pointer to the destination region
|
|
; @param a Byte to fill with
|
|
; @param c Number of bytes to fill. Must be >0
|
|
; @destroy a, c, hl
|
|
memset::
|
|
ld [hli], a
|
|
dec c
|
|
jr nz, memset
|
|
ret
|
|
|
|
; Divide a value by 10 (http://homepage.divms.uiowa.edu/~jones/bcd/decimal.html#division)
|
|
; @param b Dividend
|
|
; @return a Quotient
|
|
; @destroy b
|
|
div10::
|
|
ld a, b
|
|
srl a
|
|
srl a
|
|
add b
|
|
srl a
|
|
add b
|
|
srl a
|
|
srl a
|
|
srl a
|
|
add b
|
|
srl a
|
|
add b
|
|
srl a
|
|
srl a
|
|
srl a
|
|
srl a
|
|
ret
|