]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/COMMAND/COPYPR1.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / COMMAND / COPYPR1.ASM
1 page 80,132
2 ; SCCSID = @(#)copypr1.asm 1.1 85/05/14
3 ; SCCSID = @(#)copypr1.asm 1.1 85/05/14
4 INCLUDE comsw.asm
5
6 .xlist
7 .xcref
8 INCLUDE DOSSYM.INC
9 ; INCLUDE DEVSYM.INC
10 INCLUDE comseg.asm
11 INCLUDE comequ.asm
12 .list
13 .cref
14
15
16 TRANDATA SEGMENT PUBLIC BYTE ;AC000;
17 EXTRN DEVWMES_ptr:word
18 EXTRN ext_open_parms:byte ;AN000;
19 EXTRN ext_open_seg:word ;AN000;
20 EXTRN ext_open_off:word ;AN000;
21 EXTRN Extend_buf_sub:byte ;AN000;
22 EXTRN LOSTERR_ptr:word
23 EXTRN NOSPACE_ptr:word
24 EXTRN OVERWR_ptr:word
25 TRANDATA ENDS
26
27 TRANSPACE SEGMENT PUBLIC BYTE ;AC000;
28 EXTRN ASCII:BYTE
29 EXTRN BINARY:BYTE
30 EXTRN CFLAG:BYTE
31 EXTRN CONCAT:BYTE
32 EXTRN concat_xa:byte ;AC000;
33 EXTRN DESTBUF:BYTE
34 EXTRN DESTCLOSED:BYTE
35 EXTRN DESTHAND:WORD
36 EXTRN DESTISDEV:BYTE
37 EXTRN DESTSWITCH:WORD
38 EXTRN INEXACT:BYTE
39 EXTRN NOWRITE:BYTE
40 EXTRN NXTADD:WORD
41 EXTRN plus_comma:byte ;AN000;
42 EXTRN RDEOF:BYTE
43 EXTRN src_xa_seg:word ;AN000;
44 EXTRN SRCISDEV:BYTE
45 EXTRN string_ptr_2:word ;AN000;
46 EXTRN TERMREAD:BYTE
47 EXTRN TPA:WORD
48 EXTRN WRITTEN:WORD
49 TRANSPACE ENDS
50
51 TRANCODE SEGMENT PUBLIC BYTE
52
53 EXTRN ENDCOPY:NEAR
54
55 PUBLIC FLSHFIL
56 PUBLIC TRYFLUSH
57
58 ASSUME CS:TRANGROUP,DS:TRANGROUP,ES:TRANGROUP,SS:NOTHING
59
60 TRYFLUSH:
61 mov al,[CONCAT]
62 push ax
63 call FLSHFIL
64 pop ax
65 cmp al,[CONCAT]
66 return
67
68 FLSHFIL:
69 ;
70 ; Write out any data remaining in memory.
71 ; Inputs:
72 ; [NXTADD] = No. of bytes to write
73 ; [CFLAG] <> 0 if file has been created
74 ; Outputs:
75 ; [NXTADD] = 0
76 ;
77 MOV [TERMREAD],0
78 cmp [CFLAG],0
79 JZ NOTEXISTS
80 JMP EXISTS
81
82 NOTEXISTS:
83 invoke BUILDDEST ; Find out all about the destination
84 invoke COMPNAME ; Source and dest. the same?
85 JNZ PROCDEST ; If not, go ahead
86 CMP [SRCISDEV],0
87 JNZ PROCDEST ; Same name on device OK
88 CMP [CONCAT],0 ; Concatenation?
89 MOV DX,OFFSET TRANGROUP:OVERWR_ptr
90 JNZ NO_CONCAT_ERR ;AC000; If not, overwrite error
91 JMP COPERR ;AC000;
92
93 NO_CONCAT_ERR: ;AC000;
94 MOV [NOWRITE],1 ; Flag not writting (just seeking)
95
96 PROCDEST:
97 MOV AX,EXTOPEN SHL 8 ;AC000; open the file
98 mov si,offset trangroup:destbuf ;AN030; get file name
99 mov di,-1 ;AN030; indicate no parameters
100 cmp src_xa_seg,no_xa_seg ;AN030; is there an XA segment?
101 jz cont_no_xa ;AN030; no - no parameters
102 mov di,offset trangroup:Ext_open_parms ;AN030; get parameters
103 mov bx,src_xa_seg ;AN030; get extended attribute segment
104 mov ext_open_seg,bx ;AN030; put it in parameter list
105 mov ext_open_off,0 ;AN030; offset is 0
106
107 cont_no_xa: ;AN030;
108 mov bx,write_open_mode ;AN000; get open mode for COPY
109 xor cx,cx ;AN000; no special files
110 mov dx,write_open_flag ;AN000; set up open flags
111
112 CMP [NOWRITE],0
113 JNZ DODESTOPEN ; Don't actually create if NOWRITE set
114 mov dx,creat_open_flag ;AC000; set up create flags
115
116 DODESTOPEN:
117 INT int_command
118 ;
119 ; We assume that the error is normal. TriageError will correct the DX value
120 ; appropriately.
121 ;
122 JNC dest_open_okay ;AC030;
123
124 xa_set_error: ;AN030; error occurred on XA
125 invoke set_ext_error_msg ;AN030; get extended error
126
127 ext_err_set: ;AN030;
128 mov string_ptr_2,offset trangroup:destbuf ;AN000; get address of failed string
129 mov Extend_buf_sub,one_subst ;AN030; put number of subst in control block
130
131 COPERRJ2: ;AN030;
132 jmp COPERR ;AN030; go issue message
133
134 dest_open_okay: ;AC030
135 mov [DESTHAND],ax ; Save handle
136 mov [CFLAG],1 ; Destination now exists
137 mov bx,ax
138 mov cx,bx ;AN030; get handle into CX
139 invoke set_file_code_page ;AN030; set the code page for the target
140 jc ext_err_set ;AN030; if no error, continue
141
142 mov [concat_xa],0 ;AN000; set first file flag off
143 mov ax,(IOCTL SHL 8)
144 INT int_command ; Get device stuff
145 mov [DESTISDEV],dl ; Set dest info
146 test dl,devid_ISDEV
147 jz exists ;AC030; Dest a device
148
149 mov al,BYTE PTR [DESTSWITCH]
150 AND AL,SwitchA+SwitchB
151 JNZ TESTBOTH
152 MOV AL,[ASCII] ; Neither set, use current setting
153 OR AL,[BINARY]
154 JZ EXSETA ; Neither set, default to ASCII
155
156 TESTBOTH:
157 JPE EXISTS ; Both are set, ignore
158 test AL,SwitchB
159 jz EXISTS ; Leave in cooked mode
160 mov ax,(IOCTL SHL 8) OR 1
161 xor dh,dh
162 or dl,devid_RAW
163 mov [DESTISDEV],dl ; New value
164 INT int_command ; Set device to RAW mode
165 jmp short EXISTS
166
167 COPERRJ:
168 jmp SHORT COPERR
169
170 EXSETA:
171 ;
172 ; What we read in may have been in binary mode, flag zapped write OK
173 ;
174 mov [ASCII],SwitchA ; Set ASCII mode
175 or [INEXACT],SwitchA ; ASCII -> INEXACT
176
177 EXISTS:
178 cmp [NOWRITE],0
179 jnz NOCHECKING ; If nowrite don't bother with name check
180 cmp plus_comma,1 ;g don't check if just doing +,,
181 jz NOCHECKING ;g
182 invoke COMPNAME ; Source and dest. the same?
183 JNZ NOCHECKING ; If not, go ahead
184 CMP [SRCISDEV],0
185 JNZ NOCHECKING ; Same name on device OK
186 ;
187 ; At this point we know in append (would have gotten overwrite error on first
188 ; destination create otherwise), and user trying to specify destination which
189 ; has been scribbled already (if dest had been named first, NOWRITE would
190 ; be set).
191 ;
192 MOV DX,OFFSET TRANGROUP:LOSTERR_ptr ; Tell him he's not going to get it
193 invoke std_Eprintf ;AC022;
194 MOV [NXTADD],0 ; Set return
195 INC [TERMREAD] ; Tell Read to give up
196
197 RET60:
198 return
199
200 NOCHECKING:
201 mov bx,[DESTHAND] ; Get handle
202 XOR CX,CX
203 XCHG CX,[NXTADD]
204 JCXZ RET60 ; If Nothing to write, forget it
205 INC [WRITTEN] ; Flag that we wrote something
206 CMP [NOWRITE],0 ; If NOWRITE set, just seek CX bytes
207 JNZ SEEKEND
208 XOR DX,DX
209 PUSH DS
210 MOV DS,[TPA]
211 ASSUME DS:NOTHING
212 MOV AH,WRITE
213 INT int_command
214 POP DS
215 ASSUME DS:TRANGROUP
216 MOV DX,OFFSET TRANGROUP:NOSPACE_ptr
217 JC xa_set_error_Jmp ;AC022; Failure
218 sub cx,ax
219 retz ; Wrote all supposed to
220 test [DESTISDEV],devid_ISDEV
221 jz COPERR ; Is a file, error
222 test [DESTISDEV],devid_RAW
223 jnz DEVWRTERR ; Is a raw device, error
224 cmp [INEXACT],0
225 retnz ; INEXACT so OK
226 dec cx
227 retz ; Wrote one byte less (the ^Z)
228
229 DEVWRTERR:
230 MOV DX,OFFSET TRANGROUP:DEVWMES_ptr
231
232 PUBLIC COPERR
233 COPERR:
234 INVOKE std_Eprintf ;AC022;
235
236 COPERRP:
237 inc [DESTCLOSED]
238 cmp [CFLAG],0
239 jz ENDCOPYJ ; Never actually got it open
240 MOV bx,[DESTHAND]
241 CMP BX,0
242 JLE NoClose
243 MOV AH,CLOSE ; Close the file
244 INT int_command
245
246 NoClose:
247 MOV DX,OFFSET TRANGROUP:DESTBUF
248 MOV AH,UNLINK
249 INT int_command ; And delete it
250 MOV [CFLAG],0
251
252 ENDCOPYJ:
253 JMP ENDCOPY
254
255 XA_SET_ERROR_JMP: ;AN022; Go set up error message
256 jmp xa_set_error ;AN022;
257
258 SEEKEND:
259 xor dx,dx ; Zero high half of offset
260 xchg dx,cx ; cx:dx is seek location
261 mov ax,(LSEEK SHL 8) OR 1
262 INT int_command ; Seek ahead in the file
263 cmp [RDEOF],0
264 retz
265 ;
266 ; If a ^Z has been read we must set the file size to the current
267 ; file pointer location
268 ;
269 MOV AH,WRITE
270 INT int_command ; CX is zero, truncates file
271 jc xa_set_error_Jmp ;AC022; Failure
272 return
273
274 TRANCODE ENDS
275 END
276 \1a