|
|
- 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
-
- ; Copy data between two regions (takes TODO cycles). Only use when size > 255
- ; @param bc Pointer to the destination region
- ; @param hl Pointer to the source region
- ; @param de Size (in bytes) to copy. Must be >0
- ; @destroy a, b, c, d, e, h, l
- memcpy16::
- ld a, [hli] ; 8
- ld [bc], a ; 8
- inc bc ; 8
-
- dec de ; 8
- xor a ; 4
- or d ; 4
- or e ; 4
-
- jr nz, memcpy16 ; 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
-
- ; Compute the minimum of two unsigned integers
- ; @param a First integer
- ; @param b Second integer
- ; @returns The minimum of the two in A
- ; 21 cycles if A < B, 26 cycles otherwise
- min::
- cp b
- ret c
- ld a, b
- ret
|