int21h.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 2,067 行 · 第 1/5 页
ASM
2,067 行
mov ds,[ebx+2+4]
int2121_Ef4: mov es,fs:[EPSP_Struc.EPSP_TransProt]
mov edi,256
movzx ecx,b[esi] ;get command line length.
inc ecx ;include length byte.
rep movsb
mov al,0dh
stosb
mov al,0
stosb
;
;Copy the FCB's
;
if 0
push ecx
push esi
push edi
push ds
push es
push ds
mov ds,cs:Int21hDSeg
assume ds:_cwMain
test BYTE PTR SystemFlags,1
assume ds:nothing
pop ds
jz int2121_Ef6
movzx ebx,bx
movzx edi,WORD PTR es:[ebx+(2)+(2+2)] ;Get FCB 1 offset.
mov es,es:[ebx+(2)+(2+2)+2] ;& segment.
jmp int2121_Ef7
int2121_Ef6: mov edi,es:[ebx+(2)+(4+2)]
mov es,es:[ebx+(2)+(4+2)+4]
int2121_Ef7: mov ds,cs:Int21hDSeg
assume ds:_cwMain
lds esi,TransferBuffer
assume ds:nothing
add esi,512
push esi
push edi
push ds
push es
pop ds
pop es
pop esi
pop edi
mov ecx,10h
cld
rep movsb
pop es
pop ds
pop edi
pop esi
pop ecx
;
push ecx
push esi
push edi
push ds
push es
push ds
mov ds,cs:Int21hDSeg
assume ds:_cwMain
test BYTE PTR SystemFlags,1
assume ds:nothing
pop ds
jz int2121_Ef8
movzx ebx,bx
movzx edi,WORD PTR es:[ebx+(2)+(2+2)+(2+2)] ;Get FCB 2 offset.
mov es,es:[ebx+(2)+(2+2)+(2+2)+2] ;& segment.
jmp int2121_Ef9
int2121_Ef8: mov edi,es:[ebx+(2)+(4+2)+(4+2)]
mov es,es:[ebx+(2)+(4+2)+(4+2)+4]
int2121_Ef9: mov ds,cs:Int21hDSeg
assume ds:_cwMain
lds esi,TransferBuffer
assume ds:nothing
add esi,512+16
push esi
push edi
push ds
push es
pop ds
pop es
pop esi
pop edi
mov ecx,10h
cld
rep movsb
pop es
pop ds
pop edi
pop esi
pop ecx
endif
;
;Sort out the environment.
;
mov edi,[ebp+Int_EBX]
mov es,[ebp+Int_ES]
call Int21hExtend_ES_EDI ;Extend [E]SI.
mov ebx,edi
xor esi,esi
cmp cs:Int21hDOS4GFlag,0
jz int2121_1
cmp WORD PTR es:[ebx+4],0
jz int2121_2
lds esi,FWORD PTR es:[ebx]
jmp int2121_ef12
int2121_1: cmp WORD PTR es:[ebx],0 ;got an environment?
jnz int2121_Ef10
int2121_2: mov ds,WORD PTR fs:[PSP_Struc.PSP_Environment] ;Get current environment.
jmp int2121_Ef12
int2121_Ef10: mov ds,es:[ebx] ;get environment segment.
int2121_Ef12: push esi
int2121_3: lodsb
or al,al
jnz int2121_3
cmp b[esi],0 ;double zero?
jnz int2121_3
inc esi
inc esi
pop eax
push eax
sub esi,eax
mov ecx,esi
add esi,256 ;make space for execution path.
add esi,15
shr esi,4 ;get paragraphs needed.
mov edi,offset Int21Buffer
mov es,cs:Int21hDSeg
mov es:RealRegsStruc.Real_EBX[edi],esi
mov es:RealRegsStruc.Real_EAX[edi],4800h
pop esi
mov bl,21h
sys IntXX ;allocate this memory.
mov eax,es:RealRegsStruc.Real_EAX[edi] ;get segment address.
test es:RealRegsStruc.Real_Flags[edi],1
mov di,ax
mov al,1
jnz int2121_Ef13
movzx edi,di
push edi
shl edi,4
mov es,cs:Int21hDSeg
assume es:_cwMain
mov es,es:RealSegment
assume es:nothing
rep movsb ;Copy environment.
pop edx
;
;Patch INT 21h exec function to preserve the stack.
;
pushad
mov ds,cs:Int21hDSeg
assume ds:_cwMain
cmp NoEXECPatchFlag,0
jne medex1
mov bl,21h
mov ax,200h
int 31h
mov w[OldInt21hExec],dx
mov w[OldInt21hExec+2],cx
mov dx,offset Int21hExecPatch
mov cx,_cwMain
mov bl,21h
mov ax,201h
IFNDEF DEBUG5
int 31h
ENDIF
medex1:
assume ds:nothing
popad
;
;Setup real mode parameter block.
;
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov ds,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
mov esi,512+32
mov w[esi],dx ;set environment segment.
mov w[esi+2],256 ;command tail offset.
mov w[esi+4],ax ;command tail segment.
mov w[esi+6],512 ;FCB 1 offset.
mov w[esi+8],ax ;FCB 1 segment.
mov w[esi+10],512+16 ;FCB 2 offset.
mov w[esi+12],ax ;FCB 2 segment.
;
mov edi,offset Int21Buffer
mov es,cs:Int21hDSeg
mov es:RealRegsStruc.Real_EAX[edi],4b00h
mov es:RealRegsStruc.Real_EBX[edi],512+32
mov es:RealRegsStruc.Real_EDX[edi],0
mov es:RealRegsStruc.Real_DS[edi],ax
mov es:RealRegsStruc.Real_ES[edi],ax
mov bl,21h
sys IntXX
;
;Restore INT 21h patch.
;
pushad
mov ds,cs:Int21hDSeg
assume ds:_cwMain
cmp NoEXECPatchFlag,0
jne medex2
mov bl,21h
mov dx,w[OldInt21hExec]
mov cx,w[OldInt21hExec+2]
mov d[OldInt21hExec],0
mov ax,201h
IFNDEF DEBUG5
int 31h
ENDIF
medex2:
assume ds:nothing
popad
push es:RealRegsStruc.Real_Flags[edi] ;save flags.
mov eax,es:RealRegsStruc.Real_EAX[edi]
mov [ebp+Int_AX],ax ;store errorlevel.
DOS4GExtend w[ebp+Int_EAX+2]
;
or dx,dx
jz int2121_Ef15 ;No environment to release.
mov es:RealRegsStruc.Real_ES[edi],dx
mov es:RealRegsStruc.Real_EAX[edi],4900h ;release dos memory.
mov bl,21h
sys IntXX
;
int2121_Ef15: ;Put the DTA back where it's supposed to be.
;
mov es:RealRegsStruc.Real_EDX[edi],offset DTABuffer
mov es:RealRegsStruc.Real_DS[edi],_cwMain
mov es:RealRegsStruc.Real_EAX[edi],1a00h
mov bl,21h
sys IntXX
;
pop ax
int2121_Ef13:
and ax,1
call Int21hAL2Carry
ret
Int21hExecFile endp
;------------------------------------------------------------------------------
;
;Function 4E emulation.
;
Int21hFindFirstFile proc near
mov es,cs:Int21hDseg ;point to new source.
mov edi,offset DtaBuffer ;use the real DTA buffer.
lds esi,FWORD PTR fs:[EPSP_Struc.EPSP_DTA] ;point to user buffer.
mov ecx,DTASize ;length to copy.
rep movsb ;copy data returned.
mov esi,[ebp+Int_EDX] ;Point to source data.
mov ds,[ebp+Int_DS]
call Int21hExtend_DS_ESI ;Extend [E]SI.
xor al,al ;Character to look for.
call Int21hStringLen ;Get length of this string.
inc ecx ;Include terminator.
mov es,fs:[EPSP_Struc.EPSP_TransProt]
xor edi,edi
rep movsb
mov edi,offset Int21Buffer
mov es,cs:Int21hDSeg
mov eax,[ebp+Int_EAX]
mov es:RealRegsStruc.Real_EAX[edi],eax
mov eax,[ebp+Int_ECX]
mov es:RealRegsStruc.Real_ECX[edi],eax
mov es:RealRegsStruc.Real_EDX[edi],0
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:RealRegsStruc.Real_DS[edi],ax
mov bl,21h
sys IntXX
mov eax,es:RealRegsStruc.Real_EAX[edi]
mov [ebp+Int_AX],ax
DOS4GExtend w[ebp+Int_EAX+2]
mov ax,es:RealRegsStruc.Real_Flags[edi]
and al,1
call Int21hAL2Carry ;Set carry.
; or al,al
; jnz @@9
mov ds,cs:Int21hDseg ;point to new source.
mov esi,offset DtaBuffer ;use the real DTA buffer.
les edi,FWORD PTR fs:[EPSP_Struc.EPSP_DTA] ;point to user buffer.
mov ecx,DTASize ;length to copy.
rep movsb ;copy data returned.
int2122_9: ret
Int21hFindFirstFile endp
;------------------------------------------------------------------------------
;
;Function 4F emulation.
;
Int21hFindNextFile proc near
mov es,cs:Int21hDseg ;point to new source.
mov edi,offset DtaBuffer ;use the real DTA buffer.
lds esi,FWORD PTR fs:[EPSP_Struc.EPSP_DTA] ;point to user buffer.
mov ecx,DTASize ;length to copy.
rep movsb ;copy data returned.
mov edi,offset Int21Buffer
mov es,cs:Int21hDseg
mov eax,[ebp+Int_EAX]
mov es:RealRegsStruc.Real_EAX[edi],eax
mov bl,21h
sys IntXX
mov eax,es:RealRegsStruc.Real_EAX[edi]
mov [ebp+Int_AX],ax
DOS4GExtend w[ebp+Int_EAX+2]
mov ax,es:RealRegsStruc.Real_Flags[edi]
and al,1
call Int21hAL2Carry ;Set carry.
; or al,al
; jnz @@9
mov ds,cs:Int21hDseg ;point to new source.
mov esi,offset DtaBuffer ;use the real DTA buffer.
les edi,FWORD PTR fs:[EPSP_Struc.EPSP_DTA] ;point to user buffer.
mov ecx,DTASize ;length to copy.
rep movsb ;copy data returned.
int2123_9: ret
Int21hFindNextFile endp
;------------------------------------------------------------------------------
;
;Function 50 emulation.
;
Int21hSetPSP proc near
mov ds,cs:Int21hDSeg
assume ds:_cwMain
mov ax,[ebp+Int_BX]
mov PSPSegment,ax ;Set current PSP.
assume ds:nothing
ret
Int21hSetPSP endp
;------------------------------------------------------------------------------
;
;Function 51 emulation.
;
Int21hGetPSP proc near
mov [ebp+Int_BX],fs
ret
Int21hGetPSP endp
;------------------------------------------------------------------------------
;
;Function 56 emulation.
;
Int21hRenameFile proc near
mov ds,[ebp+Int_DS]
mov esi,[ebp+Int_EDX]
call Int21hExtend_DS_ESI ;Extend [E]SI.
xor al,al ;Character to look for.
call Int21hStringLen ;Get length of this string.
inc ecx
mov es,fs:[EPSP_Struc.EPSP_TransProt]
xor edi,edi
push ecx
rep movsb
pop edi
;
mov ds,[ebp+Int_ES]
mov esi,[ebp+Int_EDI]
call Int21hExtend_DS_ESI ;Extend [E]SI.
xor al,al ;Character to look for.
call Int21hStringLen ;Get length of this string.
inc ecx
mov es,fs:[EPSP_Struc.EPSP_TransProt]
push edi
rep movsb
pop edx
;
mov edi,offset Int21Buffer
mov es,cs:Int21hDSeg
mov ax,fs:[EPSP_Struc.EPSP_TransReal]
mov es:RealRegsStruc.Real_EDX[edi],0
mov es:RealRegsStruc.Real_EDI[edi],edx
mov es:RealRegsStruc.Real_DS[edi],ax
mov es:RealRegsStruc.Real_ES[edi],ax
mov eax,[ebp+Int_EAX]
mov es:RealRegsStruc.Real_EAX[edi],eax
mov bl,21h
sys IntXX
; return error status, MED 03/13/96
mov ax,WORD PTR es:RealRegsStruc.Real_EAX[edi]
mov w[ebp+Int_AX],ax
DOS4GExtend w[ebp+Int_EAX+2]
mov ax,es:RealRegsStruc.Real_Flags[edi]
and al,1
call Int21hAL2Carry ;Set carry.
ret
Int21hRenameFile endp
;------------------------------------------------------------------------------
;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?