From 196421f047414a192f285c8e98346a4595da2d46 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Fri, 27 Jul 2018 15:53:20 +0300 Subject: [PATCH] sprite test --- fs-uae.conf | 2 +- src/amiga/copper.c | 4 ++-- src/amiga/copper.h | 2 +- src/amiga/main.c | 17 ++++++++--------- src/data.h | 14 ++++++++++++++ src/game.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ tools/conv_sprite | 3 +++ tools/conv_sprite.c | 6 +++--- 8 files changed, 84 insertions(+), 16 deletions(-) diff --git a/fs-uae.conf b/fs-uae.conf index fa9c69e..e57d193 100644 --- a/fs-uae.conf +++ b/fs-uae.conf @@ -4,7 +4,7 @@ floppies_dir = $HOME/amiga/disks floppy_overlays_dir = $HOME/amiga/disks kickstarts_dir = $HOME/amiga/rom logs_dir = $HOME/amiga/logs -screenshots_output_dir = $HOME/amiga/shots +screenshots_output_dir = . floppy_drive_speed = 0 floppy_drive_volume = 0 kickstart_file = $HOME/amiga/rom/kickstart-1.3.rom diff --git a/src/amiga/copper.c b/src/amiga/copper.c index 2c22d8a..bee6a8a 100644 --- a/src/amiga/copper.c +++ b/src/amiga/copper.c @@ -7,14 +7,14 @@ static int mode, copmem_size; extern uint32_t **_mem_start; -int init_copper(int maxlist, int nlists) +int init_copper(uint32_t *cmem, int maxlist, int nlists) { /* allocate and set new copper lists */ if(maxlist <= 0) maxlist = 256; mode = nlists >= COPPER_DOUBLE ? COPPER_DOUBLE : COPPER_SINGLE; copmem_size = maxlist * 4 * mode; - copmem = *_mem_start; + copmem = cmem ? cmem : *_mem_start; curlist = copperlist = copmem; *curlist = COPPER_END; diff --git a/src/amiga/copper.h b/src/amiga/copper.h index 3e64315..29be226 100644 --- a/src/amiga/copper.h +++ b/src/amiga/copper.h @@ -21,7 +21,7 @@ enum { COPPER_DOUBLE = 2 }; -int init_copper(int maxlist, int nlists); +int init_copper(uint32_t *cmem, int maxlist, int nlists); void cleanup_copper(void); /* enables copper DMA */ diff --git a/src/amiga/main.c b/src/amiga/main.c index 354f1d6..44112f5 100644 --- a/src/amiga/main.c +++ b/src/amiga/main.c @@ -4,7 +4,7 @@ #include "gfx.h" #include "game.h" -static uint32_t coplist[32]; +static uint32_t coplist[64]; int main(void) { @@ -23,21 +23,20 @@ int main(void) wait_vblank(); - uint32_t *copptr = coplist; + init_copper(coplist, 32, COPPER_SINGLE); for(i=0; i> 16); - *copptr++ = COPPER_MOVE(reg + 2, addr); + add_copper(COPPER_MOVE(reg, addr >> 16)); + add_copper(COPPER_MOVE(reg + 2, addr)); } - *copptr = COPPER_END; - REG32_COP1LC = (uint32_t)coplist; - REG_COPJMP1 = 0; - - REG_DMACON = SETBITS(DMA_BPL | DMA_COPPER | DMA_BLITTER | DMA_MASTER); + *copperlist_end = COPPER_END; game_init(); + wait_vblank(); + REG_DMACON = SETBITS(DMA_BPL | DMA_COPPER | DMA_BLITTER | DMA_SPRITE | DMA_MASTER); + for(;;) { wait_vblank(); game_draw(); diff --git a/src/data.h b/src/data.h index 7cb952a..ee1ae41 100644 --- a/src/data.h +++ b/src/data.h @@ -1,7 +1,21 @@ #ifndef DATA_H_ #define DATA_H_ +#include + extern unsigned char test_tile[]; extern unsigned char test_tile_mask[]; +extern uint16_t spr0a[]; +extern uint16_t spr0b[]; +extern uint16_t spr1a[]; +extern uint16_t spr1b[]; +extern uint16_t spr2a[]; +extern uint16_t spr2b[]; +extern uint16_t sprpal[]; + +#define SPRITE_SLICES 3 +#define SPRITE_HEIGHT 48 +#define NUM_HWSPRITES (SPRITE_SLICES * 2) + #endif /* DATA_H_ */ diff --git a/src/game.c b/src/game.c index 97c1895..37c39b2 100644 --- a/src/game.c +++ b/src/game.c @@ -1,6 +1,7 @@ #include #include "game.h" #include "gfx.h" +#include "copper.h" #include "data.h" #include "hwregs.h" /* XXX */ @@ -10,9 +11,22 @@ void draw_tile(int tid, int x, int y, int light); +static uint16_t *sprdata[NUM_HWSPRITES]; +static uint16_t nullspr[] = { + 0x2000, 0x2100, + 0x0000, 0x0000, + 0x0000, 0x0000 +}; + +#define SPR_POS(x, y) \ + (((uint16_t)((x) + 0x40) & 0xff) | ((uint16_t)((y) + 0x2c) << 8)) + int game_init(void) { + int i, sprpos[] = {136, 76}; + uint32_t nullspr_addr = (intptr_t)nullspr; + REG_COLOR0 = 0x221; REG_COLOR1 = 0x222; REG_COLOR2 = 0x332; @@ -22,6 +36,42 @@ int game_init(void) REG_COLOR6 = 0x654; REG_COLOR7 = 0x765; + for(i=0; i<16; i++) { + REG_COLOR_PTR[i + 16] = sprpal[i]; + } + + sprdata[0] = spr0a; + sprdata[1] = spr0b; + sprdata[2] = spr1a; + sprdata[3] = spr1b; + sprdata[4] = spr2a; + sprdata[5] = spr2b; + + for(i=0; i<8; i++) { + int reg = REGN_SPR0PTH + i * 4; + if(i < NUM_HWSPRITES) { + uint16_t sx, sy, vstop; + /* initialize active sprites, and set the sprite pointers */ + uint32_t addr = (intptr_t)sprdata[i]; + add_copper(COPPER_MOVE(reg, addr >> 16)); + add_copper(COPPER_MOVE(reg + 2, addr)); + + sx = 0x80 + sprpos[0] + (i >> 1) * 16; + sy = 0x2c + sprpos[1]; + vstop = sy + SPRITE_HEIGHT; + + sprdata[i][0] = (sx >> 1) | (sy << 8); + sprdata[i][1] = (vstop << 8) | ((vstop >> 7) & 2) | + (sx & 1) | ((i & 1) ? 0x80 : 0); + } else { + /* point the sprite pointers to the null sprite for the rest */ + add_copper(COPPER_MOVE(reg, nullspr_addr >> 16)); + add_copper(COPPER_MOVE(reg + 2, nullspr_addr)); + } + } + + *copperlist_end = COPPER_END; + return 0; } @@ -32,6 +82,8 @@ void game_draw(void) { int i, j, xoffs, yoffs, ntiles; + /* reset sprite data */ + yoffs = 0; for(i=0; i unsigned char +sed -i 's/static char/static unsigned char/' "$1" + cc -pedantic -Wall -DHDRFILE=\"$1\" -o /tmp/conv_sprite.bin conv_sprite.c if [ $? != 0 ]; then exit 1 diff --git a/tools/conv_sprite.c b/tools/conv_sprite.c index ff50a6a..c545584 100644 --- a/tools/conv_sprite.c +++ b/tools/conv_sprite.c @@ -48,14 +48,14 @@ static void conv_sprite(int slice, unsigned char *img, int width, int height, in for(i=0; i<2; i++) { printf("\n\t.global spr%d%c\n", slice, i == 0 ? 'a' : 'b'); printf("spr%d%c:\n", slice, i == 0 ? 'a' : 'b'); - printf("\t.short 0\n"); /* position x/y */ - printf("\t.short 0\n"); /* vstop */ + printf("\t.short 0, 0\n"); /* position x/y, vstop */ sprdata = malloc(height * 2 * sizeof *sprdata); conv_img_data(i, sprdata, img, width, height, pitch); for(j=0; j