12f8 /* rtty med HAMCOMM-interfacet */ #include #include #include #include #include #include extern void cmpt_init(void); extern void cmpt_exit(void); extern unsigned tone_freq; unsigned old_tonefreq; extern unsigned int timerticks; unsigned char letter; unsigned char c; int smp_cntr; #define LTRS 0x1f #define FGRS 0x1b #define LTRS_OFF 0 #define FGRS_OFF 32 int tab_offs = LTRS_OFF; unsigned char b2a_tab[] = { 0, 'T', 13, 'O', ' ', 'H', 'N', 'M', 10, 'L', 'R', 'G', 'I', 'P', 'C', 'V', 'E', 'Z', 'D', 'B', 'S', 'Y', 'F', 'X', 'A', 'W', 'J', '*', 'U', 'Q', 'K', '*', 0, '5', 13, '9', ' ', 0, ',', '.', 10, ')', '4', 0, '8', '0', ':', '=', '3', '+', 0, '?', 0, '6', 0, '/', '-', '2', 7, '*', '7', '1', '(', '*' }; char scrbuf[4000]; unsigned fc,markfreq,spacefreq,shift; float baud; unsigned wait_tm; int x_sav,y_sav; unsigned freq_cntr,noise_cntr; int rev; char *nrmrevstr[2] = {"NORMAL","REVERSE"}; unsigned maxval; main() { int i; cmpt_init(); clrscr(); fc=2200; baud=45.45; shift=170; rev=0; set_freqs(1); tone_freq=0; while(1) { maxval=(shift/2)-5; freq_cntr = 0; while(1) { if((tone_freq >= spacefreq-maxval) && (tone_freq <= spacefreq+maxval)) freq_cntr++; else freq_cntr=0; if(freq_cntr==30) break; if(kbhit()) if(process_key()) break; else goto rdy; } wait_tm=(unsigned)(1193180l/baud); wait(wait_tm+(wait_tm/2)); do_letter(); if(kbhit()) if(! process_key()) break; } rdy: cmpt_exit(); } process_key() { int c; c = getch(); if(c==0) { c=getch(); switch(c){ case 0x30: set_baud(); /* Alt-B */ break; case 0x1f: set_shift(); /* Alt-S */ break; case 0x2e: set_fc(); /* Alt-C */ break; case 0x13: rev ^= 1; /* Alt-R */ set_freqs(1); break; case 0x14: tune(); /* Alt-T */ break; case 0x2d: return 0; /* Alt-X */ } } return 1; } set_baud() { char baudstr[20]; printf("\nEnter baud rate: "); gets(baudstr); baud = atof(baudstr); } set_shift() { char shiftstr[20]; printf("\nEnter shift: "); gets(shiftstr); shift = atoi(shiftstr); set_freqs(0); } set_fc() { char fcstr[20]; printf("\nEnter Center frequency: "); gets(fcstr); fc = atoi(fcstr); set_freqs(0); } tune() { int center_x,tone_x; HideCur(); cursave(); save_scr(); clrscr(); center_x=fc/50; gotoxy(1+center_x,1); putch('*'); while(1) { if(tone_x != center_x) { gotoxy(1+tone_x,1); putch(' '); } tone_x=tone_freq/50; gotoxy(1+tone_x,1); putch('|'); if(tone_x == center_x){ gotoxy(1+center_x,1); putch('*'); } if(kbhit()){ getch(); break; } } rest_scr(); currest(); ShowCur(6,7); } do_letter() { int i,err; unsigned t; letter = 0x00; err=0; for(i=0;i<5;i++){ letter <<= 1; if((tone_freq >= markfreq-maxval) && (tone_freq <= markfreq+maxval)) letter |= 0x01; else if((tone_freq >= spacefreq-maxval) && (tone_freq <= spacefreq+maxval)) letter |= 0x00; else err=1; wait(wait_tm); } if(! err){ switch(letter) { case LTRS: tab_offs = LTRS_OFF; break; case FGRS: tab_offs = FGRS_OFF; break; default: c = b2a_tab[tab_offs+letter]; putchar(c); } } } set_freqs(int with_text) { switch(rev){ case 0: markfreq = fc+shift/2; spacefreq = fc-shift/2; break; case 1: markfreq = fc-shift/2; spacefreq = fc+shift/2; } if(with_text) printf("\nNrm/Rev: %s\n",nrmrevstr[rev]); } wait(unsigned t) { unsigned latch1,latch2; asm{ push ax push dx mov al,00h out 43h,al in al,40h mov dl,al in al,40h mov dh,al mov latch1,dx pop dx pop ax } while(1) { asm{ push ax push dx mov al,00h out 43h,al /* latch current counter value */ in al,40h mov dl,al in al,40h mov dh,al mov latch2,dx pop dx pop ax } if(latch1-latch2 >= t) break; } } HideCur() { asm{ push ax push cx mov ah,01h mov ch,00100110b mov cl,00000111b int 10H pop cx pop ax } } ShowCur(char start, char end) { asm{ push ax push cx mov ah,01H mov ch,start mov cl,end int 10H pop cx pop ax } } cursave() { x_sav = wherex(); y_sav = wherey(); } currest() { gotoxy(x_sav,y_sav); } save_scr() { char far* p; p = MK_FP(0xb800,0x0000); _fmemcpy((char far*)scrbuf,p,4000); } rest_scr() { char far* p; p = MK_FP(0xb800,0x0000); _fmemcpy(p,(char far*)scrbuf,4000); } . 0