/* >>:yam5z100.c 9-28-82 */ #include "yam.h" /* * setbaud(nbaud) If legal rate, set modem registers and Baudrate * * set baud rate for modem driven by Mot 2661B (baud rate set B) */ setbaud(nbaud) unsigned nbaud; { char mr1, mr2; mr1=0116; switch(nbaud) { case 45: mr2=00; mr1=0216; break; case 50: mr2=01; mr1=0216; break; case 75: mr2=02; break; case 110: mr2=03; mr1=0316; break; case 134: mr2=04; break; case 150: mr2=05; break; case 300: mr2=06; break; case 600: mr2=07; break; case 1200: mr2=010; break; case 1800: mr2=011; break; case 2000: mr2=012; break; case 2400: mr2=013; break; case 4800: mr2=014; break; case 9600: mr2=015; break; case 19200: mr2=016; break; case 38400: mr2=017; break; default: return ERROR; } outp(Dport+3, 062); inp(Dport+3); outp(Dport+2, mr1); outp(Dport+2, mr2|060); outp(Dport+3, 067); Baudrate=nbaud; return OK; } readbaud() { inp(Dport); inp(Sport); inp(Dport+2); switch (inp(Dport+2)&017) { case 00: Baudrate = 45; break; case 01: Baudrate = 50; break; case 02: Baudrate = 75; break; case 03: Baudrate = 110; break; case 04: Baudrate = 134; break; case 05: Baudrate = 150; break; case 06: Baudrate = 300; break; case 07: Baudrate = 600; break; case 010: Baudrate = 1200; break; case 011: Baudrate = 1800; break; case 012: Baudrate = 2000; break; case 013: Baudrate = 2400; break; case 014: Baudrate = 4800; break; case 015: Baudrate = 9600; break; case 016: Baudrate = 19200; break; case 017: Baudrate = 38400; break; } return; } /* Bye disconnects the line and allows another call */ bye() { onhook(); sleep(20*CLKMHZ); /* wait two seconds */ setbaud(Baudrate); } sendbrk() { outp(Dport+3, 077); /* set serial line to spacing */ sleep(CLKMHZ/2); /* wait .1 second */ setbaud(Baudrate); } /* onhook disconnects the line for good */ onhook() { outp(Dport+3, 071); } /* * 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. * * There are three versions of readline, the first is used if * there is a separate register for error conditions. The second * is used if error condx are in the same register asrx data ready. * The last, and quickest, does not check error conditions. */ /* Version for 8250, 8251, 2651, etc. with all bits in one register */ readline(decisecs) { if((Mstatus=inp(Sport))&MIREADYMASK) goto getit; while(--decisecs>=0) { if((Mstatus=inp(Sport))&MIREADYMASK) goto getit; if(CDO) return TIMEOUT; if((Mstatus=inp(Sport))&MIREADYMASK) goto getit; #ifndef REALSLOWKB if(CIREADY) { CICHAR; /* dismiss character */ return TIMEOUT; } #endif if((Mstatus=inp(Sport))&MIREADYMASK) goto getit; for(Timeout=T1pause; --Timeout; ) if((Mstatus=inp(Sport))&MIREADYMASK) { getit: if(Mstatus&MIERRORMASK) { MICHAR; outp(Dport+3, 067); return ERROR; } else return MICHAR; } } return TIMEOUT; } sendline(data) char data; { while(!MOREADY) ; outp(MODATA, data); } purgeline() { while(MIREADY) MICHAR; outp(Dport+3, 067); } #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.."); dp3=inp(Dport+3); outp(Dport+3, 0100); sleep(5 * CLKMHZ); outp(Dport+3, dp3); 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(); }