📄 dos.asm
字号:
;****************************************************************************
;* *
;* WFDOSDIR.ASM - *
;* *
;* Directory searching primitives *
;* *
;****************************************************************************
?PLM=1 ; PASCAL Calling convention is DEFAULT
?WIN=1 ; Windows calling convention
?386=0 ; Use 386 code?
include cmacros.inc
; The following structure should be used to access high and low
; words of a DWORD. This means that "word ptr foo[2]" -> "foo.hi".
LONG struc
lo dw ?
hi dw ?
LONG ends
FARPOINTER struc
off dw ?
sel dw ?
FARPOINTER ends
ifndef SEGNAME
SEGNAME equ <TEXT>
endif
if ?386
createSeg _%SEGNAME, CodeSeg, word, use16, CODE
else
createSeg _%SEGNAME, CodeSeg, word, public, CODE
endif
NOT_SUPPORTED = 2h ; Return code from IsDeviceRemote function.
REMOTE = 3h ; Return code for remote drive found.
TRUE = 1h ; TRUE Definition
FALSE = 0h ; False Definition.
;=============================================================================
sBegin DATA
include ioctl.inc
VolExtendedFCB db 0FFh
db 0, 0, 0, 0, 0
db 1000b
db 0
db 11 dup('?')
db 5 dup(0)
db 11 dup('?')
db 9 dup(0)
DTA db 64 dup(0)
sEnd DATA
;=============================================================================
sBegin CodeSeg
assumes CS,CodeSeg
assumes DS,DATA
;*--------------------------------------------------------------------------*
;* *
;* DosFindFirst() - *
;* *
;*--------------------------------------------------------------------------*
; Get the first directory entry.
cProc DosFindFirst, <FAR, PUBLIC>
ParmD lpDest
ParmD szFileSpec
ParmW attrib
cBegin
push ds
lds dx,lpDest
mov ah,1Ah ; Set DTA
int 21h
mov cx,attrib ; Find First File
lds dx,szFileSpec ; Path = szFileSpec
mov ah,4Eh
int 21h
jc fferr
mov ax,1
jmp short ffdone
fferr:
xor ax,ax ; Return zero on error
ffdone:
pop ds
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosFindNext() - *
;* *
;*--------------------------------------------------------------------------*
cProc DosFindNext, <FAR, PUBLIC>
ParmD lpDest
cBegin
push ds
lds dx,lpDest
mov ah,1Ah ; Set DTA
int 21h
pop ds
les bx,lpDest ; ES:BX = lpDest
mov ah,4Fh ; Find Next File
int 21h
mov ax,1
jnc FNExit ; Exit if no error
FNErr:
xor ax,ax ; Return FALSE
FNExit:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosMkDir() *
;* *
;*--------------------------------------------------------------------------*
cProc DosMkDir, <FAR, PUBLIC>
ParmD szDir
cBegin
lds dx,szDir
mov ah,39h
int 21h
jc mderror
xor ax,ax
jmp short mdexit
mderror:
mov ah,59h
xor bx,bx
int 21h
mdexit:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* GetCurrentDrive() - *
;* *
;*--------------------------------------------------------------------------*
cProc GetCurrentDrive, <FAR, PUBLIC>
cBegin
mov ah,19h ; Get Current Drive
int 21h
sub ah,ah ; Zero out AH
cEnd
;*--------------------------------------------------------------------------*
;* *
;* SetCurrentDrive() - *
;* *
;*--------------------------------------------------------------------------*
; Returns the number of drives in AX.
cProc SetCurrentDrive, <FAR, PUBLIC>
ParmW Drive
cBegin
mov dx,Drive
mov ah,0Eh ; Set Current Drive
int 21h
sub ah,ah ; Zero out AH
cEnd
;*--------------------------------------------------------------------------*
;* *
;* GetCurrentDirectory() - *
;* *
;*--------------------------------------------------------------------------*
cProc DosCwd, <FAR, PUBLIC>, <SI, DI>
ParmD lpDest
cBegin
push ds ; Preserve DS
call GetCurrentDrive
mov si,ax ; SI = Current drive
les di,lpDest ; ES:DI = lpDest
push es
pop ds ; DS:DI = lpDest
cld
mov ax,si ; AX = Current drive
inc al ; Convert to logical drive number
mov dl,al ; DL = Logical Drive Number
add al,'@' ; Convert to ASCII drive letter
stosb
mov al,':'
stosb
mov al,'\' ; Start string with a backslash
stosb
mov byte ptr es:[di],0 ; Null terminate in case of error
mov si,di ; DS:SI = lpDest[1]
mov ah,47h ; Get Current Directory
int 21h
jc CDExit ; Skip if error
xor ax,ax ; Return FALSE if no error
CDExit:
pop ds ; Restore DS
cEnd
;*--------------------------------------------------------------------------*
;* *
;* SetCurrentDirectory() - *
;* *
;*--------------------------------------------------------------------------*
cProc DosChDir, <FAR, PUBLIC>
ParmD lpDirName
cBegin
push ds ; Preserve DS
lds dx,lpDirName ; DS:DX = lpDirName
mov bx,dx
mov ax,ds:[bx]
cmp ah,':'
jnz cdnodrive
;
; Convert drive letter to drive index
;
or al,20h
sub al,'a'
xor ah,ah
push dx
cCall SetCurrentDrive,<ax>
pop dx
cdnodrive:
mov ah,3Bh ; Change Current Directory
int 21h
jc SCDExit ; Skip on error
xor ax,ax ; Return FALSE if successful
SCDExit:
pop ds ; Restore DS
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosValidDir() *
;* *
;*--------------------------------------------------------------------------*
cProc DosValidDir, <FAR, PUBLIC>, <SI, DI>
ParmD szDir
LocalV szCwd, 128
cBegin
lea si,szCwd
cCall DosCwd,<ss,si>
push szDir.sel
push szDir.off
call DosChDir
or ax,ax
pushf
cCall DosChDir,<ss,si>
;
; return TRUE if DosChdir returns 0, FALSE otherwise
;
xor ax,ax ; don't care about this return val.
popf
jnz vdexit
inc ax
vdexit:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosExit(ec); *
;* *
;* Terminate program *
;* *
;*--------------------------------------------------------------------------*
cProc DosExit, <FAR, PUBLIC>
ParmW ec
cBegin
mov al,byte ptr ec
mov ah,4Ch
int 21h
cEnd
;*******************************************************************
;
; None of the code below this comment is presently used in DOS2 GUI.
;
;*******************************************************************
if 0
;*--------------------------------------------------------------------------*
;* *
;* DosRename(lpszFrom, lpszTo); *
;* *
;* Rename file From (far pointer to old filename) *
;* To (far pointer to new filename) *
;* *
;*--------------------------------------------------------------------------*
cProc DosRename, <FAR, PUBLIC>, <DI,DS>
ParmD lpszFrom
ParmD lpszTo
cBegin
lds dx,lpszFrom
les di,lpszTo
mov ah,56h
int 21h
jc rnexit
xor ax,ax
rnexit:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosDelete(szFile); *
;* *
;* Delete file *
;* *
;*--------------------------------------------------------------------------*
cProc DosDelete, <FAR, PUBLIC>, <DS>
ParmD szFile
cBegin
lds dx,szFile
mov ah,41h
int 21h
jc dexit
xor ax,ax
dexit:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* int GetCodePage(void) *
;* *
;*--------------------------------------------------------------------------*
cProc GetCodePage, <FAR, PUBLIC>
cBegin
mov ax,6601h ; Get Code page call (Dos Ver >= 3.30)
int 21h ; Call DOS.
mov ax,bx ; Stick axtive code page in AX.
jnc short GCPdone ; default CP is already in DX so were done.
mov ax,-1 ; return error condition if carry set.
; other wise, return ax,dx pair.
GCPdone:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -