git.y1.nz

gbdk-2020

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

commit bf714255509f7a9a5a0a5212c1732c8fb7324096
parent 3e17e9420734696f52442f043f46a7a2374cb4b3
Author: toxa <untoxa@mail.ru>
Date:   Tue,  3 Nov 2020 01:18:34 +0300

VRAM initialization functions: init_bkg(), init_win(), vmemset()

Diffstat:
Mgbdk-lib/include/gb/gb.h22++++++++++++++++++++++
Mgbdk-lib/libc/gb/Makefile2+-
Mgbdk-lib/libc/gb/init_tt.s67+++++++++++++++++++++++++++++++++++++++++++++----------------------
Agbdk-lib/libc/gb/init_vram.s43+++++++++++++++++++++++++++++++++++++++++++
Mgbdk-lib/libc/gb/set_xy_t.s27++++++++++++---------------
5 files changed, 123 insertions(+), 38 deletions(-)

diff --git a/gbdk-lib/include/gb/gb.h b/gbdk-lib/include/gb/gb.h @@ -1142,4 +1142,26 @@ void get_tiles(UINT8 x, unsigned char *tiles, unsigned char *vram_addr) NONBANKED __preserves_regs(b, c); + +/* ************************************************************ */ + + +/** Initializes window tile table with c + @param c Tile number +*/ +void init_win(char c) NONBANKED __preserves_regs(b, c); + +/** Initializes background tile table with c + @param c Tile number +*/ +void init_bkg(char c) NONBANKED __preserves_regs(b, c); + +/** Fills the VRAM memory region s of size n with c + @param s Start address + @param c Value to fill with + @param n Size of memory region +*/ +void vmemset (void *s, char c, size_t n) NONBANKED __preserves_regs(b, c); + + #endif /* _GB_H */ 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 \ + set_t.s init_vram.s \ crt0.s ifeq ($(ASM),asxxxx) diff --git a/gbdk-lib/libc/gb/init_tt.s b/gbdk-lib/libc/gb/init_tt.s @@ -3,38 +3,61 @@ ;; BANKED: checked .area _BASE - ;; Initialize part (size = DE) of the VRAM at (HL) with B -.init_vram:: -1$: - WAIT_STAT - - LD A, B - LD (HL+),A - DEC DE - LD A,D - OR E - JR NZ,1$ - RET ;; Initialize window tile table with B .init_wtt:: LDH A,(.LCDC) BIT 6,A - JR NZ,1$ - LD HL,#0x9800 ; HL = origin - JR .init_tt -1$: - LD HL,#0x9C00 ; HL = origin - JR .init_tt + JR Z,.is98 + JR .is9c ;; Initialize background tile table with B .init_btt:: LDH A,(.LCDC) BIT 3,A - JR NZ,1$ + JR NZ,.is9c +.is98: LD HL,#0x9800 ; HL = origin JR .init_tt -1$: +.is9c: LD HL,#0x9C00 ; HL = origin -; JR .init_tt + .init_tt:: LD DE,#0x0400 ; One whole GB Screen - JP .init_vram + +.init_vram:: +1$: + SRL D + RR E + JR NC, 2$ + WAIT_STAT + LD A, B + LD (HL+),A +2$: + SRL D + RR E + JR NC, 3$ + WAIT_STAT + LD A, B + LD (HL+),A + LD (HL+),A +3$: + LD A, D + OR E + RET Z + + INC D + INC E + JR 5$ +4$: + WAIT_STAT + LD A, B + LD (HL+),A + LD (HL+),A + LD (HL+),A + LD (HL+),A +5$: + DEC E + JR NZ, 4$ + DEC D + JR NZ, 4$ + + RET diff --git a/gbdk-lib/libc/gb/init_vram.s b/gbdk-lib/libc/gb/init_vram.s @@ -0,0 +1,42 @@ + .include "global.s" + + ;; BANKED: checked + .area _BASE + + ;; Initialize window tile table + ;; void init_win(char c); +_init_win:: + PUSH BC + LDA HL, 4(SP) + LD B, (HL) + CALL .init_wtt + POP BC + RET + + ;; Initialize background tile table + ;; void init_bkg(char c); +_init_bkg:: + PUSH BC + LDA HL, 4(SP) + LD B, (HL) + CALL .init_btt + POP BC + RET + + ;; Fills the VRAM memory region s of size n with c + ;; void _vmemset (void *s, char c, size_t n); +_vmemset:: + PUSH BC + LDA HL, 8(SP) + LD A, (HL-) + LD D, A + LD A, (HL-) + LD E, A + LD A, (HL-) + LD B, A + LD A, (HL-) + LD L, (HL) + LD H, A + CALL .init_vram + POP BC + RET + diff --git a/gbdk-lib/libc/gb/set_xy_t.s b/gbdk-lib/libc/gb/set_xy_t.s @@ -1,10 +1,8 @@ .include "global.s" - ;; BANKED: checked, imperfect .area _BASE ;; Set window tile table from BC at XY = DE of size WH = HL - ;; wh >= (1,1) .set_xy_wtt:: PUSH HL ; Store WH LDH A,(.LCDC) @@ -12,17 +10,17 @@ 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,.is9c -.is98: LD HL,#0x9800 +.is98: + LD HL,#0x9800 JR .set_xy_tt .is9c: LD HL,#0x9C00 - + ;; 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 @@ -54,27 +52,26 @@ JR NC,4$ WAIT_STAT - LD A,(BC) + LD A,(BC) ; transfer one byte LD (HL+),A INC BC 4$: XOR A OR D JR Z, 6$ -5$: +5$: WAIT_STAT - LD A,(BC) - LD (HL+),A - INC BC - LD A,(BC) - LD (HL+),A - INC BC + .REPT 2 ; transfer two bytes + LD A,(BC) + LD (HL+),A + INC BC + .ENDM DEC D JR NZ,5$ -6$: +6$: POP AF LD D,A ; Restore D = W - + DEC E RET Z

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