git.y1.nz

gbdk-2020

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

commit b788195f08410aa5aa576d49ae3d934c2f2c879e
parent 753df8b376d85908bc9d9a0bcedbbf37a2f67613
Author: toxa <untoxa@mail.ru>
Date:   Tue,  3 Nov 2020 20:17:47 +0300

wrapping of set_*_tiles(), get_*_tiles(), fill_*_rect() around the bounds of the tilemap VRAM

Diffstat:
Mgbdk-lib/libc/gb/Makefile2+-
Agbdk-lib/libc/gb/backup/get_xy_t.s75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mgbdk-lib/libc/gb/fill_rect.s92+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Agbdk-lib/libc/gb/get_t.s30++++++++++++++++++++++++++++++
Mgbdk-lib/libc/gb/get_xy_t.s126+++++++++++++++++++++++++++++++++++--------------------------------------------
Mgbdk-lib/libc/gb/global.s15++++++++-------
Mgbdk-lib/libc/gb/set_xy_t.s89++++++++++++++++++++++++++++++++++++++++---------------------------------------
7 files changed, 270 insertions(+), 159 deletions(-)

diff --git a/gbdk-lib/libc/gb/Makefile b/gbdk-lib/libc/gb/Makefile @@ -25,7 +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 init_vram.s \ + get_t.s set_t.s init_vram.s \ fill_rect.s fill_rect_bk.s fill_rect_wi.s \ crt0.s diff --git a/gbdk-lib/libc/gb/backup/get_xy_t.s b/gbdk-lib/libc/gb/backup/get_xy_t.s @@ -0,0 +1,75 @@ + .include "global.s" + + ;; BANKED: checked + .area _BASE + + ;; Store window tile table into (BC) at xy = DE of size WH = HL + ;; WH >= (1,1) +.get_xy_wtt:: + PUSH HL ; Store WH + PUSH HL ; Store WH + LDH A,(.LCDC) + BIT 6,A + JR NZ,1$ + LD HL,#0x9800 ; HL = origin + JR .get_xy_tt +1$: + LD HL,#0x9C00 ; HL = origin + JR .get_xy_tt + ;; Store background tile table into (BC) at XY = DE of size WH = HL + ;; WH >= (1,1) +.get_xy_btt:: + PUSH HL ; Store WH + LDH A,(.LCDC) + BIT 3,A + JR NZ,1$ + LD HL,#0x9800 ; HL = origin + JR .get_xy_tt +1$: + LD HL,#0x9C00 ; HL = origin +; JR .get_xy_tt + +.get_xy_tt:: + PUSH BC ; Store source + XOR A + OR E + JR Z,2$ + + LD BC,#0x20 ; One line is 20 tiles +1$: + ADD HL,BC ; Y coordinate + DEC E + JR NZ,1$ +2$: + LD B,#0x00 ; X coordinate + LD C,D + ADD HL,BC + + POP BC ; BC = source + POP DE ; DE = WH + PUSH HL ; Store origin + PUSH DE ; Store WH +3$: + WAIT_STAT + + LD A,(HL+) ; Copy W tiles + LD (BC),A + INC BC + DEC D + JR NZ,3$ + POP HL ; HL = WH + LD D,H ; Restore D = W + POP HL ; HL = origin + DEC E + JR Z,4$ + + PUSH BC ; Next line + LD BC,#0x20 ; One line is 20 tiles + ADD HL,BC + POP BC + + PUSH HL ; Store current origin + PUSH DE ; Store WH + JR 3$ +4$: + RET diff --git a/gbdk-lib/libc/gb/fill_rect.s b/gbdk-lib/libc/gb/fill_rect.s @@ -20,47 +20,66 @@ .is9c: LD HL,#0x9C00 ; HL = origin - ;; fills rect from HL; HW: stack; Fill: B + ;; fills rectangle area with tile B at XY = DE, size WH on stack, to vram from address (HL) .fill_rect: - XOR A + PUSH BC ; Store source + + SWAP E + RLC E + LD A,E + AND #0x03 + ADD H + LD B,A + LD A,#0xE0 + AND E + ADD D + LD C,A ; dest BC = HL + 0x20 * Y + X + + POP HL ; H = Tile + POP DE ; DE = WH + PUSH DE ; store WH + PUSH BC ; store dest + +3$: ; Copy W tiles + + WAIT_STAT + LD A, H + LD (BC), A + + LD A, C ; inc dest and wrap around + AND #0xE0 + LD E, A + LD A, C + INC A + AND #0x1F OR E - LD A, B ; save tile in A - LD B, #0 - JR Z,2$ + LD C, A - 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 - DEC E - JR NZ,1$ -2$: - LD C,D - ADD HL,BC ; HL = HL + 0x20 * Y + X + DEC D + JR NZ, 3$ - POP BC ; load height and width - LD D, #0 - LD E, B - LD B, A ; restore tile to B + POP BC + POP DE + + DEC E + RET Z - INC C - JR 4$ -3$: PUSH DE - PUSH HL - CALL .init_vram - POP HL - POP DE - LD A, #0x20 ; next row - ADD_A_REG16 H, L -4$: - DEC C - JR NZ, 3$ + LD A, B ; next row and wrap around + AND #0xF8 + LD E, A + + LD A,#0x20 + + ADD A, C + LD C, A + ADC A, B + SUB C + AND #0x03 + OR E + LD B, A - RET - + PUSH BC + + JR 3$ diff --git a/gbdk-lib/libc/gb/get_t.s b/gbdk-lib/libc/gb/get_t.s @@ -0,0 +1,30 @@ + .include "global.s" + + ;; BANKED: checked + .area _BASE + +_get_tiles:: + PUSH BC + + LDA HL,11(SP) ; Skip return address and registers + LD A,(HL-) ; DE = src + LD D, A + LD A,(HL-) + LD E, A + LD A,(HL-) ; BC = dst + LD B, A + LD C,(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 .get_xy_tt + + POP BC + RET diff --git a/gbdk-lib/libc/gb/get_xy_t.s b/gbdk-lib/libc/gb/get_xy_t.s @@ -4,98 +4,84 @@ .area _BASE ;; Store window tile table into (BC) at xy = DE of size WH = HL - ;; WH >= (1,1) .get_xy_wtt:: PUSH HL ; Store WH - PUSH HL ; Store WH LDH A,(.LCDC) BIT 6,A - JR NZ,1$ - LD HL,#0x9800 ; HL = origin - JR .get_xy_tt -1$: - LD HL,#0x9C00 ; HL = origin - JR .get_xy_tt + JR Z,.is98 + JR .is9c ;; Store background tile table into (BC) at XY = DE of size WH = HL - ;; WH >= (1,1) .get_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 .get_xy_tt -1$: - LD HL,#0x9C00 ; HL = origin -; JR .get_xy_tt - +.is9c: + LD HL,#0x9C00 + + ;; Store background tile table into (BC) at XY = DE, size WH on stack, from vram from address (HL) .get_xy_tt:: PUSH BC ; Store source - XOR A - OR E - JR Z,2$ - LD BC,#0x20 ; One line is 20 tiles -1$: - ADD HL,BC ; Y coordinate - DEC E - JR NZ,1$ -2$: - LD B,#0x00 ; X coordinate - LD C,D - ADD HL,BC + SWAP E + RLC E + LD A,E + AND #0x03 + ADD H + LD B,A + LD A,#0xE0 + AND E + ADD D + LD C,A ; dest BC = HL + 0x20 * Y + X - POP BC ; BC = source + POP HL ; HL = source POP DE ; DE = WH - PUSH HL ; Store origin - PUSH DE ; Store WH -3$: + PUSH DE ; store WH + PUSH BC ; store dest + +3$: ; Copy W tiles + WAIT_STAT + LD A, (BC) + LD (HL+), A + + LD A, C ; inc dest and wrap around + AND #0xE0 + LD E, A + LD A, C + INC A + AND #0x1F + OR E + LD C, A - LD A,(HL+) ; Copy W tiles - LD (BC),A - INC BC DEC D - JR NZ,3$ - POP HL ; HL = WH - LD D,H ; Restore D = W - POP HL ; HL = origin - DEC E - JR Z,4$ + JR NZ, 3$ - PUSH BC ; Next line - LD BC,#0x20 ; One line is 20 tiles - ADD HL,BC POP BC + POP DE - PUSH HL ; Store current origin - PUSH DE ; Store WH - JR 3$ -4$: - RET + DEC E + RET Z -_get_tiles:: - PUSH BC + PUSH DE - LDA HL,11(SP) ; Skip return address and registers - LD A,(HL-) ; DE = src - LD D, A - LD A,(HL-) - LD E, A - LD A,(HL-) ; BC = dst - LD B, A - LD C,(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 + LD A, B ; next row and wrap around + AND #0xF8 + LD E, A - CALL .get_xy_tt + LD A,#0x20 - POP BC - RET + ADD A, C + LD C, A + ADC A, B + SUB C + AND #0x03 + OR E + LD B, A + + PUSH BC + + JR 3$ diff --git a/gbdk-lib/libc/gb/global.s b/gbdk-lib/libc/gb/global.s @@ -183,17 +183,18 @@ lbl: SIGNED_ADD_A_REG16 regH, regL .endm -.macro MUL8_DE_RET_HL reg8 ?lbl1 ?lbl2 - ; Multiply DE by B or C, return result in HL; preserves: BC, DE +.macro MUL_DE_BY_A_RET_HL ?lbl1 ?lbl2 ?lbl3 + ; Multiply DE by A, return result in HL; preserves: BC LD HL, #0 - LD A, #8 lbl1: - ADD HL, HL - RLC reg8 + SRL A JR NC, lbl2 ADD HL, DE lbl2: - DEC A - JR NZ, lbl1 + JR Z, lbl3 + SLA E + RL D + JR lbl1 +lbl3: .endm diff --git a/gbdk-lib/libc/gb/set_xy_t.s b/gbdk-lib/libc/gb/set_xy_t.s @@ -23,62 +23,63 @@ ;; Set background tile from (BC) at XY = DE, size WH on stack, to vram from address (HL) .set_xy_tt:: PUSH BC ; Store source - XOR A - LD B,A - OR E - JR Z,2$ - 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 - DEC E - JR NZ,1$ -2$: - LD C,D - ADD HL,BC ; HL = HL + 0x20 * Y + X + SWAP E + RLC E + LD A,E + AND #0x03 + ADD H + LD B,A + LD A,#0xE0 + AND E + ADD D + LD C,A ; dest BC = HL + 0x20 * Y + X - POP BC ; BC = source + POP HL ; HL = source POP DE ; DE = WH - PUSH DE ; Store WH + PUSH DE ; store WH + PUSH BC ; store dest 3$: ; Copy W tiles - SRL D - JR NC,4$ WAIT_STAT - LD A,(BC) ; transfer one byte - LD (HL+),A - INC BC -4$: - XOR A - OR D - JR Z, 6$ -5$: - WAIT_STAT - .REPT 2 ; transfer two bytes - LD A,(BC) - LD (HL+),A - INC BC - .ENDM + LD A, (HL+) + LD (BC), A + + LD A, C ; inc dest and wrap around + AND #0xE0 + LD E, A + LD A, C + INC A + AND #0x1F + OR E + LD C, A + DEC D - JR NZ,5$ -6$: - POP AF - LD D,A ; Restore D = W + JR NZ, 3$ - DEC E + POP BC + POP DE + DEC E RET Z + PUSH DE + + LD A, B ; next row and wrap around + AND #0xF8 + LD E, A + LD A,#0x20 - SUB D - ADD_A_REG16 H,L - PUSH DE ; Store WH + ADD A, C + LD C, A + ADC A, B + SUB C + AND #0x03 + OR E + LD B, A + + PUSH BC + JR 3$

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