dmgtris/src/gbc.asm

957 lines
16 KiB
NASM
Raw Normal View History

2023-10-24 07:04:39 +00:00
; DMGTRIS
; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com>
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
IF !DEF(GBC_ASM)
DEF GBC_ASM EQU 1
INCLUDE "globals.asm"
DEF B0 EQU %0010000000000000
DEF B1 EQU %0100000000000000
DEF B2 EQU %0101000000000000
DEF B3 EQU %0111110000000000
DEF G0 EQU %0000000100000000
DEF G1 EQU %0000001000000000
DEF G2 EQU %0000001010000000
DEF G3 EQU %0000001111100000
DEF R0 EQU %0000000000001000
DEF R1 EQU %0000000000010000
DEF R2 EQU %0000000000010100
DEF R3 EQU %0000000000011111
SECTION "GBC Shadow Tilemap", WRAM0, ALIGN[8]
wShadowTilemap:: ds 32*32
2023-10-27 19:37:32 +00:00
2023-10-24 07:04:39 +00:00
SECTION "GBC Shadow Tile Attributes", WRAM0, ALIGN[8]
wShadowTileAttrs:: ds 32*32
2023-10-27 19:37:32 +00:00
2023-10-24 07:04:39 +00:00
SECTION "GBC Variables", WRAM0
wOuterReps:: ds 1
wInnerReps:: ds 1
2023-10-24 08:29:16 +00:00
wTitlePal:: ds 1
2023-10-24 07:04:39 +00:00
2023-10-24 08:29:16 +00:00
SECTION "GBC Functions", ROM0
2023-10-27 19:37:32 +00:00
; Copies the shadow tile attribute map to vram using instant HDMA.
2023-10-24 08:29:16 +00:00
ToATTR::
ld a, [wInitialA]
cp a, $11
ret nz
; Bank 1
ld a, 1
ldh [rVBK], a
ld a, HIGH(wShadowTileAttrs)
ldh [rHDMA1], a
ld a, LOW(wShadowTileAttrs)
ldh [rHDMA2], a
ld a, HIGH($9800)
ldh [rHDMA3], a
ld a, LOW($9800)
ldh [rHDMA4], a
2023-10-24 08:59:02 +00:00
ld a, 40
2023-10-24 08:29:16 +00:00
ldh [rHDMA5], a
ld a, 0
ldh [rVBK], a
ret
2023-10-24 07:04:39 +00:00
2023-10-27 19:37:32 +00:00
; Sets up GBC registers for the title state.
2023-10-24 08:29:16 +00:00
GBCTitleInit::
2023-10-24 07:04:39 +00:00
ld a, [wInitialA]
cp a, $11
ret nz
ld a, BCPSF_AUTOINC
ldh [rBCPS], a
ldh [rOCPS], a
; Pal 0 (red, I)
2023-10-24 08:29:16 +00:00
ld bc, %0000000000000000
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R1
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R2
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R3
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 1 (green, Z)
2023-10-24 08:29:16 +00:00
ld bc, %0000000000000000
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, G1
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, G2
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, G3
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 2 (purple, S)
2023-10-24 08:29:16 +00:00
ld bc, %0000000000000000
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R1 | B1
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R2 | B2
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R3 | B3
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 3 (blue, J)
2023-10-24 08:29:16 +00:00
ld bc, %0000000000000000
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, B1
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, B2
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, B3
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 4 (orange, L)
2023-10-24 08:29:16 +00:00
ld bc, %0000000000000000
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R1 | G0
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R2 | G1
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R3 | G2
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 5 (yellow, O)
2023-10-24 08:29:16 +00:00
ld bc, %0000000000000000
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R1 | G1
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R2 | G2
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, R3 | G3
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 6 (cyan, T)
2023-10-24 08:29:16 +00:00
ld bc, %0000000000000000
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, B1 | G1
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, B2 | G2
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 08:29:16 +00:00
ld bc, B3 | G3
2023-10-24 07:04:39 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 7 (grayscale, inverted)
ld bc, %0000000000000000
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, %0010000100001000
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, %0100001000010000
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, %0111111111111111
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Copy the tilemap to shadow.
ld de, $9800
ld hl, wShadowTilemap
ld bc, 32*32
call UnsafeMemCopy
2023-10-24 08:29:16 +00:00
; Set attrs to pal 7 and copy to shadow.
2023-10-24 07:04:39 +00:00
ld a, 1
ldh [rVBK], a
2023-10-24 08:29:16 +00:00
ld d, $03
2023-10-24 07:04:39 +00:00
ld hl, $9800
2023-10-24 08:29:16 +00:00
ld bc, 32
call UnsafeMemSet
ld d, $01
ld bc, (5*32)
call UnsafeMemSet
ld d, $07
ld bc, (14*32)
2023-10-24 07:04:39 +00:00
call UnsafeMemSet
ld de, $9800
ld hl, wShadowTileAttrs
ld bc, 32*32
call UnsafeMemCopy
; Reset back to bank 0.
xor a, a
ldh [rVBK], a
2023-10-24 08:29:16 +00:00
; Save the current title palette.
ld a, $07
ld [wTitlePal], a
2023-10-24 07:04:39 +00:00
ret
2023-10-27 19:37:32 +00:00
; Sets the GBC registers for the gameplay state.
2023-10-24 07:04:39 +00:00
GBCGameplayInit::
ld a, [wInitialA]
cp a, $11
ret nz
2023-10-24 08:29:16 +00:00
ld a, BCPSF_AUTOINC
2023-10-24 07:04:39 +00:00
ldh [rBCPS], a
ldh [rOCPS], a
2023-10-24 08:29:16 +00:00
; Pal 0 (red, I)
ld bc, R3
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R2
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R1
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R0
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 1 (green, Z)
ld bc, G3
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, G2
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, G1
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, G0
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 2 (purple, S)
2023-10-24 20:21:48 +00:00
ld bc, R2 | B3
2023-10-24 08:29:16 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 20:21:48 +00:00
ld bc, R1 | B2
2023-10-24 08:29:16 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 20:21:48 +00:00
ld bc, R0 | B1
2023-10-24 08:29:16 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, B0 | %0000000000000010
2023-10-24 08:29:16 +00:00
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 3 (blue, J)
ld bc, B3
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, B2
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, B1
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, B0
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 4 (orange, L)
ld bc, R3 | G2
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R2 | G1
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R1 | G0
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R0
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 5 (yellow, O)
ld bc, R3 | G3
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R2 | G2
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R1 | G1
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, R0 | G0
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
; Pal 6 (cyan, T)
ld bc, B3 | G3
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, B2 | G2
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, B1 | G1
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, B0 | G0
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
2023-10-24 07:04:39 +00:00
; Pal 7 (grayscale)
ld bc, %0111111111111111
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, %0100001000010000
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, %0010000100001000
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld bc, %0000000000000000
ld a, b
ldh [rBCPD], a
ldh [rOCPD], a
ld a, c
ldh [rBCPD], a
ldh [rOCPD], a
; Copy the tilemap to shadow.
ld de, $9800
ld hl, wShadowTilemap
ld bc, 32*32
call UnsafeMemCopy
; Copy set attrs to pal 7 and copy to shadow.
ld a, 1
ldh [rVBK], a
ld d, $07
ld hl, $9800
ld bc, (32*32)
call UnsafeMemSet
ld de, $9800
ld hl, wShadowTileAttrs
ld bc, 32*32
call UnsafeMemCopy
; Reset back to bank 0.
xor a, a
ldh [rVBK], a
ret
2023-10-27 19:37:32 +00:00
; Additional GBC effects for the title screen process state.
2023-10-24 08:29:16 +00:00
GBCTitleProcess::
ld a, [wInitialA]
cp a, $11
ret nz
; Wipe the palettes.
ld d, $03
ld hl, wShadowTileAttrs
ld bc, 32
call UnsafeMemSet
ld d, $07
ld hl, wShadowTileAttrs+32
ld bc, (19*32)
call UnsafeMemSet
; Palette for the title?
ldh a, [hFrameCtr]
and $0F
cp a, $01
jr nz, .noinc
ld a, [wTitlePal]
inc a
cp a, $07
jr c, .nores
ld a, $00
.nores
ld [wTitlePal], a
.noinc
; Set the palette for the title.
ld a, [wTitlePal]
ld d, a
ld hl, wShadowTileAttrs + (2*32)
ld bc, (4*32)
call UnsafeMemSet
; And the selected row.
ld a, [wSelected]
inc a
ld hl, wShadowTileAttrs + (5*32)
ld bc, 64
: add hl, bc
dec a
jr nz, :-
ld a, 3
ld d, a
ld bc, 32
2023-10-27 19:37:32 +00:00
jp UnsafeMemSet
2023-10-24 08:29:16 +00:00
2023-10-27 19:37:32 +00:00
; Additional GBC effects for the gameplay process state.
2023-10-24 07:04:39 +00:00
GBCGameplayProcess::
ld a, [wInitialA]
cp a, $11
ret nz
2023-10-24 20:21:48 +00:00
; Color based on mode.
ld a, [wSpeedCurveState]
cp a, SCURVE_DMGT
2023-10-27 02:25:41 +00:00
ld a, $05 ;Blue
jr z, .goverride
2023-10-24 20:21:48 +00:00
ld a, [wSpeedCurveState]
cp a, SCURVE_TGM1
2023-10-27 02:25:41 +00:00
ld a, $06 ;Cyan
jr z, .goverride
2023-10-24 20:21:48 +00:00
ld a, [wSpeedCurveState]
cp a, SCURVE_TGM3
2023-10-27 02:25:41 +00:00
ld a, $03 ;Blue
jr z, .goverride
2023-10-24 20:21:48 +00:00
ld a, [wSpeedCurveState]
cp a, SCURVE_DEAT
2023-10-27 02:25:41 +00:00
ld a, $00 ;Red
jr z, .goverride
2023-10-24 20:21:48 +00:00
ld a, [wSpeedCurveState]
cp a, SCURVE_SHIR
ld a, $00 ;Red
2023-10-27 02:25:41 +00:00
jr z, .goverride ;Always red
2023-10-24 20:21:48 +00:00
ld a, [wSpeedCurveState]
cp a, SCURVE_CHIL
ld a, $01 ;Green
; Are we 20G?
2023-10-27 02:25:41 +00:00
.goverride
2023-10-24 20:21:48 +00:00
ld d, a
ldh a, [hCurrentIntegerGravity]
2023-10-24 08:59:02 +00:00
cp a, 20
2023-10-27 02:25:41 +00:00
jr c, :+
2023-10-24 08:59:02 +00:00
ld a, $00
2023-10-24 20:21:48 +00:00
ld d, a
2023-10-27 02:25:41 +00:00
jr .colorfield
: cp a, 3
jr c, :+
ld a, $04
ld d, a
jr .colorfield
: cp a, 2
jr c, :+
ld a, $05
ld d, a
jr .colorfield
: ldh a, [hCurrentFractionalGravity]
cp a, 0
jr nz, .colorfield
ld a, $05
ld d, a
2023-10-24 12:57:36 +00:00
.colorfield
2023-10-24 08:59:02 +00:00
ld hl, wShadowTileAttrs
ld bc, 32-12
ld a, 21
ld [wOuterReps], a
.outer0
ld a, 12
ld [wInnerReps], a
.inner0
ld [hl], d
inc hl
ld a, [wInnerReps]
dec a
ld [wInnerReps], a
jr nz, .inner0
add hl, bc
ld a, [wOuterReps]
dec a
ld [wOuterReps], a
jr nz, .outer0
2023-10-24 07:04:39 +00:00
; What to copy
2023-10-24 08:59:02 +00:00
: ld de, wField + 40
2023-10-24 07:04:39 +00:00
; Where to put it
ld hl, wShadowTilemap + 1
; How much to increment hl after each row
ld bc, 32-10
; Blit me up daddy.
ld a, 20
ld [wOuterReps], a
.outer1
ld a, 10
ld [wInnerReps], a
.inner1
ld a, [de]
ld [hl+], a
inc de
ld a, [wInnerReps]
dec a
ld [wInnerReps], a
jr nz, .inner1
add hl, bc
ld a, [wOuterReps]
dec a
ld [wOuterReps], a
jr nz, .outer1
; What to copy
ld de, wField + 40
; Where to put it
ld hl, wShadowTileAttrs + 1
; How much to increment hl after each row
ld bc, 32-10
; Blit me up daddy.
ld a, 20
ld [wOuterReps], a
.outer2
ld a, 10
ld [wInnerReps], a
.inner2
ld a, [de]
cp a, 10
jr c, .empty
cp a, 10 + (1*7)
jr c, .sub10
cp a, 10 + (2*7)
jr c, .sub17
cp a, 10 + (3*7)
jr c, .sub24
cp a, 10 + (4*7)
jr c, .sub31
cp a, 10 + (5*7)
jr c, .sub38
cp a, 10 + (6*7)
jr c, .sub45
cp a, 10 + (7*7)
jr c, .sub52
cp a, 10 + (8*7)
jr c, .sub59
.empty
ld a, $07
jr .done
.sub59
sub a, 7
.sub52
sub a, 7
.sub45
sub a, 7
.sub38
sub a, 7
.sub31
sub a, 7
.sub24
sub a, 7
.sub17
sub a, 7
.sub10
sub a, 10
.done
ld [hl+], a
inc de
ld a, [wInnerReps]
dec a
ld [wInnerReps], a
jr nz, .inner2
add hl, bc
ld a, [wOuterReps]
dec a
ld [wOuterReps], a
jr nz, .outer2
2023-10-24 20:21:48 +00:00
; Maybe flash numbers.
ldh a, [hCurrentIntegerGravity]
2023-10-24 20:21:48 +00:00
cp a, 20
jr nz, .black
ld hl, hFrameCtr
2023-10-25 02:29:14 +00:00
bit 4, [hl]
2023-10-24 20:21:48 +00:00
jr z, .lighter
.darker
ld a, OCPSF_AUTOINC | (7*8)+(3*2)
ldh [rOCPS], a
2023-10-25 02:29:14 +00:00
ld bc, R1 | G1
2023-10-24 20:21:48 +00:00
wait_vram
ld a, c
ldh [rOCPD], a
ld a, b
ldh [rOCPD], a
ret
.lighter
ld a, OCPSF_AUTOINC | (7*8)+(3*2)
ldh [rOCPS], a
2023-10-25 02:29:14 +00:00
ld bc, R2 | G2
2023-10-24 20:21:48 +00:00
wait_vram
ld a, c
ldh [rOCPD], a
ld a, b
ldh [rOCPD], a
ret
.black
ld a, OCPSF_AUTOINC | (7*8)+(3*2)
ldh [rOCPS], a
2023-10-26 12:29:06 +00:00
ld bc, R2 | B0
2023-10-24 20:21:48 +00:00
wait_vram
2023-10-26 12:29:06 +00:00
ld a, c
2023-10-24 20:21:48 +00:00
ldh [rOCPD], a
2023-10-26 12:29:06 +00:00
ld a, b
2023-10-24 20:21:48 +00:00
ldh [rOCPD], a
2023-10-24 07:04:39 +00:00
ret
2023-10-27 19:37:32 +00:00
; Copies the shadow tile maps to VRAM using HDMA. The attributes are copied using instant mode
; The tile data is done using hblank mode.
2023-10-24 07:04:39 +00:00
GBCBlitField::
2023-10-27 19:37:32 +00:00
ToVRAM::
; Bank 1
ld a, 1
ldh [rVBK], a
ld a, HIGH(wShadowTileAttrs)
ldh [rHDMA1], a
ld a, LOW(wShadowTileAttrs)
ldh [rHDMA2], a
ld a, HIGH($9800)
ldh [rHDMA3], a
ld a, LOW($9800)
ldh [rHDMA4], a
ld a, 40
ldh [rHDMA5], a
; Bank 0
ld a, 0
ldh [rVBK], a
ld a, HIGH(wShadowTilemap)
ldh [rHDMA1], a
ld a, LOW(wShadowTilemap)
ldh [rHDMA2], a
ld a, HIGH($9800)
ldh [rHDMA3], a
ld a, LOW($9800)
ldh [rHDMA4], a
ld a, 39 | $80
ldh [rHDMA5], a
jp EventLoop
2023-10-24 07:04:39 +00:00
ENDC