int33h.asm

来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 813 行 · 第 1/2 页

ASM
813
字号
        push    edx
        push    esi
        push    edi
        push    ebp
        push    ds
        push    es
        mov     es,cs:Int33hDSeg
        mov     edi,offset Int33Buffer
        mov     es:RealRegsStruc.Real_EAX[edi],eax
        mov     bl,33h
        sys     IntXX
        mov     ebx,es:RealRegsStruc.Real_EBX[edi]
        pop     es
        pop     ds
        pop     ebp
        pop     edi
        pop     esi
        pop     edx
        pop     ecx
        pop     eax
        add     ebx,8+2         ;leave space for our stuff.
        jmp     int333_Done
        ;
int333_SaveState:       ;Preserve mouse driver state.
        ;
        push    eax
        push    ebx
        push    ecx
        push    edx
        push    esi
        push    edi
        push    ebp
        push    ds
        push    es
        push    fs
        ;
        push    eax
        xor     eax,eax
        mov     ax,es
        lsl     eax,eax
        cmp     eax,10000h
        jnc     int333_Use32Bit58
        movzx   edx,dx
int333_Use32Bit58:      pop     eax
        ;
        push    edx
        push    es
        mov     edi,offset Int33Buffer
        mov     es,cs:Int33hDseg
        assume es:_cwMain
        mov     fs,es:PSPSegment
        xor     edx,edx
        mov     es:[edi].RealRegsStruc.Real_EAX,eax
        mov     es:[edi].RealRegsStruc.Real_EDX,edx
        mov     ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
        mov     es:[edi].RealRegsStruc.Real_ES,ax
        assume es:nothing
        mov     bl,33h
        sys     IntXX
        mov     es:RealRegsStruc.Real_EAX[edi],15h
        mov     bl,33h
        sys     IntXX
        mov     ecx,es:RealRegsStruc.Real_EBX[edi]
        movzx   ecx,cx
        pop     es
        pop     edi
        ;
        mov     ds,cs:Int33hDDseg
        assume ds:_Int33h
        mov     eax,d[Int33hUserCode]
        mov     es:[edi],eax
        add     edi,4
        mov     ax,w[Int33hUserCode+4]
        mov     es:[edi],ax
        add     edi,2
        mov     ax,w[Int33hUserOK]
        mov     es:[edi],ax
        add     edi,2
        mov     ax,w[Int33hUserMask]
        mov     es:[edi],ax
        add     edi,2
        assume ds:nothing
        ;
        mov     ds,cs:Int33hDseg
        assume ds:_cwMain
        xor     esi,esi
        mov     ds,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
        assume ds:nothing
        cld
        rep     movsb
        pop     fs
        pop     es
        pop     ds
        pop     ebp
        pop     edi
        pop     esi
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        jmp     int333_Done
        ;
int333_ResState:        ;Restore mouse driver state.
        ;
        push    eax
        push    ebx
        push    ecx
        push    edx
        push    esi
        push    edi
        push    ebp
        push    ds
        push    es
        push    fs
        push    eax
        xor     eax,eax
        mov     ax,es
        lsl     eax,eax
        cmp     eax,10000h
        jnc     int333_Use32Bit59
        movzx   edx,dx
int333_Use32Bit59:      pop     eax
        ;
        push    eax
        push    edx
        push    es
        push    eax
        push    edx
        push    es
        mov     es,cs:Int33hDseg
        mov     edi,offset Int33Buffer
        mov     es:RealRegsStruc.Real_EAX[edi],15h
        mov     bl,33h
        sys     IntXX
        mov     ecx,es:RealRegsStruc.Real_EBX[edi]
        movzx   ecx,cx
        pop     ds
        pop     esi
        pop     eax
        ;
        mov     es,cs:Int33hDseg
        assume es:_cwMain
        mov     fs,es:PSPSegment
        xor     edi,edi
        mov     es,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
        assume es:nothing
        ;
        push    ds
        push    es
        mov     es,cs:Int33hDDSeg
        assume es:_Int33h
        mov     eax,[esi]
        mov     DWORD PTR es:[Int33hUserCode],eax
        add     esi,4
        mov     ax,[esi]
        mov     WORD PTR es:[Int33hUserCode+4],ax
        add     esi,2
        mov     ax,[esi]
        mov     WORD PTR es:[Int33hUserOK],ax
        add     esi,2
        mov     ax,[esi]
        mov     WORD PTR es:[Int33hUserMask],ax
        add     esi,2
        assume es:nothing
        pop     es
        pop     ds
        cld
        rep     movsb
        ;
        pop     es
        pop     edx
        pop     eax
        mov     edi,offset Int33Buffer
        mov     es,cs:Int33hDseg
        assume es:_cwMain
        xor     edx,edx
        mov     es:[edi].RealRegsStruc.Real_EAX,eax
        mov     es:[edi].RealRegsStruc.Real_EDX,edx
        mov     ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
        mov     es:[edi].RealRegsStruc.Real_ES,ax
        assume es:nothing
        mov     bl,33h
        sys     IntXX
        ;
        pop     fs
        pop     es
        pop     ds
        pop     ebp
        pop     edi
        pop     esi
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        jmp     int333_Done
        ;
int333_Done:    ;Now update stacked flags.
        ;
        push    eax
        push    ebx
        pushf
        pop     ax                      ;get new flags.
        push    ds
        mov     ds,cs:Int33hDSeg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        pop     ds
        jz      int333_Use32Bit8
        mov     bx,sp
        mov     bx,ss:[bx+(4+4)+(2+2)]          ;get origional flags.
        jmp     int333_Use16Bit8
int333_Use32Bit8:       mov     bx,ss:[esp+(4+4)+(4+4)]         ;get origional flags.
int333_Use16Bit8:       and     bx,0000011000000000b            ;retain IF.
        and     ax,1111100111111111b            ;lose IF.
        or      ax,bx                   ;get old IF.
        push    ds
        mov     ds,cs:Int33hDseg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        pop     ds
        jz      int333_Use32Bit9
        mov     bx,sp
        mov     ss:[bx+(4+4)+(2+2)],ax          ;modify stack flags.
        jmp     int333_Use16Bit9
int333_Use32Bit9:       mov     ss:[esp+(4+4)+(4+4)],ax         ;modify stack flags.
int333_Use16Bit9:
        pop     ebx
        pop     eax
        push    ds
        mov     ds,cs:Int33hDseg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        pop     ds
        jz      int333_Use32Bit10
        iret
int333_Use32Bit10:      ;
        iretd
        ;
int333_NotOurs: ;Not a function recognised by us so pass control to previous handler.
        ;
        push    ds
        mov     ds,cs:Int33hDSeg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        pop     ds
        jz      int333_Use32Bit11
        db 66h
        jmp     FWORD PTR cs:[OldInt33h]                ;pass it onto previous handler.
int333_Use32Bit11:      jmp     FWORD PTR cs:[OldInt33h]                ;pass it onto previous handler.
Int33h  endp


;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
MouseEvent      proc    far
        push    ax
        push    ds
        mov     ds,cs:Int33hDSeg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        pop     ds
        jz      int334_start32
        ;
        mov     ax,[si]         ;get stacked offset.
        mov     es:RealRegsStruc.Real_IP[di],ax
        mov     ax,2[si]
        mov     es:RealRegsStruc.Real_CS[di],ax
        add     es:RealRegsStruc.Real_SP[di],4
        jmp     int334_start0
        ;
int334_start32:
;       mov     ax,[esi]                ;get stacked offset.
        mov     ax,[si]         ;get stacked offset., MED 01/24/95

        mov     es:RealRegsStruc.Real_IP[edi],ax
;       mov     ax,2[esi]
        mov     ax,2[si]        ; MED 01/24/95

        mov     es:RealRegsStruc.Real_CS[edi],ax
        add     es:RealRegsStruc.Real_SP[edi],4
        ;
int334_start0:  pop     ax
        push    ds
        push    es
        push    fs
        push    gs
        pushad
        mov     ds,cs:Int33hDDSeg
        assume ds:_Int33h
        ;
        cmp     w[MouseEventStack+4],0
        jz      int334_ok
        mov     al,1
        call    bord33
int334_shit:    jmp     int334_shit
        mov     ax,-1
        mov     es,ax
        jmp     int334_exit
        ;
int334_ok:      cmp     w[Int33hUserOK],0
        jz      int334_exit
        ;
        mov     d[MouseEventStack],esp
        mov     w[MouseEventStack+4],ss
        mov     ax,ds
        mov     ss,ax
        mov     esp,offset MouseEventStack
        push    ds
        mov     ds,Int33hDSeg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:_Int33h
        pop     ds
        jz      int334_its32
        movzx   edi,di
int334_its32:   mov     eax,es:RealRegsStruc.Real_EAX[edi]
        movsx   eax,ax
        mov     ebx,es:RealRegsStruc.Real_EBX[edi]
        movsx   ebx,bx
        mov     ecx,es:RealRegsStruc.Real_ECX[edi]
        movsx   ecx,cx
        mov     edx,es:RealRegsStruc.Real_EDX[edi]
        movsx   edx,dx
        mov     esi,es:RealRegsStruc.Real_ESI[edi]
        movsx   esi,si
        mov     edi,es:RealRegsStruc.Real_EDI[edi]
        movsx   edi,di
        ;
        mov     ds,Int33hDSeg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        jz      int334_Use32Bit
        db 66h
        call    FWORD PTR cs:[Int33hUserCode]
        jmp     int334_OldStack
int334_Use32Bit:        call    FWORD PTR cs:[Int33hUserCode]
int334_OldStack:        ;
        lss     esp,FWORD PTR cs:[MouseEventStack]
        push    ds
        mov     ds,cs:Int33hDDSeg
        assume ds:_Int33h
        mov     w[MouseEventStack+4],0
        assume ds:nothing
        pop     ds
int334_Exit:    ;
        popad
        mov     ds,cs:Int33hDSeg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        pop     gs
        pop     fs
        pop     es
        pop     ds
        jz      int334_Use32Bit2
        iret
int334_Use32Bit2:       ;
        iretd
MouseEvent      endp


;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
Int33hDummy     proc    near
        push    ds
        mov     ds,cs:Int33hDSeg
        assume ds:_cwMain
        test    BYTE PTR SystemFlags,1
        assume ds:nothing
        pop     ds
        jz      int335_32bit
        db 66h
        retf
int335_32Bit:   ;
        retf
Int33hDummy     endp


;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
Bord33  proc    near
        push    ax
        push    dx
        mov     ah,al
        mov     dx,3dah
        in      al,dx
        mov     dl,0c0h
        mov     al,11h
        out     dx,al
        mov     al,ah
        out     dx,al
        mov     al,20h
        out     dx,al
        pop     dx
        pop     ax
        ret
Bord33  endp


Int33hEnd       label byte
_Int33h ends
        .286

⌨️ 快捷键说明

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