3314 lines
61 KiB
PHP
3314 lines
61 KiB
PHP
;Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
|
|
;
|
|
;zsknight@zsnes.com
|
|
;_demo_@zsnes.com
|
|
;pagefault@zsnes.com
|
|
;n-a-c-h@users.sf.net
|
|
;
|
|
;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
|
|
|
|
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:
|
|
cmp byte[HoldCommand],2
|
|
jne .nohold
|
|
ret
|
|
.nohold
|
|
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 __LINUX___
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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,8
|
|
jne near .nonetwin
|
|
cmp byte[CNetType],12
|
|
jne .noprocess7
|
|
cmp byte[ModemProcess],7
|
|
jne .noprocess7
|
|
cmp dh,13
|
|
je .ret
|
|
cmp dh,32
|
|
jb .noprocess7
|
|
.ret
|
|
%ifdef __MSDOS__
|
|
mov al,dh
|
|
call ModemSendChar
|
|
%endif
|
|
ret
|
|
.noprocess7
|
|
cmp dl,27
|
|
jne .nonetwin
|
|
cmp byte[CNetType],2
|
|
je .yesnetwin
|
|
cmp byte[CNetType],3
|
|
je .yesnetwin
|
|
cmp byte[CNetType],10
|
|
je .yesnetwin
|
|
cmp byte[CNetType],11
|
|
je .yesnetwin
|
|
cmp byte[CNetType],12
|
|
je .yesnetwin
|
|
cmp byte[CNetType],15
|
|
je .yesnet15
|
|
jmp .nonetwin
|
|
.yesnet15
|
|
mov byte[CNetType],0
|
|
%ifdef __MSDOS__
|
|
call deinitipx
|
|
.nodeinitipx
|
|
%endif
|
|
jmp .closewin
|
|
.yesnetwin
|
|
%ifdef __MSDOS__
|
|
cmp byte[ModemInitStat],0
|
|
je .nodeinitmodem
|
|
call DeInitModemC
|
|
mov byte[ModemInitStat],0
|
|
.nodeinitmodem
|
|
%endif
|
|
mov byte[CNetType],1
|
|
ret
|
|
.nonetwin
|
|
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,12
|
|
je near GUIResetKeys
|
|
cmp ebx,13
|
|
je near GUICheatSearchKeys
|
|
cmp ebx,14
|
|
je near GUIStateKeys
|
|
cmp ebx,16
|
|
je near GUIComboKeys
|
|
cmp ebx,19
|
|
je near GUIPathKeys
|
|
cmp ebx,8
|
|
jne .notstartmenu
|
|
cmp byte[CNetType],4
|
|
jne .notcpip
|
|
jmp GUITCPIPKeys
|
|
.notcpip
|
|
cmp byte[CNetType],1
|
|
jne .notstartmenu
|
|
jmp GUINetMenuKeys1
|
|
.notstartmenu
|
|
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 byte[GUIcmenupos],1
|
|
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,'C'
|
|
jne .noc
|
|
mov byte[GUIcrowpos],12
|
|
.noc
|
|
.noquickmenu
|
|
cmp byte[GUIcmenupos],2
|
|
jne near .noloadmenu
|
|
cmp dh,'L'
|
|
jne .nol
|
|
mov byte[GUIcrowpos],0
|
|
.nol
|
|
cmp dh,'R'
|
|
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
|
|
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
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 byte[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:
|
|
cmp byte[GUINetTextm2],1
|
|
je near .section2
|
|
mov edi,TCPIPAddress
|
|
mov esi,26
|
|
cmp byte[GUINetTextm2],2
|
|
jne .notsecondstring
|
|
mov edi,ChatNick
|
|
mov esi,9
|
|
.notsecondstring
|
|
mov ebx,edi
|
|
.next
|
|
cmp byte[ebx],0
|
|
je .done2
|
|
inc ebx
|
|
jmp .next
|
|
.done2
|
|
sub ebx,edi
|
|
mov [GUINetTextm2+1],bl
|
|
xor eax,eax
|
|
mov al,[GUINetTextm2+1]
|
|
shl al,2
|
|
add al,2
|
|
cmp dh,32
|
|
jbe .notnum2
|
|
cmp byte[GUINetTextm2],0
|
|
je .notsecondstringb
|
|
cmp dh,'_'
|
|
je .notsecondstringb
|
|
cmp dh,'-'
|
|
je .notsecondstringb
|
|
cmp dh,'^'
|
|
je .notsecondstringb
|
|
cmp dh,'='
|
|
je .notsecondstringb
|
|
cmp dh,'+'
|
|
je .notsecondstringb
|
|
cmp dh,'['
|
|
je .notsecondstringb
|
|
cmp dh,']'
|
|
je .notsecondstringb
|
|
cmp dh,'0'
|
|
jb .notnum2
|
|
cmp dh,'9'
|
|
jbe .notsecondstringb
|
|
cmp dh,'A'
|
|
jb .notnum2
|
|
cmp dh,'Z'
|
|
jbe .notsecondstringb
|
|
cmp dh,'a'
|
|
jb .notnum2
|
|
cmp dh,'z'
|
|
jbe .notsecondstringb
|
|
.notsecondstringb
|
|
cmp ebx,esi
|
|
jae near .donesection1
|
|
add ebx,edi
|
|
mov byte[ebx],dh
|
|
jmp .donesection1
|
|
.notnum2
|
|
cmp dh,8
|
|
jne .notbacksp
|
|
or ebx,ebx
|
|
jz near .donesection1
|
|
add ebx,edi
|
|
mov byte[ebx-1],0
|
|
jmp .donesection1
|
|
.notbacksp
|
|
cmp dh,'c'
|
|
je .yesc
|
|
cmp dh,'C'
|
|
jne .noc
|
|
.yesc
|
|
; mov byte[CNetType],15
|
|
; mov byte[ModemProcess],41
|
|
; mov byte[WhichRemote],4
|
|
.noc
|
|
cmp dh,'s'
|
|
je .yess
|
|
cmp dh,'S'
|
|
jne .nos
|
|
.yess
|
|
; mov byte[CNetType],15
|
|
; mov byte[ModemProcess],40
|
|
; mov byte[WhichRemote],4
|
|
.nos
|
|
.donesection1
|
|
ret
|
|
|
|
.section2
|
|
mov ebx,GUINetTextl2
|
|
.loopz
|
|
cmp byte[ebx],0
|
|
je .donez
|
|
inc ebx
|
|
jmp .loopz
|
|
.donez
|
|
cmp byte[GUINetTextl2],'0'
|
|
jne .notzerob
|
|
cmp byte[GUINetTextl2+1],0
|
|
jne .notzerob
|
|
dec ebx
|
|
.notzerob
|
|
cmp dh,'0'
|
|
jb .notnum
|
|
cmp dh,'9'
|
|
ja .notnum
|
|
mov byte[ebx],dh
|
|
mov byte[ebx+1],0
|
|
push ebx
|
|
call .convert
|
|
pop ebx
|
|
cmp ecx,65536
|
|
jb .donenumb
|
|
mov byte[ebx],0
|
|
.donenumb
|
|
jmp .donenum
|
|
.notnum
|
|
cmp dh,8
|
|
jne .donenum
|
|
cmp byte[GUINetTextl2],0
|
|
je .donenum
|
|
mov byte[ebx-1],0
|
|
.donenum
|
|
call .convert
|
|
cmp ecx,0
|
|
jne .notzero
|
|
mov byte[GUINetTextl2],'0'
|
|
mov byte[GUINetTextl2+1],0
|
|
.notzero
|
|
mov [TCPIPPortNum],ecx
|
|
ret
|
|
.convert
|
|
mov ebx,GUINetTextl2
|
|
xor ecx,ecx
|
|
.loop
|
|
cmp byte[ebx],0
|
|
je .done
|
|
mov eax,ecx
|
|
push ebx
|
|
mov ebx,10
|
|
mul ebx
|
|
pop ebx
|
|
mov ecx,eax
|
|
xor eax,eax
|
|
mov al,[ebx]
|
|
sub eax,48
|
|
add ecx,eax
|
|
inc ebx
|
|
jmp .loop
|
|
.done
|
|
ret
|
|
|
|
|
|
SECTION .data
|
|
NEWSYM TCPIPPortNum, dd 7845
|
|
SECTION .text
|
|
|
|
GUIOptionKeys:
|
|
cmp dh,'a'
|
|
jb .nocap
|
|
cmp dh,'z'
|
|
ja .nocap
|
|
sub dh,'z'-'Z'
|
|
.nocap
|
|
cmp dh,'A'
|
|
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
|
|
cmp dh,'N'
|
|
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,'T'
|
|
jne .noautoincsave
|
|
xor byte[AutoIncSaveSlot],1
|
|
mov byte[firstsaveinc],1
|
|
.noautoincsave
|
|
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
|
|
cmp dh,'S'
|
|
jne .noswfix
|
|
xor byte[SidewinderFix],1
|
|
.noswfix
|
|
%ifdef __WIN32__
|
|
cmp dh,'H'
|
|
jne .nohighpriority
|
|
xor byte[HighPriority],1
|
|
.nohighpriority
|
|
%endif
|
|
cmp dh,'F'
|
|
jne .nofpsatstart
|
|
xor byte[FPSAtStart],1
|
|
.nofpsatstart
|
|
cmp dh,'E'
|
|
jne .nouse30hz
|
|
xor byte[Turbo30hz],1
|
|
.nouse30hz
|
|
cmp dh,'C'
|
|
jne .nogameclock
|
|
xor byte[TimerEnable],1
|
|
.nogameclock
|
|
cmp dh,'G'
|
|
jne .nofastforward
|
|
xor byte[FastFwdToggle],1
|
|
.nofastforward
|
|
cmp dh,'R'
|
|
jne .nosramcheck
|
|
xor byte[SRAMSave5Sec],1
|
|
.nosramcheck
|
|
cmp dh,'O'
|
|
jne .nooldgfx
|
|
xor byte[OldGfxMode2],1
|
|
.nooldgfx
|
|
cmp dh,'L'
|
|
jne .nostartsave
|
|
xor byte[LatestSave],1
|
|
.nostartsave
|
|
cmp dh,'/'
|
|
jne .noautostate
|
|
xor byte[AutoState],1
|
|
.noautostate
|
|
cmp dh,'D'
|
|
jne .nosavepath
|
|
xor byte[DontSavePath],1
|
|
.nosavepath
|
|
cmp dh,'S'
|
|
jne .nosmallmsgtext
|
|
xor byte[SmallMsgText],1
|
|
.nosmallmsgtext
|
|
cmp dh,'P'
|
|
jne .noautopatch
|
|
xor byte[AutoPatch],1
|
|
.noautopatch
|
|
%ifdef __WIN32__
|
|
cmp dh,'I'
|
|
jne .noscreensaver
|
|
xor byte[DisableScreenSaver],1
|
|
.noscreensaver
|
|
%endif
|
|
ret
|
|
|
|
GUIGUIOptnsKeys:
|
|
cmp dh,'a'
|
|
jb .nocap
|
|
cmp dh,'z'
|
|
ja .nocap
|
|
sub dh,'z'-'Z'
|
|
.nocap
|
|
cmp dh,'M'
|
|
jne .guioptn1
|
|
xor byte[mousewrap],1
|
|
.guioptn1
|
|
cmp dh,'S'
|
|
jne .guioptn2
|
|
xor byte[mouseshad],1
|
|
.guioptn2
|
|
cmp dh,'K'
|
|
jne .guioptn3
|
|
xor byte[lastcursres],1
|
|
.guioptn3
|
|
cmp dh,'W'
|
|
jne .guioptn4
|
|
xor byte[resetposn],1
|
|
.guioptn4
|
|
cmp dh,'C'
|
|
jne .guioptn5
|
|
xor byte[GUIClick],1
|
|
.guioptn5
|
|
cmp dh,'U'
|
|
jne .guioptn6
|
|
xor byte[JoyPad1Move],1
|
|
.guioptn6
|
|
cmp dh,'N'
|
|
jne .guioptn6b
|
|
GUIkeystoggleoptn byte[GUIEffect],1
|
|
.guioptn6b
|
|
cmp dh,'R'
|
|
jne .guioptn7
|
|
GUIkeystoggleoptn byte[GUIEffect],4
|
|
.guioptn7
|
|
cmp dh,'E'
|
|
jne .guioptn7b
|
|
GUIkeystoggleoptn byte[GUIEffect],2
|
|
.guioptn7b
|
|
cmp dh,'B'
|
|
jne .guioptn8
|
|
GUIkeystoggleoptn byte[GUIEffect],3
|
|
.guioptn8
|
|
%ifdef __WIN32__
|
|
cmp dh,'A'
|
|
jne .guioptn9
|
|
xor byte[AlwaysOnTop],1
|
|
.guioptn9
|
|
cmp dh,'V'
|
|
jne .guioptn10
|
|
xor byte[SaveMainWindowPos],1
|
|
.guioptn10
|
|
cmp dh,'L'
|
|
jne .guioptn11
|
|
xor byte[AllowMultipleInst],1
|
|
.guioptn11
|
|
cmp dh,'H'
|
|
jne .guioptn12
|
|
xor byte[MouseWheel],1
|
|
.guioptn12
|
|
cmp dh,'R'
|
|
jne .guioptn13
|
|
xor byte[TrapMouseCursor],1
|
|
.guioptn13
|
|
%endif
|
|
cmp dh,'T'
|
|
jne .guioptn14
|
|
xor byte[GUIEnableTransp],1
|
|
.guioptn14
|
|
cmp dh,'F'
|
|
jne .guioptn15
|
|
xor byte[FilteredGUI],1
|
|
cmp byte[En2xSaI],1
|
|
jnae .guioptn15
|
|
call ClearScreen
|
|
call Clear2xSaIBuffer
|
|
.guioptn15
|
|
cmp byte[hqFilter],0
|
|
je .guioptn16
|
|
call ClearScreen
|
|
call Clear2xSaIBuffer
|
|
.guioptn16
|
|
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
|
|
call Clear2xSaIBuffer
|
|
GUIkeystoggleoptn byte[En2xSaI],1
|
|
.no2xsai
|
|
cmp dh,'E'
|
|
jne .nosupereagle
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUI2xVID+ebx],0
|
|
je near .nosupereagle
|
|
call Clear2xSaIBuffer
|
|
GUIkeystoggleoptn byte[En2xSaI],2
|
|
.nosupereagle
|
|
cmp dh,'S'
|
|
jne .nosuper2xsai
|
|
xor ebx,ebx
|
|
mov bl,[cvidmode]
|
|
cmp byte[GUI2xVID+ebx],0
|
|
je near .nosuper2xsai
|
|
call Clear2xSaIBuffer
|
|
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,'U'
|
|
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
|
|
.notriplebufferwin
|
|
%endif
|
|
%ifdef __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 __LINUX__
|
|
cmp dh,'V'
|
|
jne .novsync
|
|
xor byte[vsyncon],1
|
|
mov al,[vsyncon]
|
|
mov [cfgvsync],al
|
|
%ifdef __WIN32__
|
|
call initDirectDraw
|
|
%endif
|
|
%ifdef __MSDOS__
|
|
; mov byte[Triplebufen],0
|
|
%endif
|
|
.novsync
|
|
%endif
|
|
; "Home"
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentvideocursloc],ebx
|
|
.poscd
|
|
sub ebx,4
|
|
cmp dword[GUIcurrentvideoviewloc],ebx
|
|
jl .posvd
|
|
test ebx,8000000h
|
|
jz .noneg
|
|
mov ebx,0
|
|
.noneg
|
|
mov dword[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__
|
|
cmp dh,'F'
|
|
jne .notforce8b
|
|
xor byte[cfgforce8b],1
|
|
.notforce8b
|
|
%endif
|
|
cmp dh,'S'
|
|
jne .notstereo
|
|
xor byte[cfgStereoSound],1
|
|
.notstereo
|
|
%ifdef __MSDOS__
|
|
cmp dh,'A'
|
|
jne .noraisepitch
|
|
xor byte[RaisePitch],1
|
|
.noraisepitch
|
|
%endif
|
|
cmp dh,'R'
|
|
jne .notsrate
|
|
xor eax,eax
|
|
mov al,[cfgSoundQuality]
|
|
mov al,[.sampratenext+eax]
|
|
mov [cfgSoundQuality],al
|
|
.notsrate
|
|
cmp dh,'V'
|
|
jne .notrevst
|
|
xor byte[RevStereo],1
|
|
.notrevst
|
|
cmp dh,'U'
|
|
jne .nosurround
|
|
xor byte[Surround],1
|
|
.nosurround
|
|
cmp dh,'B'
|
|
jne .nosoundbuf
|
|
xor byte[SoundBufEn],1
|
|
.nosoundbuf
|
|
cmp dh,'D'
|
|
jne .nospcdisable
|
|
xor byte[SPCDisable],1
|
|
.nospcdisable
|
|
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:
|
|
cmp dh,'a'
|
|
jb .nocap
|
|
cmp dh,'z'
|
|
ja .nocap
|
|
sub dh,'z'-'Z'
|
|
.nocap
|
|
cmp dh,'C'
|
|
jne .notconfig
|
|
mov byte[CNetType],2
|
|
.notconfig
|
|
cmp dh,'D'
|
|
jne .notdial
|
|
mov byte[CNetType],3
|
|
.notdial
|
|
cmp dh,'M'
|
|
jne .notmanual
|
|
mov byte[CNetType],12
|
|
mov byte[ModemProcess],0
|
|
%ifdef __MSDOS__
|
|
cmp byte[ModemInitStat],1
|
|
je .noinit
|
|
call InitModem
|
|
mov byte[ModemInitStat],1
|
|
.noinit
|
|
%endif
|
|
ret
|
|
.notmanual
|
|
cmp dh,'W'
|
|
jne .notwait
|
|
mov byte[CNetType],10
|
|
mov byte[ModemProcess],0
|
|
%ifdef __MSDOS__
|
|
cmp byte[ModemInitStat],1
|
|
je .noinit2
|
|
call InitModem
|
|
mov byte[ModemInitStat],1
|
|
.noinit2
|
|
%endif
|
|
ret
|
|
.notwait
|
|
ret
|
|
|
|
GUIGetInputLine:
|
|
cmp ebx,8
|
|
jne .nodial
|
|
cmp byte[CNetType],20
|
|
jne .nochat
|
|
cmp dh,13
|
|
jne .nochat
|
|
mov byte[RemoteCommand],2
|
|
ret
|
|
.nochat
|
|
cmp byte[CNetType],3
|
|
jne .nodial
|
|
cmp dh,13
|
|
jne .nodial
|
|
mov byte[CNetType],11
|
|
mov byte[ModemProcess],0
|
|
%ifdef __MSDOS__
|
|
cmp byte[ModemInitStat],1
|
|
je .noinit
|
|
call InitModem
|
|
mov byte[ModemInitStat],1
|
|
%endif
|
|
.noedit
|
|
ret
|
|
.noinit
|
|
.nodial
|
|
; search string for 0, record length of string
|
|
cmp dword[GUIEditString],0
|
|
je .noedit
|
|
mov eax,[GUIEditString]
|
|
xor ecx,ecx
|
|
dec ecx
|
|
.next
|
|
mov bl,[eax]
|
|
inc eax
|
|
inc ecx
|
|
cmp bl,0
|
|
jne .next
|
|
cmp byte[GUIEditStringcWin],0
|
|
je near .blinkstuff
|
|
cmp ecx,0
|
|
je .nodel
|
|
cmp dh,8
|
|
jne .nodel
|
|
mov byte[eax-2],0
|
|
dec eax
|
|
jmp .blinkstuff
|
|
.nodel
|
|
cmp ecx,[GUIEditStringmLen]
|
|
jne .notend
|
|
jmp .blinkstuff
|
|
.notend
|
|
cmp dh,'a'
|
|
jb .nocap
|
|
cmp dh,'z'
|
|
ja .nocap
|
|
sub dh,'z'-'Z'
|
|
.nocap
|
|
cmp dh,32
|
|
jb .noinsert
|
|
mov [eax-1],dh
|
|
mov byte[eax],0
|
|
inc eax
|
|
.noinsert
|
|
jmp .blinkstuff
|
|
.blinkstuff
|
|
dec eax
|
|
mov [GUIEditStringcLen],eax
|
|
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
|
|
|
|
.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 byte[eax],dh
|
|
|
|
.nokeypressed
|
|
ret
|
|
|
|
SECTION .bss
|
|
GUIInputBox resd 1
|
|
GUIInputLimit resd 1
|
|
SECTION .text
|
|
|
|
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 byte[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'
|
|
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 dword[NumCheats],0
|
|
jne .nozero
|
|
ret
|
|
.nozero
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentcheatcursloc],eax
|
|
sub eax,11
|
|
mov dword[GUIcurrentcheatviewloc],eax
|
|
test dword[GUIcurrentcheatviewloc],8000000h
|
|
jz .posve
|
|
mov dword[GUIcurrentcheatviewloc],0
|
|
.posve
|
|
ret
|
|
.noendp
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentcheatcursloc],ebx
|
|
.poscd
|
|
sub ebx,11
|
|
cmp dword[GUIcurrentcheatviewloc],ebx
|
|
jl .posvd
|
|
test ebx,8000000h
|
|
jz .noneg
|
|
mov ebx,0
|
|
.noneg
|
|
mov dword[GUIcurrentcheatviewloc],ebx
|
|
.posvd
|
|
.nopagedown
|
|
ret
|
|
|
|
.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,[GUICheatText9]
|
|
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,[GUICheatText9+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[GUICheatText9],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[GUICheatText9+eax],'_'
|
|
mov byte[GUICheatText9+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 byte[GUICheatText9+eax],dh
|
|
mov byte[GUICheatText9+eax+1],'_'
|
|
mov byte[GUICheatText9+eax+2],0
|
|
inc byte[GUICheatPosA]
|
|
.nochar
|
|
ret
|
|
|
|
.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[GUICheatTextA+eax],'_'
|
|
mov byte[GUICheatTextA+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 byte[GUICheatTextA+eax],dh
|
|
mov byte[GUICheatTextA+eax+1],'_'
|
|
mov byte[GUICheatTextA+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 byte[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 byte[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
|
|
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
|
|
je .start
|
|
cmp dh,'S'
|
|
jne .notstart
|
|
.start
|
|
call CheatCodeSearchInit
|
|
ret
|
|
.notstart
|
|
ret
|
|
.search
|
|
cmp byte[CheatSrcSearchType],1
|
|
je .compare
|
|
call InsertSearchCharacter
|
|
jmp .nomovedown
|
|
.compare
|
|
cmp dh,','
|
|
je .lessthan
|
|
cmp dh,'<'
|
|
jne .notlessthan
|
|
.lessthan
|
|
mov byte[CheatCompareValue],0
|
|
.notlessthan
|
|
cmp dh,'.'
|
|
je .greaterthan
|
|
cmp dh,'>'
|
|
jne .notgreaterthan
|
|
.greaterthan
|
|
mov byte[CheatCompareValue],1
|
|
.notgreaterthan
|
|
cmp dh,'='
|
|
je .equalthan
|
|
cmp dh,'+'
|
|
jne .notequalthan
|
|
.equalthan
|
|
mov byte[CheatCompareValue],2
|
|
.notequalthan
|
|
cmp dh,'N'
|
|
jne .notnotequalthan
|
|
mov byte[CheatCompareValue],3
|
|
.notnotequalthan
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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
|
|
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
|
|
cmp dword[NumCheatSrc],0
|
|
jne .nozero
|
|
cmp dh,27
|
|
je .yesret
|
|
cmp dh,'R'
|
|
jne .notreturnb
|
|
.yesret
|
|
mov byte[CheatWinMode],1
|
|
.notreturnb
|
|
ret
|
|
.nozero
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentchtsrccursloc],eax
|
|
sub eax,11
|
|
mov dword[GUIcurrentchtsrcviewloc],eax
|
|
test dword[GUIcurrentchtsrcviewloc],8000000h
|
|
jz .posve
|
|
mov dword[GUIcurrentchtsrcviewloc],0
|
|
.posve
|
|
ret
|
|
.noendp
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentchtsrccursloc],ebx
|
|
.poscd
|
|
sub ebx,11
|
|
cmp dword[GUIcurrentchtsrcviewloc],ebx
|
|
jl .posvd
|
|
test ebx,8000000h
|
|
jz .noneg
|
|
mov ebx,0
|
|
.noneg
|
|
mov dword[GUIcurrentchtsrcviewloc],ebx
|
|
.posvd
|
|
.nopagedown
|
|
cmp dh,27
|
|
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
|
|
cmp dh,27
|
|
je .yesretc
|
|
cmp byte[CurCStextpos],1
|
|
je .notreturnc
|
|
cmp dh,'R'
|
|
jne .notreturnc
|
|
.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
|
|
|
|
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 __LINUX__
|
|
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 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 __LINUX__
|
|
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 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 __LINUX__
|
|
cmp al,90
|
|
je .vert
|
|
cmp dword[numlockptr],1
|
|
je .novert
|
|
%endif
|
|
cmp al,72
|
|
je .vert
|
|
%ifdef __LINUX__
|
|
cmp al,96
|
|
je .vert
|
|
cmp dword[numlockptr],1
|
|
je .novert
|
|
%endif
|
|
cmp al,80
|
|
jne .novert
|
|
.vert
|
|
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
|
|
jmp .done
|
|
.novert
|
|
ret
|
|
.done
|
|
mov [fnamest+ebx],cl
|
|
ret
|
|
|
|
GUIResetKeys:
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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
|
|
|
|
GUIStateKeys:
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentcursloc],eax
|
|
sub eax,14
|
|
mov dword[GUIcurrentviewloc],eax
|
|
test dword[GUIcurrentviewloc],8000000h
|
|
jz .posve
|
|
mov dword[GUIcurrentviewloc],0
|
|
.posve
|
|
ret
|
|
.noendp
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentcursloc],ebx
|
|
.poscd
|
|
sub ebx,14
|
|
cmp dword[GUIcurrentviewloc],ebx
|
|
jl .posvd
|
|
test ebx,8000000h
|
|
jz .noneg
|
|
mov ebx,0
|
|
.noneg
|
|
mov dword[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 byte[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 dword[.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 dword[GUIcurrentdirviewloc],ebx
|
|
jmp .posvl2
|
|
.notdir2
|
|
mov [GUIcurrentcursloc],esi
|
|
mov [GUIcurrentviewloc],esi
|
|
mov ebx,[GUIfileentries]
|
|
sub ebx,15
|
|
cmp dword[GUIcurrentviewloc],ebx
|
|
jb .posvl2
|
|
mov dword[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 __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentdircursloc],eax
|
|
sub eax,14
|
|
mov dword[GUIcurrentdirviewloc],eax
|
|
test dword[GUIcurrentdirviewloc],8000000h
|
|
jz .posve2
|
|
mov dword[GUIcurrentdirviewloc],0
|
|
.posve2
|
|
ret
|
|
.noendp2
|
|
%ifdef __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 __LINUX__
|
|
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 dword[GUIcurrentdircursloc],ebx
|
|
.poscd2
|
|
sub ebx,14
|
|
cmp dword[GUIcurrentdirviewloc],ebx
|
|
jb .posvd2
|
|
test ebx,8000000h
|
|
jz .noneg2
|
|
mov ebx,0
|
|
.noneg2
|
|
mov dword[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
|
|
|