/* * Utility for testing AY-3-8910 * * Lumir Vanek vanekl.nospam@valachnet.cz */ // AY-3-8910 addresses #define data_port 0xd0 #define register_port 0xd8 #include #include #include #include #include // compile for RC2014 (CPM) using Z88dk : // zcc +cpm -vn tstsnd.c -create-app -o tstsnd.bin // prototypes void delay(int); void soundA(int dly, int coarse, int fine, int amplitude, int envelopeCoarse, int envelopeFine); void soundB(int dly, int coarse, int fine, int amplitude, int envelopeCoarse, int envelopeFine); void nosound(); int main() { int coarse; int fine; int amplitude; int envelopeCoarse; int envelopeFine; while(true) { printf("Enter coarse\n"); scanf("%d", &coarse); printf("Enter fine\n"); scanf("%d", &fine); printf("Enter amplitude: 0 - 15 or 16 for use Envelope\n"); scanf("%d", &litude); if (amplitude >= 16) { amplitude = 16; printf("Enter Envelope Coarse\n"); scanf("%d", &envelopeCoarse); printf("Enter Envelope Fine\n"); scanf("%d", &envelopeFine); } soundA(1000, coarse, fine, amplitude, envelopeCoarse, envelopeFine); delay(1000); soundB(1000, coarse, fine, amplitude, envelopeCoarse, envelopeFine); printf("\nESC to exit\n"); char ch = getch(); if(ch == 27) // ESC { break; } } return 0; } void delay(int val) { for (int i = 0; i < val; i++) { for (int j = 0; j < 50; j++) { ; } } } void soundA(int dly, int coarse, int fine, int amplitude, int envelopeCoarse, int envelopeFine) { outp(register_port, 7); if (amplitude < 16) { outp(data_port, 0b00111110); // Enable chn A on mixer, I/O ports set to Input } else { outp(data_port, 0b00111010); // Enable chn A+C on mixer, I/O ports set to Input } outp(register_port, 1); // Ch. A, coarse outp(data_port, coarse); outp(register_port, 0); // Ch. A, fine outp(data_port, fine); outp(register_port, 8); // Ch. A, volume outp(data_port, amplitude); //------------------------------------------------------------------------------------ if (amplitude >= 16) { outp(register_port, 5); // Ch. C, coarse outp(data_port, coarse); outp(register_port, 4); // Ch. C, fine outp(data_port, fine); outp(register_port, 13); // Envelope SHAPE/CYCLE CONTROL outp(data_port, 0b00001110); outp(register_port, 12); // Envelope coarse outp(data_port, envelopeCoarse); outp(register_port, 11); // Envelope fine outp(data_port, envelopeFine); } delay(dly); nosound(); } void soundB(int dly, int coarse, int fine, int amplitude, int envelopeCoarse, int envelopeFine) { outp(register_port, 7); if (amplitude < 16) { outp(data_port, 0b00111101); // Enable chn B on mixer, I/O ports set to Input }else { outp(data_port, 0b00111001); // Enable chn B+C on mixer, I/O ports set to Input } outp(register_port, 3); // Ch. B, coarse outp(data_port, coarse); outp(register_port, 2); // Ch. B, fine outp(data_port, fine); outp(register_port, 9); // Ch. B, volume outp(data_port, amplitude); //------------------------------------------------------------------------------------ if (amplitude >= 16) { outp(register_port, 5); // Ch. C, coarse outp(data_port, coarse); outp(register_port, 4); // Ch. C, fine outp(data_port, fine); outp(register_port, 13); // Envelope SHAPE/CYCLE CONTROL outp(data_port, 0b00001110); outp(register_port, 12); // Envelope coarse outp(data_port, envelopeCoarse); outp(register_port, 11); // Envelope fine outp(data_port, envelopeFine); } delay(dly); nosound(); } void nosound() { outp(register_port, 8); // Ch. A, volume outp(data_port, 0); outp(register_port, 9); // Ch. B, volume outp(data_port, 0); outp(register_port, 10); // Ch. C, volume outp(data_port, 0); outp(register_port, 5); // Ch. C, coarse outp(data_port, 0); outp(register_port, 4); // Ch. C, fine outp(data_port, 0); outp(register_port, 13); // Envelope SHAPE/CYCLE CONTROL outp(data_port, 0b00000000); outp(register_port, 7); outp(data_port, 0b00111111); // Disable all chanels, I/O ports set to Input }