📄 guikeys.inc
字号:
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach );;http://www.zsnes.com;http://sourceforge.net/projects/zsnes;https://zsnes.bountysource.com;;This program is free software; you can redistribute it and/or;modify it under the terms of the GNU General Public License;version 2 as published by the Free Software Foundation.;;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.; GUI Keyboard Routines%macro GUIqcheckkeys 1 cmp byte[pressed+%1],1 jne %%skip mov dword[GUIfirstkey],1%%skip%endmacro%macro GUIqcheckkeys2 2 mov eax,%1 cmp byte[pressed+eax],1 jne %%skip cmp byte[GUIJoyPadnk+%2],2 je %%skip mov dword[GUIfirstkey],1%%skip%endmacro%macro GUIgetprkeys 2 cmp byte[pressed+%1],1 je %%okay cmp byte[pressed+%1],2 jne %%nopr cmp dword[GUIfirstkey],1 je %%nopr cmp dword[GUIlastkey],%1 jne %%nopr jmp %%skipnext%%okay mov dword[GUInextkeydelay],10%%skipnext mov dword[GUIlastkey],%1 mov byte[pressed+%1],2 cmp dword[GUIkeydelay],0 jne near .done mov eax,[GUInextkeydelay] mov [GUIkeydelay],eax mov dword[GUInextkeydelay],2 mov eax,%2 jmp .done%%nopr%endmacro%macro GUIgetprkeysb 2 cmp byte[pressed+%1],1 jne %%nopr cmp byte[GUIescpress],1 je %%nopr2 mov byte[pressed+%1],2 mov eax,%2 jmp .done%%nopr cmp byte[pressed+%1],0 jne %%nopr2 mov byte[GUIescpress],0%%nopr2%endmacro%macro GUIgetprkeys2 3 mov ebx,%1 cmp byte[pressed+ebx],0 jne %%pressed mov byte[GUIJoyPadnk+%3],0 jmp %%nopr%%pressed cmp byte[GUIJoyPadnk+%3],2 je %%secondpress cmp byte[pressed+ebx],1 je %%okay%%secondpress cmp dword[GUIfirstkey],1 je %%nopr cmp dword[GUIlastkey],ebx jne %%nopr jmp %%skipnext%%okay mov dword[GUInextkeydelay],10%%skipnext mov [GUIlastkey],ebx mov byte[GUIJoyPadnk+%3],2 cmp dword[GUIkeydelay],0 jne near .done mov eax,[GUInextkeydelay] mov [GUIkeydelay],eax mov byte[GUIDelayB],5 mov dword[GUInextkeydelay],2 mov eax,%2 jmp .done%%nopr%endmacro%macro GUIkeystoggleoptn 2 cmp %1,%2 jne %%set xor %1,%2 jmp %%clear%%set mov %1,%2%%clear ret%endmacro%macro GUIKeyCheckbox 2 cmp dh,%2 jne %%nohotkey xor byte[%1],1%%nohotkey%endmacro%macro GUIKeyButtonHole 3 cmp dh,%3 jne %%nohotkey mov byte[%1],%2%%nohotkey%endmacro%macro ToUpperASM 0 cmp dh,'a' jb %%notlcase cmp dh,'z' ja %%notlcase sub dh,'a'-'A'%%notlcase%endmacro%macro FilterExcl2 1-* ; bytes to zero%rep (%0) mov byte[%1],0 %rotate 1%endrep%endmacro%ifdef __MSDOS__%macro DOSClearScreenKey 0 call DOSClearScreen push eax push ecx mov eax,[vidbufferofsb] mov ecx,288*128%%sloop mov dword[eax],0 add eax,4 dec ecx jnz %%sloop pop ecx pop eax%endmacro%endifSECTION .bssGUIfirstkey resd 1GUIlastkey resd 1NEWSYM GUIkeydelay, resd 1NEWSYM GUIkeydelay2, resd 1GUInextkeydelay resd 1GUIJoyPadnk resb 8NEWSYM GUIDelayB, resb 1UseExtKey resb 1SECTION .textGUIgetcurrentinput: mov byte[UseExtKey],0 xor cx,cx.getnextkey call Check_Key or al,al jz .nokeyd call Get_Key cmp cl,0 jne .nostorekey mov ch,al.nostorekey xor cl,cl cmp al,0 jne .noextkey call Get_Key mov [UseExtKey],al xor al,al mov ch,al mov cl,1.noextkey; jmp .getnextkey.nokeyd mov dh,ch mov byte[GUIDelayB],0 ; Convert pressed to keys mov dword[GUIfirstkey],0%ifdef __UNIXSDL___ GUIqcheckkeys 90 ; UP GUIqcheckkeys 96 ; DOWN GUIqcheckkeys 92 ; LEFT GUIqcheckkeys 94 ; RIGHT GUIqcheckkeys 89 ; HOME GUIqcheckkeys 91 ; PGUP GUIqcheckkeys 95 ; END GUIqcheckkeys 97 ; PGDOWN%endif GUIqcheckkeys 72 ; NUMPAD STUFF GUIqcheckkeys 80 GUIqcheckkeys 75 GUIqcheckkeys 77 GUIqcheckkeys 73 GUIqcheckkeys 81 GUIqcheckkeys 71 GUIqcheckkeys 79 GUIqcheckkeys 1 GUIqcheckkeys 1Ch%ifndef __MSDOS__ GUIqcheckkeys 0C8h GUIqcheckkeys 0D0h GUIqcheckkeys 0CBh GUIqcheckkeys 0CDh GUIqcheckkeys 0C9h GUIqcheckkeys 0D1h GUIqcheckkeys 0C7h GUIqcheckkeys 0CFh GUIqcheckkeys 09Ch%endif.notwinport cmp byte[JoyPad1Move],0 je near .nopad1 push edx call JoyRead pop edx GUIqcheckkeys2 [pl1upk],0 GUIqcheckkeys2 [pl1downk],1 GUIqcheckkeys2 [pl1leftk],2 GUIqcheckkeys2 [pl1rightk],3 GUIqcheckkeys2 [pl1Lk],4 GUIqcheckkeys2 [pl1Rk],5 GUIqcheckkeys2 [pl1Bk],6 GUIqcheckkeys2 [pl1Ak],7.nopad1 xor al,al%ifdef __UNIXSDL__ GUIgetprkeys 90,90 ; UP GUIgetprkeys 96,96 ; DOWN GUIgetprkeys 92,92 ; LEFT GUIgetprkeys 94,94 ; RIGHT GUIgetprkeys 89,89 ; HOME GUIgetprkeys 91,91 ; PGUP GUIgetprkeys 95,95 ; END GUIgetprkeys 97,97 ; PGDOWN GUIgetprkeys 72,72 ; KP8 GUIgetprkeys 80,80 ; KP2 GUIgetprkeys 75,75 ; KP4 GUIgetprkeys 77,77 ; KP6 GUIgetprkeys 71,71 ; KP7 GUIgetprkeys 79,79 ; KP9 GUIgetprkeys 81,81 ; KP1 GUIgetprkeys 73,73 ; KP3%else GUIgetprkeys 72,72 GUIgetprkeys 80,80 GUIgetprkeys 75,75 GUIgetprkeys 77,77 GUIgetprkeys 71,71 GUIgetprkeys 79,79 GUIgetprkeys 81,81 GUIgetprkeys 73,73%endif GUIgetprkeysb 1,27 GUIgetprkeys 1Ch,13 mov cl,[UseExtKey] cmp cl,72 je .okayextk cmp cl,80 jne .notextkb.okayextk mov al,cl.notextkb%ifdef __UNIXSDL__ GUIgetprkeys 90,90 ; UP GUIgetprkeys 96,96 ; DOWN GUIgetprkeys 92,92 ; LEFT GUIgetprkeys 94,94 ; RIGHT GUIgetprkeys 89,89 ; HOME GUIgetprkeys 91,91 ; PGUP GUIgetprkeys 95,95 ; END GUIgetprkeys 97,97 ; PGDOWN GUIgetprkeys 72,72 ; KP8 GUIgetprkeys 80,80 ; KP2 GUIgetprkeys 75,75 ; KP4 GUIgetprkeys 77,77 ; KP6 GUIgetprkeys 71,71 ; KP7 GUIgetprkeys 79,79 ; KP9 GUIgetprkeys 81,81 ; KP1 GUIgetprkeys 73,73 ; KP3 GUIgetprkeys 09Ch,13 ; ENTER%endif%ifdef __WIN32__ ;GUIgetprkeys 0C8h,72 ;GUIgetprkeys 0D0h,80 GUIgetprkeys 0CBh,75 GUIgetprkeys 0CDh,77 GUIgetprkeys 0C7h,71 GUIgetprkeys 0CFh,79 GUIgetprkeys 0D1h,81 GUIgetprkeys 0C9h,73 GUIgetprkeys 09Ch,13%endif;.notwinport2 cmp byte[JoyPad1Move],0 je near .nopad1b GUIgetprkeys2 [pl1upk],72,0 GUIgetprkeys2 [pl1downk],80,1 GUIgetprkeys2 [pl1leftk],75,2 GUIgetprkeys2 [pl1rightk],77,3 GUIgetprkeys2 [pl1Lk],73,4 GUIgetprkeys2 [pl1Rk],81,5 GUIgetprkeys2 [pl1Bk],27,6 GUIgetprkeys2 [pl1Ak],13,7.nopad1b cmp dh,' ' jne .notspace mov al,' '.notspace mov dword[GUInextkeydelay],10 mov dword[GUIkeydelay],0.done cmp byte[GUIcmenupos],0 jne near .processmenu mov dl,al xor eax,eax mov al,[GUIwinptr] cmp dl,27 jne .noclosewin or eax,eax jz near .runprog.noclosewin dec eax xor ebx,ebx mov bl,[GUIwinorder+eax] cmp ebx,13 jne .notcskeys cmp byte[CheatWinMode],1 ja .avoidesc.notcskeys cmp dl,27 je near .closewin.avoidesc mov al,dl cmp ebx,1 je near GUILoadKeys cmp ebx,2 je near GUIStateSelKeys cmp ebx,3 je near GUIInputKeys cmp ebx,4 je near GUIOptionKeys cmp ebx,5 je near GUIVideoKeys cmp ebx,6 je near GUISoundKeys cmp ebx,7 je near GUICheatKeys cmp ebx,10 je near GUIGUIOptnsKeys cmp ebx,11 je near GUIAboutKeys cmp ebx,12 je near GUIResetKeys cmp ebx,13 je near GUICheatSearchKeys cmp ebx,14 je near GUIStateKeys cmp ebx,15 je near GUIMovieKeys cmp ebx,16 je near GUIComboKeys cmp ebx,17 je near GUIAddonKeys cmp ebx,18 je near GUIChipKeys cmp ebx,19 je near GUIPathKeys cmp ebx,20 je near GUISaveKeys cmp ebx,21 je near GUISpeedKeys cmp ebx,8 je near GUIGetInputLine ret.runprog cmp byte[romloadskip],0 jne .noquit mov byte[GUIQuit],2.noquit ret.closewin ; close window mov byte[GUIwinorder+eax],0 mov byte[GUIwinactiv+ebx],0 dec byte[GUIwinptr] cmp byte[GUIwinptr],0 jne .nowinopen mov al,[GUIpmenupos] mov [GUIcmenupos],al.nowinopen ret.processmenu ToUpperASM cmp dh,'X' ; Main Menu Hotkeys jne .noclose mov byte[GUIcmenupos],0 mov byte[GUIcrowpos],0.noclose cmp dh,'R' jne .norecent mov byte[GUIcmenupos],1 mov byte[GUIcrowpos],0.norecent cmp dh,'G' jne .nogame mov byte[GUIcmenupos],2 mov byte[GUIcrowpos],0.nogame cmp dh,'C' jne .noconfig mov byte[GUIcmenupos],3 mov byte[GUIcrowpos],0.noconfig cmp dh,'H' jne .nocheat mov byte[GUIcmenupos],4 mov byte[GUIcrowpos],0.nocheat cmp dh,'N' jne .nonetplay mov byte[GUIcmenupos],5 mov byte[GUIcrowpos],0.nonetplay cmp dh,'M' jne .nomisc mov byte[GUIcmenupos],6 mov byte[GUIcrowpos],0.nomisc cmp byte[GUIcmenupos],1 ; Recently Played Hotkeys jne near .noquickmenu cmp dh,'1' jne .no1 mov byte[GUIcrowpos],0.no1 cmp dh,'2' jne .no2 mov byte[GUIcrowpos],1.no2 cmp dh,'3' jne .no3 mov byte[GUIcrowpos],2.no3 cmp dh,'4' jne .no4 mov byte[GUIcrowpos],3.no4 cmp dh,'5' jne .no5 mov byte[GUIcrowpos],4.no5 cmp dh,'6' jne .no6 mov byte[GUIcrowpos],5.no6 cmp dh,'7' jne .no7 mov byte[GUIcrowpos],6.no7 cmp dh,'8' jne .no8 mov byte[GUIcrowpos],7.no8 cmp dh,'9' jne .no9 mov byte[GUIcrowpos],8.no9 cmp dh,'0' jne .no0 mov byte[GUIcrowpos],9.no0 cmp dh,'F' jne .nof mov byte[GUIcrowpos],11.nof cmp dh,'L' jne .nol mov byte[GUIcrowpos],12.nol.noquickmenu ; Game Hotkeys cmp byte[GUIcmenupos],2 jne near .noloadmenu cmp dh,'L' jne .noll mov byte[GUIcrowpos],0.noll cmp dh,'E' jne .nor mov byte[GUIcrowpos],2.nor cmp dh,'S' jne .nos mov byte[GUIcrowpos],4.nos cmp dh,'O' jne .noo mov byte[GUIcrowpos],5.noo cmp dh,'P' jne .nop mov byte[GUIcrowpos],6.nop cmp dh,'Q' jne .noq mov byte[GUIcrowpos],8.noq.noloadmenu ; Config Hotkeys cmp byte[GUIcmenupos],3 jne near .noconfigmenu cmp dh,'I' jne .noin mov byte[GUIcrowpos],0.noin cmp dh,'D' jne .noind mov byte[GUIcrowpos],2.noind cmp dh,'F' jne .noinc mov byte[GUIcrowpos],3.noinc cmp dh,'O' jne .noino mov byte[GUIcrowpos],5.noino cmp dh,'V' jne .noinv mov byte[GUIcrowpos],6.noinv cmp dh,'S' jne .noins mov byte[GUIcrowpos],7.noins cmp dh,'P' jne .noinp mov byte[GUIcrowpos],8.noinp cmp dh,'A' jne .noina mov byte[GUIcrowpos],9.noina cmp dh,'E' jne .noine mov byte[GUIcrowpos],10.noine.noconfigmenu ; Cheat Hotkeys cmp byte[GUIcmenupos],4 jne near .nocheatmenu cmp dh,'A' jne .noa mov byte[GUIcrowpos],0.noa cmp dh,'B' jne .nob mov byte[GUIcrowpos],1.nob cmp dh,'S' jne .nos2 mov byte[GUIcrowpos],2.nos2.nocheatmenu ; Misc Hotkeys cmp byte[GUIcmenupos],6 jne near .nomiscmenu cmp dh,'K' jne .nomk mov byte[GUIcrowpos],0.nomk cmp dh,'U' jne .nomu mov byte[GUIcrowpos],1.nomu cmp dh,'O' jne .nomo mov byte[GUIcrowpos],2.nomo cmp dh,'E' jne .nome mov byte[GUIcrowpos],3.nome cmp dh,'S' jne .noms mov byte[GUIcrowpos],4.noms cmp dh,'A' jne .noma mov byte[GUIcrowpos],6.noma.nomiscmenu cmp byte[romloadskip],0 jne .dontquit cmp al,27 jne .noexit mov byte[GUIQuit],2.noexit.dontquit cmp al,13 jne .noenter call GUITryMenuItem.noenter%ifdef __UNIXSDL__ cmp al,92 je .leftpressed cmp dword[numlockptr],1 je .noleft cmp al,75 jne .noleft.leftpressed%else cmp al,75 jne .noleft%endif mov byte[GUIcrowpos],0 cmp byte[GUIcmenupos],1 jbe .left dec byte[GUIcmenupos] jmp .noleft.left mov byte[GUIcmenupos],6.noleft%ifdef __UNIXSDL__ cmp al,94 je .rightpressed cmp dword[numlockptr],1 je .noright cmp al,77 jne .noright.rightpressed%else cmp al,77 jne .noright%endif mov byte[GUIcrowpos],0 inc byte[GUIcmenupos] cmp byte[GUIcmenupos],7 jne .noright mov byte[GUIcmenupos],1.noright cmp byte[GUIcmenupos],0 je near .noupdown%ifdef __UNIXSDL__ cmp al,96 je .downpressed cmp dword[numlockptr],1 je .nodown cmp al,80 jne .nodown.downpressed%else cmp al,80 jne .nodown%endif xor eax,eax mov al,[GUIcrowpos] mov ebx,[GUICYLocPtr] cmp byte[eax+ebx+1],2 jne .nobottom mov byte[GUIcrowpos],0 jmp .nokey.nobottom inc eax cmp byte[eax+ebx+1],0 je .nobottom mov [GUIcrowpos],al jmp .nokey.nodown%ifdef __UNIXSDL__ cmp al, 90 je .uppressed cmp dword[numlockptr],1 je .noup cmp al,72 jne .noup.uppressed%else cmp al,72 jne .noup%endif xor eax,eax mov al,[GUIcrowpos] mov ebx,[GUICYLocPtr] or al,al jz .top cmp byte[eax+ebx+1],3 jne .notop.top mov al,[ebx] mov [GUIcrowpos],al jmp .nokey.notop dec eax cmp byte[eax+ebx+1],0 je .notop mov [GUIcrowpos],al jmp .nokey.noup.noupdown.nokey ret%macro KeyTabInc 1-* ; tab arrays
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -