dos33fsprogs/glados3.3/asm/speaker_timing.c
Vince Weaver 18a66c1427 glados: start work on some assembly code
having trouble figuring out the cycle counts on the sound routine
2017-01-16 23:59:11 -05:00

75 lines
1.1 KiB
C

#include <stdio.h>
int main(int argc, char **argv) {
long long cycles=0,last=0;
int x,y;
int f,d;
f=76; // a (should be 440Hz?)
// f=128; // c (should be 261Hz?)
d=108; // 1/2 note
x=f;
y=d;
while(1) {
//
// f=1/T
//
//music_loop:
y--; //dey ; Y never set?
if (y<0) y=255;
cycles+=2;
cycles+=2;
if (y!=0) {
cycles++;
//goto loop; //bne loop
}
else {
d--; // dec $0301
cycles+=6;
// printf("d=%d cycles=%lld\n",d,cycles);
cycles+=2;
if (d==0) { // beq music_done
cycles++;
break;
}
}
// loop
x--; // dex
cycles+=2;
cycles+=2;
if (x!=0) { // bne music_loop
cycles++;
//goto music_loop;
}
else {
x=f; // ldx $0300
cycles+=4;
//jmp click_speaker
cycles+=3;
cycles+=4; //lda $C030 ; click the speaker
printf("period=%lld us, f=%lf Hz, should be %lf\n",
cycles-last,1023000.0/((cycles-last)*2),
1000000.0/880);
last=cycles;
}
}
printf("Total cycles: %lld, %lf seconds\n",
cycles,cycles/1023000.0);
return 0;
}