git.y1.nz

gbdk-2020

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

commit 821a395fd7f090f56824992e65e113173de88eeb
parent 09746f1c75f5a272eb980df23f8c93e97700aebc
Author: Toxa <untoxa@mail.ru>
Date:   Mon, 25 Jan 2021 17:19:55 +0300

smaller metasprite_item_t, flipping functions

Diffstat:
Mgbdk-lib/examples/gb/metasprites/metasprites.c89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Mgbdk-lib/include/gb/metasprites.h28++++++++++++++++++++++++----
Mgbdk-lib/libc/gb/Makefile2+-
Mgbdk-lib/libc/gb/metasprites.s41+++++++++++++----------------------------
Agbdk-lib/libc/gb/metasprites_flip.s185+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 288 insertions(+), 57 deletions(-)

diff --git a/gbdk-lib/examples/gb/metasprites/metasprites.c b/gbdk-lib/examples/gb/metasprites/metasprites.c @@ -2,7 +2,29 @@ #include <gb/sgb.h> #include <gb/metasprites.h> -#include <stdio.h> +const unsigned char coin_data[] = +{ +0x00,0x00,0x07,0x07,0x18,0x18,0x27,0x20,0x2D,0x20,0x5A,0x64,0x5A,0x64,0x5A,0x64, +0x5A,0x64,0x2D,0x32,0x27,0x38,0x18,0x1F,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xC0,0xC0,0x20,0x20,0xA0,0x20,0xD0,0x10,0xD0,0x10,0xD0,0x10, +0xD0,0x10,0xA0,0x60,0x20,0xE0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x07,0x07,0x1F,0x18,0x38,0x20,0x32,0x20,0x41,0x40,0x41,0x40,0x41,0x40, +0x41,0x40,0x20,0x20,0x20,0x20,0x18,0x18,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xC0,0xC0,0xE0,0x20,0x60,0x20,0x30,0x10,0x30,0x10,0x30,0x10, +0x30,0x10,0x20,0x20,0x20,0x20,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; + +const metasprite_t coin0 = { + 2, + { + {0, 0, 0, 0}, {0, 8, 2, 0}, + {0, -8, 4, 0x10}, {0, 0, 6, 0x10}, + {metasprite_end} + } +}; +const metasprite_t * const coins[] = { &coin0 }; + UINT8 sprite_data[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x0d,0x0e,0x1f,0x10,0x3f,0x20,0x3f,0x20, @@ -38,50 +60,52 @@ UINT8 sprite_data[] = { const metasprite_t metasprite0 = { 19, { - {0, 0, 8, 0, 0}, {1, 0, 16, 2, 0}, {1, 0, 24, 4, 0}, {1, 0, 32, 6, 0}, {1, 0, 40, 8, 0}, {1, 0, 48, 0, 32}, - {1, 16, 8, 10, 0}, {1, 16, 16, 12, 0}, {1, 16, 24, 14, 0}, {1, 16, 32, 16, 0}, {1, 16, 40, 16, 32}, {1, 16, 48, 18, 0}, {1, 16, 56, 20, 0}, - {1, 32, 8, 22, 0}, {1, 32, 24, 24, 0}, {1, 32, 32, 26, 0}, {1, 32, 40, 28, 0}, {1, 32, 48, 30, 0}, {1, 32, 56, 32, 0}, + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16, -40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 20, 0}, + {16, -48, 22, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 32, 0}, {metasprite_end} } }; const metasprite_t metasprite1 = { 20, { - {0, 0, 8, 0, 0}, {1, 0, 16, 2, 0}, {1, 0, 24, 4, 0}, {1, 0, 32, 6, 0}, {1, 0, 40, 8, 0}, {1, 0, 48, 0, 32}, - {1, 16, 8, 10, 0}, {1, 16, 16, 12, 0}, {1, 16, 24, 14, 0}, {1, 16, 32, 16, 0}, {1, 16, 40, 16, 32}, {1, 16, 48, 18, 0}, {1, 16, 56, 34, 0}, - {1, 32, 0, 36, 0}, {1, 32, 8, 38, 0}, {1, 32, 24, 24, 0}, {1, 32, 32, 26, 0}, {1, 32, 40, 28, 0}, {1, 32, 48, 30, 0}, {1, 32, 56, 40, 0}, + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 34, 0}, + {16,-56, 36, 0}, { 0, 8, 38, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 40, 0}, {metasprite_end} } }; const metasprite_t metasprite2 = { 20, { - {0, 0, 8, 0, 0}, {1, 0, 16, 2, 0}, {1, 0, 24, 4, 0}, {1, 0, 32, 6, 0}, {1, 0, 40, 8, 0}, {1, 0, 48, 0, 32}, - {1, 16, 8, 10, 0}, {1, 16, 16, 12, 0}, {1, 16, 24, 14, 0}, {1, 16, 32, 16, 0}, {1, 16, 40, 16, 32}, {1, 16, 48, 18, 0}, {1, 16, 56, 42, 0}, - {1, 32, 0, 44, 0}, {1, 32, 8, 46, 0}, {1, 32, 24, 24, 0}, {1, 32, 32, 26, 0}, {1, 32, 40, 28, 0}, {1, 32, 48, 30, 0}, {1, 32, 56, 48, 0}, + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 42, 0}, + {16,-56, 44, 0}, { 0, 8, 46, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 48, 0}, {metasprite_end} } }; const metasprite_t metasprite3 = { 20, { - {0, 0, 8, 0, 0}, {1, 0, 16, 2, 0}, {1, 0, 24, 4, 0}, {1, 0, 32, 6, 0}, {1, 0, 40, 8, 0}, {1, 0, 48, 0, 32}, - {1, 16, 8, 10, 0}, {1, 16, 16, 12, 0}, {1, 16, 24, 14, 0}, {1, 16, 32, 16, 0}, {1, 16, 40, 16, 32}, {1, 16, 48, 18, 0}, {1, 16, 56, 34, 0}, - {1, 32, 0, 50, 0}, {1, 32, 8, 52, 0}, {1, 32, 24, 24, 0}, {1, 32, 32, 26, 0}, {1, 32, 40, 28, 0}, {1, 32, 48, 30, 0}, {1, 32, 56, 40, 0}, + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 34, 0}, + {16,-56, 50, 0}, { 0, 8, 52, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 40, 0}, {metasprite_end} } }; const metasprite_t metasprite4 = { 20, { - {0, 0, 8, 0, 0}, {1, 0, 16, 2, 0}, {1, 0, 24, 4, 0}, {1, 0, 32, 6, 0}, {1, 0, 40, 8, 0}, {1, 0, 48, 0, 32}, - {1, 16, 8, 10, 0}, {1, 16, 16, 12, 0}, {1, 16, 24, 14, 0}, {1, 16, 32, 16, 0}, {1, 16, 40, 16, 32}, {1, 16, 48, 18, 0}, {1, 16, 56, 20, 0}, - {1, 32, 0, 54, 0}, {1, 32, 8, 52, 0}, {1, 32, 24, 24, 0}, {1, 32, 32, 26, 0}, {1, 32, 40, 28, 0}, {1, 32, 48, 30, 0}, {1, 32, 56, 32, 0}, + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 20, 0}, + {16,-56, 54, 0}, { 0, 8, 52, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 32, 0}, {metasprite_end} } }; const metasprite_t * const metasprites[] = { &metasprite0, &metasprite1, &metasprite2, &metasprite3, &metasprite4, &metasprite3, &metasprite2, &metasprite1 }; +const unsigned char pattern[] = {0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x01}; + joypads_t joypads; #define ACC_X 1 @@ -92,23 +116,26 @@ UINT16 PosX, PosY; INT16 SpdX, SpdY; UINT8 PosF; UINT8 hide, jitter; -UINT8 idx; +UINT8 idx, rot; // main funxction void main(void) { - puts("D-Pad: Move\nA : hide\nB : animate"); - // init palettes - BGP_REG = OBP0_REG = OBP1_REG = 0xE4; + BGP_REG = OBP0_REG = 0xE4; + OBP1_REG = 0xE0; + + fill_bkg_rect(0, 0, 20, 18, 0); + set_bkg_data(0, 1, pattern); // load tile data into VRAM set_sprite_data(0, sizeof(sprite_data) >> 4, sprite_data); - +// set_sprite_data(0, sizeof(coin_data) >> 4, coin_data); + // set sprite tile set_sprite_tile(0, 0); // show bkg and sprites - SPRITES_8x16; SHOW_SPRITES; + SHOW_BKG; SPRITES_8x16; SHOW_SPRITES; // init 2 joypads joypad_init(1, &joypads); @@ -116,7 +143,7 @@ void main(void) { PosX = PosY = 64 << 4; SpdX = SpdY = 0; - hide = 0; jitter = 0; idx = 0; + hide = 0; jitter = 0; idx = 0; rot = 0; while(1) { // poll joypads @@ -150,14 +177,28 @@ void main(void) { idx++; if (idx >= 8) idx = 0; jitter = 10; } + if ((joypads.joy0 & J_SELECT) && (!jitter) && (!hide)) { + rot++; rot &= 3; + jitter = 10; + } // anti-jitter if (jitter) jitter--; PosX += SpdX, PosY += SpdY; +// move_metasprite(coins[0], 0, 0, PosX >> 4, PosY >> 4); + // hide or move sprite - if (hide) hide_metasprite(metasprites[idx], 0); else move_metasprite(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); + if (hide) + hide_metasprite(metasprites[idx], 0); + else + switch (rot) { + case 0: move_metasprite(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + case 1: move_metasprite_hflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + case 2: move_metasprite_hvflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + case 3: move_metasprite_vflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + }; // hide rest of the hardware sprites, because amount of sprites differ between animation frames for (UBYTE i = metasprites[idx]->count; i < 40; i++) shadow_OAM[i].y = 0; diff --git a/gbdk-lib/include/gb/metasprites.h b/gbdk-lib/include/gb/metasprites.h @@ -1,11 +1,10 @@ -#ifndef _METASPRITES_H_INVCLUDE -#define _METASPRITES_H_INVCLUDE +#ifndef _METASPRITES_H_INCLUDE +#define _METASPRITES_H_INCLUDE /** * metasprite item description */ typedef struct metasprite_item_t { - INT8 did; INT8 dy, dx; UINT8 dtile; UINT8 props; @@ -19,13 +18,16 @@ typedef struct metasprite_t { metasprite_item_t items[]; } metasprite_t; -#define metasprite_end 0 +#define metasprite_end -128 extern const void * __current_metasprite; extern UBYTE __current_base_tile; extern UBYTE __render_shadow_OAM; static UBYTE __move_metasprite(UINT8 id, UINT8 x, UINT8 y); +static UBYTE __move_metasprite_vflip(UINT8 id, UINT8 x, UINT8 y); +static UBYTE __move_metasprite_hflip(UINT8 id, UINT8 x, UINT8 y); +static UBYTE __move_metasprite_hvflip(UINT8 id, UINT8 x, UINT8 y); static void __hide_metasprite(UINT8 id); /** @@ -42,6 +44,24 @@ inline UBYTE move_metasprite(const void * metasprite, UINT8 base_tile, UINT8 bas return __move_metasprite(base_sprite, x, y); } +inline UBYTE move_metasprite_vflip(const void * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { + __current_metasprite = metasprite; + __current_base_tile = base_tile; + return __move_metasprite_vflip(base_sprite, x, y); +} + +inline UBYTE move_metasprite_hflip(const void * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { + __current_metasprite = metasprite; + __current_base_tile = base_tile; + return __move_metasprite_hflip(base_sprite, x, y); +} + +inline UBYTE move_metasprite_hvflip(const void * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { + __current_metasprite = metasprite; + __current_base_tile = base_tile; + return __move_metasprite_hvflip(base_sprite, x, y); +} + /** * Hides metasprite from screen * @param metasprite metasprite description diff --git a/gbdk-lib/libc/gb/Makefile b/gbdk-lib/libc/gb/Makefile @@ -29,7 +29,7 @@ ASSRC = cgb.s cpy_data.s \ mode.s clock.s \ get_t.s set_t.s init_vram.s \ fill_rect.s fill_rect_bk.s fill_rect_wi.s \ - metasprites.s \ + metasprites.s metasprites_flip.s \ crt0.s ifeq ($(ASM),asxxxx) diff --git a/gbdk-lib/libc/gb/metasprites.s b/gbdk-lib/libc/gb/metasprites.s @@ -42,23 +42,18 @@ ___move_metasprite:: ld a, (___render_shadow_OAM) ld d, a - - ld a, (hl+) - inc a 1$: - dec a - add a - add a - add e - ld e, a - ld a, (hl+) ; dy + cp #0x80 + jr z, 2$ add b + ld b, a ld (de), a inc e ld a, (hl+) ; dx add c + ld c, a ld (de), a inc e @@ -72,10 +67,9 @@ ___move_metasprite:: ld (de), a inc e - ld a, (hl+) - or a - jr nz, 1$ + jr 1$ +2$: pop hl ld e,(hl) @@ -96,19 +90,16 @@ ___hide_metasprite:: ld l, a inc hl - ld bc, #4 + ld bc, #3 ld a, (___render_shadow_OAM) ld d, a - - ld a, (hl+) - inc a 1$: - dec a - add a - add a - add e - ld e, a + ld a, (hl+) + cp #0x80 + ret z + + add hl, bc xor a ld (de), a @@ -117,10 +108,4 @@ ___hide_metasprite:: inc e inc e inc e - add hl, bc - - ld a, (hl+) - or a - jr nz, 1$ - - ret + jr 1$ diff --git a/gbdk-lib/libc/gb/metasprites_flip.s b/gbdk-lib/libc/gb/metasprites_flip.s @@ -0,0 +1,185 @@ + .include "global.s" + + .title "Metasprites" + .module Metasprites + + .area _DATA + + .globl ___current_metasprite, ___current_base_tile, ___render_shadow_OAM + + .area _CODE + +; UBYTE __move_metasprite(UINT8 id, UINT8 x, UINT8 y) + +___move_metasprite_hflip:: + ldhl sp, #4 + ld a, (hl-) + ld b, a + ld a, (hl-) + ld c, a + ld a, (hl-) + add a + add a + ld e, a + + ld hl, #___current_metasprite + ld a, (hl+) + ld h, (hl) + ld l, a + push hl + + inc hl + + ld a, (___render_shadow_OAM) + ld d, a +1$: + ld a, (hl+) + cp #0x80 + jr z, 2$ + cpl + inc a + add b + ld b, a + ld (de), a + inc e + + ld a, (hl+) ; dx + add c + ld c, a + ld (de), a + inc e + + ld a, (___current_base_tile) + add (hl) ; tile + inc hl + ld (de), a + inc e + + ld a, (hl+) ; props + xor #0x40 + ld (de), a + inc e + + jr 1$ + +2$: + pop hl + ld e,(hl) + + ret + +___move_metasprite_vflip:: + ldhl sp, #4 + ld a, (hl-) + ld b, a + ld a, (hl-) + ld c, a + ld a, (hl-) + add a + add a + ld e, a + + ld hl, #___current_metasprite + ld a, (hl+) + ld h, (hl) + ld l, a + push hl + + inc hl + + ld a, (___render_shadow_OAM) + ld d, a +1$: + ld a, (hl+) ; dy + cp #0x80 + jr z, 2$ + add b + ld b, a + ld (de), a + inc e + + ld a, (hl+) ; dx + cpl + inc a + add c + ld c, a + ld (de), a + inc e + + ld a, (___current_base_tile) + add (hl) ; tile + inc hl + ld (de), a + inc e + + ld a, (hl+) ; props + xor #0x20 + ld (de), a + inc e + + jr 1$ + +2$: + pop hl + ld e,(hl) + + ret + +___move_metasprite_hvflip:: + ldhl sp, #4 + ld a, (hl-) + ld b, a + ld a, (hl-) + ld c, a + ld a, (hl-) + add a + add a + ld e, a + + ld hl, #___current_metasprite + ld a, (hl+) + ld h, (hl) + ld l, a + push hl + + inc hl + + ld a, (___render_shadow_OAM) + ld d, a +1$: + ld a, (hl+) + cp #0x80 + jr z, 2$ + cpl + inc a + add b + ld b, a + ld (de), a + inc e + + ld a, (hl+) ; dx + cpl + inc a + add c + ld c, a + ld (de), a + inc e + + ld a, (___current_base_tile) + add (hl) ; tile + inc hl + ld (de), a + inc e + + ld a, (hl+) ; props + xor #0x60 + ld (de), a + inc e + + jr 1$ + +2$: + pop hl + ld e,(hl) + + 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.