
                        EMS kezel Pascal-hoz
                        

A kvetkez forrsok Turbo Pascal-al kszltek.
<EMS.PAS>
Unit EMS ;

Interface

Uses
  Dos ;

Const
  EMSLapMeret = $4000 ;

Type
  EMSTomb = Array[1..255] Of Record
                               Kezeloszam,
                               Lapszam     : Word ;
                             End ;

Var
  EMSOk : Byte ;

Function  EMSHibaSzoveg(EMMHibaKod: Byte) : String ;
Function  EMSJelen : Boolean ;
Function  EMSKeretCim : Word ;
Function  EMSSzabad : Word ;
Function  EMSTeljes : Word ;
Procedure EMSFoglal(Var EMMKezelo: Word; EMSLapszam: Word) ;
Procedure EMSKeret(EMMKezelo: Word; EMSLap: Word; KeretLap: Byte);
Procedure EMSFelszabadit(EMMKezelo: Word) ;
Function  EMSVerzio : Word ;
Function  EMSKezelokSzama : Word ;
Function  EMSLapszam(EMMKezelo: Word) : Word ;
Procedure EMSKezeloInfo(Var EMMKezelokSzama: Word ;
                        Var EMMKezelok) ;

Implementation

Function EMSHibaSzoveg(EMMHibaKod: Byte) : String ;
  Begin
    Case EMMHibaKod Of
      $00 : EMSHibaSzoveg := 'EMS van, hardver rendben' ;
      $80 : EMSHibaSzoveg := 'EMS szoftver hiba' ;
      $81 : EMSHibaSzoveg := 'EMS hardver hiba' ;
      $83 : EMSHibaSzoveg := 'Az EMM nem tart nyilvn ilyen ' +
                             'kezelszmot' ;
      $84 : EMSHibaSzoveg := 'Nincs ilyen EMM funkci' ;
      $85 : EMSHibaSzoveg := 'Minden EMM kezelszm foglalt' ;
      $86 : EMSHibaSzoveg := 'Mentsi/visszatltsi hiba' ;
      $87 : EMSHibaSzoveg := 'Nincs elg EMS lap' ;
      $88 : EMSHibaSzoveg := 'Nincs elg szabad EMS lap' ;
      $89 : EMSHibaSzoveg := '0 lapot nem lehet alloklni' ;
      $8A : EMSHibaSzoveg := 'A lapszm nem esik az EMM kezel ' +
                             'tartomnyba' ;
      $8B : EMSHibaSzoveg := 'A lapszm nem esik a keret ' +
                             'tartomnyba' ;
      $8C : EMSHibaSzoveg := 'Hardver mentsi terlet betelt' ;
      $8D : EMSHibaSzoveg := 'Hardver mentsi terlet foglalt' ;
      $8E : EMSHibaSzoveg := 'Nincs ilyen hardver mentsi ' +
                             'terlet' ;
      $8F : EMSHibaSzoveg := 'Nincs ilyen EMM alfunkci' ;
      Else  EMSHibaSzoveg := '' ;
    End ;
  End ;

Function  EMSJelen : Boolean ;
  Type
    KarTomb = Array[1..8] Of Char ;
  Const
    EMSEllenorzo : KarTomb = 'EMMXXXX0' ;
  Var
    R         : Registers ;
    EMSVektor : Pointer ;
  Begin
    With R Do
      Begin
        GetIntVec($67,EMSVektor) ;
        EMSVektor := Ptr(Seg(EMSVektor^),10) ;
        EMSJelen := KarTomb(EMSVektor^) = EMSEllenorzo ;
        EMSOk := AH ;
      End ;
  End ;

Function EMSKeretCim : Word ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $41 ;
        Intr($67,R) ;
        EMSKeretCim := BX ;
        EMSOk := AH ;
      End ;
  End ;

Function EMSSzabad : Word ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $42 ;
        Intr($67,R) ;
        EMSSzabad := BX ;
        EMSOk := AH ;
      End ;
  End ;

Function EMSTeljes : Word ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $42 ;
        Intr($67,R) ;
        EMSTeljes := DX ;
        EMSOk := AH ;
      End ;
  End ;

Procedure EMSFoglal(Var EMMKezelo: Word; EMSLapszam: Word) ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $43 ;
        BX := EMSLapszam ;
        Intr($67,R) ;
        EMMKezelo := DX ;
        EMSOk := AH ;
      End ;
  End ;

Procedure EMSKeret(EMMKezelo: Word; EMSLap: Word; KeretLap: Byte);
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $44 ;
        DX := EMMKezelo ;
        BX := EMSLap ;
        AL := KeretLap ;
        Intr($67,R) ;
        EMSOk := AH ;
      End ;
  End ;

Procedure EMSFelszabadit(EMMKezelo: Word) ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $45 ;
        DX := EMMKezelo ;
        Intr($67,R) ;
        EMSOk := AH ;
      End ;
  End ;

Function EMSVerzio : Word ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $46 ;
        Intr($67,R) ;
        EMSVerzio := (AL And $0F) Shl 8 + (AL And $F0) Shr 4 ;
        EMSOk := AH ;
      End ;
  End ;

Function EMSKezelokSzama : Word ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $4B ;
        Intr($67,R) ;
        EMSKezelokSzama := BX ;
        EMSOk := AH ;
      End ;
  End ;

Function EMSLapszam(EMMKezelo: Word) : Word ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $4C ;
        DX := EMMKezelo ;
        Intr($67,R) ;
        EMSLapszam := BX ;
        EMSOk := AH ;
      End ;
  End ;

Procedure EMSKezeloInfo(Var EMMKezelokSzama: Word ;
                        Var EMMKezelok) ;
  Var
    R : Registers ;
  Begin
    With R Do
      Begin
        AH := $4D ;
        ES := Seg(EMMKezelok) ;
        DI := Ofs(EMMKezelok) ;
        Intr($67,R) ;
        EMMKezelokSzama := BX ;
        EMSOk := AH ;
      End ;
  End ;

End.

<EMSDEMO.PAS>
{   A programot ksztette:   }
{                             }
{       Szathmri Miln       }
{            from             }
{  CSIPSZI Software Inc. (c)  }
{                             }
uses
  crt,ems;
type
  Tarray=array[1..4096] of longint; {a memrit 16K-os tmbkben kezeljk}
                                    {mert ekkora egy EMS lap mrete      }
var
  FrameArray:^Tarray;               {ebbe a keretbe lapozhatjuk az EMS-t }
  Handle:word;                      {evvel azonostjuk a lefoglalt  -||- }
  PageNum:word;                     {a szabad lapok szma                }
  {egyb}
  i,j:word;

function hex(w:word):string;
const
  H:array[0..15] of char='0123456789ABCDEF';
begin
  Hex:=H[hi(w) and $F0 shr 4]+
       H[hi(w) and $0F]+
       H[lo(w) and $F0 shr 4]+
       H[lo(w) and $0F];
end;

procedure EMSInfo;                  {no comments                         }
begin
  writeln('EMS version ........ : ',lo(EMSverzio),'.',hi(EMSverzio));
  writeln('Total EMS memory size: ',EMSteljes:3,' page(s) - ',EMSteljes*16:5,' Kbytes');
  writeln('Fee   EMS memory size: ',EMSszabad:3,' page(s) - ',EMSszabad*16:5,' Kbytes');
  writeln('EMS page frame ..... : ',hex(EMSkeretcim),':0000');
  writeln;
end;

begin
  clrscr;
  if not EMSjelen then begin        {az EMS driver ellenrzse           }
    writeln('EMS not present');
    halt;
  end;
  EMSInfo;
  PageNum:=EMSszabad;               {lekrdezzk a szabad lapok szmt   }
  EMSfoglal(Handle,PageNum);        {s lefoglaljuk az sszeset,         }
                                    {a Handle-vel azonostjuk            }
  If EMSok<>0 then begin            {ha nem sikerlt lefoglalni akkor    }
    writeln(EMSHibaSzoveg(EMSok));  {kiirjuk a hiba okt                 }
    halt;
  end;
  FrameArray:=ptr(EMSkeretcim,0);   {a FrameArray a keret cmre mutasson}
  writeln('Filling ',PageNum,' EMS pages. Please wait...');
  for i:=0 to Pagenum-1 do begin    {sorban az sszes                   }
    EMSkeret(Handle,i,0);           {lapot belapozzuk a keretbe         }
    for j:=1 to 4096 do             {s                                 }
      FrameArray^[j]:=(i+j)*(1000-j);{feltltjk "random" rtkekkel    }
  end;
  writeln('Completed.');
  writeln;
  EMSInfo;
  writeln('Reading the first 5 bytes from the first 5 EMS pages. Please wait...');
  for i:=0 to 5 do  begin
    write(i,'. page: ');
    EMSkeret(Handle,i,0);                     {lapozs                   }
    for j:=1 to  5 do write(FrameArray^[j]:8);{elemek kirsa            }
    writeln('...');
  end;
  writeln('And so on...');
  EMSfelszabadit(Handle);           {felszabadtjuk. Ne felejtsd el!     }
end.

