ref: 004956798cbdb74c71a11377586eb2ff190321b1
parent: 1ecb3078242146c0d8fa53447cdbc755c9535644
author: yenatch <[email protected]>
date: Tue Sep 3 14:32:55 EDT 2013
split vram functions out into engine/video.asm
--- /dev/null
+++ b/engine/video.asm
@@ -1,0 +1,487 @@
+; Functions dealing with VRAM.
+
+DMATransfer: ; 15d8
+; Return carry if the transfer is completed.
+
+ ld a, [hDMATransfer]
+ and a
+ ret z
+
+; Start transfer
+ ld [rHDMA5], a
+
+; Execution is halted until the transfer is complete.
+
+ xor a
+ ld [hDMATransfer], a
+ scf
+ ret
+; 15e3
+
+
+UpdateBGMapBuffer: ; 15e3
+; Copy [$ffdc] 16x8 tiles from BGMapBuffer
+; to bg map addresses in BGMapBufferPtrs.
+
+; [$ffdc] must be even since this is done in pairs.
+
+; Return carry on success.
+
+ ld a, [hBGMapUpdate]
+ and a
+ ret z
+
+ ld a, [rVBK]
+ push af
+ ld [hSPBuffer], sp
+
+ ld hl, BGMapBufferPtrs
+ ld sp, hl
+
+; We can now pop the addresses of affected spots on the BG Map
+
+ ld hl, BGMapPalBuffer
+ ld de, BGMapBuffer
+
+
+.next
+; Copy a pair of 16x8 blocks (one 16x16 block)
+
+rept 2
+; Get our BG Map address
+ pop bc
+
+; Palettes
+ ld a, 1
+ ld [rVBK], a
+
+ ld a, [hli]
+ ld [bc], a
+ inc c
+ ld a, [hli]
+ ld [bc], a
+ dec c
+
+; Tiles
+ ld a, 0
+ ld [rVBK], a
+
+ ld a, [de]
+ inc de
+ ld [bc], a
+ inc c
+ ld a, [de]
+ inc de
+ ld [bc], a
+endr
+
+; We've done 2 16x8 blocks
+ ld a, [$ffdc]
+ dec a
+ dec a
+ ld [$ffdc], a
+
+ jr nz, .next
+
+
+ ld a, [hSPBuffer]
+ ld l, a
+ ld a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+
+ pop af
+ ld [rVBK], a
+
+ xor a
+ ld [hBGMapUpdate], a
+ scf
+ ret
+; 163a
+
+
+WaitTop: ; 163a
+; Wait until the top third of the BG Map is being updated.
+
+ ld a, [hBGMapMode]
+ and a
+ ret z
+
+ ld a, [hBGMapThird]
+ and a
+ jr z, .done
+
+ call DelayFrame
+ jr WaitTop
+
+.done
+ xor a
+ ld [hBGMapMode], a
+ ret
+; 164c
+
+
+UpdateBGMap: ; 164c
+; Update the BG Map, in thirds, from TileMap and AttrMap.
+
+ ld a, [hBGMapMode]
+ and a
+ ret z
+
+; BG Map 0
+ dec a ; 1
+ jr z, .Tiles
+ dec a ; 2
+ jr z, .Attr
+
+; BG Map 1
+ dec a
+
+ ld a, [hBGMapAddress]
+ ld l, a
+ ld a, [hBGMapAddress + 1]
+ ld h, a
+ push hl
+
+ xor a
+ ld [hBGMapAddress], a
+ ld a, VBGMap1 >> 8
+ ld [hBGMapAddress + 1], a
+
+ ld a, [hBGMapMode]
+ push af
+ cp 3
+ call z, .Tiles
+ pop af
+ cp 4
+ call z, .Attr
+
+ pop hl
+ ld a, l
+ ld [hBGMapAddress], a
+ ld a, h
+ ld [hBGMapAddress + 1], a
+ ret
+
+
+.Attr
+ ld a, 1
+ ld [rVBK], a
+
+ ld hl, AttrMap
+ call .update
+
+ ld a, 0
+ ld [rVBK], a
+ ret
+
+
+.Tiles
+ ld hl, TileMap
+
+
+.update
+ ld [hSPBuffer], sp
+
+; Which third?
+ ld a, [hBGMapThird]
+ and a ; 0
+ jr z, .top
+ dec a ; 1
+ jr z, .middle
+ ; 2
+
+
+THIRD_HEIGHT EQU SCREEN_HEIGHT / 3
+
+
+.bottom
+ ld de, 2 * THIRD_HEIGHT * SCREEN_WIDTH
+ add hl, de
+ ld sp, hl
+
+ ld a, [hBGMapAddress + 1]
+ ld h, a
+ ld a, [hBGMapAddress]
+ ld l, a
+
+ ld de, 2 * THIRD_HEIGHT * BG_MAP_WIDTH
+ add hl, de
+
+; Next time: top third
+ xor a
+ jr .start
+
+
+.middle
+ ld de, THIRD_HEIGHT * SCREEN_WIDTH
+ add hl, de
+ ld sp, hl
+
+ ld a, [hBGMapAddress + 1]
+ ld h, a
+ ld a, [hBGMapAddress]
+ ld l, a
+
+ ld de, THIRD_HEIGHT * BG_MAP_WIDTH
+ add hl, de
+
+; Next time: bottom third
+ ld a, 2
+ jr .start
+
+
+.top
+ ld sp, hl
+
+ ld a, [hBGMapAddress + 1]
+ ld h, a
+ ld a, [hBGMapAddress]
+ ld l, a
+
+; Next time: middle third
+ ld a, 1
+
+
+.start
+; Which third to update next time
+ ld [hBGMapThird], a
+
+; Rows of tiles in a third
+ ld a, SCREEN_HEIGHT / 3
+
+; Discrepancy between TileMap and BGMap
+ ld bc, BG_MAP_WIDTH - (SCREEN_WIDTH - 1)
+
+
+.row
+; Copy a row of 20 tiles
+rept SCREEN_WIDTH / 2 - 1
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+endr
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+
+ add hl, bc
+ dec a
+ jr nz, .row
+
+
+ ld a, [hSPBuffer]
+ ld l, a
+ ld a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+ ret
+; 170a
+
+
+Serve1bppRequest: ; 170a
+; Only call during the first fifth of VBlank
+
+ ld a, [Requested1bpp]
+ and a
+ ret z
+
+; Back out if we're too far into VBlank
+ ld a, [rLY]
+ cp 144
+ ret c
+ cp 146
+ ret nc
+
+; Copy [Requested1bpp] 1bpp tiles from [Requested1bppSource] to [Requested1bppDest]
+
+ ld [hSPBuffer], sp
+
+; Source
+ ld hl, Requested1bppSource
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld sp, hl
+
+; Destination
+ ld hl, Requested1bppDest
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+; # tiles to copy
+ ld a, [Requested1bpp]
+ ld b, a
+
+ xor a
+ ld [Requested1bpp], a
+
+.next
+
+rept 3
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ ld [hl], d
+ inc l
+endr
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ ld [hl], d
+
+ inc hl
+ dec b
+ jr nz, .next
+
+
+ ld a, l
+ ld [Requested1bppDest], a
+ ld a, h
+ ld [Requested1bppDest + 1], a
+
+ ld [Requested1bppSource], sp
+
+ ld a, [hSPBuffer]
+ ld l, a
+ ld a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+ ret
+; 1769
+
+
+Serve2bppRequest: ; 1769
+; Only call during the first fifth of VBlank
+
+ ld a, [Requested2bpp]
+ and a
+ ret z
+
+; Back out if we're too far into VBlank
+ ld a, [rLY]
+ cp 144
+ ret c
+ cp 146
+ ret nc
+ jr _Serve2bppRequest
+
+
+Serve2bppRequest@VBlank: ; 1778
+
+ ld a, [Requested2bpp]
+ and a
+ ret z
+
+_Serve2bppRequest: ; 177d
+; Copy [Requested2bpp] 2bpp tiles from [Requested2bppSource] to [Requested2bppDest]
+
+ ld [hSPBuffer], sp
+
+; Source
+ ld hl, Requested2bppSource
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld sp, hl
+
+; Destination
+ ld hl, Requested2bppDest
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+; # tiles to copy
+ ld a, [Requested2bpp]
+ ld b, a
+
+ xor a
+ ld [Requested2bpp], a
+
+.next
+
+rept 7
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+endr
+ pop de
+ ld [hl], e
+ inc l
+ ld [hl], d
+
+ inc hl
+ dec b
+ jr nz, .next
+
+
+ ld a, l
+ ld [Requested2bppDest], a
+ ld a, h
+ ld [Requested2bppDest + 1], a
+
+ ld [Requested2bppSource], sp
+
+ ld a, [hSPBuffer]
+ ld l, a
+ ld a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+ ret
+; 17d3
+
+
+AnimateTileset: ; 17d3
+; Only call during the first fifth of VBlank
+
+ ld a, [$ffde]
+ and a
+ ret z
+
+; Back out if we're too far into VBlank
+ ld a, [rLY]
+ cp 144
+ ret c
+ cp 151
+ ret nc
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_AnimateTileset)
+ rst Bankswitch
+
+ ld a, [rSVBK]
+ push af
+ ld a, 1
+ ld [rSVBK], a
+
+ ld a, [rVBK]
+ push af
+ ld a, 0
+ ld [rVBK], a
+
+ call _AnimateTileset
+
+ pop af
+ ld [rVBK], a
+ pop af
+ ld [rSVBK], a
+ pop af
+ rst Bankswitch
+ ret
+; 17ff
+
--- a/main.asm
+++ b/main.asm
@@ -54,493 +54,7 @@
INCLUDE "engine/palettes.asm"
INCLUDE "engine/copy.asm"
INCLUDE "engine/text.asm"
-
-
-DMATransfer: ; 15d8
-; Return carry if the transfer is completed.
-
- ld a, [hDMATransfer]
- and a
- ret z
-
-; Start transfer
- ld [rHDMA5], a
-
-; Execution is halted until the transfer is complete.
-
- xor a
- ld [hDMATransfer], a
- scf
- ret
-; 15e3
-
-
-UpdateBGMapBuffer: ; 15e3
-; Copy [$ffdc] 16x8 tiles from BGMapBuffer
-; to bg map addresses in BGMapBufferPtrs.
-
-; [$ffdc] must be even since this is done in pairs.
-
-; Return carry on success.
-
- ld a, [hBGMapUpdate]
- and a
- ret z
-
- ld a, [rVBK]
- push af
- ld [hSPBuffer], sp
-
- ld hl, BGMapBufferPtrs
- ld sp, hl
-
-; We can now pop the addresses of affected spots on the BG Map
-
- ld hl, BGMapPalBuffer
- ld de, BGMapBuffer
-
-
-.next
-; Copy a pair of 16x8 blocks (one 16x16 block)
-
-rept 2
-; Get our BG Map address
- pop bc
-
-; Palettes
- ld a, 1
- ld [rVBK], a
-
- ld a, [hli]
- ld [bc], a
- inc c
- ld a, [hli]
- ld [bc], a
- dec c
-
-; Tiles
- ld a, 0
- ld [rVBK], a
-
- ld a, [de]
- inc de
- ld [bc], a
- inc c
- ld a, [de]
- inc de
- ld [bc], a
-endr
-
-; We've done 2 16x8 blocks
- ld a, [$ffdc]
- dec a
- dec a
- ld [$ffdc], a
-
- jr nz, .next
-
-
- ld a, [hSPBuffer]
- ld l, a
- ld a, [hSPBuffer + 1]
- ld h, a
- ld sp, hl
-
- pop af
- ld [rVBK], a
-
- xor a
- ld [hBGMapUpdate], a
- scf
- ret
-; 163a
-
-
-WaitTop: ; 163a
-; Wait until the top third of the BG Map is being updated.
-
- ld a, [hBGMapMode]
- and a
- ret z
-
- ld a, [hBGMapThird]
- and a
- jr z, .done
-
- call DelayFrame
- jr WaitTop
-
-.done
- xor a
- ld [hBGMapMode], a
- ret
-; 164c
-
-
-UpdateBGMap: ; 164c
-; Update the BG Map, in thirds, from TileMap and AttrMap.
-
- ld a, [hBGMapMode]
- and a
- ret z
-
-; BG Map 0
- dec a ; 1
- jr z, .Tiles
- dec a ; 2
- jr z, .Attr
-
-; BG Map 1
- dec a
-
- ld a, [hBGMapAddress]
- ld l, a
- ld a, [hBGMapAddress + 1]
- ld h, a
- push hl
-
- xor a
- ld [hBGMapAddress], a
- ld a, VBGMap1 >> 8
- ld [hBGMapAddress + 1], a
-
- ld a, [hBGMapMode]
- push af
- cp 3
- call z, .Tiles
- pop af
- cp 4
- call z, .Attr
-
- pop hl
- ld a, l
- ld [hBGMapAddress], a
- ld a, h
- ld [hBGMapAddress + 1], a
- ret
-
-
-.Attr
- ld a, 1
- ld [rVBK], a
-
- ld hl, AttrMap
- call .update
-
- ld a, 0
- ld [rVBK], a
- ret
-
-
-.Tiles
- ld hl, TileMap
-
-
-.update
- ld [hSPBuffer], sp
-
-; Which third?
- ld a, [hBGMapThird]
- and a ; 0
- jr z, .top
- dec a ; 1
- jr z, .middle
- ; 2
-
-
-THIRD_HEIGHT EQU SCREEN_HEIGHT / 3
-
-
-.bottom
- ld de, 2 * THIRD_HEIGHT * SCREEN_WIDTH
- add hl, de
- ld sp, hl
-
- ld a, [hBGMapAddress + 1]
- ld h, a
- ld a, [hBGMapAddress]
- ld l, a
-
- ld de, 2 * THIRD_HEIGHT * BG_MAP_WIDTH
- add hl, de
-
-; Next time: top third
- xor a
- jr .start
-
-
-.middle
- ld de, THIRD_HEIGHT * SCREEN_WIDTH
- add hl, de
- ld sp, hl
-
- ld a, [hBGMapAddress + 1]
- ld h, a
- ld a, [hBGMapAddress]
- ld l, a
-
- ld de, THIRD_HEIGHT * BG_MAP_WIDTH
- add hl, de
-
-; Next time: bottom third
- ld a, 2
- jr .start
-
-
-.top
- ld sp, hl
-
- ld a, [hBGMapAddress + 1]
- ld h, a
- ld a, [hBGMapAddress]
- ld l, a
-
-; Next time: middle third
- ld a, 1
-
-
-.start
-; Which third to update next time
- ld [hBGMapThird], a
-
-; Rows of tiles in a third
- ld a, SCREEN_HEIGHT / 3
-
-; Discrepancy between TileMap and BGMap
- ld bc, BG_MAP_WIDTH - (SCREEN_WIDTH - 1)
-
-
-.row
-; Copy a row of 20 tiles
-rept SCREEN_WIDTH / 2 - 1
- pop de
- ld [hl], e
- inc l
- ld [hl], d
- inc l
-endr
- pop de
- ld [hl], e
- inc l
- ld [hl], d
-
- add hl, bc
- dec a
- jr nz, .row
-
-
- ld a, [hSPBuffer]
- ld l, a
- ld a, [hSPBuffer + 1]
- ld h, a
- ld sp, hl
- ret
-; 170a
-
-
-Serve1bppRequest: ; 170a
-; Only call during the first fifth of VBlank
-
- ld a, [Requested1bpp]
- and a
- ret z
-
-; Back out if we're too far into VBlank
- ld a, [rLY]
- cp 144
- ret c
- cp 146
- ret nc
-
-; Copy [Requested1bpp] 1bpp tiles from [Requested1bppSource] to [Requested1bppDest]
-
- ld [hSPBuffer], sp
-
-; Source
- ld hl, Requested1bppSource
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld sp, hl
-
-; Destination
- ld hl, Requested1bppDest
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
-; # tiles to copy
- ld a, [Requested1bpp]
- ld b, a
-
- xor a
- ld [Requested1bpp], a
-
-.next
-
-rept 3
- pop de
- ld [hl], e
- inc l
- ld [hl], e
- inc l
- ld [hl], d
- inc l
- ld [hl], d
- inc l
-endr
- pop de
- ld [hl], e
- inc l
- ld [hl], e
- inc l
- ld [hl], d
- inc l
- ld [hl], d
-
- inc hl
- dec b
- jr nz, .next
-
-
- ld a, l
- ld [Requested1bppDest], a
- ld a, h
- ld [Requested1bppDest + 1], a
-
- ld [Requested1bppSource], sp
-
- ld a, [hSPBuffer]
- ld l, a
- ld a, [hSPBuffer + 1]
- ld h, a
- ld sp, hl
- ret
-; 1769
-
-
-Serve2bppRequest: ; 1769
-; Only call during the first fifth of VBlank
-
- ld a, [Requested2bpp]
- and a
- ret z
-
-; Back out if we're too far into VBlank
- ld a, [rLY]
- cp 144
- ret c
- cp 146
- ret nc
- jr _Serve2bppRequest
-
-
-Serve2bppRequest@VBlank: ; 1778
-
- ld a, [Requested2bpp]
- and a
- ret z
-
-_Serve2bppRequest: ; 177d
-; Copy [Requested2bpp] 2bpp tiles from [Requested2bppSource] to [Requested2bppDest]
-
- ld [hSPBuffer], sp
-
-; Source
- ld hl, Requested2bppSource
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld sp, hl
-
-; Destination
- ld hl, Requested2bppDest
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
-; # tiles to copy
- ld a, [Requested2bpp]
- ld b, a
-
- xor a
- ld [Requested2bpp], a
-
-.next
-
-rept 7
- pop de
- ld [hl], e
- inc l
- ld [hl], d
- inc l
-endr
- pop de
- ld [hl], e
- inc l
- ld [hl], d
-
- inc hl
- dec b
- jr nz, .next
-
-
- ld a, l
- ld [Requested2bppDest], a
- ld a, h
- ld [Requested2bppDest + 1], a
-
- ld [Requested2bppSource], sp
-
- ld a, [hSPBuffer]
- ld l, a
- ld a, [hSPBuffer + 1]
- ld h, a
- ld sp, hl
- ret
-; 17d3
-
-
-AnimateTileset: ; 17d3
-; Only call during the first fifth of VBlank
-
- ld a, [$ffde]
- and a
- ret z
-
-; Back out if we're too far into VBlank
- ld a, [rLY]
- cp 144
- ret c
- cp 151
- ret nc
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_AnimateTileset)
- rst Bankswitch
-
- ld a, [rSVBK]
- push af
- ld a, 1
- ld [rSVBK], a
-
- ld a, [rVBK]
- push af
- ld a, 0
- ld [rVBK], a
-
- call _AnimateTileset
-
- pop af
- ld [rVBK], a
- pop af
- ld [rSVBK], a
- pop af
- rst Bankswitch
- ret
-; 17ff
-
+INCLUDE "engine/video.asm"
GetSpritePalette: ; 17ff
push hl