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

73 lines
1.7 KiB
C

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <peekpoke.h>
#include <string.h>
#include <c64.h>
#include <cbm_petscii_charmap.h>
#include "sidmacros.h"
#include "common.h"
//#link "common.c"
void digi_setup(void) {
SID.v1.sr = 0xFF; // Voice 1 Sustain/Release
SID.v2.sr = 0xFF; // Voice 2 Sustain/Release
SID.v3.sr = 0xFF; // Voice 3 Sustain/Release
SID.v1.ctrl = 0x49; // Voice 1 Control Register
SID.v2.ctrl = 0x49; // Voice 2 Control Register
SID.v3.ctrl = 0x49; // Voice 3 Control Register
}
void cia2_wait() {
byte timer = CIA2.ta_lo;
while (CIA2.ta_lo < timer) ;
}
void digi_play(const char* snd, unsigned int len) {
unsigned int i; // loop counter
VIC.ctrl1 = 0; // disable video
asm("sei"); // disable interrupts
// setup CIA #2 timer
CIA2.cra = 0x00; // stop timer A
CIA2.ta_lo = IS_PAL() ? 123 : 128; // set lower timer value
CIA2.ta_hi = 0; // set upper timer value
CIA2.cra = 0x11; // start timer, continuous mode
// loop through all samples
for (i = 0; i < len; i++) {
// wait for timer to reset
cia2_wait();
// send upper 4-bit sample
SID.amp = snd[i] >> 4;
// wait for timer to reset
cia2_wait();
// send lower 4-bit sample
SID.amp = snd[i] & 15;
// make a video effect
VIC.bordercolor = i;
}
asm("cli"); // enable interrupts
VIC.ctrl1 = 0x1b; // enable video
CIA2.cra = 0x00; // stop timer A
VIC.bordercolor = COLOR_BLUE;
}
#ifdef __MAIN__
const char digisound[] = {
#embed "springchicken-b4.raw"
};
void main(void) {
clrscr();
digi_setup();
while (1) {
digi_play(digisound, sizeof(digisound));
printf("\nPress ENTER to restart digi...\n");
getchar();
}
}
#endif