⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guimouse.inc

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 INC
📖 第 1 页 / 共 5 页
字号:
;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 + -