summaryrefslogtreecommitdiff
path: root/v4.0/src/MAPPER/QCURDSK.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/MAPPER/QCURDSK.ASM')
-rw-r--r--v4.0/src/MAPPER/QCURDSK.ASM148
1 files changed, 148 insertions, 0 deletions
diff --git a/v4.0/src/MAPPER/QCURDSK.ASM b/v4.0/src/MAPPER/QCURDSK.ASM
new file mode 100644
index 0000000..7abf22e
--- /dev/null
+++ b/v4.0/src/MAPPER/QCURDSK.ASM
@@ -0,0 +1,148 @@
1;0
2page 80,132
3;
4title CP/DOS DosQCurDisk mapper
5
6 extrn dosqcurdir:far
7 extrn dosdevconfig:far
8
9buffer segment word public 'buffer'
10drive dw ? ; driver number
11buffr db 20 dup(?) ; buffer
12bufflng dw 20 ; buffer length
13map dw 2 dup(?) ; map area
14dsket db ? ;
15buffer ends
16
17
18
19dosxxx 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
46str struc
47old_bp dw ?
48return dd ?
49Drvmap dd ? ; drive map pointer
50Drvnbr dd ? ; drive number
51str ends
52
53
54defdrive db ? ; Save area for default drive -->RW
55
56
57
58dosqcurdisk 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
91nodisk: clc ; clear flag
92
93dskbits: 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
102loopx:
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
116driveok: stc
117
118rotate: 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
141exit: mexit ; pop registers
142 ret size str - 6 ; return
143
144dosqcurdisk endp
145
146dosxxx ends
147
148 end