execute.asm
来自「linux下的任天堂模拟器代码。供大家参考。」· 汇编 代码 · 共 2,207 行 · 第 1/3 页
ASM
2,207 行
; 65816 execution;*******************************************************SECTION .textNEWSYM exitloop2 mov byte[ExecExitOkay],0NEWSYM exitloop retALIGN16%macro FlipCheck 0%ifdef __MSDOS__ cmp byte[FlipWait],0 je %%noflip push edx push eax mov dx,3DAh ;VGA status port in al,dx test al,8 jz %%skipflip push ebx push ecx mov ax,4F07h mov bh,00h mov bl,00h xor cx,cx mov dx,[NextLineStart] mov [LastLineStart],dx int 10h mov byte[FlipWait],0 pop ecx pop ebx%%skipflip pop eax pop edx%%noflip%endif%endmacroNEWSYM executeNEWSYM execloop mov bl,dl test byte[curexecstate],2 jnz .sound.startagain call dword near [edi+ebx*4].cpuover jmp cpuover.sound mov edi,[tableadc+ebx*4]%ifdef OPENSPC pushad mov bl,[esi] movzx eax,byte[cpucycle+ebx] mov ebx,0xC3A13DE6 mul ebx add [ospc_cycle_frac],eax adc [SPC_Cycles],edx call OSPC_Run popad%else sub dword[cycpbl],55 jnc .skipallspc mov eax,[cycpblt] mov bl,[ebp] add dword[cycpbl],eax ; 1260, 10000/12625 inc ebp call dword near [opcjmptab+ebx*4] xor ebx,ebx.skipallspc%endif mov bl,[esi] inc esi sub dh,[cpucycle+ebx] jc .cpuovers call dword near [edi+ebx*4].cpuovers jmp cpuoverSECTION .dataALIGN32NEWSYM ExecExitOkay, db 1NEWSYM JoyABack, dd 0NEWSYM JoyBBack, dd 0NEWSYM JoyCBack, dd 0NEWSYM JoyDBack, dd 0NEWSYM JoyEBack, dd 0NEWSYM NetCommand, dd 0NEWSYM spc700read, dd 0NEWSYM lowestspc, dd 0NEWSYM highestspc, dd 0NEWSYM SA1UBound, dd 0NEWSYM SA1LBound, dd 0NEWSYM SA1SH, dd 0NEWSYM SA1SHb, dd 0NEWSYM NumberOfOpcodes2, dd 0NEWSYM ChangeOps, dd 0NEWSYM SFXProc, dd 0NEWSYM EMUPause, db 0NEWSYM INCRFrame, db 0NEWSYM NoHDMALine, db 0SECTION .textNEWSYM cpuover dec esi cmp byte[HIRQNextExe],0 je .nohirq add dh,[HIRQCycNext] mov byte[HIRQCycNext],0 jmp .hirq.nohirq cmp byte[SA1Enable],0 je near .nosa1b test byte[exiter],01h jnz near .nosa1 mov byte[cycpl],150 test byte[SA1Control],60h jnz near .nosa1 call SA1Swap cmp byte[CurrentExecSA1],15 ja .nocontinueexec xor ebx,ebx mov bl,[esi] inc esi jmp execloop.startagain.nocontinueexec ; check for sa-1 speed hacks mov byte[SA1SHb],0 cmp word[IRAM+0A0h],80BFh jne .noshb2 cmp word[IRAM+020h],0 jne .noshb2 mov ecx,[SA1Ptr] ; small speed hack sub ecx,[romdata] cmp ecx,83h jb .skipsh cmp ecx,97h ja .skipsh mov byte[SA1SHb],1.skipsh.noshb2 mov ecx,[SA1Ptr] ; small speed hack cmp dword[ecx],0FCF04BA5h je .shm cmp dword[ecx-2],0FCF04BA5h jne .skipshm.shm cmp byte[IRAM+4Bh],0 jne .skipshm mov byte[SA1SHb],1.skipshm cmp dword[ecx],80602EEEh jne .skipshc sub ecx,[romdata] cmp ecx,4E5h jb .skipshc cmp ecx,4E8h ja .skipshc mov byte[SA1SHb],1 mov ecx,[SA1BWPtr] add word[ecx+602Eh],4.skipshc test word[IRAM+0Ah],8000h jnz .noshb2b test word[IRAM+0Eh],8000h jz .noshb2b mov ecx,[SA1Ptr] ; small speed hack sub ecx,[romdata] cmp ecx,0C93h jb .skipshb cmp ecx,0C9Bh ja .skipshb mov byte[SA1SHb],1.skipshb cmp ecx,0CB8h jb .skipshb3 cmp ecx,0CC0h ja .skipshb3 mov byte[SA1SHb],1.skipshb3.noshb2b sub esi,[wramdata] cmp esi,224h jb .nosh cmp esi,22Eh ja .nosh mov ecx,[wramdata] mov dword[SA1LBound],224h mov dword[SA1UBound],22Eh add dword[SA1LBound],ecx add dword[SA1UBound],ecx mov byte[SA1SH],1.nosh cmp esi,1F7C6h jb .noshb cmp esi,1F7CCh ja .noshb mov ecx,[wramdata] mov dword[SA1LBound],1F7C6h mov dword[SA1UBound],1F7CCh add dword[SA1LBound],ecx add dword[SA1UBound],ecx mov byte[SA1SH],1.noshb cmp esi,14h jb .noshc cmp esi,1Ch ja .noshc mov ecx,[wramdata] cmp dword[ecx+14h],0F023002Ch jne .noshc mov dword[SA1LBound],14h mov dword[SA1UBound],1Ch add dword[SA1LBound],ecx add dword[SA1UBound],ecx mov byte[SA1SH],1.noshc add esi,[wramdata] sub esi,[romdata] cmp esi,0A56h jb .noshbc cmp esi,0A59h ja .noshbc mov ecx,[romdata] mov dword[SA1LBound],0A56h mov dword[SA1UBound],0A59h add dword[SA1LBound],ecx add dword[SA1UBound],ecx mov byte[SA1SH],1.noshbc xor ecx,ecx add esi,[romdata] xor dh,dh mov byte[cycpl],10 cmp byte[CurrentExecSA1],255 jne .notsa1255 mov byte[cycpl],160.notsa1255 mov byte[CurrentExecSA1],0 test dl,04h jnz .nosa1 test byte[SA1IRQEnable],80h jz .nosa1 test byte[SA1DoIRQ],4 jz .nosa1 and byte[SA1DoIRQ],0FBh mov al,[SA1Message+1] mov [SA1Message+3],al or byte[SA1IRQExec],1 ; Start IRQ add dh,10 jmp .virq.nosa1 test byte[SA1IRQEnable],20h jz .nosa1chirq test byte[SA1DoIRQ],8 jz .nosa1chirq; jmp .nosa1chirq and byte[SA1DoIRQ],0F7h mov al,[SA1Message+1] mov [SA1Message+3],al or byte[SA1IRQExec],2 ; Start IRQ add dh,10 jmp .virq.nosa1chirq.nosa1b FlipCheck cmp byte[NextLineCache],0 je .nosprcache call Donextlinecache.nosprcache cmp byte[KeyOnStB],0 je .nokeyon mov al,[KeyOnStB] call ProcessKeyOn.nokeyon mov al,[KeyOnStA] mov [KeyOnStB],al mov byte[KeyOnStA],0 test byte[exiter],01h jnz near exitloop2 ;Multipass Movies cmp byte[MoviePassWaiting],1 jne .nomoviepasswaiting jmp exitloop2.nomoviepasswaiting test byte[SfxSFR],20h jnz near StartSFX.returnfromsfx; inc dword[numinst] ;Temporary inc word[curypos] add dh,[cycpl] mov ax,[totlines] cmp word[curypos],ax jae near .overy cmp byte[spcon],0 je .nosound call updatetimer.nosound mov ax,[resolutn] inc ax cmp [curypos],ax je near .nmi mov ax,[resolutn] cmp [curypos],ax je near .hdma; add ax,2; cmp [curypos],ax; je near .hdma.hdmacont ; check for VIRQ/HIRQ/NMI ProcessIRQStuff mov ax,[resolutn] test byte[nmistatus],0 jz .drawline2 cmp [curypos],ax je .step2.drawline2 test byte[nmistatus],1 jnz .step2 cmp [curypos],ax jbe .drawline jmp .skiphdma.step2 cmp [curypos],ax jb .drawline.skiphdma xor ebx,ebx mov bl,[esi] inc esi jmp execloop.startagain.hdma call exechdma jmp .hdmacont.drawline mov al,[nmiprevline] cmp [curypos],al jb near .noskip cmp byte[nmirept],10 jb near .noskip ; if between correct address, decrease by 2, set nmistatus as 2 ; if not, set nmistatus as 1, increase by 2 cmp byte[curexecstate],0 jne .nn xor dh,dh.nn cmp byte[nmistatus],2 jae near .noskip cmp esi,[nmiprevaddrl] jb .failcheck2 cmp esi,[nmiprevaddrh] ja .failcheck2 cmp byte[nmiprevline],20 jb .nodec sub byte[nmiprevline],10.nodec xor eax,eax mov al,[esi] mov byte[nmistatus],2 and byte[curexecstate],0FEh.failcheck2 add byte[nmiprevline],1 mov byte[nmistatus],1.noskip cmp byte[hdmadelay],0 je .dohdma dec byte[hdmadelay] jmp .nodohdma.dohdma cmp word[curypos],1 jne .nooffby1line test byte[INTEnab],20h jz .nooffby1line cmp word[VIRQLoc],0 je .nodohdma.nooffby1line mov ax,[resolutn] dec ax cmp [curypos],ax jae .nodohdma.dohdma3 call exechdma.nodohdma cmp word[curypos],1 jne .nocache call cachevideo.nocache cmp byte[curblank],0 jne .nodrawlineb2 call drawline.nodrawlineb2 cmp byte[curexecstate],2 je near pexecs cmp byte[curexecstate],0 jne .yesexec xor dh,dh.yesexec xor ebx,ebx mov bl,[esi] inc esi jmp execloop.startagain.nmi mov byte[irqon],80h mov byte[doirqnext],0 cmp byte[yesoutofmemory],1 jne .noout call outofmemfix.noout dec word[curypos] mov [tempdh],dh xor dh,dh; mov al,[SFXIRQFlag] mov byte[doirqnext],0 call exechdma call exechdma mov byte[NextNGDisplay],1 cmp byte[newengen],0 je .nonewgfx cmp byte[curblank],0 jne .nonewgfx cmp byte[ForceNewGfxOff],0 jne .nonewgfx; cmp byte[NextNGDisplay],0; je .nonewgfx call StartDrawNewGfx.nonewgfx cmp byte[GUIQuit],1 je near endprog mov eax,[KeyQuickSnapShot] or eax,eax jz .nosskey test byte[pressed+eax],1 jz .nosskey%ifdef __MSDOS__ movzx eax,byte[cvidmode] cmp byte[GUI16VID+eax],1 je .pngok mov byte[ScreenShotFormat],0.pngok%endif mov byte[SSKeyPressed],1 mov byte[pressed+eax],2 jmp exitloop.nosskey mov eax,[KeyQuickClock] or eax,eax jz .noclockkey test byte[pressed+eax],1 jz .noclockkey xor byte[TimerEnable],1 mov byte[pressed+eax],2.noclockkey mov eax,[KeyQuickSaveSPC] or eax,eax jz .nosavespckey test byte[pressed+eax],1 jz .nosavespckey mov byte[SPCKeyPressed],1 mov byte[pressed+eax],2 jmp exitloop.nosavespckey mov eax,[EMUPauseKey] or eax,eax jz .nopausekey test byte[pressed+eax],1 jz .nopausekey xor byte[EMUPause],1 mov byte[pressed+eax],2.nopausekey mov eax,[INCRFrameKey] or eax,eax jz .noincrframekey test byte[pressed+eax],1 jz .noincrframekey xor byte[INCRFrame],1 mov byte[pressed+eax],2.noincrframekey test byte[pressed+1],01h jnz near exitloop test byte[pressed+59],01h jnz near exitloop cmp byte[nextmenupopup],1 je near exitloop cmp byte[nextmenupopup],2 jb .skipmenupop dec byte[nextmenupopup].skipmenupop mov eax,[KeySaveState] test byte[pressed+eax],01h jnz near exitloop mov eax,[KeyLoadState] test byte[pressed+eax],01h jnz near exitloop mov eax,[KeyInsrtChap] test byte[pressed+eax],01h jnz near exitloop mov eax,[KeyPrevChap] test byte[pressed+eax],01h jnz near exitloop mov eax,[KeyNextChap] test byte[pressed+eax],01h jnz near exitloop mov eax,[KeyQuickRst] test byte[pressed+eax],01h jnz near exitloop mov eax,[KeyQuickExit] test byte[pressed+eax],01h jnz near exitloop mov eax,[KeyQuickLoad] test byte[pressed+eax],01h jnz near exitloop cmp byte[ExecExitOkay],0 je .returntoloop dec byte[ExecExitOkay].returntoloop mov dh,[tempdh] inc word[curypos] cmp byte[NoInputRead],1 je .noinputread call ReadInputDevice.noinputread ;Pause and Frame increment cmp byte[PauseFrameMode],3 jne .nopauseframemode3 pushad call RestorePauseFrame popad mov esi,[tempesi] mov edi,[tempedi] mov ebp,[tempebp] mov edx,[tempedx].nopauseframemode3 cmp byte[EMUPause],1 jne .noemupause cmp byte[RawDumpInProgress],1 je .noemupause cmp byte[PauseFrameMode],1 jne .nopauseframemode1 mov [tempedx],edx mov [tempesi],esi mov [tempedi],edi mov [tempebp],ebp pushad call BackupPauseFrame popad.nopauseframemode1 call ProcessRewind cmp byte[PauseFrameMode],2 jne .nopauseframemode2 mov byte[PauseFrameMode],3 jmp .noprocmovie.nopauseframemode2 cmp byte[INCRFrame],1 jne .noframeincr xor byte[INCRFrame],1 jmp .noemupause.noframeincr ;Update screen - DISABLED FOR NOW pushad ;call StartDrawNewGfx ;call showvideo ;call cachevideo popad jmp .nonewgfx.noemupause ;Rewind update must be done before process this frame of movie, so rewind doesn't ;back up incremented values (some vars being for the next frame) call UpdateRewind cmp byte[MovieProcessing],0 je .noprocmovie pushad call ProcessMovies popad cmp byte[GUIReset],1 jne .notreset mov byte[MovieWaiting],1 mov eax,[KeyQuickRst] mov byte[pressed+eax],01h jmp near exitloop.notreset cmp byte[MovieProcessing],0 jne .noprocmovie cmp byte[ZMVZClose],1 jne .noprocmovie jmp DosExit.noprocmovie cmp byte[device2],3 jne .nolethalen1 mov eax,[LethEnData] mov [JoyBNow],eax.nolethalen1 ;Todo, add second gun... cmp byte[device2],4 jne .nolethalen2 mov eax,[LethEnData] mov [JoyBNow],eax.nolethalen2 test byte[INTEnab],1 jz .noresetjoy mov eax,[JoyAOrig] rol eax,16 mov [JoyANow],eax mov eax,[JoyBOrig] rol eax,16 mov [JoyBNow],eax mov eax,[JoyCOrig] rol eax,16 mov [JoyCNow],eax mov eax,[JoyDOrig] mov [JoyDNow],eax mov eax,[JoyEOrig] mov [JoyENow],eax mov byte[JoyCRead],0.noresetjoy mov byte[MultiTapStat],80h cmp byte[C4Enable],0 je .noC4 call C4VBlank.noC4; mov byte[hdmastartsc],0 mov byte[joycontren],0 test byte[curexecstate],01h jnz .dis65816 or byte[curexecstate],01h.dis65816 cmp byte[CheatOn],1 je near .cheater.returncheat mov ax,[VIRQLoc] cmp word[curypos],ax jne .novirqz mov byte[doirqnext],1.novirqz mov ax,[oamaddrs] mov [oamaddr],ax mov byte[nosprincr],0 call showvideo xor ebx,ebx mov byte[NMIEnab],81h test byte[INTEnab],80h jz near .nonmi; cmp byte[intrset],1; je near .nonmi.nmiokay mov byte[curnmi],1 cmp byte[intrset],1 jne .nointrset mov byte[intrset],2.nointrset cmp byte[nmistatus],1 jne .notnonmifound mov byte[nmirept],0.notnonmifound mov byte[nmistatus],0 cmp byte[nmirept],0 jne .nocheck mov al,[resolutn] sub al,2 mov [nmiprevline],al mov dword[nmiprevaddrl],0FFFFFFFFh mov dword[nmiprevaddrh],0 mov byte[nmirept],1 mov byte[doirqnext],0 jmp switchtonmi.nocheck cmp byte[nmirept],10 je .nextcheck cmp esi,[nmiprevaddrl] jae .notlower mov [nmiprevaddrl],esi.notlower cmp esi,[nmiprevaddrh] jbe .notgreater mov [nmiprevaddrh],esi.notgreater inc byte[nmirept] jmp switchtonmi.nextcheck mov eax,[nmiprevaddrh] sub eax,[nmiprevaddrl] cmp eax,10 ja .failcheck cmp esi,[nmiprevaddrl] jb .failcheck cmp esi,[nmiprevaddrh] ja .failcheck mov byte[doirqnext],0 jmp switchtonmi.failcheck mov byte[nmirept],0 mov dword[nmiprevaddrl],0FFFFFFFFh mov dword[nmiprevaddrh],0 mov byte[doirqnext],0 jmp switchtonmi.nonmi cmp byte[intrset],1 jne .nointrset2w mov byte[intrset],2.nointrset2w
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?