/* GUSTEST.C --- example program using GUS C routine library Michael Chen mchen@cs.psu.edu 4/18/1993 See the included .TXT file for terms and other information. */ #include "gus.h" #include #include #include void PlaySampleFile(char* buf, int SampleBits, unsigned int pfreq, int sgnd, int SwapBytes) { FILE* File; longword bytes; longword inc; byte* dbuf; char fn[128]; byte mode, vc; longword sstart, pos, lstart, lend; word freq; word vol; strcpy(fn,buf); if (strchr(fn,'.') == NULL) strcat(fn,".SAM"); File = fopen(fn,"rb"); if (File == NULL) { printf("Error opening sample file %s.\n",buf); exit(3); } /* Load sample into GUS memory. */ for (bytes = 16384; bytes > 0; bytes >>= 1) { dbuf = (byte*) calloc(sizeof(byte),bytes); if (dbuf != NULL) break; } if (bytes) { printf("Allocated %ld bytes for data buffer.\n",bytes); } else { printf("Unable to allocate data buffer.\n"); exit(4); } sstart = 0x0; pos = sstart; if (sgnd) printf("Converting unsigned data.\n"); if ((SwapBytes) && (SampleBits > 8)) printf("Swapping data bytes.\n"); while (!feof(File)) { bytes = fread(dbuf,sizeof(byte),bytes,File); if ((SwapBytes) && (SampleBits > 8)) swab(dbuf,dbuf,bytes); /* Convert for signed */ if (sgnd) { for (inc = 0; inc < bytes; inc++) { if (SampleBits > 8) inc++; dbuf[inc] ^= 0x80; } } /* Write to GUS DRAM */ GUSSetDRAM(pos,dbuf,bytes); pos += bytes; if (bytes) { printf("\rRead %ld bytes from sample file %s (%ld total).", bytes,buf,pos); } else { printf("\rError reading from sample file %s. \n",buf); exit(5); } } pos--; printf("\r%79s\rDone loading sample data into GUS DRAM (%ld total).\n", "",pos-sstart+1); free(dbuf); if (fclose(File)) { printf("Error closing sample file %s.\n",buf);; exit(7); } /* Sample goes from sstart to pos. */ GUSStopVoice(0); GUSStopRamp(0); if (SampleBits == 8) { GUSSetVoiceMode(0,V_8Bit|V_Loop|V_Unidirectional|V_Forward); GUSSetVolumeControl(0,V_Loop|V_Unidirectional|V_StopRamp); GUSSetLoopEnd(0,pos); } else { GUSSetVoiceMode(0,V_16Bit|V_Loop|V_Unidirectional|V_Forward); GUSSetVolumeControl(0,V_Loop|V_Unidirectional|V_StopRamp); GUSSetLoopEnd(0,pos/2); } GUSSetLoopStart(0,sstart); GUSSetPosition(0,sstart); GUSSetVoices(MINVOICES); GUSSetVoiceFreq(0,pfreq); /* Should be ready... play until key pressed. */ printf("Now playing sample file %s; press any key to stop.\n",buf); GUSSetVolume(0,0xF800); GUSStartVoice(0); while (!kbhit()) { delay(100); mode = GUSReadVoiceMode(0); pos = GUSReadPosition(0); lstart = GUSReadLoopStart(0); lend = GUSReadLoopEnd(0); freq = GUSReadVoiceFreq(0); vol = GUSReadVolume(0); vc = GUSReadVolumeControl(0); printf( "pos 0x%05lx lst 0x%05lx end 0x%05lx frq %5ud vl 0x%04x vlc 0x%02x md 0x%02x\r", pos,lstart,lend,freq,vol,vc,mode); } getch(); printf("\n"); GUSStopVoice(0); printf("Done playing sample file %s.\n",buf); } void TestGUSDRAM(longword dram) { longword ul, inc; word base; printf("Testing DRAM.\n"); inc = 1; for (ul=0; ul < dram; ul += inc) { if (!(ul & 0xFFF)) printf("%05lx\r",ul); for (base=0xF; base < 0x100; base <<= 4) { if (GUSPokePeek(ul,base) != base) break; } if (base < 0x100) break; } if (ul != dram) { printf("Memory error at %ld (0x%05lx).\n",ul,ul); exit(2); } else { printf("Memory tests OK.\n"); } } void ZeroGUSDRAM(longword dram) { longword ul; printf("Clearing DRAM.\n"); /* for (ul=0; ul < dram; ul ++) { if (GUSPokePeek(ul,0)) break; } */ GUSFillDRAM(0,0,dram); ul = dram; if (ul != dram) { printf("Memory error at %ld (0x%05lx).\n",ul,ul); exit(2); } else { printf("Memory cleared OK.\n"); } } void DumpGUSDRAM(longword dram) { longword ul; int i; printf("Dumping DRAM.\n"); for (ul=0; (ul < dram) && (!kbhit()); ul += 24) { printf("%5lx:",ul); for (i=0; i < 24; i++) printf(" %2x",GUSPeek(ul+i)); printf("\n"); if ((ul/24+1) % 24 == 0) { getch(); } } if (ul != dram) { printf("Dump stopped at %ld (0x%05lx).\n",ul,ul); exit(2); } else { printf("Dump OK.\n"); } } void main(int argc, char* argv[]) { #define MAXARGS 16 int base; longword inc; longword ul; longword dram; longword bytes; byte* dbuf; byte buf[128]; byte b; word w; FILE* File; char *argps[MAXARGS]; int args = 0; long int OptionSet; unsigned int VoiceFreq = 22000; int DefaultOption = 1; int TestDRAM = 0; int PlaySample = 0; int SampleBits = 8; int ShowPorts = 0; int ZeroDRAM = 0; int DumpDRAM = 0; int Unsigned = 0; int SwapBytes = 0; printf("\nGUS Tester v1.22 by Michael Chen 4/18/1993\n"); /* Process options */ for (base = 1; base < argc; base++) { if ((*argv[base] == '-') || (*argv[base] == '/')) { switch (argv[base][2]) { case '+': OptionSet = 1; break; case '-': OptionSet = 0; break; case 0: OptionSet = DefaultOption; break; default: OptionSet = atol(&argv[base][2]); } switch (argv[base][1]) { case 't': TestDRAM = OptionSet; break; case 'f': VoiceFreq = OptionSet; break; case 'z': ZeroDRAM = OptionSet; break; case 'd': DumpDRAM = OptionSet; break; case 'u': Unsigned = OptionSet; break; case 's': Unsigned = !OptionSet; break; case 'w': SwapBytes = OptionSet; break; case 'p': ShowPorts = OptionSet; break; case 'b': if ((OptionSet != 8) && (OptionSet != 16)) { printf("Sample bits must be 8 or 16\n"); } else SampleBits = OptionSet; break; default: printf("Invalid argument %s\n",argv[base]); exit(1); } } else { argps[args++] = argv[base]; PlaySample = 1; } } /* Check to see where GUS is installed. */ base = DetectGUS(); if (!base) { printf("GUS not detected!\n"); exit(1); } printf("GUS detected at base address 0x%03x.\n",base); GUSReset(); if (ShowPorts) { printf("%-24s (0x%02x): %d\n", "GUS mixer control",GUSMixer,GUSReadMixer()); printf("%-24s (0x%02x): %d\n", "GUS status",GUSStatus,inportb(GUSStatus)); printf("%-24s (0x%02x): %d\n", "GUS timer control",GUSTimerControl,inportb(GUSTimerControl)); printf("%-24s (0x%02x): %d\n", "GUS timer data",GUSTimerData,inportb(GUSTimerData)); printf("%-24s (0x%02x): %d\n", "GUS IRQ/DMA control",GUSIRQDMAControl,inportb(GUSIRQDMAControl)); printf("%-24s (0x%02x): %d\n", "GUS MIDI control",GUSMIDIControl,inportb(GUSMIDIControl)); printf("%-24s (0x%02x): %d\n", "GUS MIDI data",GUSMIDIData,inportb(GUSMIDIData)); } /* Check to see how much RAM is there */ inc = 0x40000; for (dram = 0; dram < 0x100000; dram += inc) { printf("\rChecking GUS DRAM at %05lx.",dram); for (base = 0; base < 0x100; base++) { if (GUSPokePeek(dram,base) != base) break; } if (base < 0x100) break; } printf("\r%ld Kbytes of DRAM installed. \n",dram/1024); if (TestDRAM) { TestGUSDRAM(dram); } if (PlaySample) { if (args) for (base = 0; base < args; base++) PlaySampleFile(argps[base],SampleBits,VoiceFreq,Unsigned,SwapBytes); } if (ZeroDRAM) { ZeroGUSDRAM(dram); } if (DumpDRAM) { DumpGUSDRAM(dram); } }