91 lines
1.7 KiB
C
91 lines
1.7 KiB
C
#include <c64/vic.h>
|
|
#include <c64/rasterirq.h>
|
|
#include <c64/sprites.h>
|
|
#include <math.h>
|
|
|
|
#define Screen ((char *)0x400)
|
|
|
|
// make space until 0x2000 for code and data
|
|
|
|
#pragma region( lower, 0x0a00, 0x2000, , , {code, data} )
|
|
|
|
// then space for our sprite data
|
|
|
|
#pragma section( spriteset, 0)
|
|
|
|
#pragma region( spriteset, 0x2000, 0x2800, , , {spriteset} )
|
|
|
|
// everything beyond will be code, data, bss and heap to the end
|
|
|
|
#pragma region( main, 0x2800, 0xa000, , , {code, data, bss, heap, stack} )
|
|
|
|
|
|
// spriteset at fixed location
|
|
|
|
#pragma data(spriteset)
|
|
|
|
char spriteset[2048] = {
|
|
#embed "../resources/digitsprites.bin"
|
|
};
|
|
|
|
#pragma data(data)
|
|
|
|
// sinus table for circular movement
|
|
|
|
int sintab[128];
|
|
|
|
int main(void)
|
|
{
|
|
// calculate sine table
|
|
for(int i=0; i<128; i++)
|
|
sintab[i] = (int)(80 * sin(i * PI / 64));
|
|
|
|
// enable raster interrupt via kernal path
|
|
rirq_init(true);
|
|
|
|
// initialize sprite multiplexer
|
|
vspr_init(Screen);
|
|
|
|
// initalize sprites
|
|
for(int i=0; i<16; i++)
|
|
{
|
|
vspr_set(i, 30 + 16 * i, 220 - 8 * i, (unsigned)&(spriteset[0]) / 64 + i, (i & 7) + 8);
|
|
}
|
|
|
|
// initial sort and update
|
|
vspr_sort();
|
|
vspr_update();
|
|
rirq_sort();
|
|
|
|
// start raster IRQ processing
|
|
rirq_start();
|
|
|
|
// animation loop
|
|
unsigned j = 0;
|
|
for(;;)
|
|
{
|
|
// move sprites around
|
|
char k = j >> 4;
|
|
for(char i=0; i<16; i++)
|
|
{
|
|
vspr_move(i, 200 + sintab[(j + 8 * i) & 127] + sintab[k & 127], 140 + sintab[(j + 8 * i + 32) & 127] + sintab[(k + 32) & 127]);
|
|
}
|
|
j++;
|
|
|
|
// sort virtual sprites by y position
|
|
vspr_sort();
|
|
|
|
// wait for raster IRQ to reach and of frame
|
|
rirq_wait();
|
|
|
|
// update sprites back to normal and set up raster IRQ for second set
|
|
vspr_update();
|
|
|
|
// sort raster IRQs
|
|
rirq_sort();
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|