summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.asm362
1 files changed, 163 insertions, 199 deletions
diff --git a/main.asm b/main.asm
index 077205a37..2fc1490dc 100644
--- a/main.asm
+++ b/main.asm
@@ -141,153 +141,120 @@ INCLUDE "engine/text.asm"
DMATransfer: ; 15d8
-; DMA transfer
-; return carry if successful
+; Return carry if the transfer is completed.
-; anything to transfer?
ld a, [hDMATransfer]
and a
ret z
-; start transfer
+
+; Start transfer
ld [rHDMA5], a
-; indicate that transfer has occurred
+
+; Execution is halted until the transfer is complete.
+
xor a
ld [hDMATransfer], a
-; successful transfer
scf
ret
; 15e3
UpdateBGMapBuffer: ; 15e3
-; write [$ffdc] 16x8 tiles from BGMapBuffer to bg map addresses in BGMapBufferPtrs
-; [$ffdc] must be even since this is done in 16x16 blocks
+; Copy [$ffdc] 16x8 tiles from BGMapBuffer
+; to bg map addresses in BGMapBufferPtrs.
+
+; [$ffdc] must be even since this is done in pairs.
-; return carry if successful
+; Return carry on success.
-; any tiles to update?
ld a, [hBGMapUpdate]
and a
ret z
-; save wram bank
+
ld a, [rVBK]
push af
-; save sp
ld [hSPBuffer], sp
-
-; temp stack
+
ld hl, BGMapBufferPtrs
ld sp, hl
-; we can now pop the addresses of affected spots in bg map
-
-; get pal and tile buffers
+
+; We can now pop the addresses of affected spots on the BG Map
+
ld hl, BGMapPalBuffer
ld de, BGMapBuffer
-.loop
-; draw one 16x16 block
-; top half:
+.next
+; Copy a pair of 16x8 blocks (one 16x16 block)
-; get bg map address
+rept 2
+; Get our BG Map address
pop bc
-; update palettes
- ld a, $1
- ld [rVBK], a
-; tile 1
- ld a, [hli]
- ld [bc], a
- inc c
-; tile 2
- ld a, [hli]
- ld [bc], a
- dec c
-; update tiles
- ld a, $0
- ld [rVBK], a
-; tile 1
- ld a, [de]
- inc de
- ld [bc], a
- inc c
-; tile 2
- ld a, [de]
- inc de
- ld [bc], a
-
-; bottom half:
-; get bg map address
- pop bc
-; update palettes
- ld a, $1
+; Palettes
+ ld a, 1
ld [rVBK], a
-; tile 1
+
ld a, [hli]
ld [bc], a
inc c
-; tile 2
ld a, [hli]
ld [bc], a
dec c
-; update tiles
- ld a, $0
+
+; Tiles
+ ld a, 0
ld [rVBK], a
-; tile 1
+
ld a, [de]
inc de
ld [bc], a
inc c
-; tile 2
ld a, [de]
inc de
ld [bc], a
-
-; we've done 2 16x8 blocks
+endr
+
+; We've done 2 16x8 blocks
ld a, [$ffdc]
dec a
dec a
ld [$ffdc], a
-
-; if there are more left, get the next 16x16 block
- jr nz, .loop
-
-
-; restore sp
+
+ jr nz, .next
+
+
ld a, [hSPBuffer]
ld l, a
- ld a, [$ffda]
+ ld a, [hSPBuffer + 1]
ld h, a
ld sp, hl
-
-; restore vram bank
+
pop af
ld [rVBK], a
-
-; we don't need to update bg map until new tiles are loaded
+
xor a
ld [hBGMapUpdate], a
-
-; successfully updated bg map
scf
ret
; 163a
WaitTop: ; 163a
+; Wait until the top third of the BG Map is being updated.
+
ld a, [hBGMapMode]
and a
ret z
-
-; wait until top third of bg map can be updated
+
ld a, [hBGMapThird]
and a
- jr z, .quit
-
+ jr z, .done
+
call DelayFrame
jr WaitTop
-
-.quit
+
+.done
xor a
ld [hBGMapMode], a
ret
@@ -295,133 +262,141 @@ WaitTop: ; 163a
UpdateBGMap: ; 164c
-; get mode
+; Update the BG Map, in thirds, from TileMap and AttrMap.
+
ld a, [hBGMapMode]
and a
ret z
-
-; don't save bg map address
+
+; BG Map 0
dec a ; 1
- jr z, .tiles
+ jr z, .Tiles
dec a ; 2
- jr z, .attr
- dec a ; ?
-
-; save bg map address
+ jr z, .Attr
+
+; BG Map 1
+ dec a
+
ld a, [hBGMapAddress]
ld l, a
- ld a, [$ffd7]
+ ld a, [hBGMapAddress + 1]
ld h, a
push hl
-; bg map 1 (VBGMap1)
xor a
ld [hBGMapAddress], a
- ld a, $9c
- ld [$ffd7], a
-
-; get mode again
+ ld a, VBGMap1 >> 8
+ ld [hBGMapAddress + 1], a
+
ld a, [hBGMapMode]
push af
cp 3
- call z, .tiles
+ call z, .Tiles
pop af
cp 4
- call z, .attr
-
-; restore bg map address
+ call z, .Attr
+
pop hl
ld a, l
ld [hBGMapAddress], a
ld a, h
- ld [$ffd7], a
+ ld [hBGMapAddress + 1], a
ret
-
-.attr
-; switch vram banks
+
+
+.Attr
ld a, 1
ld [rVBK], a
-; bg map 1
+
ld hl, AttrMap
- call .getthird
-; restore vram bank
+ call .update
+
ld a, 0
ld [rVBK], a
ret
-
-.tiles
-; bg map 0
+
+
+.Tiles
ld hl, TileMap
-
-.getthird
-; save sp
+
+
+.update
ld [hSPBuffer], sp
-; # tiles to move down * 6 (which third?)
+; Which third?
ld a, [hBGMapThird]
and a ; 0
jr z, .top
dec a ; 1
jr z, .middle
+ ; 2
-; .bottom ; 2
-; move 12 tiles down
- ld de, $00f0 ; TileMap(0,12) - TileMap
+
+THIRD_HEIGHT EQU SCREEN_HEIGHT / 3
+
+
+.bottom
+ ld de, 2 * THIRD_HEIGHT * SCREEN_WIDTH
add hl, de
-; stack now points to source
ld sp, hl
-; get bg map address
- ld a, [$ffd7]
+
+ ld a, [hBGMapAddress + 1]
ld h, a
ld a, [hBGMapAddress]
ld l, a
-; move 12 tiles down
- ld de, $0180 ; bgm(0,12)
+
+ ld de, 2 * THIRD_HEIGHT * BG_MAP_WIDTH
add hl, de
-; start at top next time
+
+; Next time: top third
xor a
jr .start
-
+
+
.middle
-; move 6 tiles down
- ld de, $0078 ; TileMap(0,6) - TileMap
+ ld de, THIRD_HEIGHT * SCREEN_WIDTH
add hl, de
-; stack now points to source
ld sp, hl
-; get bg map address
- ld a, [$ffd7]
+
+ ld a, [hBGMapAddress + 1]
ld h, a
ld a, [hBGMapAddress]
ld l, a
-; move 6 tiles down
- ld de, $00c0 ; bgm(0,6)
+
+ ld de, THIRD_HEIGHT * BG_MAP_WIDTH
add hl, de
-; start at bottom next time
+
+; Next time: bottom third
ld a, 2
jr .start
-
+
+
.top
-; stack now points to source
ld sp, hl
-; get bg map address
- ld a, [$ffd7]
+
+ ld a, [hBGMapAddress + 1]
ld h, a
ld a, [hBGMapAddress]
ld l, a
-; start at middle next time
+
+; Next time: middle third
ld a, 1
-
+
+
.start
-; which third to draw next update
+; Which third to update next time
ld [hBGMapThird], a
-; # rows per third
- ld a, 6 ; SCREEN_HEIGHT / 3
-; # tiles from the edge of the screen to the next row
- ld bc, $000d ; BG_WIDTH + 1 - SCREEN_WIDTH
-
+
+; 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
-; write a row of 20 tiles
-rept 9
+; Copy a row of 20 tiles
+rept SCREEN_WIDTH / 2 - 1
pop de
ld [hl], e
inc l
@@ -432,16 +407,15 @@ endr
ld [hl], e
inc l
ld [hl], d
-; next row
+
add hl, bc
-; done?
dec a
jr nz, .row
-
-; restore sp
+
+
ld a, [hSPBuffer]
ld l, a
- ld a, [$ffda]
+ ld a, [hSPBuffer + 1]
ld h, a
ld sp, hl
ret
@@ -449,47 +423,45 @@ endr
SafeLoadTiles2: ; 170a
-; only execute during first fifth of vblank
-; any tiles to draw?
+; Only call during the first fifth of VBlank
+
ld a, [$cf6c]
and a
ret z
-; abort if too far into vblank
+
+; Back out if we're too far into VBlank
ld a, [rLY]
-; ly = 144-145?
cp 144
ret c
cp 146
ret nc
-
+
GetTiles2: ; 1717
-; load [$cf6c] tiles from [$cf6d-e] to [$cf6f-70]
-; save sp
+; Copy [$cf6c] 1bpp tiles from [$cf6d-e] to [$cf6f-70]
+
ld [hSPBuffer], sp
-
-; sp = [$cf6d-e] tile source
+
+; Source
ld hl, $cf6d
ld a, [hli]
ld h, [hl]
ld l, a
ld sp, hl
-; hl = [$cf6f-70] tile dest
+; Destination
ld hl, $cf6f
ld a, [hli]
ld h, [hl]
ld l, a
-; # tiles to draw
+; # tiles to copy
ld a, [$cf6c]
ld b, a
-
-; clear tile queue
+
xor a
ld [$cf6c], a
-
-.loop
-; put 1 tile (16 bytes) into hl from sp
+
+.next
rept 3
pop de
@@ -510,25 +482,22 @@ endr
ld [hl], d
inc l
ld [hl], d
-; next tile
+
inc hl
-; done?
dec b
- jr nz, .loop
-
-; update $cf6f-70
+ jr nz, .next
+
+
ld a, l
ld [$cf6f], a
ld a, h
ld [$cf70], a
-
-; update $cf6d-e
+
ld [$cf6d], sp
-
-; restore sp
+
ld a, [hSPBuffer]
ld l, a
- ld a, [$ffda]
+ ld a, [hSPBuffer + 1]
ld h, a
ld sp, hl
ret
@@ -536,56 +505,54 @@ endr
SafeLoadTiles: ; 1769
-; only execute during first fifth of vblank
-; any tiles to draw?
+; Only call during the first fifth of VBlank
+
ld a, [$cf67]
and a
ret z
-; abort if too far into vblank
+
+; Back out if we're too far into VBlank
ld a, [rLY]
-; ly = 144-145?
cp 144
ret c
cp 146
ret nc
jr GetTiles
-
+
+
LoadTiles: ; 1778
-; use only if time is allotted
-; any tiles to draw?
+
ld a, [$cf67]
and a
ret z
-; get tiles
-
+
GetTiles: ; 177d
-; load [$cf67] tiles from [$cf68-9] to [$cf6a-b]
+; Copy [$cf67] 2bpp tiles from [$cf68-9] to [$cf6a-b]
-; save sp
ld [hSPBuffer], sp
-; sp = [$cf68-9] tile source
+; Source
ld hl, $cf68
ld a, [hli]
ld h, [hl]
ld l, a
ld sp, hl
-; hl = [$cf6a-b] tile dest
+; Destination
ld hl, $cf6a
ld a, [hli]
ld h, [hl]
ld l, a
-; # tiles to draw
+; # tiles to copy
ld a, [$cf67]
ld b, a
-; clear tile queue
+
xor a
ld [$cf67], a
-.loop
-; put 1 tile (16 bytes) into hl from sp
+.next
+
rept 7
pop de
ld [hl], e
@@ -597,25 +564,22 @@ endr
ld [hl], e
inc l
ld [hl], d
-; next tile
+
inc hl
-; done?
dec b
- jr nz, .loop
-
-; update $cf6a-b
+ jr nz, .next
+
+
ld a, l
ld [$cf6a], a
ld a, h
ld [$cf6b], a
-
-; update $cf68-9
+
ld [$cf68], sp
-
-; restore sp
+
ld a, [hSPBuffer]
ld l, a
- ld a, [$ffda]
+ ld a, [hSPBuffer + 1]
ld h, a
ld sp, hl
ret