diff options
Diffstat (limited to 'v4.0/src/CMD/COMMAND/COPYPR1.ASM')
| -rw-r--r-- | v4.0/src/CMD/COMMAND/COPYPR1.ASM | 276 |
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 | |||
| 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 | \ No newline at end of file | ||