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/COPYPR2.ASM | 450 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 450 insertions(+) create mode 100644 v4.0/src/CMD/COMMAND/COPYPR2.ASM (limited to 'v4.0/src/CMD/COMMAND/COPYPR2.ASM') diff --git a/v4.0/src/CMD/COMMAND/COPYPR2.ASM b/v4.0/src/CMD/COMMAND/COPYPR2.ASM new file mode 100644 index 0000000..2913cab --- /dev/null +++ b/v4.0/src/CMD/COMMAND/COPYPR2.ASM @@ -0,0 +1,450 @@ + page 80,132 +; SCCSID = @(#)copypr2.asm 1.1 85/05/14 +; SCCSID = @(#)copypr2.asm 1.1 85/05/14 + INCLUDE comsw.asm + +.xlist +.xcref + INCLUDE DOSSYM.INC + INCLUDE comseg.asm + INCLUDE comequ.asm +.list +.cref + + +TRANDATA SEGMENT PUBLIC BYTE ;AC000; + EXTRN FulDir_ptr:word ;AN052; +TRANDATA ENDS + +TRANSPACE SEGMENT PUBLIC BYTE ;AC000; + EXTRN ASCII:BYTE + EXTRN BINARY:BYTE + EXTRN CONCAT:BYTE + EXTRN DESTBUF:BYTE + EXTRN DESTFCB:BYTE + EXTRN DESTINFO:BYTE + EXTRN DESTISDIR:BYTE + EXTRN DESTTAIL:WORD + EXTRN DESTVARS:BYTE + EXTRN DIRBUF:BYTE + EXTRN DIRCHAR:BYTE + EXTRN FIRSTDEST:BYTE + EXTRN INEXACT:BYTE + EXTRN MELCOPY:BYTE + EXTRN NXTADD:WORD + EXTRN PLUS:BYTE + EXTRN SDIRBUF:BYTE + EXTRN SRCINFO:BYTE + EXTRN srcxname:byte + EXTRN TPA:WORD + EXTRN trgxname:byte + EXTRN USERDIR1:BYTE +TRANSPACE ENDS + +TRANCODE SEGMENT PUBLIC BYTE + + EXTRN BADPATH_ERR:NEAR ;AN022; + EXTRN COPERR:NEAR ;AN052; + EXTRN EXTEND_SETUP:NEAR ;AN022; + + PUBLIC BUILDPATH + PUBLIC SETSTARS + PUBLIC SETASC + +ASSUME CS:TRANGROUP,DS:TRANGROUP,ES:TRANGROUP,SS:NOTHING + +SETASC: +; +; Given switch vector in AX, +; Set ASCII switch if A is set +; Clear ASCII switch if B is set +; BINARY set if B specified +; Leave ASCII unchanged if neither or both are set +; Also sets INEXACT if ASCII is ever set. AL = ASCII on exit, flags set +; + AND AL,SwitchA+SwitchB + JPE LOADSW ; PE means both or neither are set + PUSH AX + AND AL,SwitchB + MOV [BINARY],AL + POP AX + AND AL,SwitchA + MOV [ASCII],AL + OR [INEXACT],AL + +LOADSW: + MOV AL,[ASCII] + OR AL,AL + return + +public builddest +BUILDDEST: + cmp [DESTISDIR],-1 + jnz KNOWABOUTDEST ; Already done the figuring + MOV DI,OFFSET TRANGROUP:USERDIR1 + mov bp,offset trangroup:DESTVARS + call BUILDPATH + invoke RESTUDIR1 + +; Now know all about the destination + +KNOWABOUTDEST: + xor al,al + xchg al,[FIRSTDEST] + or al,al + jnz FIRSTDST + jmp NOTFIRSTDEST + +FIRSTDST: + mov si,[DESTTAIL] ; Create an FCB of the original DEST + mov di,offset trangroup:DESTFCB + mov ax,PARSE_FILE_DESCRIPTOR SHL 8 + INT int_command + CMP BYTE PTR [SI],0 + JZ GoodParse +;AD052; MOV BYTE PTR [DI+1],"|" ; must be illegal file name character + mov dx,offset trangroup:fuldir_ptr ;AN052; Issue "File creation error" + jmp coperr ;AN052; + +GoodParse: + mov ax,word ptr [DESTBUF] ; Get drive + cmp ah,':' + jz DRVSPEC4 + mov al,'@' + +DRVSPEC4: + MOV CL,[ASCII] ; Save current ASCII setting + or al,20h + sub al,60h + mov [DESTFCB],al + mov al,[DESTINFO] + mov ah,[SRCINFO] + and ax,0202H + or al,al + jz NOTMELCOPY + cmp al,ah + jnz NOTMELCOPY + cmp [PLUS],0 + jz NOTMELCOPY + inc [MELCOPY] ; ambig source, ambig dest, and pluses + xor al,al + jmp short SETCONC + +NOTMELCOPY: + xor al,2 ; al=2 if unambig dest, =0 if ambig dest + and al,ah + shr al,1 ; al=1 if unambig dest AND ambig sorce + ; Implies concatenation +SETCONC: + or al,[PLUS] ; al=1 if concat + mov [CONCAT],al + shl al,1 + shl al,1 + mov [INEXACT],al ; Concat -> inexact copy + cmp [BINARY],0 + jnz NOTFIRSTDEST ; Binary explicitly given, all OK + mov [ASCII],al ; Concat -> ASCII + or cl,cl + jnz NOTFIRSTDEST ; ASCII flag set before, DATA read correctly + or al,al + JZ NOTFIRSTDEST ; ASCII flag did not change states +; +; At this point there may already be binary read data in the read buffer. +; We need to find the first ^Z (if there is one) and trim the amount +; of data in the buffer correctly. +; + MOV CX,[NXTADD] + JCXZ NOTFIRSTDEST ; No data, everything OK + MOV AL,1AH + PUSH ES + XOR DI,DI + MOV ES,[TPA] + REPNE SCASB ; Scan for EOF + POP ES + JNZ NOTFIRSTDEST ; No ^Z in buffer, everything OK + DEC DI ; Point at ^Z + MOV [NXTADD],DI ; New buffer + +NOTFIRSTDEST: + mov bx,offset trangroup:DIRBUF+1 ; Source of replacement chars + cmp [CONCAT],0 + jz GOTCHRSRC ; Not a concat + mov bx,offset trangroup:SDIRBUF+1 ; Source of replacement chars + +GOTCHRSRC: + mov si,offset trangroup:DESTFCB+1 ; Original dest name + mov di,[DESTTAIL] ; Where to put result + +public buildname +BUILDNAME: + mov cx,8 + +BUILDMAIN: + lodsb + cmp al,'?' + jnz NOTAMBIG + mov al,byte ptr [BX] + +NOTAMBIG: + cmp al,' ' + jz NOSTORE + stosb + +NOSTORE: + inc bx + loop BUILDMAIN + mov cl,3 + mov al,' ' + cmp byte ptr [SI],al + jz ENDDEST ; No extension + mov al,dot_chr + stosb + +BUILDEXT: + lodsb + cmp al,'?' + jnz NOTAMBIGE + mov al,byte ptr [BX] + +NOTAMBIGE: + cmp al,' ' + jz NOSTOREE + stosb + +NOSTOREE: + inc bx + loop BUILDEXT +ENDDEST: + xor al,al + stosb ; NUL terminate + return + +BUILDPATH: + test [BP.INFO],2 + jnz NOTPFILE ; If ambig don't bother with open + mov dx,bp + add dx,BUF ; Set DX to spec + + push di ;AN000; + MOV AX,EXTOPEN SHL 8 ;AC000; open the file + mov bx,read_open_mode ;AN000; get open mode for COPY + xor cx,cx ;AN000; no special files + mov si,dx ;AN030; get file name offset + mov di,-1 ;AN030; no parm list + mov dx,read_open_flag ;AN000; set up open flags + INT int_command + pop di ;AN000; + jnc pure_file ;AN022; is pure file + invoke get_ext_error_number ;AN022; get the extended error + cmp ax,error_file_not_found ;AN022; if file not found - okay + jz notpfile ;AN022; + cmp ax,error_path_not_found ;AN022; if path not found - okay + jz notpfile ;AN022; + cmp ax,error_access_denied ;AN022; if access denied - okay + jz notpfile ;AN022; + jmp extend_setup ;AN022; exit with error + +pure_file: + mov bx,ax ; Is pure file + mov ax,IOCTL SHL 8 + INT int_command + mov ah,CLOSE + INT int_command + test dl,devid_ISDEV + jnz ISADEV ; If device, done + test [BP.INFO],4 + jz ISSIMPFILE ; If no path seps, done + +NOTPFILE: + mov dx,word ptr [BP.BUF] + cmp dl,0 ;AN034; If no drive specified, get + jz set_drive_spec ;AN034; default drive dir + cmp dh,':' + jz DRVSPEC5 + +set_drive_spec: ;AN034; + mov dl,'@' + +DRVSPEC5: + or dl,20h + sub dl,60h ; A = 1 + invoke SAVUDIR1 + jnc curdir_ok ;AN022; if error - exit + invoke get_ext_error_number ;AN022; get the extended error + jmp extend_setup ;AN022; exit with error + +curdir_ok: ;AN022; + mov dx,bp + add dx,BUF ; Set DX for upcomming CHDIRs + mov bh,[BP.INFO] + and bh,6 + cmp bh,6 ; Ambig and path ? + jnz CHECKAMB ; jmp if no + mov si,[BP.TTAIL] + mov bl,':' + cmp byte ptr [si-2],bl + jnz KNOWNOTSPEC + mov [BP.ISDIR],2 ; Know is d:/file + jmp short DOPCDJ + +KNOWNOTSPEC: + mov [BP.ISDIR],1 ; Know is path/file + dec si ; Point to the / + +DOPCDJ: + jmp DOPCD ;AC022; need long jump + +CHECKAMB: + cmp bh,2 + jnz CHECKCD + +ISSIMPFILE: +ISADEV: + mov [BP.ISDIR],0 ; Know is file since ambig but no path + return + +CHECKCD: + invoke SETREST1 + mov ah,CHDIR + INT int_command + jc NOTPDIR + mov di,dx + xor ax,ax + mov cx,ax + dec cx + +Kloop: ;AN000; 3/3/KK + MOV AL,ES:[DI] ;AN000; 3/3/KK + INC DI ;AN000; 3/3/KK + OR AL,AL ;AN000; 3/3/KK + JZ Done ;AN000; 3/3/KK + xor ah,ah ;AN000; 3/3/KK + invoke Testkanj ;AN000; 3/3/KK + JZ Kloop ;AN000; 3/3/KK + INC DI ;AN000; 3/3/KK + INC AH ;AN000; 3/3/KK + jmp Kloop ;AN000; 3/3/KK + +Done: ;AN000; 3/3/KK + dec di + mov al,[DIRCHAR] + mov [bp.ISDIR],2 ; assume d:/file + OR AH, AH ;AN000; 3/3/KK + JNZ Store_pchar ;AN000; 3/3/KK this is the trailing byte of ECS code + cmp al,[di-1] + jz GOTSRCSLSH + +Store_pchar: ;AN000; 3/3/KK + stosb + mov [bp.ISDIR],1 ; know path/file + +GOTSRCSLSH: + or [bp.INFO],6 + call SETSTARS + return + + +NOTPDIR: + invoke get_ext_error_number ;AN022; get the extended error + cmp ax,error_path_not_found ;AN022; if path not found - okay + jz notpdir_try ;AN022; + cmp ax,error_access_denied ;AN022; if access denied - okay + jnz extend_setupj ;AN022; otherwise - exit error + +notpdir_try: ;AN022; + mov [bp.ISDIR],0 ; assume pure file + mov bh,[bp.INFO] + test bh,4 + retz ; Know pure file, no path seps + mov [bp.ISDIR],2 ; assume d:/file + mov si,[bp.TTAIL] + cmp byte ptr [si],0 + jz BADCDERRJ2 ; Trailing '/' + mov bl,dot_chr + cmp byte ptr [si],bl + jz BADCDERRJ2 ; If . or .. pure cd should have worked + mov bl,':' + cmp byte ptr [si-2],bl + jz DOPCD ; Know d:/file + mov [bp.ISDIR],1 ; Know path/file + dec si ; Point at last '/' + +DOPCD: + xor bl,bl + xchg bl,[SI] ; Stick in a NUL + invoke SETREST1 + CMP DX,SI ;AN000; 3/3/KK + JAE LookBack ;AN000; 3/3/KK + PUSH SI ;AN000; 3/3/KK + PUSH CX ;AN000; 3/3/KK + MOV CX,SI ;AN000; 3/3/KK + MOV SI,DX ;AN000; 3/3/KK + +Kloop2: ;AN000; 3/3/KK + LODSB ;AN000; 3/3/KK + invoke TestKanj ;AN000; 3/3/KK + jz NotKanj4 ;AN000; 3/3/KK + LODSB ;AN000; 3/3/KK + CMP SI,CX ;AN000; 3/3/KK + JB Kloop2 ;AN000; 3/3/KK + POP CX ;AN000; 3/3/KK + POP SI ;AN000; 3/3/KK + JMP SHORT DoCdr ;AN000; 3/3/KK Last char is ECS code, don't check for + ; trailing path sep +NotKanj4: ;AN000; 3/3/KK + CMP SI,CX ;AN000; 3/3/KK + JB Kloop2 ;AN000; 3/3/KK + POP CX ;AN000; 3/3/KK + POP SI ;AN000; 3/3/KK + +LookBack: ;AN000; 3/3/KK + CMP BL,[SI-1] ; if double slash, then complain. + JZ BadCDErrJ2 + +DoCdr: ;AN000; 3/3/KK + mov ah,CHDIR + INT int_command + xchg bl,[SI] + retnc + invoke get_ext_error_number ;AN022; get the extended error + +EXTEND_SETUPJ: ;AN022; + JMP EXTEND_SETUP ;AN022; go issue the error message + +BADCDERRJ2: + jmp badpath_err ;AC022; go issue path not found message + +SETSTARS: + mov [bp.TTAIL],DI + add [bp.SIZ],12 + mov ax,dot_qmark + mov cx,8 + rep stosb + xchg al,ah + stosb + xchg al,ah + mov cl,3 + rep stosb + xor al,al + stosb + return + +PUBLIC CompName +COMPNAME: + + mov si,offset trangroup:DESTBUF ;g do name translate of target + mov di,offset trangroup:TRGXNAME ;g save for name comparison + mov ah,xnametrans ;g + int int_command ;g + + MOV si,offset trangroup:SRCXNAME ;g get name translate of source + MOV di,offset trangroup:TRGXNAME ;g get name translate of target + + + invoke STRCOMP + + return + +TRANCODE ENDS + END + \ No newline at end of file -- cgit v1.2.3