git.y1.nz

gbdk-2020

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

commit 159abbcdbaa25a09a6c876b0b5f80fb3cc9bfa68
parent 5887b74086f7b96644685d025ed8699a4dcfcb87
Author: Toxa <untoxa@mail.ru>
Date:   Wed, 10 Feb 2021 15:16:14 +0300

get_bkg_xy_addr()/get_win_xy_addr()

Diffstat:
Mgbdk-lib/examples/gb/scroller/text_scroller.c37+++++++++++++++++++------------------
Mgbdk-lib/include/gb/gb.h8++++----
Mgbdk-lib/libc/gb/get_addr.s41++++++++++++++++++++++++++++++-----------
Mgbdk-lib/libc/gb/set_tile.s6+++---
4 files changed, 56 insertions(+), 36 deletions(-)

diff --git a/gbdk-lib/examples/gb/scroller/text_scroller.c b/gbdk-lib/examples/gb/scroller/text_scroller.c @@ -46,25 +46,26 @@ void main() { set_interrupts(VBL_IFLAG | LCD_IFLAG); } - scroller_vram_addr = set_bkg_tile_xy(20, SCROLL_POS, *scroller_next_char - 0x20); - - base = (UWORD) scroller_vram_addr & 0xffe0; - limit = base + 0x20; - + scroller_vram_addr = get_bkg_xy_addr(20, SCROLL_POS); + set_vram_byte(scroller_vram_addr, *scroller_next_char - 0x20); + + base = (UWORD) scroller_vram_addr & 0xffe0; + limit = base + 0x20; + while (1) { - scroller_x++; - if ((scroller_x & 0x07) == 0) { - // next letter - scroller_next_char++; - if (*scroller_next_char == 0) scroller_next_char = scroller_text; - - // next vram position - scroller_vram_addr++; - if (scroller_vram_addr == (UBYTE *)limit) scroller_vram_addr = (UBYTE *)base; - - // put next char - set_vram_byte(scroller_vram_addr, *scroller_next_char - 0x20); - } + scroller_x++; + if ((scroller_x & 0x07) == 0) { + // next letter + scroller_next_char++; + if (*scroller_next_char == 0) scroller_next_char = scroller_text; + + // next vram position + scroller_vram_addr++; + if (scroller_vram_addr == (UBYTE *)limit) scroller_vram_addr = (UBYTE *)base; + + // put next char + set_vram_byte(scroller_vram_addr, *scroller_next_char - 0x20); + } wait_vbl_done(); } } diff --git a/gbdk-lib/include/gb/gb.h b/gbdk-lib/include/gb/gb.h @@ -619,9 +619,9 @@ void set_vram_byte(UBYTE * addr, UINT8 v) __preserves_regs(b, c); /** - * Get base address of background map + * Get address of X,Y tile of background map */ -UINT8 * get_bkg_map_addr() __preserves_regs(b, c, h, l); +UINT8 * get_bkg_xy_addr(UINT8 x, UINT8 y) __preserves_regs(b, c); /** Sets VRAM Tile Pattern data for the Background / Window @@ -804,9 +804,9 @@ inline void scroll_bkg(INT8 x, INT8 y) { /** - * Get base address of window map + * Get address of X,Y tile of window map */ -UINT8 * get_win_map_addr() __preserves_regs(b, c, h, l); +UINT8 * get_win_xy_addr(UINT8 x, UINT8 y) __preserves_regs(b, c); /** Sets VRAM Tile Pattern data for the Window / Background diff --git a/gbdk-lib/libc/gb/get_addr.s b/gbdk-lib/libc/gb/get_addr.s @@ -2,19 +2,38 @@ .area _CODE -_get_win_map_addr:: - ldh a,(.LCDC) - bit 6,a - jr z,.is98 +_get_win_xy_addr:: + ldh a, (.LCDC) + bit 6, a + jr z, .is98 jr .is9c -_get_bkg_map_addr:: - ldh a,(.LCDC) - bit 3,a - jr nz,.is9c +_get_bkg_xy_addr:: + ldh a, (.LCDC) + bit 3, a + jr nz, .is9c .is98: - ld de,#0x9800 ; DE = origin - ret + ld d, #0x98 ; DE = origin + jr .calculate_ofs .is9c: - ld de,#0x9C00 ; DE = origin + ld d, #0x9C ; DE = origin + +.calculate_ofs: + ldhl sp, #3 + + ld a, (hl-) + ld l, (hl) + + ld e, d + swap a + rlca + ld h, a + and #0x03 + add e + ld d, a + ld a, #0xE0 + and h + add l + ld e, a ; dest DE = BASE + 0x20 * Y + X + ret diff --git a/gbdk-lib/libc/gb/set_tile.s b/gbdk-lib/libc/gb/set_tile.s @@ -27,10 +27,10 @@ _set_bkg_tile_xy:: bit 3,a jr nz,.is9c .is98: - ld de,#0x9800 ; DE = origin - jr .set_tile_xy + ld d,#0x98 ; DE = origin + jr .set_tile_xy .is9c: - ld de,#0x9C00 ; DE = origin + ld d,#0x9C ; DE = origin .set_tile_xy: push bc

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