home *** CD-ROM | disk | FTP | other *** search
- ; **********************************************************
- ; * ASTOOL02.ASM *
- ; * Beispiel für einen Zugriff auf XMS-Speicher über *
- ; * HIMEM.SYS 6/11/90 *
- ; * (c) 1991 bei Peter Monadjemi & toolbox *
- ; **********************************************************
-
- .MODEL SMALL,C
- .STACK 1000h
- .DATA
- XMM_INITIALIZED DW 0
- XMM_CONTROL LABEL DWORD
- DW OFFSET XMM_NOT_INIT
- DW SEG _TEXT
-
- MEM_SIZE DW 0
- BLOCK_SIZE DW 0
- MEM_HANDLE DW 0
- ;
- ; Hier wird der Info-Block für den MoveBefehl assembliert
- ;
- XMM_INFO EQU $
- MOV_LAENGE DD 0
- SRC_HANDLE DW 0
- SRC_POINTER DD 0
- DST_HANDLE DW 0
- DST_POINTER DD 0
-
- TEXT1 DB 'XMS-Treiber konnte nicht installiert '
- DB 'werden!',10,13,'$'
- TEXT2 DB 'Fehler beim Verschieben eines Blocks!'
- DB 10,13,'$'
- TEXT3 DB 'Nicht genügend freier XMS-Speicher!'
- DB 10,13,'$'
- TEXT4 DB 'Speicherplatz kann nicht reserviert '
- DB 'werden!',10,13,'$'
- TEXT5 DB 'Fehler beim Anfordern der XMS-Größe!'
- DB '10,13,'$'
- PROMPT1 DB 'XMM-Handler installiert!',10,13,'$'
- PROMPT2 DB 'XMS-Speicher vorhanden!',10,13,'$'
- PROMPT3 DB 'XMS-Speicher angefordert',10,13,'$'
-
- TEST_BUF DB 'Ein Ausflug ins Extended-Memory!'
- DB '10,13,'$'
- ;
- ; Größe des zu verschiebenden Puffers muß gerade sein!
- ;
- BUFSIZE EQU ((($ - TEST_BUF +1) / 2)*2)
- ERROR_FLAG DB ?
- .CODE
- ;----------------------------------------------------------
- ; XMM_NOT_INIT
- ;----------------------------------------------------------
-
- XMM_NOT_INIT PROC ; Wird eingesetzt,
- ;wenn kein XMM-Treiber
- ;vorhanden
- XOR AX,AX
- MOV BL,80h
- RET
- XMM_NOT_INIT ENDP
-
- ;----------------------------------------------------------
- ; BOOL XMM_INSTALL (void)
- ;__________________________________________________________
-
- XMM_INSTALL PROC
- CMP XMM_INITIALIZED,0
- JNE IST_BEREITS_INSTALLIERT
-
- MOV AX,4300h
- INT 2Fh
- CMP AL,80h
- JNE NO_DRIVER
-
- MOV AX,4310h
- INT 2Fh
- MOV WORD PTR XMM_CONTROL,BX
- MOV WORD PTR XMM_CONTROL+2,ES
-
-
- INC XMM_INITIALIZED
-
- IST_BEREITS_INSTALLIERT:
- NO_DRIVER:
- MOV AX,XMM_INITIALIZED
- RET
- XMM_INSTALL ENDP
-
-
- ;----------------------------------------------------------
- ; WORD XMM_VERSION?
- ;----------------------------------------------------------
-
- XMM_VERSION? PROC
- XOR AH,AH
- CALL XMM_CONTROL
- RET
- XMM_VERSION? ENDP
-
- ;----------------------------------------------------------
- ; XMM_ALLOCATE(int SizeK)
- ;----------------------------------------------------------
-
- XMM_ALLOCATE PROC SIZEK:WORD
-
- MOV ERROR_FLAG,0
- MOV AH,09
- MOV DX,SIZEK
- CALL XMM_CONTROL
-
- OR AX,AX
- JZ ALLOC_FAIL
- MOV AX,DX
- JNZ ALLOC_OK
- ALLOC_FAIL:
- MOV ERROR_FLAG,BL
- ALLOC_OK:
- RET
- XMM_ALLOCATE ENDP
-
- ;----------------------------------------------------------
- ; long XMM_FREE_MEM(WORD Handle)
- ;----------------------------------------------------------
-
- XMM_FREE_MEM PROC HANDLE:WORD
- MOV ERROR_FLAG,0
- MOV AH,0Ah
- MOV DX,HANDLE
- CALL XMM_CONTROL
- XOR DX,DX
- OR AX,AX
- JZ FREE_OK
- MOV ERROR_FLAG,BL
- FREE_OK:
- RET
- XMM_FREE_MEM ENDP
-
-
- ;----------------------------------------------------------
- ; long XMM_MOVE(XMSMOVE *pInfo)
- ;----------------------------------------------------------
-
- XMM_MOVE PROC pINFO:NEAR PTR
- MOV ERROR_FLAG,0
- MOV AH,0Bh
- MOV SI,pINFO
- CALL XMM_CONTROL
-
- OR AX,AX
- JNZ MOVE_OK
- MOV ERROR_FLAG,BL
- MOVE_OK:
- RET
- XMM_MOVE ENDP
-
- ;----------------------------------------------------------
- ; int GET_XMS_SIZE(void)
- ;----------------------------------------------------------
-
- GET_XMS_SIZE PROC
- MOV ERROR_FLAG,0
- MOV AH,08
- CALL XMM_CONTROL
- OR AX,AX
- JNZ GET_XMS_SIZE_OK
- MOV ERROR_FLAG,BL
- GET_XMS_SIZE_OK:
- RET
- GET_XMS_SIZE ENDP
-
- ; =========================================================
- ; Hier ist der Eintrittspunkt des Programms
- ; =========================================================
- ;
- START:
- MOV DX,@DATA ; Datensegment initialisieren
- MOV DS,DX
-
- ; =========================================================
- ; Testpuffer ausgeben
- ; =========================================================
- ;
- MOV AH,09
- MOV DX,OFFSET TEST_BUF
- INT 21h
-
- CALL XMM_INSTALL ; XMM installieren
- CMP AX,0 ; Alles klar?
-
- JNE @F ; Ja, dann weiter
- JMP ERROR1
- @@:
-
- MOV DX,OFFSET PROMPT1
- MOV AH,09
- INT 21h
-
- ALLOC_SIZE EQU (BUFSIZE/1024)+1
-
- CALL GET_XMS_SIZE ;Wieviel Extended-Memory
- CMP ERROR_FLAG,0 ;ist verfügbar?
- JE @F
- JMP ERROR5
- @@:
- MOV MEM_SIZE,DX ;Größe des Extended-Memory
- MOV BLOCK_SIZE,AX ;Größter verfügbarer Block
-
- MOV DX,OFFSET PROMPT2
- MOV AH,09
- INT 21h
-
- CMP AX,ALLOC_SIZE ;Ist genug Ext.-Memory da?
- JNB @F ;Ja, dann weiter
- JMP ERROR3
- @@:
-
- MOV AX,ALLOC_SIZE ;Speicher anfordern
- PUSH AX
- CALL XMM_ALLOCATE
- ADD SP,2 ;Stack aufräumen
-
- CMP ERROR_FLAG,0
- JZ @F
- JMP ERROR4
- @@:
- MOV MEM_HANDLE,AX ;Handle abspeichern!!!!!!
-
- MOV DX,OFFSET PROMPT3
- MOV AH,09
- INT 21h
-
- ; =========================================================
- ; Testpuffer in das Extended-Memory verschieben
- ; =========================================================
-
- MOV SRC_HANDLE,0
- MOV WORD PTR SRC_POINTER,OFFSET TEST_BUF
- MOV WORD PTR SRC_POINTER+2,SEG TEST_BUF
- MOV AX,MEM_HANDLE
- MOV DST_HANDLE,AX
- MOV WORD PTR DST_POINTER,0
- MOV WORD PTR DST_POINTER+2,0
- MOV WORD PTR MOV_LAENGE,BUFSIZE
- MOV WORD PTR MOV_LAENGE+2,0
-
- ; =========================================================
- ; Verschieberoutine aufrufen
- ; =========================================================
- ;
- LEA AX,XMM_INFO
- PUSH AX
- CALL XMM_MOVE
- ADD SP,2
-
- CMP ERROR_FLAG,0
- JZ @F
- JMP ERROR2
- @@:
-
- ; =========================================================
- ; Testpuffer überschreiben
- ; =========================================================
- ;
- MOV CX,BUFSIZE-4
- MOV DX,@DATA
- MOV ES,DX
- LEA DI,TEST_BUF
- MOV AL,'X'
- REP STOSB
-
- ; =========================================================
- ; Überschriebenen Testpuffer ausgeben
- ; =========================================================
- ;
- MOV AH,09
- MOV DX,OFFSET TEST_BUF
- INT 21h
- ; =========================================================
- ; Speicherblock von Extended-Memory zurück in den Puffer
- ; =========================================================
- ;
- MOV AX,MEM_HANDLE
- MOV SRC_HANDLE,AX
- MOV WORD PTR SRC_POINTER,0
- MOV WORD PTR SRC_POINTER+2,0
- MOV DST_HANDLE,0
- MOV WORD PTR DST_POINTER,OFFSET TEST_BUF
- MOV WORD PTR DST_POINTER+2,SEG TEST_BUF
- MOV WORD PTR MOV_LAENGE,BUFSIZE
- MOV WORD PTR MOV_LAENGE+2,0
-
- ; =========================================================
- ; Verschieberoutine aufrufen
- ; =========================================================
- ;
- LEA AX,XMM_INFO
- PUSH AX
- CALL XMM_MOVE
- ADD SP,2
-
- CMP ERROR_FLAG,0
- JZ @F
- JMP ERROR2
- @@:
-
- ; =========================================================
- ; Testpuffer erneut ausgeben
- ; =========================================================
- ;
- MOV AH,09
- MOV DX,OFFSET TEST_BUF
- INT 21h
-
- MOV AH,0Ch
- MOV DX,MEM_HANDLE
- CALL XMM_CONTROL
-
- MOV AH,0Ah
- MOV DX,MEM_HANDLE
- CALL XMM_CONTROL
-
- ENDE:
- MOV AH,4Ch
- INT 21h
-
-
- ; =========================================================
- ; Fehlerroutinen
- ; =========================================================
-
- ERROR1:
- MOV DX,OFFSET TEXT1
- MOV AH,09
- INT 21h
- JMP ENDE
- ERROR2:
- MOV DX,OFFSET TEXT2
- MOV AH,09
- INT 21h
- JMP ENDE
- ERROR3:
- MOV DX,OFFSET TEXT3
- MOV AH,09
- INT 21h
- JMP ENDE
- ERROR4:
- MOV DX,OFFSET TEXT4
- MOV AH,09
- INT 21h
- JMP ENDE
- ERROR5:
- MOV DX,OFFSET TEXT5
- MOV AH,09
- INT 21h
- JMP ENDE
-
- END START
- ; **********************************************************
- ; * Ende von ASTOOL02.ASM *
-