// TO_MODEM.C

#include "sysp.h"
#include "uart_reg.h"

// объявления функций
int com_out( unsigned, char );
int to_modem( unsigned, char* );

/**
*.Name         to_modem
*
*.Title        Передает модему строку, оканчивающуюся нулем.
*
*.Descr        Эта функция передает модему строку, оканчивающуюся нулем.
*
*.Proto        void to_modem( unsigned base_address, char *out_str );
*
*.Params       unsigned base_address - базовый адрес асинхронного адаптера,
*              на котором находится модем;
*
*              char *out_str - массив символов, передаваемый модему,
*              заканчивается нулем
*
*.Return       -1, если нет сигнала DSR от модема
*
*.Sample       to_modem.c
**/

int to_modem( unsigned base_address, char *out_str ) {

	int i;

	// последовательно передаем модему каждый символ из строки

	for( i = 0; out_str[i] != '\0'; i++ )
		if( 0 != com_out( base_address, out_str[i] )) return( -1 );

	// заканчиваем передачу строки и посылаем модему код
	// перевода коретки, вызывающий исполнение введенной команды

	com_out( base_address, 13 );
	return( 0 );
}


/**
*.Name         com_out
*
*.Title        Передает модему один символ.
*
*.Descr        Эта функция передает один символ.
*
*.Proto        void com_out( unsigned base_address, char out_char )
*
*.Params       unsigned base_address - базовый адрес асинхронного адаптера,
*              на котором находится модем;
*
*              char out_char - символ, передаваемый модему,
*
*.Return       -1, если нет сигнала DSR от модема
*
*.Sample       to_modem.c
**/

int com_out( unsigned base_address, char out_char ) {

	unsigned char  next;

	int      i;
	LSR      ls_reg;
	MSR      ms_reg;

	// ожидаем пока модем сообщит о своей готовности
	// по линии DSR

	for( ms_reg.byte = 0, i = 0;
			((ms_reg.bit_reg.dsr == 0) && ( i < 1000)); i++) {

		ms_reg.byte = inp( base_address + MSR_N );
	}

	if( i == 1000 ) return( -1 ); // модем не готов


	// ожидаем пока освободится регистр передатчика
	// и можно будет передать следующий байт

	for( ls_reg.byte = 0; ls_reg.bit_reg.out_ready == 0; )
		ls_reg.byte = inp( base_address + LSR_N );

	// записываем передаваемый байт в регистр данных
	// для последующей его передачи модему

	outp( base_address, out_char );

	return( 0 );
}

