2960 lines
52 KiB
PHP
2960 lines
52 KiB
PHP
;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
|
|
%endif
|
|
|
|
SECTION .bss
|
|
GUIfirstkey resd 1
|
|
GUIlastkey resd 1
|
|
NEWSYM GUIkeydelay, resd 1
|
|
NEWSYM GUIkeydelay2, resd 1
|
|
GUInextkeydelay resd 1
|
|
GUIJoyPadnk resb 8
|
|
NEWSYM GUIDelayB, resb 1
|
|
UseExtKey resb 1
|
|
|
|
SECTION .text
|
|
|
|
GUIgetcurrentinput:
|
|
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
|
|
push edx
|
|
%rep %0
|
|
xor edx,edx
|
|
mov eax,[%1]
|
|
div dword[%1+4]
|
|
mov [%1],edx
|
|
%rotate 1
|
|
or [%1],eax
|
|
cmp eax,1
|
|
je %%exit
|
|
%rotate -1
|
|
sub eax,[%1]
|
|
adc dword[%1],0
|
|
jnz %%exit
|
|
%rotate 1
|
|
%endrep
|
|
%%exit
|
|
pop edx
|
|
%endmacro
|
|
|
|
GUIInputKeys:
|
|
ToUpperASM
|
|
cmp dh,9
|
|
jne .notab
|
|
KeyTabInc GUIInputTabs
|
|
mov byte[GUIFreshInputSelect],1
|
|
.notab
|
|
GUIKeyCheckbox GameSpecificInput,'G'
|
|
GUIKeyCheckbox AllowUDLR,'A'
|
|
GUIKeyCheckbox Turbo30hz,'T'
|
|
cmp dh,'U'
|
|
jne .nousepl34
|
|
xor byte[pl12s34],1
|
|
mov byte[MultiTap],1
|
|
cmp byte[pl12s34],1
|
|
je .nomtap
|
|
cmp byte[pl3contrl],0
|
|
jne .mtap
|
|
cmp byte[pl4contrl],0
|
|
jne .mtap
|
|
cmp byte[pl5contrl],0
|
|
jne .mtap
|
|
.nomtap
|
|
mov byte[MultiTap],0
|
|
.mtap
|
|
.nousepl34
|
|
%ifdef __MSDOS__
|
|
GUIKeyCheckbox SidewinderFix,'S'
|
|
cmp dh,'J'
|
|
jne .nop209
|
|
cmp byte[cplayernum],0
|
|
jne .nopl1
|
|
GUIKeyCheckbox pl1p209,'J'
|
|
jmp .nopl5
|
|
.nopl1
|
|
cmp byte[cplayernum],1
|
|
jne .nopl2
|
|
GUIKeyCheckbox pl2p209,'J'
|
|
jmp .nopl5
|
|
.nopl2
|
|
cmp byte[cplayernum],2
|
|
jne .nopl3
|
|
GUIKeyCheckbox pl3p209,'J'
|
|
jmp .nopl5
|
|
.nopl3
|
|
cmp byte[cplayernum],3
|
|
jne .nopl4
|
|
GUIKeyCheckbox pl4p209,'J'
|
|
jmp .nopl5
|
|
.nopl4
|
|
cmp byte[cplayernum],4
|
|
jne .nopl5
|
|
GUIKeyCheckbox pl5p209,'J'
|
|
.nopl5
|
|
call SetDevice
|
|
.nop209
|
|
%endif
|
|
ret
|
|
|
|
GUITCPIPKeys:
|
|
ret
|
|
|
|
GUIOptionKeys:
|
|
ToUpperASM
|
|
cmp byte[ShowMMXSupport],1
|
|
jne .nommxcopy
|
|
GUIKeyCheckbox MMXSupport,'M' ; Checkboxes
|
|
.nommxcopy
|
|
GUIKeyButtonHole ScreenShotFormat,0,'P'
|
|
%ifndef NO_PNG
|
|
GUIKeyButtonHole ScreenShotFormat,1,'G'
|
|
%endif
|
|
GUIKeyCheckbox newengen, 'N'
|
|
GUIKeyCheckbox FPSAtStart,'F'
|
|
GUIKeyCheckbox TimerEnable,'C'
|
|
GUIKeyCheckbox ClockBox,'X'
|
|
GUIKeyCheckbox TwelveHourClock,'1'
|
|
GUIKeyCheckbox bgfixer,'A'
|
|
GUIKeyCheckbox SmallMsgText,'S'
|
|
GUIKeyCheckbox AutoPatch,'I'
|
|
GUIKeyCheckbox RomInfo,'R'
|
|
GUIKeyCheckbox DisplayInfo,'W'
|
|
GUIKeyCheckbox GUIEnableTransp,'T'
|
|
%ifdef __WIN32__
|
|
GUIKeyCheckbox PauseFocusChange,'B'
|
|
GUIKeyCheckbox HighPriority,'O'
|
|
pushad
|
|
call CheckPriority
|
|
popad
|
|
GUIKeyCheckbox DisableScreenSaver,'D'
|
|
pushad
|
|
call CheckScreenSaver
|
|
popad
|
|
%endif
|
|
ret
|
|
|
|
GUIAboutKeys:
|
|
ToUpperASM
|
|
cmp dh,'E'
|
|
jne .noeegg
|
|
xor byte[EEgg],1
|
|
.noeegg
|
|
ret
|
|
|
|
GUISaveKeys:
|
|
ToUpperASM
|
|
GUIKeyCheckbox AutoIncSaveSlot,'I' ; Checkboxes
|
|
GUIKeyCheckbox nosaveSRAM,'D'
|
|
GUIKeyCheckbox SRAMSave5Sec,'C'
|
|
GUIKeyCheckbox LatestSave,'S'
|
|
GUIKeyCheckbox AutoState,'A'
|
|
GUIKeyCheckbox SRAMState,'L'
|
|
GUIKeyCheckbox PauseLoad,'P'
|
|
GUIKeyCheckbox PauseRewind,'R'
|
|
ret
|
|
|
|
GUISpeedKeys:
|
|
ToUpperASM
|
|
GUIKeyCheckbox FastFwdToggle,'T' ; Checkbox
|
|
|
|
cmp dh,'A' ; Framerate Checkboxes
|
|
jne .noautofr
|
|
cmp byte[frameskip],0 ; 0 = autoframerate / 1-10 = frameskip 0-9
|
|
je .zero
|
|
mov byte[frameskip],0
|
|
jmp .notzero
|
|
.zero
|
|
mov byte[FPSOn],0
|
|
mov byte[frameskip],1
|
|
.notzero
|
|
.noautofr
|
|
ret
|
|
|
|
GUIAddonKeys:
|
|
ToUpperASM
|
|
GUIKeyButtonHole device1,0,'G' ;Radio Buttons
|
|
GUIKeyButtonHole device1,1,'M'
|
|
GUIKeyButtonHole device2,0,'A'
|
|
GUIKeyButtonHole device2,1,'O'
|
|
GUIKeyButtonHole device2,2,'S'
|
|
GUIKeyButtonHole device2,3,'1'
|
|
GUIKeyButtonHole device2,4,'2'
|
|
|
|
GUIKeyCheckbox mouse1lh,'L' ; Checkboxes
|
|
GUIKeyCheckbox mouse2lh,'E'
|
|
ret
|
|
|
|
GUIChipKeys:
|
|
ToUpperASM
|
|
GUIKeyCheckbox nssdip1,'1' ; Checkboxes
|
|
GUIKeyCheckbox nssdip2,'2'
|
|
GUIKeyCheckbox nssdip3,'3'
|
|
GUIKeyCheckbox nssdip4,'4'
|
|
GUIKeyCheckbox nssdip5,'5'
|
|
GUIKeyCheckbox nssdip6,'6'
|
|
ret
|
|
|
|
GUIGUIOptnsKeys:
|
|
ToUpperASM
|
|
GUIKeyCheckbox mousewrap,'M' ; Checkboxes
|
|
GUIKeyCheckbox mouseshad,'S'
|
|
GUIKeyCheckbox esctomenu,'G'
|
|
GUIKeyCheckbox savewinpos,'W'
|
|
GUIKeyCheckbox GUIRClick,'C'
|
|
GUIKeyCheckbox JoyPad1Move,'U'
|
|
GUIKeyCheckbox newfont,'O'
|
|
GUIKeyCheckbox lhguimouse,'/'
|
|
|
|
cmp dh,'F'
|
|
jne .guioptn8
|
|
xor byte[FilteredGUI],1
|
|
%ifdef __MSDOS__
|
|
call DOSClearScreen
|
|
%endif
|
|
pushad
|
|
%ifdef __OPENGL__
|
|
cmp byte[cvidmode],5
|
|
jl near .skipinit
|
|
pushad
|
|
call drawscreenwin
|
|
call initwinvideo
|
|
popad
|
|
.skipinit
|
|
%endif
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
.guioptn8
|
|
|
|
GUIKeyButtonHole GUIEffect,0,'E' ; Start From Radio Buttons
|
|
GUIKeyButtonHole GUIEffect,1,'N'
|
|
GUIKeyButtonHole GUIEffect,2,'A'
|
|
GUIKeyButtonHole GUIEffect,3,'B'
|
|
GUIKeyButtonHole GUIEffect,4,'R'
|
|
GUIKeyButtonHole GUIEffect,5,'K'
|
|
|
|
%ifdef __WIN32__
|
|
GUIKeyCheckbox MouseWheel,'H'
|
|
GUIKeyCheckbox TrapMouseCursor,'P'
|
|
GUIKeyCheckbox AlwaysOnTop,'T'
|
|
GUIKeyCheckbox SaveMainWindowPos,'V'
|
|
GUIKeyCheckbox AllowMultipleInst,'L'
|
|
%endif
|
|
ret
|
|
|
|
GUIVideoKeys:
|
|
%ifndef __MSDOS__
|
|
call GUIPathKeys
|
|
%endif
|
|
cmp dh,9
|
|
jne near .tabdone
|
|
cmp byte[NTSCFilter],0
|
|
je near .nontsc
|
|
movzx eax,byte[cvidmode]
|
|
cmp byte[GUINTVID+eax],0
|
|
je .nontsc
|
|
KeyTabInc GUIVideoTabs,GUIVntscTab
|
|
jmp .tabdone
|
|
.nontsc
|
|
KeyTabInc GUIVideoTabs
|
|
.tabdone
|
|
ToUpperASM
|
|
xor eax,eax
|
|
cmp dword[GUIVideoTabs],1
|
|
jne near .notmodestab
|
|
; "Home"
|
|
%ifdef __UNIXSDL__
|
|
cmp dl,89
|
|
je .yeshome
|
|
cmp dword[numlockptr],1
|
|
je .nohome
|
|
cmp dl,71
|
|
jne .nohome
|
|
.yeshome
|
|
%else
|
|
cmp dl,71
|
|
jne .nohome
|
|
%endif
|
|
mov dword[GUIcurrentvideocursloc],0
|
|
mov dword[GUIcurrentvideoviewloc],0
|
|
.nohome
|
|
; "End"
|
|
%ifdef __UNIXSDL__
|
|
cmp dl,95
|
|
je .yesendp
|
|
cmp dword[numlockptr],1
|
|
je .noendp
|
|
cmp dl,79
|
|
jne .noendp
|
|
.yesendp
|
|
%else
|
|
cmp dl,79
|
|
jne .noendp
|
|
%endif
|
|
mov eax,[NumVideoModes]
|
|
dec eax
|
|
mov [GUIcurrentvideocursloc],eax
|
|
sub eax,19
|
|
mov [GUIcurrentvideoviewloc],eax
|
|
test dword[GUIcurrentvideoviewloc],8000000h
|
|
jz .noendp
|
|
mov dword[GUIcurrentvideoviewloc],0
|
|
.noendp
|
|
; "Up"
|
|
%ifdef __UNIXSDL__
|
|
cmp dl,90
|
|
je .up
|
|
cmp dword[numlockptr],1
|
|
je .noup
|
|
cmp dl,72
|
|
jne .noup
|
|
%else
|
|
cmp dl,72
|
|
jne .noup
|
|
%endif
|
|
.up
|
|
cmp dword[GUIcurrentvideocursloc],0
|
|
je .noup
|
|
mov ebx,[GUIcurrentvideocursloc]
|
|
cmp [GUIcurrentvideoviewloc],ebx
|
|
jne .noviewdec
|
|
dec dword[GUIcurrentvideoviewloc]
|
|
.noviewdec
|
|
dec dword[GUIcurrentvideocursloc]
|
|
.noup
|
|
; "Down"
|
|
%ifdef __UNIXSDL__
|
|
cmp dl,96
|
|
je .yesdown
|
|
cmp dword[numlockptr],1
|
|
je .nodown
|
|
cmp dl,80
|
|
jne .nodown
|
|
.yesdown
|
|
%else
|
|
cmp dl,80
|
|
jne .nodown
|
|
%endif
|
|
mov ebx,[GUIcurrentvideocursloc]
|
|
inc ebx
|
|
cmp ebx,[NumVideoModes]
|
|
je .nodown
|
|
inc dword[GUIcurrentvideocursloc]
|
|
sub ebx,20
|
|
cmp ebx,[GUIcurrentvideoviewloc]
|
|
jne .nodown
|
|
inc dword[GUIcurrentvideoviewloc]
|
|
.nodown
|
|
; "PageUp"
|
|
%ifdef __UNIXSDL__
|
|
cmp dl,91
|
|
je .yespageup
|
|
cmp dword[numlockptr],1
|
|
je .nopageup
|
|
cmp dl,73
|
|
jne .nopageup
|
|
.yespageup
|
|
%else
|
|
cmp dl,73
|
|
jne .nopageup
|
|
%endif
|
|
sub dword[GUIcurrentvideoviewloc],20
|
|
sub dword[GUIcurrentvideocursloc],20
|
|
test dword[GUIcurrentvideoviewloc],8000000h
|
|
jz .posv
|
|
mov dword[GUIcurrentvideoviewloc],0
|
|
.posv
|
|
test dword[GUIcurrentvideocursloc],8000000h
|
|
jz .posc
|
|
mov dword[GUIcurrentvideocursloc],0
|
|
.posc
|
|
.nopageup
|
|
; "PageDown"
|
|
%ifdef __UNIXSDL__
|
|
cmp dl,97
|
|
je .yespagedn
|
|
cmp dword[numlockptr],1
|
|
je .nopagedown
|
|
cmp dl,81
|
|
jne .nopagedown
|
|
.yespagedn
|
|
%else
|
|
cmp dl,81
|
|
jne .nopagedown
|
|
%endif
|
|
add dword[GUIcurrentvideoviewloc],20
|
|
add dword[GUIcurrentvideocursloc],20
|
|
mov ebx,[NumVideoModes]
|
|
dec ebx
|
|
cmp dword[GUIcurrentvideocursloc],ebx
|
|
jb .poscd
|
|
mov [GUIcurrentvideocursloc],ebx
|
|
.poscd
|
|
sub ebx,19
|
|
cmp dword[GUIcurrentvideoviewloc],ebx
|
|
jl .posvd
|
|
test ebx,8000000h
|
|
jz .noneg
|
|
mov ebx,0
|
|
.noneg
|
|
mov [GUIcurrentvideoviewloc],ebx
|
|
.posvd
|
|
.nopagedown
|
|
; "Return"
|
|
cmp dl,13
|
|
jne .noreturn
|
|
mov byte[GUICBHold],4
|
|
.noreturn
|
|
.notmodestab
|
|
|
|
cmp dword[GUIVideoTabs],2
|
|
jne near .notfilterstab
|
|
|
|
%ifdef __MSDOS__
|
|
cmp byte[smallscreenon],1
|
|
je .noquarterscanlines
|
|
cmp byte[ScreenScale],1
|
|
je .nohq4x
|
|
%endif
|
|
cmp dh,'I'
|
|
jne .nointerpolation
|
|
xor eax,eax
|
|
mov al,[cvidmode]
|
|
%ifdef __OPENGL__
|
|
cmp byte[GUIBIFIL+eax],0
|
|
je .nobilinearfilter
|
|
xor byte[BilinearFilter],1
|
|
FilterExcl2 NTSCFilter
|
|
pushad
|
|
call drawscreenwin
|
|
call initwinvideo
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
jmp .nointerpolation
|
|
.nobilinearfilter
|
|
%elifdef __MSDOS__
|
|
cmp byte[GUIEAVID+eax],0
|
|
jne .interpolation
|
|
%endif
|
|
%ifdef __WIN32__
|
|
cmp byte[GUIDSIZE+eax],0
|
|
%else
|
|
cmp byte[GUII2VID+eax],0
|
|
%endif
|
|
je .nointerpolation
|
|
.interpolation
|
|
xor byte[antienab],1
|
|
jz near .nointerpolation
|
|
FilterExcl2 En2xSaI,hqFilter,NTSCFilter
|
|
.nointerpolation
|
|
cmp dh,'N'
|
|
jne .nontscfilter
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUINTVID+ebx],0
|
|
je .nontscfilter
|
|
xor byte[NTSCFilter],1
|
|
jz .nontscfilter
|
|
FilterExcl2 En2xSaI,hqFilter,scanlines,antienab
|
|
%ifdef __OPENGL__
|
|
FilterExcl2 BilinearFilter
|
|
%endif
|
|
%ifdef __WIN32__
|
|
cmp byte[NTSCFilter],0
|
|
je .noforce4_3
|
|
mov byte[Keep4_3Ratio],1
|
|
.noforce4_3
|
|
%endif
|
|
%ifndef __MSDOS__
|
|
pushad
|
|
call NTSCFilterInit
|
|
popad
|
|
%endif
|
|
.nontscfilter
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
%ifdef __MSDOS__
|
|
cmp byte[GUI2xVID+ebx],0
|
|
%else
|
|
cmp byte[GUIDSIZE+ebx],0
|
|
%endif
|
|
je near .nosuper2xsai
|
|
cmp dh,'S'
|
|
jne .no2xsai
|
|
mov eax,1
|
|
jmp .yesfilter
|
|
.no2xsai
|
|
cmp dh,'E'
|
|
jne .nosupereagle
|
|
mov eax,2
|
|
jmp .yesfilter
|
|
.nosupereagle
|
|
cmp dh,'P'
|
|
jne .nosuper2xsai
|
|
mov eax,3
|
|
.yesfilter
|
|
pushad
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
FilterExcl2 hqFilter,scanlines,antienab,NTSCFilter
|
|
GUIkeystoggleoptn byte[En2xSaI],al
|
|
.nosuper2xsai
|
|
cmp dh,'Q'
|
|
jne .nohqfilter
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUIHQ2X+ebx],0
|
|
jne .hqfilter
|
|
%ifndef __MSDOS__
|
|
cmp byte[GUIHQ3X+ebx],0
|
|
jne .hqfilter
|
|
cmp byte[GUIHQ4X+ebx],0
|
|
jne .hqfilter
|
|
%endif
|
|
jmp .nohqfilter
|
|
.hqfilter
|
|
pushad
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
xor byte[hqFilter],1
|
|
jz .nohqfilter
|
|
FilterExcl2 scanlines,En2xSaI,antienab,NTSCFilter
|
|
.nohqfilter
|
|
%ifndef __MSDOS__
|
|
cmp dh,'X'
|
|
jne .nohq2x
|
|
cmp byte[hqFilter],0
|
|
je .nohq2x
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUIHQ2X+ebx],0
|
|
je .nohq2x
|
|
pushad
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
GUIKeyButtonHole hqFilterlevel,2,'X'
|
|
.nohq2x
|
|
cmp dh,'3'
|
|
jne .nohq3x
|
|
cmp byte[hqFilter],0
|
|
je .nohq3x
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUIHQ3X+ebx],0
|
|
je .nohq3x
|
|
pushad
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
GUIKeyButtonHole hqFilterlevel,3,'3'
|
|
.nohq3x
|
|
cmp dh,'4'
|
|
jne .nohq4x
|
|
cmp byte[hqFilter],0
|
|
je .nohq4x
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUIHQ4X+ebx],0
|
|
je .nohq4x
|
|
pushad
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
GUIKeyButtonHole hqFilterlevel,4,'4'
|
|
%endif
|
|
.nohq4x
|
|
|
|
xor eax,eax
|
|
mov al,[cvidmode]
|
|
%ifdef __MSDOS__
|
|
cmp byte[GUISLVID+eax],0
|
|
%else
|
|
cmp byte[GUIDSIZE+eax],0
|
|
%endif
|
|
je .nofullscanlines
|
|
GUIKeyButtonHole scanlines,0,'O'
|
|
cmp dh,'F'
|
|
jne .nofullscanlines
|
|
FilterExcl2 En2xSaI,hqFilter,NTSCFilter
|
|
pushad
|
|
%ifdef __MSDOS__
|
|
call DOSClearScreen
|
|
cmp byte[cvidmode],2 ;modeQ
|
|
je .refresh
|
|
cmp byte[cvidmode],5
|
|
jne .nomodex
|
|
.refresh
|
|
mov byte[cbitmode],1
|
|
call initvideo2
|
|
mov byte[cbitmode],0
|
|
call GUISetPal
|
|
.nomodex
|
|
%endif
|
|
popad
|
|
GUIKeyButtonHole scanlines,1,'F'
|
|
.nofullscanlines
|
|
%ifdef __MSDOS__
|
|
cmp byte[ScreenScale],1
|
|
je .noquarterscanlines
|
|
%endif
|
|
xor eax,eax
|
|
mov al,[cvidmode]
|
|
%ifdef __MSDOS__
|
|
cmp byte[GUIHSVID+eax],0
|
|
%else
|
|
cmp byte[GUIDSIZE+eax],0
|
|
%endif
|
|
je near .noquarterscanlines
|
|
cmp dh,'5'
|
|
jne .nohalfscanlines
|
|
FilterExcl2 En2xSaI,hqFilter,NTSCFilter
|
|
%ifdef __MSDOS__
|
|
call DOSClearScreen
|
|
%endif
|
|
GUIKeyButtonHole scanlines,3,'5'
|
|
.nohalfscanlines
|
|
cmp dh,'2'
|
|
jne .noquarterscanlines
|
|
FilterExcl2 En2xSaI,hqFilter,NTSCFilter
|
|
%ifdef __MSDOS__
|
|
call DOSClearScreen
|
|
%endif
|
|
GUIKeyButtonHole scanlines,2,'2'
|
|
.noquarterscanlines
|
|
cmp dh,'G'
|
|
jne .nograyscale
|
|
xor byte[GrayscaleMode],1
|
|
.nograyscale
|
|
cmp dh,'H'
|
|
jne .nohiresmode7
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUIM7VID+ebx],0
|
|
je .nohiresmode7
|
|
xor byte[Mode7HiRes16b],1
|
|
.nohiresmode7
|
|
%ifndef __UNIXSDL__
|
|
cmp dh,'V'
|
|
jne .novsync
|
|
xor byte[vsyncon],1
|
|
%ifdef __WIN32__
|
|
pushad
|
|
call initDirectDraw
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
%else
|
|
jz .novsync
|
|
FilterExcl2 Triplebufen
|
|
%endif
|
|
.novsync
|
|
%endif
|
|
%ifndef __UNIXSDL__
|
|
cmp dh,'T'
|
|
jne .notriplebuffer
|
|
xor eax,eax
|
|
mov al,[cvidmode]
|
|
%ifdef __WIN32__
|
|
cmp byte[GUIWFVID+eax],0
|
|
je near .notriplebuffer
|
|
xor byte[TripleBufferWin],1
|
|
pushad
|
|
call initDirectDraw
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
%else
|
|
cmp byte[GUITBVID+ebx],0
|
|
je near .notriplebuffer
|
|
xor byte[Triplebufen],1
|
|
jz .notriplebuffer
|
|
FilterExcl2 vsyncon
|
|
%endif
|
|
.notriplebuffer
|
|
%endif
|
|
%ifndef __MSDOS__
|
|
cmp dh,'R'
|
|
jne .nokeep4_3
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUIKEEP43+ebx],0
|
|
je near .nokeep4_3
|
|
xor byte[Keep4_3Ratio],1
|
|
pushad
|
|
call initwinvideo
|
|
call Clear2xSaIBuffer
|
|
popad
|
|
.nokeep4_3
|
|
%endif
|
|
%ifdef __MSDOS__
|
|
cmp dh,'M'
|
|
jne .nosmallscreen
|
|
xor eax,eax
|
|
mov al,[cvidmode]
|
|
cmp byte[GUISSVID+eax],0
|
|
je .nosmallscreen
|
|
xor byte[smallscreenon],1
|
|
FilterExcl2 ScreenScale,antienab,En2xSaI,scanlines
|
|
DOSClearScreenKey
|
|
.nosmallscreen
|
|
cmp dh,'C'
|
|
jne .nofullscreen
|
|
xor eax,eax
|
|
mov al,[cvidmode]
|
|
cmp byte[GUIFSVID+eax],0
|
|
je .nofullscreen
|
|
xor byte[ScreenScale],1
|
|
FilterExcl2 smallscreenon,antienab,En2xSaI
|
|
DOSClearScreenKey
|
|
.nofullscreen
|
|
%endif
|
|
.notfilterstab
|
|
|
|
cmp dword[GUIVntscTab],1
|
|
jl .notntsctab
|
|
cmp dh,'B'
|
|
jne .noblend
|
|
xor byte[NTSCBlend],1
|
|
.noblend
|
|
cmp dh,'R'
|
|
jne .norefresh
|
|
xor byte[NTSCRef],1
|
|
.norefresh
|
|
|
|
.notntsctab
|
|
ret
|
|
|
|
GUISoundKeys:
|
|
ToUpperASM
|
|
cmp dh,'E'
|
|
jne .notenablesound
|
|
xor byte[soundon],1
|
|
%ifdef __WIN32__
|
|
pushad
|
|
call reInitSound
|
|
popad
|
|
%endif
|
|
.notenablesound
|
|
|
|
GUIKeyCheckbox StereoSound,'S'
|
|
GUIKeyCheckbox RevStereo,'V'
|
|
GUIKeyCheckbox Surround,'M'
|
|
GUIKeyCheckbox SPCDisable,'D'
|
|
%ifdef __MSDOS__
|
|
GUIKeyCheckbox Force8b,'F'
|
|
%endif
|
|
%ifdef __WIN32__
|
|
GUIKeyCheckbox PrimaryBuffer,'P'
|
|
%endif
|
|
|
|
cmp dh,'R' ; Sampling Rate
|
|
jne .notsrate
|
|
mov eax,[SoundQuality]
|
|
mov al,[.sampratenext+eax]
|
|
mov [SoundQuality],al
|
|
.notsrate
|
|
|
|
GUIKeyButtonHole SoundInterpType,0,'N'
|
|
GUIKeyButtonHole SoundInterpType,1,'G'
|
|
GUIKeyButtonHole SoundInterpType,2,'C'
|
|
cmp byte[MMXSupport],0
|
|
je .no8ptinterp
|
|
GUIKeyButtonHole SoundInterpType,3,'8'
|
|
.no8ptinterp
|
|
|
|
GUIKeyButtonHole LowPassFilterType,0,'O'
|
|
GUIKeyButtonHole LowPassFilterType,1,'I'
|
|
GUIKeyButtonHole LowPassFilterType,2,'Y'
|
|
cmp byte[MMXSupport],0
|
|
je .nohiqualityfilter
|
|
GUIKeyButtonHole LowPassFilterType,3,'H'
|
|
.nohiqualityfilter
|
|
ret
|
|
|
|
SECTION .data
|
|
.sampratenext db 1,4,5,6,2,3,0,0
|
|
SECTION .text
|
|
|
|
GUINetMenuKeys1:
|
|
ret
|
|
|
|
GUIGetInputLine:
|
|
ret
|
|
|
|
SECTION .bss
|
|
GUIEditString resd 1 ; Pointer to string
|
|
GUIEditStringcLen resd 1 ; Pointer to end of string (done in function)
|
|
GUIEditStringmLen resd 1 ; Max length of string
|
|
GUIEditStringLTxt resd 1 ; blink value, should be set to 0 when box selected
|
|
GUIEditStringLstb resd 1 ; if cursor is placed (set in main function)
|
|
GUIEditStringcWin resd 1 ; 0 = no text window selected
|
|
SECTION .text
|
|
|
|
GUIPathKeys:
|
|
cmp dh,0
|
|
je near .nokeypressed
|
|
cmp dword[GUIInputBox],0
|
|
je near .nokeypressed
|
|
|
|
cmp dword[GUIInputBox],1
|
|
jne .notBox1
|
|
mov eax,SRAMPath
|
|
jmp .boxselected
|
|
.notBox1
|
|
cmp dword[GUIInputBox],2
|
|
jne .notBox2
|
|
mov eax,SnapPath
|
|
jmp .boxselected
|
|
.notBox2
|
|
cmp dword[GUIInputBox],3
|
|
jne .notBox3
|
|
mov eax,SPCPath
|
|
jmp .boxselected
|
|
.notBox3
|
|
cmp dword[GUIInputBox],4
|
|
jne .notBox4
|
|
mov eax,BSXPath
|
|
jmp .boxselected
|
|
.notBox4
|
|
cmp dword[GUIInputBox],5
|
|
jne .notBox5
|
|
mov eax,SGPath
|
|
jmp .boxselected
|
|
.notBox5
|
|
cmp dword[GUIInputBox],6
|
|
jne .notBox6
|
|
mov eax,STPath
|
|
jmp .boxselected
|
|
.notBox6
|
|
cmp dword[GUIInputBox],7
|
|
jne .notBox7
|
|
mov eax,GNextPath
|
|
jmp .boxselected
|
|
.notBox7
|
|
cmp dword[GUIInputBox],8
|
|
jne .notBox8
|
|
mov eax,FEOEZPath
|
|
jmp .boxselected
|
|
.notBox8
|
|
cmp dword[GUIInputBox],9
|
|
jne .notBox9
|
|
mov eax,SJNSPath
|
|
jmp .boxselected
|
|
.notBox9
|
|
cmp dword[GUIInputBox],10
|
|
jne .notBox10
|
|
mov eax,MDHPath
|
|
jmp .boxselected
|
|
.notBox10
|
|
cmp dword[GUIInputBox],11
|
|
jne .notBox11
|
|
mov eax,SPL4Path
|
|
jmp .boxselected
|
|
.notBox11
|
|
%ifndef __MSDOS__
|
|
cmp dword[GUIInputBox],12
|
|
jne .notBox12
|
|
mov eax,GUICustomX
|
|
jmp .boxselected
|
|
.notBox12
|
|
cmp dword[GUIInputBox],13
|
|
jne .notBox13
|
|
mov eax,GUICustomY
|
|
jmp .boxselected
|
|
.notBox13
|
|
%endif
|
|
cmp dword[GUIInputBox],14
|
|
jne .notBox14
|
|
mov eax,GUIMovieForcedText
|
|
jmp .boxselected
|
|
.notBox14
|
|
|
|
.boxselected
|
|
mov ecx,eax
|
|
|
|
%ifdef __WIN32__
|
|
;Look for paste request
|
|
cmp byte[ctrlptr],0
|
|
je .nopaste
|
|
cmp dh,56h ;V
|
|
jne .nopaste
|
|
mov [CBBuffer],ecx
|
|
mov eax,[GUIInputLimit]
|
|
mov [CBLength],eax
|
|
pushad
|
|
call PasteClipBoard
|
|
popad
|
|
xor dx,dx
|
|
ret
|
|
.nopaste
|
|
%endif
|
|
|
|
;Find end of string
|
|
.findend
|
|
cmp byte[eax],0
|
|
je .foundend
|
|
inc eax
|
|
jmp .findend
|
|
.foundend
|
|
|
|
cmp dh,8 ;Backspace
|
|
jne .notbackspace
|
|
cmp eax,ecx
|
|
je .cantback
|
|
mov byte[eax-1],0
|
|
.cantback
|
|
xor dx,dx
|
|
ret
|
|
.notbackspace
|
|
|
|
cmp dh,13 ;Enter
|
|
jne .notenter
|
|
mov dword[GUIInputBox],0
|
|
pushad
|
|
call init_save_paths
|
|
call SetMovieForcedLength
|
|
%ifndef __MSDOS__
|
|
call SetCustomXY
|
|
%endif
|
|
popad
|
|
xor dx,dx
|
|
ret
|
|
.notenter
|
|
|
|
;check if we're at the end
|
|
add ecx,dword[GUIInputLimit]
|
|
cmp eax,ecx
|
|
jne .stillroom
|
|
xor dx,dx
|
|
ret
|
|
.stillroom
|
|
mov [eax],dh
|
|
|
|
xor dx,dx
|
|
.nokeypressed
|
|
ret
|
|
|
|
SECTION .bss
|
|
GUIInputBox resd 1
|
|
GUIInputLimit resd 1
|
|
SECTION .text
|
|
|
|
GUIMovieKeys:
|
|
ToUpperASM
|
|
call GUIPathKeys
|
|
cmp dh,9
|
|
jne near .notab
|
|
cmp byte[MovieProcessing],1
|
|
jae .notab
|
|
KeyTabInc GUIMovieTabs,GUIDumpingTab
|
|
.notab
|
|
|
|
GUIKeyButtonHole CMovieExt,'v','0' ; Select Radio Buttons
|
|
GUIKeyButtonHole CMovieExt,'1','1'
|
|
GUIKeyButtonHole CMovieExt,'2','2'
|
|
GUIKeyButtonHole CMovieExt,'3','3'
|
|
GUIKeyButtonHole CMovieExt,'4','4'
|
|
GUIKeyButtonHole CMovieExt,'5','5'
|
|
GUIKeyButtonHole CMovieExt,'6','6'
|
|
GUIKeyButtonHole CMovieExt,'7','7'
|
|
GUIKeyButtonHole CMovieExt,'8','8'
|
|
GUIKeyButtonHole CMovieExt,'9','9'
|
|
|
|
cmp dword[GUIMovieTabs],1
|
|
jne near .nocontrols
|
|
|
|
GUIKeyButtonHole MovieStartMethod,0,'N' ; Start From Radio Buttons
|
|
GUIKeyButtonHole MovieStartMethod,1,'P'
|
|
GUIKeyButtonHole MovieStartMethod,2,'R'
|
|
GUIKeyButtonHole MovieStartMethod,3,'S'
|
|
|
|
GUIKeyButtonHole MZTForceRTR,0,'M' ; Start From Radio Buttons
|
|
GUIKeyButtonHole MZTForceRTR,1,'C'
|
|
GUIKeyButtonHole MZTForceRTR,2,'B'
|
|
|
|
GUIKeyCheckbox MovieDisplayFrame,'D' ; Checkbox
|
|
.nocontrols
|
|
|
|
cmp dword[GUIDumpingTab],1
|
|
jne near .nodumping
|
|
|
|
GUIKeyButtonHole MovieVideoMode,0,'O'
|
|
GUIKeyButtonHole MovieVideoMode,1,'W'
|
|
GUIKeyButtonHole MovieVideoMode,2,'F'
|
|
GUIKeyButtonHole MovieVideoMode,3,'L'
|
|
GUIKeyButtonHole MovieVideoMode,4,'X'
|
|
GUIKeyButtonHole MovieVideoMode,5,'C'
|
|
|
|
GUIKeyCheckbox MovieAudio,'A'
|
|
GUIKeyCheckbox MovieVideoAudio,'V'
|
|
GUIKeyCheckbox MovieAudioCompress,'M'
|
|
|
|
GUIKeyButtonHole MovieForcedLengthEnabled,0,'Z'
|
|
GUIKeyButtonHole MovieForcedLengthEnabled,1,'R'
|
|
GUIKeyButtonHole MovieForcedLengthEnabled,2,'U'
|
|
.nodumping
|
|
|
|
ret
|
|
|
|
GUIComboKeys:
|
|
; Calculate Position
|
|
xor eax,eax
|
|
.nozero
|
|
cmp byte[GUIComboTextH+eax],0
|
|
je .zero
|
|
inc eax
|
|
jmp .nozero
|
|
.zero
|
|
mov [GUIComboPos],al
|
|
cmp dh,8
|
|
jne .nobacksp
|
|
cmp byte[GUIComboPos],0
|
|
je .nochar
|
|
mov byte[GUICCFlash],0
|
|
xor eax,eax
|
|
mov al,[GUIComboPos]
|
|
dec eax
|
|
mov byte[GUIComboTextH+eax],0
|
|
ret
|
|
.nobacksp
|
|
cmp dh,0
|
|
je .nochar
|
|
cmp dh,13
|
|
je .nochar
|
|
cmp byte[GUIComboPos],19
|
|
je .nochar
|
|
xor eax,eax
|
|
mov byte[GUICCFlash],0
|
|
mov al,[GUIComboPos]
|
|
mov [GUIComboTextH+eax],dh
|
|
.nochar
|
|
ret
|
|
|
|
GUICheatKeys:
|
|
cmp dword[GUIcurrentcheatwin],1
|
|
je near .textboxa
|
|
cmp dword[GUIcurrentcheatwin],2
|
|
je near .textboxb
|
|
ToUpperASM
|
|
cmp dh,'R' ; Hotkeys
|
|
jne .noremocheat
|
|
jmp CheatCodeRemove
|
|
.noremocheat
|
|
cmp dh,'T'
|
|
jne .notoggcheat
|
|
jmp CheatCodeToggle
|
|
.notoggcheat
|
|
cmp dh,'S'
|
|
jne .nosavecheat
|
|
jmp CheatCodeSave
|
|
.nosavecheat
|
|
cmp dh,'L'
|
|
jne .noloadcheat
|
|
jmp CheatCodeLoad
|
|
.noloadcheat
|
|
cmp dh,'F'
|
|
jne .nofixcheat
|
|
jmp CheatCodeFix
|
|
.nofixcheat
|
|
cmp dh,'A'
|
|
jne .noauto
|
|
xor byte[AutoLoadCht],1
|
|
.noauto
|
|
|
|
;Main Cheat Box
|
|
cmp dword[NumCheats],0
|
|
jne .nozero
|
|
ret
|
|
.nozero
|
|
%ifdef __UNIXSDL__
|
|
cmp al,89
|
|
je .homepressed
|
|
cmp dword[numlockptr],1
|
|
je .nohome
|
|
cmp al,71
|
|
jne .nohome
|
|
.homepressed
|
|
%else
|
|
cmp al,71
|
|
jne .nohome
|
|
%endif
|
|
mov dword[GUIcurrentcheatcursloc],0
|
|
mov dword[GUIcurrentcheatviewloc],0
|
|
ret
|
|
.nohome
|
|
%ifdef __UNIXSDL__
|
|
cmp al,89
|
|
je .endppressed
|
|
cmp dword[numlockptr],1
|
|
je .noendp
|
|
cmp al,79
|
|
jne .noendp
|
|
.endppressed
|
|
%else
|
|
cmp al,79
|
|
jne .noendp
|
|
%endif
|
|
mov eax,[NumCheats]
|
|
dec eax
|
|
mov [GUIcurrentcheatcursloc],eax
|
|
sub eax,11
|
|
mov [GUIcurrentcheatviewloc],eax
|
|
test dword[GUIcurrentcheatviewloc],8000000h
|
|
jz .posve
|
|
mov dword[GUIcurrentcheatviewloc],0
|
|
.posve
|
|
ret
|
|
.noendp
|
|
%ifdef __UNIXSDL__
|
|
cmp al,90
|
|
je .up
|
|
cmp dword[numlockptr],1
|
|
je .noup
|
|
cmp al,72
|
|
jne .noup
|
|
%else
|
|
cmp al,72
|
|
jne .noup
|
|
%endif
|
|
.up
|
|
cmp dword[GUIcurrentcheatcursloc],0
|
|
je .noup
|
|
mov ebx,[GUIcurrentcheatcursloc]
|
|
cmp [GUIcurrentcheatviewloc],ebx
|
|
jne .noviewdec
|
|
dec dword[GUIcurrentcheatviewloc]
|
|
.noviewdec
|
|
dec dword[GUIcurrentcheatcursloc]
|
|
.noup
|
|
%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
|
|
mov ebx,[GUIcurrentcheatcursloc]
|
|
inc ebx
|
|
cmp ebx,[NumCheats]
|
|
jae .noviewinc
|
|
inc dword[GUIcurrentcheatcursloc]
|
|
sub ebx,12
|
|
cmp ebx,[GUIcurrentcheatviewloc]
|
|
jne .noviewinc
|
|
inc dword[GUIcurrentcheatviewloc]
|
|
.noviewinc
|
|
.nodown
|
|
%ifdef __UNIXSDL__
|
|
cmp al,91
|
|
je .pageuppressed
|
|
cmp dword[numlockptr],1
|
|
je .nopageup
|
|
cmp al,73
|
|
jne .nopageup
|
|
.pageuppressed
|
|
%else
|
|
cmp al,73
|
|
jne .nopageup
|
|
%endif
|
|
sub dword[GUIcurrentcheatviewloc],12
|
|
sub dword[GUIcurrentcheatcursloc],12
|
|
test dword[GUIcurrentcheatviewloc],8000000h
|
|
jz .posv
|
|
mov dword[GUIcurrentcheatviewloc],0
|
|
.posv
|
|
test dword[GUIcurrentcheatcursloc],8000000h
|
|
jz .posc
|
|
mov dword[GUIcurrentcheatcursloc],0
|
|
.posc
|
|
.nopageup
|
|
%ifdef __UNIXSDL__
|
|
cmp al, 97
|
|
je .pagednpressed
|
|
cmp dword[numlockptr],1
|
|
je .nopagedown
|
|
cmp al,81
|
|
jne .nopagedown
|
|
.pagednpressed
|
|
%else
|
|
cmp al,81
|
|
jne .nopagedown
|
|
%endif
|
|
add dword[GUIcurrentcheatviewloc],12
|
|
add dword[GUIcurrentcheatcursloc],12
|
|
mov ebx,[NumCheats]
|
|
dec ebx
|
|
cmp dword[GUIcurrentcheatcursloc],ebx
|
|
jb .poscd
|
|
mov [GUIcurrentcheatcursloc],ebx
|
|
.poscd
|
|
sub ebx,11
|
|
cmp dword[GUIcurrentcheatviewloc],ebx
|
|
jl .posvd
|
|
test ebx,8000000h
|
|
jz .noneg
|
|
mov ebx,0
|
|
.noneg
|
|
mov [GUIcurrentcheatviewloc],ebx
|
|
.posvd
|
|
.nopagedown
|
|
ret
|
|
|
|
;Enter Code Input Box
|
|
.textboxa
|
|
cmp byte[GUICheatPosA],0
|
|
je near .nobacksp
|
|
cmp dh,9
|
|
je .yesret
|
|
cmp dh,13
|
|
jne near .noret
|
|
.yesret
|
|
cmp byte[GUICheatPosA],2
|
|
jne near .nocodemod
|
|
mov byte[GUICheatPosA],0
|
|
mov esi,[GUIcurrentcheatcursloc]
|
|
shl esi,5
|
|
sub esi,[GUIcurrentcheatcursloc]
|
|
sub esi,[GUIcurrentcheatcursloc]
|
|
sub esi,[GUIcurrentcheatcursloc]
|
|
sub esi,[GUIcurrentcheatcursloc]
|
|
add esi,cheatdata
|
|
mov al,[GUICheatTextZ1]
|
|
cmp al,'a'
|
|
jae .lowletter
|
|
cmp al,'A'
|
|
jae .letter
|
|
sub al,'0'
|
|
jmp .num
|
|
.lowletter
|
|
sub al,'a'-10
|
|
jmp .num
|
|
.letter
|
|
sub al,'A'-10
|
|
.num
|
|
mov ah,[GUICheatTextZ1+1]
|
|
cmp ah,'a'
|
|
jae .lowletter2
|
|
cmp ah,'A'
|
|
jae .letter2
|
|
sub ah,'0'
|
|
jmp .num2
|
|
.lowletter2
|
|
sub ah,'a'-10
|
|
jmp .num2
|
|
.letter2
|
|
sub ah,'A'-10
|
|
.num2
|
|
shl al,4
|
|
and ah,0Fh
|
|
or al,ah
|
|
mov [esi+1],al
|
|
mov word[GUICheatTextZ1],0
|
|
pushad
|
|
call EnableCheatCodeNoPrevMod
|
|
popad
|
|
jmp .noret
|
|
.nocodemod
|
|
inc dword[GUIcurrentcheatwin]
|
|
mov byte[GUICCFlash],0
|
|
.noret
|
|
cmp dh,8
|
|
jne .nobacksp
|
|
mov byte[GUICCFlash],0
|
|
dec byte[GUICheatPosA]
|
|
xor eax,eax
|
|
mov al,[GUICheatPosA]
|
|
mov byte[GUICheatTextZ1+eax],'_'
|
|
mov byte[GUICheatTextZ1+eax+1],0
|
|
ret
|
|
.nobacksp
|
|
cmp dh,0
|
|
je .nochar
|
|
cmp dh,13
|
|
je .nochar
|
|
cmp dh,8
|
|
je .nochar
|
|
cmp dh,9
|
|
je .nochar
|
|
cmp byte[GUICheatPosA],14
|
|
je .nochar
|
|
mov byte[GUICCFlash],0
|
|
xor eax,eax
|
|
mov al,[GUICheatPosA]
|
|
mov [GUICheatTextZ1+eax],dh
|
|
mov byte[GUICheatTextZ1+eax+1],'_'
|
|
mov byte[GUICheatTextZ1+eax+2],0
|
|
inc byte[GUICheatPosA]
|
|
.nochar
|
|
ret
|
|
|
|
;Description Input Box
|
|
.textboxb
|
|
cmp dh,13
|
|
jne .noretb
|
|
mov byte[GUICCFlash],0
|
|
jmp ProcessCheatCode
|
|
.noretb
|
|
cmp byte[GUICheatPosB],0
|
|
je .nobackspb
|
|
cmp dh,8
|
|
jne .nobackspb
|
|
mov byte[GUICCFlash],0
|
|
dec byte[GUICheatPosB]
|
|
xor eax,eax
|
|
mov al,[GUICheatPosB]
|
|
mov byte[GUICheatTextZ2+eax],'_'
|
|
mov byte[GUICheatTextZ2+eax+1],0
|
|
ret
|
|
.nobackspb
|
|
cmp dh,0
|
|
je .nocharb
|
|
cmp dh,13
|
|
je .nocharb
|
|
cmp dh,8
|
|
je .nocharb
|
|
cmp byte[GUICheatPosB],18
|
|
je .nocharb
|
|
xor eax,eax
|
|
mov byte[GUICCFlash],0
|
|
mov al,[GUICheatPosB]
|
|
mov [GUICheatTextZ2+eax],dh
|
|
mov byte[GUICheatTextZ2+eax+1],'_'
|
|
mov byte[GUICheatTextZ2+eax+2],0
|
|
inc byte[GUICheatPosB]
|
|
.nocharb
|
|
ret
|
|
|
|
%macro CompareKeyMacro 3
|
|
cmp dh,%1
|
|
jne %%skip
|
|
mov byte[%2],%3
|
|
%%skip
|
|
%endmacro
|
|
|
|
InsertSearchCharacter:
|
|
push edx
|
|
push eax
|
|
; Send character into CSInputDisplay
|
|
; Find location
|
|
mov ecx,CSInputDisplay
|
|
.next
|
|
cmp byte[ecx],0
|
|
je .found
|
|
cmp byte[ecx],'_'
|
|
je .found
|
|
inc ecx
|
|
jmp .next
|
|
.found
|
|
; Delete if necessary
|
|
cmp dh,8
|
|
jne .notdelete
|
|
cmp ecx,CSInputDisplay
|
|
je near .done
|
|
dec ecx
|
|
jmp .placecursor
|
|
.notdelete
|
|
cmp ecx,CSInputDisplay+10
|
|
je near .done
|
|
; Add character if necessary
|
|
cmp dh,'0'
|
|
jb near .done
|
|
cmp dh,'9'
|
|
jbe .okay
|
|
cmp byte[CheatSrcByteBase],0
|
|
je near .done
|
|
cmp dh,'F'
|
|
ja near .done
|
|
cmp dh,'A'
|
|
jb near .done
|
|
.okay
|
|
mov [ecx],dh
|
|
inc ecx
|
|
; Process cursor if over the window
|
|
.placecursor
|
|
mov byte[ecx],'_'
|
|
mov byte[ecx+1],0
|
|
|
|
mov byte[CSOverValue],0
|
|
; Find overall value and delete if over
|
|
mov ecx,CSInputDisplay
|
|
mov ebx,10
|
|
cmp byte[CheatSrcByteBase],0
|
|
je .dec
|
|
mov ebx,16
|
|
.dec
|
|
xor eax,eax
|
|
.next2
|
|
cmp byte[ecx],0
|
|
je .found2
|
|
cmp byte[ecx],'_'
|
|
je .found2
|
|
mul ebx
|
|
or edx,edx
|
|
jz .notoverflow
|
|
mov byte[CSOverValue],1
|
|
.notoverflow
|
|
xor edx,edx
|
|
mov dl,[ecx]
|
|
cmp dl,'A'
|
|
jb .below
|
|
sub dl,'A'-10-'0'
|
|
.below
|
|
sub dl,'0'
|
|
add eax,edx
|
|
jnc .notoverflowb
|
|
mov byte[CSOverValue],1
|
|
.notoverflowb
|
|
inc ecx
|
|
jmp .next2
|
|
.found2
|
|
xor ebx,ebx
|
|
mov bl,[CheatSrcByteSize]
|
|
mov ebx,[SrcMask+ebx*4]
|
|
mov [CSCurValue],eax
|
|
cmp eax,ebx
|
|
jbe .done
|
|
mov byte[CSOverValue],1
|
|
.done
|
|
pop eax
|
|
pop edx
|
|
ret
|
|
|
|
SECTION .bss
|
|
CSOverValue resb 1
|
|
CSCurValue resd 1
|
|
SECTION .text
|
|
|
|
InsertSearchDescription:
|
|
mov eax,CSDescDisplay
|
|
xor dl,dl
|
|
.next
|
|
cmp byte[eax],0
|
|
je .fin
|
|
inc eax
|
|
inc dl
|
|
jmp .next
|
|
.fin
|
|
or dl,dl
|
|
jz .nobackspb
|
|
cmp dh,8
|
|
jne .nobackspb
|
|
mov byte[eax-1],0
|
|
ret
|
|
.nobackspb
|
|
cmp dh,0
|
|
je .nocharb
|
|
cmp dh,13
|
|
je .nocharb
|
|
cmp dh,8
|
|
je .nocharb
|
|
cmp dl,18
|
|
je .nocharb
|
|
mov [eax],dh
|
|
mov byte[eax+1],0
|
|
.nocharb
|
|
ret
|
|
|
|
GUICheatSearchKeys:
|
|
ToUpperASM
|
|
cmp byte[CheatWinMode],3
|
|
je near .add
|
|
cmp byte[CheatWinMode],2
|
|
je near .view
|
|
cmp byte[CheatWinMode],1
|
|
je near .search
|
|
|
|
CompareKeyMacro '1',CheatSrcByteSize,0 ; Main Menu
|
|
CompareKeyMacro '2',CheatSrcByteSize,1
|
|
CompareKeyMacro '3',CheatSrcByteSize,2
|
|
CompareKeyMacro '4',CheatSrcByteSize,3
|
|
CompareKeyMacro 'D',CheatSrcByteBase,0
|
|
CompareKeyMacro 'H',CheatSrcByteBase,1
|
|
CompareKeyMacro 'E',CheatSrcSearchType,0
|
|
CompareKeyMacro 'C',CheatSrcSearchType,1
|
|
|
|
cmp dh,13 ; Start Button
|
|
je .start
|
|
cmp dh,'S'
|
|
jne .notstart
|
|
.start
|
|
call CheatCodeSearchInit
|
|
ret
|
|
.notstart
|
|
ret
|
|
|
|
.search ; Shortcuts for Select Comparison
|
|
cmp byte[CheatSrcSearchType],1
|
|
je .compare
|
|
call InsertSearchCharacter
|
|
jmp .nomovedown
|
|
.compare
|
|
cmp dh,','
|
|
je .lessthan
|
|
cmp dh,'N'
|
|
jne .notlessthan
|
|
.lessthan
|
|
mov byte[CheatCompareValue],0
|
|
.notlessthan
|
|
cmp dh,'.'
|
|
je .greaterthan
|
|
cmp dh,'E'
|
|
jne .notgreaterthan
|
|
.greaterthan
|
|
mov byte[CheatCompareValue],1
|
|
.notgreaterthan
|
|
cmp dh,'W'
|
|
je .equalthan
|
|
cmp dh,'+'
|
|
jne .notequalthan
|
|
.equalthan
|
|
mov byte[CheatCompareValue],2
|
|
.notequalthan
|
|
cmp dh,'A'
|
|
jne .notnotequalthan
|
|
mov byte[CheatCompareValue],3
|
|
.notnotequalthan
|
|
|
|
%ifdef __UNIXSDL__ ; Select with Arrow Keys
|
|
cmp al,90
|
|
je .yesmoveup
|
|
cmp dword[numlockptr],1
|
|
je .nomoveup
|
|
cmp al,72
|
|
jne .nomoveup
|
|
.yesmoveup
|
|
%else
|
|
cmp al,72
|
|
jne .nomoveup
|
|
%endif
|
|
cmp byte[CheatCompareValue],0
|
|
je .nomoveup
|
|
dec byte[CheatCompareValue]
|
|
.nomoveup
|
|
%ifdef __UNIXSDL__
|
|
cmp al,96
|
|
je .yesmovedown
|
|
cmp dword[numlockptr],1
|
|
je .nomovedown
|
|
cmp al,80
|
|
jne .nomovedown
|
|
.yesmovedown
|
|
%else
|
|
cmp al,80
|
|
jne .nomovedown
|
|
%endif
|
|
cmp byte[CheatCompareValue],3
|
|
je .nomovedown
|
|
inc byte[CheatCompareValue]
|
|
|
|
.nomovedown ; Restart/View/Search Buttons
|
|
cmp dh,'R'
|
|
jne .notrestart
|
|
mov byte[CheatWinMode],0
|
|
mov byte[CheatSearchStatus],0
|
|
.notrestart
|
|
cmp dh,'V'
|
|
jne .notview
|
|
mov byte[CheatWinMode],2
|
|
.notview
|
|
cmp dh,13
|
|
je .searchprocess
|
|
cmp dh,'S'
|
|
jne .nosearchprocess
|
|
.searchprocess
|
|
cmp byte[CheatSearchStatus],1
|
|
je .nosearchprocess
|
|
call CheatCodeSearchProcess
|
|
.nosearchprocess
|
|
ret
|
|
|
|
.view ; View
|
|
cmp dword[NumCheatSrc],0 ; Return Hotkey
|
|
jne .nozero
|
|
cmp dh,27
|
|
je .yesret
|
|
cmp dh,'R'
|
|
jne .notreturnb
|
|
.yesret
|
|
mov byte[CheatWinMode],1
|
|
.notreturnb
|
|
ret
|
|
|
|
.nozero ; Select Codes with arrow keys
|
|
%ifdef __UNIXSDL__
|
|
cmp al,89
|
|
je .yeshome
|
|
cmp dword[numlockptr],1
|
|
je .nohome
|
|
cmp al,71
|
|
jne .nohome
|
|
.yeshome
|
|
%else
|
|
cmp al,71
|
|
jne .nohome
|
|
%endif
|
|
mov dword[GUIcurrentchtsrccursloc],0
|
|
mov dword[GUIcurrentchtsrcviewloc],0
|
|
ret
|
|
.nohome
|
|
%ifdef __UNIXSDL__
|
|
cmp al,95
|
|
je .yesendp
|
|
cmp dword[numlockptr],1
|
|
je .noendp
|
|
cmp al,79
|
|
jne .noendp
|
|
.yesendp
|
|
%else
|
|
cmp al,79
|
|
jne .noendp
|
|
%endif
|
|
mov eax,[NumCheatSrc]
|
|
dec eax
|
|
mov [GUIcurrentchtsrccursloc],eax
|
|
sub eax,11
|
|
mov [GUIcurrentchtsrcviewloc],eax
|
|
test dword[GUIcurrentchtsrcviewloc],8000000h
|
|
jz .posve
|
|
mov dword[GUIcurrentchtsrcviewloc],0
|
|
.posve
|
|
ret
|
|
.noendp
|
|
%ifdef __UNIXSDL__
|
|
cmp al,90
|
|
je .up
|
|
cmp dword[numlockptr],1
|
|
je .noup
|
|
cmp al,72
|
|
jne .noup
|
|
%else
|
|
cmp al,72
|
|
jne .noup
|
|
%endif
|
|
.up
|
|
cmp dword[GUIcurrentchtsrccursloc],0
|
|
je .noup
|
|
mov ebx,[GUIcurrentchtsrccursloc]
|
|
cmp [GUIcurrentchtsrcviewloc],ebx
|
|
jne .noviewdec
|
|
dec dword[GUIcurrentchtsrcviewloc]
|
|
.noviewdec
|
|
dec dword[GUIcurrentchtsrccursloc]
|
|
.noup
|
|
%ifdef __UNIXSDL__
|
|
cmp al,96
|
|
je .yesdown
|
|
cmp dword[numlockptr],1
|
|
je .nodown
|
|
cmp al,80
|
|
jne .nodown
|
|
.yesdown
|
|
%else
|
|
cmp al,80
|
|
jne .nodown
|
|
%endif
|
|
mov ebx,[GUIcurrentchtsrccursloc]
|
|
inc ebx
|
|
cmp ebx,[NumCheatSrc]
|
|
jae .noviewinc
|
|
inc dword[GUIcurrentchtsrccursloc]
|
|
sub ebx,12
|
|
cmp ebx,[GUIcurrentchtsrcviewloc]
|
|
jne .noviewinc
|
|
inc dword[GUIcurrentchtsrcviewloc]
|
|
.noviewinc
|
|
.nodown
|
|
|
|
%ifdef __UNIXSDL__ ; Pageup/Down to select Cheats
|
|
cmp al,91
|
|
je .yespgup
|
|
cmp dword[numlockptr],1
|
|
je .nopageup
|
|
cmp al,73
|
|
jne .nopageup
|
|
.yespgup
|
|
%else
|
|
cmp al,73
|
|
jne .nopageup
|
|
%endif
|
|
sub dword[GUIcurrentchtsrcviewloc],12
|
|
sub dword[GUIcurrentchtsrccursloc],12
|
|
test dword[GUIcurrentchtsrcviewloc],8000000h
|
|
jz .posv
|
|
mov dword[GUIcurrentchtsrcviewloc],0
|
|
.posv
|
|
test dword[GUIcurrentchtsrccursloc],8000000h
|
|
jz .posc
|
|
mov dword[GUIcurrentchtsrccursloc],0
|
|
.posc
|
|
.nopageup
|
|
%ifdef __UNIXSDL__
|
|
cmp al,97
|
|
je .yespgdn
|
|
cmp dword[numlockptr],1
|
|
je .nopagedown
|
|
cmp al,81
|
|
jne .nopagedown
|
|
.yespgdn
|
|
%else
|
|
cmp al,81
|
|
jne .nopagedown
|
|
%endif
|
|
add dword[GUIcurrentchtsrcviewloc],12
|
|
add dword[GUIcurrentchtsrccursloc],12
|
|
mov ebx,[NumCheatSrc]
|
|
dec ebx
|
|
cmp dword[GUIcurrentchtsrccursloc],ebx
|
|
jb .poscd
|
|
mov [GUIcurrentchtsrccursloc],ebx
|
|
.poscd
|
|
sub ebx,11
|
|
cmp dword[GUIcurrentchtsrcviewloc],ebx
|
|
jl .posvd
|
|
test ebx,8000000h
|
|
jz .noneg
|
|
mov ebx,0
|
|
.noneg
|
|
mov [GUIcurrentchtsrcviewloc],ebx
|
|
.posvd
|
|
.nopagedown
|
|
|
|
cmp dh,27 ; Return/Add Buttons
|
|
je .yesretb
|
|
cmp dh,'R'
|
|
jne .notreturn
|
|
.yesretb
|
|
mov byte[CheatWinMode],1
|
|
.notreturn
|
|
cmp dh,13
|
|
je .yesadd
|
|
cmp dh,'A'
|
|
jne .notadd
|
|
.yesadd
|
|
mov byte[CheatWinMode],3
|
|
mov byte[CurCStextpos],0
|
|
mov byte[CSInputDisplay],'_'
|
|
mov byte[CSInputDisplay+1],0
|
|
mov byte[CSDescDisplay],0
|
|
.notadd
|
|
ret
|
|
|
|
.add ; Add Cheat Window
|
|
cmp dh,27 ; Button Hotkey
|
|
je .yesretc
|
|
cmp byte[CurCStextpos],1
|
|
je .notreturnc
|
|
cmp dh,'R'
|
|
jne .notreturnc
|
|
.nofastforward
|
|
.yesretc
|
|
mov byte[CheatWinMode],2
|
|
.notreturnc
|
|
cmp byte[CurCStextpos],0
|
|
jne near .nofirstbox
|
|
cmp dh,9
|
|
je .yestab
|
|
cmp byte[CSOverValue],1
|
|
je .noret
|
|
cmp dh,13
|
|
jne .noret
|
|
.yestab
|
|
mov byte[CurCStextpos],1
|
|
.noret
|
|
call InsertSearchCharacter
|
|
ret
|
|
.nofirstbox
|
|
cmp byte[CurCStextpos],1
|
|
jne near .nosecondbox
|
|
cmp dh,9
|
|
jne .notab
|
|
mov byte[CurCStextpos],0
|
|
.notab
|
|
cmp dh,13
|
|
jne .noenter
|
|
jmp AddCSCheatCode
|
|
.noenter
|
|
call InsertSearchDescription
|
|
ret
|
|
.nosecondbox
|
|
ret
|
|
|
|
; Allows you to use the arrow keys to select a state number, and Enter to pick
|
|
GUIStateSelKeys:
|
|
cmp al,13
|
|
jne .noenter
|
|
xor eax,eax
|
|
mov al,[GUIwinptr]
|
|
dec eax
|
|
mov byte[GUIwinactiv+2],0
|
|
mov byte[GUIwinorder+eax],0
|
|
dec byte[GUIwinptr]
|
|
mov al,[GUIpmenupos]
|
|
mov [GUIcmenupos],al
|
|
ret
|
|
.noenter
|
|
mov bl,al
|
|
mov eax,[current_zst]
|
|
mov dl,10
|
|
div dl
|
|
movzx ecx,ah
|
|
%ifdef __UNIXSDL__
|
|
cmp bl,92 ; linux keypad left
|
|
je .yesleft
|
|
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
|
|
je .noleft
|
|
%endif
|
|
cmp bl,75 ; linux numpad left, non-linux num/keypad left
|
|
jne .noleft
|
|
.yesleft
|
|
cmp cl,0
|
|
jne .no0th
|
|
mov cl,4
|
|
jmp .done
|
|
.no0th
|
|
cmp cl,5
|
|
jne .no5th
|
|
mov cl,9
|
|
jmp .done
|
|
.no5th
|
|
dec cl
|
|
jmp .done
|
|
.noleft
|
|
%ifdef __UNIXSDL__
|
|
cmp bl,94 ; linux keypad right
|
|
je .yesright
|
|
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
|
|
je .noright
|
|
%endif
|
|
cmp bl,77 ; linux numpad right, non-linux num/keypad right
|
|
jne .noright
|
|
.yesright
|
|
cmp cl,4
|
|
jne .no4th
|
|
mov cl,0
|
|
jmp .done
|
|
.no4th
|
|
cmp cl,9
|
|
jne .no9th
|
|
mov cl,5
|
|
jmp .done
|
|
.no9th
|
|
inc cl
|
|
jmp .done
|
|
.noright
|
|
%ifdef __UNIXSDL__
|
|
cmp bl,90 ; linux keypad up
|
|
je .yesvert
|
|
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
|
|
je .noup
|
|
%endif
|
|
cmp bl,72 ; linux numpad up, non-linux num/keypad up
|
|
je .yesvert
|
|
.noup
|
|
%ifdef __UNIXSDL__
|
|
cmp bl,96 ; linux keypad down
|
|
je .yesvert
|
|
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
|
|
je .novert
|
|
%endif
|
|
cmp bl,80 ; linux numpad down, non-linux num/keypad down
|
|
jne .novert
|
|
.yesvert
|
|
cmp cl,5
|
|
jge .subme
|
|
add cl,5
|
|
jmp .done
|
|
.subme
|
|
sub cl,5
|
|
jmp .done
|
|
.novert
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try1
|
|
cmp bl,04Fh
|
|
je .yes1
|
|
.try1
|
|
%endif
|
|
test byte[pressed+2],1
|
|
jz .no1
|
|
.yes1
|
|
mov cl,1
|
|
jmp .done
|
|
.no1
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try2
|
|
cmp bl,050h
|
|
je .yes2
|
|
.try2
|
|
%endif
|
|
test byte[pressed+3],1
|
|
jz .no2
|
|
.yes2
|
|
mov cl,2
|
|
jmp .done
|
|
.no2
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try3
|
|
cmp bl,051h
|
|
je .yes3
|
|
.try3
|
|
%endif
|
|
test byte[pressed+4],1
|
|
jz .no3
|
|
.yes3
|
|
mov cl,3
|
|
jmp .done
|
|
.no3
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try4
|
|
cmp bl,04Bh
|
|
je .yes4
|
|
.try4
|
|
%endif
|
|
test byte[pressed+5],1
|
|
jz .no4
|
|
.yes4
|
|
mov cl,4
|
|
jmp .done
|
|
.no4
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try5
|
|
test byte[pressed+04Ch],1
|
|
jnz .yes5
|
|
.try5
|
|
%endif
|
|
test byte[pressed+6],1
|
|
jz .no5
|
|
.yes5
|
|
mov cl,5
|
|
jmp .done
|
|
.no5
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try6
|
|
cmp bl,04Dh
|
|
je .yes6
|
|
.try6
|
|
%endif
|
|
test byte[pressed+7],1
|
|
jz .no6
|
|
.yes6
|
|
mov cl,6
|
|
jmp .done
|
|
.no6
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try7
|
|
cmp bl,047h
|
|
je .yes7
|
|
.try7
|
|
%endif
|
|
test byte[pressed+8],1
|
|
jz .no7
|
|
.yes7
|
|
mov cl,7
|
|
jmp .done
|
|
.no7
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try8
|
|
cmp bl,048h
|
|
je .yes8
|
|
.try8
|
|
%endif
|
|
test byte[pressed+9],1
|
|
jz .no8
|
|
.yes8
|
|
mov cl,8
|
|
jmp .done
|
|
.no8
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try9
|
|
cmp bl,049h
|
|
je .yes9
|
|
.try9
|
|
%endif
|
|
test byte[pressed+10],1
|
|
jz .no9
|
|
.yes9
|
|
mov cl,9
|
|
jmp .done
|
|
.no9
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .try0
|
|
test byte[pressed+052h],1
|
|
jnz .yes0
|
|
.try0
|
|
%endif
|
|
test byte[pressed+11],1
|
|
jz .no0
|
|
.yes0
|
|
mov cl,0
|
|
jmp .done
|
|
.no0
|
|
jmp .nochange
|
|
.done
|
|
mul dl
|
|
add al,cl
|
|
mov [current_zst],eax
|
|
ret
|
|
.nochange
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .trypgup
|
|
cmp bl,91
|
|
je .yespgup
|
|
.trypgup
|
|
%endif
|
|
cmp bl,73
|
|
jne .nopgup
|
|
.yespgup
|
|
cmp dword[current_zst],90
|
|
jge .nochange2
|
|
add dword[current_zst],10
|
|
ret
|
|
.nopgup
|
|
%ifdef __UNIXSDL__
|
|
cmp dword[numlockptr],0 ; if numlock on, let's try this first
|
|
je .trypgdn
|
|
cmp bl,97
|
|
je .yespgdn
|
|
.trypgdn
|
|
%endif
|
|
cmp bl,81
|
|
jne .nopgdn
|
|
.yespgdn
|
|
cmp dword[current_zst],10
|
|
jl .nochange2
|
|
sub dword[current_zst],10
|
|
ret
|
|
.nopgdn
|
|
.nochange2
|
|
ret
|
|
|
|
; Allows you to select boxes with the arrow keys, Enter to choose
|
|
GUIResetKeys:
|
|
%ifdef __UNIXSDL__
|
|
cmp al,92
|
|
je .yesleft
|
|
cmp dword[numlockptr],1
|
|
je .noleft
|
|
cmp al,75
|
|
jne .noleft
|
|
.yesleft
|
|
%else
|
|
cmp al,75
|
|
jne .noleft
|
|
%endif
|
|
mov byte[GUICResetPos],0
|
|
.noleft
|
|
%ifdef __UNIXSDL__
|
|
cmp al,94
|
|
je .yesright
|
|
cmp dword[numlockptr],1
|
|
je .noright
|
|
cmp al,77
|
|
jne .noright
|
|
.yesright
|
|
%else
|
|
cmp al,77
|
|
jne .noright
|
|
%endif
|
|
mov byte[GUICResetPos],1
|
|
.noright
|
|
cmp al,13
|
|
jne .noconf
|
|
cmp byte[GUICResetPos],0
|
|
je .yesreset
|
|
jmp .noreset
|
|
.noconf
|
|
ToUpperASM
|
|
cmp dh,'Y'
|
|
jne .notyesreset
|
|
.yesreset
|
|
mov byte[GUICBHold],2
|
|
jmp GUIProcReset
|
|
.notyesreset
|
|
cmp dh,'N'
|
|
jne .notnoreset
|
|
.noreset
|
|
xor eax,eax
|
|
mov al,[GUIwinptr]
|
|
dec eax
|
|
mov byte[GUIwinactiv+12],0
|
|
mov byte[GUIwinorder+eax],0
|
|
dec byte[GUIwinptr]
|
|
mov al,[GUIpmenupos]
|
|
mov [GUIcmenupos],al
|
|
.notnoreset
|
|
ret
|
|
|
|
; Allows you to select boxes with the arrow keys, Enter to choose
|
|
GUIStateKeys:
|
|
%ifdef __UNIXSDL__
|
|
cmp al,92
|
|
je .yesleft
|
|
cmp dword[numlockptr],1
|
|
je .noleft
|
|
cmp al,75
|
|
jne .noleft
|
|
.yesleft
|
|
%else
|
|
cmp al,75
|
|
jne .noleft
|
|
%endif
|
|
mov byte[GUICStatePos],0
|
|
.noleft
|
|
%ifdef __UNIXSDL__
|
|
cmp al,94
|
|
je .yesright
|
|
cmp dword[numlockptr],1
|
|
je .noright
|
|
cmp al,77
|
|
jne .noright
|
|
.yesright
|
|
%else
|
|
cmp al,77
|
|
jne .noright
|
|
%endif
|
|
mov byte[GUICStatePos],1
|
|
.noright
|
|
cmp al,13
|
|
jne .noconf
|
|
cmp byte[GUICStatePos],0
|
|
je .yesreset
|
|
jmp .noreset
|
|
.noconf
|
|
ToUpperASM
|
|
cmp dh,'Y'
|
|
jne .notyesreset
|
|
.yesreset
|
|
mov byte[GUICBHold],10
|
|
jmp GUIProcStates
|
|
.notyesreset
|
|
cmp dh,'N'
|
|
jne .notnoreset
|
|
.noreset
|
|
xor eax,eax
|
|
mov al,[GUIwinptr]
|
|
dec eax
|
|
mov byte[GUIwinactiv+14],0
|
|
mov byte[GUIwinorder+eax],0
|
|
dec byte[GUIwinptr]
|
|
mov al,[GUIpmenupos]
|
|
mov [GUIcmenupos],al
|
|
.notnoreset
|
|
ret
|
|
|
|
GUILoadKeys:
|
|
cmp dx,0
|
|
jne near .keypressed
|
|
.nokeypressed
|
|
ret
|
|
.keypressed
|
|
mov [gui_key],dh
|
|
mov [gui_key_extended],dl
|
|
pushad
|
|
call GUILoadKeysNavigate
|
|
cmp eax,1
|
|
popad
|
|
je .nokeypressed
|
|
cmp byte[GUILoadPos],0
|
|
je near .nobacksp
|
|
cmp dh,8
|
|
jne .nobacksp
|
|
mov byte[GUILDFlash],0
|
|
dec byte[GUILoadPos]
|
|
xor eax,eax
|
|
mov al,[GUILoadPos]
|
|
ret
|
|
.nobacksp
|
|
cmp dh,8
|
|
je near .nokeypressed
|
|
cmp byte[GUILoadPos],36
|
|
je near .nokeypressed
|
|
mov byte[GUILDFlash],0
|
|
xor eax,eax
|
|
mov al,[GUILoadPos]
|
|
mov [GUILoadTextA+eax],dh
|
|
inc byte[GUILoadPos]
|
|
pushad
|
|
call GUILoadKeysJumpTo
|
|
popad
|
|
ret
|
|
|
|
WaitForKey:
|
|
.again3
|
|
mov edx,10
|
|
.again4
|
|
mov cx,1000
|
|
push edx
|
|
call delay
|
|
call JoyRead
|
|
pop edx
|
|
xor ebx,ebx
|
|
mov ecx,256+128+64
|
|
.b2
|
|
cmp byte[pressed+ebx],0
|
|
jne near .again3
|
|
inc ebx
|
|
dec ecx
|
|
jnz .b2
|
|
dec edx
|
|
jnz near .again4
|
|
.again
|
|
call JoyRead
|
|
xor ebx,ebx
|
|
mov ecx,256+128+64
|
|
.b
|
|
cmp byte[pressed+ebx],0
|
|
jne .pressedokay
|
|
inc ebx
|
|
dec ecx
|
|
jnz .b
|
|
jmp .again
|
|
.pressedokay
|
|
.again2
|
|
call Check_Key
|
|
or al,al
|
|
jz .nokey
|
|
call Get_Key
|
|
jmp .again2
|
|
.nokey
|
|
cmp byte[MouseDis],1
|
|
je .mousedis2
|
|
push ebx
|
|
; mov eax,0Bh
|
|
; int 33h
|
|
pop ebx
|
|
.mousedis2
|
|
mov byte[GUIpclicked],1
|
|
ret
|
|
|