2024-10-15 17:04:49 +00:00
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
//#link "common.c"
|
|
|
|
|
|
|
|
#include "rasterirq.h"
|
2024-10-30 18:58:10 +00:00
|
|
|
//#link "rasterirq.s"
|
2024-10-15 17:04:49 +00:00
|
|
|
|
|
|
|
#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;
|
|
|
|
}
|
|
|
|
}
|