home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9203 / driver / doslib.asm next >
Encoding:
Assembly Source File  |  1992-04-06  |  7.1 KB  |  204 lines

  1. ; Dieses Modul mit TASM /MX DOSLIB übersetzen und in der PRJ-Datei
  2. ; für DRVLOAD bzw. DRVFRAME die Datei DOSLIB.OBJ angeben!
  3.  
  4.            .MODEL COMPACT
  5.            .CODE
  6. ; Bringt einen Wert im Codesegment unter und tauscht ihn
  7. ; bei jedem Aufruf aus; wird vor allem für das Sichern
  8. ; des DS-Registers benutzt
  9.  
  10. ; unsigned SwapValInCS(unsigned NewVal);  /* Prototyp */
  11.  
  12.        PUBLIC C SwapValInCS
  13. CurrVal    dw ?
  14. SwapValInCS PROC NEAR
  15.        ARG NewVal: Word
  16.            push bp
  17.            mov  bp,sp
  18.        mov  ax,[NewVal]  ; Austausch
  19.            xchg ax,[CurrVal]
  20.        pop  bp
  21.        ret               ; mit altem Wert in AX
  22. SwapValInCS ENDP
  23.  
  24. ; Funktion 0x30 - (Echte) DOS-Versionsnummer ermitteln
  25.  
  26. ; unsigned DosVersion(void);   /* Prototyp */
  27.  
  28.            PUBLIC C DosVersion
  29. ConName    db 'CON',0        ; Gerätename CON (für OPEN)
  30. DRDos500   db 0              ; Flags für DR-DOS
  31. DRDos341   db 0
  32. FirstCall  db 0FFh           ; Flag für "1. Aufruf"
  33. DosVersion PROC
  34.            cmp  [FirstCall],0FFh
  35.            jnz  DosVSet      ; OK - keine weiteren Tests
  36.            mov  ah,30h       ; sonst Versionsnummer ermitteln
  37.            int  21h          ; Aufruf
  38.            mov  [FirstCall],al ; Flag zurück
  39.            cmp  ax,1F03h     ; Version 3.31?
  40.            jnz  DosV3        ; -> nein, was anderes
  41.            push ds
  42.            push cs           ; OPEN von CON: DS:DX auf Name
  43.            pop  ds
  44.            mov  dx,OFFSET ConName
  45.            mov  ax,3D00h     ; Modus "Read only"
  46.            int  21h
  47.            mov  bx,ax        ; Handle
  48.            mov  ax,5700h     ; "Get File Time"
  49.            int  21h
  50.            pop  ds
  51.            or   cx,dx        ; ermittelte Zeit
  52.            pushf
  53.            mov  ah,3Eh       ; "Close File"
  54.            int  21h
  55.            popf
  56.            jnz  DosV3        ; <> 0 -> nicht DR-DOS
  57.  
  58.            mov  ah,52h       ; DOS-Datenbereich ermitteln
  59.            int  21h
  60.            les  bx,es:[bx+4] ; SFT-Adresse -> ES:BX
  61.            mov  ax,Word Ptr es:[bx+6] ; Handle-Zahl von AUX
  62.            add  ax,Word Ptr es:[bx+6+35h] ; Handle-Zahl von CON
  63.            cmp  ax,2
  64.            ja   Is500
  65. Is341:     mov  [DRDos341],0FFh
  66.            jmp short DosVSet
  67. Is500:     mov  [DRDos500],0FFh
  68.  
  69. DosVSet:   xor  cx,cx        ; OEM- und Seriennummer
  70.            xor  bx,bx        ; auf 0
  71.            mov  ax,2903h     ; "3.41"
  72.            cmp  [DRDos341],0FFh ; Flag gesetzt?
  73.            jz   DosV1        ; ja - Versionsnummer 3.41
  74.            mov  ax,3203h     ; "3.50"
  75.            cmp  [DRDos500],0FFh ; Flag gesetzt?
  76.            jz   DosV1        ; ja - Versionsnummer 3.50
  77.  
  78. DosV3:     mov  ax,3306h     ; sonst Versuch über die
  79.            int  21h          ; Funktion 0x3306
  80.            cmp  ax,3306h     ; hat's geklappt?
  81.            mov  ax,bx        ; wenn ja: Version in BX
  82.            jz   DosV1
  83.            mov  ah,30        ; ansonsten alte Funktion
  84.            int  21h          ; Aufruf
  85. DosV1:     ret               ; mit Versionsnummer in AX
  86. DosVersion ENDP
  87.  
  88.            .DATA
  89.            EXTRN _errno: Word
  90.  
  91.            .CODE
  92. ; Funktion 0x5800 - Ermittelt die Logik der Speicherplatzvergabe
  93.  
  94. ; unsigned char GetAllocStrat(void);   /* Prototyp */
  95.  
  96.            PUBLIC C GetAllocStrat
  97. GetAllocStrat PROC
  98.            mov  ax,5800h     ; Funktionsnummer
  99.            int  21h          ; Aufruf
  100.            mov  ah,0
  101.            ret               ; mit Kennziffer in AL
  102. GetAllocStrat ENDP
  103.  
  104. ; Funktion 0x5801 - Legt die Logik der Speicherplatzvergabe fest
  105.  
  106. ; void SetAllocStrat(unsigned char NewStrat);   /* Prototyp */
  107.  
  108.            PUBLIC C SetAllocStrat
  109. SetAllocStrat PROC
  110.            ARG NewStrat: Byte
  111.            push bp
  112.            mov  bp,sp
  113.            mov  ax,5801h     ; Funktionsnummer
  114.            mov  bl,[NewStrat] ; Kennziffer der neuen Logik
  115.            mov  bh,0         ; (you never know...)
  116.            int  21h          ; Aufruf
  117.            pop  bp
  118.            ret               ; ohne direktes Ergebnis
  119. SetAllocStrat ENDP
  120.  
  121. ; Funktion 0x5802 - Prüft, ob UMBs berücksichtigt werden
  122. ; und funktioniert sowohl für MS-DOS 5 als auch für DR-DOS 5.0
  123.  
  124. ; int GetUMBLink(void);   /* Prototyp */
  125.  
  126.            PUBLIC C GetUMBLink
  127. GetUMBLink PROC
  128.            call DosVersion   ; Prüfung der DOS-Version
  129.            cmp  ax,3203h     ; DR-DOS 5.0?
  130.            jnz  GetUM2       ; -> nein
  131.            mov  ah,52h       ; DOS-Datenbereich ermitteln
  132.            int  21h          ; (setzt ES:BX)
  133.            mov  es,Word Ptr es:[bx-2]
  134.            xor  bx,bx
  135. GetUM1:    cmp  Byte Ptr es:[bx],'Z' ; letzter Block?
  136.            pushf
  137.            mov  ax,es        ; MCB-Segment
  138.            add  ax,Word Ptr es:[bx+3] ; Größe
  139.            inc  ax
  140.            mov  es,ax
  141.            popf
  142.            jnz  GetUM1       ; nächster MCB
  143.            cmp  ax,0A000h    ; MCB-Ende > 0xA000?
  144.            jb   GetUM3       ; -> nein, Ergebnis 0
  145.            mov  al,0FFh      ; OK - UMB ist drin
  146.            jmp short GetUM4
  147.  
  148. GetUM2:    mov  ax,5802h     ; Funktionsnummer
  149.            int  21h          ; Aufruf
  150.            jnc  GetUM4       ; -> OK
  151. GetUM3:    xor  al,al        ; Fehler -> "nicht eingebunden"
  152. GetUM4:    xor  ah,ah
  153.            ret               ; mit AX != 0 für "eingebunden"
  154. GetUMBLink ENDP
  155.  
  156. ; Funktion 0x5803 - Versucht, UMBs mit in die Logik einzubinden
  157. ; und funktioniert sowohl für MS-DOS 5 als auch für DR-DOS 5.0
  158.  
  159. ; int SetUMBLink(unsigned char LinkState);   /* Prototyp */
  160.  
  161.            PUBLIC C SetUMBLink
  162. SetUMBLink PROC
  163.            ARG LinkState: Byte
  164.            push bp
  165.            mov  bp,sp
  166.            call DosVersion   ; Dos-Versionsnummer
  167.            cmp  ax,3203h     ; DR-DOS 5.0?
  168.            jnz  SetUM3       ; -> nein, was anderes
  169.            mov  ah,52h       ; DOS-Datenbereich ermitteln
  170.            int  21h          ; (setzt ES:BX)
  171.            mov  ax,Word Ptr es:[bx-2] ; erstes MCB-Segment
  172.            xor  bx,bx
  173. SetUM1:    mov  es,ax        ; MSB-Segment
  174.            add  ax,Word Ptr es:[bx+3] ; plus MCB->Size
  175.            inc  ax
  176.            cmp  ax,9FFFh     ; Block-Ende > 0x9FFF?
  177.            ja   SetUMErr     ; -> ja: MEMMAX nicht installiert
  178.            jb   SetUM1       ; < 0x9FFF -> nächster Block
  179.            push es           ; MEMMAX-Block gefunden:
  180.            mov  es,ax        ; (0x9FFF)
  181.            cmp  Word Ptr es:[bx+1], 0007 ; Owner-ID = 7 (MEMMAX)?
  182.            pop  es           ; wieder auf den Vorgänger-Block
  183.            jnz  SetUMErr     ; nein - irgendwas anderes
  184.            mov  al,'Z'
  185.            cmp  [LinkState],0 ; UMB abschalten?
  186.            jz   SetUM2
  187.            mov  al,'M'       ; aktivieren
  188. SetUM2:    mov  Byte Ptr es:[bx],al
  189.            xor  ax,ax
  190.            jmp short SetUM4  ; OK, erledigt
  191. SetUMErr:  mov  ax,1         ; "Funktion nicht unterstützt"
  192.            jmp short SetUM4
  193. SetUM3:    mov  ax,5803h     ; Funktionsnummer für MS-DOS
  194.            mov  bl,[LinkState] ; != 0 == Einbindung
  195.            xor  bh,bh
  196.            int  21h
  197.            jc   SetUM4       ; -> Fehler
  198.            xor  ax,ax
  199. SetUM4:    mov  [_errno],ax
  200.            pop  bp
  201.            ret               ; mit AX = 0 für "OK"
  202. SetUMBLink ENDP
  203.            END
  204.