home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************/
- /* */
- /* uio_if_d.c - User I/O InterFace platform Dependent Code */
- /* Author: John C. Fairman August 31, 1990 */
- /* Copyright 1990 by Neuralware Inc. */
- /* */
- /* $Author : $ */
- /* $Date : $ */
- /* $Source : $ */
- /* $Revision : $ */
- /* $Log : $ */
- /* */
- /*******************************************************************/
-
- #include "host.h"
-
- #define UIO_SERVER 1
- #define SERVER_EMULATOR_FILE 2
- #define SKIP_COMPAT_DATA 1
- #include "uio_strc.h"
-
- typedef struct {
- unsigned long eax,
- ebx,
- ecx,
- edx,
- esi,
- edi;
- } UIOREGS;
-
- struct _SEGMENTED_ADDRESS {
- unsigned short offset;
- unsigned short segment;
- };
- union _ADDRESS {
- unsigned short *pointer;
- struct _SEGMENTED_ADDRESS segment_offset_pair;
- };
-
- union _ADDRESS UserTempSegment = {NULL}; /* initialize pointer */
- /* to ensure that union */
- /* is placed in default */
- /* user data segment */
-
- #define HOST_REGS UIOREGS
- #define REGS_AX regs->eax
- #define REGS_BX regs->ebx
- #define REGS_CX regs->ecx
- #define REGS_DX regs->edx
- #define REGS_SI regs->esi
- #define REGS_DI regs->edi
-
- #include <dos.h>
- #include "uio_tran.h"
- #include "uio_if_i.pro"
- #include "uio_if_d.pro"
-
- #ifdef __ZTC__
- #include "io.h"
- #endif
- IMPORT NINT IORtnC;
-
- EXPORT VOID Send_request()
- {
- IORtnC = Data_transfer_ptr->RPC_area.request;
- XUIF();
- }
-
- /**/
- /* FUNCTION */
- EXPORT NINT Receive_command( HOST_REGS *regs )
- {
- unsigned short *UserStackSegment;
-
- VOID uninstall();
-
- /* Optimization for grabbing the command value */
- if ((NINT)REGS_AX == (NINT)CMD_UNINSTALL)
- {
- uninstall();
- }
- else
- {
- if ((NINT)REGS_AX == (NINT)CMD_CREATE)
- {
- Data_transfer_ptr = (DATA_TRANSFER_AREA_T *)(REGS_BX << 16);
- REGS_SI = (UL)0x5A5A;
- REGS_AX = (UL)REQ_ACKNOWLEDGE;
- /* return real mode User I/O */
- /* stack and data segments */
- UserTempSegment.pointer = (unsigned short *)&UserStackSegment;
- REGS_BX = UserTempSegment.segment_offset_pair.segment;
- UserTempSegment.pointer = (unsigned short *)&UserTempSegment;
- REGS_DX = UserTempSegment.segment_offset_pair.segment;
- }
- else
- {
- Handle_command();
- /* Optimization for sending the request and return values */
- REGS_AX = (UL)Data_transfer_ptr->RPC_area.request;
- REGS_BX =
- (UL)Data_transfer_ptr->RPC_area.return_value.buffer_ulong;
- }
- }
- return(1);
- }
-
-
- /* FUNCTION */
- LOCAL VOID uninstall()
- {
- void LeaveTSR();
-
- LeaveTSR();
- }
-
- /**/
-
- EXPORT VOID main(argc, _argv)
- NINT argc;
- TEXT **_argv;
- {
- TEXT *space;
- extern unsigned _psp;
- extern unsigned IOPSP;
- extern VOID * ProgEnd;
- extern void * far malloc(unsigned);
- void InitIO(int, int (*)(HOST_REGS *));
-
- if (argc > 1)
- sscanf(_argv[1], "%d", &Process_id);
-
- IOPSP = _psp;
-
- space = (TEXT *)malloc(0x2000);
- ProgEnd = (VOID *)malloc(2);
- free(space);
-
- InitIO(GVEC-Process_id, Receive_command);
- }
-
-
- /**/
- /* FUNCTION */
- EXPORT VOID UIO_server_error(err_id)
- NINT err_id;
- {
- IORtnC = Data_transfer_ptr->RPC_area.request = err_id;
- XUIF();
- }
-
-