499 lines
11 KiB
PHP
499 lines
11 KiB
PHP
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
|
||
;
|
||
;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.
|
||
|
||
|
||
|
||
; Movie, Joystick setting (display) routines, SNES Reset Function
|
||
|
||
MovieRecord:
|
||
mov byte[GUICBHold],0
|
||
mov dword[MovieCounter],0
|
||
cmp byte[MovieProcessing],0
|
||
jne near .dontrecord
|
||
; check if movie exists already
|
||
mov ebx,[statefileloc]
|
||
mov eax,[fnamest+ebx-3]
|
||
push eax
|
||
mov dword[fnamest+ebx-3],'.ZMV'
|
||
mov al,[CMovieExt]
|
||
mov byte[fnamest+ebx],al
|
||
|
||
; check if file exists
|
||
cmp byte[MovieRecordWinVal],1
|
||
je .nocheck
|
||
mov edx,fnamest+1
|
||
call Open_File
|
||
jc .nocheck
|
||
mov bx,ax
|
||
call Close_File
|
||
mov byte[MovieRecordWinVal],1
|
||
jmp .skipstate
|
||
.nocheck
|
||
mov dword[CFWriteHead],0
|
||
mov dword[CReadHead],0
|
||
mov dword[ReadHead],0
|
||
mov dword[CFWriteStart],64
|
||
mov byte[MovieRecordWinVal],0
|
||
call ChangetoSRAMdir
|
||
mov byte[NoPictureSave],1
|
||
call statesaver
|
||
mov byte[NoPictureSave],0
|
||
mov edx,fnamest+1
|
||
call Open_File_Write
|
||
mov bx,ax
|
||
mov [MovieFileHand],bx
|
||
mov cx,0
|
||
mov dx,0
|
||
call File_Seek_End
|
||
mov al,[soundon]
|
||
mov [RecData],al
|
||
mov eax,[welcome+8]
|
||
mov [RecData+1],eax
|
||
mov byte[RecData+2],1
|
||
mov eax,[timer2upd]
|
||
mov [RecData+3],eax
|
||
mov eax,[curexecstate]
|
||
mov [RecData+7],eax
|
||
mov edx,RecData
|
||
mov ecx,16
|
||
call Write_File
|
||
cmp dword[ramsize],0
|
||
je .noram
|
||
mov edx,[sram]
|
||
mov ecx,[ramsize]
|
||
call Write_File
|
||
.noram
|
||
mov byte[MovieProcessing],2
|
||
mov dword[MovieBuffSize],0
|
||
mov dword[MovieBuffFrame],0
|
||
mov byte[RepeatFrame],0
|
||
cmp byte[CNetType],20
|
||
je near .netstuff
|
||
cmp byte[CNetType],21
|
||
je near .netstuff
|
||
mov dword[nmiprevaddrl],0
|
||
mov dword[nmiprevaddrh],0
|
||
mov dword[nmirept],0
|
||
mov dword[nmiprevline],224
|
||
mov dword[nmistatus],0
|
||
mov byte[spcnumread],0
|
||
mov byte[NextLineCache],0
|
||
mov dword[PJoyAOrig],0
|
||
mov dword[PJoyBOrig],0
|
||
mov dword[PJoyCOrig],0
|
||
mov dword[PJoyDOrig],0
|
||
mov dword[PJoyEOrig],0
|
||
mov byte[DSPMem+08h],0
|
||
mov byte[DSPMem+18h],0
|
||
mov byte[DSPMem+28h],0
|
||
mov byte[DSPMem+38h],0
|
||
mov byte[DSPMem+48h],0
|
||
mov byte[DSPMem+58h],0
|
||
mov byte[DSPMem+68h],0
|
||
mov byte[DSPMem+78h],0
|
||
.netstuff
|
||
call ChangetoLOADdir
|
||
.skipstate
|
||
pop eax
|
||
mov ebx,[statefileloc]
|
||
mov [fnamest+ebx-3],eax
|
||
.dontrecord
|
||
ret
|
||
|
||
MovieRecordWinVal db 0
|
||
NEWSYM MovieProcessing, db 0
|
||
NEWSYM MovieFileHand, dw 0
|
||
NEWSYM RepeatFrame, db 0
|
||
NEWSYM RecData, times 16 db 0
|
||
NEWSYM NoPictureSave, db 0
|
||
|
||
SkipMovie:
|
||
mov byte[MovieRecordWinVal],0
|
||
mov byte[GUICBHold],0
|
||
ret
|
||
|
||
MovieStop:
|
||
mov byte[GUICBHold],0
|
||
cmp byte[MovieProcessing],0
|
||
je .skipfileend
|
||
mov bx,[MovieFileHand]
|
||
mov byte[MovieProcessing],0
|
||
call Close_File
|
||
.skipfileend
|
||
ret
|
||
|
||
CalibrateDispA:
|
||
xor ebx,ebx
|
||
mov ecx,256
|
||
.a
|
||
mov byte[pressed+ebx],0
|
||
inc ebx
|
||
loop .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
|
||
loop .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
|
||
|
||
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
|
||
|
||
|
||
SetAllKeys:
|
||
xor ebx,ebx
|
||
mov ecx,256+128+64
|
||
.a
|
||
mov byte[pressed+ebx],0
|
||
inc ebx
|
||
loop .a
|
||
|
||
mov byte[GUICBHold],0
|
||
mov edi,pl1selk
|
||
cmp byte[cplayernum],1
|
||
jne .nopl2
|
||
mov edi,pl2selk
|
||
.nopl2
|
||
cmp byte[cplayernum],2
|
||
jne .nopl3
|
||
mov edi,pl3selk
|
||
.nopl3
|
||
cmp byte[cplayernum],3
|
||
jne .nopl4
|
||
mov edi,pl4selk
|
||
.nopl4
|
||
cmp byte[cplayernum],4
|
||
jne .nopl5
|
||
mov edi,pl5selk
|
||
.nopl5
|
||
mov dword[guicpressptr],edi
|
||
xor ebx,ebx
|
||
mov ecx,12
|
||
mov dword[guipressptr],guipresstext4b
|
||
.loop
|
||
mov eax,[.ordercalb+ebx*4]
|
||
shl eax,2
|
||
add dword[guicpressptr],eax
|
||
push ebx
|
||
push ecx
|
||
call guipresstestb
|
||
pop ecx
|
||
pop ebx
|
||
add dword[guipressptr],21
|
||
mov eax,[.ordercalb+ebx*4]
|
||
shl eax,2
|
||
sub dword[guicpressptr],eax
|
||
inc ebx
|
||
dec ecx
|
||
jnz .loop
|
||
ret
|
||
.ordercalb dd 2,3,4,5,1,0,7,10,6,9,8,11
|
||
|
||
CalibrateDev1:
|
||
xor eax,eax
|
||
mov al,[cplayernum]
|
||
mov ebx,[GUIInputRefP+eax*4]
|
||
mov bl,[ebx]
|
||
mov byte[GUICBHold],0
|
||
cmp byte[pl1p209+eax],0
|
||
jne near .port209
|
||
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
|
||
.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
|
||
.joyblx dd 0
|
||
.joybly dd 0
|
||
.joybcx dd 0
|
||
.joybcy dd 0
|
||
|
||
|
||
SetDevice:
|
||
mov byte[GUICBHold],0
|
||
xor eax,eax
|
||
mov al,[cplayernum]
|
||
cmp byte[OSPort],1
|
||
ja .notdos
|
||
cmp byte[pl1p209+eax],0
|
||
jne .port209
|
||
.notdos
|
||
mov dword[CalibXmin],0
|
||
mov ecx,[DevicePtr+eax*4]
|
||
mov eax,[GUIInputRefP+eax*4]
|
||
mov ebx,[GUIcurrentinputcursloc]
|
||
mov bl,[GUIInputRefF+ebx]
|
||
mov [eax],bl
|
||
mov eax,ecx
|
||
mov bh,[cplayernum]
|
||
call SetInputDevice
|
||
call UpdateDevices
|
||
jmp .procmtap
|
||
.port209
|
||
mov dword[CalibXmin209],0
|
||
mov ecx,[DevicePtr+eax*4]
|
||
mov eax,[GUIInputRefP+eax*4]
|
||
mov ebx,[GUIcurrentinputcursloc]
|
||
mov bl,[GUIInputRefF+ebx]
|
||
mov [eax],bl
|
||
mov eax,ecx
|
||
mov bh,[cplayernum]
|
||
call SetInputDevice209
|
||
call UpdateDevices
|
||
.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
|
||
call ClearScreen
|
||
; mov byte[NetPlayNoMore],1
|
||
mov byte[RestoreValues],0
|
||
|
||
cmp byte[MovieProcessing],0
|
||
je .skipfileend
|
||
mov bx,[MovieFileHand]
|
||
mov byte[MovieProcessing],0
|
||
call Close_File
|
||
.skipfileend
|
||
call RestoreSystemVars
|
||
; clear spc700 ram
|
||
mov al,0FFh
|
||
mov edi,spcRam
|
||
mov ecx,65472
|
||
rep stosb
|
||
; clear dsp ram
|
||
xor al,al
|
||
mov edi,DSPMem
|
||
mov ecx,256
|
||
rep stosb
|
||
|
||
; reset the snes
|
||
call init65816
|
||
call procexecloop
|
||
|
||
mov eax,spcRam
|
||
mov edx,0EFh
|
||
.loop
|
||
mov byte[eax],0
|
||
inc eax
|
||
dec edx
|
||
jnz .loop
|
||
|
||
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
|
||
|