home *** CD-ROM | disk | FTP | other *** search
- ; Dieses Modul mit TASM /MX DOSLIB übersetzen und in der PRJ-Datei
- ; für DRVLOAD bzw. DRVFRAME die Datei DOSLIB.OBJ angeben!
-
- .MODEL COMPACT
- .CODE
- ; Bringt einen Wert im Codesegment unter und tauscht ihn
- ; bei jedem Aufruf aus; wird vor allem für das Sichern
- ; des DS-Registers benutzt
-
- ; unsigned SwapValInCS(unsigned NewVal); /* Prototyp */
-
- PUBLIC C SwapValInCS
- CurrVal dw ?
- SwapValInCS PROC NEAR
- ARG NewVal: Word
- push bp
- mov bp,sp
- mov ax,[NewVal] ; Austausch
- xchg ax,[CurrVal]
- pop bp
- ret ; mit altem Wert in AX
- SwapValInCS ENDP
-
- ; Funktion 0x30 - (Echte) DOS-Versionsnummer ermitteln
-
- ; unsigned DosVersion(void); /* Prototyp */
-
- PUBLIC C DosVersion
- ConName db 'CON',0 ; Gerätename CON (für OPEN)
- DRDos500 db 0 ; Flags für DR-DOS
- DRDos341 db 0
- FirstCall db 0FFh ; Flag für "1. Aufruf"
- DosVersion PROC
- cmp [FirstCall],0FFh
- jnz DosVSet ; OK - keine weiteren Tests
- mov ah,30h ; sonst Versionsnummer ermitteln
- int 21h ; Aufruf
- mov [FirstCall],al ; Flag zurück
- cmp ax,1F03h ; Version 3.31?
- jnz DosV3 ; -> nein, was anderes
- push ds
- push cs ; OPEN von CON: DS:DX auf Name
- pop ds
- mov dx,OFFSET ConName
- mov ax,3D00h ; Modus "Read only"
- int 21h
- mov bx,ax ; Handle
- mov ax,5700h ; "Get File Time"
- int 21h
- pop ds
- or cx,dx ; ermittelte Zeit
- pushf
- mov ah,3Eh ; "Close File"
- int 21h
- popf
- jnz DosV3 ; <> 0 -> nicht DR-DOS
-
- mov ah,52h ; DOS-Datenbereich ermitteln
- int 21h
- les bx,es:[bx+4] ; SFT-Adresse -> ES:BX
- mov ax,Word Ptr es:[bx+6] ; Handle-Zahl von AUX
- add ax,Word Ptr es:[bx+6+35h] ; Handle-Zahl von CON
- cmp ax,2
- ja Is500
- Is341: mov [DRDos341],0FFh
- jmp short DosVSet
- Is500: mov [DRDos500],0FFh
-
- DosVSet: xor cx,cx ; OEM- und Seriennummer
- xor bx,bx ; auf 0
- mov ax,2903h ; "3.41"
- cmp [DRDos341],0FFh ; Flag gesetzt?
- jz DosV1 ; ja - Versionsnummer 3.41
- mov ax,3203h ; "3.50"
- cmp [DRDos500],0FFh ; Flag gesetzt?
- jz DosV1 ; ja - Versionsnummer 3.50
-
- DosV3: mov ax,3306h ; sonst Versuch über die
- int 21h ; Funktion 0x3306
- cmp ax,3306h ; hat's geklappt?
- mov ax,bx ; wenn ja: Version in BX
- jz DosV1
- mov ah,30 ; ansonsten alte Funktion
- int 21h ; Aufruf
- DosV1: ret ; mit Versionsnummer in AX
- DosVersion ENDP
-
- .DATA
- EXTRN _errno: Word
-
- .CODE
- ; Funktion 0x5800 - Ermittelt die Logik der Speicherplatzvergabe
-
- ; unsigned char GetAllocStrat(void); /* Prototyp */
-
- PUBLIC C GetAllocStrat
- GetAllocStrat PROC
- mov ax,5800h ; Funktionsnummer
- int 21h ; Aufruf
- mov ah,0
- ret ; mit Kennziffer in AL
- GetAllocStrat ENDP
-
- ; Funktion 0x5801 - Legt die Logik der Speicherplatzvergabe fest
-
- ; void SetAllocStrat(unsigned char NewStrat); /* Prototyp */
-
- PUBLIC C SetAllocStrat
- SetAllocStrat PROC
- ARG NewStrat: Byte
- push bp
- mov bp,sp
- mov ax,5801h ; Funktionsnummer
- mov bl,[NewStrat] ; Kennziffer der neuen Logik
- mov bh,0 ; (you never know...)
- int 21h ; Aufruf
- pop bp
- ret ; ohne direktes Ergebnis
- SetAllocStrat ENDP
-
- ; Funktion 0x5802 - Prüft, ob UMBs berücksichtigt werden
- ; und funktioniert sowohl für MS-DOS 5 als auch für DR-DOS 5.0
-
- ; int GetUMBLink(void); /* Prototyp */
-
- PUBLIC C GetUMBLink
- GetUMBLink PROC
- call DosVersion ; Prüfung der DOS-Version
- cmp ax,3203h ; DR-DOS 5.0?
- jnz GetUM2 ; -> nein
- mov ah,52h ; DOS-Datenbereich ermitteln
- int 21h ; (setzt ES:BX)
- mov es,Word Ptr es:[bx-2]
- xor bx,bx
- GetUM1: cmp Byte Ptr es:[bx],'Z' ; letzter Block?
- pushf
- mov ax,es ; MCB-Segment
- add ax,Word Ptr es:[bx+3] ; Größe
- inc ax
- mov es,ax
- popf
- jnz GetUM1 ; nächster MCB
- cmp ax,0A000h ; MCB-Ende > 0xA000?
- jb GetUM3 ; -> nein, Ergebnis 0
- mov al,0FFh ; OK - UMB ist drin
- jmp short GetUM4
-
- GetUM2: mov ax,5802h ; Funktionsnummer
- int 21h ; Aufruf
- jnc GetUM4 ; -> OK
- GetUM3: xor al,al ; Fehler -> "nicht eingebunden"
- GetUM4: xor ah,ah
- ret ; mit AX != 0 für "eingebunden"
- GetUMBLink ENDP
-
- ; Funktion 0x5803 - Versucht, UMBs mit in die Logik einzubinden
- ; und funktioniert sowohl für MS-DOS 5 als auch für DR-DOS 5.0
-
- ; int SetUMBLink(unsigned char LinkState); /* Prototyp */
-
- PUBLIC C SetUMBLink
- SetUMBLink PROC
- ARG LinkState: Byte
- push bp
- mov bp,sp
- call DosVersion ; Dos-Versionsnummer
- cmp ax,3203h ; DR-DOS 5.0?
- jnz SetUM3 ; -> nein, was anderes
- mov ah,52h ; DOS-Datenbereich ermitteln
- int 21h ; (setzt ES:BX)
- mov ax,Word Ptr es:[bx-2] ; erstes MCB-Segment
- xor bx,bx
- SetUM1: mov es,ax ; MSB-Segment
- add ax,Word Ptr es:[bx+3] ; plus MCB->Size
- inc ax
- cmp ax,9FFFh ; Block-Ende > 0x9FFF?
- ja SetUMErr ; -> ja: MEMMAX nicht installiert
- jb SetUM1 ; < 0x9FFF -> nächster Block
- push es ; MEMMAX-Block gefunden:
- mov es,ax ; (0x9FFF)
- cmp Word Ptr es:[bx+1], 0007 ; Owner-ID = 7 (MEMMAX)?
- pop es ; wieder auf den Vorgänger-Block
- jnz SetUMErr ; nein - irgendwas anderes
- mov al,'Z'
- cmp [LinkState],0 ; UMB abschalten?
- jz SetUM2
- mov al,'M' ; aktivieren
- SetUM2: mov Byte Ptr es:[bx],al
- xor ax,ax
- jmp short SetUM4 ; OK, erledigt
- SetUMErr: mov ax,1 ; "Funktion nicht unterstützt"
- jmp short SetUM4
- SetUM3: mov ax,5803h ; Funktionsnummer für MS-DOS
- mov bl,[LinkState] ; != 0 == Einbindung
- xor bh,bh
- int 21h
- jc SetUM4 ; -> Fehler
- xor ax,ax
- SetUM4: mov [_errno],ax
- pop bp
- ret ; mit AX = 0 für "OK"
- SetUMBLink ENDP
- END
-