Files
ZSNES/zsnes/src/gui/guikeys.inc
2006-02-26 01:08:57 +00:00

3192 lines
61 KiB
PHP

;Copyright (C) 1997-2006 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;
;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.
; 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
%%noclick
%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
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 ch,ch
xor cl,cl
.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 0CBh,75
GUIgetprkeys 0CDh,77
GUIgetprkeys 0C9h,73
GUIgetprkeys 0D1h,81
GUIgetprkeys 0C7h,71
GUIgetprkeys 0CFh,79
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,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
cmp dh,'a'
jb .nolower
cmp dh,'z'
ja .nolower
sub dh,'a'-'A'
.nolower
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,'1'
jne .noin1
mov byte[GUIcrowpos],0
.noin1
cmp dh,'2'
jne .noin2
mov byte[GUIcrowpos],1
.noin2
cmp dh,'3'
jne .noin3
mov byte[GUIcrowpos],2
.noin3
cmp dh,'4'
jne .noin4
mov byte[GUIcrowpos],3
.noin4
cmp dh,'5'
jne .noin5
mov byte[GUIcrowpos],4
.noin5
cmp dh,'A'
jne .noina
mov byte[GUIcrowpos],6
.noina
cmp dh,'F'
jne .noinc
mov byte[GUIcrowpos],7
.noinc
cmp dh,'O'
jne .noino
mov byte[GUIcrowpos],9
.noino
cmp dh,'V'
jne .noinv
mov byte[GUIcrowpos],10
.noinv
cmp dh,'S'
jne .noins
mov byte[GUIcrowpos],11
.noins
cmp dh,'P'
jne .noinp
mov byte[GUIcrowpos],12
.noinp
cmp dh,'E'
jne .noine
mov byte[GUIcrowpos],13
.noine
cmp dh,'D'
jne .noind
mov byte[GUIcrowpos],14
.noind
.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
GUITCPIPKeys:
ret
GUIOptionKeys:
cmp dh,'a'
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
cmp dh,'N' ; Checkboxes
jne .nonewgfx
xor eax,eax
mov al,[cvidmode]
cmp byte[GUINGVID+eax],1
jne near .invalidng
xor byte[newengen],1
mov al,[newengen]
mov [cfgnewgfx],al
.invalidng
.nonewgfx
cmp dh,'M'
jne .nommxcopy
xor byte[MMXSupport],1
call MMXCheck
.nommxcopy
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,'I'
%elifdef __WIN32__
GUIKeyCheckbox HighPriority,'H'
pushad
call CheckPriority
popad
%endif
GUIKeyCheckbox FPSAtStart,'F'
GUIKeyCheckbox Turbo30hz,'E'
GUIKeyCheckbox TimerEnable,'C'
GUIKeyCheckbox OldGfxMode2,'O'
GUIKeyCheckbox DontSavePath,'D'
GUIKeyCheckbox SmallMsgText,'S'
GUIKeyCheckbox AutoPatch,'P'
GUIKeyCheckbox RomInfo,'T'
GUIKeyCheckbox AllowUDLR,'A'
%ifndef __MSDOS__
GUIKeyCheckbox PauseFocusChange,'B'
%endif
%ifdef __WIN32__
GUIKeyCheckbox DisableScreenSaver,'I'
pushad
call CheckScreenSaver
popad
%endif
ret
GUIAboutKeys
cmp dh,'a' ; Setup
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
cmp dh,'E'
jne .noeegg
xor byte[EEgg],1
.noeegg
ret
GUISaveKeys:
cmp dh,'a' ; Setup
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
cmp dh,'I' ; Checkboxes
jne .noautoincsave
xor byte[AutoIncSaveSlot],1
mov byte[firstsaveinc],1
.noautoincsave
GUIKeyCheckbox SRAMSave5Sec,'C'
GUIKeyCheckbox LatestSave,'S'
GUIKeyCheckbox AutoState,'A'
GUIKeyCheckbox SRAMState,'L'
GUIKeyCheckbox PauseLoad,'P'
GUIKeyCheckbox PauseRewind,'R'
ret
GUISpeedKeys:
cmp dh,'a' ; Setup
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
GUIKeyCheckbox FastFwdToggle,'T' ; Checkbox
cmp dh,'A' ; Framerate Checkboxes
jne .noautofr
mov byte[FPSOn],0
cmp byte[frameskip],0
je .zero
mov byte[frameskip],0
jmp .notzero
.zero
mov byte[frameskip],2
.notzero
.noautofr
ret
GUIAddonKeys:
cmp dh,'a' ;Setup
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
GUIKeyButtonHole snesmouse,0,'N' ;Radio Buttons
GUIKeyButtonHole snesmouse,1,'1'
GUIKeyButtonHole snesmouse,2,'2'
GUIKeyButtonHole snesmouse,3,'S'
GUIKeyButtonHole snesmouse,4,'L'
ret
GUIChipKeys:
cmp dh,'a' ;Setup
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
GUIKeyCheckbox nssdip1,'1' ; Checkboxes
GUIKeyCheckbox nssdip2,'2'
GUIKeyCheckbox nssdip3,'3'
GUIKeyCheckbox nssdip4,'4'
GUIKeyCheckbox nssdip5,'5'
GUIKeyCheckbox nssdip6,'6'
ret
GUIGUIOptnsKeys:
cmp dh,'a'
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
GUIKeyCheckbox mousewrap,'M' ; Checkboxes
GUIKeyCheckbox mouseshad,'S'
GUIKeyCheckbox lastcursres,'K'
GUIKeyCheckbox resetposn,'W'
GUIKeyCheckbox GUIClick,'C'
GUIKeyCheckbox JoyPad1Move,'U'
GUIKeyCheckbox GUIEnableTransp,'T'
cmp dh,'F'
jne .guioptn8
xor byte[FilteredGUI],1
cmp byte[En2xSaI],1
jnae .guioptn8
call ClearScreen
pushad
call Clear2xSaIBuffer
popad
.guioptn8
cmp byte[hqFilter],0
je .guioptn9
call ClearScreen
pushad
call Clear2xSaIBuffer
popad
.guioptn9
cmp dh,'N'
jne .guioptn10
GUIkeystoggleoptn byte[GUIEffect],1
.guioptn10
cmp dh,'R'
jne .guioptn11
GUIkeystoggleoptn byte[GUIEffect],4
.guioptn11
cmp dh,'E'
jne .guioptn12
GUIkeystoggleoptn byte[GUIEffect],2
.guioptn12
cmp dh,'B'
jne .guioptn13
GUIkeystoggleoptn byte[GUIEffect],3
.guioptn13
%ifdef __WIN32__
GUIKeyCheckbox MouseWheel,'H'
GUIKeyCheckbox TrapMouseCursor,'P'
GUIKeyCheckbox AlwaysOnTop,'A'
GUIKeyCheckbox SaveMainWindowPos,'V'
GUIKeyCheckbox AllowMultipleInst,'L'
%endif
ret
GUIVideoKeys:
cmp dh,'a'
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
xor eax,eax
mov al,[cvidmode]
cmp byte[GUISLVID+eax],0
je .nofullscanlines
cmp dh,'F'
jne .nofullscanlines
cmp byte[En2xSaI],0
jne .nofullscanlines
cmp byte[hqFilter],0
jne .nofullscanlines
call ClearScreen
GUIkeystoggleoptn byte[scanlines],1
%ifdef __MSDOS__
cmp byte[cvidmode],2
jne .nomodeq
jmp .refresh
.nomodeq
cmp byte[cvidmode],5
jne .nofullscanlines
.refresh
mov byte[cbitmode],1
call initvideo2
mov byte[cbitmode],0
call GUISetPal
%endif
.nofullscanlines
xor eax,eax
mov al,[cvidmode]
cmp byte[GUIHSVID+eax],0
je near .noquarterscanlines
cmp dh,'5'
jne .nohalfscanlines
cmp byte[En2xSaI],0
jne .nohalfscanlines
cmp byte[hqFilter],0
jne .nohalfscanlines
call ClearScreen
GUIkeystoggleoptn byte[scanlines],3
%ifdef __MSDOS__
;cmp byte[cvidmode],2
;jne .nohalfscanlines
;mov byte[cbitmode],1
;call initvideo2
;mov byte[cbitmode],0
;call GUISetPal
%endif
.nohalfscanlines
cmp dh,'2'
jne .noquarterscanlines
cmp byte[En2xSaI],0
jne .noquarterscanlines
cmp byte[hqFilter],0
jne .noquarterscanlines
call ClearScreen
GUIkeystoggleoptn byte[scanlines],2
%ifdef __MSDOS__
;cmp byte[cvidmode],2
;jne .noquarterscanlines
;mov byte[cbitmode],1
;call initvideo2
;mov byte[cbitmode],0
;call GUISetPal
%endif
.noquarterscanlines
cmp dh,'Q'
jne .nohqfilter
xor ebx,ebx
mov bl,[cvidmode]
cmp byte[GUIHQ2X+ebx],0
jne .hqfilter
cmp byte[GUIHQ3X+ebx],0
jne .hqfilter
cmp byte[GUIHQ4X+ebx],0
jne .hqfilter
jmp .nohqfilter
.hqfilter
xor byte[hqFilter],1
jz .nohqfilter
mov byte[scanlines],0
mov byte[cfgscanline],0
mov byte[En2xSaI],0
mov byte[antienab],0
mov byte[cfginterp],0
.nohqfilter
cmp dh,'X'
jne .no2xsai
xor ebx,ebx
mov bl,[cvidmode]
cmp byte[GUI2xVID+ebx],0
je near .no2xsai
pushad
call Clear2xSaIBuffer
popad
GUIkeystoggleoptn byte[En2xSaI],1
.no2xsai
cmp dh,'E'
jne .nosupereagle
xor ebx,ebx
mov bl,[cvidmode]
cmp byte[GUI2xVID+ebx],0
je near .nosupereagle
pushad
call Clear2xSaIBuffer
popad
GUIkeystoggleoptn byte[En2xSaI],2
.nosupereagle
cmp dh,'S'
jne .nosuper2xsai
xor ebx,ebx
mov bl,[cvidmode]
cmp byte[GUI2xVID+ebx],0
je near .nosuper2xsai
pushad
call Clear2xSaIBuffer
popad
GUIkeystoggleoptn byte[En2xSaI],3
.nosuper2xsai
cmp dh,'I'
jne .nointerpolationwin
xor eax,eax
mov al,[cvidmode]
cmp byte[GUII2VID+eax],0
je .nointerpolationwin
xor byte[antienab],1
mov al,[antienab]
mov [cfginterp],al
.nointerpolationwin
cmp dh,'I'
jne .nointerpolation
xor eax,eax
mov al,[cvidmode]
cmp byte[GUIIEVID+eax],0
je .nointerpolation
xor byte[antienab],1
mov al,[antienab]
mov [cfginterp],al
.nointerpolation
cmp dh,'C'
jne .nofullscreen
xor eax,eax
mov al,[cvidmode]
cmp byte[GUIFSVID+eax],0
je .nofullscreen
call ClearScreen
xor byte[ScreenScale],1
mov al,[ScreenScale]
mov [GUIScreenScale],al
push eax
push ecx
mov eax,[vidbufferofsb]
mov ecx,288*128
.fsloop
mov dword[eax],0
add eax,4
dec ecx
jnz .fsloop
pop ecx
pop eax
.nofullscreen
cmp dh,'M'
jne .nosmallscreen
xor eax,eax
mov al,[cvidmode]
cmp byte[GUISSVID+eax],0
je .nosmallscreen
call ClearScreen
xor byte[smallscreenon],1
mov al,[smallscreenon]
mov [GUIsmallscreenon],al
push eax
push ecx
mov eax,[vidbufferofsb]
mov ecx,288*128
.ssloop
mov dword[eax],0
add eax,4
dec ecx
jnz .ssloop
pop ecx
pop eax
.nosmallscreen
cmp dh,'H'
jne .nohiresmode7
xor ebx,ebx
mov bl,[cvidmode]
cmp byte[GUIM7VID+ebx],0
je .nohiresmode7
xor byte[Mode7HiRes16b],1
.nohiresmode7
cmp dh,'B'
jne .nobilinearfilter
xor ebx,ebx
mov bl,[cvidmode]
cmp byte[GUIBIFIL+ebx],0
je .nobilinearfilter
xor byte[BilinearFilter],1
.nobilinearfilter
%ifdef __WIN32__
cmp dh,'T'
jne .notriplebufferwin
xor eax,eax
mov al,[cvidmode]
cmp byte[GUITBWVID+eax],0
je near .notriplebufferwin
xor byte[TripleBufferWin],1
; mov byte[vsyncon],0
; mov byte[cfgvsync],0
call initDirectDraw
pushad
call Clear2xSaIBuffer
popad
.notriplebufferwin
%elifdef __MSDOS__
cmp dh,'T'
jne .notriplebuffer
xor ebx,ebx
mov bl,[cvidmode]
cmp byte[GUITBVID+ebx],0
je .notriplebuffer
xor byte[Triplebufen],1
; mov byte[vsyncon],0
; mov byte[cfgvsync],0
.notriplebuffer
%endif
cmp dh,'G'
jne .nograyscale
xor byte[GrayscaleMode],1
.nograyscale
%ifndef __UNIXSDL__
cmp dh,'V'
jne .novsync
xor byte[vsyncon],1
mov al,[vsyncon]
mov [cfgvsync],al
%ifdef __WIN32__
call initDirectDraw
pushad
call Clear2xSaIBuffer
popad
%endif
%ifdef __MSDOS__
; mov byte[Triplebufen],0
%endif
.novsync
%endif
; "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,4
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,5
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],5
sub dword[GUIcurrentvideocursloc],5
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],5
add dword[GUIcurrentvideocursloc],5
mov ebx,[NumVideoModes]
dec ebx
cmp dword[GUIcurrentvideocursloc],ebx
jb .poscd
mov [GUIcurrentvideocursloc],ebx
.poscd
sub ebx,4
cmp dword[GUIcurrentvideoviewloc],ebx
jl .posvd
test ebx,8000000h
jz .noneg
mov ebx,0
.noneg
mov [GUIcurrentvideoviewloc],ebx
.posvd
.nopagedown
ret
GUISoundKeys:
cmp dh,'a'
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
cmp dh,'E'
jne .notenablesound
xor byte[cfgsoundon],1
%ifdef __WIN32__
pushad
call reInitSound
popad
%endif
.notenablesound
%ifdef __MSDOS__
GUIKeyCheckbox cfgforce8b,'F'
%endif
GUIKeyCheckbox cfgStereoSound,'S'
%ifdef __MSDOS__
GUIKeyCheckbox RaisePitch,'A'
%endif
GUIKeyCheckbox PrimaryBuffer,'P'
GUIKeyCheckbox RevStereo,'V'
GUIKeyCheckbox Surround,'U'
GUIKeyCheckbox SoundBufEn,'B'
GUIKeyCheckbox SPCDisable,'D'
cmp dh,'R' ; Sampling Rate
jne .notsrate
xor eax,eax
mov al,[cfgSoundQuality]
mov al,[.sampratenext+eax]
mov [cfgSoundQuality],al
.notsrate
cmp dh,'G'
jne .nogausseninterp
GUIkeystoggleoptn byte[SoundInterpType],1
.nogausseninterp
cmp dh,'C'
jne .nocubicinterp
GUIkeystoggleoptn byte[SoundInterpType],2
.nocubicinterp
%ifndef __MSDOS__
cmp dh,'8'
jne .no8ptinterp
cmp byte[MMXSupport],0
je .no8ptinterp
GUIkeystoggleoptn byte[SoundInterpType],3
.no8ptinterp
%endif
cmp dh,'I'
jne .nosimplefilter
GUIkeystoggleoptn byte[LowPassFilterType],1
.nosimplefilter
cmp dh,'Y'
jne .nodynamicfilter
GUIkeystoggleoptn byte[LowPassFilterType],2
.nodynamicfilter
%ifndef __MSDOS__
cmp dh,'H'
jne .nohiqualityfilter
cmp byte[MMXSupport],0
je .nohiqualityfilter
GUIkeystoggleoptn byte[LowPassFilterType],3
.nohiqualityfilter
%endif
ret
SECTION .data
.sampratenext db 1,4,5,6,2,3,0,0,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 byte[cfgloadsdir],1 ;Need this to know if we should save the path
mov eax,SRAMDir
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
.boxselected
mov ecx,eax
;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
ret
.notbackspace
cmp dh,13 ;Enter
jne .notenter
mov dword[GUIInputBox],0
ret
.notenter
;check if we're at the end
add ecx,dword[GUIInputLimit]
cmp eax,ecx
jne .stillroom
ret
.stillroom
mov [eax],dh
.nokeypressed
ret
SECTION .bss
GUIInputBox resd 1
GUIInputLimit resd 1
SECTION .text
GUIMovieKeys:
cmp dh,'a' ;Setup
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
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'
GUIKeyButtonHole MovieStartMethod,0,'N' ; Start From Radio Buttons
GUIKeyButtonHole MovieStartMethod,1,'P'
GUIKeyButtonHole MovieStartMethod,2,'R'
GUIKeyButtonHole MovieStartMethod,3,'S'
GUIKeyButtonHole MovieVideoMode,0,'O'
GUIKeyButtonHole MovieVideoMode,1,'W'
GUIKeyButtonHole MovieVideoMode,2,'U'
GUIKeyButtonHole MovieVideoMode,3,'F'
GUIKeyButtonHole MovieVideoMode,4,'X'
GUIKeyButtonHole MovieAudioMode,0,'I'
GUIKeyButtonHole MovieAudioMode,1,'A'
GUIKeyCheckbox MovieDisplayFrame,'D' ; Checkbox
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
cmp dh,'a'
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
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:
cmp dh,'a'
jb .nocap
cmp dh,'z'
ja .nocap
sub dh,'z'-'Z'
.nocap
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
%ifdef __UNIXSDL__
cmp al,92 ; linux keypad left
je .yesleft
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je .noleft
%endif
cmp al,75 ; linux numpad left, non-linux num/keypad left
jne .noleft
.yesleft
mov ebx,[statefileloc]
mov cl,[fnamest+ebx]
cmp cl,'t'
jne .no1st
mov cl,'4'
jmp .done
.no1st
cmp cl,'1'
jne .no2nd
mov cl,'t'
jmp .done
.no2nd
cmp cl,'5'
jne .no5th
mov cl,'9'
jmp .done
.no5th
dec cl
jmp .done
.noleft
%ifdef __UNIXSDL__
cmp al,94 ; linux keypad right
je .yesright
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je .noright
%endif
cmp al,77 ; linux numpad right, non-linux num/keypad right
jne .noright
.yesright
mov ebx,[statefileloc]
mov cl,[fnamest+ebx]
cmp cl,'t'
jne .noT
mov cl,'1'
jmp .done
.noT
cmp cl,'4'
jne .no4th
mov cl,'t'
jmp .done
.no4th
cmp cl,'9'
jne .no9th
mov cl,'5'
jmp .done
.no9th
inc cl
jmp .done
.noright
%ifdef __UNIXSDL__
cmp al,90 ; linux keypad up
je .yesvert
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je .noup
%endif
cmp al,72 ; linux numpad up, non-linux num/keypad up
je .yesvert
.noup
%ifdef __UNIXSDL__
cmp al,96 ; linux keypad down
je .yesvert
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je .novert
%endif
cmp al,80 ; linux numpad down, non-linux num/keypad down
jne .novert
.yesvert
mov ebx,[statefileloc]
mov cl,[fnamest+ebx]
cmp cl,'t'
jne .noTv
mov cl,'5'
jmp .done
.noTv
cmp cl,'5'
jne .no5v
mov cl,'t'
jmp .done
.no5v
cmp cl,'5'
jb .noabove
sub cl,5
jmp .done
.noabove
add cl,5
.done
mov [fnamest+ebx],cl
.novert
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
cmp dh,'Y'
je .yesreset
cmp dh,'y'
jne .notyesreset
.yesreset
mov byte[GUICBHold],2
jmp GUIProcReset
.notyesreset
cmp dh,'N'
je .noreset
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
cmp dh,'Y'
je .yesreset
cmp dh,'y'
jne .notyesreset
.yesreset
mov byte[GUICBHold],10
jmp GUIProcStates
.notyesreset
cmp dh,'N'
je .noreset
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:
mov byte[ManualStatus],0
mov dword[ManualCPtr],GUILoadTextA
cmp dword[GUIfileentries],0
je .noright
cmp dword[GUIdirentries],0
je .noright
%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[GUILoadPos],0
xor dword[GUIcurrentfilewin],1
.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[GUILoadPos],0
xor dword[GUIcurrentfilewin],1
.noright
cmp al,13
jne .noenter
mov byte[GUILoadPos],0
mov ebx,GUILoadTextA
.nextl
cmp byte[ebx],':'
je .donel
%ifdef __UNIXSDL__
cmp byte[ebx],'/'
%else
cmp byte[ebx],'\'
%endif
je .donel
inc ebx
cmp byte[ebx],0
je .nofnamel
jmp .nextl
.donel
call GUILoadManualDir
cmp byte[ManualStatus],2
je near .done
ret
.nofnamel
mov ebx,GUILoadTextA
cmp byte[ebx],0
je .nodirtry
mov edx,ebx
call Change_Single_Dir
jc .nodirtry
call GetLoadData.a
ret
.nodirtry
call GUILoadData
ret
.noenter
cmp dword[GUIcurrentfilewin],1
je near .dirwin
%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 byte[GUILoadPos],0
mov dword[GUIcurrentcursloc],0
mov dword[GUIcurrentviewloc],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 byte[GUILoadPos],0
mov eax,[GUIfileentries]
dec eax
mov [GUIcurrentcursloc],eax
sub eax,14
mov [GUIcurrentviewloc],eax
test dword[GUIcurrentviewloc],8000000h
jz .posve
mov dword[GUIcurrentviewloc],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
mov byte[GUILoadPos],0
cmp dword[GUIcurrentcursloc],0
je .noup
mov ebx,[GUIcurrentcursloc]
cmp [GUIcurrentviewloc],ebx
jne .noviewdec
dec dword[GUIcurrentviewloc]
.noviewdec
dec dword[GUIcurrentcursloc]
.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 byte[GUILoadPos],0
mov ebx,[GUIcurrentcursloc]
inc ebx
cmp ebx,[GUIfileentries]
je .noviewinc
inc dword[GUIcurrentcursloc]
sub ebx,15
cmp ebx,[GUIcurrentviewloc]
jne .noviewinc
inc dword[GUIcurrentviewloc]
.noviewinc
.nodown
%ifdef __UNIXSDL__
cmp al,91
je .yespageup
cmp dword[numlockptr],1
je .nopageup
cmp al,73
jne .nopageup
.yespageup
%else
cmp al,73
jne .nopageup
%endif
mov byte[GUILoadPos],0
sub dword[GUIcurrentviewloc],15
sub dword[GUIcurrentcursloc],15
test dword[GUIcurrentviewloc],8000000h
jz .posv
mov dword[GUIcurrentviewloc],0
.posv
test dword[GUIcurrentcursloc],8000000h
jz .posc
mov dword[GUIcurrentcursloc],0
.posc
.nopageup
%ifdef __UNIXSDL__
cmp al,97
je .yespagedn
cmp dword[numlockptr],1
je .nopagedown
cmp al,81
jne .nopagedown
.yespagedn
%else
cmp al,81
jne .nopagedown
%endif
mov byte[GUILoadPos],0
add dword[GUIcurrentviewloc],15
add dword[GUIcurrentcursloc],15
mov ebx,[GUIfileentries]
dec ebx
cmp dword[GUIcurrentcursloc],ebx
jb .poscd
mov [GUIcurrentcursloc],ebx
.poscd
sub ebx,14
cmp dword[GUIcurrentviewloc],ebx
jl .posvd
test ebx,8000000h
jz .noneg
mov ebx,0
.noneg
mov [GUIcurrentviewloc],ebx
.posvd
.nopagedown
.textboxa
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,0
je near .posvl2
cmp dh,13
je near .posvl2
cmp dh,8
je near .posvl2
cmp dh,9
je near .posvl2
cmp byte[GUILoadPos],36
je near .posvl2
mov byte[GUILDFlash],0
xor eax,eax
mov al,[GUILoadPos]
mov [GUILoadTextA+eax],dh
inc byte[GUILoadPos]
; Go to closest matching filename if there are no :, /, or \ in the filename
mov ebx,[ManualCPtr]
cmp byte[ebx],0
je near .posvl2
.next
cmp byte[ebx],':'
je near .posvl2
cmp byte[ebx],'/'
je near .posvl2
cmp byte[ebx],'\'
je near .posvl2
inc ebx
cmp byte[ebx],0
je .done
jmp .next
.done
mov ebx,[GUIfileentries]
xor esi,esi
cmp dword[GUIcurrentfilewin],1
jne near .notdir
mov esi,[GUIfileentries]
mov ebx,[GUIfileentries]
add ebx,[GUIdirentries]
.notdir
mov ecx,esi
mov [.foundval],esi
mov dword[.maxfound],0
.loop2
mov dword[.numfound],0
cmp byte[GUIloadfntype],0
jne .nottype02
mov eax,[spcRamcmp+esi*4]
jmp .type02
.nottype02
mov eax,esi
shl eax,5
add eax,[spcBuffera]
.type02
inc eax
mov edi,[ManualCPtr]
cmp byte[eax],'['
jne .nodrive
inc eax
.nodrive
.loop3
mov dl,[eax]
cmp dl,'a'
jb .nolowerb2
cmp dl,'z'
ja .nolowerb2
sub dl,'a'-'A'
.nolowerb2
mov dh,[edi]
cmp dh,'a'
jb .nolowerb3
cmp dh,'z'
ja .nolowerb3
sub dh,'a'-'A'
.nolowerb3
cmp dl,dh
jne .notfound
cmp byte[ManualStatus],2
jne .notfullload
or dh,dh
jnz .notfullload
or dl,dl
jnz .notfullload
mov byte[ManualStatus],3
.notfullload
or dh,dh
jz .notfound
or dl,dl
jz .notfound
inc dword[.numfound]
inc eax
inc edi
jmp .loop3
.notfound
mov edx,[.numfound]
cmp edx,[.maxfound]
jbe .nfound
mov [.maxfound],edx
mov [.foundval],esi
.nfound
inc esi
cmp esi,ebx
jne .noend2
mov esi,[GUIfileentries]
cmp dword[GUIcurrentfilewin],1
je .noend2
xor esi,esi
.noend2
cmp esi,ecx
jne near .loop2
.skipall
mov esi,[.foundval]
cmp dword[GUIcurrentfilewin],1
jne .notdir2
sub esi,[GUIfileentries]
mov [GUIcurrentdircursloc],esi
mov [GUIcurrentdirviewloc],esi
mov ebx,[GUIdirentries]
sub ebx,15
cmp dword[GUIcurrentdirviewloc],ebx
jb .posvl2
mov [GUIcurrentdirviewloc],ebx
jmp .posvl2
.notdir2
mov [GUIcurrentcursloc],esi
mov [GUIcurrentviewloc],esi
mov ebx,[GUIfileentries]
sub ebx,15
cmp dword[GUIcurrentviewloc],ebx
jb .posvl2
mov [GUIcurrentviewloc],ebx
.posvl2
cmp byte[ManualStatus],3
jne .notdirectload
call GUILoadData
.notdirectload
ret
SECTION .bss
.foundval resd 1
.numfound resd 1
.maxfound resd 1
SECTION .text
.dirwin
%ifdef __UNIXSDL__
cmp al,89
je .yeshome2
cmp dword[numlockptr],1
je .nohome2
cmp al,71
jne .nohome2
.yeshome2
%else
cmp al,71
jne .nohome2
%endif
mov byte[GUILoadPos],0
mov dword[GUIcurrentdircursloc],0
mov dword[GUIcurrentdirviewloc],0
ret
.nohome2
%ifdef __UNIXSDL__
cmp al,95
je .yesendp2
cmp dword[numlockptr],1
je .noendp2
cmp al,79
jne .noendp2
.yesendp2
%else
cmp al,79
jne .noendp2
%endif
mov byte[GUILoadPos],0
mov eax,[GUIdirentries]
dec eax
mov [GUIcurrentdircursloc],eax
sub eax,14
mov [GUIcurrentdirviewloc],eax
test dword[GUIcurrentdirviewloc],8000000h
jz .posve2
mov dword[GUIcurrentdirviewloc],0
.posve2
ret
.noendp2
%ifdef __UNIXSDL__
cmp al,90
je .yesup2
cmp dword[numlockptr],1
je .noup2
cmp al,72
jne .noup2
.yesup2
%else
cmp al,72
jne .noup2
%endif
mov byte[GUILoadPos],0
cmp dword[GUIcurrentdircursloc],0
je .noup2
mov ebx,[GUIcurrentdircursloc]
cmp [GUIcurrentdirviewloc],ebx
jne .noviewdec2
dec dword[GUIcurrentdirviewloc]
.noviewdec2
dec dword[GUIcurrentdircursloc]
.noup2
%ifdef __UNIXSDL__
cmp al,96
je .yesdown2
cmp dword[numlockptr],1
je .nodown2
cmp al,80
jne .nodown2
.yesdown2
%else
cmp al,80
jne .nodown2
%endif
mov byte[GUILoadPos],0
mov ebx,[GUIcurrentdircursloc]
inc ebx
cmp ebx,[GUIdirentries]
je .noviewinc2
inc dword[GUIcurrentdircursloc]
sub ebx,15
cmp ebx,[GUIcurrentdirviewloc]
jne .noviewinc2
inc dword[GUIcurrentdirviewloc]
.noviewinc2
.nodown2
%ifdef __UNIXSDL__
cmp al,91
je .yespgup2
cmp dword[numlockptr],1
je .nopageup2
cmp al,73
jne .nopageup2
.yespgup2
%else
cmp al,73
jne .nopageup2
%endif
mov byte[GUILoadPos],0
sub dword[GUIcurrentdirviewloc],15
sub dword[GUIcurrentdircursloc],15
test dword[GUIcurrentdirviewloc],8000000h
jz .posv2
mov dword[GUIcurrentdirviewloc],0
.posv2
test dword[GUIcurrentdircursloc],8000000h
jz .posc2
mov dword[GUIcurrentdircursloc],0
.posc2
.nopageup2
%ifdef __UNIXSDL__
cmp al,97
je .yespgdn2
cmp dword[numlockptr],1
je .nopagedown2
cmp al,81
jne .nopagedown2
.yespgdn2
%else
cmp al,81
jne .nopagedown2
%endif
mov byte[GUILoadPos],0
add dword[GUIcurrentdirviewloc],15
add dword[GUIcurrentdircursloc],15
mov ebx,[GUIdirentries]
dec ebx
cmp dword[GUIcurrentdircursloc],ebx
jb .poscd2
mov [GUIcurrentdircursloc],ebx
.poscd2
sub ebx,14
cmp dword[GUIcurrentdirviewloc],ebx
jb .posvd2
test ebx,8000000h
jz .noneg2
mov ebx,0
.noneg2
mov [GUIcurrentdirviewloc],ebx
.posvd2
.nopagedown2
jmp .textboxa
WaitForKey:
.again3
mov edx,10
.again4
mov cx,1000
push edx
call delay
call JoyRead
; mov dword[pressed+0CCh],0 ; Up,Down,Left,Right, pl1
; mov dword[pressed+0E8h],0 ; Up,Down,Left,Right, pl2
; mov dword[pressed+14Ch],0 ; Up,Down,Left,Right, pl1
; mov dword[pressed+168h],0 ; Up,Down,Left,Right, pl2
; mov dword[pressed+080h],0 ; Button 7
; mov dword[pressed+081h],0 ; Button 8
; mov dword[pressed+086h],0 ; Button 5
; mov dword[pressed+087h],0 ; Button 6
; mov dword[pressed+100h],0 ; Button 7
; mov dword[pressed+101h],0 ; Button 8
; mov dword[pressed+106h],0 ; Button 5
; mov dword[pressed+107h],0 ; Button 6
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
; mov dword[pressed+0CCh],0 ; Up,Down,Left,Right, pl1
; mov dword[pressed+0E8h],0 ; Up,Down,Left,Right, pl2
; mov dword[pressed+14Ch],0 ; Up,Down,Left,Right, pl1
; mov dword[pressed+168h],0 ; Up,Down,Left,Right, pl2
; mov dword[pressed+080h],0 ; Button 7
; mov dword[pressed+081h],0 ; Button 8
; mov dword[pressed+086h],0 ; Button 5
; mov dword[pressed+087h],0 ; Button 6
; mov dword[pressed+100h],0 ; Button 7
; mov dword[pressed+101h],0 ; Button 8
; mov dword[pressed+106h],0 ; Button 5
; mov dword[pressed+107h],0 ; Button 6
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