]> wirehaze git hosting - MS-DOS.git/blob - v2.0/source/DISKCOPY.ASM

wirehaze git hosting

Merge pull request #91 from abnerescocio/patch-2
[MS-DOS.git] / v2.0 / source / DISKCOPY.ASM
1 TITLE DISKCOPY MSDOS Disk Copier
2 ;----------------------------------------------------------
3 ;
4 ; Diskcopy - Program to copy entire diskettes
5 ;
6 ; Copyright 1982 by Microsoft Corporation
7 ; Written by Chris Peters, August 1982
8 ;
9 ;-----------------------------------------------------------
10 ;
11 ; Rev 1.00 Initial instance
12 ; Rev 1.20
13 ; Read in > 64K hunks
14
15 FALSE EQU 0
16 TRUE EQU NOT FALSE
17
18
19 bdos equ 21h
20 boot equ 20h
21 aread equ 25h
22 awrite equ 26h
23
24 INCLUDE DOSSYM.ASM
25
26 fcb equ 5ch
27
28 CODE SEGMENT PUBLIC
29 CODE ENDS
30
31 CONST SEGMENT PUBLIC BYTE
32 CONST ENDS
33
34 DATA SEGMENT PUBLIC BYTE
35 DATA ENDS
36
37 DG GROUP CODE,CONST,DATA
38
39 CODE segment PUBLIC
40 assume cs:DG,ds:DG,es:DG,ss:DG
41
42 EXTRN dskrd:NEAR,dskwrt:NEAR,promptyn:NEAR
43 PUBLIC PRINT,PCRLF,ASKANOTHER,sec64k,secsiz
44
45 org 100h
46
47 diskcopy:
48 jmp disk_entry
49
50 HEADER DB "Vers 1.20"
51
52 source db 0
53 dest db 0
54 count dw 0
55 start dw 0
56 secsiz dw 0
57 passcnt dw 0
58 sec64k dw 0
59 media db 0
60 buffer dw 0
61 bufsiz dw 0
62
63 pcrlf: mov dx,OFFSET DG: crlf
64 print: mov ah,STD_CON_STRING_OUTPUT
65 int bdos
66 pret: ret
67
68 getkey: mov dx,OFFSET DG: keymsg
69 call print
70 mov ah,12 ;wait for key press
71 mov al,1
72 int 21h
73 ret
74 ;
75 ; returns number of sectors on the disk in cx, sector size in ax
76 ;
77 getdpb: push ds
78 inc dl
79 mov ah,GET_DPB
80 int bdos
81 mov al,[bx+dpb_cluster_mask]
82 cbw
83 inc ax
84 mov cx,[bx+dpb_max_cluster]
85 dec cx
86 mul cx
87 add ax,[bx+dpb_first_sector]
88 mov cx,[bx+dpb_sector_size]
89 mov bl,[bx+dpb_media]
90 pop ds
91 ret
92
93 getdrv: mov al,[bx]
94 dec al
95 cmp al,-1
96 jnz get1
97 mov ah,19h
98 int 21h
99 get1: ret
100 ;
101 ; set zero flag if drives the same
102 ;
103 compare:push ax
104 mov al,[dest]
105 cmp al,[source]
106 pop ax
107 ret
108
109 printerr:
110 call print
111 int boot
112
113 disk_entry:
114 cli ;set up local stack
115 mov sp,100h
116 sti
117
118
119 ;Code to print header
120 ; PUSH AX
121 ; MOV DX,OFFSET DG: HEADER
122 ; CALL print
123 ; POP AX
124
125 mov dx,OFFSET DG: drverr1
126 inc al
127 jz printerr
128 inc ah
129 jz printerr
130
131 mov bx,fcb
132 call getdrv
133 mov [source],al
134 add [srclet],al
135 mov bx,fcb+16
136 call getdrv
137 mov [dest],al
138 add [dstlet],al
139 add [fdstlet],al
140 mov ah,DISK_RESET
141 int bdos ;empty buffer queue
142
143 mov bx,OFFSET DG:progsiz + 15
144 shr bx,1
145 shr bx,1
146 shr bx,1
147 shr bx,1
148 mov ah,setblock
149 int 21h ;give back extra memory
150
151 mov bx,0FFFFh ;ask for Biggest hunk
152 mov ah,alloc
153 int 21h
154 jnc gotmem
155 mov ah,alloc
156 int 21h
157 gotmem:
158 mov [buffer],ax
159 mov [bufsiz],bx
160
161 copyagn:
162 mov [start],0 ;Initialize start sector
163 call compare
164 jz onedrv1
165 mov dx,OFFSET DG: srcmsg
166 call print
167 onedrv1:mov dx,OFFSET DG: fdstmsg
168 call print
169 call getkey
170
171 mov dl,[dest]
172 call getdpb
173 mov [count],ax
174 mov [secsiz],cx
175 mov [media],bl
176
177 call compare
178 jnz twodrv1
179 mov dx,OFFSET DG: srcmsg
180 call print
181 call getkey
182
183 twodrv1:mov dl,[source]
184 call getdpb
185 mov dx,OFFSET DG: drverr3
186 cmp [media],bl ;make sure media and sizes match
187 jnz errv
188 cmp [count],ax
189 jz sizeok
190 errv: jmp printerr
191
192 sizeok:
193 mov bx,[secsiz]
194 add bx,15
195 mov cl,4
196 shr bx,cl
197 xor dx,dx
198 mov ax,1000H
199 div bx
200 mov [sec64k],ax ;set number of sectors in 64K bytes
201 xor dx,dx
202 mov ax,[bufsiz]
203 div bx
204 mov [passcnt],ax ;set number of sectors per pass
205
206 call compare ;print copying....
207 jz loop
208 mov dx,OFFSET DG: cpymsg
209 call print
210
211 loop: push ds
212
213 mov al,[source]
214 xor bx,bx
215 mov cx,[passcnt]
216 cmp cx,[count]
217 jbe countok
218 mov cx,[count]
219 countok:mov dx,[start]
220 mov ds,[buffer]
221 call dskrd
222 pop ds
223
224 push ds
225 push cx
226
227 call compare
228 jnz twodrv2
229 mov dx,OFFSET DG: dstmsg
230 call print
231 call getkey
232
233 twodrv2:mov al,[dest]
234 xor bx,bx
235 mov dx,[start]
236 mov ds,[buffer]
237 call dskwrt
238 pop cx
239 pop ds
240
241 add [start],cx
242 sub [count],cx
243 jbe quitcopy
244
245 call compare
246 jnz loop
247 mov dx,OFFSET DG: srcmsg
248 call print
249 call getkey
250 jmp loop
251
252 quitcopy:
253 mov ah,DISK_RESET
254 int bdos ;empty buffer queue
255 mov dx,OFFSET DG: goodmsg
256 call compare
257 jnz twodrv3
258 mov dx,OFFSET DG: good1
259
260 ASKANOTHER:
261 twodrv3:call print
262 mov dx,OFFSET DG:anoprompt
263 call promptyn
264 jnz alldone
265 jmp copyagn
266 alldone:
267 int boot ;home, james...
268
269 CODE ENDS
270
271 CONST SEGMENT PUBLIC BYTE
272
273 EXTRN fdstmsg:BYTE,dstmsg:BYTE,fdstlet:BYTE,dstlet:BYTE
274 EXTRN cpymsg:BYTE,good1:BYTE,goodmsg:BYTE,srcmsg:BYTE,srclet:BYTE
275 EXTRN keymsg:BYTE,drverr1:BYTE,drverr3:BYTE,crlf:BYTE
276 EXTRN anoprompt:BYTE
277
278 db ' MICROSOFT - PETERS '
279 CONST ENDS
280
281 DATA SEGMENT BYTE
282
283 progsiz LABEL BYTE
284
285 DATA ends
286 end diskcopy
287