]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/MAPPER/QCURDSK.ASM
4 title CP
/DOS DosQCurDisk mapper
9 buffer
segment word public 'buffer'
10 drive dw ?
; driver number
11 buffr db 20 dup(?
) ; buffer
12 bufflng dw 20 ; buffer length
13 map dw 2 dup(?
) ; map area
19 dosxxx
segment byte public 'dos'
20 assume
cs:dosxxx
,ds:nothing
,es:nothing
,ss:nothing
23 ;**********************************************************************
25 ;* MODULE: dosqcurdisk
27 ;* FILE NAME: dos037.asm
31 ;* push@ dword drive number return location pointer
32 ;* push@ dword drive map area pointer
35 ;* MODULES CALLED: PC-DOS Int 21h, AH=19h, get current disk
36 ;* Rom Bios Int 11 (called by DosDevConfig)
38 ;*********************************************************************
49 Drvmap dd ?
; drive map pointer
50 Drvnbr dd ?
; drive number
54 defdrive db ?
; Save area for default drive -->RW
60 Enter Dosqcurdisk
; push registers
62 mov ah,19h
; get current default drive
64 mov defdrive
,al ; Save default drive
66 cbw ; fill ax with drive #
67 lds si,[bp].drvnbr
; output address
68 inc ax ; set drive A = 1
69 mov word ptr [si],ax ; drive number
71 mov ax,buffer
; prepare data segment
72 mov ds,ax ; register for calls
76 lea di,dsket
; diskette address
79 mov ax,2 ; request diskette count
81 sub ax,ax ; reserved parm
84 call dosdevconfig
; get number of drives
86 cmp dsket
,0 ; if none, jump
91 nodisk: clc ; clear flag
93 dskbits: mov map
+2,0 ; clear output areas
95 pushf ; save carry status, then
96 rcr map
+2,1 ; set flags for devices
100 mov drive
,2 ; start at C -->RW --> Changed 3 to 2
101 mov di,2 ; start with low-order
103 mov ah,0eh ; DOS Select Disk -->RW
104 mov dx,drive
; Drive number in DL -->RW
107 mov ah,019h ; DOS Get Current Disk -->RW
109 xor ah,ah ; Clear AH -->RW
110 cmp ax,drive
; Drive now in AX -->RW
112 je driveok
; drive at this number
113 clc ; else drive no good
118 rotate: rcr map
[di],1 ; shift bit in
120 cmp drive
,17 ; finished first word?
121 jl loopx
; if no, jump
122 mov di,0 ; if so, switch to high
123 cmp drive
,26 ; order word, and check
124 jle loopx
; for last drive.
125 ;restore current drive
126 mov ah,0eh ; DOS Select Disk -->RW
127 mov dl,defdrive
; Drive number in DL -->RW
130 mov cl,6 ; only ten bits used
131 shr map
,cl ; in high-order word.
132 mov ax,map
; Now put in registers
133 mov bx,map
+2 ; for shift into output
139 ; Set good return code -->RW
141 exit: mexit
; pop registers
142 ret size
str - 6 ; return