/*********************************************/ /* Morseträningsprogram för Soundblaster Pro */ /*********************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include extern int prog_timer(int freq); extern void rest_timer(void); extern unsigned long timerticks; extern void newdelay(unsigned int delval); extern void fm_write(unsigned char reg,unsigned char data); int minlength,maxlength; int note; int showstat=0; char *shwstatstr[2]={"G","V"}; char *itonestr[2]={"Av","På"}; char *noisestr[3]={"Inget","Brus","Pile-Up"}; int mastervol,beepvol,noisevol,lineinvol; int wpm; int dah; int dit; int pause,letter_pause,word_pause; int noisetype; int numsamples; char far *sample[100]; unsigned char letters[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ0123456789.,?!:\"'()/-*=~ +@"}; unsigned int freq,ifreq; unsigned char beep_on_val,beep_off_val,itone_on_val,itone_off_val; unsigned char fnum_hi[] = {1,1,1,1,1,1,2,2,2,2,2,2}; unsigned char fnum_lo[] = {0x6b,0x81,0x98,0xb0,0xca,0xe5, 0x02,0x20,0x41,0x63,0x87,0xae}; unsigned int itonestat; unsigned char letters2[56]; unsigned char charstat[56]; int numchars; /* A/D m A/D c S/R m S/R c */ char beep[16] = {0X021,0X021,0X000,0X000,0X0C0,0X0C0,0X0FC,0X0FC, 0X000,0X000,0X001,0X000,0X000,0X000,0X000,0X000}; FILE* cfgfile; char cfgfname[80]; main(int argc, char **argv) { int key; int i; if(init()) exit(1); while(1) { key = getch(); switch(key){ case '1': random_text(0);break; case '2': random_text(1);break; case '3': text_from_disk();break; case 't': select_characters();break; case 'm': set_minmax();break; case 'w': set_wpm();break; case 'f': set_tone_freq();break; case 'i': set_itone();break; case 'g': show_hide();break; case 'b': set_backg_noise();break; case 'v': set_volumes();break; case 's': save_config();break; case 'l': load_config();break; case 'a': quit(); } draw_menu(); } } init() { int i; extern char far * near voice_drv; char far *lpVoiceBuf ; FILE* f; unsigned int vocsize; int handle; unsigned numread,segp; if ( ! GetEnvSetting() ) { if (sbc_check_card() & 6) { if (sbc_test_int()) { if (sbc_test_dma() >= 0) { if ((voice_drv = LoadDriver("CT-VOICE.DRV")) != 0) { if (!ctvm_init()) { ctvm_speaker(1); strcpy(cfgfname,"MORSE.CFG"); if(cfgfile = fopen(cfgfname,"rb")) load_config2(); else { wpm = 20; note = 77; for(i=0;i<56;i++) charstat[i]=1; minlength=2; maxlength=5; mastervol=12; beepvol=15; noisevol=8; noisetype=0; itonestat=0; freq = 4; ifreq = 6; } numchars = 0; for(i=0;i<56;i++) { if (charstat[i]) letters2[numchars++] = letters[i]; } randomize(); numsamples = 0; handle=_open("MORSE1.DAT",O_RDONLY); while(1){ DosRead(handle,(char far*)&vocsize,2,&numread); if(! numread) break; if(allocmem((unsigned)((vocsize+15) >> 4),&segp) != -1) { printf("Malloc error!\n"); ctvm_terminate(); return(1); } FP_SEG(sample[numsamples]) = segp; FP_OFF(sample[numsamples]) = 0 ; DosRead(handle,sample[numsamples],vocsize,&numread); numsamples++; } close(handle); prog_timer(1000); init_beep(); set_tone_freq2(); set_volume2(); HideCur(); clrscr(); draw_menu(); set_wpm2(); return(0); } } else { printf("Error loading CT-VOICE.DRV!\n"); return(1); } } else { printf("Error on DMA channel.\n"); return(1); } } else { printf("Error on interrupt.\n"); return(1); } } else { printf("Sound Blaster Card not found or wrong I/O settings.\n") ; return(1); } } else { printf("BLASTER environment not set or incomplete or invalid.\n"); return(1); } } quit() { int i,k=0; printf("\nVill du verkligen sluta (J\\n)?\n"); while( (k != 'n') && (k!= 'j') && (k!=13)) k = getch(); if((k == 13) || (k == 'j')) { clrscr(); for(i=0;i-1;i--){ set_voc_vol(i); newdelay(40); } ctvm_stop(); } switch_on_itone() { fm_write(0xb1,itone_on_val); /* Beep ON */ } switch_off_itone() { fm_write(0xb1,itone_off_val); } select_characters() { int i,key,k; unsigned char kstr[2],*ptr; draw_charscr(); while(1){ if(bioskey(1)) { key = bioskey(0); k = key & 0xff; if(k==27) break; switch(k){ case 0: { k = (key >> 8) & 0xff; switch(k){ case 48: { for(i=0;i<29;i++) charstat[i] ^= 1; }break; case 31: { for(i=29;i<39;i++) charstat[i] ^= 1; }break; case 45: { for(i=39;i<56;i++) charstat[i] ^= 1; } } }break; default: { kstr[0] = k; kstr[1] = 0; ptr = strupr(kstr); k = ptr[0]; charstat[strchr(letters,k)-letters] ^= 1; } } draw_charscr(); } } numchars = 0; for(i=0;i<56;i++) { if (charstat[i]) letters2[numchars++] = letters[i]; } } draw_charscr() { int i; clrscr(); printf("\n%s\n",letters); for(i=0;i<56;i++){ if(charstat[i]) printf("X"); else printf(" "); } printf("\n\nAlt-B Bokstäver Alt-S Siffror Alt-X Övriga \n"); } set_wpm() { unsigned char wpmstr[5]; ShowCur(); printf("\nNy hastighet i WPM: "); gets(wpmstr); HideCur(); if(! strlen(wpmstr)) return; while(! (wpm = atoi(wpmstr))) gets(wpmstr); set_wpm2(); } set_wpm2() { dit = 60000/(wpm*50); dah = dit*3; pause = dit; letter_pause = dah-pause; word_pause = dit*7-letter_pause; } set_tone_freq() { char freqstr[10]; ShowCur(); printf("\nFrekvens morse (0-11): ",freq); gets(freqstr); if(strlen(freqstr)) freq = atoi(freqstr); printf("Frekvens interferens (0-11): ",ifreq); gets(freqstr); if(strlen(freqstr)) ifreq = atoi(freqstr); HideCur(); set_tone_freq2(); } set_tone_freq2() { beep_on_val = 0x34|fnum_hi[freq]; beep_off_val = 0x14|fnum_hi[freq]; itone_on_val = 0x34|fnum_hi[ifreq]; itone_off_val = 0x14|fnum_hi[ifreq]; fm_write(0xa0,fnum_lo[freq]); fm_write(0xa1,fnum_lo[ifreq]); } show_hide() { showstat ^= 1; } set_backg_noise() { char noisetypestr[10]; ShowCur(); printf("\nTyp av bakgrundsljud (0=%s, 1=%s, 2=%s): ",noisestr[0],noisestr[1],noisestr[2]); gets(noisetypestr); HideCur(); if(strlen(noisetypestr)==0) return; noisetype = atoi(noisetypestr); } set_itone() { itonestat ^= 1; } set_volumes() { char str[10]; outportb(ct_io_addx+4,0x22); mastervol = inportb(ct_io_addx+5) & 0xf; outportb(ct_io_addx+4,0x26); beepvol = inportb(ct_io_addx+5) & 0xf; outportb(ct_io_addx+4,0x2E); lineinvol = inportb(ct_io_addx+5) & 0xf; ShowCur(); printf("\nTotal (%d): ",mastervol); gets(str); if(strlen(str)) mastervol=atoi(str); printf("Toner (%d): ",beepvol); gets(str); if(strlen(str)) beepvol = atoi(str); printf("Bakgrundsljud (%d): ",noisevol); gets(str); if(strlen(str)) noisevol = atoi(str); printf("Line In (%d): ",lineinvol); gets(str); if(strlen(str)) lineinvol = atoi(str); HideCur(); set_volume2(); } set_volume2() { outportb(ct_io_addx+4,0x22); outportb(ct_io_addx+5,(mastervol<<4)+mastervol); outportb(ct_io_addx+4,0x26); outportb(ct_io_addx+5,(beepvol<<4)+beepvol); outportb(ct_io_addx+4,0x2e); outportb(ct_io_addx+5,(lineinvol<<4)+lineinvol); } set_voc_vol(int vol) { outportb(ct_io_addx+4,0x04); outportb(ct_io_addx+5,(vol<<4)+vol); } save_config() { ShowCur(); printf("\nSpara som: "); gets(cfgfname); HideCur(); if(! strlen(cfgfname)) return; if(! (strchr(cfgfname,'.'))) strcat(cfgfname,".CFG"); printf("\nSparar konfiguration...\n"); cfgfile=fopen(cfgfname,"wb"); fwrite(&wpm,2,1,cfgfile); fwrite(¬e,2,1,cfgfile); fwrite(&charstat,1,56,cfgfile); fwrite(&minlength,2,1,cfgfile); fwrite(&maxlength,2,1,cfgfile); if(! strnicmp(strupr(cfgfname),"MORSE.CFG",9)) { fwrite(&mastervol,2,1,cfgfile); fwrite(&beepvol,2,1,cfgfile); /* fwrite(&itonevol,2,1,cfgfile); */ fwrite(&noisevol,2,1,cfgfile); fwrite(&noisetype,2,1,cfgfile); fwrite(&lineinvol,2,1,cfgfile); fwrite(&freq,2,1,cfgfile); fwrite(&ifreq,2,1,cfgfile); fwrite(&itonestat,2,1,cfgfile); } fclose(cfgfile); newdelay(1000); } load_config() { int i; ShowCur(); printf("\n.CFG fil att ladda: "); gets(cfgfname); HideCur(); if(strlen(cfgfname) == 0) return; if(! (strchr(cfgfname,'.'))) strcat(cfgfname,".CFG"); if(! (cfgfile=fopen(cfgfname,"rb"))) { printf("Kan inte hitta %s!\n",cfgfname); newdelay(1000); } else { load_config2(); numchars = 0; for(i=0;i<56;i++) { if (charstat[i]) letters2[numchars++] = letters[i]; } set_wpm2(); } } load_config2() { fread(&wpm,2,1,cfgfile); fread(¬e,2,1,cfgfile); fread(&charstat,1,56,cfgfile); fread(&minlength,2,1,cfgfile); fread(&maxlength,2,1,cfgfile); if(! strnicmp(strupr(cfgfname),"MORSE.CFG",9)) { fread(&mastervol,2,1,cfgfile); fread(&beepvol,2,1,cfgfile); /* fread(&itonevol,2,1,cfgfile); */ fread(&noisevol,2,1,cfgfile); fread(&noisetype,2,1,cfgfile); fread(&lineinvol,2,1,cfgfile); fread(&freq,2,1,cfgfile); fread(&ifreq,2,1,cfgfile); fread(&itonestat,2,1,cfgfile); } fclose(cfgfile); } output(unsigned char *string) { int i; unsigned char *ptr; if(showstat) if(strlen(string) > (79-GetCurX())) printf("\n"); ptr = strupr(string); for(i=0;i