dsxfork.esm

来自「开放源码的编译器open watcom 1.6.0版的源代码」· ESM 代码 · 共 180 行

ESM
180
字号
.387
.386p
		PUBLIC	RedirectInOut_
		PUBLIC	RestoreInOut_
		PUBLIC	_fork_
		EXTRN	__psp:BYTE
		EXTRN	DOSEnvFind_:BYTE
		EXTRN	RestoreHandlers_:BYTE
		EXTRN	GrabHandlers_:BYTE
DGROUP		GROUP	CONST,_BSS
CONST		SEGMENT	BYTE PUBLIC USE32 'DATA'
L$1:
    DB	43H, 4fH, 4dH, 53H, 50H, 45H, 43H, 0
L$2:
    DB	43H, 4fH, 4eH, 0

CONST		ENDS
_BSS		SEGMENT	BYTE PUBLIC USE32 'BSS'
    ORG 0
L$3    LABEL	BYTE
    ORG 2
L$4    LABEL	BYTE
    ORG 4
L$5    LABEL	BYTE
    ORG 6
_BSS		ENDS

_TEXT		SEGMENT	BYTE PUBLIC USE32 'CODE'
		ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP
RedirectInOut_:
    push        edx
    push        ecx
    push        ebx
    mov         ebx,0
    mov         ah,45H
    int         21H
    jb          L$6
    mov         word ptr DGROUP:L$3,ax
    mov         ebx,1
    mov         ah,45H
    int         21H
    jb          L$6
    mov         word ptr DGROUP:L$4,ax
    mov         edx,offset DGROUP:L$2
    mov         ax,3d02H
    int         21H
    jb          L$6
    mov         word ptr DGROUP:L$5,ax
    movzx       ebx,ax
    mov         ecx,0
    mov         ah,46H
    int         21H
    jb          L$6
    mov         ecx,1
    mov         ah,46H
    int         21H
    jb          L$6
    mov         ah,3eH
    int         21H
    jb          L$6
    mov         ax,0
L$6:
    cwde        
    clc         
    pop         ebx
    pop         ecx
    pop         edx
    ret         
RestoreInOut_:
    push        ecx
    push        ebx
    movzx       ebx,word ptr DGROUP:L$3
    mov         ecx,0
    mov         ah,46H
    int         21H
    jb          L$7
    mov         ah,3eH
    int         21H
    jb          L$7
    movzx       ebx,word ptr DGROUP:L$4
    mov         ecx,1
    mov         ah,46H
    int         21H
    jb          L$7
    mov         ah,3eH
    int         21H
    jb          L$7
    mov         ax,0
L$7:
    cwde        
    clc         
    pop         ebx
    pop         ecx
    ret         
load_and_exec_:
    push        ebp
    push        edi
    push        esi
    push        edx
    push        ecx
    push        ebx
    push        es
    mov         ebp,esp
    sub         esp,edx
    dec         esp
    mov         edi,esp
    mov         ax,ss
    mov         es,ax
    mov         esi,ebx
    mov         ecx,edx
    rep movsb   
    mov         byte ptr es:[edi],0dH
    test        edx,edx
    je          L$8
    mov         ecx,edx
    mov         ax,3700H
    int         21H
    pushw       2043H
    mov         bl,cl
    add         bl,3
    mov         bh,dl
    push        bx
    jmp         L$9
L$8:
    dec         esp
    mov         byte ptr [esp],0
L$9:
    mov         edi,esp
    sub         esp,18H
    mov         ebx,esp
    mov         dword ptr ss:[ebx],0
    mov         word ptr ss:4[ebx],0
    mov         dword ptr ss:6[ebx],edi
    mov         word ptr ss:0aH[ebx],ss
    mov         ax,word ptr DGROUP:__psp
    mov         dword ptr ss:0cH[ebx],5cH
    mov         word ptr ss:10H[ebx],ax
    mov         dword ptr ss:12H[ebx],6cH
    mov         word ptr ss:16H[ebx],ax
    mov         eax,offset DGROUP:L$1
    call        near ptr DOSEnvFind_
    mov         edx,eax
    mov         ax,4b00H
    int         21H
    jb          L$10
    mov         ax,0
L$10:
    cwde        
    clc         
    mov         esp,ebp
    pop         es
    pop         ebx
    pop         ecx
    pop         edx
    pop         esi
    pop         edi
    pop         ebp
    ret         
_fork_:
    push        ebx
    mov         ebx,eax
    call        near ptr RestoreHandlers_
    call        near ptr RedirectInOut_
    test        eax,eax
    jne         L$11
    call        near ptr load_and_exec_
    call        near ptr RestoreInOut_
L$11:
    push        eax
    call        near ptr GrabHandlers_
    pop         eax
    test        eax,eax
    je          L$12
    or          eax,0ffff0000H
L$12:
    pop         ebx
    ret         
_TEXT		ENDS
		END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?