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 + -
显示快捷键?