summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/COMMAND/COPYPR1.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/COMMAND/COPYPR1.ASM')
-rw-r--r--v4.0/src/CMD/COMMAND/COPYPR1.ASM276
1 files changed, 276 insertions, 0 deletions
diff --git a/v4.0/src/CMD/COMMAND/COPYPR1.ASM b/v4.0/src/CMD/COMMAND/COPYPR1.ASM
new file mode 100644
index 0000000..e727910
--- /dev/null
+++ b/v4.0/src/CMD/COMMAND/COPYPR1.ASM
@@ -0,0 +1,276 @@
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
16TRANDATA 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
25TRANDATA ENDS
26
27TRANSPACE 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
49TRANSPACE ENDS
50
51TRANCODE SEGMENT PUBLIC BYTE
52
53 EXTRN ENDCOPY:NEAR
54
55 PUBLIC FLSHFIL
56 PUBLIC TRYFLUSH
57
58ASSUME CS:TRANGROUP,DS:TRANGROUP,ES:TRANGROUP,SS:NOTHING
59
60TRYFLUSH:
61 mov al,[CONCAT]
62 push ax
63 call FLSHFIL
64 pop ax
65 cmp al,[CONCAT]
66 return
67
68FLSHFIL:
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
82NOTEXISTS:
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
93NO_CONCAT_ERR: ;AC000;
94 MOV [NOWRITE],1 ; Flag not writting (just seeking)
95
96PROCDEST:
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
107cont_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
116DODESTOPEN:
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
124xa_set_error: ;AN030; error occurred on XA
125 invoke set_ext_error_msg ;AN030; get extended error
126
127ext_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
131COPERRJ2: ;AN030;
132 jmp COPERR ;AN030; go issue message
133
134dest_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
156TESTBOTH:
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
167COPERRJ:
168 jmp SHORT COPERR
169
170EXSETA:
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
177EXISTS:
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
197RET60:
198 return
199
200NOCHECKING:
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]
211ASSUME DS:NOTHING
212 MOV AH,WRITE
213 INT int_command
214 POP DS
215ASSUME 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
229DEVWRTERR:
230 MOV DX,OFFSET TRANGROUP:DEVWMES_ptr
231
232PUBLIC COPERR
233COPERR:
234 INVOKE std_Eprintf ;AC022;
235
236COPERRP:
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
246NoClose:
247 MOV DX,OFFSET TRANGROUP:DESTBUF
248 MOV AH,UNLINK
249 INT int_command ; And delete it
250 MOV [CFLAG],0
251
252ENDCOPYJ:
253 JMP ENDCOPY
254
255XA_SET_ERROR_JMP: ;AN022; Go set up error message
256 jmp xa_set_error ;AN022;
257
258SEEKEND:
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
274TRANCODE ENDS
275 END
276 \ No newline at end of file