|
|
|
SECTION "functions", ROMX[$4000]
|
|
|
|
|
|
|
|
; Disables the LCD during the next vblank period.
|
|
|
|
; Clobbers HL.
|
|
|
|
_lcdDisable: MACRO
|
|
|
|
call waitVBlank
|
|
|
|
ld hl, $ff40
|
|
|
|
ld a, [hl]
|
|
|
|
res 7, a
|
|
|
|
ld [hl], a
|
|
|
|
ENDM
|
|
|
|
|
|
|
|
; Enables the LCD immediately.
|
|
|
|
; Clobbers HL.
|
|
|
|
_lcdEnable: MACRO
|
|
|
|
ld hl, $ff40
|
|
|
|
ld a, [hl]
|
|
|
|
set 7, a
|
|
|
|
ld [hl], a
|
|
|
|
ENDM
|
|
|
|
|
|
|
|
; Completely the flags register.
|
|
|
|
; Modifies:
|
|
|
|
; F - End result: 0
|
|
|
|
clearFlags:
|
|
|
|
push bc
|
|
|
|
ld b, a
|
|
|
|
ld c, 0
|
|
|
|
push bc
|
|
|
|
pop af
|
|
|
|
pop bc
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Clears the Nintendo logo tile data. This is intended to leave the screen open
|
|
|
|
; for simple (i.e. a bunch of boxes drawn with fillTile) test output.
|
|
|
|
clearLogo:
|
|
|
|
push af
|
|
|
|
push hl
|
|
|
|
|
|
|
|
; disable the LCD
|
|
|
|
_lcdDisable
|
|
|
|
|
|
|
|
; wipe the logo
|
|
|
|
ld hl, $81A0
|
|
|
|
.loop:
|
|
|
|
ld a, $0
|
|
|
|
ld [hld], a
|
|
|
|
ld a, h
|
|
|
|
cp $80
|
|
|
|
jr nz, .loop
|
|
|
|
ld a, l
|
|
|
|
cp $0f
|
|
|
|
jr nz, .loop
|
|
|
|
|
|
|
|
; enable the LCD and return
|
|
|
|
_lcdEnable
|
|
|
|
|
|
|
|
pop af
|
|
|
|
pop hl
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Draws an inverted grid over where the Nintendo logo tile data normally
|
|
|
|
; resides. This is useful for tests that use a grid output, as it will make the
|
|
|
|
; tile number more obvious. This should be called after the tests are performed,
|
|
|
|
; as fillTile and fillTileEx will draw over the grid.
|
|
|
|
drawGrid:
|
|
|
|
push hl
|
|
|
|
push de
|
|
|
|
push bc
|
|
|
|
ld hl, $8010 ; Start address.
|
|
|
|
ld de, $8190 ; End address.
|
|
|
|
ld b, $f ; Used to find the top of each file.
|
|
|
|
_gridLoop:
|
|
|
|
ld a, l ; Check for the top of the tiles.
|
|
|
|
and b
|
|
|
|
jr z, _handleTop
|
|
|
|
|
|
|
|
; Invert the right side of the tile.
|
|
|
|
ld c, $01
|
|
|
|
ld a, [hl]
|
|
|
|
xor c
|
|
|
|
ld [hli], a
|
|
|
|
|
|
|
|
; See if we've reached the end.
|
|
|
|
ld a, h
|
|
|
|
cp d
|
|
|
|
jr nz, _gridLoop
|
|
|
|
ld a, l
|
|
|
|
cp e
|
|
|
|
jr nz, _gridLoop
|
|
|
|
|
|
|
|
; Fin.
|
|
|
|
pop bc
|
|
|
|
pop de
|
|
|
|
pop hl
|
|
|
|
ret
|
|
|
|
|
|
|
|
_handleTop:
|
|
|
|
; Each row is stuffed into two bytes, so two writes are required to fully
|
|
|
|
; invert the top row.
|
|
|
|
ld a, [hl]
|
|
|
|
cpl
|
|
|
|
ld [hli], a
|
|
|
|
ld a, [hl]
|
|
|
|
cpl
|
|
|
|
ld [hli], a
|
|
|
|
jr _gridLoop
|
|
|
|
|
|
|
|
; Writes a value across 16 bytes, starting at HL. Intended to fill a single tile.
|
|
|
|
; Parameters:
|
|
|
|
; B - The value to set the bytes to.
|
|
|
|
; HL - Destintion location.
|
|
|
|
; Modifies:
|
|
|
|
; HL - End result: HL + 16
|
|
|
|
fillTile:
|
|
|
|
push de
|
|
|
|
ld d, 16
|
|
|
|
call memset
|
|
|
|
pop de
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Fills a 16 byte block with a specific pattern. Intended to fill a single tile
|
|
|
|
; with a specific grayscale or color shade.
|
|
|
|
; Parameters:
|
|
|
|
; B - The pattern to write:
|
|
|
|
; $00: $00 $00
|
|
|
|
; $01: $FF $00
|
|
|
|
; $02: $00 $FF
|
|
|
|
; $03: $FF $FF
|
|
|
|
; HL - Destintion location.
|
|
|
|
; Modifies:
|
|
|
|
; B - Set to $00 or $FF.
|
|
|
|
; HL - End result: HL + 16
|
|
|
|
fillTileEx:
|
|
|
|
push af
|
|
|
|
ld a, b
|
|
|
|
ld b, %11
|
|
|
|
and b
|
|
|
|
jr nz, _check3
|
|
|
|
|
|
|
|
; b = $00. Fill with palette entry 0.
|
|
|
|
ld b, $00
|
|
|
|
call fillTile
|
|
|
|
pop af
|
|
|
|
ret
|
|
|
|
|
|
|
|
_check3:
|
|
|
|
cp b
|
|
|
|
jr nz, _handleAlt
|
|
|
|
|
|
|
|
; b = $ff. Fill with palette entry 3.
|
|
|
|
ld b, $ff
|
|
|
|
call fillTile
|
|
|
|
pop af
|
|
|
|
ret
|
|
|
|
|
|
|
|
_handleAlt:
|
|
|
|
push de
|
|
|
|
ld b, %01
|
|
|
|
ld d, 16
|
|
|
|
ld e, $ff
|
|
|
|
cp b
|
|
|
|
ld a, 0
|
|
|
|
jr nz, _fillLoop
|
|
|
|
xor e
|
|
|
|
_fillLoop:
|
|
|
|
ld [hli], a
|
|
|
|
xor e
|
|
|
|
dec d
|
|
|
|
jr nz, _fillLoop
|
|
|
|
|
|
|
|
pop de
|
|
|
|
pop af
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Copies up to 256 bytes of memory to another location.
|
|
|
|
; Parameter:
|
|
|
|
; BC - Source location.
|
|
|
|
; HL - Destination location.
|
|
|
|
; D - The number of bytes to copy.
|
|
|
|
; Modifies:
|
|
|
|
; BC - End result: BC + D
|
|
|
|
; HL - End result: BC + d
|
|
|
|
; D - End result: $00
|
|
|
|
memcpy:
|
|
|
|
ld a, [bc]
|
|
|
|
ld [hli], a
|
|
|
|
inc bc
|
|
|
|
dec d
|
|
|
|
ret z
|
|
|
|
jr memcpy
|
|
|
|
|
|
|
|
; Fills up to 256 bytes of memory with a set value, starting at HL.
|
|
|
|
; Parameters:
|
|
|
|
; B - The value to set the bytes to.
|
|
|
|
; D - The number of bytes to modify.
|
|
|
|
; HL - Destination location.
|
|
|
|
; Modifies:
|
|
|
|
; D - End result: 0
|
|
|
|
; HL - End result: HL + D
|
|
|
|
memset:
|
|
|
|
push af
|
|
|
|
ld a, b
|
|
|
|
.loop:
|
|
|
|
ld [hli], a
|
|
|
|
dec d
|
|
|
|
jr nz, .loop
|
|
|
|
pop af
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Wait for vblank without using interrupts.
|
|
|
|
waitVBlank:
|
|
|
|
push af
|
|
|
|
.loop:
|
|
|
|
ldh a, [$ff44]
|
|
|
|
cp $90
|
|
|
|
jr nz, .loop
|
|
|
|
pop af
|
|
|
|
ret
|