/**
*.Name         aux_init
*.Title        Инициализация асинхронного адаптера
*
*.Descr        Эта функция инициализирует асинхронные
*              адаптеры, задавая протокол обмена данными
*              и скорость обмена данными.
*
*.Proto        int aux_init(AUX_MODE *mode, int port, int imask);
*
*.Params       AUX_MODE mode - структура, описывающая
*              протокол и режим работы порта;
*
*              int port - номер асинхронного адаптера:
*                 0 - COM1, 1 - COM2
*
*              int imask - значение для регистра маски
*                          прерываний
*
*.Return       0 - инициализация выполнена успешно;
*              1 - ошибки в параметрах инициализации.
*
*.Sample       aux_test.c
**/

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

int aux_init(AUX_MODE *mode, int port, int imask) {

	unsigned div;
	char ctl;

// Вычисляем значение для делителя

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

// Записываем значение делителя частоты

	ctl = inp(0x3fb - 0x100 * port);
	outp(0x3fb - 0x100 * port, ctl | 0x80);

	outp(0x3f9 - 0x100 * port, (div >> 8) & 0x00ff);
	outp(0x3f8 - 0x100 * port, div & 0x00ff);

// Записываем новое управляющее слово

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

// Устанавливаем регистр управления прерыванием

	outp(0x3f9 - 0x100 * port, imask);

	return(0);

}

