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 + -
显示快捷键?