home *** CD-ROM | disk | FTP | other *** search
/ Fifty: Elektronik / FIFTY Elektronik (PS_Computer_Vertrieb).iso / ps8 / fty1017 / gepackt.exe / DISK2 / PLOTSRC.EXE / XMS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-11-10  |  7.8 KB  |  318 lines

  1. {$A+,G-}
  2. { Muss mit G- kompiliert werden sonst Absturz !!!! }
  3. UNIT XMS;
  4.  
  5. INTERFACE
  6.  
  7. CONST XMSOk            = $00; { fehlerfrei ausgeführt      }
  8.       XMSNotImpl       = $80; { ist nicht implementiert    }
  9.       XMSVDisk         = $81; { VDISK-Gerät entdeckt       }
  10.       XMSA20Error      = $82; { A20-Fehler eingetreten     }
  11.       XMSGeneralDrvErr = $8E; { Genereller Treiberfehler   }
  12.       XMSUnrecDrvErr   = $8F; { Nicht-behebbarer Fehler    }
  13.       XMSNoHMA         = $90; { Kein HMA vorhanden         }
  14.       XMSHMAInUse      = $91; { HMA ist bereits vergeben   }
  15.       XMSToLow         = $92; { HMA für Prg. nicht verfügb.}
  16.       XMSHMANotAlloc   = $93; { HMA nicht reserviert       }
  17.       XMSA20StillEn    = $94; { A20 ist immer noch frei    }
  18.       XMSOutOfMem      = $A0; { Kein Extended Memory mehr  }
  19.       XMSNoHandle      = $A1; { Kein Handle mehr frei      }
  20.       XMSInvHandle     = $A2; { Ungültiges Handle          }
  21.       XMSSrcHandleInv  = $A3; { Quell-Handle ungültig      }
  22.       XMSSrcOfsInv     = $A4; { Quell-Offset ungültig      }
  23.       XMSDestHandleInv = $A5; { Ziel-Handle ungültig       }
  24.       XMSDestOfsInv    = $A6; { Ziel-Offset ungültig       }
  25.       XMSLenInv        = $A7; { Länge für Move ungültig    }
  26.       XMSInvOverlap    = $A8; { Unerlaubte Überlappung     }
  27.       XMSParityErr     = $A9; { Parrity-Fehler aufgetreten }
  28.       XMSNotLocked     = $AA; { EMB ist nicht verriegelt   }
  29.       XMSLocked        = $AB; { EMB ist verriegelt         }
  30.       XMSLockCount     = $AC; { Verriegelungszählerüberlauf}
  31.       XMSLockFailed    = $AD; { Nicht zu verriegeln        }
  32.       XMSSmallerUMB    = $B0; { Kleinerer UMB verfügbar    }
  33.       XMSNoUMBAvail    = $B1; { Kein UMB mehr verfügbar    }
  34.       XMSInvUMB        = $B2; { Ungültige Segmentadresse   }
  35.  
  36.       XMS_DriverOk     :Boolean=false;
  37.       
  38.       XMS_Result: BYTE =0;
  39.  
  40. FUNCTION MaxAvail: WORD;
  41.  
  42. FUNCTION MemAvail: WORD;
  43.  
  44. FUNCTION ReserveMem( KB: WORD): WORD;  { Returns XMS-Handle }
  45.  
  46. PROCEDURE FreeMem ( Handle: WORD);
  47.  
  48. PROCEDURE MoveFromXMS(Size, Handle: WORD; FromAddress: LONGINT;
  49.                       ToAddress: POINTER);
  50.  
  51. PROCEDURE MoveToXMS(Size, Handle: WORD; FromAddress: POINTER;
  52.                     ToAddress: LONGINT);
  53.  
  54. PROCEDURE ResizeMem (NewSize, Handle: WORD);
  55.  
  56. Procedure RequestHMA(Size:Word);
  57.  
  58. Procedure ReleaseHMA;
  59.  
  60. FUNCTION IsA20On : BOOLEAN;
  61.  
  62. PROCEDURE XMSVersion (VAR XMSVer   : WORD;    { HighByte :Version,LoByte :Revision }
  63.                       VAR HMAAvail : BOOLEAN);
  64.  
  65. IMPLEMENTATION
  66. Const MinVer    =$260;
  67.       VER       :WORD=0;
  68.       HMAavail  :Boolean=false;
  69.       XCLUDEHMA :Boolean=false;
  70.       MaxMoveLen= 16384;
  71.  
  72.  
  73. Procedure DummyXMS;far;assembler;
  74. ASM
  75.  XOR AX,AX
  76.  XOR BX,BX
  77.  XOR DX,DX
  78.  XOR CX,CX
  79.  MOV BL,$80
  80. END;
  81.  
  82. Const XMMAddr: POINTER=@DummyXMS;
  83.  
  84. PROCEDURE MoveMem (ToAddress: POINTER; ToHandle: WORD;
  85.                    FromAddress: POINTER; FromHandle: WORD; Size: LONGINT);
  86.   BEGIN
  87.     ASM
  88.       MOV  AH,$0B
  89.       LEA  SI,Size
  90.       PUSH DS
  91.       POP  ES
  92.       PUSH SS
  93.       POP  DS
  94.       CALL ES:[XMMAddr]
  95.       PUSH ES
  96.       POP  DS
  97.       CMP  AX,1
  98.       JE   @@1
  99.       JNE  @@2
  100.     @@1:
  101.       XOR  BL,BL
  102.     @@2:
  103.       MOV  BYTE PTR XMS_Result,BL
  104.     END;
  105.   END;
  106.  
  107. FUNCTION GetByte(Handle: WORD; FromAddress: LONGINT): BYTE;
  108.   VAR TempBuf: ARRAY[0..1] OF BYTE;
  109.   BEGIN
  110.     MoveMem(@TempBuf, 0, POINTER(FromAddress AND $FFFFFFFE), Handle, 2);
  111.     GetByte := TempBuf[FromAddress AND $00000001];
  112.   END;
  113.  
  114. PROCEDURE SetByte(Handle: WORD; ToAddress: LONGINT; Value: BYTE);
  115.   VAR TempBuf: ARRAY[0..1] OF BYTE;
  116.   BEGIN
  117.     MoveMem(@TempBuf, 0, POINTER(ToAddress AND $FFFFFFFE), Handle, 2);
  118.     TempBuf[ToAddress AND $00000001] := Value;
  119.     MoveMem(POINTER(ToAddress AND $FFFFFFFE), Handle, @TempBuf, 0, 2);
  120.   END;
  121.  
  122. PROCEDURE  Korr_avail; assembler;
  123. asm
  124.   CMP XCLUDEHMA,0
  125.   JE  @@9
  126.   CMP AX,64
  127.   JL  @@0
  128.   SUB  AX,64
  129.   jmp @@9
  130. @@0:
  131.   XOR  AX,AX
  132. @@9:
  133. end;
  134.  
  135. FUNCTION MaxAvail: WORD; assembler;
  136.     ASM
  137.       MOV  AH,$08
  138.       CALL [XMMAddr]
  139.       Call Korr_Avail
  140.     END;
  141.  
  142. FUNCTION MemAvail: WORD;assembler;
  143.     ASM
  144.       MOV  AH,$08
  145.       CALL [XMMAddr]
  146.       OR   AX,AX
  147.       JZ   @@1
  148.       MOV  AX,DX
  149.       JMP  @@2
  150.     @@1:
  151.       XOR   AX,AX
  152.     @@2:
  153.       CALL Korr_Avail;
  154.     END;
  155.  
  156. FUNCTION ReserveMem( KB: WORD): WORD; ASSEMBLER;
  157.   ASM
  158.     MOV  AH,$09
  159.     MOV  DX,WORD PTR KB
  160.     CALL [XMMAddr]
  161.     CMP  AX,1
  162.     JNE  @@3
  163.     MOV  AX,DX
  164.     JE   @@2
  165.   @@2:
  166.     XOR  BL,BL
  167.   @@3:
  168.     MOV  BYTE PTR XMS_Result,BL
  169. END;
  170.  
  171. PROCEDURE FreeMem ( Handle: WORD);Assembler;
  172.     ASM
  173.       MOV  AH,$0A
  174.       MOV  DX,WORD PTR Handle
  175.       CALL [XMMAddr]
  176.       CMP  AX,1
  177.       JE   @@1
  178.       JNE  @@2
  179.     @@1:
  180.       XOR  BL,BL
  181.     @@2:
  182.       MOV  BYTE PTR XMS_Result,BL
  183.     END;
  184.  
  185. PROCEDURE MoveFromXMS(Size, Handle: WORD; FromAddress: LONGINT;
  186.                       ToAddress: POINTER);
  187.   TYPE ByteArr = ARRAY[0..MaxInt] OF BYTE;
  188.        BytePtr = ^ByteArr;
  189.   BEGIN
  190.     IF Size = 0 THEN Exit;
  191.     IF Odd(FromAddress) THEN BEGIN
  192.       BytePtr(ToAddress)^[0] := GetByte(Handle,FromAddress);
  193.       IF XMS_Result <> 0 THEN Exit;
  194.       Dec(Size);
  195.       Inc(FromAddress);
  196.       Inc(LONGINT(ToAddress));
  197.     END;
  198.     MoveMem(ToAddress, 0, POINTER(FromAddress), Handle, Size AND $FFFE);
  199.     IF XMS_Result <> 0 THEN Exit;
  200.     IF Odd(Size)
  201.      THEN BytePtr(ToAddress)^[Size-1] := GetByte(Handle, FromAddress+Size-1);
  202.     IF XMS_Result <> 0 THEN Exit;
  203.   END;
  204.  
  205. PROCEDURE MoveToXMS(Size,Handle: WORD; FromAddress:POINTER;
  206.                     ToAddress: LONGINT);
  207.   TYPE ByteArr = ARRAY[0..MaxInt] OF BYTE;
  208.        BytePtr = ^ByteArr;
  209.   BEGIN
  210.     IF Size = 0 THEN Exit;
  211.     IF Odd(ToAddress) THEN BEGIN
  212.       SetByte(Handle, ToAddress, BytePtr(FromAddress)^[0]);
  213.       IF XMS_Result <> 0 THEN Exit;
  214.       Dec(Size);
  215.       Inc(LONGINT(FromAddress));
  216.       Inc(ToAddress);
  217.     END;
  218.     MoveMem(POINTER(ToAddress), Handle, FromAddress, 0,Size and $FFFE);
  219.     IF XMS_Result <> 0 THEN Exit;
  220.     IF Odd(Size)
  221.        THEN SetByte(Handle, ToAddress+Size-1, BytePtr(FromAddress)^[Size-1]);
  222.     IF XMS_Result <> 0 THEN Exit;
  223.   END;
  224.  
  225. PROCEDURE ResizeMem (NewSize, Handle: WORD);ASSEMBLER;
  226.     ASM
  227.       MOV  AH,$0F
  228.       MOV  BX,WORD PTR NewSize
  229.       MOV  DX,WORD PTR Handle
  230.       CALL [XMMAddr]
  231.       CMP  AX,1
  232.       JE   @@1
  233.       CMP  BL,XMSnotImpl
  234.       JNE  @@2
  235.       MOV  XCLUDEHMA,1
  236.       JMP  @@2
  237.     @@1:
  238.       XOR  BL,BL
  239.     @@2:
  240.       MOV  BYTE PTR XMS_Result,BL
  241.     END;
  242.  
  243. Procedure RequestHMA(Size:Word); assembler;
  244.   ASM
  245.       MOV DX,Size
  246.       MOV AH,1
  247.       CALL [XMMAddr]
  248.       CMP  AX,1
  249.       JE   @@1
  250.       JNE  @@2
  251.     @@1:
  252.       XOR  BL,BL
  253.     @@2:
  254.       MOV  BYTE PTR XMS_Result,BL
  255.   END;
  256.  
  257. Procedure ReleaseHMA; assembler;
  258.   ASM
  259.       MOV AH,2
  260.       CALL [XMMAddr]
  261.       CMP  AX,1
  262.       JE   @@1
  263.       JNE  @@2
  264.     @@1:
  265.       XOR  BL,BL
  266.     @@2:
  267.       MOV  BYTE PTR XMS_Result,BL
  268.   END;
  269.  
  270. FUNCTION IsA20On : BOOLEAN; Assembler;
  271. ASM
  272.       MOV AH,7
  273.       CALL [XMMAddr]
  274.       CMP  AX,1
  275.       JE   @@1
  276.       XOR  AX,AX
  277.     @@1:
  278. END; { IsA20On }
  279.  
  280. PROCEDURE XMSVersion (VAR XMSVer   : WORD;
  281.                       VAR HMAAvail : BOOLEAN); Assembler;
  282.   ASM
  283.       XOR  AX,AX
  284.       CALL [XMMAddr]
  285.       LES  DI,XMSVer
  286.       MOV  ES:[DI],BX
  287.       LES  DI,HMAavail
  288.       MOV  AX,DX
  289.       CMP  AX,1
  290.       JE   @@1
  291.       XOR  AX,AX
  292.   @@1:MOV  ES:[DI],AL
  293. END; { XMSVersion }
  294.  
  295.  
  296. PROCEDURE InitUnit; ASSEMBLER;
  297.   ASM
  298.     MOV  AX,$4300
  299.     INT  $2F
  300.     CMP  AL,$80
  301.     JNE  @@1
  302.     MOV  AX,$4310
  303.     INT  $2F
  304.     MOV  WORD PTR XMMAddr,BX
  305.     MOV  WORD PTR XMMAddr+2,ES
  306.     JMP  @@2
  307.   @@1:
  308.     MOV  BYTE PTR XMS_Result,$80
  309.   @@2:
  310.   END;
  311.  
  312. BEGIN
  313.   InitUnit;
  314.   XMS_DriverOk:=XMS_Result=0;
  315.   If XMS_DriverOK then
  316.      XMSVersion(VER,HMAavail);
  317.   XCLUDEHMA:=Ver<MinVer;
  318. END.