home *** CD-ROM | disk | FTP | other *** search
- /*==================================================
- Funktion SETCOM. Setzt der Parameter der seriellen
- Schnittstellen COM1 - COM4. Keine Überprüfung, ob
- die angewählte Schnittstelle wirklich existiert.
- ===================================================*/
-
- #include "baudtab.h" /* Einbinden der Baudraten-Tabelle */
-
- int setcom(int com,long baud,int dbit,int sbit,char *par);
-
- int setcom(com,baud,dbit,sbit,par)
-
- int com,dbit,sbit;
- long baud;
- char *par;
-
- {
- int combd;
- int comlcr;
- unsigned char bdlow = 0;
- unsigned char bdhigh = 0;
- unsigned char parity = 0;
- unsigned char datab = 0;
- unsigned char stopb = 0;
- unsigned char mode = 0;
- int i;
- int far *combasis;
- unsigned char far *maxcom;
- int commax;
-
- FP_SEG(maxcom) = 0x0040;
- FP_OFF(maxcom) = 0x0011; /* Anzahl COM-Schnittstellen */
- commax = (*maxcom & 0x0e) >> 1; /* aus Equipmentword isolieren */
-
- if( (com > commax) || (com < 1) ) /* Abbruch, wenn Schnittstelle */
- return(1); /* nicht vorhanden ist */
-
- FP_SEG(combasis) = 0x0040;
- FP_OFF(combasis) = (com - 1) * 2; /* Ermitteln der Divisor-Latch- */
- combd = *combasis; /* Register Adresse */
- comlcr = combd + 3; /* Adresse Line-Control-Reg. */
-
- for (i=0 ; i<BDMAX ; i++) /* Divisor-High- und Div.-Low- */
- { /* Bytes in Tabelle suchen */
- if (baud == bd[i][0])
- {
- bdhigh = bd[i][1];
- bdlow = bd[i][2];
- }
- }
- if ( (bdlow == 0) && (bdhigh == 0) ) /* Baudrate nicht implementiert */
- {
- printf("\nUnzulässige Baudrate \n");
- return(2); /* Abbruch mit ERRORLEVEL 2 */
- }
-
- dbit -= 5; /* Parameter für Anzahl der */
- if ( (dbit >=0) && (dbit <= 8) ) /* Daten-Bits ermitteln */
- datab = dbit;
- else /* Falscher Wert übergeben ! */
- return(3); /* Abbruch mit ERRORLEVEL 3 */
-
- if (sbit == 1) /* Parameter für Anzahl der */
- stopb = 0; /* Stop-Bits ermitteln */
- else if (sbit == 2)
- stopb = 4;
- else /* Falscher Wert übergeben ! */
- return(4); /* Abbruch mit ERRORLEVEL 4 */
-
- par[1] = '\0'; /* Parameter für Parität */
- if (stricmp(par,"N") == 0) /* Nur erstes Zeichen auswerten */
- parity = 0x00; /*!----------------------------!*/
- else if (stricmp(par,"O") == 0) /*! An dieser Stelle wird ein !*/
- parity = 0x08; /*! Großbuchstabe erwartet !*/
- else if (stricmp(par,"E") == 0) /*!----------------------------!*/
- parity = 0x18;
- else /* Parameter nicht erlaubt ! */
- return(5); /* Abbruch mit ERRORLEVEL 5 */
- mode = datab | stopb | parity; /* Parameter über OR verknüpfen */
-
- outp(comlcr,0x80); /* Divisor-Byte-Low ansprechen */
- outp(combd, bdlow); /* Divisor-Low schreiben */
- outp(combd+1,bdhigh); /* Divisor-High schreiben */
- outp(comlcr, mode); /* Start-,Stop-,Paritybits */
-
- return(0);
- }
-