From 18026598758f41bf8dc11bce01fd3967ebe8fe2a Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Sun, 22 Oct 2023 21:58:02 +0200 Subject: [PATCH] These changes should vastly improve performance per frame but I am not 100% comfortable with the reliability of the code. --- DMGTRIS_EXPERIMENTAL_OPTIMIZATION.GB | Bin 0 -> 32768 bytes src/field.asm | 56 ++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 DMGTRIS_EXPERIMENTAL_OPTIMIZATION.GB diff --git a/DMGTRIS_EXPERIMENTAL_OPTIMIZATION.GB b/DMGTRIS_EXPERIMENTAL_OPTIMIZATION.GB new file mode 100644 index 0000000000000000000000000000000000000000..89ba70b2a1049fa62792c554607dee537d771115 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/src/field.asm b/src/field.asm index 65eaca3..e9f3d3b 100644 --- a/src/field.asm +++ b/src/field.asm @@ -51,10 +51,13 @@ hClearedLines: ds 4 hLineClearCt: ds 1 hComboCt: ds 1 hLockDelayForce: ds 1 +hHighestStack: ds 1 SECTION "Field Functions", ROM0 FieldInit:: + ld a, 23 + ldh [hHighestStack], a ld a, 1 ldh [hComboCt], a ld hl, wField @@ -654,6 +657,35 @@ FindMaxG: ld b, a ldh a, [hCurrentPieceX] call XYToSFieldPtr + +DEF EXPERIMENTAL_OPTIMIZATION EQU 1 +IF DEF(EXPERIMENTAL_OPTIMIZATION) + ; The stack height marker gives a lower bound to how far the piece can fall. + ldh a, [hHighestStack] + sub a, 4 + ld b, a + ld a, [hCurrentPieceY] + cp a, b + jr nc, .unoptimized ; If our piece is already past that, we can't optimize. + + ; But if we're NOT, that means we can assume a minimum fall distance! +.optimized + ld c, a + ld a, b + sub a, c + inc a + ldh [hActualG], a + dec a + ld de, 14 +: add hl, de + dec a + jr nz, :- + push hl + jr .try +ENDC + + +.unoptimized push hl ld a, 1 ldh [hActualG], a @@ -1301,10 +1333,19 @@ FieldProcess:: ldh [hWantedTile], a ldh a, [hCurrentLockDelayRemaining] cp a, 0 - jr z, .drawpiece + jr nz, :+ + + ; Check if the stack usage went up. + ldh a, [hHighestStack] + ld b, a + ldh a, [hCurrentPieceY] + cp a, b + jr nc, .drawpiece + ldh [hHighestStack], a + jr .drawpiece ; Otherwise, look it up. - call GetTileShade +: call GetTileShade .drawpiece ldh a, [hCurrentPieceY] @@ -1816,6 +1857,9 @@ ClearLines: ; If it does, increment the clearing counter, but skip this line. jr nz, .clear\@ + ldh a, [hHighestStack] + inc a + ldh [hHighestStack], a inc de inc de inc de @@ -1871,7 +1915,15 @@ ClearLines: DEF row -= 1 ENDR + ; Check if the stack marker is out of bounds. + ldh a, [hHighestStack] + cp a, 23 + jr c, .fixgarbo + ld a, 23 + ldh [hHighestStack], a + ; Make sure there's no garbage in the top de lines. +.fixgarbo ld hl, wField : xor a, a or a, d