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

void main(void);
void main(void) {

	unsigned frame, err;
	unsigned total, free;
	unsigned handle;
	char ver;

// Это сообщение будет переписано сначала из
// области стандартной памяти в область дополнительной,
// затем обратно в область основной.

	static char test_msg[] = "Тестовое сообщение для "
						"записи в область EMS.";

	char buf[80];
	char _far *ptr;
	int i;

// Проверяем, установлен ли драйвер EMS.

	if(ems_init() != 0) {
		printf("\nДрайвер EMS не установлен.");
		exit(-1);
	}

// Если драйвер установлен, определяем его состояние.

	printf("\nДрайвер EMS установлен, состояние: %02.2X.",
		ems_stat());

// Выводим номер версии драйвера

	if((err = ems_ver(&ver)) != 0) {
		printf("\nОшибка: %02.2X", err);
		exit(-1);
	}
	printf("\nВерсия EMM: %02.2X", ver);

// Определяем сегмент окна доступа

	if((err = ems_fram(&frame)) != 0) {
		printf("\nОшибка: %02.2X", err);
		exit(-1);
	}

	printf("\nСегмент окна доступа: %04.4X",
		frame);

// Определяем общее количество страниц и
// количество доступных страниц.

	if((err = ems_page(&total, &free)) != 0) {
		printf("\nОшибка: %02.2X", err);
		exit(-1);
	}

	printf("\nОбщее количество страниц EMS: %d"
			 "\nКоличество доступных страниц: %d",
			 total, free);

// Заказываем пул в дополнительной памяти.

	if((err = ems_open(free, &handle)) != 0) {
		printf("\nОшибка: %02.2X", err);
		exit(-1);
	}

// Отображаем нулевую физическую страницу
// на нулевую логическуб страницу пула.

	if((err = ems_map(0, 0, handle)) != 0) {
		printf("\nОшибка: %02.2X", err);
		exit(-1);
	}

// Конструируем указатель на физическую страницу.

	ptr = FP_MAKE(frame,0);

// Копируем тестовое сообщение в
// дополнительную память.

	printf("\nКопируем в EMS: %s",test_msg);

	for(i=0; test_msg[i] != 0; i++)
		ptr[i] = test_msg[i];

// Теперь копируем это сообщение обратно
// в стандартную память.

	for(i=0; ptr[i] != 0; i++)
		buf[i] = ptr[i];
	buf[i] = 0;

// Выводим сообщение на экран для
// проверки.

	printf("\nСкопировано из EMS: %s",buf);

// Закрываем пул.

	if((err = ems_clos(&handle)) != 0) {
		printf("\nОшибка: %02.2X", err);
		exit(-1);
	}

	exit(0);
}

