gigatron/extensions/sound card/glcc/sn76489_test.c
2025-01-28 19:17:01 +03:00

254 lines
5.8 KiB
C

/*******************************************************************************\
* The examples from the SN76489 Applications report were used for testing *
* https://prof-80.fr/images/ChromaTrs/ChromaTrs/SN76489A_ApplicationsReport.pdf *
\*******************************************************************************/
#include <stdio.h>
#include <string.h>
#include <gigatron/sys.h>
#include <gigatron/console.h>
#include <gigatron/libc.h>
#include <stdarg.h>
char c,a,b,i,j,d,z;
int s,timer;
void wr_sn76489(char val)
{
SYS_ExpanderControl(0x0010 | (val << 8)); // send data to 74377
SYS_ExpanderControl(0x0000); // /WR on low
SYS_ExpanderControl(0x0100); // /WR on high (approx. 242 us)
}
/*
10 REM ** BOMB DROP AND EXPLOSION **
20 N=7; REM PORT NUMBER OF SN76489
30 OUT N, 159; REM TURN OFF TONE 1
40 OUT N, 191; REM TURN OFF TONE 3
50 OUT N, 223; REM TURN OFF TONE 4
60 OUT N, 255; REM TURN OFF NOISE
70 OUT N, 144; REM SET TONE 1 VOLUME
80 FOR J=5 TO 17; REM BYTE 2 SWEEP
90 FOR I=128 TO 143; REM BYTE 1 SWEEP
100 OUT N, I; OUT N, J; REM OUTPUT TONES
110 FOR D=0 TO 10; NEXT D; REM DELAY LOOP
120 NEXT I
130 NEXT J
140 OUT N, 159; REM TURN TONE 1 OFF
150 OUT N, 228; REM SET NOISE TO HIGH PITCH
160 FOR I=240 TO 255; REM SET NOISE VOLUME
170 OUT N, I; REM OUTPUT NOISE
180 FOR D=0 TO 75; NEXT D; REM DELAY LOOP
190 NEXT I
*/
void bomb()
{
wr_sn76489(159); // 0x9f turn off tone 1
wr_sn76489(191); // 0xbf turn off tone 2
wr_sn76489(223); // 0xdf turn off tone 3
wr_sn76489(255); // 0xff turn off noise
wr_sn76489(144); // 0x90 set tone 1 volume
j=5; // FOR J=5 TO 17; REM BYTE 2 SWEEP
while(j<=17)
{
i=128; // FOR I=128 TO 143; REM BYTE 1 SWEEP
while(i<=143)
{
wr_sn76489(i);
wr_sn76489(j);
// d=0; while(d<25) d=d+1;
_wait(1);
i++;
}
j++;
}
wr_sn76489(159); // 0x9f turn off tone 1
wr_sn76489(228); // 0xe4 set noise to high pitch
i=240; // FOR I=240 TO 255; REM SET NOISE VOLUME
//while(i<=255){ // for i type integer
while(i!=0){ // for i type char
wr_sn76489(i);
//d=0; while(d<120) d=d+1;
_wait(4);
i++;
}
}
/*
10 REM ** BELL OR CHIME **
20 N=7; REM PORT NUMBER OF SN76489
30 OUT N, 159; REM TURN OFF TONE 1
40 OUT N, 191; REM TURN OFF TONE 3
50 OUT N, 223; REM TURN OFF TONE 4
60 OUT N, 255; REM TURN OFF NOISE
70 OUT N, 140; REM TONE 1 AT 679HZ
80 OUT N, 5
90 OUT N, 170; REM TONE 2 AT 694HZ
100 OUT N, 5
110 FOR B=0 TO 11; REM B=NUMBER OF BELLS
120 FOR I=145 TO 159; REM LOOP TO GENERATE VOLUME STEPS
130 OUT N, I; OUT N, (I+32); REM CHANGE VOLUME FOR TONE 1&2
140 FOR D=0 TO 75; NEXT D; REM DELAY LOOP
150 NEXT I
160 NEXT B
190 PRINT "END OF SOUND"
*/
void bell()
{
wr_sn76489(159); // 0x9f turn off tone 1
wr_sn76489(191); // 0xbf turn off tone 2
wr_sn76489(223); // 0xdf turn off tone 3
wr_sn76489(255); // 0xff turn off noise
wr_sn76489(140); // REM TONE 1 AT 679HZ
wr_sn76489(5);
wr_sn76489(170); // REM TONE 2 AT 694HZ
wr_sn76489(5);
b=0; // FOR B=0 TO 11
while(b<=11)
{
i=145; // FOR I=145 TO 159
while(i<=159)
{
wr_sn76489(i);
wr_sn76489(i+32);
//d=0; while(d<150) d=d+1;
_wait(4);
i++;
}
b++;
}
}
/*
10 REM ** BASIC BIRD SOUND **
20 N=7; REM PORT NUMBER OF SN76489
30 OUT N, 159; REM TURN OFF TONE 1
40 OUT N, 191; REM TURN OFF TONE 3
50 OUT N, 223; REM TURN OFF TONE 4
60 OUT N, 255; REM TURN OFF NOISE
70 Z=RND(10); REM CHIRP LENGTH 1-10
80 OUT N, 144; REM SET TONE 1 VOLUME
90 FOR I=0 TO 15; REM START CHIRP LOOP
100 OUT N, (128+I); REM FREQ FROM 3906-2016 HZ
110 OUT N, 1
120 FOR D=0 TO Z; NEXT D; REM DELAY BY RND AMOUNT
130 NEXT I
140 S=S+Z; REM COUNTER
150 IF S < 200 GOTO 70
160 OUT N, 159; REM TURN OFF TONE 1
*/
void bird()
{
wr_sn76489(159); // 0x9f turn off tone 1
wr_sn76489(191); // 0xbf turn off tone 2
wr_sn76489(223); // 0xdf turn off tone 3
wr_sn76489(255); // 0xff turn off noise
s=0;
while(s<200)
{
z=(rand()%10)+1; // REM CHIRP LENGTH 1-10
wr_sn76489(144); // REM SET TONE 1 VOLUME
i=0; // FOR I=0 TO 15; REM START CHIRP LOOP
while(i<=15)
{
wr_sn76489(i+128);
wr_sn76489(1);
d=0; while(d<=z) d=d+1;
i++;
}
s=s+z;
}
wr_sn76489(159); // REM TURN OFF TONE 1
}
/*
10 REM ** MISSILE SOUND **
20 N=7; REM PORT NUMBER OF SN76489
30 OUT N, 159; REM TURN OFF TONE 1
40 OUT N, 191; REM TURN OFF TONE 3
50 OUT N, 223; REM TURN OFF TONE 4
60 OUT N, 255; REM TURN OFF NOISE
70 OUT N, 231; REM SET NOISE TONE
80 OUT N, 240; REM SET NOISE VOLUME
90 FOR B=0 TO 15; REM LOOP FOR SECOND BYTE
100 FOR A=192 TO 207;REM LOOP FOR FIRST BYTE
110 OUT N, A; OUT N, B; REM OUTPUT TONES
120 NEXT A
130 OUT N, (240+B); REM DECREASE VOLUME
140 NEXT B
150 GOTO 30
*/
void missile()
{
wr_sn76489(159); // 0x9f turn off tone 1
wr_sn76489(191); // 0xbf turn off tone 2
wr_sn76489(223); // 0xdf turn off tone 3
wr_sn76489(255); // 0xff turn off noise
wr_sn76489(231); // REM SET NOISE TONE
wr_sn76489(240); // REM SET NOISE VOLUME
b=0; // FOR B=0 TO 15; REM LOOP FOR SECOND BYTE
while(b<=15)
{
a=192; // FOR A=192 TO 207;REM LOOP FOR FIRST BYTE
while(a<=207)
{
wr_sn76489(a);
wr_sn76489(b);
a++;
}
wr_sn76489(b+240);
b++;
}
wr_sn76489(159); // REM TURN OFF TONE 1
}
void main()
{
SYS_ExpanderControl(0x0100); // /WR on high
for(;;){
console_clear_screen();
printf("1 = Bomb\n");
printf("2 = Bird\n");
printf("3 = Bell\n");
printf("4 = Missile\n");
printf("a = all\n");
printf("? ");
c = getchar();
switch(c) {
case '1':
bomb();
break;
case '2':
bird();
break;
case '3':
bell();
break;
case '4':
missile();
break;
case 'a':
bomb();
bird();
bell();
missile();
break;
}
wr_sn76489(159); // 0x9f turn off tone 1
wr_sn76489(191); // 0xbf turn off tone 2
wr_sn76489(223); // 0xdf turn off tone 3
wr_sn76489(255); // 0xff turn off noise
}
}