559 lines
9.1 KiB
NASM
559 lines
9.1 KiB
NASM
|
; 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
|
||
|
|
||
|
SECTION "GBC Shadow Tile Attributes", WRAM0, ALIGN[8]
|
||
|
wShadowTileAttrs:: ds 32*32
|
||
|
|
||
|
SECTION "GBC Variables", WRAM0
|
||
|
wOuterReps:: ds 1
|
||
|
wInnerReps:: ds 1
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
SECTION "GBC Functions", ROM0
|
||
|
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, 39
|
||
|
ldh [rHDMA5], a
|
||
|
|
||
|
|
||
|
; Bank 1
|
||
|
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
|
||
|
|
||
|
GBCPalettes::
|
||
|
ld a, [wInitialA]
|
||
|
cp a, $11
|
||
|
ret nz
|
||
|
ld a, BCPSF_AUTOINC
|
||
|
ldh [rBCPS], a
|
||
|
ldh [rOCPS], a
|
||
|
|
||
|
; 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)
|
||
|
ld bc, R3 | B3
|
||
|
ld a, c
|
||
|
ldh [rBCPD], a
|
||
|
ldh [rOCPD], a
|
||
|
ld a, b
|
||
|
ldh [rBCPD], a
|
||
|
ldh [rOCPD], a
|
||
|
|
||
|
ld bc, R2 | B2
|
||
|
ld a, c
|
||
|
ldh [rBCPD], a
|
||
|
ldh [rOCPD], a
|
||
|
ld a, b
|
||
|
ldh [rBCPD], a
|
||
|
ldh [rOCPD], a
|
||
|
|
||
|
ld bc, R1 | B1
|
||
|
ld a, c
|
||
|
ldh [rBCPD], a
|
||
|
ldh [rOCPD], a
|
||
|
ld a, b
|
||
|
ldh [rBCPD], a
|
||
|
ldh [rOCPD], a
|
||
|
|
||
|
ld bc, R0 | B0
|
||
|
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
|
||
|
ret
|
||
|
|
||
|
|
||
|
GBCTitleInit::
|
||
|
ld a, [wInitialA]
|
||
|
cp a, $11
|
||
|
ret nz
|
||
|
ld a, BCPSF_AUTOINC | (7*8)
|
||
|
ldh [rBCPS], a
|
||
|
ldh [rOCPS], 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
|
||
|
|
||
|
; 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
|
||
|
|
||
|
|
||
|
GBCGameplayInit::
|
||
|
ld a, [wInitialA]
|
||
|
cp a, $11
|
||
|
ret nz
|
||
|
ld a, BCPSF_AUTOINC | (7*8)
|
||
|
ldh [rBCPS], a
|
||
|
ldh [rOCPS], a
|
||
|
|
||
|
; 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
|
||
|
|
||
|
|
||
|
GBCGameplayProcess::
|
||
|
ld a, [wInitialA]
|
||
|
cp a, $11
|
||
|
ret nz
|
||
|
|
||
|
|
||
|
; What to copy
|
||
|
ld de, wField + 40
|
||
|
; 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
|
||
|
|
||
|
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
GBCBlitField::
|
||
|
call ToVRAM
|
||
|
jp EventLoop
|
||
|
|
||
|
|
||
|
ENDC
|