mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-11-25 23:25:47 +00:00
579 lines
20 KiB
NASM
579 lines
20 KiB
NASM
TITLE COMMAND COPY routines.
|
||
|
||
INCLUDE COMSW.ASM
|
||
|
||
.xlist
|
||
.xcref
|
||
INCLUDE DOSSYM.ASM
|
||
INCLUDE DEVSYM.ASM
|
||
INCLUDE COMSEG.ASM
|
||
.list
|
||
.cref
|
||
|
||
INCLUDE COMEQU.ASM
|
||
|
||
DATARES SEGMENT PUBLIC
|
||
EXTRN VERVAL:WORD
|
||
DATARES ENDS
|
||
|
||
TRANDATA SEGMENT PUBLIC
|
||
EXTRN BADARGS:BYTE,BADCD:BYTE,BADSWT:BYTE,COPIED_PRE:BYTE
|
||
EXTRN COPIED_POST:BYTE
|
||
EXTRN INBDEV:BYTE,OVERWR:BYTE,FULDIR:BYTE,LOSTERR:BYTE
|
||
EXTRN NOSPACE:BYTE,DEVWMES:BYTE,NOTFND:BYTE
|
||
TRANDATA ENDS
|
||
|
||
TRANSPACE SEGMENT PUBLIC
|
||
EXTRN MELCOPY:BYTE,SRCPT:WORD,MELSTART:WORD,SCANBUF:BYTE
|
||
EXTRN DESTFCB2:BYTE,SDIRBUF:BYTE,SRCTAIL:WORD,CFLAG:BYTE
|
||
EXTRN NXTADD:WORD,DESTCLOSED:BYTE,ALLSWITCH:WORD,ARGC:BYTE
|
||
EXTRN PLUS:BYTE,BINARY:BYTE,ASCII:BYTE,FILECNT:WORD
|
||
EXTRN WRITTEN:BYTE,CONCAT:BYTE,DESTBUF:BYTE,SRCBUF:BYTE
|
||
EXTRN SDIRBUF:BYTE,DIRBUF:BYTE,DESTFCB:BYTE,FRSTSRCH:BYTE
|
||
EXTRN FIRSTDEST:BYTE,DESTISDIR:BYTE,DESTSWITCH:WORD,STARTEL:WORD
|
||
EXTRN DESTTAIL:WORD,DESTSIZ:BYTE,DESTINFO:BYTE,INEXACT:BYTE
|
||
EXTRN CURDRV:BYTE,DESTVARS:BYTE,RESSEG:WORD,SRCSIZ:BYTE
|
||
EXTRN SRCINFO:BYTE,SRCVARS:BYTE,USERDIR1:BYTE,NOWRITE:BYTE
|
||
EXTRN RDEOF:BYTE,SRCHAND:WORD,CPDATE:WORD,CPTIME:WORD
|
||
EXTRN SRCISDEV:BYTE,BYTCNT:WORD,TPA:WORD,TERMREAD:BYTE
|
||
EXTRN DESTHAND:WORD,DESTISDEV:BYTE,DIRCHAR:BYTE
|
||
TRANSPACE ENDS
|
||
|
||
|
||
; **************************************************
|
||
; COPY CODE
|
||
;
|
||
|
||
TRANCODE SEGMENT PUBLIC BYTE
|
||
|
||
EXTRN RESTUDIR:NEAR,CERROR:NEAR,SWITCH:NEAR,DISP32BITS:NEAR
|
||
EXTRN PRINT:NEAR,TCOMMAND:NEAR,ZPRINT:NEAR,ONESPC:NEAR
|
||
EXTRN RESTUDIR1:NEAR,FCB_TO_ASCZ:NEAR,CRLF2:NEAR,SAVUDIR1:NEAR
|
||
EXTRN SETREST1:NEAR,BADCDERR:NEAR,STRCOMP:NEAR,DELIM:NEAR
|
||
EXTRN UPCONV:NEAR,PATHCHRCMP:NEAR,SCANOFF:NEAR
|
||
|
||
EXTRN CPARSE:NEAR
|
||
|
||
EXTRN SEARCH:NEAR,SEARCHNEXT:NEAR,DOCOPY:NEAR,CLOSEDEST:NEAR
|
||
EXTRN FLSHFIL:NEAR,SETASC:NEAR,BUILDNAME:NEAR,COPERR:NEAR
|
||
|
||
PUBLIC COPY,BUILDPATH,COMPNAME,ENDCOPY
|
||
|
||
|
||
ASSUME CS:TRANGROUP,DS:TRANGROUP,ES:TRANGROUP,SS:NOTHING
|
||
|
||
DOMELCOPY:
|
||
cmp [MELCOPY],0FFH
|
||
jz CONTMEL
|
||
mov SI,[SRCPT]
|
||
mov [MELSTART],si
|
||
mov [MELCOPY],0FFH
|
||
CONTMEL:
|
||
xor BP,BP
|
||
mov si,[SRCPT]
|
||
mov bl,'+'
|
||
SCANSRC2:
|
||
mov di,OFFSET TRANGROUP:SCANBUF
|
||
call CPARSE
|
||
test bh,80H
|
||
jz NEXTMEL ; Go back to start
|
||
test bh,1 ; Switch ?
|
||
jnz SCANSRC2 ; Yes
|
||
call SOURCEPROC
|
||
call RESTUDIR1
|
||
mov di,OFFSET TRANGROUP:DESTFCB2
|
||
mov ax,PARSE_FILE_DESCRIPTOR SHL 8
|
||
INT int_command
|
||
mov bx,OFFSET TRANGROUP:SDIRBUF + 1
|
||
mov si,OFFSET TRANGROUP:DESTFCB2 + 1
|
||
mov di,[SRCTAIL]
|
||
call BUILDNAME
|
||
jmp MELDO
|
||
|
||
|
||
NEXTMEL:
|
||
call CLOSEDEST
|
||
xor ax,ax
|
||
mov [CFLAG],al
|
||
mov [NXTADD],ax
|
||
mov [DESTCLOSED],al
|
||
mov si,[MELSTART]
|
||
mov [SRCPT],si
|
||
call SEARCHNEXT
|
||
jz SETNMELJ
|
||
jmp ENDCOPY2
|
||
SETNMELJ:
|
||
jmp SETNMEL
|
||
|
||
COPY:
|
||
; First order of buisness is to find out about the destination
|
||
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
||
xor ax,ax
|
||
mov [ALLSWITCH],AX ; no switches
|
||
mov [ARGC],al ; no arguments
|
||
mov [PLUS],al ; no concatination
|
||
mov [BINARY],al ; Binary not specifically specified
|
||
mov [ASCII],al ; ASCII not specifically specified
|
||
mov [FILECNT],ax ; No files yet
|
||
mov [WRITTEN],al ; Nothing written yet
|
||
mov [CONCAT],al ; No concatination
|
||
mov [MELCOPY],al ; Not a Mel Hallerman copy
|
||
mov word ptr [SCANBUF],ax ; Init buffer
|
||
mov word ptr [DESTBUF],ax ; Init buffer
|
||
mov word ptr [SRCBUF],ax ; Init buffer
|
||
mov word ptr [SDIRBUF],ax ; Init buffer
|
||
mov word ptr [DIRBUF],ax ; Init buffer
|
||
mov word ptr [DESTFCB],ax ; Init buffer
|
||
dec ax
|
||
mov [FRSTSRCH],al ; First search call
|
||
mov [FIRSTDEST],al ; First time
|
||
mov [DESTISDIR],al ; Don't know about dest
|
||
mov si,81H
|
||
mov bl,'+' ; include '+' as a delimiter
|
||
DESTSCAN:
|
||
xor bp,bp ; no switches
|
||
mov di,offset trangroup:SCANBUF
|
||
call CPARSE
|
||
PUSHF ; save flags
|
||
test bh,80H ; A '+' argument?
|
||
jz NOPLUS ; no
|
||
mov [PLUS],1 ; yes
|
||
NOPLUS:
|
||
POPF ; get flags back
|
||
jc CHECKDONE ; Hit CR?
|
||
test bh,1 ; Switch?
|
||
jz TESTP2 ; no
|
||
or [DESTSWITCH],BP ; Yes, assume destination
|
||
or [ALLSWITCH],BP ; keep tabs on all switches
|
||
jmp short DESTSCAN
|
||
|
||
TESTP2:
|
||
test bh,80H ; Plus?
|
||
jnz GOTPLUS ; Yes, not a separate arg
|
||
inc [ARGC] ; found a real arg
|
||
GOTPLUS:
|
||
push SI
|
||
mov ax,[STARTEL]
|
||
mov SI,offset trangroup:SCANBUF ; Adjust to copy
|
||
sub ax,SI
|
||
mov DI,offset trangroup:DESTBUF
|
||
add ax,DI
|
||
mov [DESTTAIL],AX
|
||
mov [DESTSIZ],cl ; Save its size
|
||
inc cx ; Include the NUL
|
||
rep movsb ; Save potential destination
|
||
mov [DESTINFO],bh ; Save info about it
|
||
mov [DESTSWITCH],0 ; reset switches
|
||
pop SI
|
||
jmp short DESTSCAN ; keep going
|
||
|
||
CHECKDONE:
|
||
mov al,[PLUS]
|
||
mov [CONCAT],al ; PLUS -> Concatination
|
||
shl al,1
|
||
shl al,1
|
||
mov [INEXACT],al ; CONCAT -> inexact copy
|
||
mov dx,offset trangroup:BADARGS
|
||
mov al,[ARGC]
|
||
or al,al ; Good number of args?
|
||
jz CERROR4J ; no, not enough
|
||
cmp al,2
|
||
jbe ACOUNTOK
|
||
CERROR4J:
|
||
jmp CERROR ; no, too many
|
||
ACOUNTOK:
|
||
mov bp,offset trangroup:DESTVARS
|
||
cmp al,1
|
||
jnz GOT2ARGS
|
||
mov al,[CURDRV] ; Dest is default drive:*.*
|
||
add al,'A'
|
||
mov ah,':'
|
||
mov [bp.SIZ],2
|
||
mov di,offset trangroup:DESTBUF
|
||
stosw
|
||
mov [DESTSWITCH],0 ; no switches on dest
|
||
mov [bp.INFO],2 ; Flag dest is ambig
|
||
mov [bp.ISDIR],0 ; Know destination specs file
|
||
call SETSTARS
|
||
GOT2ARGS:
|
||
cmp [bp.SIZ],2
|
||
jnz NOTSHORTDEST
|
||
cmp [DESTBUF+1],':'
|
||
jnz NOTSHORTDEST ; Two char file name
|
||
or [bp.INFO],2 ; Know dest is d:
|
||
mov di,offset trangroup:DESTBUF + 2
|
||
mov [bp.ISDIR],0 ; Know destination specs file
|
||
call SETSTARS
|
||
NOTSHORTDEST:
|
||
mov di,[bp.TTAIL]
|
||
cmp byte ptr [DI],0
|
||
jnz CHKSWTCHES
|
||
mov dx,offset trangroup:BADCD
|
||
cmp byte ptr [DI-2],':'
|
||
jnz CERROR4J ; Trailing '/' error
|
||
mov [bp.ISDIR],2 ; Know destination is d:/
|
||
or [bp.INFO],6
|
||
call SETSTARS
|
||
CHKSWTCHES:
|
||
mov dx,offset trangroup:BADSWT
|
||
mov ax,[ALLSWITCH]
|
||
cmp ax,GOTSWITCH
|
||
jz CERROR4J ; Switch specified which is not known
|
||
|
||
; Now know most of the information needed about the destination
|
||
|
||
TEST AX,VSWITCH ; Verify requested?
|
||
JZ NOVERIF ; No
|
||
MOV AH,GET_VERIFY_ON_WRITE
|
||
INT int_command ; Get current setting
|
||
PUSH DS
|
||
MOV DS,[RESSEG]
|
||
ASSUME DS:RESGROUP
|
||
XOR AH,AH
|
||
MOV [VERVAL],AX ; Save current setting
|
||
POP DS
|
||
ASSUME DS:TRANGROUP
|
||
MOV AX,(SET_VERIFY_ON_WRITE SHL 8) OR 1 ; Set verify
|
||
INT int_command
|
||
NOVERIF:
|
||
xor bp,bp ; no switches
|
||
mov si,81H
|
||
mov bl,'+' ; include '+' as a delimiter
|
||
SCANFSRC:
|
||
mov di,offset trangroup:SCANBUF
|
||
call CPARSE ; Parse first source name
|
||
test bh,1 ; Switch?
|
||
jnz SCANFSRC ; Yes, try again
|
||
or [DESTSWITCH],bp ; Include copy wide switches on DEST
|
||
test bp,BSWITCH
|
||
jnz NOSETCASC ; Binary explicit
|
||
cmp [CONCAT],0
|
||
JZ NOSETCASC ; Not Concat
|
||
mov [ASCII],ASWITCH ; Concat -> ASCII copy if no B switch
|
||
NOSETCASC:
|
||
push SI
|
||
mov ax,[STARTEL]
|
||
mov SI,offset trangroup:SCANBUF ; Adjust to copy
|
||
sub ax,SI
|
||
mov DI,offset trangroup:SRCBUF
|
||
add ax,DI
|
||
mov [SRCTAIL],AX
|
||
mov [SRCSIZ],cl ; Save its size
|
||
inc cx ; Include the NUL
|
||
rep movsb ; Save this source
|
||
mov [SRCINFO],bh ; Save info about it
|
||
pop SI
|
||
mov ax,bp ; Switches so far
|
||
call SETASC ; Set A,B switches accordingly
|
||
call SWITCH ; Get any more switches on this arg
|
||
call SETASC ; Set
|
||
call FRSTSRC
|
||
jmp FIRSTENT
|
||
|
||
ENDCOPY:
|
||
CALL CLOSEDEST
|
||
ENDCOPY2:
|
||
MOV DX,OFFSET TRANGROUP:COPIED_PRE
|
||
CALL PRINT
|
||
MOV SI,[FILECNT]
|
||
XOR DI,DI
|
||
CALL DISP32BITS
|
||
MOV DX,OFFSET TRANGROUP:COPIED_POST
|
||
CALL PRINT
|
||
JMP TCOMMAND ; Stack could be messed up
|
||
|
||
SRCNONEXIST:
|
||
cmp [CONCAT],0
|
||
jnz NEXTSRC ; If in concat mode, ignore error
|
||
mov dx,offset trangroup:SRCBUF
|
||
call zprint
|
||
CALL ONESPC
|
||
mov dx,offset trangroup:NOTFND
|
||
jmp COPERR
|
||
|
||
SOURCEPROC:
|
||
push SI
|
||
mov ax,[STARTEL]
|
||
mov SI,offset trangroup:SCANBUF ; Adjust to copy
|
||
sub ax,SI
|
||
mov DI,offset trangroup:SRCBUF
|
||
add ax,DI
|
||
mov [SRCTAIL],AX
|
||
mov [SRCSIZ],cl ; Save its size
|
||
inc cx ; Include the NUL
|
||
rep movsb ; Save this sorce
|
||
mov [SRCINFO],bh ; Save info about it
|
||
pop SI
|
||
mov ax,bp ; Switches so far
|
||
call SETASC ; Set A,B switches accordingly
|
||
call SWITCH ; Get any more switches on this arg
|
||
call SETASC ; Set
|
||
cmp [CONCAT],0
|
||
jnz LEAVECFLAG ; Leave CFLAG if concatination
|
||
FRSTSRC:
|
||
xor ax,ax
|
||
mov [CFLAG],al ; Flag destination not created
|
||
mov [NXTADD],ax ; Zero out buffer
|
||
mov [DESTCLOSED],al ; Not created -> not closed
|
||
LEAVECFLAG:
|
||
mov [SRCPT],SI ; remember where we are
|
||
mov di,offset trangroup:USERDIR1
|
||
mov bp,offset trangroup:SRCVARS
|
||
call BUILDPATH ; Figure out everything about the source
|
||
mov si,[SRCTAIL] ; Create the search FCB
|
||
return
|
||
|
||
NEXTSRC:
|
||
cmp [PLUS],0
|
||
jnz MORECP
|
||
ENDCOPYJ2:
|
||
jmp ENDCOPY ; Done
|
||
MORECP:
|
||
xor bp,bp ; no switches
|
||
mov si,[SRCPT]
|
||
mov bl,'+' ; include '+' as a delimiter
|
||
SCANSRC:
|
||
mov di,offset trangroup:SCANBUF
|
||
call CPARSE ; Parse first source name
|
||
JC EndCopyJ2 ; if error, then end (trailing + case)
|
||
test bh,80H
|
||
jz ENDCOPYJ2 ; If no '+' we're done
|
||
test bh,1 ; Switch?
|
||
jnz SCANSRC ; Yes, try again
|
||
call SOURCEPROC
|
||
FIRSTENT:
|
||
mov di,FCB
|
||
mov ax,PARSE_FILE_DESCRIPTOR SHL 8
|
||
INT int_command
|
||
mov ax,word ptr [SRCBUF] ; Get drive
|
||
cmp ah,':'
|
||
jz DRVSPEC1
|
||
mov al,'@'
|
||
DRVSPEC1:
|
||
sub al,'@'
|
||
mov ds:[FCB],al
|
||
mov ah,DIR_SEARCH_FIRST
|
||
call SEARCH
|
||
pushf ; Save result of search
|
||
call RESTUDIR1 ; Restore users dir
|
||
popf
|
||
jz NEXTAMBIG0
|
||
jmp SRCNONEXIST ; Failed
|
||
NEXTAMBIG0:
|
||
xor al,al
|
||
xchg al,[FRSTSRCH]
|
||
or al,al
|
||
jz NEXTAMBIG
|
||
SETNMEL:
|
||
mov cx,12
|
||
mov di,OFFSET TRANGROUP:SDIRBUF
|
||
mov si,OFFSET TRANGROUP:DIRBUF
|
||
rep movsb ; Save very first source name
|
||
NEXTAMBIG:
|
||
xor al,al
|
||
mov [NOWRITE],al ; Turn off NOWRITE
|
||
mov di,[SRCTAIL]
|
||
mov si,offset trangroup:DIRBUF + 1
|
||
call FCB_TO_ASCZ ; SRCBUF has complete name
|
||
MELDO:
|
||
cmp [CONCAT],0
|
||
jnz SHOWCPNAM ; Show name if concat
|
||
test [SRCINFO],2 ; Show name if multi
|
||
jz DOREAD
|
||
SHOWCPNAM:
|
||
mov dx,offset trangroup:SRCBUF
|
||
call ZPRINT
|
||
call CRLF2
|
||
DOREAD:
|
||
call DOCOPY
|
||
cmp [CONCAT],0
|
||
jnz NODCLOSE ; If concat, do not close
|
||
call CLOSEDEST ; else close current destination
|
||
jc NODCLOSE ; Concat flag got set, close didn't really happen
|
||
mov [CFLAG],0 ; Flag destination not created
|
||
NODCLOSE:
|
||
cmp [CONCAT],0 ; Check CONCAT again
|
||
jz NOFLUSH
|
||
CALL FLSHFIL ; Flush output between source files on CONCAT
|
||
; so LOSTERR stuff works correctly
|
||
TEST [MELCOPY],0FFH
|
||
jz NOFLUSH
|
||
jmp DOMELCOPY
|
||
|
||
NOFLUSH:
|
||
call SEARCHNEXT ; Try next match
|
||
jnz NEXTSRCJ ; Finished with this source spec
|
||
mov [DESTCLOSED],0 ; Not created or concat -> not closed
|
||
jmp NEXTAMBIG ; Do next ambig
|
||
|
||
NEXTSRCJ:
|
||
jmp NEXTSRC
|
||
|
||
|
||
|
||
BUILDPATH:
|
||
test [BP.INFO],2
|
||
jnz NOTPFILE ; If ambig don't bother with open
|
||
mov dx,bp
|
||
add dx,BUF ; Set DX to spec
|
||
mov ax,OPEN SHL 8
|
||
INT int_command
|
||
jc NOTPFILE
|
||
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 dh,':'
|
||
jz DRVSPEC5
|
||
mov dl,'@'
|
||
DRVSPEC5:
|
||
sub dl,'@' ; A = 1
|
||
call SAVUDIR1
|
||
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]
|
||
cmp byte ptr [si-2],':'
|
||
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 short DOPCD
|
||
|
||
CHECKAMB:
|
||
cmp bh,2
|
||
jnz CHECKCD
|
||
ISSIMPFILE:
|
||
ISADEV:
|
||
mov [BP.ISDIR],0 ; Know is file since ambig but no path
|
||
return
|
||
|
||
CHECKCD:
|
||
call SETREST1
|
||
mov ah,CHDIR
|
||
INT int_command
|
||
jc NOTPDIR
|
||
mov di,dx
|
||
xor ax,ax
|
||
mov cx,ax
|
||
dec cx
|
||
repne scasb
|
||
dec di
|
||
mov al,[DIRCHAR]
|
||
mov [bp.ISDIR],2 ; assume d:/file
|
||
cmp al,[di-1]
|
||
jz GOTSRCSLSH
|
||
stosb
|
||
mov [bp.ISDIR],1 ; know path/file
|
||
GOTSRCSLSH:
|
||
or [bp.INFO],6
|
||
call SETSTARS
|
||
return
|
||
|
||
|
||
NOTPDIR:
|
||
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 '/'
|
||
cmp byte ptr [si],'.'
|
||
jz BADCDERRJ2 ; If . or .. pure cd should have worked
|
||
cmp byte ptr [si-2],':'
|
||
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
|
||
call SETREST1
|
||
mov ah,CHDIR
|
||
INT int_command
|
||
xchg bl,[SI]
|
||
retnc
|
||
BADCDERRJ2:
|
||
JMP BADCDERR
|
||
|
||
SETSTARS:
|
||
mov [bp.TTAIL],DI
|
||
add [bp.SIZ],12
|
||
mov ax,('.' SHL 8) OR '?'
|
||
mov cx,8
|
||
rep stosb
|
||
xchg al,ah
|
||
stosb
|
||
xchg al,ah
|
||
mov cl,3
|
||
rep stosb
|
||
xor al,al
|
||
stosb
|
||
return
|
||
|
||
|
||
COMPNAME:
|
||
PUSH CX
|
||
PUSH AX
|
||
MOV si,offset trangroup:SRCBUF
|
||
MOV di,offset trangroup:DESTBUF
|
||
MOV CL,[CURDRV]
|
||
MOV CH,CL
|
||
CMP BYTE PTR [SI+1],':'
|
||
JNZ NOSRCDRV
|
||
LODSW
|
||
SUB AL,'A'
|
||
MOV CL,AL
|
||
NOSRCDRV:
|
||
CMP BYTE PTR [DI+1],':'
|
||
JNZ NODSTDRV
|
||
MOV AL,[DI]
|
||
INC DI
|
||
INC DI
|
||
SUB AL,'A'
|
||
MOV CH,AL
|
||
NODSTDRV:
|
||
CMP CH,CL
|
||
jnz RET81P
|
||
call STRCOMP
|
||
jz RET81P
|
||
mov ax,[si-1]
|
||
mov cx,[di-1]
|
||
push ax
|
||
and al,cl
|
||
pop ax
|
||
jnz RET81P ; Niether of the mismatch chars was a NUL
|
||
; Know one of the mismatch chars is a NUL
|
||
; Check for ".NUL" compared with NUL
|
||
cmp al,'.'
|
||
jnz CHECKCL
|
||
or ah,ah
|
||
jmp short RET81P ; If NUL return match, else no match
|
||
CHECKCL:
|
||
cmp cl,'.'
|
||
jnz RET81P ; Mismatch
|
||
or ch,ch ; If NUL return match, else no match
|
||
RET81P:
|
||
POP AX
|
||
POP CX
|
||
return
|
||
|
||
TRANCODE ENDS
|
||
|
||
END
|
||
|