-//------- PRACE S EMS pameti ---------------\r
-#include <stdio.h>\r
-#include <fcntl.h>\r
-#include <io.h>\r
-#include <dos.h>\r
-#include <mem.h>\r
-\r
-typedef struct\r
- {\r
- unsigned long length; /* velikost prenasene pameti */\r
- unsigned int sourceH; /* handle pro zdroj (0=konvencni */\r
- unsigned long sourceOff; /* offset zdroje pameti */\r
- unsigned int destH; /* handle pro terc (0=konvencni */\r
- unsigned long destOff; /* offset terce pameti */\r
- } XMOVE;\r
-\r
-int get_emem(void); // Fce pro zachazeni s EMS\r
-int alloc_emem(int n); // Alokuje n KB pameti, vraci handle\r
-int dealloc_emem(int h); // Dealokuje EMS (handle)\r
-int move_emem(XMOVE *p); // presune blok z/do EMS\r
-int mem_emem(unsigned *total, unsigned *free);\r
-\r
-#define pagesizeEMS 0x4000 // pamet EMS je ze 16k stranek\r
-\r
-//int pagesAllocated = 0;\r
-//int totalPages;\r
-char *EmsFrame;\r
-\r
-\r
-//------ Zda je EMS driver dostupny: ret= 1 - ANO, 0 - NE\r
-int isEMS(void)\r
-{\r
- int fh;\r
- union REGS rg;\r
-\r
- if((fh=open("EMMXXXX0",O_RDONLY,&fh)) == -1) return( 0 );\r
-\r
- rg.h.ah = 0x44;\r
- rg.h.al = 0x00;\r
- rg.x.bx = fh;\r
- int86(0x21,&rg,&rg);\r
- close(fh);\r
- if(rg.x.cflag) return(0);\r
- if(rg.x.dx & 0x80)\r
- return( 1 );\r
- else\r
- return( 0 );\r
-}\r
-\r
-//----- Zda je EMS HW dostupny ret= 1 - ANO, 0 - NE\r
-int checkEMS(void)\r
-{\r
- union REGS rg;\r
-\r
- rg.h.ah = 0x40;\r
- int86(0x67,&rg,&rg);\r
- if(rg.h.ah == 0)\r
- return( 1 );\r
- else\r
- return( 0 );\r
-}\r
-\r
-//----- Vraci totalni pocet stranek EMS nebo -1 ----\r
-int coretotalEMS(void)\r
-{\r
- union REGS rg;\r
-\r
- rg.h.ah = 0x42;\r
- int86(0x67,&rg,&rg);\r
- if(rg.x.cflag) return( -1 );\r
- //if(!pagesAllocated)\r
- // { pagesAllocated = 1;\r
- // totalPages = rg.x.dx;\r
- // }\r
- return(rg.x.bx);\r
-}\r
-\r
-//----- Vraci pocet volnych stranek EMS nebo -1 ----\r
-int coreleftEMS(void)\r
-{\r
- union REGS rg;\r
-\r
- //if(pagesAllocated) return(totalPages);\r
- rg.h.ah = 0x42;\r
- int86(0x67,&rg,&rg);\r
- if(rg.x.cflag) return( -1 );\r
- //if(!pagesAllocated)\r
- //pagesAllocated = 1;\r
- //totalPages = rg.x.dx;\r
- //return(totalPages);\r
- return(rg.x.dx);\r
-}\r
-\r
-//----- Vraci EMS page frame (pointr na EMS) nebo NULL ----\r
-char *pageframeEMS(void)\r
-{\r
- union REGS rg;\r
-\r
- rg.h.ah = 0x41;\r
- int86(0x67,&rg,&rg);\r
- if(rg.h.ah != 0)\r
- return( NULL );\r
- else\r
- return((char *)MK_FP(rg.x.bx,0));\r
-}\r
-\r
-//----- Alokuje n stranek - vraci handle na blok stranek nebo 0 ----\r
-unsigned mallocEMS(int n)\r
-{\r
- union REGS rg;\r
-\r
- if(n > coreleftEMS() ) return( 0 );\r
- rg.h.ah = 0x43;\r
- rg.x.bx = n;\r
- int86(0x67,&rg,&rg);\r
- if(rg.h.ah)\r
- return( 0 );\r
- else\r
- return(rg.x.dx);\r
-}\r
-\r
-//----- Dealokuje blok stranek ret = 1-O.K. 0-ERR -----\r
-unsigned freeEMS(unsigned h)\r
-{\r
- union REGS rg;\r
- int i;\r
-\r
- for(i=0; i<5; i++)\r
- { rg.h.ah = 0x45;\r
- rg.x.dx = h;\r
- int86(0x67,&rg,&rg);\r
- if(rg.h.ah == 0) break;\r
+/*
+
+ THE IBM PC PROGRAMMER'S GUIDE TO C\r
+ \r
+ \r
+ \r
+ 3rd Edition\r
+ \r
+ \r
+ \r
+ Matthew Probert\r
+\r
+\r
+ \r
+ COPYRIGHT NOTICE\r
+\r
+\r
+This publication remains the property of Matthew Probert. License is\r
+hereby given for this work to be freely distibuted in whole under the\r
+proviso that credit is given to the author. Sections of this work may be\r
+used and distributed without payment under the proviso that credit is\r
+given to both this work and the author. Source code occuring in this work\r
+may be used within commercial and non-commercial applications without\r
+charge and without reference to the author.
+*/
+ /*\r
+ Various functions for using Expanded memory\r
+ */\r
+#include "src\lib\ems.h"\r
+ emmtest()\r
+ {\r
+ /*\r
+ Tests for the presence of expnaded memory by attempting to\r
+ open the file EMMXXXX0.\r
+ */\r
+ \r
+ union REGS regs;\r
+ struct SREGS sregs;\r
+ int error;\r
+ long handle;\r
+ \r
+ /* Attempt to open the file device EMMXXXX0 */\r
+ regs.x.ax = 0x3d00;\r
+ regs.x.dx = (int)"EMMXXXX0";\r
+ sregs.ds = 0; //????\r
+ intdosx(®s,®s,&sregs);\r
+ handle = regs.x.ax;\r
+ error = regs.x.cflag;\r
+ \r
+ if (!error)\r
+ {\r
+ regs.h.ah = 0x3e;\r
+ regs.x.bx = handle;\r
+ intdos(®s,®s);\r
+ }\r
+ return error;\r