home *** CD-ROM | disk | FTP | other *** search
/ PC Loisirs 18 / cd.iso / sharewar / mikm202 / source / mems.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-18  |  2.3 KB  |  178 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dos.h>
  4. #include <mem.h>
  5.  
  6. #include "mtypes.h"
  7. #include "mems.h"
  8.  
  9. UBYTE ems_version;
  10. UWORD ems_frameseg;
  11. int   ems_active=0;
  12.  
  13.  
  14. /******************************
  15.  
  16.     EMS core functions:
  17.  
  18. *******************************/
  19.  
  20.  
  21.  
  22. int EMS_Detect(void)
  23. {
  24.     void far *handler;
  25.     void far *t;
  26.  
  27.     handler=getvect(0x67);
  28.     t=MK_FP(FP_SEG(handler),10);
  29.  
  30.     return(memcmp(t,"EMMXXXX0",8)==0);
  31. }
  32.  
  33.  
  34.  
  35. UBYTE EMS_Version(void)
  36. {
  37.     _AX=0x4600;
  38.     geninterrupt(0x67);
  39.     return(_AL);
  40. }
  41.  
  42. int EMS_FreePages(void)
  43. {
  44.     _AX=0x4200;
  45.     geninterrupt(0x67);
  46.     return(_BX);
  47. }
  48.  
  49.  
  50. int EMS_TotalPages(void)
  51. {
  52.     _AX=0x4200;
  53.     geninterrupt(0x67);
  54.     return(_DX);
  55. }
  56.  
  57.  
  58. int EMS_FrameSeg(void)
  59. {
  60.     _AX=0x4100;
  61.     geninterrupt(0x67);
  62.     if(!_AH) return(_BX);
  63.     else return -1;
  64. }
  65.  
  66.  
  67. int EMS_Alloc(int frames)
  68. {
  69.     _AX=0x4300;
  70.     _BX=frames;
  71.     geninterrupt(0x67);
  72.     if(!_AH) return(_DX);
  73.     else return -1;
  74. }
  75.  
  76.  
  77. void EMS_Free(int handle)
  78. {
  79.     int t;
  80.  
  81.     _AX=0x4500;
  82.     _DX=handle;
  83.     geninterrupt(0x67);
  84. }
  85.  
  86.  
  87.  
  88. void EMS_Map(int handle,int logp,UBYTE physp)
  89. {
  90.     _AH=0x44;
  91.     _AL=physp;
  92.     _BX=logp;
  93.     _DX=handle;
  94.     geninterrupt(0x67);
  95. }
  96.  
  97.  
  98. char EMS_Save_Map(int handle)
  99. {
  100.     _AH=0x47;
  101.     _DX=handle;
  102.     geninterrupt(0x67);
  103.     return(_AH);
  104. }
  105.  
  106.  
  107. char EMS_Restore_Map(int handle)
  108. {
  109.     _AH=0x48;
  110.     _DX=handle;
  111.     geninterrupt(0x67);
  112.     return(_AH);
  113. }
  114.  
  115.  
  116. /******************************
  117.  
  118.     Higher level functions:
  119.  
  120. ******************************/
  121.  
  122.  
  123. int EMS_Init(void)
  124. {
  125.     if(ems_active) return 1;
  126.  
  127.     if(EMS_Detect()){
  128.         ems_version=EMS_Version();
  129.  
  130.         printf( "EMS version %d.%d detected. Total %d pages, free %d pages. (fseg %X)\n",
  131.                 ems_version>>4,
  132.                 ems_version&0xf,
  133.                 EMS_TotalPages(),
  134.                 EMS_FreePages(),
  135.                 ems_frameseg=EMS_FrameSeg()
  136.         );
  137.  
  138.         ems_active=1;
  139.         return 1;
  140.     }
  141.     else{
  142.         puts("No EMS detected.");
  143.         ems_active=0;
  144.         return 0;
  145.     }
  146. }
  147.  
  148.  
  149. int EMS_AllocMem(long size)
  150. {
  151.     return EMS_Alloc((size+16383)>>14);
  152. }
  153.  
  154.  
  155. /*
  156. void EMS_CopyToEMS(char far *src,long size,int handle,long offset)
  157. {
  158.     long todo;
  159.     char far *dst;
  160.  
  161.     while(size>0){
  162.  
  163.         EMS_Map(handle,offset>>14,0);
  164.  
  165.         todo=16384-(offset&0x3fff);
  166.  
  167.         todo=(todo>size) ? size:todo;
  168.  
  169.         dst=MK_FP(ems_frameseg,offset&0x3fff);
  170.  
  171.         memcpy(dst,src,todo);
  172.  
  173.         size-=todo;
  174.         offset+=todo;
  175.         src+=todo;
  176.     }
  177. }
  178. */