1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-11-21 07:33:14 +00:00
8bitworkshop/presets/c64/linecrunch.c
2024-11-05 15:55:35 -06:00

96 lines
1.6 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 scroll_y = 0;
byte target_line = 0;
///// FUNCTIONS
void line_crunch() {
// load scroll y
asm("lda %v", scroll_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");
}
void display_list(void) {
// set initial YSCROLL
VIC.ctrl1 = 0x18 | (scroll_y & 7);
// do line crunch?
if (scroll_y < 24) {
// wait for target line
target_line = 47 + (scroll_y & 7);
while (VIC.rasterline != target_line) { }
// increment YSCROLL
scroll_y++;
line_crunch();
// do additional line crunches?
if (scroll_y < 17) {
scroll_y++;
line_crunch();
if (scroll_y < 10) {
scroll_y++;
line_crunch();
}
}
}
VIC.bgcolor[0] = COLOR_CYAN;
VIC.bordercolor = COLOR_BLUE;
DLIST_RESTART(40);
}
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;
scroll_y = sinustable[frame] >> 3;
}
}