home *** CD-ROM | disk | FTP | other *** search
/ Software Recommendations - 1998 Season 1 / DNBCD4.iso / share / DOS / ipxcopy / SRC.ZIP / SRC / DPMICALL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-11  |  3.7 KB  |  199 lines

  1. /*
  2.  
  3.    DPMICALL.C
  4.  
  5.    Verschiedene DPMI Aufrufe
  6.  
  7.    Achtung: 16-Bit: LARGE
  8.             32-Bit: SMALL (linear executable)
  9.  
  10.    (c) 1996 Oliver Kraus
  11.  
  12.    kraus@lrs.e-technik.uni-erlangen.de
  13.  
  14. */
  15.  
  16. #include "dpmicall.h"
  17. #ifdef C_DPMI
  18.  
  19. #ifdef __WATCOMC__
  20. #include <i86.h>
  21. #endif
  22.  
  23. #include <dos.h>
  24. #include <stdio.h>
  25. #include <string.h>
  26.  
  27. void DPMI_FAR *dpmi_get_dos_ptr(short selector)
  28. {
  29. #ifdef C_DPMI386
  30.    return MK_FP(selector,0);
  31. #else
  32.    return (void DPMI_FAR *)(((unsigned long)selector)<<16);
  33. #endif
  34. }
  35.  
  36. void dpmi_copy_to_dos(short selector, void *ptr, size_t len)
  37. {
  38.    void DPMI_FAR *dest_ptr;
  39.    dest_ptr = dpmi_get_dos_ptr(selector);
  40. #ifdef C_DPMI386
  41.    _fmemcpy(dest_ptr, ptr, len);
  42. #else
  43.    memcpy(dest_ptr, ptr, len);
  44. #endif
  45. }
  46.  
  47. void dpmi_copy_from_dos(short selector, void *ptr, size_t len)
  48. {
  49.    void DPMI_FAR *src_ptr;
  50.    src_ptr = dpmi_get_dos_ptr(selector);
  51. #ifdef C_DPMI386
  52.    _fmemcpy(ptr, src_ptr, len);
  53. #else
  54.    memcpy(ptr, src_ptr, len);
  55. #endif
  56. }
  57.  
  58.  
  59. int dpmi_alloc_dos_memory(int size, short *selector, short *segment )
  60. {
  61. #ifdef C_DPMI386
  62.     union REGS regs;
  63.    struct SREGS sregs;
  64.  
  65.     memset(&sregs,0,sizeof(sregs));
  66.     regs.w.ax=0x0100;
  67.    regs.w.bx=(unsigned short)((size+15)/16);
  68.    int386x( 0x031, ®s, ®s, &sregs);
  69.  
  70.    if ( segment != NULL )
  71.       *segment=regs.w.ax;
  72.    if ( selector != NULL )
  73.       *selector=regs.w.dx;
  74.  
  75.    return 1;
  76. #else
  77.    union REGS regs;
  78.    regs.x.ax=0x04800;
  79.    regs.x.bx=(unsigned)((size+15)/16);
  80.    int86( 0x021, ®s, ®s);
  81.    if ( segment != NULL )
  82.       *segment=(short)(unsigned short)regs.x.ax;
  83.    if ( selector != NULL )
  84.       *selector=(short)(unsigned short)regs.x.ax;
  85.  
  86.    return 1;
  87. #endif
  88. }
  89.  
  90. int dpmi_free_dos_memory(short selector)
  91. {
  92. #ifdef C_DPMI386
  93.     union REGS regs;
  94.    struct SREGS sregs;
  95.  
  96.    segread(&sregs);
  97.  
  98.    regs.w.ax=0x0101;
  99.    regs.w.dx=(unsigned short)(selector);
  100.    int386x( 0x031, ®s, ®s, &sregs);
  101.  
  102.    return 1;
  103. #else
  104.    union REGS regs;
  105.    struct SREGS sregs;
  106.  
  107.    segread(&sregs);
  108.  
  109.    regs.x.ax=0x04900;
  110.    sregs.es=selector;
  111.    int86x( 0x021, ®s, ®s, &sregs);
  112.  
  113.    return 1;
  114. #endif
  115. }
  116.  
  117. unsigned dpmi_simulate_rmi(int int_no, rminfo_struct *rmi)
  118. {
  119. #ifdef C_DPMI386
  120.     union REGS regs;
  121.     struct SREGS sregs;
  122.  
  123.    /* stack soll vom host bereitgestellt werden */
  124.    rmi->sp = 0;
  125.    rmi->ss = 0;
  126.    rmi->ip = 0;
  127.    rmi->cs = 0;
  128.  
  129.    segread(&sregs);
  130.  
  131.     regs.w.ax = 0x0300;
  132.    regs.h.bl = int_no;
  133.     regs.h.bh = 0;
  134.     regs.w.cx = 0;
  135.    sregs.es = FP_SEG(rmi);
  136.    regs.x.edi = FP_OFF(rmi);
  137.    int386x( 0x31, ®s, ®s, &sregs );
  138.  
  139.    return rmi->flags & 1;
  140. #else
  141.     union REGS regs;
  142.    struct SREGS sregs;
  143.  
  144.    segread(&sregs);
  145.  
  146.    regs.x.ax = (unsigned)rmi->eax;
  147.    regs.x.bx = (unsigned)rmi->ebx;
  148.    regs.x.cx = (unsigned)rmi->ecx;
  149.    regs.x.dx = (unsigned)rmi->edx;
  150.    regs.x.di = (unsigned)rmi->edi;
  151.    regs.x.si = (unsigned)rmi->esi;
  152.  
  153.    sregs.es = rmi->es;
  154.    sregs.ds = rmi->ds;
  155.  
  156.    int86x( int_no, ®s, ®s, &sregs );
  157.  
  158.    rmi->es = (short)(unsigned short)sregs.es;
  159.    rmi->ds = (short)(unsigned short)sregs.ds;
  160.  
  161.    rmi->eax = (long)(unsigned long)regs.x.ax;
  162.    rmi->ebx = (long)(unsigned long)regs.x.bx;
  163.    rmi->ecx = (long)(unsigned long)regs.x.cx;
  164.    rmi->edx = (long)(unsigned long)regs.x.dx;
  165.    rmi->edi = (long)(unsigned long)regs.x.di;
  166.    rmi->esi = (long)(unsigned long)regs.x.si;
  167.  
  168.    return regs.x.cflag & 1;
  169. #endif
  170. }
  171.  
  172. #ifdef dpmicall_main
  173.  
  174. void main(void)
  175. {
  176.    char *s = "Hello DPMI!$";
  177.    rminfo_struct rmi;
  178.    short selector, segment;
  179.  
  180.    dpmi_alloc_dos_memory(strlen(s)+1, &selector, &segment );
  181.    dpmi_copy_to_dos(selector, s, strlen(s)+1);
  182.    rmi.eax = 0x0900;
  183.    rmi.ds = segment;
  184.    rmi.edx = 0;
  185.    dpmi_simulate_rmi(0x021, &rmi);
  186.    dpmi_free_dos_memory(selector );
  187.  
  188.    rmi.eax = 0x03000;
  189.    dpmi_simulate_rmi(0x021, &rmi);
  190.    printf("\nDOS Version: %d.%d\n",
  191.       (int)(rmi.eax&255), (int)((rmi.eax>>8)&255));
  192.  
  193. }
  194.  
  195.  
  196. #endif
  197.  
  198. #endif /* C_DPMI */
  199.