/**
*.Name         aux_stat
*.Title        Определение режима асинхронного адаптера
*
*.Descr        Эта функция считывает текущий режим
*              асинхронного порта и записывает его
*              в структуру с типом AUX_MODE.
*
*.Proto        void aux_stat(AUX_MODE *mode, int port);
*
*.Params       AUX_MODE mode - структура, описывающая
*              протокол и режим работы порта:
*
*         typedef struct _AUX_MODE_ {
*
*          union {
*            struct {
*               unsigned char len : 2, // длина символа
*                    stop         : 1, // число стоп-битов
*                    parity       : 2, // контроль четности
*                    stuck_parity : 1, // фиксация четности
*                    en_break_ctl : 1, // установка перерыва
*                    dlab         : 1; // загрузка регистра делителя
*            } ctl_word;
*            char ctl;
*          } ctl_aux;
*
*          unsigned long baud;            // скорость передачи данных
*
*         } AUX_MODE;
*
*              int port - номер асинхронного адаптера:
*                 0 - COM1, 1 - COM2
*
*.Return       Ничего
*
*.Sample       aux_test.c
**/

#include <stdio.h>
#include <conio.h>
#include "sysp.h"

void aux_stat(AUX_MODE *mode, int port) {

	unsigned long b;

// Запоминаем режим адаптера

	mode->ctl_aux.ctl = (char)inp(0x3fb - 0x100 * port);

// Устанавливаем старший бит режима
// для считывания текушей скорости передачи

	outp(0x3fb - 0x100 * port, mode->ctl_aux.ctl | 0x80);

// Считываем значение регистра делителя

	b = inp(0x3f9 - 0x100 * port); b = b << 8;
	b += inp(0x3f8 - 0x100 * port);

// Преобразуем его в боды

	switch (b) {
		case 1040: b = 110; break;
		case 768: b = 150; break;
		case 384: b = 300; break;
		case 192: b = 600; break;
		case 96: b = 1200; break;
		case 48: b = 2400; break;
		case 24: b = 4800; break;
		case 12: b = 9600; break;
		case 6: b = 19200; break;
		case 3: b = 38400; break;
		case 2: b = 57600; break;
		case 1: b = 115200; break;
		default: b=0; break;
	}

	mode->baud = b;

// Восстанавливаем состояние адаптера

	outp(0x3fb - 0x100 * port, mode->ctl_aux.ctl & 0x7f);

}

