From dc7903d56b1e6b8cac05a01864f0df55715b8d1e Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 1 Sep 2025 18:15:38 -0500 Subject: [PATCH] vdp2: add nbg_aseprite_pigsy --- Makefile | 25 +- aseprite/pigsy.aseprite | Bin 0 -> 11168 bytes .../pigsy/character_pattern__tileset_0.bin.h | 5 + .../pigsy/character_pattern__tileset_1.bin.h | 5 + .../pigsy/character_pattern__tileset_2.bin.h | 5 + .../pigsy/character_pattern__tileset_3.bin.h | 5 + aseprite/pigsy/palette.bin.h | 5 + .../pigsy/pattern_name_table__layer_0.bin.h | 5 + .../pigsy/pattern_name_table__layer_1.bin.h | 5 + .../pigsy/pattern_name_table__layer_2.bin.h | 5 + .../pigsy/pattern_name_table__layer_3.bin.h | 5 + vdp2/nbg0_aseprite_rustboro.cpp | 2 +- vdp2/nbg_aseprite_pigsy.cpp | 250 ++++++++++++++++++ 13 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 aseprite/pigsy.aseprite create mode 100644 aseprite/pigsy/character_pattern__tileset_0.bin.h create mode 100644 aseprite/pigsy/character_pattern__tileset_1.bin.h create mode 100644 aseprite/pigsy/character_pattern__tileset_2.bin.h create mode 100644 aseprite/pigsy/character_pattern__tileset_3.bin.h create mode 100644 aseprite/pigsy/palette.bin.h create mode 100644 aseprite/pigsy/pattern_name_table__layer_0.bin.h create mode 100644 aseprite/pigsy/pattern_name_table__layer_1.bin.h create mode 100644 aseprite/pigsy/pattern_name_table__layer_2.bin.h create mode 100644 aseprite/pigsy/pattern_name_table__layer_3.bin.h create mode 100644 vdp2/nbg_aseprite_pigsy.cpp diff --git a/Makefile b/Makefile index 3103adc..1ac2e19 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ MAKEFILE_PATH := $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))) -CFLAGS = -Isaturn -I. -D__saturn__ +CFLAGS += -Isaturn -I. -D__saturn__ +CFLAGS += -Wno-error=unused-but-set-variable OPT ?= -O2 LIB = ./saturn @@ -68,7 +69,27 @@ 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 +NBG0_ASEPRITE_RUSTBORO_OBJ = \ + 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_aseprite_rustboro.elf: vdp2/nbg0_aseprite_rustboro.o $(NBG0_ASEPRITE_RUSTBORO_OBJ) + +NBG_ASEPRITE_PIGSY_OBJ = \ + aseprite/pigsy/character_pattern__tileset_0.bin.o \ + aseprite/pigsy/character_pattern__tileset_1.bin.o \ + aseprite/pigsy/character_pattern__tileset_2.bin.o \ + aseprite/pigsy/character_pattern__tileset_3.bin.o \ + aseprite/pigsy/palette.bin.o \ + aseprite/pigsy/pattern_name_table__layer_0.bin.o \ + aseprite/pigsy/pattern_name_table__layer_1.bin.o \ + aseprite/pigsy/pattern_name_table__layer_2.bin.o \ + aseprite/pigsy/pattern_name_table__layer_3.bin.o + +vdp2/nbg_aseprite_pigsy.elf: vdp2/nbg_aseprite_pigsy.o $(NBG_ASEPRITE_PIGSY_OBJ) vdp2/nbg0_font.elf: vdp2/nbg0_font.o saturn/start.o font/hp_100lx_4bit.data.o diff --git a/aseprite/pigsy.aseprite b/aseprite/pigsy.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..7fde2cc649f6e718cc6cdc712be5b4a3c8f9af89 GIT binary patch literal 11168 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 aUmi`>G}>2c4+rixUT89gh?VI@&Hn +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_0_bin_start __asm("_binary_aseprite_pigsy_character_pattern__tileset_0_bin_start"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_0_bin_end __asm("_binary_aseprite_pigsy_character_pattern__tileset_0_bin_end"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_0_bin_size __asm("_binary_aseprite_pigsy_character_pattern__tileset_0_bin_size"); diff --git a/aseprite/pigsy/character_pattern__tileset_1.bin.h b/aseprite/pigsy/character_pattern__tileset_1.bin.h new file mode 100644 index 0000000..cecdcfc --- /dev/null +++ b/aseprite/pigsy/character_pattern__tileset_1.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_1_bin_start __asm("_binary_aseprite_pigsy_character_pattern__tileset_1_bin_start"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_1_bin_end __asm("_binary_aseprite_pigsy_character_pattern__tileset_1_bin_end"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_1_bin_size __asm("_binary_aseprite_pigsy_character_pattern__tileset_1_bin_size"); diff --git a/aseprite/pigsy/character_pattern__tileset_2.bin.h b/aseprite/pigsy/character_pattern__tileset_2.bin.h new file mode 100644 index 0000000..0cc6c1c --- /dev/null +++ b/aseprite/pigsy/character_pattern__tileset_2.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_2_bin_start __asm("_binary_aseprite_pigsy_character_pattern__tileset_2_bin_start"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_2_bin_end __asm("_binary_aseprite_pigsy_character_pattern__tileset_2_bin_end"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_2_bin_size __asm("_binary_aseprite_pigsy_character_pattern__tileset_2_bin_size"); diff --git a/aseprite/pigsy/character_pattern__tileset_3.bin.h b/aseprite/pigsy/character_pattern__tileset_3.bin.h new file mode 100644 index 0000000..3fd8603 --- /dev/null +++ b/aseprite/pigsy/character_pattern__tileset_3.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_3_bin_start __asm("_binary_aseprite_pigsy_character_pattern__tileset_3_bin_start"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_3_bin_end __asm("_binary_aseprite_pigsy_character_pattern__tileset_3_bin_end"); +extern uint32_t _binary_aseprite_pigsy_character_pattern__tileset_3_bin_size __asm("_binary_aseprite_pigsy_character_pattern__tileset_3_bin_size"); diff --git a/aseprite/pigsy/palette.bin.h b/aseprite/pigsy/palette.bin.h new file mode 100644 index 0000000..69f9457 --- /dev/null +++ b/aseprite/pigsy/palette.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_palette_bin_start __asm("_binary_aseprite_pigsy_palette_bin_start"); +extern uint32_t _binary_aseprite_pigsy_palette_bin_end __asm("_binary_aseprite_pigsy_palette_bin_end"); +extern uint32_t _binary_aseprite_pigsy_palette_bin_size __asm("_binary_aseprite_pigsy_palette_bin_size"); diff --git a/aseprite/pigsy/pattern_name_table__layer_0.bin.h b/aseprite/pigsy/pattern_name_table__layer_0.bin.h new file mode 100644 index 0000000..32b5f87 --- /dev/null +++ b/aseprite/pigsy/pattern_name_table__layer_0.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_0_bin_start __asm("_binary_aseprite_pigsy_pattern_name_table__layer_0_bin_start"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_0_bin_end __asm("_binary_aseprite_pigsy_pattern_name_table__layer_0_bin_end"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_0_bin_size __asm("_binary_aseprite_pigsy_pattern_name_table__layer_0_bin_size"); diff --git a/aseprite/pigsy/pattern_name_table__layer_1.bin.h b/aseprite/pigsy/pattern_name_table__layer_1.bin.h new file mode 100644 index 0000000..9cf7787 --- /dev/null +++ b/aseprite/pigsy/pattern_name_table__layer_1.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_1_bin_start __asm("_binary_aseprite_pigsy_pattern_name_table__layer_1_bin_start"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_1_bin_end __asm("_binary_aseprite_pigsy_pattern_name_table__layer_1_bin_end"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_1_bin_size __asm("_binary_aseprite_pigsy_pattern_name_table__layer_1_bin_size"); diff --git a/aseprite/pigsy/pattern_name_table__layer_2.bin.h b/aseprite/pigsy/pattern_name_table__layer_2.bin.h new file mode 100644 index 0000000..4eded28 --- /dev/null +++ b/aseprite/pigsy/pattern_name_table__layer_2.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_2_bin_start __asm("_binary_aseprite_pigsy_pattern_name_table__layer_2_bin_start"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_2_bin_end __asm("_binary_aseprite_pigsy_pattern_name_table__layer_2_bin_end"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_2_bin_size __asm("_binary_aseprite_pigsy_pattern_name_table__layer_2_bin_size"); diff --git a/aseprite/pigsy/pattern_name_table__layer_3.bin.h b/aseprite/pigsy/pattern_name_table__layer_3.bin.h new file mode 100644 index 0000000..0236641 --- /dev/null +++ b/aseprite/pigsy/pattern_name_table__layer_3.bin.h @@ -0,0 +1,5 @@ +#pragma once +#include +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_3_bin_start __asm("_binary_aseprite_pigsy_pattern_name_table__layer_3_bin_start"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_3_bin_end __asm("_binary_aseprite_pigsy_pattern_name_table__layer_3_bin_end"); +extern uint32_t _binary_aseprite_pigsy_pattern_name_table__layer_3_bin_size __asm("_binary_aseprite_pigsy_pattern_name_table__layer_3_bin_size"); diff --git a/vdp2/nbg0_aseprite_rustboro.cpp b/vdp2/nbg0_aseprite_rustboro.cpp index faefbad..533e237 100644 --- a/vdp2/nbg0_aseprite_rustboro.cpp +++ b/vdp2/nbg0_aseprite_rustboro.cpp @@ -64,7 +64,7 @@ void pattern_name_table_data(const buf_size_t * buf_size, 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; + uint32_t flags = data & 0xf0000000; vdp2.vram.u32[(vram_offset / 4) + i] = flags | character_number; } } diff --git a/vdp2/nbg_aseprite_pigsy.cpp b/vdp2/nbg_aseprite_pigsy.cpp new file mode 100644 index 0000000..ea65658 --- /dev/null +++ b/vdp2/nbg_aseprite_pigsy.cpp @@ -0,0 +1,250 @@ +#include + +#include "vdp2.h" +#include "../common/vdp2_func.hpp" + +#include "aseprite/pigsy/character_pattern__tileset_0.bin.h" +#include "aseprite/pigsy/character_pattern__tileset_1.bin.h" +#include "aseprite/pigsy/character_pattern__tileset_2.bin.h" +#include "aseprite/pigsy/character_pattern__tileset_3.bin.h" +#include "aseprite/pigsy/palette.bin.h" +#include "aseprite/pigsy/pattern_name_table__layer_0.bin.h" +#include "aseprite/pigsy/pattern_name_table__layer_1.bin.h" +#include "aseprite/pigsy/pattern_name_table__layer_2.bin.h" +#include "aseprite/pigsy/pattern_name_table__layer_3.bin.h" + +void palette_data() +{ + const uint16_t * buf = reinterpret_cast(&_binary_aseprite_pigsy_palette_bin_start); + const uint32_t buf_size = reinterpret_cast(&_binary_aseprite_pigsy_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_pigsy_character_pattern__tileset_0_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_character_pattern__tileset_0_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_pigsy_character_pattern__tileset_1_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_character_pattern__tileset_1_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_pigsy_character_pattern__tileset_2_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_character_pattern__tileset_2_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_pigsy_character_pattern__tileset_3_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_character_pattern__tileset_3_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_pigsy_pattern_name_table__layer_0_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_pattern_name_table__layer_0_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_pigsy_pattern_name_table__layer_1_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_pattern_name_table__layer_1_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_pigsy_pattern_name_table__layer_2_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_pattern_name_table__layer_2_bin_size), + }, + { + .buf = (uint32_t *)(&_binary_aseprite_pigsy_pattern_name_table__layer_3_bin_start), + .size = (uint32_t)(&_binary_aseprite_pigsy_pattern_name_table__layer_3_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) * 2 + character_offset; + uint32_t flags = data & 0xf0000000; + 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.PRINB = PRINB__N2PRIN(3) | PRINB__N3PRIN(4); + + vdp2.reg.VRSIZE = 0; + + /* enable display of NBG0 */ + vdp2.reg.BGON = BGON__N0ON | BGON__N0TPON + | BGON__N1ON + | BGON__N2ON + | BGON__N3ON; + + /* 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__1x1_CELL + | CHCTLA__N1CHCN__256_COLOR + | CHCTLA__N1BMEN__CELL_FORMAT + | CHCTLA__N1CHSZ__1x1_CELL; + + vdp2.reg.CHCTLB = CHCTLB__N2CHCN__256_COLOR + | CHCTLB__N2CHSZ__1x1_CELL + | CHCTLB__N3CHCN__256_COLOR + | CHCTLB__N3CHSZ__1x1_CELL; + + /* plane size */ + vdp2.reg.PLSZ = PLSZ__N0PLSZ__1x1 | PLSZ__N1PLSZ__2x1 | PLSZ__N2PLSZ__2x1 | PLSZ__N3PLSZ__2x1; + + /* map plane offset + 1-word: value of bit 6-0 * 0x2000 + 2-word: value of bit 5-0 * 0x4000 + */ + constexpr int plane_b = (0 << 1); + constexpr int plane_b_offset = (plane_b >> 1) * 0x8000; // plane size: 2x1 ; 0x00000 + + constexpr int plane_c = (1 << 1); + constexpr int plane_c_offset = (plane_c >> 1) * 0x8000; // plane size: 2x1 ; 0x08000 + + constexpr int plane_d = (2 << 1); + constexpr int plane_d_offset = (plane_d >> 1) * 0x8000; // plane size: 2x1 ; 0x10000 + + constexpr int plane_a = 6; + constexpr int plane_a_offset = plane_a * 0x4000; // plane size: 1x1 ; 0x18000 + +// Enable VRAM bank partitioning + vdp2.reg.RAMCTL = RAMCTL__VRAMD | RAMCTL__VRBMD; + + vdp2.reg.MPOFN = MPOFN__N1MP(0) | MPOFN__N0MP(0) + | MPOFN__N3MP(0) | MPOFN__N2MP(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; + + vdp2.reg.MPABN2 = MPABN2__N2MPB(plane_c) | MPABN2__N2MPA(plane_c); // bits 5~0 + vdp2.reg.MPCDN2 = MPCDN2__N2MPD(plane_c) | MPCDN2__N2MPC(plane_c); // bits 5~0 + vdp2.reg.PNCN2 = PNCN2__N2PNB__2WORD; + + vdp2.reg.MPABN3 = MPABN3__N3MPB(plane_d) | MPABN3__N3MPA(plane_d); // bits 5~0 + vdp2.reg.MPCDN3 = MPCDN3__N3MPD(plane_d) | MPCDN3__N3MPC(plane_d); // bits 5~0 + vdp2.reg.PNCN3 = PNCN3__N3PNB__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[3], top); + uint32_t pattern_base_0 = top / 32; + + top = character_pattern_data(&character_patterns[0], top); + uint32_t pattern_base_1 = top / 32; + + top = character_pattern_data(&character_patterns[1], top); + uint32_t pattern_base_2 = top / 32; + + top = character_pattern_data(&character_patterns[2], top); + uint32_t pattern_base_3 = 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); + + pattern_name_table_data(&pattern_name_tables[2], + plane_c_offset, + pattern_base_2); + + pattern_name_table_data(&pattern_name_tables[3], + plane_d_offset, + pattern_base_3); + + int sx = 0; + int sy = 0; + int dsx = 1; + int dsy = 0; + + vdp2.reg.CYCA0 = 0x0123ffff; + vdp2.reg.CYCA1 = 0x0123ffff; + vdp2.reg.CYCB0 = 0x4567ffff; + vdp2.reg.CYCB1 = 0x4567ffff; + + while (true) { + vdp2.reg.SCXIN0 = sx >> 3; + 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; + + vdp2.reg.SCXN2 = sx >> 1; + vdp2.reg.SCYN2 = sy >> 1; + + vdp2.reg.SCXN3 = sx >> 0; + vdp2.reg.SCYN3 = -96; + + if ((sx >> 2) >= 640 + 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); + } +}