o cleanup

This commit is contained in:
optixx
2009-04-22 20:04:28 +02:00
parent 55e3468f74
commit 0c378a9f7c
1078 changed files with 0 additions and 0 deletions

3768
tools/zsnes/src/gui/gui.asm Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,193 @@
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;https://zsnes.bountysource.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;version 2 as published by the Free Software Foundation.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
SECTION .text
ComboClip:
movzx eax,byte[GUINumCombo]
.next
cmp al,42
jae .excess
mov byte[GUIComboData+eax],0
inc eax
jmp .next
.excess
ret
ComboAdder:
cmp byte[romloadskip],0
je .romloaded
cmp byte[GUIComboGameSpec],0
jne near .skipall
.romloaded
pushad
call ComboClip
mov eax,[NumCombo]
shl eax,6
add eax,[NumCombo]
add eax,[NumCombo]
add eax,CombinDataGlob
cmp byte[GUIComboGameSpec],0
je .nogamespec
sub eax,CombinDataGlob
add eax,CombinDataLocl
.nogamespec
; copy data to eax
mov ecx,20 ; copy name
mov ebx,GUIComboTextH
.loop
mov dl,[ebx]
mov [eax],dl
inc ebx
inc eax
dec ecx
jnz .loop
mov ecx,42 ; copy combination code
mov ebx,GUIComboData
.loop2
mov dl,[ebx]
mov [eax],dl
inc ebx
inc eax
dec ecx
jnz .loop2
mov dx,[GUIComboKey]
mov [eax],dx
mov dl,[GUIComboPNum]
mov [eax+2],dl
mov dl,[GUIComboLHorz]
mov [eax+3],dl
mov eax,[NumCombo]
mov [GUIccombcursloc],eax
sub eax,7
cmp [GUIccombviewloc],eax
jge .rangeokay
mov [GUIccombviewloc],eax
.rangeokay
inc dword[NumCombo]
mov eax,[NumCombo]
cmp byte[GUIComboGameSpec],0
jne .local
mov [NumComboGlob],eax
jmp .global
.local
mov [NumComboLocl],eax
.global
popad
mov byte[GUIComboTextH],0
mov byte[GUINumCombo],0
mov dword[GUIComboKey],0
.skipall
ret
ComboReplace:
pushad
call ComboClip
mov eax,[GUIccombcursloc]
shl eax,6
add eax,[GUIccombcursloc]
add eax,[GUIccombcursloc]
add eax,CombinDataGlob
cmp byte[GUIComboGameSpec],0
je .nogamespec
sub eax,CombinDataGlob
add eax,CombinDataLocl
.nogamespec
; copy data to eax
mov ecx,20 ; copy name
mov ebx,GUIComboTextH
.loop
mov dl,[ebx]
mov [eax],dl
inc ebx
inc eax
dec ecx
jnz .loop
mov ecx,42 ; copy combination code
mov ebx,GUIComboData
.loop2
mov dl,[ebx]
mov [eax],dl
inc ebx
inc eax
dec ecx
jnz .loop2
mov dx,[GUIComboKey]
mov [eax],dx
mov dl,[GUIComboPNum]
mov [eax+2],dl
mov dl,[GUIComboLHorz]
mov [eax+3],dl
popad
ret
ComboRemoval:
pushad
mov eax,[GUIccombcursloc]
shl eax,6
add eax,[GUIccombcursloc]
add eax,[GUIccombcursloc]
add eax,CombinDataGlob
cmp byte[GUIComboGameSpec],0
je .nogamespec
sub eax,CombinDataGlob
add eax,CombinDataLocl
.nogamespec
mov ecx,[NumCombo]
sub ecx,[GUIccombcursloc]
dec ecx
cmp ecx,0
jle .nomove
.loop2
mov ebx,66
.loop
mov dl,[eax+66]
mov [eax],dl
inc eax
dec ebx
jnz .loop
dec ecx
jnz .loop2
.nomove
dec dword[NumCombo]
mov eax,[NumCombo]
or eax,eax
jz .yeszero
dec eax
.yeszero
cmp [GUIccombviewloc],eax
jbe .notequal
mov [GUIccombviewloc],eax
.notequal
cmp [GUIccombcursloc],eax
jbe .notequal2
mov [GUIccombcursloc],eax
.notequal2
mov eax,[NumCombo]
cmp byte[GUIComboGameSpec],0
jne .local
mov [NumComboGlob],eax
jmp .global
.local
mov [NumComboLocl],eax
.global
popad
ret

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,620 @@
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;https://zsnes.bountysource.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;version 2 as published by the Free Software Foundation.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
; Movie, Joystick setting (display) routines, SNES Reset Function
SECTION .bss
NEWSYM MovieRecordWinVal, resb 1
NEWSYM MovieProcessing, resb 1
NEWSYM MovieFileHand, resw 1
NEWSYM RecData, resb 16
NEWSYM NoPictureSave, resb 1
SECTION .text
CalibrateDispA:
xor ebx,ebx
mov ecx,256
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
GUIBox 75,103,192,135,160
GUIBox 75,103,192,103,162
GUIBox 75,103,75,135,161
GUIBox 192,103,192,135,159
GUIBox 75,135,192,135,158
GUIOuttext 81,109,guicalberror1,220-15
GUIOuttext 80,108,guicalberror1,220
GUIOuttext 81,117,guicalberror2,220-15
GUIOuttext 80,116,guicalberror2,220
GUIOuttext 81,125,guicalberror3,220-15
GUIOuttext 80,124,guicalberror3,220
call vidpastecopyscr
call WaitForKey
ret
CalibrateDispB:
xor ebx,ebx
mov ecx,256
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
call GUIUnBuffer
call DisplayBoxes
call DisplayMenu
GUIBox 75,103,192,143,160
GUIBox 75,103,192,103,162
GUIBox 75,103,75,143,161
GUIBox 192,103,192,143,159
GUIBox 75,143,192,143,158
GUIOuttext 81,109,guicalberror4,220-15
GUIOuttext 80,108,guicalberror4,220
GUIOuttext 81,117,guicalberror5,220-15
GUIOuttext 80,116,guicalberror5,220
GUIOuttext 81,125,guicalberror6,220-15
GUIOuttext 80,124,guicalberror6,220
GUIOuttext 81,133,guicalberror7,220-15
GUIOuttext 80,132,guicalberror7,220
call vidpastecopyscr
call WaitForKey
ret
SECTION .data
guicalberror1 db 'PRESS THE TOP LEFT',0
guicalberror2 db 'CORNER AND PRESS A',0
guicalberror3 db 'BUTTON OR KEY',0
guicalberror4 db 'PRESS THE BOTTOM',0
guicalberror5 db 'RIGHT CORNER AND',0
guicalberror6 db 'PRESS A BUTTON OR',0
guicalberror7 db 'KEY',0
SECTION .text
%macro ConfigureKey2 2
cmp ebx,0
jne near %%no0
mov dword[%2],%1upk ; Up
%%no0
cmp ebx,1
jne near %%no1
mov dword[%2],%1downk ; Down
%%no1
cmp ebx,2
jne near %%no2
mov dword[%2],%1leftk ; Left
%%no2
cmp ebx,3
jne near %%no3
mov dword[%2],%1rightk ; Right
%%no3
cmp ebx,4
jne near %%no4
mov dword[%2],%1startk ; Start
%%no4
cmp ebx,5
jne near %%no5
mov dword[%2],%1selk ; Select
%%no5
cmp ebx,6
jne near %%no6
mov dword[%2],%1Ak ; A
%%no6
cmp ebx,7
jne near %%no7
mov dword[%2],%1Bk ; B
%%no7
cmp ebx,8
jne near %%no8
mov dword[%2],%1Xk ; X
%%no8
cmp ebx,9
jne near %%no9
mov dword[%2],%1Yk ; Y
%%no9
cmp ebx,10
jne near %%no10
mov dword[%2],%1Lk ; L
%%no10
cmp ebx,11
jne near %%no11
mov dword[%2],%1Rk ; R
%%no11
%endmacro
%macro ConfigureKey 2
cmp byte[%2],0
jne near %%nopl1
ConfigureKey2 pl1,%1
%%nopl1
cmp byte[%2],1
jne near %%nopl2
ConfigureKey2 pl2,%1
%%nopl2
cmp byte[%2],2
jne near %%nopl3
ConfigureKey2 pl3,%1
%%nopl3
cmp byte[%2],3
jne near %%nopl4
ConfigureKey2 pl4,%1
%%nopl4
cmp byte[%2],4
jne near %%nopl5
ConfigureKey2 pl5,%1
%%nopl5
%endmacro
SetAllKeys:
xor ebx,ebx
mov ecx,256+128+64
.a
mov byte[pressed+ebx],0
inc ebx
dec ecx
jnz .a
mov byte[GUICBHold],0
mov dword[keycontrolval],pl1contrl
cmp byte[cplayernum],1
jne .nopl2
mov dword[keycontrolval],pl2contrl
.nopl2
cmp byte[cplayernum],2
jne .nopl3
mov dword[keycontrolval],pl3contrl
.nopl3
cmp byte[cplayernum],3
jne .nopl4
mov dword[keycontrolval],pl4contrl
.nopl4
cmp byte[cplayernum],4
jne .nopl5
mov dword[keycontrolval],pl5contrl
.nopl5
;Check if controller is set
push eax
mov eax,[keycontrolval]
cmp dword[eax],0
pop eax
jne .noLockInputChange
ret
.noLockInputChange
xor ebx,ebx
mov ecx,12
mov dword[guipressptr],guipresstext4b
.loop
ConfigureKey guicpressptr,cplayernum
push ebx
push ecx
call guipresstestb
pop ecx
pop ebx
add dword[guipressptr],21
inc ebx
dec ecx
jnz .loop
ret
SECTION .data
SECTION .text
CalibrateDev1:
movzx eax,byte[cplayernum]
mov ebx,[GUIInputRefP+eax*4]
mov bl,[ebx]
mov byte[GUICBHold],0
%ifdef __MSDOS__
cmp al,0
jne .notpl1
cmp byte[pl1p209],0
jne near .port209
.notpl1
cmp al,1
jne .notpl2
cmp byte[pl2p209],0
jne near .port209
.notpl2
cmp al,2
jne .notpl3
cmp byte[pl3p209],0
jne near .port209
.notpl3
cmp al,3
jne .notpl4
cmp byte[pl4p209],0
jne near .port209
.notpl4
cmp al,4
jne .notpl5
cmp byte[pl5p209],0
jne near .port209
.notpl5
%endif
cmp bl,1
jbe .nojoy
cmp bl,18
je near .6button
cmp bl,5
je near .6button
cmp bl,6
jae .nojoy
mov dx,201h
call GetCoords
mov eax,[JoyX]
mov [.joybcx],eax
mov eax,[JoyY]
mov [.joybcy],eax
call CalibrateDispA
mov dx,201h
call GetCoords
mov eax,[JoyX]
mov [.joyblx],eax
mov eax,[JoyY]
mov [.joybly],eax
call CalibrateDispB
mov dx,201h
call GetCoords
jmp .procdir
.nojoy
ret
.6button
mov dx,201h
call GetCoords3
mov eax,[JoyX]
mov [.joybcx],eax
mov eax,[JoyY]
mov [.joybcy],eax
call CalibrateDispA
mov dx,201h
call GetCoords3
mov eax,[JoyX]
mov [.joyblx],eax
mov eax,[JoyY]
mov [.joybly],eax
call CalibrateDispB
mov dx,201h
call GetCoords3
.procdir
mov eax,[.joybcx]
add eax,[.joyblx]
shr eax,1
mov [JoyMinX],eax
mov [CalibXmin],eax
mov eax,[.joybcy]
add eax,[.joybly]
shr eax,1
mov [JoyMinY],eax
mov [CalibYmin],eax
mov eax,[.joybcx]
add eax,[JoyX]
shr eax,1
mov [JoyMaxX],eax
mov [CalibXmax],eax
mov eax,[.joybcy]
add eax,[JoyY]
shr eax,1
mov [JoyMaxY],eax
mov [CalibYmax],eax
ret
%ifdef __MSDOS__
.port209
cmp bl,1
jbe .nojoy209
cmp bl,18
je near .6button209
cmp bl,5
je near .6button209
cmp bl,6
jae .nojoy209
mov dx,209h
call GetCoords
mov eax,[JoyX]
mov [.joybcx],eax
mov eax,[JoyY]
mov [.joybcy],eax
call CalibrateDispA
mov dx,209h
call GetCoords
mov eax,[JoyX]
mov [.joyblx],eax
mov eax,[JoyY]
mov [.joybly],eax
call CalibrateDispB
mov dx,209h
call GetCoords
jmp .procdir209
.nojoy209
ret
.6button209
mov dx,209h
call GetCoords3
mov eax,[JoyX]
mov [.joybcx],eax
mov eax,[JoyY]
mov [.joybcy],eax
call CalibrateDispA
mov dx,209h
call GetCoords3
mov eax,[JoyX]
mov [.joyblx],eax
mov eax,[JoyY]
mov [.joybly],eax
call CalibrateDispB
mov dx,209h
call GetCoords3
.procdir209
mov eax,[.joybcx]
add eax,[.joyblx]
shr eax,1
mov [JoyMinX209],eax
mov [CalibXmin209],eax
mov eax,[.joybcy]
add eax,[.joybly]
shr eax,1
mov [JoyMinY209],eax
mov [CalibYmin209],eax
mov eax,[.joybcx]
add eax,[JoyX]
shr eax,1
mov [JoyMaxX209],eax
mov [CalibXmax209],eax
mov eax,[.joybcy]
add eax,[JoyY]
shr eax,1
mov [JoyMaxY209],eax
mov [CalibYmax209],eax
ret
%endif
SECTION .bss
.joyblx resd 1
.joybly resd 1
.joybcx resd 1
.joybcy resd 1
SECTION .text
SetDevice:
mov byte[GUICBHold],0
movzx eax,byte[cplayernum]
%ifdef __MSDOS__
cmp al,0
jne .notpl1
cmp byte[pl1p209],0
jne .port209
.notpl1
cmp al,1
jne .notpl2
cmp byte[pl2p209],0
jne .port209
.notpl2
cmp al,2
jne .notpl3
cmp byte[pl3p209],0
jne .port209
.notpl3
cmp al,3
jne .notpl4
cmp byte[pl4p209],0
jne .port209
.notpl4
cmp al,4
jne .notpl5
cmp byte[pl5p209],0
jne .port209
.notpl5
%endif
;.notdos
mov dword[CalibXmin],0
mov eax,[GUIInputRefP+eax*4]
mov bl,[GUIcurrentinputcursloc]
mov [eax],bl
mov bh,[cplayernum]
call SetInputDevice
call UpdateDevices
jmp .procmtap
%ifdef __MSDOS__
.port209
mov dword[CalibXmin209],0
mov eax,[GUIInputRefP+eax*4]
mov bl,[GUIcurrentinputcursloc]
mov [eax],bl
mov bh,[cplayernum]
call SetInputDevice209
call UpdateDevices
%endif
.procmtap
mov byte[MultiTap],1
cmp byte[SFXEnable],1
je .dismtap
cmp byte[pl3contrl],0
jne .mtap
cmp byte[pl4contrl],0
jne .mtap
cmp byte[pl5contrl],0
jne .mtap
.dismtap
mov byte[MultiTap],0
.mtap
ret
NEWSYM GUIDoReset
%ifdef __MSDOS__
call DOSClearScreen
%endif
pushad
call Clear2xSaIBuffer
popad
; mov byte[NetPlayNoMore],1
mov byte[RestoreValues],0
pushad
call MovieStop
call RestoreSystemVars
popad
; reset the snes
call init65816
pushad
call procexecloop
popad
xor eax,eax
mov edx,SPCRAM
mov ax,0FFC9h
add edx,eax
mov [spcPCRam],edx
mov dword[spcS],1EFh
mov dword[spcRamDP],SPCRAM
mov byte[spcA],0
mov byte[spcX],0
mov byte[spcY],0
mov byte[spcP],0
mov byte[spcNZ],0
mov byte[Voice0Status],0
mov byte[Voice1Status],0
mov byte[Voice2Status],0
mov byte[Voice3Status],0
mov byte[Voice4Status],0
mov byte[Voice5Status],0
mov byte[Voice6Status],0
mov byte[Voice7Status],0
mov byte[GUIQuit],2
ret
SECTION .bss
NEWSYM JoyX, resd 1
NEWSYM JoyY, resd 1
NEWSYM JoyX2, resd 1
NEWSYM JoyY2, resd 1
NEWSYM JoyMaxX, resd 1
NEWSYM JoyMaxY, resd 1
NEWSYM JoyMinX, resd 1
NEWSYM JoyMinY, resd 1
NEWSYM JoyExists, resb 1
NEWSYM JoyExists2, resb 1
SECTION .text
NEWSYM GetCoords
mov dword[JoyX],0
mov dword[JoyY],0
cli
mov al,0
out dx,al
mov ecx,00FFFFh
.loopa
in al,dx
test al,01h
jz .YAxis
test al,02h
jz .XAxis
inc dword[JoyX]
inc dword[JoyY]
dec ecx
jnz .loopa
mov byte[JoyExists], 0
mov dword[JoyX],0
mov dword[JoyY],0
jmp .End
.YAxis
in al,dx
test al,02h
jz .YAxisOk
nop
nop
inc dword[JoyY]
nop
dec ecx
jnz .YAxis
mov byte[JoyExists], 0
mov dword[JoyX],0
mov dword[JoyY],0
.YAxisOk
jmp .End
.XAxis
in al,dx
test al,01h
jz .XAxisOk
nop
nop
inc dword[JoyX]
nop
dec ecx
jnz .XAxis
mov byte[JoyExists], 0
mov dword[JoyX],0
mov dword[JoyY],0
.XAxisOk
.End
sti
ret
; Dual Joysticks
NEWSYM GetCoords3
mov dword[JoyX],0
mov dword[JoyY],0
mov dword[JoyX2],0
mov dword[JoyY2],0
cli
mov al,0
out dx,al
mov ecx,01FFFFh
.loopa
in al,dx
test al,01h
jz .YAxis
inc dword[JoyX]
nop
.YAxis
test al,02h
jz .XAxis
inc dword[JoyY]
nop
.XAxis
test al,04h
jz .YAxis2
inc dword[JoyX2]
nop
.YAxis2
test al,08h
jz .XAxis2
inc dword[JoyY2]
nop
.XAxis2
test al,0Fh
jz .nomore
dec ecx
jnz .loopa
mov byte[JoyExists], 0
mov dword[JoyX],0
mov dword[JoyY],0
mov byte[JoyExists2], 0
mov dword[JoyX2],0
mov dword[JoyY2],0
.nomore
sti
ret

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,846 @@
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;https://zsnes.bountysource.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;version 2 as published by the Free Software Foundation.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
; Tools for the GUI (string functions are also used elsewhere)
SECTION .text
NEWSYM CopyString
push eax
.again
mov dl,[eax]
mov [ebx],dl
inc eax
inc ebx
or dl,dl
jnz .again
pop eax
ret
NEWSYM StringLength
xor ecx,ecx
push eax
.loop
cmp byte[eax],0
je .done
inc eax
inc ecx
jmp .loop
.done
pop eax
ret
NEWSYM ClipString
; clip string eax by bl characters
.next
push eax
.again
mov dl,[eax+1]
mov [eax],dl
inc eax
or dl,dl
jnz .again
pop eax
dec bl
jnz .next
ret
NEWSYM ConcatString
; concat eax in front of ebx, store in ebx
; move string forward by length of eax
pushad
mov esi,eax
cmp byte[esi],0
je near .nomore3
.next
inc esi
cmp byte[esi],0
jne .next
dec esi
.again
mov dl,[esi]
push ebx
xor ecx,ecx
.loop
cmp byte[ebx],0
je .nomore
inc ebx
inc ecx
jmp .loop
.nomore
inc ebx
inc ecx
.loop2
or ecx,ecx
jz .nomore2
mov dh,[ebx-1]
mov [ebx],dh
dec ebx
dec ecx
jmp .loop2
.nomore2
pop ebx
mov [ebx],dl
cmp eax,esi
je .nomore3
dec esi
jmp .again
.nomore3
popad
ret
GUIoutputchar:
push edi
push esi
push eax
xor ebx,ebx
mov bl,al
cmp byte[newfont],0 ; Font Setup (Menus)
jne .nozero
mov edi,GUIFontData
jmp .endfont
.nozero
mov edi,GUIFontData1
.endfont
; mov edi,GUIFontData
lea ebx,[ebx*5]
add edi,ebx
mov cl,5
.loopa
mov ah,[edi]
mov ch,6
.loopb
test ah,80h
jz .nowrite
mov al,[GUItextcolor]
sub al,cl
sub al,ch
inc al
mov [esi],al
.nowrite
shl ah,1
inc esi
dec ch
jnz .loopb
add esi,282
inc edi
dec cl
jnz .loopa
pop eax
pop esi
pop edi
ret
GUIOutputString:
xor eax,eax
.more
mov al,[edi]
or al,al
jz .nomore
mov al,[ASCII2Font+eax]
call GUIoutputchar
add esi,6
inc edi
jmp .more
.nomore
ret
%macro GUIOuttext 4
mov edi,%2
mov esi,edi
shl esi,8
shl edi,5
add esi,edi
add esi,[vidbuffer]
add esi,%1
add esi,16
mov edi,%3
mov byte[GUItextcolor],%4
call GUIOutputString
%endmacro
GUIDrawBox:
.loop
push edi
push ecx
rep stosb
pop ecx
pop edi
add edi,288
dec edx
jnz .loop
ret
%macro GUIBox 5
mov edi,[vidbuffer]
add edi,%1
mov edx,%2
mov ecx,edx
shl edx,8
shl ecx,5
add edx,ecx
add edi,edx
add edi,16
mov ecx,%3
sub ecx,%1
inc ecx
mov edx,%4
sub edx,%2
inc edx
mov al,%5
call GUIDrawBox
%endmacro
GUIHLines:
cmp ecx,0
jl near .nodraw
cmp eax,255
jg near .nodraw
cmp eax,0
jnl .noofx
mov eax,0
.noofx
cmp ecx,255
jng .noofx2
mov ecx,255
.noofx2
cmp ebx,0
jl .nodraw
cmp ebx,223
jg .nodraw
sub ecx,eax
inc ecx
mov edi,[vidbuffer]
add edi,eax
add edi,16
mov eax,ebx
shl eax,8
add edi,eax
mov eax,ebx
shl eax,5
add edi,eax
mov eax,edx
.loop
mov [edi],ah
add eax,[GUIcolscaleval]
inc edi
dec ecx
jnz .loop
.nodraw
ret
GUIHLine:
cmp ecx,0
jl near .nodraw
cmp eax,255
jg near .nodraw
cmp eax,0
jnl .noofx
mov eax,0
.noofx
cmp ecx,255
jng .noofx2
mov ecx,255
.noofx2
cmp ebx,0
jl .nodraw
cmp ebx,223
jg .nodraw
sub ecx,eax
inc ecx
mov edi,[vidbuffer]
add edi,eax
add edi,16
mov eax,ebx
shl eax,8
add edi,eax
mov eax,ebx
shl eax,5
add edi,eax
mov eax,edx
rep stosb
.nodraw
ret
%macro GUIPal 4
mov dx,03C8h
mov al,%1
out dx,al
inc dx
mov al,%2
out dx,al
mov al,%3
out dx,al
mov al,%4
out dx,al
%endmacro
GUIDrawShadow:
.loop
push edi
push ecx
.loop2
mov al,[edi-3*288-3]
cmp al,148
jb .nomidshad
cmp al,167
ja .mid2
add byte[edi-3*288-3],20
jmp .noshadow
.mid2
cmp al,189
jb .nomidshad
cmp al,220
ja .nomidshad
sub al,189
shr al,1
add al,189
mov [edi-288*3-3],al
jmp .noshadow
.nomidshad
mov al,[edi]
cmp al,32
jae .noshadow
add al,96
mov [edi],al
.noshadow
inc edi
dec ecx
jnz .loop2
pop ecx
pop edi
add edi,288
dec edx
jnz near .loop
ret
%macro GUIShadow 4
mov edi,[vidbuffer]
add edi,%1+%2*288+16
mov ecx,%3-%1+1
mov edx,%4-%2+1
call GUIDrawShadow
%endmacro
GUIDrawShadow2:
.loop
push edi
push ecx
.loop2
mov al,[edi]
cmp al,32
jae .noshadow
add al,96
mov [edi],al
.noshadow
inc edi
dec ecx
jnz .loop2
pop ecx
pop edi
add edi,288
dec ebx
jnz .loop
ret
GUIoutputcharwin:
push edi
push esi
push eax
xor ebx,ebx
mov bl,al
cmp byte[newfont],0 ; Font Setup (Windows)
jne .nozero
mov edi,GUIFontData
jmp .endfont
.nozero
mov edi,GUIFontData1
.endfont
; mov edi,GUIFontData
lea ebx,[ebx*5]
add edi,ebx
mov cl,5
.loopa
mov ah,[edi]
mov ch,5
cmp esi,[vidbuffer]
jb .below
mov edx,[vidbuffer]
add edx,224*288
cmp esi,edx
jb .loopb
.below
add esi,5
jmp .nowrite2
.loopb
test ah,80h
jz .nowrite
mov al,[GUItextcolor]
mov [esi],al
.nowrite
shl ah,1
inc esi
dec ch
jnz .loopb
.nowrite2
add esi,283
inc edi
dec cl
jnz .loopa
pop eax
pop esi
pop edi
ret
GUIOutputStringwin:
xor eax,eax
.more
mov al,[edi]
or al,al
jz .nomore
mov al,[ASCII2Font+eax]
cmp edx,-8
jl .nodraw
cmp edx,255
jg .nodraw
push esi
push edx
add esi,edx
call GUIoutputcharwin
pop edx
pop esi
.nodraw
add edx,6
inc edi
jmp .more
.nomore
ret
GUIOutputStringwinl:
xor eax,eax
mov ecx,[cloadmaxlen]
.more
mov al,[edi]
%ifndef __MSDOS__
cmp al,'%'
jne .noperc
call ConvertPercValue
.noperc
%endif
or al,al
jz .nomore
mov al,[ASCII2Font+eax]
cmp edx,-8
jl .nodraw
cmp edx,255
jg .nodraw
push esi
push edx
push ecx
add esi,edx
call GUIoutputcharwin
pop ecx
pop edx
pop esi
.nodraw
add edx,6
inc edi
dec ecx
jz .nomore
jmp .more
.nomore
ret
%ifndef __MSDOS__
ConvertPercValue:
mov al,[edi+2]
cmp al,'a'
jb .notlower
cmp al,'z'
ja .notlower
sub al,'a'-'A'
.notlower
mov ah,[edi+1]
cmp ah,'a'
jb .notlowerb
cmp ah,'z'
ja .notlowerb
sub ah,'a'-'A'
.notlowerb
cmp al,'0'
jb .noperc
cmp al,'9'
jbe .yesperc
cmp al,'F'
ja .noperc
cmp al,'A'
jb .noperc
.yesperc
cmp ah,'0'
jb .noperc
cmp ah,'9'
jbe .yesperc2
cmp ah,'F'
ja .noperc
cmp ah,'A'
jb .noperc
.yesperc2
sub al,'0'
cmp al,9
jbe .nodec
sub al,'A'-'0'-10
.nodec
sub ah,'0'
cmp ah,9
jbe .nodecb
sub ah,'A'-'0'-10
.nodecb
shl ah,4
or al,ah
add edi,2
and eax,0FFh
ret
.noperc
movzx eax,byte[edi]
ret
%endif
OutputUnder:
cmp edx,-8
jl .nodraw
cmp edx,255
jg .nodraw
mov dword[esi+edx+5*288-1],0E8E8E8E8h
mov byte[esi+edx+5*288+3],0E8h
.nodraw
ret
%macro GUIOuttextwin 1
mov esi,ebx
mov eax,ebx
shl esi,8
shl eax,5
add esi,eax
add esi,16
add esi,[vidbuffer]
mov edi,%1
call GUIOutputStringwin
%endmacro
%macro GUIOuttextwin2 4
mov edx,[GUIwinposx+%1*4]
mov ebx,[GUIwinposy+%1*4]
add edx,%2
add ebx,%3
mov esi,ebx
mov eax,ebx
shl esi,8
shl eax,5
add esi,eax
add esi,16
add esi,[vidbuffer]
mov edi,%4
call GUIOutputStringwin
%endmacro
%macro GUIOuttextwin2l 4
mov edx,[GUIwinposx+%1*4]
mov ebx,[GUIwinposy+%1*4]
add edx,%2
add ebx,%3
mov esi,ebx
mov eax,ebx
shl esi,8
shl eax,5
add esi,eax
add esi,16
add esi,[vidbuffer]
mov edi,%4
call GUIOutputStringwinl
%endmacro
%macro GUIOuttextwin2u 5
mov edx,[GUIwinposx+%1*4]
mov ebx,[GUIwinposy+%1*4]
add edx,%2
add ebx,%3
mov esi,ebx
mov eax,ebx
shl esi,8
shl eax,5
add esi,eax
add esi,16
add esi,[vidbuffer]
mov edi,%4
add edx,%5*6
call OutputUnder
sub edx,%5*6
call GUIOutputStringwin
%endmacro
GUIoutputiconwin:
cmp eax,-9
jl .nodraw
cmp eax,256
jl .draw
.nodraw
ret
.draw
mov esi,ebx
mov ecx,ebx
shl esi,8
shl ecx,5
add esi,ecx
add esi,16
add esi,[vidbuffer]
add esi,eax
mov cl,10
.loopa
mov ch,10
cmp esi,[vidbuffer]
jb .below
mov edx,[vidbuffer]
add edx,224*288
cmp esi,edx
jb .loopb
.below
add esi,10
jmp .nowrite2
.loopb
mov al,[edi]
or al,al
jz .transp
cmp al,189
ja .col2
cmp byte[GUIWincoladd],0
je .col3
inc al
jmp .col3
.col2
sub al,[GUIWincoladd]
dec al
.col3
mov [esi],al
.transp
inc edi
inc esi
dec ch
jnz .loopb
.nowrite2
add esi,278
dec cl
jnz .loopa
ret
%macro GUIDisplayIcon 1
mov edi,%1
call GUIoutputiconwin
%endmacro
%macro GUIDisplayIconWin 4
mov eax,[GUIwinposx+%1*4]
mov ebx,[GUIwinposy+%1*4]
add eax,%2
add ebx,%3
mov edi,%4
call GUIoutputiconwin
%endmacro
GUIDrawSlideBar:
cmp eax,-10
jl .ret
cmp eax,256
jg .ret
jmp .noret
.ret
ret
.noret
mov edi,[vidbuffer]
mov [vbuflimtop],edi
mov edi,[vidbuffer]
add edi,288*224
sub edi,16
mov [vbuflimbot],edi
mov edi,eax
mov eax,ebx
shl ebx,8
shl eax,5
add edi,ebx
add edi,eax
add edi,[vidbuffer]
add edi,16
xor eax,eax
dec ecx
.loop
cmp edx,0
je near .toparea
cmp ecx,0
je near .bottomarea
cmp ah,1
je .filleddisp
cmp edi,[vbuflimtop]
jb near .nodraw
cmp edi,[vbuflimbot]
ja near .nodraw
mov al,197
sub al,byte[GUIWincoladd]
mov [edi],al
sub al,2
mov [edi+1],al
dec al
mov [edi+2],al
dec al
mov [edi+3],al
mov [edi+4],al
inc al
mov [edi+5],al
inc al
mov [edi+6],al
add al,2
mov [edi+7],al
jmp .fin
.filleddisp
cmp edi,[vbuflimtop]
jb near .nodraw
cmp edi,[vbuflimbot]
ja near .nodraw
mov al,202
sub al,byte[GUIWincoladd]
mov [edi],al
sub al,2
mov [edi+1],al
mov [edi+2],al
mov [edi+3],al
mov [edi+4],al
mov [edi+5],al
mov [edi+6],al
sub al,2
mov [edi+7],al
jmp .fin
.toparea
cmp edi,[vbuflimtop]
jb near .nodraw
cmp edi,[vbuflimbot]
ja near .nodraw
mov al,202
sub al,byte[GUIWincoladd]
mov [edi],al
add al,2
mov [edi+1],al
mov [edi+2],al
mov [edi+3],al
mov [edi+4],al
mov [edi+5],al
mov [edi+6],al
mov [edi+7],al
mov ah,1
jmp .fin
.bottomarea
cmp edi,[vbuflimtop]
jb near .nodraw
cmp edi,[vbuflimbot]
ja near .nodraw
mov al,6
mov al,196
sub al,byte[GUIWincoladd]
mov [edi],al
mov [edi+1],al
mov [edi+2],al
mov [edi+3],al
mov [edi+4],al
mov [edi+5],al
mov [edi+6],al
add al,2
mov [edi+7],al
mov ah,0
.fin
.nodraw
add edi,288
dec ecx
dec edx
dec esi
jnz near .loop
ret
%macro DrawSlideBarWin 8
; win#,X,Y start, %4-List Loc, %5-List size, %6-Screen size, %7-Bar Size
mov ebx,%5
mov ecx,%4
; if (Screen Size > List Size) List Size = Screen Size
cmp ebx,%6
jae %%noscrbig
mov ebx,%6
%%noscrbig
; If (ListLoc + ScreenSize > ListSize) ListLoc = ListSize - ScreenSize
mov eax,ecx
add eax,%6
cmp eax,ebx
jbe %%nosetlloc
mov ecx,ebx
sub ecx,%6
%%nosetlloc
; Scrollbarsize = (Screen Size/List size)*Bar Size
push ebx
mov eax,%6
mov ebx,%7
mul ebx
pop ebx
div ebx
; If (Scrollbarsize < 5) Scrollbarsize = 5
cmp eax,5
jae %%validscroll
mov eax,5
%%validscroll
; StartY = (Bar Size-Scrollbarsize)*(List Loc/(List size-ScreenSize))
push eax
sub eax,%7
neg eax
mul ecx
sub ebx,%6
cmp ebx,0
je %%zero
div ebx
jmp %%notzero
%%zero
xor eax,eax
%%notzero
mov edx,eax
pop eax
mov ecx,eax
add ecx,edx
; ecx = endy, edx = starty
mov esi,%7
sub esi,ecx
add esi,edx
dec esi
mov [%8],esi
mov [%8+4],edx
mov [%8+8],ecx
mov eax,[GUIwinposx+%1*4]
mov ebx,[GUIwinposy+%1*4]
add eax,%2
add ebx,%3
mov esi,%7
call GUIDrawSlideBar
%endmacro

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,909 @@
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;https://zsnes.bountysource.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;version 2 as published by the Free Software Foundation.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%include "macros.mac"
EXTSYM FPSOn,MessageOn,cbitmode,copyvid
EXTSYM MsgCount,Msgptr,OutputGraphicString,OutputGraphicString16b,vidbuffer
EXTSYM curblank,drawhline,drawhline16b,drawvline,drawvline16b,frameskip
EXTSYM pressed,dumpsound,Grab_BMP_Data,Grab_BMP_Data_8
EXTSYM spcon,vesa2_bpos,vesa2_clbit,vesa2_gpos,vesa2_rpos,
EXTSYM spritetablea,sprlefttot,newengen,Get_Key,continueprognokeys
EXTSYM ForceNonTransp,GUIOn,Check_Key,JoyRead,GetScreen,SSKeyPressed
EXTSYM SPCKeyPressed,StopSound,StartSound,ExecExitOkay,t1cc,Clear2xSaIBuffer
EXTSYM ScreenShotFormat,spcsaved,savespcdata
EXTSYM exiter,xpb,xpc,snesmmap,memtabler8,snesmap2,regaccessbankr8,dmadata,initaddrl
EXTSYM spcPCRam,xp,curcyc,Curtableaddr,UpdateDPage,splitflags,execsingle,joinflags
EXTSYM pdh,SPCRAM,cvidmode
%ifdef __MSDOS__
EXTSYM GUI16VID
%endif
%ifndef NO_DEBUGGER
EXTSYM numinst,debuggeron
%endif
%ifndef NO_PNG
EXTSYM Grab_PNG_Data
%endif
SECTION .text
GUIBufferData:
mov ecx,16000
cmp byte[cbitmode],1
jne near .16b
add ecx,16384
.16b
; copy to spritetable
mov esi,[vidbuffer]
mov edi,[spritetablea]
add esi,4*384
add edi,4*384
.loop
mov eax,[esi]
mov [edi],eax
add esi,4
add edi,4
dec ecx
jnz .loop
mov edi,sprlefttot
mov ecx,64*5
.a
mov dword[edi],0
add edi,4
dec ecx
jnz .a
ret
GUIUnBuffer:
mov ecx,16000
cmp byte[cbitmode],1
jne near .16b
add ecx,16384
.16b
; copy from spritetable
mov esi,[vidbuffer]
mov edi,[spritetablea]
add esi,4*384
add edi,4*384
.loop
mov eax,[edi]
mov [esi],eax
add esi,4
add edi,4
dec ecx
jnz .loop
ret
SECTION .bss
NEWSYM nextmenupopup, resb 1
NEWSYM NoInputRead, resb 1
NEWSYM PrevMenuPos, resb 1
NEWSYM MenuDisplace, resd 1
NEWSYM MenuDisplace16, resd 1
NEWSYM MenuNoExit, resb 1
NEWSYM SPCSave, resb 1
SECTION .text
NEWSYM showmenu
mov byte[ForceNonTransp],1
cmp byte[cbitmode],1
je near .nopalread
mov edi,[vidbuffer]
add edi,100000
mov dx,03C7h
mov al,0
out dx,al
mov dx,03C9h
mov ecx,768
mov byte[edi],12
inc edi
.b
in al,dx
shl al,2
mov [edi],al
inc edi
dec ecx
jnz .b
.nopalread
cmp byte[cbitmode],1
je near .nopal16b
; set palette of colors 128,144, and 160 to white, blue, and red
mov al,128
mov dx,03C8h
out dx,al
inc dx
mov al,63
out dx,al
out dx,al
out dx,al
mov al,144
mov dx,03C8h
out dx,al
inc dx
xor al,al
out dx,al
out dx,al
mov al,50
out dx,al
mov al,160
mov dx,03C8h
out dx,al
inc dx
mov al,45
out dx,al
xor al,al
out dx,al
out dx,al
.nopal16b
mov byte[NoInputRead],0
cmp byte[newengen],0
je .nong16b
cmp byte[cbitmode],0
je .nong16b
call GetScreen
.nong16b
cmp byte[SSKeyPressed],1
jne .nosskey
mov byte[SSKeyPressed],0
call saveimage
jmp .nopalwrite
.nosskey
cmp byte[SPCKeyPressed],1
je near .savespckey
test byte[pressed+14],1
jz .nof12
call saveimage
jmp .nopalwrite
.nof12
mov dword[menucloc],0
cmp byte[nextmenupopup],0
je .nomenuinc2
mov byte[pressed+1Ch],0
mov dword[menucloc],40*288
cmp byte[PrevMenuPos],1
jne .nomenuinc
mov dword[menucloc],50*288
.nomenuinc
cmp byte[PrevMenuPos],2
jne .nomenuinc2
mov dword[menucloc],60*288
.nomenuinc2
cmp byte[PrevMenuPos],3
jne .nomenuinc3
mov dword[menucloc],70*288
.nomenuinc3
mov dword[menudrawbox8b.stringi+13],' BMP'
%ifndef NO_PNG
cmp byte[ScreenShotFormat],0
je .normalscrn
%ifdef __MSDOS__
movzx eax,byte[cvidmode]
cmp byte[GUI16VID+eax],1
je .pngok
mov byte[ScreenShotFormat],0
jmp .normalscrn
%endif
.pngok
mov dword[menudrawbox8b.stringi+13],' PNG'
%endif
.normalscrn
mov byte[nextmenupopup],0
mov byte[menu16btrans],0
mov byte[pressed+1],0
mov byte[pressed+59],0
mov byte[curblank],00h
call GUIBufferData
; Draw box
call menudrawbox8b
call menudrawbox8b
cmp byte[newengen],0
je .notng
mov byte[GUIOn],1
.notng
pushad
call copyvid
popad
call StopSound
.nextkey
;call GUIUnBuffer
call menudrawbox8b
push eax
call copyvid
pop eax
call JoyRead
call Check_Key
or al,al
jz .nextkey
call Get_Key
cmp al,0
jne near .processextend
call Get_Key
cmp al,72
jne .noup
cmp dword[menucloc],0
jne .nogoup
add dword[menucloc],80*288
.nogoup
sub dword[menucloc],10*288
call menudrawbox8b
; mov al,[newengen] ; WTF?
; mov byte[newengen],0
; mov [newengen],al
jmp .nextkey
.noup
cmp al,80
jne .nodown
cmp dword[menucloc],70*288
jne .nogodown
sub dword[menucloc],80*288
.nogodown
add dword[menucloc],10*288
call menudrawbox8b
; mov al,[newengen]
; mov byte[newengen],0
; push eax
call copyvid
; pop eax
; mov [newengen],al
jmp .nextkey
.nodown
jmp .nextkey
.processextend
cmp al,27
je near .exitloop
cmp al,13
je .done
jmp .nextkey
.done
call GUIUnBuffer
; mov al,[newengen]
; mov byte[newengen],0
; push eax
call copyvid
; pop eax
; mov [newengen],al
cmp dword[menucloc],0
jne .nosaveimg
call saveimage
.nosaveimg
cmp dword[menucloc],40*288
jne .nosaveimg2
call saveimage
mov byte[ExecExitOkay],0
mov byte[nextmenupopup],3
mov byte[NoInputRead],1
mov byte[t1cc],0
mov byte[PrevMenuPos],0
.nosaveimg2
cmp dword[menucloc],50*288
jne .noskipframe
mov byte[ExecExitOkay],0
mov byte[nextmenupopup],3
mov byte[NoInputRead],1
mov byte[t1cc],0
mov byte[PrevMenuPos],1
.noskipframe
cmp dword[menucloc],70*288
jne .noimagechange
cmp byte[cbitmode],0
je .noimagechange
xor byte[ScreenShotFormat],1
mov byte[MenuNoExit],1
mov byte[ExecExitOkay],0
mov byte[nextmenupopup],1
mov byte[NoInputRead],1
mov byte[t1cc],0
mov byte[PrevMenuPos],3
.noimagechange
cmp dword[menucloc],60*288
jne .nomovewin
mov byte[MenuNoExit],1
mov byte[ExecExitOkay],0
mov byte[nextmenupopup],1
mov byte[NoInputRead],1
mov byte[t1cc],0
mov byte[PrevMenuPos],2
cmp dword[MenuDisplace],0
je .movewin
mov dword[MenuDisplace],0
mov dword[MenuDisplace16],0
jmp .nomovewin
.movewin
mov dword[MenuDisplace],90*288
mov dword[MenuDisplace16],90*288*2
.nomovewin
cmp dword[menucloc],10*288
jne .nofps
cmp byte[frameskip],0
je .yesfs
mov dword[Msgptr],.unablefps
mov eax,[MsgCount]
mov [MessageOn],eax
jmp .nofps
.yesfs
xor byte[FPSOn],1
.nofps
cmp dword[menucloc],20*288
jne near .nospcsave
.savespckey
cmp byte[spcon],0
je .nospc
mov dword[Msgptr],.search
mov eax,[MsgCount]
mov [MessageOn],eax
call copyvid
mov byte[SPCSave],1
call breakatsignb
mov byte[SPCSave],0
pushad
call savespcdata
popad
mov byte[curblank],40h
mov dword[Msgptr],spcsaved
mov eax,[MsgCount]
mov [MessageOn],eax
jmp .nospcsave
.nospc
mov dword[Msgptr],.nosound
mov eax,[MsgCount]
mov [MessageOn],eax
jmp .nospcsave
.unablespc
mov dword[Msgptr],.unable
mov eax,[MsgCount]
mov [MessageOn],eax
jmp .nospcsave
.yesesc
mov dword[Msgptr],.escpress
mov eax,[MsgCount]
mov [MessageOn],eax
.nospcsave
cmp dword[menucloc],30*288
jne .nosnddmp
pushad
call dumpsound
popad
mov dword[Msgptr],.sndbufsav
mov eax,[MsgCount]
mov [MessageOn],eax
.nosnddmp
cmp byte[SPCKeyPressed],1
jne .exitloop
mov byte[SPCKeyPressed],0
jmp .nopalwrite
.exitloop
call GUIUnBuffer
; mov al,[newengen]
; mov byte[newengen],0
; push eax
call copyvid
; pop eax
; mov [newengen],al
cmp byte[cbitmode],1
je near .nopalwrite
mov edi,[vidbuffer]
add edi,100000
mov dx,03C8h
mov al,0
out dx,al
mov dx,03C9h
mov ecx,768
inc edi
.c
mov al,[edi]
shr al,2
out dx,al
inc edi
dec ecx
jnz .c
.nopalwrite
mov eax,pressed
mov ecx,256
.looppr
cmp byte[eax],1
jne .notpr
mov byte[eax],2
.notpr
inc eax
dec ecx
jnz .looppr
; mov byte[pressed+1],2
; cmp byte[pressed+59],1
; jne .not59
; mov byte[pressed+59],2
;.not59
; cmp byte[pressed+28],1
; jne .not28
; mov byte[pressed+28],2
;.not28
call StartSound
mov byte[ForceNonTransp],0
mov byte[GUIOn],0
pushad
call Clear2xSaIBuffer
popad
cmp byte[MenuNoExit],1
je .noexitmenu
jmp continueprognokeys
.noexitmenu
mov byte[MenuNoExit],0
jmp showmenu
SECTION .data
.unablefps db 'NEED AUTO FRAMERATE ON',0
.sndbufsav db 'BUFFER SAVED AS SOUNDDMP.RAW',0
.search db 'SEARCHING FOR SONG START.',0
.nosound db 'SOUND MUST BE ENABLED.',0
.unable db 'CANNOT USE IN NEW GFX ENGINE.',0
.escpress db 'ESC TERMINATED SEARCH.',0
SECTION .text
NEWSYM menudrawbox8b
cmp byte[cbitmode],1
je near menudrawbox16b
; draw a small blue box with a white border
mov esi,40+20*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov ecx,150
mov al,95
.loop
mov byte[esi],144
inc esi
dec ecx
jnz .loop
add esi,288-150
dec al
mov ecx,150
jnz .loop
mov al,128
; Draw lines
mov esi,40+20*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov ecx,150
call drawhline
mov esi,40+20*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov ecx,95
call drawvline
mov esi,40+114*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov ecx,150
call drawhline
mov esi,40+32*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov ecx,150
call drawhline
mov esi,189+20*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov ecx,95
call drawvline
call menudrawcursor8b
mov esi,45+23*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.string
call OutputGraphicString
mov esi,45+35*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringa
call OutputGraphicString
mov esi,45+45*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringb
test byte[FPSOn],1
jz .nofps
mov edi,.stringc
.nofps
call OutputGraphicString
mov esi,45+55*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringd
call OutputGraphicString
mov esi,45+65*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringe
call OutputGraphicString
mov esi,45+75*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringf
call OutputGraphicString
mov esi,45+85*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringg
call OutputGraphicString
mov esi,45+95*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringh
call OutputGraphicString
mov esi,45+105*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringi
call OutputGraphicString
; mov al,[newengen]
; mov byte[newengen],0
; push eax
call copyvid
; pop eax
; mov [newengen],al
ret
SECTION .data
.string db 'MISC OPTIONS',0
.stringa db 'SAVE SNAPSHOT',0
.stringb db 'SHOW FPS',0
.stringc db 'HIDE FPS',0
.stringd db 'SAVE SPC DATA',0
.stringe db 'SOUND BUFFER DUMP',0
.stringf db 'SNAPSHOT/INCR FRM',0
.stringg db 'INCR FRAME ONLY',0
.stringh db 'MOVE THIS WINDOW',0
.stringi db 'IMAGE FORMAT: ---',0
SECTION .text
NEWSYM menudrawcursor8b
cmp byte[cbitmode],1
je near menudrawcursor16b
; draw a small red box
mov esi,41+34*288
add esi,[menucloc]
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov ecx,148
mov al,9
.loop
mov byte[esi],160
inc esi
dec ecx
jnz .loop
add esi,288-148
dec al
mov ecx,148
jnz .loop
mov al,128
ret
SECTION .bss
NEWSYM menucloc, resd 1
SECTION .text
NEWSYM menudrawbox16b
; draw shadow behind box
cmp byte[menu16btrans],0
jne .noshadow
mov byte[menu16btrans],1
mov esi,50*2+30*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,150
mov al,95
mov ah,5
.loop16b2
mov dx,[esi]
and dx,[vesa2_clbit]
shr dx,1
mov [esi],dx
add esi,2
dec ecx
jnz .loop16b2
add esi,288*2-150*2
dec al
mov ecx,150
jnz .loop16b2
.noshadow
mov ax,01Fh
mov cl,[vesa2_rpos]
shl ax,cl
mov [.allred],ax
mov ax,012h
mov cl,[vesa2_bpos]
shl ax,cl
mov dx,ax
mov ax,01h
mov cl,[vesa2_gpos]
shl ax,cl
mov bx,ax
mov ax,01h
mov cl,[vesa2_rpos]
shl ax,cl
or bx,ax
; draw a small blue box with a white border
mov esi,40*2+20*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,150
mov al,95
mov ah,5
.loop16b
mov [esi],dx
add esi,2
dec ecx
jnz .loop16b
add esi,288*2-150*2
dec ah
jnz .nocolinc16b
add dx,bx
mov ah,5
.nocolinc16b
dec al
mov ecx,150
jnz .loop16b
; Draw lines
mov ax,0FFFFh
mov esi,40*2+20*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,150
call drawhline16b
mov esi,40*2+20*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,95
call drawvline16b
mov esi,40*2+114*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,150
call drawhline16b
mov esi,40*2+32*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,150
call drawhline16b
mov esi,189*2+20*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,95
call drawvline16b
call menudrawcursor16b
mov esi,45*2+23*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.string
call OutputGraphicString16b
mov esi,45*2+35*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringa
call OutputGraphicString16b
mov esi,45*2+45*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringb
test byte[FPSOn],1
jz .nofps
mov edi,menudrawbox8b.stringc
.nofps
call OutputGraphicString16b
mov esi,45*2+55*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringd
call OutputGraphicString16b
mov esi,45*2+65*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringe
call OutputGraphicString16b
mov esi,45*2+75*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringf
call OutputGraphicString16b
mov esi,45*2+85*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringg
call OutputGraphicString16b
mov esi,45*2+95*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringh
call OutputGraphicString16b
mov esi,45*2+105*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringi
call OutputGraphicString16b
; mov al,[newengen]
; mov byte[newengen],0
; push eax
call copyvid
; pop eax
; mov [newengen],al
ret
SECTION .bss
.allred resw 1
.blue resw 1
.stepb resw 1
NEWSYM menu16btrans, resb 1
SECTION .text
NEWSYM menudrawcursor16b
; draw a small red box
mov esi,41*2+34*288*2
add esi,[menucloc]
add esi,[menucloc]
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov ecx,148
mov al,9
mov bx,[menudrawbox16b.allred]
.loop
mov [esi],bx
add esi,2
dec ecx
jnz .loop
add esi,288*2-148*2
dec al
mov ecx,148
jnz .loop
mov al,128
ret
saveimage:
mov byte[pressed+1],0
mov byte[pressed+59],0
%ifndef NO_PNG
cmp byte[ScreenShotFormat],1
jne .notpng
pushad
call Grab_PNG_Data
popad
ret
.notpng
%endif
cmp byte[cbitmode],1
je near .save16b
pushad
call Grab_BMP_Data_8
popad
ret
.save16b
pushad
call Grab_BMP_Data
popad
ret
SECTION .data
NEWSYM keyonsn, db 0
NEWSYM prbreak, db 0
SECTION .text
breakatsignb:
mov byte[keyonsn],0
mov byte[prbreak],0
%ifndef NO_DEBUGGER
cmp byte[SPCSave],1
jne .nospcsave
mov byte[debuggeron],1
.nospcsave
%endif
mov byte[exiter],01h
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov bl,[xpb]
mov ax,[xpc]
test ax,8000h
jz .loweraddr
mov esi,[snesmmap+ebx*4]
jmp .skiplower
.loweraddr
cmp ax,4300h
jb .lower
cmp dword[memtabler8+ebx*4],regaccessbankr8
je .dma
.lower
mov esi,[snesmap2+ebx*4]
jmp .skiplower
.dma
mov esi,dmadata-4300h
.skiplower
mov [initaddrl],esi
add esi,eax ; add program counter to address
mov ebp,[spcPCRam]
mov dl,[xp] ; set flags
mov dh,[curcyc] ; set cycles
mov edi,[Curtableaddr]
call UpdateDPage
; execute
.loopa
call splitflags
call execsingle
call joinflags
mov dh,[pdh]
%ifndef NO_DEBUGGER
inc dword[numinst]
cmp byte[numinst],0
jne .skipa
call Check_Key
test al,0FFh
jz .skipa
call Get_Key
cmp al,27
je .skipc
.skipa
%endif
cmp byte[SPCRAM+6],40h
je .skipc
cmp byte[keyonsn],1
jne .loopa
jmp .noesc
.skipc
mov byte[prbreak],1
.noesc
; copy back data
mov [spcPCRam],ebp
mov [Curtableaddr],edi
mov [xp],dl
mov [curcyc],dh
mov eax,[initaddrl]
sub esi,eax ; subtract program counter by address
mov [xpc],si
mov byte[exiter],0
%ifndef NO_DEBUGGER
cmp byte[SPCSave],1
jne .nospcsave2
mov byte[debuggeron],0
.nospcsave2
%endif
ret