diff options
Diffstat (limited to 'main.asm')
-rwxr-xr-x | main.asm | 180 |
1 files changed, 2 insertions, 178 deletions
@@ -139,184 +139,8 @@ UnusedNames: ; 4a92 (1:4a92) db "マスター@" db "エクセレント" -; calculates the OAM data for all currently visible sprites and writes it to wOAMBuffer -PrepareOAMData: ; 4b0f (1:4b0f) - ld a, [$cfcb] - dec a - jr z, .asm_4b1e - cp $ff - ret nz - ld [$cfcb], a - jp HideSprites -.asm_4b1e - xor a - ld [$ff90], a -.asm_4b21 - ld [$ff8f], a - ld d, $c1 - ld a, [$ff8f] - ld e, a - ld a, [de] ; c1x0 - and a - jp z, .asm_4bad - inc e - inc e - ld a, [de] ; c1x2 read combined orientation and animation info - ld [$d5cd], a - cp $ff - jr nz, .spriteVisible ; $ff -> offscreen, don't draw - call Func_4bd1 - jr .asm_4bad -.spriteVisible - cp $a0 - jr c, .considerOrientation ; if >= $a0, ignore the sprite orientation and animation (by using a different conversion table) - and $f - add $10 - jr .asm_4b48 -.considerOrientation - and $f ; the lower nybble contains orientation and animation info -.asm_4b48 - ld l, a - push de - inc d - ld a, e - add $5 - ld e, a - ld a, [de] ; c2x7 - and $80 - ld [$ff94], a ; temp store bit 7 for later use in OAM flags (draws sprite behind background (used for grass)) - pop de - ld h, $0 - ld bc, SpriteFacingAndAnimationTable - add hl, hl - add hl, hl - add hl, bc ; skip to the table location determined by orientation and animation - ld a, [hli] - ld c, a - ld a, [hli] - ld b, a - ld a, [hli] - ld h, [hl] - ld l, a - call Func_4bd1 - ld a, [$ff90] - ld e, a - ld d, $c3 ; wOAMBuffer+x is buffer for OAM data -.spriteTilesLoop ; loops 4 times for the 4 tiles a sprite consists of - ld a, [$ff92] ; temp for sprite Y position - add $10 ; Y=16 is top of screen (Y=0 is invisible) - add [hl] ; add Y offset from table - ld [de], a ; write new sprite OAM Y position - inc hl - ld a, [$ff91] ; temp for sprite X position - add $8 ; X=8 is left of screen (X=0 is invisible) - add [hl] ; add X offset from table - inc e - ld [de], a ; write new sprite OAM X position - inc e - ld a, [bc] ; read pattern number offset (accomodates orientation (offset 0,4 or 8) and animation (offset 0 or $80)) - inc bc - push bc - ld b, a - ld a, [$d5cd] ; temp copy of c1x2 - swap a ; high nybble determines sprite used (0 is always player sprite, next are some npcs) - and $f - cp $b ; sprites $a and $b have no orientation or animation and therefore only 4 tiles - jr nz, .calcTileOffset ; (instead of 12), so tile b's offset is a special case - ld a, $7c ; = $a * 12 + 4 - jr .doneCalcTileOffset -.calcTileOffset - sla a - sla a - ld c, a - sla a - add c ; a *= 12 (each sprite consists of 12 tiles) -.doneCalcTileOffset - add b ; add orientation and animation offset - pop bc - ld [de], a ; write OAM sprite pattern number - inc hl - inc e - ld a, [hl] - bit 1, a ; bit 1 is ignored for OAM, it's used here as an "always in foregroud" flag. - jr z, .alwaysInForeground - ld a, [$ff94] ; load bit 7 (set to $80 if sprite is in grass and should be drawn behind it) - or [hl] -.alwaysInForeground - inc hl - ld [de], a ; write OAM sprite flags - inc e - bit 0, a ; test for OAMFLAG_ENDOFDATA - jr z, .spriteTilesLoop - ld a, e - ld [$ff90], a -.asm_4bad - ld a, [$ff8f] - add $10 - cp $0 - jp nz, .asm_4b21 - ld a, [$ff90] - ld l, a - ld h, $c3 - ld de, $4 - ld b, $a0 - ld a, [$d736] - bit 6, a - ld a, $a0 - jr z, .clearUnusedOAMEntriesLoop - ld a, $90 -.clearUnusedOAMEntriesLoop - cp l - ret z - ld [hl], b - add hl, de - jr .clearUnusedOAMEntriesLoop - -Func_4bd1: ; 4bd1 (1:4bd1) - inc e - inc e - ld a, [de] ; c1x4 - ld [$ff92], a - inc e - inc e - ld a, [de] ; c1x6 - ld [$ff91], a - ld a, $4 - add e - ld e, a - ld a, [$ff92] - add $4 - and $f0 - ld [de], a ; c1xa (sprite Y pos (snapped to whole steps (?)) - inc e - ld a, [$ff91] - and $f0 - ld [de], a ; c1xb (sprite X pos (snapped to whole steps (?)) - ret - -; copies DMA routine to HRAM. By GB specifications, all DMA needs to be done in HRAM (no other memory section is available during DMA) -WriteDMACodeToHRAM: ; 4bed (1:4bed) - ld c, $80 - ld b, $a - ld hl, DMARoutine -.copyLoop - ld a, [hli] - ld [$ff00+c], a - inc c - dec b - jr nz, .copyLoop - ret - -; this routine is copied to HRAM and executed there on every VBlank -DMARoutine: ; 4bfb (1:4bfb) - ld a, $c3 - ld [$ff46], a ; start DMA - ld a, $28 -.waitLoop ; wait for DMA to finish - dec a - jr nz, .waitLoop - ret - +INCLUDE "engine/overworld/oam.asm" +INCLUDE "engine/oam_dma.asm" PrintWaitingText: FuncCoord 3, 10 |