/* >>:yam5tv.c 10-5-82 * * Modem related functions. */ #include "yam.h" #include "sio.h" #define MIERROR (inpp(1)&(ROVERR+FRAMERR)) #define MI_ERROR_RESET outp(Sport, RESERROR) /* * setbaud(nbaud) If legal rate, set modem registers and Baudrate */ setbaud(nbaud) unsigned nbaud; { register unsigned bcmd; return OK; } /* fetch the baudrate from the modem port */ readbaud() { } /* Bye hangs up the line and then resets for another call */ bye() { onhook(); sleep(20*CLKMHZ); setbaud(Baudrate); } /* onhook goes off line for good */ onhook() { outpp(5, 0); } sendbrk() { outpp(5, SENDBRK); /* set line to spacing */ sleep(CLKMHZ); setbaud(Baudrate); /* then restore it */ } /* * Readline from MODEM13.C rewritten to allow much higher * baud rates. * Timeout is in deciseconds (1/10th's) * For top speed, character ready is checked in many places. * returns TIMEOUT if kbd character is ready. * */ readline(decisecs) { if(MIREADY) { if(MIERROR) goto fubar; else return MICHAR; } while(--decisecs>=0) { if(MIREADY) { if(MIERROR) goto fubar; else return MICHAR; } if(CDO) return TIMEOUT; if(CIREADY) { CICHAR; /* dismiss character */ return TIMEOUT; } for(Timeout=T1pause; --Timeout; ) if(MIREADY) { if(MIERROR) goto fubar; else return MICHAR; } } return TIMEOUT; fubar: MICHAR; /* throw the turkey away */ MI_ERROR_RESET; return ERROR; } sendline(data) char data; { while(!MOREADY) ; outp(MODATA, data); } purgeline() { while ((inpp(1)&ALLSENT)==0) ; while(MIREADY) MICHAR; MI_ERROR_RESET; } #ifdef PORTSELAD #define AUTODIAL dial(name) char *name; { char *s; if((s=cisubstr(name, "\tm"))) { chngport(atoi(s+2)); printf("Port %u ", Dport); } if((s=cisubstr(name, "\tb"))) if(!setbaud(atoi(s+2))) printf(" %u baud\n", Baudrate); printf("%s", name); return OK; } #endif #ifdef MICROCOM #define AUTODIAL dial(name) char *name; { int count, dp3; char *s; unsigned tbaudd; printf("%s", name); if((s=cisubstr(name, "\tb"))) tbaudd=atoi(s+2); else tbaudd=0; if((s=cisubstr(name, "\tm"))) { chngport(atoi(s+2)); printf(" Port %u ", Dport); } else { if (tbaudd>450) tbaudd=300; setbaud(300); for(count=5; --count>=0; ) { purgeline(); sendline(' '); if(readline(5) != 'C') { /* send long break to reset */ printf("Reset.."); outpp(5, SENDBRK); sleep(5 * CLKMHZ); setbaud(300); while(readline(8) != TIMEOUT) ; while(readline(4) != TIMEOUT) ; sendge(ESC); sendge(EOT); continue; } for(dp3=5; --dp3>=0; ) if (sendge('D')=='D') break; /* skip to 1st digit of number */ s=cisubstr(name, "\t"); for (; *s && !isdigit(*s); ++s) ; for ( ; *s > ' '; ++s) { if(isdigit(*s) || *s=='X') sendge(*s); /* send no dashes */ } sendline('\r'); while ((dp3=readline(100)) != 'D' && dp3 != 'C') ; if(dp3!='D') { printf("\nCall Failed:%c\n", dp3); return ERROR; } else break; } } if(tbaudd) { setbaud(tbaudd); } printf(" Connected at %u Baud\n", Baudrate); return OK; } /* send char to modem controller, wait for echo, display and return it. */ sendge(c) { register b; sendline(c); putcty(b=readline(5)); return b; } #endif /* default "autodial" routine */ #ifndef AUTODIAL dial(name) char *name; { char *s; if((s=cisubstr(name, "\tb"))) if(!setbaud(atoi(s+2))) printf("Baudrate set to %u: ", Baudrate); printf("%s", name); return OK; } #endif /* * change modem port to n */ chngport(n) { Sport=(Dport=n)+(SPORT-DPORT); readbaud(); } /* * Special i/o routines for Z8530 SCC with pointer register * * outpp(p, c) outputs c to subport p of chip selected by Sport * inpp(p) returns value in subport p of chip slected by Sport */ outpp(p, c) { outp(Sport, p); outp(Sport, c); } inpp(p) { outp(Sport, p); return inp(Sport); } /* return <> 0 if modem has character(s) ready */ miready() { return MIREADY; } /* return next modem character assuming miready <> 0 */ michar() { return MICHAR; } /* functions to output control strings to terminal */ termreset() { lputs(TERMRESET); } terminit() { lputs(TERMINIT); } termreplot() { lputs(TERMREPLOT); }