lib-capi-adk/C20LIB/SOURCE/CDOS.C

228 lines
6.3 KiB
C

/*---------------------------------------------------------------------------*\
CDOS.C Version 1.2 1997 AVM
This file contains the source of the operating system specific
CAPI functions, here for DOS. See CAPI 2.0 spec.
\*---------------------------------------------------------------------------*/
#include <dos.h>
#include <memory.h>
#include "capi20.h"
#define CAPI_REGISTER_NR 0x01
#define CAPI_RELEASE_NR 0x02
#define CAPI_PUT_MESSAGE_NR 0x03
#define CAPI_GET_MESSAGE_NR 0x04
#define CAPI_SET_SIGNAL_NR 0x05
#define CAPI_DEINSTALL_NR 0x06
#define CAPI_GET_MANUFACTURER_NR 0xF0
#define CAPI_GET_VERSION_NR 0xF1
#define CAPI_GET_SERIAL_NUMBER_NR 0xF2
#define CAPI_GET_PROFILE_NR 0xF3
#define CAPI_MANUFACTURER_NR 0xFF
static int TrapNumber = 0xF1;
/*---------------------------------------------------------------------------*/
unsigned CAPI20_ISINSTALLED (void) {
char __far *p = (char __far *) (long) _dos_getvect (TrapNumber);
return 0 == _fmemcmp (p+11, "CAPI20", 6);
}
/*---------------------------------------------------------------------------*/
void CAPI20_SET_TRAP (unsigned char Number) {
TrapNumber = Number;
}
/*---------------------------------------------------------------------------*/
_cword CAPI20_REGISTER (CAPI_MESSAGE Buffer, unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_REGISTER_NR;
Regs.x.cx = MsgBufSize;
Regs.x.dx = MaxB3Connection;
Regs.x.si = MaxB3Blks;
Regs.x.di = MaxSizeB3;
Regs.x.bx = _FP_OFF (Buffer);
Segs.es = _FP_SEG (Buffer);
_int86x (TrapNumber, &Regs, &Regs, &Segs);
*ErrorCode = (CAPI_REGISTER_ERROR) Regs.x.bx;
#if defined (CPROT)
if (Regs.x.ax == 0x0000)
CAPI_PROTOCOL_TEXT ("CAPI_REGISTER error \n", Regs.x.bx);
#endif
return (_cword) Regs.x.ax;
}
/*---------------------------------------------------------------------------*/
MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_RELEASE_NR;
Regs.x.dx = Appl_Id;
_int86x(TrapNumber, &Regs, &Regs, &Segs);
#if defined (CPROT)
if (Regs.x.ax != 0x0000)
CAPI_PROTOCOL_TEXT ("CAPI_RELEASE error 0x%04x\n", Regs.x.ax);
#endif
return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax;
}
/*---------------------------------------------------------------------------*/
MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_PUT_MESSAGE_NR;
Regs.x.dx = Appl_Id;
Regs.x.bx = _FP_OFF (Msg);
Segs.es = _FP_SEG (Msg);
_int86x(TrapNumber, &Regs, &Regs, &Segs);
#if defined (CPROT)
if (Regs.x.ax == 0x0000)
CAPI_PROTOCOL_MESSAGE (Msg);
else
CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", Regs.x.ax);
#endif
return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax;
}
/*---------------------------------------------------------------------------*/
MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE __far * ReturnMessage) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_GET_MESSAGE_NR;
Regs.x.dx = Appl_Id;
_int86x(TrapNumber, &Regs, &Regs, &Segs);
(*((unsigned __far *)&(*ReturnMessage))) = Regs.x.bx;
(*((unsigned __far *)&(*ReturnMessage) + 1)) = Segs.es;
#if defined (CPROT)
if (Regs.x.ax == 0x0000)
CAPI_PROTOCOL_MESSAGE (*ReturnMessage);
else if (Regs.x.ax != CapiReceiveQueueEmpty)
CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", Regs.x.ax);
#endif
return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax;
}
/*---------------------------------------------------------------------------*/
MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL (unsigned ApplId, void (__far * CallBack) (void), void __far *CallBackPar) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_SET_SIGNAL_NR;
Regs.x.dx = ApplId;
Regs.x.di = _FP_OFF (CallBackPar);
Regs.x.si = _FP_SEG (CallBackPar);
Regs.x.bx = _FP_OFF (CallBack);
Segs.es = _FP_SEG (CallBack);
_int86x (TrapNumber, &Regs, &Regs, &Segs);
#if defined (CPROT)
if (Regs.x.ax != 0x0000)
CAPI_PROTOCOL_TEXT ("CAPI_SET_SIGNAL error \n", Regs.x.ax);
#endif
return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax;
}
/*---------------------------------------------------------------------------*/
CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_GET_MANUFACTURER_NR;
Regs.x.bx = _FP_OFF (LpBuffer);
Segs.es = _FP_SEG (LpBuffer);
_int86x(TrapNumber, &Regs, &Regs, &Segs);
return LpBuffer;
}
/*---------------------------------------------------------------------------*/
CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_GET_VERSION_NR;
_int86x(TrapNumber, &Regs, &Regs, &Segs);
version[0] = Regs.h.ah;
version[1] = Regs.h.al;
version[2] = Regs.h.dh;
version[3] = Regs.h.dl;
return version;
}
/*---------------------------------------------------------------------------*/
CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_GET_SERIAL_NUMBER_NR;
Regs.x.bx = _FP_OFF (LpBuffer);
Segs.es = _FP_SEG (LpBuffer);
_int86x(TrapNumber, &Regs, &Regs, &Segs);
return LpBuffer;
}
/*---------------------------------------------------------------------------*/
MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) {
struct _SREGS Segs;
union _REGS Regs;
Regs.h.ah = 20;
Regs.h.al = CAPI_GET_PROFILE_NR;
Regs.x.cx = Controller;
Regs.x.bx = _FP_OFF (LpBuffer);
Segs.es = _FP_SEG (LpBuffer);
_int86x(TrapNumber, &Regs, &Regs, &Segs);
#if defined (CPROT)
if (Regs.x.ax != 0x0000)
CAPI_PROTOCOL_TEXT ("CAPI_GET_PROFILE error \n", Regs.x.ax);
#endif
return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax;
}