home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* XMS.PAS *)
- (* stellt elementare Funktionen zur Arbeit mit *)
- (* eXtended Memory Manager zur Verfügung *)
- (* (c) 1991 Dirk Schneider & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT XMS;
-
- INTERFACE
-
- FUNCTION XMM_Avail : BOOLEAN;
- FUNCTION XMM_Memavail : WORD;
- FUNCTION XMM_Alloc(Size : WORD) : WORD;
-
- FUNCTION XMM_Free(Handle : WORD) : BOOLEAN;
- FUNCTION XMM_Move(DST : POINTER;
- DST_H : WORD;
- SRC : POINTER;
- SRC_H : WORD;
- Size : LONGINT) : BOOLEAN;
-
- IMPLEMENTATION
-
- VAR
- XMM_Ctrl : POINTER; { Eintrittadr. des XMM }
-
-
- FUNCTION XMM_Avail : BOOLEAN; ASSEMBLER;
- (* testet, ob XMM installiert ist *)
- ASM
- MOV AX,4300h
- INT 2Fh
- CMP AL,80h
- JE @ja { XMM-Treiber vorhanden? }
- XOR AL,AL { nein }
- JMP @exit
- @ja: MOV AX,4310h { ja }
- INT 2Fh
- MOV WORD PTR XMM_Ctrl,BX { BS --> Offset(XMM)}
- MOV WORD PTR XMM_Ctrl+2,ES { ES --> Segment(XMM)}
- MOV AL,1 { XMM_avail = true }
- @exit:
- END;
-
- FUNCTION XMM_Memavail : WORD; ASSEMBLER;
- (* maximal allokierbarer Block *)
- ASM
- MOV AH,08h { XMM-Funktion 08h }
- CALL XMM_Ctrl
- END;
-
- FUNCTION XMM_Alloc(Size : WORD) : WORD; ASSEMBLER;
- (* allokiert Block und gibt Handle zurück *)
- ASM
- MOV AH,09h { XMM-Funktion 09h }
- MOV DX,Size { Größe in DX }
- CALL XMM_Ctrl
- CMP AX,00h
- JE @exit { Handle=0, dann Fehler }
- MOV AX,DX { Handle zurück }
- @exit:
- END;
-
- FUNCTION XMM_Free(Handle : WORD) : BOOLEAN; ASSEMBLER;
- (* gibt allokiert Block frei *)
- ASM
- MOV AH,0Ah { XMM-Funktion 0Ah }
- MOV DX,Handle { Handle in DX }
- CALL XMM_Ctrl
- CMP AX,00h { Fehler ? }
- JE @exit
- INC AL { nein, true zurück }
- @exit:
- END;
-
- FUNCTION XMM_Move(DST : POINTER; DST_H : WORD;
- SRC : POINTER; SRC_H : WORD;
- Size : LONGINT) : BOOLEAN; ASSEMBLER;
- (* kann Block im gesamten RAM kopieren *)
- ASM
- MOV AH,0bh { XMM-Funktion 0Bh }
- MOV SI,BP { DS:SI auf Parameterblock, }
- ADD SI,6 { also auf SS:BP+6 da Far ! }
- PUSH DS { Die Reihenfolge der Parameter }
- POP ES { darf nicht geändert werden ! }
- MOV DX,SS { Aufruf des XMM erfolgt durch }
- MOV DS,DX { Segment-Override DS --> ES }
- CALL ES:[XMM_Ctrl]
- PUSH ES { DS wiederherstellen }
- POP DS
- CMP AX,0 { Fehler ? }
- JE @exit
- INC AL { nein, true zurück }
- @exit:
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von XMS.PAS *)
-
-