
                        EMS kezel C++ -hoz
                        


A kvetkez forrsok Borland C++ 3.1-el kszltek.
<EMS.H>
char *EMShibaszoveg( int EMMHibaKod );
int EMSjelen( void );
unsigned EMSkeretcim( void );
int EMSszabad( void );
int EMSteljes( void );
void EMSfoglal( int *EMMKezelo, int EMSLapszam );
void EMSkeret( int EMMKezelo, int EMSLap, char keretlap );
void EMSfelszabadit( int EMMKezelo );
int EMSverzio( void );
int EMSkezelokszama( void );
int EMSlapszam( int EMMKezelo );
extern int EMSOk;


<EMS.CPP>
// C++ version by John Zero/NSS //
//       EMS alapfunkcik       //

#include <dos.h>
#include <string.h>

#define EMSint  0x67

int EMSOk;

char *EMShibaszoveg( int EMMHibaKod )
{
 switch (EMMHibaKod)
  {
   case 0x00:return("EMS van, hardver rendben");
   case 0x80:return("EMS szoftver hiba");
   case 0x81:return("EMS hardver hiba");
   case 0x83:return("Az EMM nem tart nyilvn ilyen kezelszmot");
   case 0x84:return("Nincs ilyen EMM funkci");
   case 0x85:return("Minden EMM kezelszm foglalt");
   case 0x86:return("Mentsi/visszatltsi hiba");
   case 0x87:return("Nincs elg EMS lap");
   case 0x88:return("Nincs elg szabad EMS lap");
   case 0x89:return("0 lapot nem lehet alloklni");
   case 0x8A:return("A lapszm nem esik az EMM kezel tartomnyba");
   case 0x8B:return("A lapszm nem esik a keret tartomnyba");
   case 0x8C:return("Hardver mentsi terlet betelt");
   case 0x8D:return("Hardver mentsi terlet foglalt");
   case 0x8E:return("Nincs ilyen hardver mentsi terlet");
   case 0x8F:return("Nincs ilyen EMM alfunkci");
   default:return("Ismeretlen vagy 4.0-s/nl jabb verzi hibakdja");
  }
}

                          /*  Alap funkcik  */

int EMSjelen( void )
{
 char far *EMSVektor;
 void interrupt ( *EMSHandler)(...);
 char EMSEllenorzo[] = "EMMXXXX0";

 EMSHandler = getvect(EMSint);
 EMSVektor = (char far *)MK_FP( FP_SEG((char far *)EMSHandler),0xA);
 if (_fstrncmp(EMSVektor,EMSEllenorzo,8))
  return 0;

 union REGS regs;

 regs.h.ah = 0x40;  // EMS int check
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 return 1;
}

unsigned EMSkeretcim( void )
{
 union REGS regs;

 regs.h.ah = 0x41;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 return regs.x.bx;
}

int EMSszabad( void )
{
 union REGS regs;

 regs.h.ah = 0x42;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 return regs.x.bx;
}

int EMSteljes( void )
{
 union REGS regs;

 regs.h.ah = 0x42;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 return regs.x.dx;
}

void EMSfoglal( int *EMMKezelo, int EMSLapszam )
{
 union REGS regs;

 regs.h.ah = 0x43;
 regs.x.bx = EMSLapszam;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 (*EMMKezelo)=regs.x.dx;
}

void EMSkeret( int EMMKezelo, int EMSLap, char keretlap )
{
 union REGS regs;

 regs.h.ah = 0x44;
 regs.h.al = keretlap;
 regs.x.dx = EMMKezelo;
 regs.x.bx = EMSLap;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
}

void EMSfelszabadit( int EMMKezelo )
{
 union REGS regs;

 regs.h.ah = 0x45;
 regs.x.dx = EMMKezelo;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
}

int EMSverzio( void )
{
 union REGS regs;

 regs.h.ah = 0x46;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 return( ((int)(regs.h.al & 0xF) << 8) + (int)(regs.h.al & 0xF0) >> 4 );
}

int EMSkezelokszama( void )
{
 union REGS regs;

 regs.h.ah = 0x4B;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 return regs.x.bx;
}

int EMSlapszam( int EMMKezelo )
{
 union REGS regs;

 regs.h.ah = 0x4C;
 regs.x.dx = EMMKezelo;
 int86(EMSint, &regs, &regs);
 EMSOk=regs.h.ah;
 return regs.x.bx;
}


<EMSDEMO.CPP>
//{   A programot ksztette:   }
//{                             }
//{       Szathmri Miln       }
//{            from             }
//{  CSIPSZI Software Inc. (c)  }
// C++ version by John Zero/NSS

#include <stdio.h>
#include <dos.h>
#include "ems.h"

long far *myframe; // 4096 long = 16K - egy EMS lap mrete, ide fogunk lapozni
int Handle;        // a lefoglalt EMS kezelszma
int PageNum;       // a szabad lapok szma


void EMSInfo (void )
{
 printf("EMS version ........ : %d.%d\n", EMSverzio() & 0xFF, EMSverzio() >> 8 );
 printf("Total EMS memory size: %3d page(s) - %5d Kbytes\n", EMSteljes(), EMSteljes()*16);
 printf("Free EMS memory size : %3d page(s) - %5d Kbytes\n", EMSszabad(), EMSszabad()*16);
 printf("EMS page frame ..... : %4X:0000\n", EMSkeretcim() );
}


void main ( void )
{
 if (!EMSjelen())                 // az EMS driver ellenrzse
  {
   printf("EMS not present\n");
   return;
  }
 EMSInfo();
 PageNum=EMSszabad();            // lekrdezzk a szabad lapok szmt
 EMSfoglal(&Handle,PageNum);     // s lefoglaljuk az sszeset,
                                 // a Handle-vel azonostjuk
 if (EMSOk)                      // ha nem sikerlt lefoglalni akkor
  {
   printf(EMShibaszoveg(EMSOk)); // kiirjuk a hiba okt
   return;
  }

 myframe=(long far *)MK_FP(EMSkeretcim(),0);  // a myframe a keret cmre
                                              // mutasson
 printf(" Filling %d EMS pages. Please wait...\n",PageNum);

 int i,j;

 for (i=0; i<PageNum ; i++ )       // sorban az sszes
  {
   EMSkeret(Handle,i,0);           // lapot belapozzuk a keretbe
   for (j=0 ; j<4096 ; j++ )       // s
    myframe[j]=(i+j)*(1000-j);     // feltltjk rtkekkel
  }
 printf("Completed.\n\n");

 EMSInfo();
 printf("Reading the first 5 bytes from the first 5 EMS pages.\n"
        "Please wait...\n");
 for (i=0 ; i<5 ; i++ )
  {
   printf("%d. page: ",i);
   EMSkeret(Handle,i,0);       // lapozs
   for ( j=1 ; j<5 ; j++ )
    printf("%8ld",myframe[j]); // elemek kirsa
   printf("...\n");
  }
 printf("And so on...\n");
 EMSfelszabadit(Handle);       // felszabadtjuk. Ne felejtsd el!!!
}

