# include # include "mult.h" /* sets baud rate from number stored in baud (real baud / 1000) */ setbaud() { int i,x,y,z; z = in(base+3); out((base+3),(z | 0x80)); /* set baud latch */ for( i=0; i < 8; ++i) /* match baud with a baud rate */ { /* in abaud then assign x & y */ if(baud == abaud[i]) /* the same number entry in dbaud */ { x = y = dbaud[i]; break; } } x &= 0xff; /* mask out high bits */ y = y>>8; /* shift high bits down */ out(base,x); /* out low 8 bits of baud rate */ out((base+1),y); /* out high 8 bits of baud rate */ out((base+3),z); /* reset baud latch */ } ckbaud() /* check that the baud rate was set */ { int erwd,i,x,y,z; z = in(base+3); for( i=0; i < 8; ++i) /* match baud with a baud rate */ { /* in abaud then assign x & y */ if(baud == abaud[i]) /* the same number entry in dbaud */ { x = y = dbaud[i]; break; } } x &= 0xff; /* mask out high bits */ y = y >> 8; /* shift high bits down */ out((base+3),(z| 0x80)); /* set divisor latch bit */ if(in(base) != x || in(base+1) != y ) erwd = 0x100; /* set error word */ else erwd = 0; /* reset error word */ out((base+3),z); return(erwd); } albaud() { int i; error = albaud; puts("\n******testing the baud rates on port #"); putdec(group); puts(" ******\n\n"); for(i=0; i < 8; ++i) { baud = abaud[i]; base = SBASE; setbaud(); if(ckbaud() > 0xff) { puts("the non-test board won't set to "); putdec(baud); puts(" baud rate!\n\n"); terflg(); } base = TBASE; setbaud(); if(ckbaud() > 0xff) { puts("the test board won't set to "); putdec(baud); puts(" baud rate!\n\n"); terflg(); } comm(); } } comm() /* transmit and recieve data in both dir. */ { int a; in(SBASE); /* clear the receive reg on the non-test board */ in(TBASE); /* clear the receive reg on the test board */ base = TBASE; error = comm; tran( 0xa5 ); base= SBASE; if((a = rec()) > 0xff) terflg(); if(a != 0xa5) { puts("word 10100101 was recieved as word "); putbin(a); puts(" @ "); putdec(baud); puts(" baud rate on the non-test board!\n\n"); terflg(); } else if(erflg == 0 && verflg == 0) { puts("passes transmit test @ "); putdec(baud); puts(" baud rate!\n\n"); } tran(0xa5); base = TBASE; if((a = rec()) > 0xff) terflg(); if(a != 0xa5) { puts("word 10100101 was recieved as word "); putbin(a); puts(" @ "); putdec(baud); puts(" baud rate!\n\n"); terflg(); } else if(erflg == 0 && verflg == 0) { puts("passes recieve test @ "); putdec(baud); puts(" baud rate!\n\n"); } } /* setup of parameters * number of bits , stop bit 'l'or's' , parity enable , even parity */ setparm() { int parm; wrdsze = max(5,wrdsze); wrdsze = min(8,wrdsze); parm = wrdsze - 5; if(stopsze == 'l') parm |= 0x04; if(parity == 'y') { parm |= 0x08; if(eoparty == 'e') parm |= 0x10; } out((base+3),parm); } ckparm() /* check parameters port */ { int parm; int erwd=0; parm = wrdsze - 5; if(stopsze == 'l') parm |= 0x4; if(parity == 'y') { parm |= 0x8; if(eoparty == 'e') parm |= 0x10; } if(in(base+3) != parm ) erwd = 0x100; /* set error word */ else erwd = 0; /* reset error word */ return(erwd); } setmod() /* set the two modem control bits */ { int modcntl=0; if(dtr == 'y') modcntl |= 1; if(rts == 'y') modcntl |= 2; out((base+4),modcntl); } ckmod() /* check modem control port */ { int modcntl=0; int erwd = 0; if(dtr == 'y') modcntl |= 1; if(rts == 'y') modcntl |= 2; if(in(base+4) != modcntl) erwd = 0x100; /* set error word */ else erwd = 0; /* reset error word */ return(erwd); } setint() /* set the interrupt bits */ { int inter=0; if( drint == 'y' ) inter |= 1; if( threint == 'y' ) inter |= 2; if( rlint == 'y' ) inter |= 4; if( modint == 'y' ) inter |= 8; out((base+1),inter); } ckint() { int inter=0; int erwd = 0; if(drint == 'y') inter |= 1; if(threint == 'y') inter |= 2; if(rlint == 'y') inter |= 4; if(modint == 'y') inter |= 8; if(in(base+1) != inter) erwd = 0x100; else erwd = 0; return(erwd); } tran(data) /* check thre & thse then transmit data */ int data; { extern int base,group; int i,status; for(i=0; i < 10000; ++i) { status = in(base+5) & 0x20; if(status == 0x20) break; } if(status == 0x20) out(base,data); else { puts("\nthe transmit register in port #"); putdec(group); torstd(); puts("\nwill not empty !\n"); fatal(); } } /* recieve data at port "group" print rec. errors return 0x100 when * a failure is detected */ rec() { int i,status; for(i=0; i < 10000; ++i) { status=in(base+5) & 0xf; if(status & 1 == 1 ) break; } if(status != 1 ) { if(status == 0) { puts("\ndata was not ready when it should "); puts("have been on port #"); putdec(group); torstd(); putc('\n'); } if(status & 0x2) { puts("\noverrun error on port #"); putdec(group); torstd(); puts("\n@ "); putdec(baud); puts(" baud rate!\n"); } if(status & 0x4) { puts("\nparity error on port #"); putdec(group); torstd(); puts("\n@ "); putdec(baud); puts(" baud rate !\n"); } if(status & 0x8) { puts("\nframing error on port #"); putdec(group); torstd(); puts("\n@ "); putdec(baud); puts(" baud rate !\n"); } return(0x100); } return( in(base) ); } fatal() /* jumps to cp/m ending test */ { puts("\nthis is a fatal error !\n"); reset(); } nonfatal() { int c; puts("do you want to loop in the test that failed (y/n,) ? \n"); putc('\007'); putc('\n'); c = getch(); if(tolower(c) == 'y') { erflg=1; puts("to end loop type any key.\n"); for( ; cpm(CONSTAT) == 0 ; ) (*error)(); cpm(CONIN); /* to clear input port before returning * to cp/m */ } reset(); } putc(a) /* output one character to terminal */ char a; { int i; if(a == '\n') putc('\r'); cpm(CONOUT,a); if(a == '\n' && verflg == 0) { for(i = 0 ; i < 10000 ; ++i) ; } } putcnw(a) /* output one character to terminal */ char a; { if(a == '\n') putcnw('\r'); cpm(CONOUT,a); } puts(a) /* print string */ char *a; { for( ; *a ; ++a ) putc(*a); } putsnw(a) /* print string */ char *a; { for( ; *a ; ++a ) putcnw(*a); } putf(a) /* print float number as xx.xxx */ float a; { putb(buff,dtof(buff,a,2,3)); } putdec(a) /* print decimal number */ int a; { putb(buff,itob(buff,a,10)); } putbin(a) /* print binary number */ int a; { int b,c,d,i; b = itob(buff,a,2); if(b < 8) /* were there any leading '0's */ { c = 8 - b; for(d = b; d > 0; --d) buff[(d-1) + c] = buff[d-1]; /* right justify */ for( i = 0; i < c; ++i) buff[i] = '0'; /* enter leading '0's */ } putb(buff,8); /* print out buffer for 8 locations */ } putb(a,b) /* print from buff for b characters */ char *a; int b; { int i; for(i=0; i 0xff) terflg(); else if(b != a) waler(a,b); /* test with inverted a */ base = TBASE; tran((~a & 0xff)); base = SBASE; if((b = rec()) > 0xff) terflg(); else if(b != (~a & 0xff)) waler((~a & 0xff),b); a = a << 1 & 0xff; } if(erflg == 0 && verflg == 0) puts("passes transmit walk-test !\n"); }