/********************************************************************* * * * 8250T.C 1.0 - UTILIDAD DE AUTODIAGNOSTICO DEL 8250 EN TURBO C * * * *********************************************************************/ #include #include #define LCR (base+3) /* registro de control de línea */ #define IER (base+1) /* registro de activación de interrupciones */ #define DLL (base+0) /* parte baja del divisor */ #define DLM (base+1) /* parte alta del divisor */ #define MCR (base+4) /* registro de control del modem */ #define LSR (base+5) /* registro de estado de línea */ #define RBR (base+0) /* registro buffer de recepción */ #define THR (base+0) /* registro de retención de transmisión */ #define DR 1 /* bit dato disponible del LSR */ #define OE 2 /* bit de error de overrun del LSR */ #define PE 4 /* bit de error de paridad del LSR */ #define FE 8 /* bit de error en bits de stop del LSR */ #define BI 0x10 /* bit de error de break en el LSR */ #define THRE 0x20 /* bit de THR vacío */ void error() { printf ("\r ¡¡Fallo del puerto serie!!\n"); exit (2); } void main() { unsigned com, base, divisor, dato, entrada, lsr; printf("\n8250 Test v1.0 - (c) 1993 Ciriaco García de Celis.\n"); printf("- Elige COM (1, 2, ...): "); scanf ("%d", &com); base=peek(0x40, (com-1)*2); if (base==0) { printf("\n ¡El COM elegido no existe para la BIOS!.\n"); exit (1); } printf("- Elige divisor (1-65535): "); scanf ("%d", &divisor); if (!divisor) divisor=1; printf("\nComprobando 8250 en %03Xh a %lu baudios.\nEspera...", base, 1843200L/divisor/16); outportb (LCR, 0x83); /* DLAB=1, 8 bits, 1 stop, sin paridad */ outportb (IER, 0); outportb (DLL, divisor % 256); outportb (DLM, divisor >> 8); outportb (MCR, 8+16); /* modo LOOP */ outportb (LCR, 0x03); /* DLAB=0, 8 bits, 1 stop, sin paridad */ for (dato=0; (dato<0x100) && !kbhit(); dato++) { do { /* esperar por THR vacío */ lsr=inportb(LSR); if (lsr & (OE|PE|FE|BI)) error(); } while (!(lsr & THRE)); outportb (THR, dato); /* enviar carácter */ do { /* esperar por RBR lleno */ lsr=inportb(LSR); if (lsr & (OE|PE|FE|BI)) error(); } while (!(lsr & DR)); entrada=inportb (RBR); /* recibir carácter */ if (dato!=entrada) error(); printf ("\rEnviado y recibido byte %d",dato); } if (!kbhit()) printf("\rAutodiagnóstico del 8250 en COM%d superado.\n", com); else { getch(); printf("\rTecla pulsada - prueba abortada.\n");} }