]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/MAPPER/QCURDSK.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / MAPPER / QCURDSK.ASM
1 ;\ f\e0
2 page 80,132
3 ;
4 title CP/DOS DosQCurDisk mapper
5
6 extrn dosqcurdir:far
7 extrn dosdevconfig:far
8
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
14 dsket db ? ;
15 buffer ends
16
17
18
19 dosxxx segment byte public 'dos'
20 assume cs:dosxxx,ds:nothing,es:nothing,ss:nothing
21
22 ;
23 ;**********************************************************************
24 ;*
25 ;* MODULE: dosqcurdisk
26 ;*
27 ;* FILE NAME: dos037.asm
28 ;*
29 ;* CALLING SEQUENCE:
30 ;*
31 ;* push@ dword drive number return location pointer
32 ;* push@ dword drive map area pointer
33 ;* call dosqcurdisk
34 ;*
35 ;* MODULES CALLED: PC-DOS Int 21h, AH=19h, get current disk
36 ;* Rom Bios Int 11 (called by DosDevConfig)
37 ;*
38 ;*********************************************************************
39 ;
40 public dosqcurdisk
41 .sall
42 .xlist
43 include macros.inc
44 .list
45
46 str struc
47 old_bp dw ?
48 return dd ?
49 Drvmap dd ? ; drive map pointer
50 Drvnbr dd ? ; drive number
51 str ends
52
53
54 defdrive db ? ; Save area for default drive -->RW
55
56
57
58 dosqcurdisk proc far
59
60 Enter Dosqcurdisk ; push registers
61
62 mov ah,19h ; get current default drive
63 int 21h
64 mov defdrive,al ; Save default drive
65
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
70
71 mov ax,buffer ; prepare data segment
72 mov ds,ax ; register for calls
73
74 assume ds:buffer
75
76 lea di,dsket ; diskette address
77 push ds
78 push di
79 mov ax,2 ; request diskette count
80 push ax
81 sub ax,ax ; reserved parm
82 push ax
83
84 call dosdevconfig ; get number of drives
85
86 cmp dsket,0 ; if none, jump
87 je nodisk
88 stc ; else set flag
89 jmp short dskbits
90
91 nodisk: clc ; clear flag
92
93 dskbits: mov map+2,0 ; clear output areas
94 mov map,0
95 pushf ; save carry status, then
96 rcr map+2,1 ; set flags for devices
97 popf ; A and B
98 rcr map+2,1
99
100 mov drive,2 ; start at C -->RW --> Changed 3 to 2
101 mov di,2 ; start with low-order
102 loopx:
103 mov ah,0eh ; DOS Select Disk -->RW
104 mov dx,drive ; Drive number in DL -->RW
105 int 021h ; -->RW
106
107 mov ah,019h ; DOS Get Current Disk -->RW
108 int 021h ; -->RW
109 xor ah,ah ; Clear AH -->RW
110 cmp ax,drive ; Drive now in AX -->RW
111
112 je driveok ; drive at this number
113 clc ; else drive no good
114 jmp short rotate
115
116 driveok: stc
117
118 rotate: rcr map[di],1 ; shift bit in
119 inc drive
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
128 int 021h ; -->RW
129
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
134 push cs ; area.
135 pop ds
136 lds si,[bp].drvmap ;
137 mov [si],ax
138 mov [si]+2,bx ;
139 ; Set good return code -->RW
140 xor ax,ax
141 exit: mexit ; pop registers
142 ret size str - 6 ; return
143
144 dosqcurdisk endp
145
146 dosxxx ends
147
148 end