home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / memory / xms / memory.pas < prev    next >
Pascal/Delphi Source File  |  1994-10-27  |  10KB  |  455 lines

  1. { **************************************************************************
  2.   ***   Unité mémoire du livre PC interdit de MICRO APPLICATION          ***
  3.   ***   Auteur           : Boris Bertelsons                              ***
  4.   ***   Date             : 26.01.1994                                    ***
  5.   ***   Dernière version : 18.03.1994                                    ***
  6.   **************************************************************************
  7. }
  8. Unit memory;
  9.  
  10. Interface
  11.  
  12. uses dos;
  13.  
  14. TYPE XMSHandle = word;
  15.  
  16.      EMSHandle = word;
  17.  
  18.      XMS_Copyblock = Record
  19.        Size     : longint;
  20.        Q_Handle : Word;
  21.        Q_Offset : pointer;
  22.        Z_Handle : Word;
  23.        Z_Offset : pointer;
  24.      end;
  25.  
  26.      EMS_Header = Record        { Identification de l'EMS }
  27.        dummy          : array[0..9] of byte;
  28.        Identification : array[1..7] of char;
  29.      end;
  30.  
  31. VAR XMS_Existe      : boolean;  { TRUE, s'il y a une XMS }
  32.     XMST            : pointer;  { Driver - adresse d'entrée }
  33.     XMS_Version     : word;     { la version du driver XMS }
  34.     XC              : XMS_Copyblock;
  35.     EMS_Existe      : boolean;  { TRUE, s'il y a une EMS }
  36.     EMS_Version     : word;     { Le nombre de la version EMS.
  37.                                   Vers.MAJ est dans le Hi-Byte
  38.                                   et VERS.MIN dans le Lo-Byte}                                  Lo-Byte ! }
  39.     EMS_Pages_libres : word;     {Le nombre de EMS pages libres}
  40.     EMS_Pages_Insg  : word;     { La totalité des pages
  41.                                   EMS disponibles }
  42.  
  43.  
  44. implementation
  45.  
  46. function base_free : longint;
  47. begin;
  48.   base_free := MemAvail;
  49. end;
  50.  
  51. function XMS_free  : longint;
  52. var xms_en_kb : word;
  53.     xms_long: longint;
  54. begin;
  55.   asm
  56.     mov ax,0800h                 { 8 = donne la mémoire libre}
  57.     call dword ptr [XMST]
  58.     mov xms_en_kb,dx
  59.   end;
  60.   xms_long := xms_en_kb;
  61.   XMS_free := xms_long * 1024;
  62. end;
  63.  
  64. Function Getmem_XMS(VAR H : XMSHandle; Size : longint) : byte;
  65. var bsize : word;
  66.     Fresult : byte;
  67.     xmsh : word;
  68. begin;
  69.   bsize := (size DIV 1024) + 1;
  70.   asm
  71.     mov ax,0900h                 { 9 = allouer l'espace en mémoire }
  72.     mov dx,bsize
  73.     call dword ptr [XMST]
  74.     cmp ax,1
  75.     jne @Erreur_GetmemXms
  76.     mov xmsh,dx
  77.     mov Fresult,0
  78.     jmp @Fin_GetmemXms
  79. @Erreur_GetmemXMS:
  80.     mov Fresult,bl
  81. @Fin_GetmemXms:
  82.   end;
  83.   h := xmsh;
  84.   Getmem_Xms := Fresult;
  85. end;
  86.  
  87. Function Freemem_XMS(H : XMSHandle) : byte;
  88. var fresult : byte;
  89. begin;
  90.   asm                            { A = libère l'espace réservé en mémoire }
  91.     mov ax,0a00h
  92.     call dword ptr [XMST]
  93.     cmp ax,1
  94.     jne @Erreur_FreememXms
  95.     mov Fresult,0
  96.     jmp @Fin_FreememXms
  97. @Erreur_FreememXms:
  98.     mov Fresult,bl
  99. @Fin_FreememXms:
  100.   end;
  101. end;
  102.  
  103. Function XMS_2_XMS(h1,h2 : XMSHandle; Size : Word) : byte;
  104. VAR fresult : byte;
  105. begin;
  106.   XC.Size     := Size;    { Taille du bloc en octets }
  107.   XC.Q_Handle := h1;      { Handle source }
  108.   XC.Q_Offset := nil;     { Offset source, 0 = Début du bloc }
  109.   XC.Z_Handle := h2;      { Handle cible }
  110.   XC.Z_Offset := nil;     { Offset cible }
  111.   asm
  112.     mov si,offset XC
  113.     mov ax,0B00h
  114.     call dword ptr [XMST]
  115.     cmp ax,1
  116.     jne @Erreur_RAM2XMS
  117.     mov fresult,0
  118.     jmp @Fin_Ram2XMS
  119. @Erreur_Ram2XMS:
  120.     mov fresult,bl
  121. @Fin_Ram2XMS:
  122.   end;
  123. end;
  124.  
  125.  
  126. Function RAM_2_XMS(q : pointer; h : XMSHandle; Size : Word) : byte;
  127. VAR fresult : byte;
  128. begin;
  129.   XC.Size     := Size;
  130.   XC.Q_Handle := 0;              { 0 = RAM }
  131.   XC.Q_Offset := q;
  132.   XC.Z_Handle := h;
  133.   XC.Z_Offset := nil;
  134.   asm
  135.     mov si,offset XC
  136.     mov ax,0B00h
  137.     call dword ptr [XMST]
  138.     cmp ax,1
  139.     jne @Erreur_RAM2XMS
  140.     mov fresult,0
  141.     jmp @Fin_Ram2XMS
  142. @Erreur_Ram2XMS:
  143.     mov fresult,bl
  144. @Fin_Ram2XMS:
  145.   end;
  146. end;
  147.  
  148. Function XMS_2_Ram(d : pointer; h : XMSHandle; Size : Word) : byte;
  149. VAR fresult : byte;
  150. begin;
  151.   XC.Size     := Size;
  152.   XC.Q_Handle := h;
  153.   XC.Q_Offset := nil;
  154.   XC.Z_Handle := 0;              { 0 = RAM }
  155.   XC.Z_Offset := d;
  156.   asm
  157.     mov si,offset XC
  158.     mov ax,0B00h
  159.     call dword ptr [XMST]
  160.     cmp ax,1
  161.     jne @Erreur_XMS2RAM
  162.     mov fresult,0
  163.     jmp @Fin_XMS2Ram
  164. @Erreur_XMS2Ram:
  165.     mov fresult,bl
  166. @Fin_XMS2Ram:
  167.   end;
  168. end;
  169.  
  170. Procedure Check_for_XMS; assembler;
  171.   asm
  172.     mov ax,4300h              {Vérifie s'il y a un gestionnaire installé}
  173.     int 2Fh
  174.     cmp al,80h
  175.     jne @Pas_de_gestXMS
  176.     mov ax,4310h              {Donne l'adresse d'entrée du gestionnaire}
  177.     int 2Fh
  178.     mov word ptr XMST + 2,es
  179.     mov word ptr XMST + 0,bx
  180.     xor ax,ax                 {Donne le numéro de version}
  181.     call dword ptr [XMST]
  182.     cmp  ax,0200h
  183.     jb   @Pas_de_gestXMS     { Si Version < 2.0, arrêt ! }
  184.     mov  XMS_Version,ax
  185.     mov  XMS_Existe,0
  186. @Pas_de_gestXMS:
  187.     mov XMS_Existe,1
  188. @Fin_XMS_Check:
  189. end;
  190.  
  191. procedure Check_for_EMS;
  192. var emsseg : word;
  193.     emsptr : pointer;
  194.     emshead : EMS_Header;
  195. begin;
  196.   asm
  197.     mov ax,3567h
  198.     int 21h
  199.     mov emsseg,es
  200.   end;
  201.   move(ptr(emsseg,0)^,emshead,17);
  202.   if emshead.Identification = 'EMMXXXX' then begin;
  203.     EMS_Existe := true;
  204.     asm
  205.       mov ah,40h  {Donne l'état du gestionnaire EMS}
  206.       int 67h
  207.       cmp ah,0
  208.       jne @EMS_Vers_Erreur
  209.       mov ah,46h  {Donne la version EMS}
  210.       int 67h
  211.       cmp ah,0
  212.       jne @EMS_Vers_Erreur
  213.       mov bl,al
  214.       shr al,4
  215.       mov bh,al   { bh = Vers.maj }
  216.       or  bl,0Fh  { bl = Vers.min }
  217.       mov EMS_Version,bx
  218.       jmp @EMS_Vers_Fin
  219. @EMS_Vers_Erreur:
  220.       mov EMS_Existe,1
  221. @EMS_Vers_Fin:
  222.     end;
  223.   end else begin;
  224.     EMS_Existe := false;
  225.   end;
  226. end;
  227.  
  228. Function EMS_Segment_obtenir(VAR Segment : word) : byte;
  229. VAR hseg : word;
  230.     fresultat : byte;
  231. begin;
  232.   asm
  233.     mov ah,41h
  234.     int 67h
  235.     cmp ah,0
  236.     jne @EMS_Segerm_Erreur
  237.     mov hseg,bx
  238.     mov fresultat,0
  239.     jmp @EMS_Segerm_Fin
  240. @EMS_Segerm_Erreur:
  241.     mov fresultat,ah
  242. @EMS_Segerm_Fin:
  243.   end;
  244.   Segment := hseg;
  245.   EMS_Segment_obtenir := fresultat;
  246. end;
  247.  
  248. Function EMS_Obtenir_Nombre_Pages : byte;
  249. var fresultat : byte;
  250. begin;
  251.   asm
  252.     mov ah,42h
  253.     int 67h
  254.     cmp ah,0
  255.     jne @EMS_ObtPages_Erreur
  256.     mov EMS_Pages_libres,bx
  257.     mov EMS_Pages_Insg,dx
  258.     mov fresultat,0
  259.     jmp @EMS_ObtPages_Fin
  260. @EMS_ObtPages_Erreur:
  261.     mov fresultat,ah
  262. @EMS_ObtPages_Fin:
  263.   end;
  264.   EMS_Obtenir_Nombre_Pages := fresultat;
  265. end;
  266.  
  267. function EMS_free  : longint;
  268. var    aide : longint;
  269. begin;
  270.   EMS_Obtenir_Nombre_Pages;
  271.   aide := EMS_Pages_Libres;
  272.   EMS_free := aide SHL 14;
  273. end;
  274.  
  275. Function Getmem_EMS(VAR H : EMSHandle; Size : longint) : byte;
  276. var Fresultat : byte;
  277.     EPages : word;
  278.     Hhandle : word;
  279. begin;
  280.   EPages := (Size DIV 16384) + 1;
  281.   asm
  282.     mov ah,43h
  283.     mov bx,EPages
  284.     int 67h
  285.     cmp ah,0
  286.     jne @Getmem_Ems_Erreur
  287.     mov Hhandle,dx
  288.     mov fresultat,0
  289.     jmp @Getmem_Ems_Fin
  290. @Getmem_Ems_Erreur:
  291.     mov Fresultat,ah
  292. @Getmem_Ems_Fin:
  293.   end;
  294.   H := Hhandle;
  295.   Getmem_EMS := Fresultat;
  296. end;
  297.  
  298. Function Freemem_EMS(H : EMSHandle) : byte;
  299. var Fresultat : byte;
  300. begin;
  301.   asm
  302.     mov ah,45h
  303.     mov dx,H
  304.     int 67h
  305.     mov Fresultat,ah
  306.   end;
  307.   Freemem_EMS := Fresultat;
  308. end;
  309.  
  310. Function EMS_Affecter(H : EMSHandle;NumPage,PageEMS : word) : byte;
  311. VAR Fresultat : byte;
  312. begin;
  313.   asm
  314.     mov ah,44h
  315.     mov al,byte ptr NumPage
  316.     mov bx,PageEMS
  317.     mov dx,H
  318.     int 67h
  319.     mov Fresultat,ah
  320.   end;
  321.   EMS_Affecter := Fresultat;
  322. end;
  323.  
  324. Function EMS_Conserver_Affectation(H : EMSHandle) : byte;
  325. VAR Fresultat : byte;
  326. begin;
  327.   asm
  328.     mov ah,47h
  329.     mov dx,H
  330.     int 67h
  331.     mov Fresultat,ah
  332.   end;
  333.   EMS_Conserver_Affectation := Fresultat;
  334. end;
  335.  
  336. Function EMS_Effacer_Affectation(H : EMSHandle) : byte;
  337. VAR Fresultat : byte;
  338. begin;
  339.   asm
  340.     mov ah,48h
  341.     mov dx,H
  342.     int 67h
  343.     mov Fresultat,ah
  344.   end;
  345.   EMS_Effacer_Affectation := Fresultat;
  346. end;
  347.  
  348. Function RAM_2_EMS(q : pointer; H : EMSHandle; Size : longint) : byte;
  349. VAR fresultat : byte;
  350.     EMSseg    : word;
  351.     hp        : ^byte;
  352.     li        : word;
  353. begin;
  354.   EMS_Segment_Obtenir(EMSseg);
  355.   hp := q;
  356.   if Size > 16384 then begin;
  357.     {Il faut plus d'une page}
  358.     for li := 0 to (Size SHR 14)-1 do begin;
  359.       EMS_Affecter(H,0,li);
  360.       move(hp^,ptr(EMSseg,0)^,16384);
  361.       dec(Size,16384);
  362.       inc(hp,16384);
  363.     end;
  364.     EMS_Affecter(H,0,li+1);
  365.     move(hp^,ptr(EMSseg,0)^,16384);
  366.     dec(Size,16384);
  367.     inc(hp,16384);
  368.   end else begin;
  369.     EMS_Affecter(H,0,0);
  370.     move(hp^,ptr(EMSseg,0)^,16384);
  371.     dec(Size,16384);
  372.     inc(hp,16384);
  373.   end;
  374. end;
  375.  
  376. Function EMS_2_RAM(q : pointer; H : EMSHandle; Size : longint) : byte;
  377. VAR Fresultat : byte;
  378.     EMSseg    : word;
  379.     hp        : ^byte;
  380.     li        : word;
  381. begin;
  382.   EMS_Segment_Obtenir(EMSseg);
  383.   hp := q;
  384.   if Size > 16384 then begin;
  385.     { Plus d'une page nécessaire }
  386.     for li := 0 to (Size SHR 14)-1 do begin;
  387.       EMS_Affecter(H,0,li);
  388.       move(ptr(EMSseg,0)^,hp^,16384);
  389.       dec(Size,16384);
  390.       inc(hp,16384);
  391.     end;
  392.     EMS_Affecter(H,0,li+1);
  393.     move(ptr(EMSseg,0)^,hp^,16384);
  394.     dec(Size,16384);
  395.     inc(hp,16384);
  396.   end else begin;
  397.     EMS_Affecter(H,0,0);
  398.     move(ptr(EMSseg,0)^,hp^,16384);
  399.     dec(Size,16384);
  400.     inc(hp,16384);
  401.   end;
  402. end;
  403.  
  404. Function EMS_Pages_occupees(H : EMSHandle;var Pages : word) : byte;
  405. var fresultat : byte;
  406.     Hs : word;
  407. begin;
  408.   asm
  409.     mov ah,4Ch
  410.     mov dx,H
  411.     int 67h
  412.     mov HS,bx
  413.     mov fresultat,ah
  414.   end;
  415.   Pages := Hs;
  416.   EMS_Pages_occupees := Fresultat;
  417. end;
  418.  
  419. Function EMS_Handles_disponibles(Var Nombre : word) : byte;
  420. Var Fresultat : byte;
  421.     Han       : word;
  422. begin;
  423.   asm
  424.     mov ah,4Bh
  425.     int 67h
  426.     mov Han,bx
  427.     mov Fresultat,ah
  428.   end;
  429.   Nombre := Han;
  430.   EMS_Handles_disponibles:= Fresultat;
  431. end;
  432.  
  433. function XMS_lock(H : XMSHandle) : longint; assembler;
  434. asm;
  435.   mov ax,0c00h
  436.   mov dx,h
  437.   call dword ptr [XMST]
  438.   mov ax,bx
  439. end;
  440.  
  441. procedure XMS_unlock(H : XMSHandle); assembler;
  442. asm;
  443.   mov ax,0d00h
  444.   mov dx,h
  445.   call dword ptr [XMST]
  446. end;
  447.  
  448.  
  449. begin;
  450.   Check_for_XMS;
  451.   Check_for_EMS;
  452. end.
  453.  
  454.  
  455.