glblinit.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:21k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. ;/*
  2. ; *                      Microsoft Confidential
  3. ; *                      Copyright (C) Microsoft Corporation 1991
  4. ; *                      All Rights Reserved.
  5. ; */
  6. ;===========================================================================
  7. ; FILE: GLBLINIT.ASM
  8. ;
  9. ;===========================================================================
  10. ;===========================================================================
  11. ;Declaration of include files
  12. ;===========================================================================
  13. ;
  14. ;---------------------------------------------------------------------------
  15. ;
  16. ; M024 : B#5495. Added "Insufficient memory" message when FORMAT cannot
  17. ; allocate memory for FAT, Directory... etc 
  18. ;
  19. ;---------------------------------------------------------------------------
  20. ;
  21. debug  equ  0
  22.         .xlist
  23. INCLUDE BPB.INC
  24. ; INCLUDE VERSION.INC
  25. ; INCLUDE VERSIONA.INC
  26. INCLUDE DOSMAC.INC
  27. INCLUDE SYSCALL.INC
  28. ; INCLUDE DPB.INC
  29. INCLUDE FOREQU.INC
  30. INCLUDE FORMACRO.INC
  31. INCLUDE IOCTL.INC
  32. INCLUDE FORSWTCH.INC
  33. INCLUDE SAFEDEF.INC
  34. INCLUDE SYSVAR.INC
  35. .list
  36. ;===========================================================================
  37. ; Declarations for all publics in other modules used by this module
  38. ;===========================================================================
  39. ;Bytes
  40. EXTRN msgOutOfMemory   :BYTE
  41. EXTRN msgInsufficientMemory   :BYTE ; M024
  42. EXTRN Drive   :BYTE
  43. EXTRN ClustBound_Flag   :BYTE
  44. EXTRN FileStat   :BYTE
  45. EXTRN SystemDriveLetter   :BYTE
  46. ;Words
  47. EXTRN SwitchMap   :WORD
  48. EXTRN  mSize   :WORD
  49. EXTRN mStart   :WORD
  50. EXTRN ClustBound_Buffer_Seg   :WORD
  51. EXTRN Paras_per_fat   :WORD
  52. ;Pointers
  53. EXTRN DirectorySector   :DWORD
  54. EXTRN FatSpace      :DWORD
  55. EXTRN FatSector   :DWORD
  56. ;No more SAFE module
  57. ; EXTRN HeaderBuf   :DWORD
  58. EXTRN DirBuf   :DWORD
  59. ;Functions
  60. ;Messages
  61. EXTRN msgFormatNotSupported   :BYTE
  62. ;Structures
  63. EXTRN SavedParams   :BYTE
  64. EXTRN DeviceParameters   :BYTE
  65. EXTRN Bios   :BYTE
  66. EXTRN   Dos   :BYTE
  67. EXTRN Command    :BYTE
  68. ;Labels
  69. EXTRN FatalExit   :NEAR
  70. EXTRN ReadDos   :NEAR
  71. EXTRN SysPrm   :NEAR
  72. ;===========================================================================
  73. ; Data segment
  74. ;===========================================================================
  75. DATA    SEGMENT PUBLIC PARA 'DATA'
  76. SECTORS_FOR_MIRROR EQU 7 ; # extra buffer sectors
  77. ; required by Mirror utility,
  78. ; apart from FAT & Root Dir
  79. DATA ENDS
  80. ;===========================================================================
  81. ; Executable code segment
  82. ;===========================================================================
  83. CODE SEGMENT PUBLIC PARA 'CODE'
  84. ASSUME CS:CODE, DS:DATA, ES:DATA
  85. ;===========================================================================
  86. ; Declarations for all publics in this module
  87. ;===========================================================================
  88. PUBLIC Global_Init
  89. PUBLIC GetDeviceParameters
  90. ; for debug
  91. PUBLIC Copy_Device_Parameters
  92. PUBLIC Alloc_Dir_Buf
  93. PUBLIC Alloc_Fat_Buf
  94. PUBLIC Alloc_Fat_Sec_Buf
  95. PUBLIC Alloc_DirBuf2
  96. PUBLIC Alloc_Cluster_Buf
  97. PUBLIC Do_Switch_S
  98. ;===========================================================================
  99. ;
  100. ;  Global_Init  : This procedure first gets the default drive parameters.
  101. ; It then allocates buffer space for the root directory
  102. ; sector, FAT,a fat sector, a file header and first
  103. ; root DIR sector based on these parameters.  It
  104. ; then checks for the /s switch and if this is present,
  105. ; a buffer is allocated for the system files and these
  106. ; are read into memory.  A prompt to insert the system
  107. ; disk will be given in the case of removable media.
  108. ;
  109. ;===========================================================================
  110. Global_Init proc near
  111. lea DX, DeviceParameters ; Get the default drive parameters
  112. mov DeviceParameters.DP_SpecialFunctions, 0
  113. call GetDeviceParameters
  114. jnc GotDeviceParameters
  115. Message msgFormatNotSupported
  116. stc  ; Let the jump to FatalExit be made
  117. ret ;  in the main routine, upon returning
  118. GotDeviceParameters:
  119. call Copy_Device_Parameters ; Save the device parameters
  120. ; for when we exit
  121. call Alloc_Dir_Buf ; Allocate root directory buffer
  122. jc gi_memerr ; M024
  123. call Alloc_Fat_Buf ; Allocate FAT buffer
  124. jc gi_memerr ; M024
  125. call Alloc_Fat_Sec_Buf ; Allocate fat sector buffer
  126. jc gi_memerr ; M024
  127. ;No more SAFE module
  128. ; call Alloc_Header_Buf ; Allocate buffer for restoration file
  129. ; retc
  130. call Alloc_DirBuf2 ; Allocate 1-sector buffer DirBuf (general-
  131. ; purpose use)
  132. jc gi_memerr ; M024
  133. call Alloc_Cluster_Buf ; get room for retry buffer
  134. call Do_Switch_S ; Load system files if needed
  135. ; carry flag determined by Do_Switch_S
  136. ; clc ; Signal no error
  137. ret
  138. gi_memerr: ; M024
  139. Message msgInsufficientMemory ; M024
  140. stc ; M024
  141. ret ; M024
  142. Global_Init endp
  143. ; =========================================================================
  144. ;
  145. ;   GetDeviceParameters:
  146. ; Get the device parameters
  147. ;
  148. ;   Input:
  149. ; Drive
  150. ; DX - pointer to device parameters
  151. ; =========================================================================
  152. GetDeviceParameters proc near
  153. mov AX, (IOCTL shl 8) or GENERIC_IOCTL
  154. mov bl, Drive
  155. inc bl
  156. mov CX, (RAWIO shl 8) or GET_DEVICE_PARAMETERS
  157. int 21H
  158. return
  159. GetDeviceParameters endp
  160. ;==========================================================================
  161. ;
  162. ; Copy_Device_Parameters : This procedure saves a copy of the original
  163. ; device parameters in the structure 
  164. ; SavedParams.
  165. ;
  166. ;==========================================================================
  167. Copy_Device_Parameters proc near
  168. lea SI, DeviceParameters
  169. lea DI, SavedParams
  170. mov CX, size a_DeviceParameters
  171. push DS
  172. pop ES
  173. rep movsb
  174. ret
  175. Copy_Device_Parameters endp
  176. ;==========================================================================
  177. ;
  178. ;  Alloc_Dir_Buf  :  This procedure allocates a memory block for the root 
  179. ;      directory buffer, based on the device parameters only.
  180. ;
  181. ;  Inputs      :  DeviceParameters.DP_BPB.BPB_BytesPerSector
  182. ;  Outputs   :  CY CLEAR - DirectorySector pointer to buffer
  183. ;      CY SET   - failure
  184. ;  Modifies   :  AX, BX, DirectorySector
  185. ;
  186. ;==========================================================================
  187. Alloc_Dir_Buf proc near
  188. ; DirectorySector =
  189.   ; malloc( Bytes Per Sector )
  190. mov BX, DeviceParameters.DP_BPB.BPB_BytesPerSector
  191. add BX, 0fH
  192. shr BX, 1 ; Divide by 16 to get #paragraphs
  193. shr BX, 1
  194. shr BX, 1
  195. shr BX, 1
  196. mov AH, Alloc
  197. int 21h
  198. jc      Exit_Alloc_Dir_Buf
  199. ; Base address of newly allocated
  200. ; block is AX:0000
  201. mov WORD PTR DirectorySector+2,AX
  202. xor AX,AX
  203. mov WORD PTR DirectorySector,AX
  204. Exit_Alloc_Dir_Buf:
  205. ret
  206. Alloc_Dir_Buf endp
  207. ;==========================================================================
  208. ;
  209. ;  Alloc_Fat_Buf  :  This procedure allocates a memory block for the FAT
  210. ;      buffer, based on the device parameters only.  In order
  211. ;      to ensure there is enough buffer space for the Mirror
  212. ;         utility, the FatSpace buffer is initially allocated
  213. ;      with size:
  214. ; FAT + RootDir + 6 sectors + 1 surplus sector
  215. ;      which is all the buffer space required by Mirror.
  216. ;
  217. ;  Inputs      :  DeviceParameters.DP_BPB.BPB_BytesPerSector
  218. ;      DeviceParameters.DP_BPB.BPB_SectorsPerFat
  219. ;      DeviceParameters.DP_BPB.BPB_RootEntries
  220. ;
  221. ;  Outputs   :  CY CLEAR - FatSpace pointer to buffer
  222. ;      CY SET   - failure
  223. ;
  224. ;  Modifies   :  AX, BX, DX, FatSpace
  225. ;
  226. ;==========================================================================
  227. Alloc_Fat_Buf proc near
  228. ; FatSpace =
  229. ; malloc( BytesPerSec * SecPerFat +
  230. ; 32 * RootEntries + 6 * ByesPerSec)
  231. mov AX, DeviceParameters.DP_BPB.BPB_BytesPerSector
  232. add AX, 0fH ; round up for next para
  233. shr AX, 1 ; convert to paras
  234. shr AX, 1
  235. shr AX, 1
  236. shr AX, 1
  237. mul DeviceParameters.DP_BPB.BPB_SectorsPerFat
  238. mov BX,AX ; Save FAT size in paras in BX
  239. ;No more SAFE module
  240. ; Old Logic Was :    Since this buffer is used in SAFE to hold the root
  241. ;      directory from the disk, the size of the buffer is
  242. ;      allocated as the larger of the drive defaults for
  243. ;      the FAT or the whole root directory.
  244. ;      The size of FatSpace must be the largest of
  245. ; 1) FAT
  246. ; 2) Root Dir
  247. ; 3) Cluster size needed for 1.5K
  248. ;
  249. ; mov AX,DeviceParameters.DP_BPB.BPB_RootEntries
  250. ; shl AX,1 ; Multiply by 2 to get total para size
  251. ; ; (Each entry is 32 bytes)
  252. ;
  253. ; cmp AX,BX ; now see which is bigger
  254. ; jna CheckClusters ; Use FAT size if BX >= AX
  255. ;
  256. ;UseDirSize:
  257. ; mov BX,AX ; Root directory is bigger
  258. ;
  259. ;CheckClusters: ; Now BX contains the larger of the
  260. ; ; FAT and RootDir size, in paras
  261. ; ; Calculate the para size of the #
  262. ; ; clusters needed for 1.5K
  263. ; mov AX, DeviceParameters.DP_BPB.BPB_BytesPerSector
  264. ; mov CL,deviceParameters.DP_BPB.BPB_SectorsPerCluster
  265. ; xor CH,CH ; Sectors per cluster in CX
  266. ; mul CX ; DX:AX= bytes per cluster
  267. ; mov CX,AX ; CX = #bytes per cluster
  268. ; mov AX,1536 ; AX = 1.5K
  269. ; div CX ; Calc. # clusters needed for 1.5K
  270. ; or DX,DX ; Non-zero remainder?
  271. ; jz Rounded ; No need to round up for zero remainder
  272. ; inc AX ; Increment #clusters needed, for non-zero remainder
  273. ;Rounded:
  274. ; mul CX ; Calculate byte size needed (#Clusters * BytesPerCluster)
  275. ; add AX, 0fH ; Convert to paras
  276. ; shr AX, 1
  277. ; shr AX, 1
  278. ; shr AX, 1
  279. ; shr AX, 1
  280. ;
  281. ; cmp AX,BX ; Now AX=para size for clusters in 1.5K
  282. ; jna AllocateAsIs ; Use larger of FAT,RootDir if not bigger
  283. ;
  284. ;UseClustSize:
  285. ; mov BX,AX ; Clusters in 1.5K is bigger
  286. SaveFatSize:
  287. mov Paras_per_fat,BX ; Set paras_per_fat here, to 
  288. ;  avoid having to calculate it later
  289. ; Now add on root dir + extra sectors
  290. mov AX,DeviceParameters.DP_BPB.BPB_RootEntries
  291. shl AX,1 ; AX = para size of root dir
  292. add BX,AX ; BX = FAT + root dir
  293. mov AX, DeviceParameters.DP_BPB.BPB_BytesPerSector
  294. add AX, 0fH ; round up for next para
  295. shr AX, 1 ; convert to paras
  296. shr AX, 1
  297. shr AX, 1
  298. shr AX, 1 ; AX = sector size in paras
  299. mov CX,SECTORS_FOR_MIRROR ; CX = # additional sectors needed by Mirror
  300. mul CX ; AX = total extra sector size in paras
  301. add BX,AX ; BX = FAT + root dir + extra sectors
  302. ;  in paras
  303. mov AH,Alloc
  304. int 21h
  305. jc      Exit_Alloc_Fat_Buf
  306. mov WORD PTR FatSpace+2,AX
  307. xor AX,AX
  308. mov WORD PTR FatSpace,AX
  309. Exit_Alloc_Fat_Buf:
  310. ret
  311. Alloc_Fat_Buf endp
  312. ;==========================================================================
  313. ;
  314. ;  Alloc_Fat_Sec_Buf : This procedure allocates a memory block for the fat 
  315. ;        sector buffer which is used when copying chains from
  316. ;        the old FAT to the new FAT.
  317. ;
  318. ;  Inputs      :  DeviceParameters.DP_BPB.BPB_BytesPerSector
  319. ;  Outputs   :  CY CLEAR - FatSector pointer to buffer
  320. ;      CY SET   - failure
  321. ;  Modifies   :  AX, BX, FatSector
  322. ;
  323. ;==========================================================================
  324. Alloc_Fat_Sec_Buf proc near
  325. ; FatSector =
  326.   ; malloc( Bytes Per Sector )
  327. mov BX, DeviceParameters.DP_BPB.BPB_BytesPerSector
  328. add BX, 0fH
  329. shr BX, 1 ; Divide by 16 to get #paragraphs
  330. shr BX, 1
  331. shr BX, 1
  332. shr BX, 1
  333. mov AH, Alloc
  334. int 21h
  335. jc      Exit_Alloc_Fat_Sec_Buf
  336. ; Base address of newly allocated
  337. ; block is AX:0000
  338. mov WORD PTR FatSector+2,AX
  339. xor AX,AX
  340. mov WORD PTR FatSector,AX
  341. Exit_Alloc_Fat_Sec_Buf:
  342. ret
  343. Alloc_Fat_Sec_Buf endp
  344. ;===========================================================================
  345. ; Routine name: Alloc_Header_Buf
  346. ;===========================================================================
  347. ;
  348. ; Description: Allocate the work buffers that will be needed by SAFE to
  349. ;        build the restore file.
  350. ;
  351. ; Arguments: None
  352. ; ---------------------------
  353. ; Returns:    Carry set if error
  354. ; ----------------------------------------
  355. ; Registers destroyed: AX BX DX
  356. ; ----------------------------------------
  357. ; Strategy:
  358. ; ---------
  359. ; Allocate Buffer for file header + first root DIR sector
  360. ;===========================================================================
  361. ;Alloc_Header_Buf  proc  near
  362. ;
  363. ; mov BX,deviceParameters.DP_BPB.BPB_BytesPerSector ; Sector size
  364. ; add BX,(HEADER_SIZE + 15) ; Add header size and round
  365. ; ; for para conversion
  366. ;ConvertToParas:
  367. ; shr BX,1 ; Convert to paragrphs by
  368. ; shr BX,1 ; dividing by 16
  369. ; shr BX,1
  370. ; shr BX,1
  371. ;
  372. ; mov AH,48h ; DOS allocate memory function
  373. ; int 21h
  374. ; jc Exit_Alloc_Header_Buf ; Check for error
  375. ;
  376. ;SaveAddresses:
  377. ; mov WORD PTR HeaderBuf[2],AX ; Save header buffer segment
  378. ; mov WORD PTR HeaderBuf,0 ; Set offset to 0
  379. ;
  380. ; add AX,(Header_Size SHR 4) ; Find header buffer segment
  381. ; mov WORD PTR DirBuf[2],AX ; Save DIR buf segment address
  382. ; mov WORD PTR DirBuf,0 ; Set offset to 0
  383. ;
  384. ;Exit_Alloc_Header_Buf:
  385. ; ret
  386. ;
  387. ;Alloc_Header_Buf endp
  388. ;==========================================================================
  389. ;
  390. ;  Alloc_DirBuf2  :  This procedure allocates a memory block for a 1-sector
  391. ;      buffer.  This buffer is used when reading in the boot
  392. ;      sector in Phase1.
  393. ;
  394. ;  Inputs      :  DeviceParameters.DP_BPB.BPB_BytesPerSector
  395. ;  Outputs   :  CY CLEAR - DirBuf pointer to buffer
  396. ;      CY SET   - failure
  397. ;  Modifies   :  AX, BX, DirBuf
  398. ;
  399. ;==========================================================================
  400. Alloc_DirBuf2 proc near
  401. ; DirBuf =
  402.   ; malloc( Bytes Per Sector )
  403. mov BX, DeviceParameters.DP_BPB.BPB_BytesPerSector
  404. add BX, 0fH
  405. shr BX, 1 ; Divide by 16 to get #paragraphs
  406. shr BX, 1
  407. shr BX, 1
  408. shr BX, 1
  409. mov AH, Alloc
  410. int 21h
  411. jc      Exit_Alloc_DirBuf2
  412. ; Base address of newly allocated
  413. ; block is AX:0000
  414. mov WORD PTR DirBuf+2,AX
  415. xor AX,AX
  416. mov WORD PTR DirBuf,AX
  417. Exit_Alloc_DirBuf2:
  418. ret
  419. Alloc_DirBuf2 endp
  420. ;=========================================================================
  421. ; Alloc_Cluster_Buf          : This routine will allocate a buffer
  422. ;    based on a cluster's size.  If enough
  423. ;    space does not exist, a cluster will
  424. ;    be redefined to a smaller size for
  425. ;    purposes of sector retries.
  426. ;    Note: This buffer is used only for bad
  427. ;    tracks on hard disks.
  428. ;
  429. ;  Inputs  : DeviceParameters.DP_BPB.BPB_BytesPerSector
  430. ;    DeviceParameters.DP_BPB.BPB_SectorsPerCluster
  431. ;
  432. ;  Outputs : ClustBound_Flag  - True (space available)
  433. ;    False(not enough space)
  434. ;    ClustBound_Buffer_Seg - Pointer to buffer
  435. ;=========================================================================
  436. Procedure Alloc_Cluster_Buf
  437. push AX ; Save regs
  438. push BX
  439. mov AX,(Alloc shl 8) ; Allocate memory
  440. mov BX,0ffffh ; Get available memory
  441. int 21h
  442. mov AX, DeviceParameters.DP_BPB.BPB_BytesPerSector
  443. add AX, 0fH
  444. shr AX, 1
  445. shr AX, 1
  446. shr AX, 1
  447. shr AX, 1
  448. mul DeviceParameters.DP_BPB.BPB_SectorsPerCluster
  449. cmp BX,AX ; Enough room
  450. jna $$IF137  ; Yes
  451. mov BX,AX ; Allocate needed memory
  452. mov AX,(Alloc shl 8)
  453. int 21h
  454. mov ClustBound_Buffer_Seg,AX ; Save pointer to buffer
  455. mov ClustBound_Flag,True ; Signal space available
  456. jmp SHORT $$EN137 ; Not enough room
  457. $$IF137:
  458. mov ClustBound_Flag,False ; Signal not enough space
  459. $$EN137:
  460. pop BX ; Restore regs
  461. pop AX
  462. ret
  463. Alloc_Cluster_Buf ENDP
  464. ;=========================================================================
  465. ;
  466. ;  DO_SWITCH_S  : This procedure will load the system files into
  467. ; memory (if there's space) if the /s switch is
  468. ; specified.
  469. ;
  470. ;  CALLS  : ReadDos
  471. ; SysPrm
  472. ;  CALLED BY : Global_Init
  473. ;  STRATEGY : The largest block of memory available is first
  474. ; determined.  The program is aborted if this is zero.
  475. ; This block is then allocated, and the system files
  476. ; are read into it.  A prompt for the system disk
  477. ; will be given if the system files are not found.
  478. ;
  479. ;=========================================================================
  480. Do_Switch_S proc near
  481. test SwitchMap,SWITCH_S
  482. jz End_Do_Switch_S ; System files not required
  483. ; allocate memory for system files
  484. mov BX,0ffffh ; This call will actually fail
  485. mov AH,Alloc ; so that BX returns max block avlbl
  486. int 21h
  487. or BX,BX
  488. jz MemErr   ; No memory
  489. mov [mSize],BX ; Now allocate the largest block
  490. mov AH,alloc
  491. int 21h
  492. jnc Mem_OK
  493. MemErr:
  494. mov AX, seg data ; Check for memory allocation error
  495. mov DS, AX
  496. Message msgOutOfMemory ; call PrintString
  497. ; jmp FatalExit
  498. stc  ; Let the jump to FatalExit be made
  499. jmp SHORT End_Do_Switch_S ;  in the main routine, upon returning
  500. Mem_OK:
  501. mov [mStart],AX ; Save the starting paragraph
  502. ; =========================================================================
  503. ; This call to ReadDos may not be able to read in all of the DOS files if
  504. ; there is insufficient memory available. In that case the files will
  505. ; be read in after the disk is formatted. If the Drive being formatted is
  506. ; also the boot Drive this function will read the files from that
  507. ; Drive if there is enough memory. If there is insufficent memory it will
  508. ; force the files to be read from Drive A: if the Drive being formatted
  509. ; is also the boot Drive
  510. ; M011; Wrong: Try Boot, Then Default, Then sysprm (usually "A").
  511. ;       If not enough memory at boot time, we fail.
  512. ; =========================================================================
  513. RdFrst:
  514. ;M011 - begin
  515. mov AH,GET_DEFAULT_Drive ; Find out default Drive
  516. int 21h
  517. push AX ; save default Drive
  518. mov AH,Get_In_Vars ; Find out boot Drive
  519. int 21h
  520. ; get 1 based Drive ID
  521. mov AL,BYTE PTR ES:[BX].SysI_Boot_Drive
  522. add AL,40h ; Make it ASCII
  523. pop BX ; restore default Drive
  524. cmp AL,41h ; Q: Booted from Drive A?
  525. jnz go_get_Bios ;  N: Not a special case
  526. cmp bl,1 ; Q: is B: current Drive
  527. jnz go_get_Bios ;  N: Not a special case
  528. jmp short check_default ; check default Drive
  529. go_get_Bios: ; Here to check booted
  530. call Get_Host_Drive ; Translate to DblSpace host
  531. mov SystemDriveLetter,AL ;   (if necessary)
  532. call ReadDos
  533. jnc CheckAllFilesIn
  534. check_default: ; Here to check default
  535. mov AH,GET_DEFAULT_Drive ; Find out default Drive
  536. int 21h
  537. add AL,41h ; Make it ASCII, 1 based
  538. call Get_Host_Drive ; Translate to DblSpace host
  539. mov SystemDriveLetter,AL
  540. TryThisOne:
  541. call ReadDos ; Read BIOS and DOS
  542. jnc CheckAllFilesIn ; Files read in OK
  543. NeedSys:
  544. call SysPrm ; Prompt for system disk
  545. jmp TryThisOne ; Try again
  546. ;M011 - end
  547. CheckAllFilesIn:
  548. ; abort program here if all system files
  549. ; have not been read into memory, since
  550. ; program fails when trying to read them
  551. ; in after formatting is complete
  552. and FileStat,3fh ; zero out 2 msb
  553. cmp FileStat,2ah ; are all 3 sys files in memory?
  554. jne MemErr ; no - abort program
  555. clc ; yes
  556. End_Do_Switch_S:
  557. ret
  558. Do_Switch_S ENDP
  559. ;******************* START OF SPECIFICATIONS ***********************************
  560. ;Routine name: Get_Host_Drive
  561. ;*******************************************************************************
  562. ;
  563. ;Description: Given a drive letter in AL, check to see if it is a dblspace
  564. ;       drive, and if so, translate the drive letter to the host
  565. ;       drive letter.
  566. ;
  567. ;Called Procedures: None
  568. ;
  569. ;Input: ASCII drive letter in AL
  570. ;
  571. ;Output: drive letter in AL
  572. ;
  573. ;Change History: Created 11/21/92  MD
  574. ;  Cut and paste from SYS command 12/07/92  JEM
  575. ;
  576. ;******************* END OF SPECIFICATIONS *************************************
  577. public Get_Host_Drive
  578. Get_Host_Drive PROC NEAR
  579.         push    ax
  580.     mov ax,4a11h ; DBLSPACE multiplex number
  581. xor bx,bx ; inquire version number
  582. int 2fh
  583. or ax,ax ; error?
  584. jnz not_dblspace
  585. cmp bx,'DM' ; stamp returned correctly?
  586. jnz not_dblspace
  587. ; DBLSPACE.BIN is loaded.  At this time:
  588. ;
  589. ; (dx & 0x7fff) == driver internal version number
  590. ; high bit of DH set of driver has not yet been permanently placed
  591. ; cl == first disk letter reserved for DBLSPACE
  592. ; ch == number of disk letters reserved for DBLSPACE
  593. mov ax,4a11h ; DBLSPACE multiplex number
  594. mov bx,1 ; inquire drive map
  595.         pop     dx
  596. push dx
  597. sub dl, 'A'  ; convert drv letter to 0 based drv number
  598. int 2fh
  599. test bl,80h ; COMPRESSED bit true?
  600. jz not_dblspace
  601. ; Drive is compressed.  At this time:
  602. ;
  603. ; (bl & 0x7f) == host drive's CURRENT drive number
  604. ; bh          == CVF extension number
  605. ;
  606.         mov     al,bl
  607. and al,7Fh
  608. add al, 'A'  ; convert drv number to drv letter
  609.         cbw
  610.         pop     dx
  611.         push    ax
  612. not_dblspace:
  613.         pop     ax
  614.         ret
  615. Get_Host_Drive ENDP
  616. CODE ENDS
  617. END