// REGISTER.C

#include "uart_reg.h"
#include <graph.h>


unsigned com_address( int );

void main(void) {

	unsigned adr;
	int port;
	unsigned char data;

	LCR     reg_lcr;
	LSR     reg_lsr;
	MCR     reg_mcr;
	MSR     reg_msr;
	ICR     reg_icr;
	IIDR    reg_iidr;

	printf(" Программа отображает состояние регистров UART.\n\n");

	printf(" Введите номер асинхронного порта (1-4): ");
	scanf("%d", &port );

	// определяем адрес порта port

	adr = com_address( --port );


	printf("\n Управляющий регистр = %Xh\n\n", data =
							(unsigned char ) inp( adr + 3 ) );

	reg_lcr.byte = data;

	printf("    длина слова в байтах %d\n"
		   "    количество стоповых битов %d\n"
		   "    контроль %s\n"
		   "    фиксация четности %s\n"
		   "    установка перерыва: %s\n"
		   "    порты %Xh, %Xh используются %s\n",

			reg_lcr.bit_reg.len + 5,
			reg_lcr.bit_reg.stop + 1,
			(reg_lcr.bit_reg.parity == 3) ? "на четность" :
				((reg_lcr.bit_reg.parity == 1 ) ? "на нечетность" :
											  "четности не выполняется"),

			(reg_lcr.bit_reg.stuck_parity == 1) ? "производится" :
											  "не производится",

			(reg_lcr.bit_reg.en_break_ctl == 1) ? "есть" :
											  "нет",

			adr, adr + 1,
			(reg_lcr.bit_reg.dlab == 1) ? "для загрузки делителя частоты" :
									  "как обычно"

	);




	printf("\n Регистр состояния линии = %Xh\n\n", data =
							(unsigned char ) inp( adr + 5 ) );

	reg_lsr.byte = data;

	printf("    данные готовы для чтения: %d\n"
		   "    ошибка переполнения: %d\n"
		   "    ошибка четности: %d\n"
		   "    ошибка синхронизации: %d\n"
		   "    обнаружен запрос на прерывание \"BREAK\": %d\n"
		   "    регистр хранения передатчика пуст: %d\n"
		   "    регистр сдвига передатчика пуст: %d\n"
		   "    тайм-аут: %d\n",

			reg_lsr.bit_reg.in_ready,
			reg_lsr.bit_reg.overflow,
			reg_lsr.bit_reg.parity,
			reg_lsr.bit_reg.synxr,
			reg_lsr.bit_reg.break_detect,
			reg_lsr.bit_reg.out_ready,
			reg_lsr.bit_reg.shift_ready,
			reg_lsr.bit_reg.taimout
	);

	printf("\n\n нажмите любую клавишу для продолжения ");
	getch();




	printf("\n Регистр управления модемом = %Xh\n\n", data =
									 ( unsigned char ) inp( adr + 4 ));
	reg_mcr.byte = data;


	printf("    линия dtr: %d\n"
		   "    линия rts: %d\n"
		   "    линия out1: %d\n"
		   "    линия out2: %d\n"
		   "    запуск диагностики: %d\n",

			reg_mcr.bit_reg.dtr,
			reg_mcr.bit_reg.rts,
			reg_mcr.bit_reg.out1,
			reg_mcr.bit_reg.out2,
			reg_mcr.bit_reg.diag
	);


	printf("\n Регистр состояния модема = %Xh\n\n", data =
									( unsigned char ) inp( adr + 6 ) );
	reg_msr.byte = data;


	printf("    линия измкнила cts состояние: %d\n"
		   "    линия изменила dsr состояние: %d\n"
		   "    линия изменила ri состояние: %d\n"
		   "    линия изменила dcd состояние: %d\n"
		   "    линия cts: %d\n"
		   "    линия dsr: %d\n"
		   "    линия ri: %d\n"
		   "    линия dcd: %d\n",

			reg_msr.bit_reg.change_cts,
			reg_msr.bit_reg.change_dsr,
			reg_msr.bit_reg.change_ri,
			reg_msr.bit_reg.change_dcd,
			reg_msr.bit_reg.cts,
			reg_msr.bit_reg.dsr,
			reg_msr.bit_reg.ri,
			reg_msr.bit_reg.dcd
	);


	printf("\n\n нажмите любую клавишу для продолжения ");
	getch();


	printf("\n\n Регистр управления прерываниями = %Xh\n\n", data =
								   ( unsigned char ) inp( adr + 1 ));

	reg_icr.byte = data;


	printf("    разрешение прерывания при готовности принимаемых данных: %d\n"
		   "    разрешение прерывваний пасле передачи данных: %d\n"

		   "    разрешение прерыывания при обнаружении"
		   "    состояния \"BREAK\": %d\n"

		   "    разрешение прерыывания при изменении состояния линий"
		   " cts, dsr, ri, dcd: %d\n",

			reg_icr.bit_reg.in_ready,
			reg_icr.bit_reg.out_ready,
			reg_icr.bit_reg.err,
			reg_icr.bit_reg.change
	);



	printf("\n\n Регистр идентификации прерываний = %Xh\n\n", data =
									( unsigned char ) inp( adr + 2 ));

	reg_iidr.byte = data;


	printf("    нет прерываний ожидающих обслуживания: %d\n"
		   "    идентификатор прерывания: %d\n",

			reg_iidr.bit_reg.no_inter,
			reg_iidr.bit_reg.inter_id
	);
}
