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


void  do_chat(void);
void  help(void);
void  origin(void);
void  answer(void);


unsigned com_port_num;
unsigned char  mnp = 0;


void main( int argc, char *argv[] ) {

	unsigned key, f_num, doc = 0,
				signatura;


	printf("\n(С) Frolov G.V. Коммуникационная программа, "
			 "использующая FOSSIL драйвер\n");

	// параметр программы должен содержать номер
	// используемого COM-порта


	if( argc < 2 ) help();
	com_port_num = ( unsigned ) atoi( argv[1] );

	// инициализируем FOSSIL драйвер

	_asm {
		mov   ah,4h
		mov   dx,com_port_num
		int   14h
		mov   key,ax
		mov   f_num,bl
		mov   doc,bh
	}

	// если FOSSIL драйвер не установлен завершаем программу

	if( key != 0x1954 ) {
		printf("\nFOSSIL драйвер не установлен\n");
		exit(-1);
	}

	// определяем возможность эмуляции FOSSIL драйвером
	// протокола MNP

	_asm {
		mov   ah,0E0h
		mov   al,6h
		xor   bx,bx
		int   14h
		mov   signatura,bx
	}

	mnp = ( signatura != 0x4D58 ) ? 0 : 1;

	printf("Эмуляция MNP %s.\n\n", (mnp) ? "поддерживается"
											  : "не поддерживается");

	if(mnp)
		printf("PageUp - режим вызова, PageDown - режим ответа");

	_asm {

		// устанавливаем скорость обмена и формат данных

		xor   ah,ah
		mov   al,0A3h
		mov   dx,com_port_num
		int   14h

		// устанавливаем сигнал DTR в активное состояние

		mov   ah,6
		mov   al,1
		mov   dx,com_port_num
		int   14h

		// запрещаем использование режима управления потоком

		mov   ah,0Fh
		xor   al,al
		mov   dx,com_port_num
		int   14h
	}

	// начинаем обмен данными между компьютером и модемом

	do_chat();
}


void do_chat( void ) {

	while(1) {

		unsigned char key,stey;
		unsigned i,j;

		// если пользователь нажал на клавиатуру, получаем код
		// нажатого символа и передаем его модему

		if( kbhit() ) {
			key =  getch();

			if(( key == 0 ) && mnp) {
				key =  getch();
				if( key == 73 )      origin();
				else if( key == 81 ) answer();
				continue;
			}

			// по нажатию клавиши "ESC" выходим из программы

			if( key == 27 ) {

				_asm {

					// сбрасываем сигнал DTR

					mov   ah,06h
					xor   al,al
					mov   dx,com_port_num
					int   14h

					// деинициализируем FOSSIL драйвер

					mov   ah,05h
					mov   dx,com_port_num
					int   14h
				}

				return;
			}

			// если нажаата клавиша "Enter" переводим строку

			if( key == '\r' ) {
				key = 13;
				putch('\n');
			}

			// выводим ASCII код нажатого на клавиатуре символа
			// на экран

			putch(key);

			// передаем ASCII код нажатого на клавиатуре символа
			// FOSSIL драйверу, для дальнейшей передачи его модему

			_asm {
				mov   dx,com_port_num
				mov   ah,1
				mov   al,key
				int   14h
			}
		}

		// определяем состояние приемного буфера FOSSIL драйвера

		_asm {
			mov   dx,com_port_num
			mov   ah,3
			int   14h
			and   ah,01h
			mov   stey,ah
		}

		// если приемный буфер содержит данные выводим их
		// на экран дисплея

		if( stey > 0 ) {
			_asm {
				mov   dx,com_port_num
				mov   ah,2
				int   14h
				mov   stey,al
			}
			putch(stey);
		}
	}
}


void help( void ) {

	printf("Неправильно задан параметр программы \n"
			 "FOSSILEX n, где n - номер порта от 0 до 3\n");
	exit(0);
}

void  origin(void) {

	// переключаем эмулятор MNP в режим вызова удаленного модема

	_asm {
		mov   ah,0E0h
		mov   al, 2
		mov   bl,0
		mov   bh,1
		mov   dx,com_port_num
		int   14h
	}
	putch(7);
}


void  answer(void){

	// переключаем эмулятор MNP в режим ответа на
	// вызов удаленного модема

	_asm {
		mov   ah,0E0h
		mov   al,2
		mov   bl,1
		mov   bh,1
		mov   dx,com_port_num
		int   14h
	}
	putch(7);
	putch(7);
}

