From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/COMMAND/COPYPR1.ASM | 276 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 v4.0/src/CMD/COMMAND/COPYPR1.ASM (limited to 'v4.0/src/CMD/COMMAND/COPYPR1.ASM') 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 @@ + page 80,132 +; SCCSID = @(#)copypr1.asm 1.1 85/05/14 +; SCCSID = @(#)copypr1.asm 1.1 85/05/14 + INCLUDE comsw.asm + +.xlist +.xcref + INCLUDE DOSSYM.INC +; INCLUDE DEVSYM.INC + INCLUDE comseg.asm + INCLUDE comequ.asm +.list +.cref + + +TRANDATA SEGMENT PUBLIC BYTE ;AC000; + EXTRN DEVWMES_ptr:word + EXTRN ext_open_parms:byte ;AN000; + EXTRN ext_open_seg:word ;AN000; + EXTRN ext_open_off:word ;AN000; + EXTRN Extend_buf_sub:byte ;AN000; + EXTRN LOSTERR_ptr:word + EXTRN NOSPACE_ptr:word + EXTRN OVERWR_ptr:word +TRANDATA ENDS + +TRANSPACE SEGMENT PUBLIC BYTE ;AC000; + EXTRN ASCII:BYTE + EXTRN BINARY:BYTE + EXTRN CFLAG:BYTE + EXTRN CONCAT:BYTE + EXTRN concat_xa:byte ;AC000; + EXTRN DESTBUF:BYTE + EXTRN DESTCLOSED:BYTE + EXTRN DESTHAND:WORD + EXTRN DESTISDEV:BYTE + EXTRN DESTSWITCH:WORD + EXTRN INEXACT:BYTE + EXTRN NOWRITE:BYTE + EXTRN NXTADD:WORD + EXTRN plus_comma:byte ;AN000; + EXTRN RDEOF:BYTE + EXTRN src_xa_seg:word ;AN000; + EXTRN SRCISDEV:BYTE + EXTRN string_ptr_2:word ;AN000; + EXTRN TERMREAD:BYTE + EXTRN TPA:WORD + EXTRN WRITTEN:WORD +TRANSPACE ENDS + +TRANCODE SEGMENT PUBLIC BYTE + + EXTRN ENDCOPY:NEAR + + PUBLIC FLSHFIL + PUBLIC TRYFLUSH + +ASSUME CS:TRANGROUP,DS:TRANGROUP,ES:TRANGROUP,SS:NOTHING + +TRYFLUSH: + mov al,[CONCAT] + push ax + call FLSHFIL + pop ax + cmp al,[CONCAT] + return + +FLSHFIL: +; +; Write out any data remaining in memory. +; Inputs: +; [NXTADD] = No. of bytes to write +; [CFLAG] <> 0 if file has been created +; Outputs: +; [NXTADD] = 0 +; + MOV [TERMREAD],0 + cmp [CFLAG],0 + JZ NOTEXISTS + JMP EXISTS + +NOTEXISTS: + invoke BUILDDEST ; Find out all about the destination + invoke COMPNAME ; Source and dest. the same? + JNZ PROCDEST ; If not, go ahead + CMP [SRCISDEV],0 + JNZ PROCDEST ; Same name on device OK + CMP [CONCAT],0 ; Concatenation? + MOV DX,OFFSET TRANGROUP:OVERWR_ptr + JNZ NO_CONCAT_ERR ;AC000; If not, overwrite error + JMP COPERR ;AC000; + +NO_CONCAT_ERR: ;AC000; + MOV [NOWRITE],1 ; Flag not writting (just seeking) + +PROCDEST: + MOV AX,EXTOPEN SHL 8 ;AC000; open the file + mov si,offset trangroup:destbuf ;AN030; get file name + mov di,-1 ;AN030; indicate no parameters + cmp src_xa_seg,no_xa_seg ;AN030; is there an XA segment? + jz cont_no_xa ;AN030; no - no parameters + mov di,offset trangroup:Ext_open_parms ;AN030; get parameters + mov bx,src_xa_seg ;AN030; get extended attribute segment + mov ext_open_seg,bx ;AN030; put it in parameter list + mov ext_open_off,0 ;AN030; offset is 0 + +cont_no_xa: ;AN030; + mov bx,write_open_mode ;AN000; get open mode for COPY + xor cx,cx ;AN000; no special files + mov dx,write_open_flag ;AN000; set up open flags + + CMP [NOWRITE],0 + JNZ DODESTOPEN ; Don't actually create if NOWRITE set + mov dx,creat_open_flag ;AC000; set up create flags + +DODESTOPEN: + INT int_command +; +; We assume that the error is normal. TriageError will correct the DX value +; appropriately. +; + JNC dest_open_okay ;AC030; + +xa_set_error: ;AN030; error occurred on XA + invoke set_ext_error_msg ;AN030; get extended error + +ext_err_set: ;AN030; + mov string_ptr_2,offset trangroup:destbuf ;AN000; get address of failed string + mov Extend_buf_sub,one_subst ;AN030; put number of subst in control block + +COPERRJ2: ;AN030; + jmp COPERR ;AN030; go issue message + +dest_open_okay: ;AC030 + mov [DESTHAND],ax ; Save handle + mov [CFLAG],1 ; Destination now exists + mov bx,ax + mov cx,bx ;AN030; get handle into CX + invoke set_file_code_page ;AN030; set the code page for the target + jc ext_err_set ;AN030; if no error, continue + + mov [concat_xa],0 ;AN000; set first file flag off + mov ax,(IOCTL SHL 8) + INT int_command ; Get device stuff + mov [DESTISDEV],dl ; Set dest info + test dl,devid_ISDEV + jz exists ;AC030; Dest a device + + mov al,BYTE PTR [DESTSWITCH] + AND AL,SwitchA+SwitchB + JNZ TESTBOTH + MOV AL,[ASCII] ; Neither set, use current setting + OR AL,[BINARY] + JZ EXSETA ; Neither set, default to ASCII + +TESTBOTH: + JPE EXISTS ; Both are set, ignore + test AL,SwitchB + jz EXISTS ; Leave in cooked mode + mov ax,(IOCTL SHL 8) OR 1 + xor dh,dh + or dl,devid_RAW + mov [DESTISDEV],dl ; New value + INT int_command ; Set device to RAW mode + jmp short EXISTS + +COPERRJ: + jmp SHORT COPERR + +EXSETA: +; +; What we read in may have been in binary mode, flag zapped write OK +; + mov [ASCII],SwitchA ; Set ASCII mode + or [INEXACT],SwitchA ; ASCII -> INEXACT + +EXISTS: + cmp [NOWRITE],0 + jnz NOCHECKING ; If nowrite don't bother with name check + cmp plus_comma,1 ;g don't check if just doing +,, + jz NOCHECKING ;g + invoke COMPNAME ; Source and dest. the same? + JNZ NOCHECKING ; If not, go ahead + CMP [SRCISDEV],0 + JNZ NOCHECKING ; Same name on device OK +; +; At this point we know in append (would have gotten overwrite error on first +; destination create otherwise), and user trying to specify destination which +; has been scribbled already (if dest had been named first, NOWRITE would +; be set). +; + MOV DX,OFFSET TRANGROUP:LOSTERR_ptr ; Tell him he's not going to get it + invoke std_Eprintf ;AC022; + MOV [NXTADD],0 ; Set return + INC [TERMREAD] ; Tell Read to give up + +RET60: + return + +NOCHECKING: + mov bx,[DESTHAND] ; Get handle + XOR CX,CX + XCHG CX,[NXTADD] + JCXZ RET60 ; If Nothing to write, forget it + INC [WRITTEN] ; Flag that we wrote something + CMP [NOWRITE],0 ; If NOWRITE set, just seek CX bytes + JNZ SEEKEND + XOR DX,DX + PUSH DS + MOV DS,[TPA] +ASSUME DS:NOTHING + MOV AH,WRITE + INT int_command + POP DS +ASSUME DS:TRANGROUP + MOV DX,OFFSET TRANGROUP:NOSPACE_ptr + JC xa_set_error_Jmp ;AC022; Failure + sub cx,ax + retz ; Wrote all supposed to + test [DESTISDEV],devid_ISDEV + jz COPERR ; Is a file, error + test [DESTISDEV],devid_RAW + jnz DEVWRTERR ; Is a raw device, error + cmp [INEXACT],0 + retnz ; INEXACT so OK + dec cx + retz ; Wrote one byte less (the ^Z) + +DEVWRTERR: + MOV DX,OFFSET TRANGROUP:DEVWMES_ptr + +PUBLIC COPERR +COPERR: + INVOKE std_Eprintf ;AC022; + +COPERRP: + inc [DESTCLOSED] + cmp [CFLAG],0 + jz ENDCOPYJ ; Never actually got it open + MOV bx,[DESTHAND] + CMP BX,0 + JLE NoClose + MOV AH,CLOSE ; Close the file + INT int_command + +NoClose: + MOV DX,OFFSET TRANGROUP:DESTBUF + MOV AH,UNLINK + INT int_command ; And delete it + MOV [CFLAG],0 + +ENDCOPYJ: + JMP ENDCOPY + +XA_SET_ERROR_JMP: ;AN022; Go set up error message + jmp xa_set_error ;AN022; + +SEEKEND: + xor dx,dx ; Zero high half of offset + xchg dx,cx ; cx:dx is seek location + mov ax,(LSEEK SHL 8) OR 1 + INT int_command ; Seek ahead in the file + cmp [RDEOF],0 + retz +; +; If a ^Z has been read we must set the file size to the current +; file pointer location +; + MOV AH,WRITE + INT int_command ; CX is zero, truncates file + jc xa_set_error_Jmp ;AC022; Failure + return + +TRANCODE ENDS + END + \ No newline at end of file -- cgit v1.2.3