📄 execute.asm
字号:
;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.
%include "macros.mac"
EXTSYM StringLength
EXTSYM Get_Time
EXTSYM objhipr
EXTSYM KeyRewind
EXTSYM xa,timer2upd,prevoamptr,ReadHead
EXTSYM prevedi,SA1xpc,SA1RAMArea,sa1dmaptr
EXTSYM DSP1COp,C4WFXVal,C41FXVal,Op00Multiplicand,Op10Coefficient,Op04Angle
EXTSYM Op08X,Op18X,Op28X,Op0CA,Op1CAZ,Op02FX,Op0AVS,Op06X,Op0DX,Op03F,Op14Zr
EXTSYM Op0EH,DSP1Type,Op01m
EXTSYM Voice0Status
EXTSYM UpdateDPage
EXTSYM Interror,MessageOn,MsgCount,Msgptr,StartGUI,cbitmode,debuggeron,romdata
EXTSYM frameskip,initvideo,newgfx16b,oldhandSBo,oldhandSBs,soundon,cvidmode
EXTSYM vidbuffer,vidbufferofsa,vidbufferofsb,disable65816sh,GUISaveVars,virqnodisable
EXTSYM KeySaveState,KeyLoadState,KeyQuickExit,KeyQuickLoad,KeyQuickRst,GUIDoReset
EXTSYM KeyOnStA,KeyOnStB,ProcessKeyOn,printnum,sramsavedis,DSPDisable,C4Enable
EXTSYM IRQHack,HIRQLoc,Offby1line,splitflags,joinflags,KeyQuickSnapShot
EXTSYM csounddisable,videotroub,Open_File,Close_File,Read_File,ResetTripleBuf
EXTSYM Write_File,Output_Text,Create_File,Check_Key,Get_Key,Change_Dir,InitPreGame
;EXTSYM OSPort
; EXTSYM tempblah,romdata
EXTSYM Curtableaddr,DeInitSPC,InitSB,PICMaskP,SBHandler,SBInt
EXTSYM SBIrq,curcyc,debugdisble,dmadata,guioff,memtabler8,SetupPreGame
EXTSYM memtablew8,regaccessbankr8,showmenu,snesmap2,snesmmap,DeInitPostGame
EXTSYM spcPCRam,startdebugger,xp,xpb,xpc,tablead,tableadb,tableadc
; EXTSYM oamram
EXTSYM SA1UpdateDPage,Makemode7Table
EXTSYM memtabler16,memaccessbankr848mb,memaccessbankr1648mb
EXTSYM nextmenupopup
EXTSYM MovieProcessing
EXTSYM MovieFileHand, PrintStr
EXTSYM OSExit,DosExit,InitDir,InitDrive,createnewcfg,fnames,gotoroot,previdmode
EXTSYM ramsize,sfxramdata,sram,SRAMDrive,SRAMDir,welcome
; EXTSYM tempstore
EXTSYM printhex
EXTSYM ModemInitStat, DeInitModem
EXTSYM deinitipx
EXTSYM deinitvideo
EXTSYM BRRBuffer,DSPMem,PrepareSaveState,ResetState,SFXEnable,PHdspsave
EXTSYM fnamest,sndrot,spcRam,spcRamDP,tableA,unpackfunct,vram,wramdata
EXTSYM zsmesg,PHnum2writesfxreg,SfxR0,PHnum2writecpureg,PHspcsave,initrevst
EXTSYM C4Ram
EXTSYM SPC7110Enable
EXTSYM SA1Mode,PHnum2writesa1reg,SaveSA1,RestoreSA1,UpdateBanksSDD1
EXTSYM SDD1Enable
EXTSYM CapturePicture,PrevPicture,NoPictureSave
EXTSYM BRRPlace0,SfxCPB,SfxCROM,SfxLastRamAdr,SfxMemTable,Totalbyteloaded
EXTSYM SfxRAMBR,SfxRAMMem,SfxROMBR,SfxRomBuffer,Voice0Freq
EXTSYM cycpbl,cycpbl2,cycpblt,cycpblt2,irqon,nexthdma
EXTSYM repackfunct,spcnumread,spcon,versn,headerhack,initpitch
EXTSYM SPCMultA,PHnum2writespc7110reg
EXTSYM multchange,procexecloop,vidmemch2
EXTSYM romispal
EXTSYM dssel
EXTSYM scrndis,sprlefttot,sprleftpr,processsprites,cachesprites
EXTSYM NextLineStart,FlipWait,LastLineStart
EXTSYM opcjmptab
EXTSYM cpuoverptr
EXTSYM CheatOn,INTEnab,JoyAPos,JoyBPos,JoyCRead,NMIEnab,NumCheats,CurrentExecSA1
EXTSYM ReadInputDevice,StartDrawNewGfx,VIRQLoc,cachevideo,cfield
EXTSYM cheatdata,curblank,curnmi,curypos,cycpl,doirqnext,drawline
EXTSYM execatzerovirq,exechdma,hdmadelay,intrset,newengen,oamaddr
EXTSYM oamaddrs,processmouse,resolutn,showvideo,snesmouse,starthdma
EXTSYM switchtonmi,switchtovirq,totlines,updatetimer,SA1Swap,SA1DoIRQ
EXTSYM JoyAOrig,JoyANow,JoyBOrig,JoyBNow,JoyCOrig,JoyCNow,JoyDOrig,JoyDNow
EXTSYM JoyEOrig,JoyENow,chaton,chatstrL,chatRTL,chatstrR,SA1Message
EXTSYM MultiTapStat,MovieCounter,idledetectspc,SA1Control,SA1Enable,SA1IRQEnable
EXTSYM SPC700read,SPC700write,numspcvblleft,spc700idle,SA1Status,SA1IRQExec
EXTSYM ForceNewGfxOff,LethEnData,C4Pause,GUIQuit
EXTSYM IRAM,SA1Ptr,SA1BWPtr
EXTSYM scrnon,scaddset
EXTSYM outofmemfix,yesoutofmemory
EXTSYM CNetType,Latency,LatencyLeft,NetSwap
; EXTSYM vesa2selec
EXTSYM RemoteSendChar,RemoteGetChar,pl1neten,pl2neten,pl3neten,pl4neten
EXTSYM pl5neten,RemoteSendEAX,prevp1net,prevp2net,prevp3net,prevp4net
EXTSYM RemoteGetEAX,cnetplaybuf,netdelayed,cnetptrtail,cnetptrhead
EXTSYM ChatProgress,RecvProgress,chatTL,WritetochatBuffer,NetAddChar
EXTSYM PreparePacket, SendPacket, NoInputRead, RemoteDisconnect
EXTSYM SendPacketUDP
EXTSYM ChatNick
EXTSYM JoyRead,ChatType2,chatstrR2,chatstrR3,chatstrR4,chatstrR5
EXTSYM chatRTL2,chatRTL3,chatRTL4,chatRTL5
EXTSYM NetLoadState
EXTSYM ProcessMovies
EXTSYM C4VBlank
EXTSYM dsp1teststuff
EXTSYM ReturnFromSPCStall,SPCStallSetting,cycpb268,cycpb358,HIRQSkip,scanlines
EXTSYM smallscreenon,ScreenScale
EXTSYM MainLoop,NumberOfOpcodes,SfxCLSR,SfxSCMR,SfxPOR
EXTSYM sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc,sfxclineloc
EXTSYM PLOTJmpa,PLOTJmpb,FxTable,FxTableb,FxTablec,FxTabled
EXTSYM SfxPBR,SCBRrel,SfxSCBR,SfxCOLR,hdmaearlstart,SFXCounter
EXTSYM fxbit01,fxbit01pcal,fxbit23,fxbit23pcal,fxbit45,fxbit45pcal,fxbit67,fxbit67pcal
EXTSYM SfxSFR,nosprincr,hirqmode2
EXTSYM cpucycle,debstop,switchtovirqdeb,debstop3,switchtonmideb
EXTSYM ReadSPC7110log,WriteSPC7110log
NEWSYM ExecuteAsmStart
EXTSYM NetPlayNoMore
EXTSYM statefileloc
%macro BackupCVMacM 2
mov edx,%1
mov ecx,%2
%%loop
movq mm0,[edx]
movq mm1,[edx+8]
movq [ebx],mm0
movq [ebx+8],mm1
add edx,16
add ebx,16
loop %%loop
%endmacro
%macro BackupCVMac 2
mov edx,%1
mov ecx,%2
%%loop
mov eax,[edx]
mov [ebx],eax
add edx,4
add ebx,4
loop %%loop
%endmacro
%macro BackupCVMacB 2
mov edx,%1
mov ecx,%2
%%loop
mov al,[edx]
mov [ebx],al
inc edx
inc ebx
loop %%loop
%endmacro
%macro BackupCVRMacM 2
mov edx,%1
mov ecx,%2
%%loop
movq mm0,[ebx]
movq mm1,[ebx+8]
movq [edx],mm0
movq [edx+8],mm1
add edx,16
add ebx,16
loop %%loop
%endmacro
%macro BackupCVRMac 2
mov edx,%1
mov ecx,%2
%%loop
mov eax,[ebx]
mov [edx],eax
add edx,4
add ebx,4
loop %%loop
%endmacro
%macro BackupCVRMacB 2
mov edx,%1
mov ecx,%2
%%loop
mov al,[ebx]
mov [edx],al
inc edx
inc ebx
loop %%loop
%endmacro
NEWSYM CBackupPos, dd 0
NEWSYM StateBackup, dd 0
NEWSYM PBackupPos, dd 0
NEWSYM PPValue, dd 0 ; Previous PValue
NEWSYM DPValue, dd 0 ; Destination PValue
NEWSYM CurRecv, dd 0 ; Set to 1 if Recovery mode is on
; if CurRecv=1, then do not send tcp/ip data, always frame skip, do not
; draw to screen, do not key on, restore previous local key presses,
; when disabling key ons, divert dspmem write/read to a different
; array temporarly, then re-copy back in when finished
NEWSYM PPContrl, times 16 dd 0 ; Previous Controller 1 Data
NEWSYM PPContrl2, times 16 dd 0 ; Previous Controller 2 Data
NEWSYM PPContrl3, times 16 dd 0 ; Previous Controller 3 Data
NEWSYM PPContrl4, times 16 dd 0 ; Previous Controller 4 Data
NEWSYM PPContrl5, times 16 dd 0 ; Previous Controller 5 Data
NEWSYM tempedx, dd 0
NEWSYM NetSent2, dd 0
NEWSYM NetQuitter, dd 0
NEWSYM QBackupPos, dd 0
NEWSYM LatencyV, times 256 db 0
NEWSYM LatencyRecvPtr, dd 0
NEWSYM LatencySendPtr, dd 0
NEWSYM latencytimer, dd 0
NEWSYM BackState, db 1
NEWSYM BackStateSize, dd 6
NEWSYM nojoystickpoll, dd 0
NEWSYM RemoteLValue, db 0
NEWSYM LocalLValue, db 0
NEWSYM chatstrLt, times 15 db 0
NEWSYM RewindOldPos, dd 0
NEWSYM RewindPos, dd 0
NEWSYM RewindTimer, dd 0
NEWSYM ResendTimer, dd 60
NEWSYM valuea, dd 0
NEWSYM valueb, dd 0
NEWSYM valuet, dd 0
BackupArray times 2000 dd 0
NEWSYM SplitStringChat
push ebx
push eax
push ecx
mov eax,chatstrR
call StringLength
cmp ecx,42
jbe near .noneed
mov eax,42
.next2
cmp byte[chatstrR+eax],' '
je near .space
cmp eax,33
jb .dontclipearly
dec eax
jmp .next2
.space
inc eax
jmp .processclip
.dontclipearly
mov eax,42
.processclip
push eax
mov ebx,[chatRTL4]
mov [chatRTL5],ebx
mov ebx,[chatRTL3]
mov [chatRTL4],ebx
mov ebx,[chatRTL2]
mov [chatRTL3],ebx
mov ebx,[chatRTL]
mov [chatRTL2],ebx
xor ecx,ecx
.chatcpyloop
mov al,[chatstrR4+ecx]
mov [chatstrR5+ecx],al
mov al,[chatstrR3+ecx]
mov [chatstrR4+ecx],al
mov al,[chatstrR2+ecx]
mov [chatstrR3+ecx],al
mov al,[chatstrR+ecx]
mov [chatstrR2+ecx],al
inc ecx
cmp ecx,100
jnz .chatcpyloop
pop eax
push eax
xor ecx,ecx
mov byte[chatstrR],' '
inc ecx
.next
mov bl,[chatstrR2+eax]
mov [chatstrR+ecx],bl
inc eax
inc ecx
or bl,bl
jnz .next
pop eax
mov byte[chatstrR2+eax],0
.noneed
pop ecx
pop eax
pop ebx
ret
NEWSYM MoveStringChat
mov ebx,[chatRTL4]
mov [chatRTL5],ebx
mov ebx,[chatRTL3]
mov [chatRTL4],ebx
mov ebx,[chatRTL2]
mov [chatRTL3],ebx
mov ebx,[chatRTL]
mov [chatRTL2],ebx
push eax
push ecx
xor ecx,ecx
.chatcpyloop
mov al,[chatstrR4+ecx]
mov [chatstrR5+ecx],al
mov al,[chatstrR3+ecx]
mov [chatstrR4+ecx],al
mov al,[chatstrR2+ecx]
mov [chatstrR3+ecx],al
mov al,[chatstrR+ecx]
mov [chatstrR2+ecx],al
inc ecx
cmp ecx,100
jnz .chatcpyloop
pop ecx
pop eax
ret
NEWSYM GenLatencyDisplay
call Get_Time
mov [.temp],eax
mov ebx,16
xor eax,eax
xor edx,edx
mov al,[valuea]
mov al,[.temp]
div ebx
add al,48
add dl,48
mov byte[chatstrLt+2],32
cmp al,9
jbe .bel9
; sub al,10
.bel9
mov [chatstrLt+1],dl
mov [chatstrLt],al
mov ebx,16
xor eax,eax
xor edx,edx
mov al,[.temp+1]
div ebx
add al,48
add dl,48
cmp al,9
jbe .bel9b
; sub al,10
.bel9b
mov [chatstrLt+4],dl
mov [chatstrLt+3],al
ret
.temp dd 0
NEWSYM ResetExecStuff
mov dword[soundcycleft],0
mov dword[curexecstate],0
mov dword[nmiprevaddrl],0
mov dword[nmiprevaddrh],0
mov dword[nmirept],0
mov dword[nmiprevline],224
mov dword[nmistatus],0
mov byte[NextLineCache],0
mov byte[spcnumread],0
mov dword[timer2upd],0
mov dword[HIRQCycNext],0
mov byte[HIRQNextExe],0
ret
NEWSYM ProcessRewind
cmp byte[CNetType],20
jb .okay
.notokayb
ret
.okay
mov eax,dword[KeyRewind]
cmp byte[pressed+eax],1
jne .notokayb
mov byte[pressed+eax],2
mov eax,[RewindOldPos]
cmp [RewindPos],eax
je .notokay
dec dword[RewindPos]
and dword[RewindPos],0Fh
mov eax,[RewindOldPos]
cmp [RewindPos],eax
je .notokay2
dec dword[RewindPos]
and dword[RewindPos],0Fh
mov eax,[RewindPos]
mov [PBackupPos],eax
push ecx
push ebx
call RestoreCVFrame
; Clear Cache Check
mov ebx,vidmemch2
mov ecx,4096+4096+4096
.next
mov byte[ebx],1
inc ebx
dec ecx
jnz .next
pop ebx
pop ecx
inc dword[RewindPos]
and dword[RewindPos],0Fh
mov edx,[tempedx]
mov dword[RewindTimer],60*3
.notokay
ret
.notokay2
inc dword[RewindPos]
and dword[RewindPos],0Fh
ret
NEWSYM UpdateRewind
; cmp byte[OSPort],3
; je .yeswin32
; ret
;.yeswin32
%ifndef __MSDOS__
push eax
cmp dword[KeyRewind],0
je .notftimer
call ProcessRewind
dec dword[RewindTimer]
jnz .notftimer
cmp byte[CNetType],20
jb .okay
.notftimer
pop eax
ret
.okay
mov eax,[RewindPos]
mov [CBackupPos],eax
mov [tempedx],edx
push ecx
push ebx
call BackupCVFrame
pop ebx
pop ecx
inc dword[RewindPos]
and dword[RewindPos],0Fh
mov eax,[RewindOldPos]
cmp [RewindPos],eax
jne .noteq
inc dword[RewindOldPos]
and dword[RewindOldPos],0Fh
.noteq
mov dword[RewindTimer],60*3
pop eax
%endif
ret
NEWSYM BackupSystemVars
pushad
mov ebx,BackupArray
BackupCVMacB zsmesg,[PHnum2writecpureg]
BackupCVMac cycpbl,2
BackupCVMacB sndrot,3019
BackupCVMacB soundcycleft,33
BackupCVMac spc700read,10
BackupCVMac timer2upd,1
BackupCVMac xa,14
BackupCVMacB spcnumread,1
BackupCVMac opcd,6
BackupCVMacB HIRQCycNext,5
BackupCVMac oamaddr,14
BackupCVMacB prevoamptr,1
BackupCVMac ReadHead,1
popad
ret
NEWSYM RestoreSystemVars
pushad
mov dword[RewindPos],0
mov dword[RewindOldPos],0
mov dword[RewindTimer],60*4
mov ebx,BackupArray
BackupCVRMacB zsmesg,[PHnum2writecpureg]
BackupCVRMac cycpbl,2
BackupCVRMacB sndrot,3019
BackupCVRMacB soundcycleft,33
BackupCVRMac spc700read,10
BackupCVRMac timer2upd,1
BackupCVRMac xa,14
BackupCVRMacB spcnumread,1
BackupCVRMac opcd,6
BackupCVRMacB HIRQCycNext,5
BackupCVRMac oamaddr,14
BackupCVRMacB prevoamptr,1
BackupCVRMac ReadHead,1
popad
ret
NEWSYM BackupCVFrame
;NEWSYM StateBackup, dd 0
;NEWSYM CBackupPos, dd 0
;NEWSYM PBackupPos, dd 0
push edx
push eax
mov ebx,[CBackupPos]
shl ebx,19
add ebx,[StateBackup]
add ebx,1024
BackupCVMacB zsmesg,[PHnum2writecpureg]
BackupCVMac cycpbl,2
BackupCVMacB sndrot,3019
BackupCVMacM [wramdata],8192
BackupCVMacM [vram],4096
cmp byte[spcon],0
je .nospcon
BackupCVMacB spcRam,[PHspcsave]
BackupCVMacM DSPMem,16
.nospcon
cmp byte[C4Enable],1
jne .noc4
BackupCVMac [C4Ram],800h
.noc4
cmp byte[SFXEnable],1
jne .nosfx
BackupCVMacM [sfxramdata],8192
.nosfx
cmp byte[SA1Enable],1
jne near .nossa1
BackupCVMacB SA1Mode,[PHnum2writesa1reg]
BackupCVMacM [SA1RAMArea],8192
BackupCVMacB SA1Status,3
BackupCVMac prevedi,1
BackupCVMac SA1xpc,1
BackupCVMac SA1RAMArea,6
BackupCVMac sa1dmaptr,2
.nossa1
cmp byte[DSP1Type],0
je near .nodsp1type
BackupCVMacB DSP1COp,70+128
BackupCVMacB C4WFXVal,7*4+7*8+128
BackupCVMacB C41FXVal,5*4+128
BackupCVMacB Op00Multiplicand,3*4+128
BackupCVMacB Op10Coefficient,4*4+128
BackupCVMacB Op04Angle,4*4+128
BackupCVMacB Op08X,5*4+128
BackupCVMacB Op18X,5*4+128
BackupCVMacB Op28X,4*4+128
BackupCVMacB Op0CA,5*4+128
BackupCVMacB Op1CAZ,15*4+128
BackupCVMacB Op02FX,11*4+3*4+28*8+128
BackupCVMacB Op0AVS,5*4+14*8+128
BackupCVMacB Op06X,6*4+10*8+4+128
BackupCVMacB Op01m,4*4+128
BackupCVMacB Op0DX,6*4+128
BackupCVMacB Op03F,6*4+128
BackupCVMacB Op14Zr,9*4+128
BackupCVMacB Op0EH,4*4+128
.nodsp1type
BackupCVMacB soundcycleft,33
BackupCVMac spc700read,10
BackupCVMac timer2upd,1
BackupCVMac xa,14
BackupCVMacB spcnumread,1
BackupCVMac opcd,6
BackupCVMacB HIRQCycNext,5
BackupCVMac oamaddr,14
BackupCVMacB prevoamptr,1
BackupCVMac ReadHead,1
mov edx,[sram]
mov ecx,[ramsize]
shr ecx,4
or ecx,ecx
jz .end
.loop
movq mm0,[edx]
movq mm1,[edx+8]
movq [ebx],mm0
movq [ebx+8],mm1
add edx,16
add ebx,16
loop .loop
.end
pop eax
pop edx
mov [ebx],esi
mov [ebx+4],edi
mov ecx,[tempedx]
mov [ebx+8],ecx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -