📄 guimouse.inc
字号:
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%ifdef __WIN32__
EXTSYM MinimizeWindow
%endif
lastmouseholded db 0
mousebuttonstat dw 0
MouseMoveOkay db 0
LastHoldEnable db 0
ProcessMouse:
; Process holds
mov al,[GUIHold]
cmp al,[LastHoldEnable]
je near .noholdnecessary
cmp byte[GUIHold],0
jne .noholda
mov ecx,0
mov edx,255
call Set_MouseXMax
mov ecx,0
mov edx,223
call Set_MouseYMax
.noholda
cmp byte[GUIHold],1
jne .nohold1
mov ecx,0
mov edx,255
call Set_MouseXMax
mov ecx,16
mov edx,223
call Set_MouseYMax
.nohold1
cmp byte[GUIHold],5
je .dohold5
cmp byte[GUIHold],2
jne .nohold2m
.dohold5
mov ecx,[GUIHoldXlimL]
mov edx,[GUIHoldXlimR]
call Set_MouseXMax
mov ecx,[GUIHoldYlim]
mov edx,[GUIHoldYlim]
call Set_MouseYMax
.nohold2m
cmp byte[GUIHold],3
jne .nohold3m
mov ecx,[GUIHoldXlimL]
mov edx,[GUIHoldXlimR]
call Set_MouseXMax
mov ecx,[GUIHoldYlim]
mov edx,[GUIHoldYlimR]
call Set_MouseYMax
.nohold3m
mov al,[GUIHold]
mov [LastHoldEnable],al
.noholdnecessary
mov byte[MouseMoveOkay],0
call Get_MouseData
mov [mousebuttonstat],bx
cmp byte[lastmouseholded],0
je .noprevhold
test bx,01h
jnz .noprevhold
mov byte[lastmouseholded],0
mov cx,[GUImouseposx]
mov dx,[GUImouseposy]
call Set_MousePosition
.noprevhold
cmp byte[mousewrap],1
je near ProcessMouseWrap
call Get_MouseData
cmp word[GUImouseposx],cx
je .zero2
mov byte[MouseMoveOkay],1
.zero2
cmp word[GUImouseposy],dx
je .zero3
mov byte[MouseMoveOkay],1
.zero3
mov word[GUImouseposx],cx
test word[GUImouseposx],8000h
jz .nowrapleft
mov word[GUImouseposx],0
.nowrapleft
cmp word[GUImouseposx],255
jbe .nowrapright
mov word[GUImouseposx],255
.nowrapright
mov word[GUImouseposy],dx
test word[GUImouseposy],8000h
jz .nowrapup
mov word[GUImouseposy],0
.nowrapup
cmp word[GUImouseposy],223
jbe .nowrapdown
mov word[GUImouseposy],100
.nowrapdown
jmp ProcessMouseButtons
ProcessMouseWrap:
call Get_MousePositionDisplacement
add word[GUImouseposx],cx
.again
test word[GUImouseposx],8000h
jz .nowrapleft
add word[GUImouseposx],256
jmp .again
.nowrapleft
cmp word[GUImouseposx],255
jbe .nowrapright
sub word[GUImouseposx],256
jmp .again
.nowrapright
add word[GUImouseposy],dx
.again2
test word[GUImouseposy],8000h
jz .nowrapup
add word[GUImouseposy],224
jmp .again2
.nowrapup
cmp word[GUImouseposy],223
jbe .nowrapdown
cmp byte[GUIHold],1
jne .nohold
sub word[GUImouseposy],224-16
jmp .again2
.nohold
sub word[GUImouseposy],224
jmp .again2
.nowrapdown
cmp dx,0
jne .nozero
cmp cx,0
je .zero
.nozero
mov byte[MouseMoveOkay],1
.zero
ProcessMouseButtons:
cmp byte[MouseMoveOkay],1
jne .zero
mov byte[GUIOnMenuItm],0
mov ax,[GUImouseposx]
cmp ax,[GUIMenuL]
jbe .zero
cmp ax,[GUIMenuR]
jae .zero
mov ax,[GUImouseposy]
cmp ax,18
jbe .zero
cmp ax,[GUIMenuD]
jae .zero
; Mouse Menu
xor dx,dx
sub ax,18
mov bx,10
div bx
and eax,0FFh
mov ebx,[GUICYLocPtr]
mov byte[GUIOnMenuItm],2
cmp byte[eax+ebx+1],0
je .zero
mov byte[GUIcrowpos],al
mov byte[GUIOnMenuItm],1
.zero
; Check if mouse is clicked on menu
mov bx,[mousebuttonstat]
cmp byte[GUIClick],1
jne .norclick2
test bx,02h
jz .norclick
cmp byte[romloadskip],0
jne .norclick2
cmp byte[MousePRClick],0
jne .norclick2
mov byte[GUIQuit],2
.norclick
mov byte[MousePRClick],0
.norclick2
test bx,01h
jz near .notclicked
cmp byte[GUIpclicked],1
je near .noclick
cmp byte[GUIOnMenuItm],2
je near .noclick
cmp byte[GUIOnMenuItm],1
jne .nomenuitem
call GUITryMenuItem
jmp .noclick
.nomenuitem
cmp word[GUImouseposy],3
jb near .noclickedw
cmp word[GUImouseposy],14
ja near .noclickedw
cmp word[GUImouseposx],230
jb near .noclickedw
cmp word[GUImouseposx],233
jb near .noclickedw
cmp word[GUImouseposx],242
ja .notfound7
%ifdef __LINUX__
jmp .clickawn
%endif
cmp word[GUImouseposy],8
jb .clickawn
cmp word[GUImouseposy],8
ja .clickawn2
.clickawn
mov byte[GUIcwinpress],1
jmp .noclick
.clickawn2
mov byte[GUIcwinpress],3
jmp .noclick
.notfound7
cmp word[GUImouseposx],244
jb near .noclickedw
cmp word[GUImouseposx],253
ja .notfound8
mov byte[GUIcwinpress],2
jmp .noclick
.notfound8
.noclickedw
cmp word[GUImouseposy],15
ja near .nomenu
cmp word[GUImouseposy],3
jb near .noclicked
cmp word[GUImouseposy],13
ja near .noclicked
; GUIDMHelp 4,12,GUIMenuItem+6,1
cmp word[GUImouseposx],4
jb near .noclicked
cmp word[GUImouseposx],12
ja .notfound
mov byte[GUIcmenupos],1
mov byte[GUIcrowpos],0
jmp .noclick
.notfound
; GUIDMHelp 17,47,GUIMenuItem,2
cmp word[GUImouseposx],17
jb near .noclicked
cmp word[GUImouseposx],47
ja .notfound2
mov byte[GUIcmenupos],2
mov byte[GUIcrowpos],0
jmp .noclick
.notfound2
; GUIDMHelp 52,94,GUIMenuItem+7,3
cmp word[GUImouseposx],52
jb near .noclicked
cmp word[GUImouseposx],94
ja .notfound3
mov byte[GUIcmenupos],3
mov byte[GUIcrowpos],0
jmp .noclick
.notfound3
; GUIDMHelp 99,135,GUIMenuItem+14,4
cmp word[GUImouseposx],99
jb near .noclicked
cmp word[GUImouseposx],135
ja .notfound4
mov byte[GUIcmenupos],4
mov byte[GUIcrowpos],0
jmp .noclick
.notfound4
; GUIDMHelp 140,188,GUIMenuItem+21,5
cmp word[GUImouseposx],140
jb near .noclicked
cmp word[GUImouseposx],188
ja .notfound5
mov byte[GUIcmenupos],5
mov byte[GUIcrowpos],0
jmp .noclick
.notfound5
; GUIDMHelp 193,223,GUIMenuItem+29,6
cmp word[GUImouseposx],193
jb near .noclicked
cmp word[GUImouseposx],223
ja .notfound6
mov byte[GUIcmenupos],6
mov byte[GUIcrowpos],0
jmp .noclick
.notfound6
jmp .noclick
.noclicked
; cmp byte[OSPort],3
; jne .noclick
%ifdef __MSDOS__
jmp .noclick
%else
mov byte[GUIpclicked],1
mov byte[GUIHold],255
mov eax,[GUImouseposy]
mov [GUIHoldYlim],eax
mov eax,[GUImouseposx]
mov [GUIHoldXlimL],eax
call MouseWindow
jmp .noclick
%endif
.nomenu
cmp byte[GUIcmenupos],0
je near .checkmenuboxclick
mov al,[GUIcmenupos]
mov [GUIpmenupos],al
mov byte[GUIcmenupos],0
.noclick
mov byte[GUIpclicked],1
xor eax,eax
mov al,[GUIwinptr]
dec eax
xor ebx,ebx
mov bl,[GUIwinorder+eax]
cmp byte[GUIHold],2
je .hold2
cmp byte[GUIHold],3
je near .hold3
cmp byte[GUIHold],4
je near .hold4
cmp byte[GUIHold],5
je near .hold5
cmp byte[GUIHold],1
je near .hold
cmp byte[GUIHold],255
je .holded
mov byte[GUICHold],0
ret
.holded
mov eax,[GUIHoldYlim]
mov [GUImouseposy],eax
mov eax,[GUIHoldXlimL]
mov [GUImouseposx],eax
mov cx,[GUIHoldXlimL]
mov dx,[GUIHoldYlim]
call Set_MousePosition
ret
.hold2
; Slide Bar Hold
mov eax,[GUIHoldYlim]
mov [GUImouseposy],eax
mov ebx,[GUImouseposx]
mov eax,[GUIHoldXlimL]
cmp ebx,eax
jnl .noless
mov [GUImouseposx],eax
.noless
mov eax,[GUIHoldXlimR]
cmp ebx,eax
jng .nogreat
mov [GUImouseposx],eax
.nogreat
mov byte[lastmouseholded],1
jmp DisplayGUIOptnsClick
.hold3
; Box Hold
mov ebx,[GUIHoldYlim]
cmp ebx,[GUImouseposy]
jl .boxhold1
mov [GUImouseposy],ebx
.boxhold1
mov ebx,[GUIHoldXlimL]
cmp ebx,[GUImouseposx]
jl .boxhold2
mov [GUImouseposx],ebx
.boxhold2
mov ebx,[GUIHoldYlimR]
cmp ebx,[GUImouseposy]
jg .boxhold3
mov [GUImouseposy],ebx
.boxhold3
mov ebx,[GUIHoldXlimR]
cmp ebx,[GUImouseposx]
jg .boxhold4
mov [GUImouseposx],ebx
.boxhold4
mov byte[lastmouseholded],1
jmp GUIWindowMove
.hold4
mov eax,[GUImouseposx]
sub eax,[GUIwinposx+ebx*4]
mov edx,[GUImouseposy]
sub edx,[GUIwinposy+ebx*4]
cmp eax,[GUIHoldXlimL]
jl near .nobhold
cmp edx,[GUIHoldYlim]
jl near .nobhold
cmp eax,[GUIHoldXlimR]
jg near .nobhold
cmp edx,[GUIHoldYlimR]
jg near .nobhold
mov al,[GUICBHold2]
mov [GUICBHold],al
ret
.nobhold
mov byte[GUICBHold],0
ret
.hold5
; Slide Bar Hold
mov eax,[GUIHoldYlim]
mov [GUImouseposy],eax
mov ebx,[GUImouseposx]
mov eax,[GUIHoldXlimL]
cmp ebx,eax
jnl .nolessa
mov [GUImouseposx],eax
.nolessa
mov eax,[GUIHoldXlimR]
cmp ebx,eax
jng .nogreata
mov [GUImouseposx],eax
.nogreata
mov byte[lastmouseholded],1
jmp DisplayGUISoundClick
.hold
cmp word[GUImouseposy],16
jge .noover
test byte[mousewrap],1
jz .nomwrap
add word[GUImouseposy],224-16
jmp .hold
.nomwrap
mov word[GUImouseposy],16
.noover
mov cx,word[GUImouseposy]
sub cx,[GUIHoldy]
add cx,[GUIHoldym]
movsx ecx,cx
xor eax,eax
mov al,[GUIwinptr]
dec eax
xor ebx,ebx
mov bl,[GUIwinorder+eax]
mov [GUIwinposy+ebx*4],ecx
mov cx,word[GUImouseposx]
sub cx,[GUIHoldx]
add cx,[GUIHoldxm]
movsx ecx,cx
mov [GUIwinposx+ebx*4],ecx
ret
.notclicked
mov byte[GUICHold],0
mov byte[GUIpclicked],0
mov byte[GUIHold],0
; cmp byte[OSPort],3
; jne .notwinpressa
%ifdef __LINUX__
cmp byte[GUIcwinpress],1
jne .notwinpressa
mov byte[GUIcwinpress],0
cmp word[GUImouseposy],3
jb .notwinpressa
cmp word[GUImouseposy],13
ja .notwinpressa
cmp word[GUImouseposx],233
jb .notwinpressa
cmp word[GUImouseposx],242
ja .notwinpressa
call SwitchFullScreen
ret
%endif
%ifdef __WIN32__
cmp byte[GUIcwinpress],1
jne .notwinpressa
mov byte[GUIcwinpress],0
cmp word[GUImouseposy],3
jb .notwinpressa
cmp word[GUImouseposy],7
ja .notwinpressa
cmp word[GUImouseposx],233
jb .notwinpressa
cmp word[GUImouseposx],242
ja .notwinpressa
call SwitchFullScreen
ret
%endif
.notwinpressa
; cmp byte[OSPort],3
; jne .notwinpressb
%ifndef __MSDOS__
cmp byte[GUIcwinpress],2
jne .notwinpressb
mov byte[GUIcwinpress],0
cmp word[GUImouseposy],3
jb .notwinpressb
cmp word[GUImouseposy],13
ja .notwinpressb
cmp word[GUImouseposx],244
jb .notwinpressb
cmp word[GUImouseposx],253
ja .notwinpressb
mov byte[GUIQuit],1
ret
.notwinpressb
;cmp byte[OSPort],3
;jne .notwinpressc
cmp byte[GUIcwinpress],3
jne .notwinpressc
mov byte[GUIcwinpress],0
cmp word[GUImouseposy],9
jb .notwinpressc
cmp word[GUImouseposy],13
ja .notwinpressc
cmp word[GUImouseposx],233
jb .notwinpressc
cmp word[GUImouseposx],242
ja .notwinpressc
%endif
%ifdef __WIN32__
pushad
call MinimizeWindow
popad
%endif
%ifndef __MSDOS__
ret
%endif
.notwinpressc
; ButtonProcess
cmp byte[GUICBHold],1
je near GUILoadData
cmp byte[GUICBHold],2
je near GUIProcReset
cmp byte[GUICBHold],3
je near GUIProcReset
cmp byte[GUICBHold],4
je near GUIProcVideo
cmp byte[GUICBHold],10
je near GUIProcStates
cmp byte[GUICBHold],11
je near GUIProcStates
cmp byte[GUICBHold],5
je near CheatCodeRemove
cmp byte[GUICBHold],6
je near CheatCodeToggle
cmp byte[GUICBHold],7
je near CheatCodeSave
cmp byte[GUICBHold],8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -