From af193ba5d6ff096b19c7f67d4da696cf0e1dedcd Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 16 Jan 2024 08:13:58 +0200 Subject: [PATCH] constrained parallax scrolling --- src/data.s | 2 ++ src/part_dna.c | 15 +++++++++++++++ src/part_simba.c | 40 ++++++++++++++++++++++++++++++++++------ 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/data.s b/src/data.s index c36ae73..81ebd47 100644 --- a/src/data.s +++ b/src/data.s @@ -12,6 +12,8 @@ .globl simbabg_cmap_end .globl simbabg_tmap .globl simbabg_tmap_end + .globl simbafg_data + .globl simbafg_data_end .globl simbafg_cmap .globl simbafg_cmap_end .globl simbafg_tmap diff --git a/src/part_dna.c b/src/part_dna.c index 2b5b6aa..af6bc98 100644 --- a/src/part_dna.c +++ b/src/part_dna.c @@ -36,6 +36,21 @@ void dna_init(void) void dna_start(void) { + short i; + + /* setup tilemaps */ + vdp_setup_addr(VDP_VRAM, 0xc000); /* nametable A */ + for(i=0; i<2048; i++) { + VDP_DATA = 0; + } + vdp_setup_addr(VDP_VRAM, 0xe000); /* nametable B */ + for(i=0; i<2048; i++) { + VDP_DATA = 0; + } + + vdp_setup_addr(VDP_VRAM, 0xf000); /* hscroll table is at f000, see vdp.S */ + VDP_DATA = 0; + VDP_DATA = 0; } void dna_update(void) diff --git a/src/part_simba.c b/src/part_simba.c index a10e5fd..ea6f3ae 100644 --- a/src/part_simba.c +++ b/src/part_simba.c @@ -3,12 +3,19 @@ #include "vdp.h" #include "pad.h" #include "parts.h" +#include "debug.h" + +#define BGTILES_OFFS 1 +#define FGTILES_OFFS 4 extern uint16_t simbabg_data[], simbabg_data_end[]; extern unsigned char simbabg_cmap[], simbabg_cmap_end[]; extern uint16_t simbabg_tmap[], simbabg_tmap_end[]; +extern uint16_t simbafg_data[], simbafg_data_end[]; +extern unsigned char simbafg_cmap[], simbafg_cmap_end[]; +extern uint16_t simbafg_tmap[], simbafg_tmap_end[]; -static int scroll; +static short scroll; void simba_init(void) { @@ -16,10 +23,16 @@ void simba_init(void) /* upload tiles */ src = simbabg_data; - vdp_setup_addr(VDP_VRAM, 32); /* start from tile 1 32 bytes on */ + vdp_setup_addr(VDP_VRAM, BGTILES_OFFS * 32); /* start from tile 1 32 bytes on */ while(src < simbabg_data_end) { VDP_DATA = *src++; } + + src = simbafg_data; + vdp_setup_addr(VDP_VRAM, FGTILES_OFFS * 32); + while(src < simbafg_data_end) { + VDP_DATA = *src++; + } } void simba_start(void) @@ -29,10 +42,15 @@ void simba_start(void) unsigned char *cptr; /* setup tilemaps */ + src = simbafg_tmap; + vdp_setup_addr(VDP_VRAM, 0xc000); /* nametable A */ + while(src < simbafg_tmap_end) { + VDP_DATA = VDP_TILENAME(*src++ + FGTILES_OFFS, 3, 0); + } src = simbabg_tmap; vdp_setup_addr(VDP_VRAM, 0xe000); /* nametable B */ while(src < simbabg_tmap_end) { - VDP_DATA = VDP_TILENAME(*src++ + 1, 2, 0); + VDP_DATA = VDP_TILENAME(*src++ + BGTILES_OFFS, 2, 0); } /* setup colormaps */ @@ -41,23 +59,33 @@ void simba_start(void) vdp_setcolor(2, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4); cptr += 3; } + cptr = simbafg_cmap; + for(i=0; i<16; i++) { + vdp_setcolor(3, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4); + cptr += 3; + } /* set scrolling to whole screen */ vdp_setreg(VDP_REG_MODE3, 0); + scroll = 0; + vdp_setup_addr(VDP_VRAM, 0xf000); /* hscroll table is at f000, see vdp.S */ + VDP_DATA = 0; + VDP_DATA = 0; } void simba_update(void) { if(bnstate & PAD_LEFT) { - if(scroll > 0) scroll--; + if(scroll < 0) scroll++; } else if(bnstate & PAD_RIGHT) { - if(scroll < 511) scroll++; + if(scroll > -192) scroll--; } + dbgval[0] = scroll; } void simba_vblank(void) { vdp_setup_addr(VDP_VRAM, 0xf000); /* hscroll table is at f000, see vdp.S */ - VDP_DATA = 0; VDP_DATA = scroll; + VDP_DATA = scroll >> 1; } -- 1.7.10.4