; ; Command & Conquer Red Alert(tm) ; Copyright 2025 Electronic Arts Inc. ; ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see . ; ; $Header: g:/library/wwlib32/system/rcs/devices.asm 1.2 1994/04/28 12:41:41 jeff_wilson Exp $ ;*************************************************************************** ;** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S ** ;*************************************************************************** ;* * ;* Project Name : LIBRARY * ;* * ;* File Name : DEVICES.ASM * ;* * ;* Programmer : Christopher Yates * ;* * ;* Last Update : 12 December, 1990 [CY] * ;* * ;*-------------------------------------------------------------------------* ;* Functions: * ;* * ; VOID Get_Devices(VOID); * ; WORD Is_Device_Real(WORD drive); * ;* * ;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * ;---------------------------------------------------------------------------- IDEAL P386 MODEL USE32 FLAT GLOBAL Get_Devices :NEAR GLOBAL Is_Device_Real :NEAR GLOBAL MaxDevice :BYTE GLOBAL DefaultDrive :BYTE ; ---------------------------------------------------------------- ; ; Here are prototypes for the routines defined within this module: ; ; VOID Get_Devices(VOID); ; WORD Is_Device_Real(WORD drive); ; ; ---------------------------------------------------------------- CODESEG ;*********************************************************** ; ; GET_DEVICES ; ; VOID Get_Devices(VOID); ; ; This routine establishes the default disk drive and the maximum drive ; available in the current system. ; ;* DOS equ 21h PROC Get_Devices C near USES eax,ebx,edx sub eax,eax mov ah,25 ; get current drive service int DOS ; drive returned in al mov [DefaultDrive],al ; save it mov dl,al mov ah,14 ; set current as current drive int DOS dec al ; al = max drives, make it n - 1 xor ah,ah ; clear high byte mov edx,eax ; use dx to go backward to find out sub ebx,ebx ??back_loop: mov bl,dl ; find out about the drive in dl inc bl mov eax,0440Eh ; get the physical drive associated int DOS ; with this letter jnc short ??later ; if c clear, no error cmp al,0Fh ; was it invalid? (0Fh = invalid) jne short ??later ; yes, so LATER dec edx jmp ??back_loop ; try, try again ??later: mov eax,edx ; restore ax mov [MaxDevice],al ; save the max drive # ret ENDP Get_Devices ;*************************************************************** ;*************************************************************** ; ; IS_DEVICE_REAL ; ; WORD Is_Device_Real(WORD drive); ; ; This routine will tell whether or not a device is a true ; phisical one. Send it the drive # to check. ; ;* PROC Is_Device_Real C near USES ebx,edx ARG drive:WORD sub edx,edx mov dx,[drive] ??next_drive: push ebx mov bl,dl ; find out about the drive in dl inc bl mov eax,0440Eh ; get the physical drive associated int DOS ; with this letter pop ebx jnc short ??it_is_real ; jump if no error cmp al,01 ; 1 = invalid command, ; 0F = invalid device je short ??real ; 1? it is ok (RAM device) jmp short ??invalid ; 0Fh, it was not a device ??it_is_real: cmp al,0 ; was it a fixed device? je short ??real ; yes, it's ok dec al ; make it a drive # cmp al,dl ; is it a valid drive? je short ??real ??invalid: ; The device is invalid. mov eax,0 jmp short ??out ??real: ; Return true, for valid device. mov eax,1 ??out: ret ENDP Is_Device_Real ;*************************************************************** END