1 //------- PRACE S EMS pameti ---------------
\r
10 unsigned long length; /* velikost prenasene pameti */
\r
11 unsigned int sourceH; /* handle pro zdroj (0=konvencni */
\r
12 unsigned long sourceOff; /* offset zdroje pameti */
\r
13 unsigned int destH; /* handle pro terc (0=konvencni */
\r
14 unsigned long destOff; /* offset terce pameti */
\r
17 int get_emem(void); // Fce pro zachazeni s EMS
\r
18 int alloc_emem(int n); // Alokuje n KB pameti, vraci handle
\r
19 int dealloc_emem(int h); // Dealokuje EMS (handle)
\r
20 int move_emem(XMOVE *p); // presune blok z/do EMS
\r
21 int mem_emem(unsigned *total, unsigned *free);
\r
23 #define pagesizeEMS 0x4000 // pamet EMS je ze 16k stranek
\r
25 //int pagesAllocated = 0;
\r
30 //------ Zda je EMS driver dostupny: ret= 1 - ANO, 0 - NE
\r
36 if((fh=open("EMMXXXX0",O_RDONLY,&fh)) == -1) return( 0 );
\r
41 int86(0x21,&rg,&rg);
\r
43 if(rg.x.cflag) return(0);
\r
50 //----- Zda je EMS HW dostupny ret= 1 - ANO, 0 - NE
\r
56 int86(0x67,&rg,&rg);
\r
63 //----- Vraci totalni pocet stranek EMS nebo -1 ----
\r
64 int coretotalEMS(void)
\r
69 int86(0x67,&rg,&rg);
\r
70 if(rg.x.cflag) return( -1 );
\r
71 //if(!pagesAllocated)
\r
72 // { pagesAllocated = 1;
\r
73 // totalPages = rg.x.dx;
\r
78 //----- Vraci pocet volnych stranek EMS nebo -1 ----
\r
79 int coreleftEMS(void)
\r
83 //if(pagesAllocated) return(totalPages);
\r
85 int86(0x67,&rg,&rg);
\r
86 if(rg.x.cflag) return( -1 );
\r
87 //if(!pagesAllocated)
\r
88 //pagesAllocated = 1;
\r
89 //totalPages = rg.x.dx;
\r
90 //return(totalPages);
\r
94 //----- Vraci EMS page frame (pointr na EMS) nebo NULL ----
\r
95 char *pageframeEMS(void)
\r
100 int86(0x67,&rg,&rg);
\r
104 return((char *)MK_FP(rg.x.bx,0));
\r
107 //----- Alokuje n stranek - vraci handle na blok stranek nebo 0 ----
\r
108 unsigned mallocEMS(int n)
\r
112 if(n > coreleftEMS() ) return( 0 );
\r
115 int86(0x67,&rg,&rg);
\r
122 //----- Dealokuje blok stranek ret = 1-O.K. 0-ERR -----
\r
123 unsigned freeEMS(unsigned h)
\r
131 int86(0x67,&rg,&rg);
\r
132 if(rg.h.ah == 0) break;
\r
140 //----- Mapuje logiclou stranku do fyzicke stranky
\r
141 int mapEMS(unsigned h, int Ppage, int Lpage)
\r
145 if(Ppage < 0 || Ppage > 3) return( 0 );
\r
150 int86(0x67,&rg,&rg);
\r
157 // ##### Fce se stejnymi parametry pro EMS jako pro XMS
\r
159 //----- Zda je EMS dostupna
\r
167 if(ist == 1) return( 0x0300 );
\r
172 //----- Allokuje Kb pameti -------
\r
173 int alloc_emem(int kb)
\r
178 if((Pages * 16) < kb) Pages++;
\r
180 hhh = mallocEMS(Pages);
\r
187 //----- dealokuje EMS pres handle
\r
188 int dealloc_emem(int h)
\r
190 return( freeEMS( h ) );
\r
193 //----- presune blok pameti
\r
194 // unsigned long length; /* velikost prenasene pameti */
\r
195 // unsigned int sourceH; /* handle pro zdroj (0=konvencni */
\r
196 // unsigned long sourceOff; /* offset zdroje pameti */
\r
197 // unsigned int destH; /* handle pro terc (0=konvencni */
\r
198 // unsigned long destOff; /* offset terce pameti */
\r
199 int move_emem(XMOVE *pxm)
\r
201 unsigned char *SrcBuf,*DstBuf;
\r
203 unsigned int SrcOff, DstOff, BegPage, BegOff, FreeByte, CopyLen;
\r
205 if(pxm->sourceH == 0 && pxm->destH != 0) // Buffer->EMS
\r
207 SrcBuf = (unsigned char *)pxm->sourceOff;// buffer
\r
209 BegPage = pxm->destOff / pagesizeEMS; // pocatecni page
\r
210 BegOff = pxm->destOff % pagesizeEMS; // offset in page
\r
211 FreeByte= pagesizeEMS - BegOff; // volnych B na page
\r
212 CopyLen = pxm->length; // celkova delka
\r
215 if(CopyLen > FreeByte)
\r
217 ist = mapEMS(pxm->destH, 0, BegPage);
\r
218 if(ist==0) return( 0 );
\r
219 memcpy(EmsFrame+BegOff, SrcBuf+SrcOff, FreeByte);
\r
221 CopyLen = CopyLen - FreeByte;
\r
222 SrcOff += FreeByte;
\r
225 FreeByte = pagesizeEMS;
\r
230 ist = mapEMS(pxm->destH, 0, BegPage);
\r
231 if(ist==0) return( 0 );
\r
232 memcpy(EmsFrame+BegOff, SrcBuf+SrcOff, CopyLen);
\r
235 else if(pxm->sourceH != 0 && pxm->destH == 0) // EMS->Buffer
\r
237 DstBuf = (unsigned char *)pxm->destOff;// buffer
\r
239 BegPage = pxm->sourceOff / pagesizeEMS; // pocatecni page
\r
240 BegOff = pxm->sourceOff % pagesizeEMS; // offset in page
\r
241 FreeByte= pagesizeEMS - BegOff; // volnych B na page
\r
242 CopyLen = pxm->length; // celkova delka
\r
245 if(CopyLen > FreeByte)
\r
247 ist = mapEMS(pxm->sourceH, 0, BegPage);
\r
248 if(ist==0) return( 0 );
\r
249 memcpy(DstBuf+DstOff, EmsFrame+BegOff, FreeByte);
\r
251 CopyLen = CopyLen - FreeByte;
\r
252 DstOff += FreeByte;
\r
255 FreeByte = pagesizeEMS;
\r
260 ist = mapEMS(pxm->sourceH, 0, BegPage);
\r
261 if(ist==0) return( 0 );
\r
262 memcpy(DstBuf+DstOff, EmsFrame+BegOff, CopyLen);
\r
272 // ----- Vrati pocet volnych a max. KB EMS
\r
273 int mem_emem(unsigned int *total, unsigned int *freeall)
\r
277 pom = coretotalEMS();
\r
282 pom = coreleftEMS();
\r
284 *freeall = pom * 16;
\r