git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

commit 3e17e9420734696f52442f043f46a7a2374cb4b3
parent c6c4a659577ec779bdfb94d43e859d4828113f8a
Author: toxa <untoxa@mail.ru>
Date:   Mon,  2 Nov 2020 22:19:48 +0300

set_*_tiles optimizations

Diffstat:
Mgbdk-lib/libc/gb/Makefile1+
Agbdk-lib/libc/gb/set_t.s32++++++++++++++++++++++++++++++++
Mgbdk-lib/libc/gb/set_xy_t.s103++++++++++++++++++++++++++++++++++---------------------------------------------
3 files changed, 77 insertions(+), 59 deletions(-)

diff --git a/gbdk-lib/libc/gb/Makefile b/gbdk-lib/libc/gb/Makefile @@ -25,6 +25,7 @@ ASSRC = cgb.s cpy_data.s drawing.s f_ibm_sh.s \ mv_spr.s \ pad_ex.s \ mode.s clock.s \ + set_t.s \ crt0.s ifeq ($(ASM),asxxxx) diff --git a/gbdk-lib/libc/gb/set_t.s b/gbdk-lib/libc/gb/set_t.s @@ -0,0 +1,32 @@ + .include "global.s" + + .globl .set_xy_tt + + ;; BANKED: checked, imperfect + .area _BASE + +_set_tiles:: + PUSH BC + + LDA HL,11(SP) ; Skip return address and registers + LD A,(HL-) ; BC = src + LD B, A + LD A,(HL-) + LD C, A + LD A,(HL-) ; DE = dst + LD D, A + LD E,(HL) + LDA HL,4(SP) ; Skip return address and registers + PUSH DE ; Store address on stack for set_xy_tt + LD A,(HL+) ; D = x + LD D, A + LD A,(HL+) ; E = y + LD E, A + LD A,(HL+) ; A = w + LD L,(HL) ; L = h + LD H,A ; H = w + + CALL .set_xy_tt + + POP BC + RET diff --git a/gbdk-lib/libc/gb/set_xy_t.s b/gbdk-lib/libc/gb/set_xy_t.s @@ -9,94 +9,79 @@ PUSH HL ; Store WH LDH A,(.LCDC) BIT 6,A - JR NZ,1$ - LD HL,#0x9800 ; HL = origin - JR .set_xy_tt -1$: - LD HL,#0x9C00 ; HL = origin - JR .set_xy_tt + JR Z,.is98 + JR .is9c ;; Set background tile table from (BC) at XY = DE of size WH = HL ;; WH >= (1,1) .set_xy_btt:: PUSH HL ; Store WH LDH A,(.LCDC) BIT 3,A - JR NZ,1$ - LD HL,#0x9800 ; HL = origin + JR NZ,.is9c +.is98: LD HL,#0x9800 JR .set_xy_tt -1$: - LD HL,#0x9C00 ; HL = origin -; JR .set_xy_tt +.is9c: + LD HL,#0x9C00 .set_xy_tt:: PUSH BC ; Store source XOR A + LD B,A OR E JR Z,2$ - LD BC,#0x20 ; One line is 20 tiles + LD C,#0x20 ; One line is 20 tiles + SRL E + JR NC,0$ + ADD HL,BC +0$: + JR Z,2$ + SLA C 1$: - ADD HL,BC ; Y coordinate + ADD HL,BC DEC E JR NZ,1$ 2$: - LD B,#0x00 ; X coordinate LD C,D - ADD HL,BC + ADD HL,BC ; HL = HL + 0x20 * Y + X POP BC ; BC = source POP DE ; DE = WH - PUSH HL ; Store origin PUSH DE ; Store WH -3$: - LDH A,(.STAT) - AND #0x02 - JR NZ,3$ - LD A,(BC) ; Copy W tiles +3$: ; Copy W tiles + SRL D + JR NC,4$ + + WAIT_STAT + LD A,(BC) + LD (HL+),A + INC BC +4$: + XOR A + OR D + JR Z, 6$ +5$: + WAIT_STAT + LD A,(BC) + LD (HL+),A + INC BC + LD A,(BC) LD (HL+),A INC BC DEC D - JR NZ,3$ - POP HL ; HL = WH - LD D,H ; Restore D = W - POP HL ; HL = origin + JR NZ,5$ +6$: + POP AF + LD D,A ; Restore D = W + DEC E - JR Z,4$ - PUSH BC ; Next line - LD BC,#0x20 ; One line is 20 tiles - ADD HL,BC - POP BC + RET Z + + LD A,#0x20 + SUB D + ADD_A_REG16 H,L - PUSH HL ; Store current origin PUSH DE ; Store WH JR 3$ -4$: - RET - -_set_tiles:: - PUSH BC - - LDA HL,11(SP) ; Skip return address and registers - LD A,(HL-) ; BC = src - LD B, A - LD A,(HL-) - LD C, A - LD A,(HL-) ; DE = dst - LD D, A - LD E,(HL) - LDA HL,4(SP) ; Skip return address and registers - PUSH DE ; Store address on stack for set_xy_tt - LD A,(HL+) ; D = x - LD D, A - LD A,(HL+) ; E = y - LD E, A - LD A,(HL+) ; A = w - LD L,(HL) ; L = h - LD H,A ; H = w - - CALL .set_xy_tt - - POP BC - RET

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.