home *** CD-ROM | disk | FTP | other *** search
- {$A+,G-}
- { Muss mit G- kompiliert werden sonst Absturz !!!! }
- UNIT XMS;
-
- INTERFACE
-
- CONST XMSOk = $00; { fehlerfrei ausgeführt }
- XMSNotImpl = $80; { ist nicht implementiert }
- XMSVDisk = $81; { VDISK-Gerät entdeckt }
- XMSA20Error = $82; { A20-Fehler eingetreten }
- XMSGeneralDrvErr = $8E; { Genereller Treiberfehler }
- XMSUnrecDrvErr = $8F; { Nicht-behebbarer Fehler }
- XMSNoHMA = $90; { Kein HMA vorhanden }
- XMSHMAInUse = $91; { HMA ist bereits vergeben }
- XMSToLow = $92; { HMA für Prg. nicht verfügb.}
- XMSHMANotAlloc = $93; { HMA nicht reserviert }
- XMSA20StillEn = $94; { A20 ist immer noch frei }
- XMSOutOfMem = $A0; { Kein Extended Memory mehr }
- XMSNoHandle = $A1; { Kein Handle mehr frei }
- XMSInvHandle = $A2; { Ungültiges Handle }
- XMSSrcHandleInv = $A3; { Quell-Handle ungültig }
- XMSSrcOfsInv = $A4; { Quell-Offset ungültig }
- XMSDestHandleInv = $A5; { Ziel-Handle ungültig }
- XMSDestOfsInv = $A6; { Ziel-Offset ungültig }
- XMSLenInv = $A7; { Länge für Move ungültig }
- XMSInvOverlap = $A8; { Unerlaubte Überlappung }
- XMSParityErr = $A9; { Parrity-Fehler aufgetreten }
- XMSNotLocked = $AA; { EMB ist nicht verriegelt }
- XMSLocked = $AB; { EMB ist verriegelt }
- XMSLockCount = $AC; { Verriegelungszählerüberlauf}
- XMSLockFailed = $AD; { Nicht zu verriegeln }
- XMSSmallerUMB = $B0; { Kleinerer UMB verfügbar }
- XMSNoUMBAvail = $B1; { Kein UMB mehr verfügbar }
- XMSInvUMB = $B2; { Ungültige Segmentadresse }
-
- XMS_DriverOk :Boolean=false;
-
- XMS_Result: BYTE =0;
-
- FUNCTION MaxAvail: WORD;
-
- FUNCTION MemAvail: WORD;
-
- FUNCTION ReserveMem( KB: WORD): WORD; { Returns XMS-Handle }
-
- PROCEDURE FreeMem ( Handle: WORD);
-
- PROCEDURE MoveFromXMS(Size, Handle: WORD; FromAddress: LONGINT;
- ToAddress: POINTER);
-
- PROCEDURE MoveToXMS(Size, Handle: WORD; FromAddress: POINTER;
- ToAddress: LONGINT);
-
- PROCEDURE ResizeMem (NewSize, Handle: WORD);
-
- Procedure RequestHMA(Size:Word);
-
- Procedure ReleaseHMA;
-
- FUNCTION IsA20On : BOOLEAN;
-
- PROCEDURE XMSVersion (VAR XMSVer : WORD; { HighByte :Version,LoByte :Revision }
- VAR HMAAvail : BOOLEAN);
-
- IMPLEMENTATION
- Const MinVer =$260;
- VER :WORD=0;
- HMAavail :Boolean=false;
- XCLUDEHMA :Boolean=false;
- MaxMoveLen= 16384;
-
-
- Procedure DummyXMS;far;assembler;
- ASM
- XOR AX,AX
- XOR BX,BX
- XOR DX,DX
- XOR CX,CX
- MOV BL,$80
- END;
-
- Const XMMAddr: POINTER=@DummyXMS;
-
- PROCEDURE MoveMem (ToAddress: POINTER; ToHandle: WORD;
- FromAddress: POINTER; FromHandle: WORD; Size: LONGINT);
- BEGIN
- ASM
- MOV AH,$0B
- LEA SI,Size
- PUSH DS
- POP ES
- PUSH SS
- POP DS
- CALL ES:[XMMAddr]
- PUSH ES
- POP DS
- CMP AX,1
- JE @@1
- JNE @@2
- @@1:
- XOR BL,BL
- @@2:
- MOV BYTE PTR XMS_Result,BL
- END;
- END;
-
- FUNCTION GetByte(Handle: WORD; FromAddress: LONGINT): BYTE;
- VAR TempBuf: ARRAY[0..1] OF BYTE;
- BEGIN
- MoveMem(@TempBuf, 0, POINTER(FromAddress AND $FFFFFFFE), Handle, 2);
- GetByte := TempBuf[FromAddress AND $00000001];
- END;
-
- PROCEDURE SetByte(Handle: WORD; ToAddress: LONGINT; Value: BYTE);
- VAR TempBuf: ARRAY[0..1] OF BYTE;
- BEGIN
- MoveMem(@TempBuf, 0, POINTER(ToAddress AND $FFFFFFFE), Handle, 2);
- TempBuf[ToAddress AND $00000001] := Value;
- MoveMem(POINTER(ToAddress AND $FFFFFFFE), Handle, @TempBuf, 0, 2);
- END;
-
- PROCEDURE Korr_avail; assembler;
- asm
- CMP XCLUDEHMA,0
- JE @@9
- CMP AX,64
- JL @@0
- SUB AX,64
- jmp @@9
- @@0:
- XOR AX,AX
- @@9:
- end;
-
- FUNCTION MaxAvail: WORD; assembler;
- ASM
- MOV AH,$08
- CALL [XMMAddr]
- Call Korr_Avail
- END;
-
- FUNCTION MemAvail: WORD;assembler;
- ASM
- MOV AH,$08
- CALL [XMMAddr]
- OR AX,AX
- JZ @@1
- MOV AX,DX
- JMP @@2
- @@1:
- XOR AX,AX
- @@2:
- CALL Korr_Avail;
- END;
-
- FUNCTION ReserveMem( KB: WORD): WORD; ASSEMBLER;
- ASM
- MOV AH,$09
- MOV DX,WORD PTR KB
- CALL [XMMAddr]
- CMP AX,1
- JNE @@3
- MOV AX,DX
- JE @@2
- @@2:
- XOR BL,BL
- @@3:
- MOV BYTE PTR XMS_Result,BL
- END;
-
- PROCEDURE FreeMem ( Handle: WORD);Assembler;
- ASM
- MOV AH,$0A
- MOV DX,WORD PTR Handle
- CALL [XMMAddr]
- CMP AX,1
- JE @@1
- JNE @@2
- @@1:
- XOR BL,BL
- @@2:
- MOV BYTE PTR XMS_Result,BL
- END;
-
- PROCEDURE MoveFromXMS(Size, Handle: WORD; FromAddress: LONGINT;
- ToAddress: POINTER);
- TYPE ByteArr = ARRAY[0..MaxInt] OF BYTE;
- BytePtr = ^ByteArr;
- BEGIN
- IF Size = 0 THEN Exit;
- IF Odd(FromAddress) THEN BEGIN
- BytePtr(ToAddress)^[0] := GetByte(Handle,FromAddress);
- IF XMS_Result <> 0 THEN Exit;
- Dec(Size);
- Inc(FromAddress);
- Inc(LONGINT(ToAddress));
- END;
- MoveMem(ToAddress, 0, POINTER(FromAddress), Handle, Size AND $FFFE);
- IF XMS_Result <> 0 THEN Exit;
- IF Odd(Size)
- THEN BytePtr(ToAddress)^[Size-1] := GetByte(Handle, FromAddress+Size-1);
- IF XMS_Result <> 0 THEN Exit;
- END;
-
- PROCEDURE MoveToXMS(Size,Handle: WORD; FromAddress:POINTER;
- ToAddress: LONGINT);
- TYPE ByteArr = ARRAY[0..MaxInt] OF BYTE;
- BytePtr = ^ByteArr;
- BEGIN
- IF Size = 0 THEN Exit;
- IF Odd(ToAddress) THEN BEGIN
- SetByte(Handle, ToAddress, BytePtr(FromAddress)^[0]);
- IF XMS_Result <> 0 THEN Exit;
- Dec(Size);
- Inc(LONGINT(FromAddress));
- Inc(ToAddress);
- END;
- MoveMem(POINTER(ToAddress), Handle, FromAddress, 0,Size and $FFFE);
- IF XMS_Result <> 0 THEN Exit;
- IF Odd(Size)
- THEN SetByte(Handle, ToAddress+Size-1, BytePtr(FromAddress)^[Size-1]);
- IF XMS_Result <> 0 THEN Exit;
- END;
-
- PROCEDURE ResizeMem (NewSize, Handle: WORD);ASSEMBLER;
- ASM
- MOV AH,$0F
- MOV BX,WORD PTR NewSize
- MOV DX,WORD PTR Handle
- CALL [XMMAddr]
- CMP AX,1
- JE @@1
- CMP BL,XMSnotImpl
- JNE @@2
- MOV XCLUDEHMA,1
- JMP @@2
- @@1:
- XOR BL,BL
- @@2:
- MOV BYTE PTR XMS_Result,BL
- END;
-
- Procedure RequestHMA(Size:Word); assembler;
- ASM
- MOV DX,Size
- MOV AH,1
- CALL [XMMAddr]
- CMP AX,1
- JE @@1
- JNE @@2
- @@1:
- XOR BL,BL
- @@2:
- MOV BYTE PTR XMS_Result,BL
- END;
-
- Procedure ReleaseHMA; assembler;
- ASM
- MOV AH,2
- CALL [XMMAddr]
- CMP AX,1
- JE @@1
- JNE @@2
- @@1:
- XOR BL,BL
- @@2:
- MOV BYTE PTR XMS_Result,BL
- END;
-
- FUNCTION IsA20On : BOOLEAN; Assembler;
- ASM
- MOV AH,7
- CALL [XMMAddr]
- CMP AX,1
- JE @@1
- XOR AX,AX
- @@1:
- END; { IsA20On }
-
- PROCEDURE XMSVersion (VAR XMSVer : WORD;
- VAR HMAAvail : BOOLEAN); Assembler;
- ASM
- XOR AX,AX
- CALL [XMMAddr]
- LES DI,XMSVer
- MOV ES:[DI],BX
- LES DI,HMAavail
- MOV AX,DX
- CMP AX,1
- JE @@1
- XOR AX,AX
- @@1:MOV ES:[DI],AL
- END; { XMSVersion }
-
-
- PROCEDURE InitUnit; ASSEMBLER;
- ASM
- MOV AX,$4300
- INT $2F
- CMP AL,$80
- JNE @@1
- MOV AX,$4310
- INT $2F
- MOV WORD PTR XMMAddr,BX
- MOV WORD PTR XMMAddr+2,ES
- JMP @@2
- @@1:
- MOV BYTE PTR XMS_Result,$80
- @@2:
- END;
-
- BEGIN
- InitUnit;
- XMS_DriverOk:=XMS_Result=0;
- If XMS_DriverOK then
- XMSVersion(VER,HMAavail);
- XCLUDEHMA:=Ver<MinVer;
- END.