home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / tricks / xms.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1991-06-06  |  3.3 KB  |  101 lines

  1. (* ------------------------------------------------------ *)
  2. (*                        XMS.PAS                         *)
  3. (*       stellt elementare Funktionen zur Arbeit mit      *)
  4. (*         eXtended Memory Manager zur Verfügung          *)
  5. (*          (c) 1991 Dirk Schneider & TOOLBOX             *)
  6. (* ------------------------------------------------------ *)
  7. UNIT XMS;
  8.  
  9. INTERFACE
  10.  
  11.   FUNCTION XMM_Avail : BOOLEAN;
  12.   FUNCTION XMM_Memavail : WORD;
  13.   FUNCTION XMM_Alloc(Size : WORD) : WORD;
  14.  
  15.   FUNCTION XMM_Free(Handle : WORD) : BOOLEAN;
  16.   FUNCTION XMM_Move(DST   : POINTER;
  17.                     DST_H : WORD;
  18.                     SRC   : POINTER;
  19.                     SRC_H : WORD;
  20.                     Size  : LONGINT) : BOOLEAN;
  21.  
  22. IMPLEMENTATION
  23.  
  24. VAR
  25.   XMM_Ctrl : POINTER;               { Eintrittadr. des XMM }
  26.  
  27.  
  28.   FUNCTION XMM_Avail : BOOLEAN;  ASSEMBLER;
  29.     (* testet, ob XMM installiert ist *)
  30.   ASM
  31.      MOV    AX,4300h
  32.      INT    2Fh
  33.      CMP    AL,80h
  34.      JE     @ja                   { XMM-Treiber vorhanden? }
  35.      XOR    AL,AL                 { nein }
  36.      JMP    @exit
  37. @ja: MOV    AX,4310h              { ja }
  38.      INT    2Fh
  39.      MOV    WORD PTR XMM_Ctrl,BX   { BS --> Offset(XMM)}
  40.      MOV    WORD PTR XMM_Ctrl+2,ES { ES --> Segment(XMM)}
  41.      MOV    AL,1                   { XMM_avail = true }
  42. @exit:
  43.   END;
  44.  
  45.   FUNCTION XMM_Memavail : WORD;  ASSEMBLER;
  46.     (* maximal allokierbarer Block *)
  47.   ASM
  48.     MOV    AH,08h                 { XMM-Funktion 08h }
  49.     CALL   XMM_Ctrl
  50.   END;
  51.  
  52.   FUNCTION XMM_Alloc(Size : WORD) : WORD;  ASSEMBLER;
  53.     (* allokiert Block und gibt Handle zurück *)
  54.   ASM
  55.     MOV    AH,09h                 { XMM-Funktion 09h }
  56.     MOV    DX,Size                { Größe in DX }
  57.     CALL   XMM_Ctrl
  58.     CMP    AX,00h
  59.     JE     @exit                  { Handle=0, dann Fehler }
  60.     MOV    AX,DX                  { Handle zurück }
  61. @exit:
  62.   END;
  63.  
  64.   FUNCTION XMM_Free(Handle : WORD) : BOOLEAN;  ASSEMBLER;
  65.     (* gibt allokiert Block frei *)
  66.   ASM
  67.     MOV    AH,0Ah                { XMM-Funktion 0Ah }
  68.     MOV    DX,Handle             { Handle in DX }
  69.     CALL   XMM_Ctrl
  70.     CMP    AX,00h                { Fehler ? }
  71.     JE     @exit
  72.     INC    AL                    { nein, true zurück }
  73. @exit:
  74.   END;
  75.  
  76.   FUNCTION XMM_Move(DST : POINTER; DST_H : WORD;
  77.                     SRC : POINTER; SRC_H : WORD;
  78.                     Size : LONGINT) : BOOLEAN;   ASSEMBLER;
  79.     (* kann Block im gesamten RAM kopieren *)
  80.   ASM
  81.     MOV    AH,0bh          { XMM-Funktion 0Bh              }
  82.     MOV    SI,BP           { DS:SI auf Parameterblock,     }
  83.     ADD    SI,6            { also auf SS:BP+6 da Far !     }
  84.     PUSH   DS              { Die Reihenfolge der Parameter }
  85.     POP    ES              { darf nicht geändert werden !  }
  86.     MOV    DX,SS           { Aufruf des XMM erfolgt durch  }
  87.     MOV    DS,DX           { Segment-Override DS --> ES    }
  88.     CALL   ES:[XMM_Ctrl]
  89.     PUSH   ES              { DS wiederherstellen           }
  90.     POP    DS
  91.     CMP    AX,0            { Fehler ?                      }
  92.     JE     @exit
  93.     INC    AL              { nein, true zurück             }
  94. @exit:
  95.   END;
  96.  
  97. END.
  98. (* ------------------------------------------------------ *)
  99. (*                  Ende von XMS.PAS                      *)
  100.  
  101.