home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / e / e065 / 2.ddi / UIO_IF_D.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-28  |  3.9 KB  |  152 lines

  1. /*******************************************************************/
  2. /*                                                                 */
  3. /*    uio_if_d.c - User I/O InterFace platform Dependent Code      */
  4. /*    Author: John C. Fairman           August 31, 1990            */
  5. /*    Copyright 1990 by Neuralware Inc.                            */
  6. /*                                                                 */
  7. /*    $Author   :  $                                               */
  8. /*    $Date     :  $                                               */
  9. /*    $Source   :  $                                               */
  10. /*    $Revision :  $                                               */
  11. /*    $Log      :  $                                               */
  12. /*                                                                 */
  13. /*******************************************************************/
  14.  
  15. #include "host.h"
  16.  
  17. #define UIO_SERVER   1
  18. #define SERVER_EMULATOR_FILE 2
  19. #define SKIP_COMPAT_DATA       1
  20. #include "uio_strc.h"
  21.  
  22. typedef struct {
  23.     unsigned long   eax,
  24.                     ebx,
  25.                     ecx,
  26.                     edx,
  27.                     esi,
  28.                     edi;
  29. }   UIOREGS;
  30.  
  31. struct _SEGMENTED_ADDRESS {
  32.       unsigned short offset;
  33.       unsigned short segment;
  34.                   };
  35. union  _ADDRESS {
  36.       unsigned short *pointer;
  37.       struct _SEGMENTED_ADDRESS segment_offset_pair;
  38.            };
  39.  
  40. union  _ADDRESS UserTempSegment = {NULL}; /* initialize pointer */
  41.                             /* to ensure that union */
  42.                             /* is placed in default */
  43.                             /* user data segment */
  44.  
  45. #define HOST_REGS UIOREGS
  46. #define REGS_AX regs->eax
  47. #define REGS_BX regs->ebx
  48. #define REGS_CX regs->ecx
  49. #define REGS_DX regs->edx
  50. #define REGS_SI regs->esi
  51. #define REGS_DI regs->edi
  52.  
  53. #include <dos.h>
  54. #include "uio_tran.h"
  55. #include "uio_if_i.pro"
  56. #include "uio_if_d.pro"
  57.  
  58. #ifdef __ZTC__
  59. #include "io.h"
  60. #endif
  61. IMPORT NINT IORtnC;
  62.  
  63. EXPORT VOID Send_request()
  64. {
  65.   IORtnC = Data_transfer_ptr->RPC_area.request;
  66.   XUIF();
  67. }
  68.  
  69. /* */
  70. /* FUNCTION */
  71. EXPORT NINT Receive_command( HOST_REGS *regs )
  72. {
  73.   unsigned short *UserStackSegment;
  74.  
  75.   VOID uninstall();
  76.  
  77.   /* Optimization for grabbing the command value */
  78.   if ((NINT)REGS_AX == (NINT)CMD_UNINSTALL)
  79.   {
  80.     uninstall();
  81.   }
  82.   else
  83.   {
  84.     if ((NINT)REGS_AX == (NINT)CMD_CREATE)
  85.     {
  86.       Data_transfer_ptr = (DATA_TRANSFER_AREA_T *)(REGS_BX << 16);
  87.       REGS_SI = (UL)0x5A5A;
  88.       REGS_AX = (UL)REQ_ACKNOWLEDGE;
  89.                             /* return real mode User I/O */
  90.                             /* stack and data segments */
  91.       UserTempSegment.pointer = (unsigned short *)&UserStackSegment;
  92.       REGS_BX = UserTempSegment.segment_offset_pair.segment;
  93.       UserTempSegment.pointer = (unsigned short *)&UserTempSegment;
  94.       REGS_DX = UserTempSegment.segment_offset_pair.segment;
  95.     }
  96.     else
  97.     {
  98.       Handle_command();
  99.       /* Optimization for sending the request and return values */
  100.       REGS_AX = (UL)Data_transfer_ptr->RPC_area.request;
  101.       REGS_BX =
  102.         (UL)Data_transfer_ptr->RPC_area.return_value.buffer_ulong;
  103.     }
  104.   }
  105.   return(1);
  106. }
  107.  
  108.  
  109. /* FUNCTION */
  110. LOCAL VOID uninstall()
  111. {
  112.   void LeaveTSR();
  113.  
  114.   LeaveTSR();
  115. }
  116.  
  117. /* */
  118.  
  119. EXPORT VOID main(argc, _argv)
  120. NINT argc;
  121. TEXT **_argv;
  122. {
  123.   TEXT *space;
  124.   extern unsigned     _psp;
  125.   extern unsigned     IOPSP;
  126.   extern VOID *       ProgEnd;
  127.   extern void * far   malloc(unsigned);
  128.   void                InitIO(int, int (*)(HOST_REGS *));
  129.  
  130.   if (argc > 1)
  131.     sscanf(_argv[1], "%d", &Process_id);
  132.  
  133.   IOPSP = _psp;
  134.  
  135.   space = (TEXT *)malloc(0x2000);
  136.   ProgEnd = (VOID *)malloc(2);
  137.   free(space);
  138.  
  139.   InitIO(GVEC-Process_id, Receive_command);
  140. }
  141.  
  142.  
  143. /* */
  144. /* FUNCTION */
  145. EXPORT VOID UIO_server_error(err_id)
  146. NINT err_id;
  147. {
  148.   IORtnC = Data_transfer_ptr->RPC_area.request = err_id;
  149.   XUIF();
  150. }
  151.  
  152.