1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-08-09 20:25:17 +00:00
Files
kickc/src/test/kc/examples/rotate/rotate.kc
2018-10-19 02:26:42 +02:00

87 lines
2.0 KiB
Plaintext

// Angles: sf[0.8] : $80=PI, $100 = 2*PI
// Values: sin(x) in [-1;1] sf[0.16] : -1.0: -$7fff 1.0:$7fff
import "c64"
import "fastmultiply"
byte* SCREEN = $0400;
byte* SPRITE = $3000;
byte* COS = $2000;
byte* SIN = COS+$40; // sin(x) = cos(x+PI/2)
void main() {
asm { sei }
init();
anim();
}
void init() {
mulf_init();
*SPRITES_ENABLE = %11111111;
byte* sprites_ptr = SCREEN+$3f8;
byte spr_x = 60;
for(byte i: 0..7) {
byte i2 = i<<1;
sprites_ptr[i] = (byte)(SPRITE/$40);
SPRITES_XPOS[i2] = spr_x;
SPRITES_YPOS[i2] = spr_x;
SPRITES_COLS[i] = GREEN;
spr_x += 24;
}
}
void anim() {
signed word min = 1000;
signed word max = -1000;
byte angle = 0;
signed byte x = 89; // signed fixed[7.0]
signed byte y = 0;
while(true) {
while(*RASTER!=$ff) {}
(*BORDERCOL)++;
signed byte cos_a = (signed byte) COS[angle]; // signed fixed[0.7]
mulf8s_prepare(cos_a);
signed word xr = mulf8s_prepared(x)<<1; // signed fixed[8.8]
signed word yr = mulf8s_prepared(y)<<1; // signed fixed[8.8]
signed byte sin_a = (signed byte) SIN[angle]; // signed fixed[0.7]
mulf8s_prepare(sin_a);
xr -= mulf8s_prepared(y)<<1; // signed fixed[8.8]
yr += mulf8s_prepared(x)<<1; // signed fixed[8.8]
signed word xpos = ((signed byte) >xr) + 89 + 24 + 60;
SPRITES_XPOS[0] = <xpos;
*SPRITES_XMSB = >xpos;
//signed word ypos = ((signed byte) >yr) + 89 + 51;
byte ypos = (>yr) + 89 + 51;
SPRITES_YPOS[0] = ypos;
angle++;
(*BORDERCOL)--;
}
}
kickasm(pc COS) {{
{
.var min = -$7fff
.var max = $7fff
.var ampl = max-min;
.for(var i=0;i<$140;i++) {
.var rad = i*2*PI/256;
.byte >round(min+(ampl/2)+(ampl/2)*cos(rad))
}
}
}}
kickasm(pc SPRITE, resource "balloon.png") {{
.var pic = LoadPicture("balloon.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}}