// ===================================================
// Листинг 14. Функции SPX.
//
// Файл spx.c
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include "ipx.h"
#include "spx.h"

/**
* .Name    SPXCheckSPXInstallation
*
* .Title   Проверить присутствие протокола SPX
*
* .Descr      Функция проверяет, загружен ли драйвер SPX
*          и возвращает его параметры.
*
* .Params  struct *SPXParams - указатель на структуру,
*          в которую будут записаны параметры SPX.
*
* .Return  FFh - протокол SPX загружен
*          00h - протокол SPX не загружен
**/

int SPXCheckSPXInstallation(struct SPXParams *Params) {

	struct IPXSPX_REGS iregs;

	iregs.bx = SPX_CMD_INSTALL_CHECK;
	iregs.ax = 0;
	ipxspx_entry( (void far *)&iregs );
	Params->SPXVersion = iregs.bx;
	Params->SPXMaxConnections = iregs.cx;
	Params->SPXAvailableConnCount = iregs.dx;
	return(iregs.ax & 0xFF);
}

/**
* .Name    SPXListenForConnection
*
* .Title   Ожидание соединения с клиентом
*
* .Descr      Функция выдает запрос на соединение
*          с клиентом, который должен для выполнения
*          соединения вызвать функцию SPXEstablishConnection().
*
* .Params  struct ECB *ConnECB - указатель на ECB,
*                    заполненное для установления соединения.
*          unsigned char RetryCount   - счетчик повторов;
*          unsigned char WatchdogFlag - проверка связи.
*
* .Return  Ничего.
**/

void SPXListenForConnection(struct ECB *ConnECB,
	unsigned char RetryCount, unsigned char WatchdogFlag) {

	struct IPXSPX_REGS iregs;

	iregs.bx = SPX_CMD_LISTEN_FOR_CONNECTION;
	iregs.ax = RetryCount |
		((unsigned)(WatchdogFlag << 8) & 0xff00);
	iregs.es = FP_SEG((void far*)ConnECB);
	iregs.si = FP_OFF((void far*)ConnECB);

	ipxspx_entry( (void far *)&iregs );
}

/**
* .Name    SPXEstablishConnection
*
* .Title   Установление соединения с клиентом
*
* .Descr      Функция устанавливает соединение
*          с клиентом, который должен для выполнения
*          соединения вызвать функцию SPXListenForConnection().
*
* .Params  struct ECB *ConnECB - указатель на ECB,
*                    заполненный для установления соединения.
*          unsigned char RetryCount   - счетчик повторов;
*          unsigned char WatchdogFlag - проверка связи.
*
* .Return  Ничего.
**/

int SPXEstablishConnection(struct ECB *ConnECB, unsigned *ConnID,
	unsigned char RetryCount, unsigned char WatchdogFlag) {

	struct IPXSPX_REGS iregs;

	iregs.bx = SPX_CMD_ESTABLISH_CONNECTION;
	iregs.ax = RetryCount |
		((unsigned)(WatchdogFlag << 8) & 0xff00);
	iregs.es = FP_SEG((void far*)ConnECB);
	iregs.si = FP_OFF((void far*)ConnECB);

	ipxspx_entry( (void far *)&iregs );
	*ConnID = iregs.dx;
	return(iregs.ax & 0xff);
}

/**
* .Name    SPXListenForSequencedPacket
*
* .Title   Прием пакета SPX
*
* .Descr      Функция выдает запрос на прием пакета SPX.
*
* .Params  struct ECB *LsECB - указатель на ECB,
*                    заполненный для приема SPX-пакета.
*
* .Return  Ничего.
**/

void SPXListenForSequencedPacket(struct ECB *LsECB) {

	struct IPXSPX_REGS iregs;

	iregs.bx = SPX_CMD_LISTEN_FOR_SEQUENCED_PACKET;
	iregs.es = FP_SEG((void far*)LsECB);
	iregs.si = FP_OFF((void far*)LsECB);

	ipxspx_entry( (void far *)&iregs );
}

/**
* .Name    SPXSendSequencedPacket
*
* .Title   Передача пакета SPX
*
* .Descr      Функция выдает запрос на передачу пакета SPX.
*
* .Params  struct ECB *TxECB - указатель на ECB,
*                    заполненный для передачи SPX-пакета.
*
* .Return  Ничего.
**/

void SPXSendSequencedPacket(struct ECB *TxECB,
			unsigned ConnID) {

	struct IPXSPX_REGS iregs;

	iregs.bx = SPX_CMD_SEND_SEQUENCED_PACKET;
	iregs.es = FP_SEG((void far*)TxECB);
	iregs.si = FP_OFF((void far*)TxECB);
	iregs.dx = ConnID;

	ipxspx_entry( (void far *)&iregs );
}
