1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-11-25 03:34:05 +00:00
8bitworkshop/presets/c64/fld.c
2024-11-05 15:55:35 -06:00

108 lines
2.0 KiB
C

#include "common.h"
//#link "common.c"
#include "rasterirq.h"
//#link "rasterirq.s"
#include "bcd.h"
//#link "bcd.c"
extern const unsigned char sinustable[0x100];
//#link "sinustable.c"
///// VARIABLES
byte frame = 0;
byte target_y;
byte fld_offsets[25];
///// FUNCTIONS
void line_crunch() {
// load scroll y
asm("lda %v", target_y);
asm("and #7");
asm("ora #$18");
asm("tax");
// get current raster line
asm("lda $d012");
// wait for next raster line
asm("@loop:");
asm("cmp $d012");
asm("beq @loop");
// set y scroll (ctrl1)
asm("stx $d011");
}
static byte target_line = 0;
static byte row;
static byte offset;
void display_list(void) {
VIC.bgcolor[0] = COLOR_CYAN;
VIC.bordercolor = COLOR_BLUE;
// set initial YSCROLL
SET_SCROLL_Y(fld_offsets[0]);
// set first target scanline
target_line = 48 + (fld_offsets[0] & 7);
// each row has its own FLD gap
for (row=1; row<25; row++) {
// get this row's gap distance
offset = fld_offsets[row];
// fire IRQ 3 lines before target
target_y = target_line - 3;
DLIST_NEXT(target_y);
// change Y scroll to avoid badline
line_crunch();
// set Y scroll for new badline
target_y = target_line + offset;
line_crunch();
// set target line for next IRQ
target_line += 8 + offset;
VIC.bgcolor[0] = row;
// exit loop if integer overflow
if (target_line < 48) break;
}
DLIST_RESTART(30);
}
void main() {
int i;
clrscr();
memset(COLOR_RAM, COLOR_BLUE, 1000);
for (i=0; i<40*25; i++)
POKE(0x400 + i, 205 + (rand() & 1));
for (i=40*25; i<1024; i++)
POKE(0x400 + i, i);
for (i=0; i<1024; i+=40)
POKE(0x400 + i, 122);
SET_VIC_BITMAP(0x1000);
DLIST_SETUP(display_list);
// game loop, repeat forever
while (1) {
// wait for end of frame
waitvsync();
// animate and set scroll_y
frame += 4;
// set FLD offsets via sinus table
for (i=0; i<25; i++) {
fld_offsets[i] = sinustable[frame + i*8] >> 5;
}
}
}