From d138e194bf202d3f1665fcec8949b3d6fdce0875 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sat, 30 Aug 2025 23:37:20 -0500 Subject: [PATCH] vdp2: add nbg0_aseprite_rustboro --- Makefile | 4 + aseprite/rustboro.aseprite | Bin 0 -> 14301 bytes .../character_pattern__tileset_0.bin.h | 5 + .../character_pattern__tileset_1.bin.h | 5 + aseprite/rustboro/palette.bin.h | 5 + .../pattern_name_table__layer_0.bin.h | 5 + .../pattern_name_table__layer_1.bin.h | 5 + vdp2/nbg0_aseprite_rustboro.cpp | 187 ++++++++++++++++++ 8 files changed, 216 insertions(+) create mode 100644 aseprite/rustboro.aseprite create mode 100644 aseprite/rustboro/character_pattern__tileset_0.bin.h create mode 100644 aseprite/rustboro/character_pattern__tileset_1.bin.h create mode 100644 aseprite/rustboro/palette.bin.h create mode 100644 aseprite/rustboro/pattern_name_table__layer_0.bin.h create mode 100644 aseprite/rustboro/pattern_name_table__layer_1.bin.h create mode 100644 vdp2/nbg0_aseprite_rustboro.cpp diff --git a/Makefile b/Makefile index 9ba5182..3103adc 100644 --- a/Makefile +++ b/Makefile @@ -66,6 +66,10 @@ vdp2/nbg0.elf: vdp2/nbg0.o res/butterfly.data.o res/butterfly.data.pal.o vdp2/nbg0_16color.elf: vdp2/nbg0_16color.o res/kirby.data.o res/kirby.data.pal.o +vdp2/nbg0_aseprite.elf: vdp2/nbg0_aseprite.o aseprite/palette.bin.o aseprite/character_patterns.bin.o aseprite/pattern_name_table.bin.o + +vdp2/nbg0_aseprite_rustboro.elf: vdp2/nbg0_aseprite_rustboro.o aseprite/rustboro/character_pattern__tileset_0.bin.o aseprite/rustboro/character_pattern__tileset_1.bin.o aseprite/rustboro/palette.bin.o aseprite/rustboro/pattern_name_table__layer_0.bin.o aseprite/rustboro/pattern_name_table__layer_1.bin.o + vdp2/nbg0_font.elf: vdp2/nbg0_font.o saturn/start.o font/hp_100lx_4bit.data.o vdp2/rbg0_font.elf: vdp2/rbg0_font.o saturn/start.o font/hp_100lx_4bit.data.o diff --git a/aseprite/rustboro.aseprite b/aseprite/rustboro.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..2842e462b3195f8b86c4e6a0b678112de7baa88e GIT binary patch literal 14301 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 irqq(i=O}cPy)s +extern uint32_t _binary_aseprite_rustboro_character_pattern__tileset_0_bin_start __asm("_binary_aseprite_rustboro_character_pattern__tileset_0_bin_start"); +extern uint32_t _binary_aseprite_rustboro_character_pattern__tileset_0_bin_end __asm("_binary_aseprite_rustboro_character_pattern__tileset_0_bin_end"); +extern uint32_t _binary_aseprite_rustboro_character_pattern__tileset_0_bin_size __asm("_binary_aseprite_rustboro_character_pattern__tileset_0_bin_size"); diff --git a/aseprite/rustboro/character_pattern__tileset_1.bin.h b/aseprite/rustboro/character_pattern__tileset_1.bin.h new file mode 100644 index 0000000..f16bde5 --- /dev/null +++ b/aseprite/rustboro/character_pattern__tileset_1.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_rustboro_character_pattern__tileset_1_bin_start __asm("_binary_aseprite_rustboro_character_pattern__tileset_1_bin_start"); +extern uint32_t _binary_aseprite_rustboro_character_pattern__tileset_1_bin_end __asm("_binary_aseprite_rustboro_character_pattern__tileset_1_bin_end"); +extern uint32_t _binary_aseprite_rustboro_character_pattern__tileset_1_bin_size __asm("_binary_aseprite_rustboro_character_pattern__tileset_1_bin_size"); diff --git a/aseprite/rustboro/palette.bin.h b/aseprite/rustboro/palette.bin.h new file mode 100644 index 0000000..682ca3a --- /dev/null +++ b/aseprite/rustboro/palette.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_rustboro_palette_bin_start __asm("_binary_aseprite_rustboro_palette_bin_start"); +extern uint32_t _binary_aseprite_rustboro_palette_bin_end __asm("_binary_aseprite_rustboro_palette_bin_end"); +extern uint32_t _binary_aseprite_rustboro_palette_bin_size __asm("_binary_aseprite_rustboro_palette_bin_size"); diff --git a/aseprite/rustboro/pattern_name_table__layer_0.bin.h b/aseprite/rustboro/pattern_name_table__layer_0.bin.h new file mode 100644 index 0000000..f5d3547 --- /dev/null +++ b/aseprite/rustboro/pattern_name_table__layer_0.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_rustboro_pattern_name_table__layer_0_bin_start __asm("_binary_aseprite_rustboro_pattern_name_table__layer_0_bin_start"); +extern uint32_t _binary_aseprite_rustboro_pattern_name_table__layer_0_bin_end __asm("_binary_aseprite_rustboro_pattern_name_table__layer_0_bin_end"); +extern uint32_t _binary_aseprite_rustboro_pattern_name_table__layer_0_bin_size __asm("_binary_aseprite_rustboro_pattern_name_table__layer_0_bin_size"); diff --git a/aseprite/rustboro/pattern_name_table__layer_1.bin.h b/aseprite/rustboro/pattern_name_table__layer_1.bin.h new file mode 100644 index 0000000..2db3ebb --- /dev/null +++ b/aseprite/rustboro/pattern_name_table__layer_1.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_rustboro_pattern_name_table__layer_1_bin_start __asm("_binary_aseprite_rustboro_pattern_name_table__layer_1_bin_start"); +extern uint32_t _binary_aseprite_rustboro_pattern_name_table__layer_1_bin_end __asm("_binary_aseprite_rustboro_pattern_name_table__layer_1_bin_end"); +extern uint32_t _binary_aseprite_rustboro_pattern_name_table__layer_1_bin_size __asm("_binary_aseprite_rustboro_pattern_name_table__layer_1_bin_size"); diff --git a/vdp2/nbg0_aseprite_rustboro.cpp b/vdp2/nbg0_aseprite_rustboro.cpp new file mode 100644 index 0000000..faefbad --- /dev/null +++ b/vdp2/nbg0_aseprite_rustboro.cpp @@ -0,0 +1,187 @@ +#include + +#include "vdp2.h" +#include "../common/vdp2_func.hpp" + +#include "aseprite/rustboro/palette.bin.h" +#include "aseprite/rustboro/character_pattern__tileset_0.bin.h" +#include "aseprite/rustboro/character_pattern__tileset_1.bin.h" +#include "aseprite/rustboro/pattern_name_table__layer_0.bin.h" +#include "aseprite/rustboro/pattern_name_table__layer_1.bin.h" + +void palette_data() +{ + const uint16_t * buf = reinterpret_cast(&_binary_aseprite_rustboro_palette_bin_start); + const uint32_t buf_size = reinterpret_cast(&_binary_aseprite_rustboro_palette_bin_size); + + for (uint32_t i = 0; i < buf_size / 2; i++) { + vdp2.cram.u16[i] = buf[i]; + } +} + +typedef struct buf_size { + uint32_t const * const buf; + const uint32_t size; +} buf_size_t; + +const buf_size_t character_patterns[] = { + { + .buf = (uint32_t *)(&_binary_aseprite_rustboro_character_pattern__tileset_0_bin_start), + .size = (uint32_t)(&_binary_aseprite_rustboro_character_pattern__tileset_0_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_rustboro_character_pattern__tileset_1_bin_start), + .size = (uint32_t)(&_binary_aseprite_rustboro_character_pattern__tileset_1_bin_size), + }, +}; + +uint32_t character_pattern_data(const buf_size_t * buf_size, const uint32_t top) +{ + const uint32_t base_address = top - buf_size->size; // in bytes + + for (uint32_t i = 0; i < (buf_size->size / 4); i++) { + vdp2.vram.u32[(base_address / 4) + i] = buf_size->buf[i]; + } + + return base_address; +} + +const buf_size_t pattern_name_tables[] = { + { + .buf = (uint32_t *)(&_binary_aseprite_rustboro_pattern_name_table__layer_0_bin_start), + .size = (uint32_t)(&_binary_aseprite_rustboro_pattern_name_table__layer_0_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_rustboro_pattern_name_table__layer_1_bin_start), + .size = (uint32_t)(&_binary_aseprite_rustboro_pattern_name_table__layer_1_bin_size), + }, +}; + +void pattern_name_table_data(const buf_size_t * buf_size, + const uint32_t vram_offset, + const uint32_t character_offset) +{ + for (uint32_t i = 0; i < buf_size->size / 4; i++) { + uint32_t data = buf_size->buf[i]; + uint32_t character_number = (data & 0x7fff) * 8 + character_offset; + uint32_t flags = data & 0xffff0000; + vdp2.vram.u32[(vram_offset / 4) + i] = flags | character_number; + } +} + +void main() +{ + v_blank_in(); + + // DISP: Please make sure to change this bit from 0 to 1 during V blank. + vdp2.reg.TVMD = ( TVMD__DISP | TVMD__LSMD__NON_INTERLACE + | TVMD__VRESO__240 | TVMD__HRESO__NORMAL_320); + + + /* set the color mode to 5bits per channel, 1024 colors */ + vdp2.reg.RAMCTL = RAMCTL__CRMD__RGB_5BIT_1024; + + vdp2.reg.PRINA = PRINA__N0PRIN(1) | PRINA__N1PRIN(2); + + vdp2.reg.VRSIZE = 0; + + /* enable display of NBG0 */ + vdp2.reg.BGON = BGON__N0ON | BGON__N0TPON + | BGON__N1ON; + + /* set character format for NBG0 to palettized 16 color + set enable "cell format" for NBG0 + set character size for NBG0 to 1x1 cell */ + vdp2.reg.CHCTLA = CHCTLA__N0CHCN__256_COLOR + | CHCTLA__N0BMEN__CELL_FORMAT + | CHCTLA__N0CHSZ__2x2_CELL + | CHCTLA__N1CHCN__256_COLOR + | CHCTLA__N1BMEN__CELL_FORMAT + | CHCTLA__N1CHSZ__2x2_CELL; + + /* plane size */ + vdp2.reg.PLSZ = PLSZ__N0PLSZ__2x2 | PLSZ__N1PLSZ__2x2; + + /* map plane offset + 1-word: value of bit 6-0 * 0x2000 + 2-word: value of bit 5-0 * 0x4000 + */ + constexpr int plane_a = 0; + constexpr int plane_a_offset = plane_a * 0x1000; + + constexpr int plane_b = 4; + constexpr int plane_b_offset = plane_b * 0x1000; + +// Enable VRAM bank partitioning + vdp2.reg.RAMCTL = RAMCTL__VRAMD | RAMCTL__VRBMD; + + vdp2.reg.MPOFN = MPOFN__N1MP(0) | MPOFN__N0MP(0); // bits 8~6 + + vdp2.reg.MPABN0 = MPABN0__N0MPB(plane_a) | MPABN0__N0MPA(plane_a); // bits 5~0 + vdp2.reg.MPCDN0 = MPCDN0__N0MPD(plane_a) | MPCDN0__N0MPC(plane_a); // bits 5~0 + vdp2.reg.PNCN0 = PNCN0__N0PNB__2WORD; + + vdp2.reg.MPABN1 = MPABN1__N1MPB(plane_b) | MPABN1__N1MPA(plane_b); // bits 5~0 + vdp2.reg.MPCDN1 = MPCDN1__N1MPD(plane_b) | MPCDN1__N1MPC(plane_b); // bits 5~0 + vdp2.reg.PNCN1 = PNCN1__N1PNB__2WORD; + + // cpu access + vdp2.reg.CYCA0 = 0xeeeeeeee; + vdp2.reg.CYCA1 = 0xeeeeeeee; + vdp2.reg.CYCB0 = 0xeeeeeeee; + vdp2.reg.CYCB1 = 0xeeeeeeee; + + uint32_t top = (sizeof (union vdp2_vram)); + palette_data(); + + top = character_pattern_data(&character_patterns[0], top); + uint32_t pattern_base_0 = top / 32; + + top = character_pattern_data(&character_patterns[1], top); + uint32_t pattern_base_1 = top / 32; + + pattern_name_table_data(&pattern_name_tables[0], + plane_a_offset, + pattern_base_0); + + pattern_name_table_data(&pattern_name_tables[1], + plane_b_offset, + pattern_base_1); + + int sx = 0; + int sy = 0; + int dsx = 1; + int dsy = 1; + + vdp2.reg.CYCA0 = 0x01ffffff; + vdp2.reg.CYCA1 = 0x01ffffff; + vdp2.reg.CYCB0 = 0x45ffffff; + vdp2.reg.CYCB1 = 0x45ffffff; + + while (true) { + vdp2.reg.SCXIN0 = sx >> 2; + vdp2.reg.SCXDN0 = (sx & 0b11) << 14; + vdp2.reg.SCYIN0 = sy >> 1; + vdp2.reg.SCYDN0 = (sy & 1) << 15; + + vdp2.reg.SCXIN1 = sx >> 2; + vdp2.reg.SCXDN1 = (sx & 0b11) << 14; + vdp2.reg.SCYIN1 = sy >> 1; + vdp2.reg.SCYDN1 = (sy & 1) << 15; + + if ((sx >> 2) >= 320 + 10) + dsx = -1; + if ((sx >> 2) <= 0 - 10) + dsx = +1; + if ((sy >> 1) >= 720 + 10) + dsy = -1; + if ((sy >> 1) <= 0 - 10) + dsy = +1; + + sx += dsx; + sy += dsy; + + while ((vdp2.reg.TVSTAT & TVSTAT__VBLANK) != 0); + while ((vdp2.reg.TVSTAT & TVSTAT__VBLANK) == 0); + } +}