execute.asm

来自「linux下的任天堂模拟器代码。供大家参考。」· 汇编 代码 · 共 2,207 行 · 第 1/3 页

ASM
2,207
字号
    xor ebx,ebx    xor ecx,ecx    mov bl,[esi]    inc esi    jmp execloop.startagain.overy    mov dh,80%ifdef __MSDOS__    cmp byte[smallscreenon],1    je .nocfield    cmp byte[ScreenScale],1    je .nocfield%endif    cmp byte[scanlines],0    jne .nocfield    xor byte[cfield],1.nocfield    mov word[curypos],0    xor byte[ppustatus],80h    cmp dword[numspcvblleft],0    je near .novblch    cmp [lowestspc],ebp    ja .failspc    cmp [highestspc],ebp    jb .failspc    jmp .okayspc.failspc    mov eax,ebp    sub eax,10    mov [lowestspc],eax    add eax,20    mov [highestspc],eax    mov dword[spc700idle],0.okayspc    cmp dword[SPC700write],0    jne .notwritespc    cmp dword[spc700read],0    je .notwritespc    cmp dword[SPC700read],1500    jb .notwritespc    inc dword[spc700idle]    cmp dword[spc700idle],30    jne .noidleend    call idledetectspc    cmp byte[ReturnFromSPCStall],1    jne .noidleend    mov byte[ExecExitOkay],0    jmp exitloop.noidleend    jmp .notidle.notwritespc    mov dword[spc700idle],0.notidle    dec dword[numspcvblleft]    mov dword[SPC700write],0    mov dword[SPC700read],0    mov dword[spc700read],0.novblch    mov byte[NMIEnab],01h    call starthdma    ; check for VIRQ/HIRQ/NMI    ProcessIRQStuff    xor ebx,ebx    mov bl,[esi]    inc esi    jmp execloop.startagain.virq    test byte[curexecstate],01h    jnz .dis658162    or byte[curexecstate],01h.dis658162    mov byte[doirqnext],0    xor ebx,ebx    mov ax,[resolutn]    cmp word[curypos],ax    jnb .nodrawline    cmp byte[hdmadelay],1    jne .virqstuff.virqstuff    cmp byte[hdmadelay],0    je .dohdma2    dec byte[hdmadelay]    jmp .nodohdma2.dohdma2    call exechdma.nodohdma2    cmp word[curypos],1    jne .nocache2    call cachevideo.nocache2    cmp byte[curblank],0    jne .nodrawline    call drawline.nodrawline    cmp byte[intrset],1    jne .nointrset2    mov byte[intrset],2.nointrset2;    sub dh,8    jmp switchtovirq.hirq    mov byte[HIRQNextExe],0    test byte[INTEnab],10h    jz .hirqnotokay    test byte[curexecstate],01h    jnz .dis658162h    or byte[curexecstate],01h.dis658162h    mov byte[doirqnext],0    cmp byte[intrset],1    jne .nointrset2h    mov byte[intrset],2.nointrset2h    test dl,04h    jnz .irqd    jmp switchtovirq.irqd    mov byte[doirqnext],1.hirqnotokay    jmp .nodrawlineh.returnfromhirq    mov ax,[resolutn]    cmp word[curypos],ax    jnb .nodrawlineh    cmp byte[hdmadelay],0    je .dohdma2h    dec byte[hdmadelay]    jmp .nodohdma2h.dohdma2h    call exechdma.nodohdma2h    cmp word[curypos],1    jne .nocache2h    call cachevideo.nocache2h    cmp byte[curblank],0    jne .nodrawlineh    call drawline.nodrawlineh    xor ebx,ebx    mov bl,[esi]    inc esi    jmp execloop.startagain.cheater    push eax    push ebx    push ecx    push edx    mov al,[NumCheats]    mov [.numcheat],al    xor edx,edx.anothercheat    xor ebx,ebx    xor ecx,ecx    test byte[cheatdata+edx],5    jnz .nonormcheat    test byte[cheatdata+edx-28],80h    jnz .nonormcheat    test byte[cheatdata+edx],80h    jnz .cheatcodereflect    mov al,[cheatdata+edx+1]    mov cx,[cheatdata+edx+2]    mov bl,[cheatdata+edx+4]    push edx    call dword near [memtablew8+ebx*4]    pop edx    jmp .nonormcheat.cheatcodereflect    cmp byte[.numcheat],1    je .nonormcheat    mov cx,[cheatdata+edx+2+28]    mov bl,[cheatdata+edx+4+28]    push edx    call dword near [memtabler8+ebx*4]    pop edx    mov cx,[cheatdata+edx+2]    mov bl,[cheatdata+edx+4]    push edx    call dword near [memtablew8+ebx*4]    pop edx    add edx,28    dec byte[.numcheat].nonormcheat    add edx,28    dec byte[.numcheat]    jnz near .anothercheat    pop edx    pop ecx    pop ebx    pop eax    jmp .returncheatSECTION .bss.numcheat resb 1SECTION .textALIGN16NEWSYM pexecs   mov byte[soundcycleft],30.sloop   mov bl,[ebp]   ; 1260, 10000/12625   inc ebp   call dword near [opcjmptab+ebx*4]   xor ebx,ebx   dec byte[soundcycleft]   jnz .sloop   xor dh,dh   xor ebx,ebx   mov bl,[esi]   inc esi   jmp execloop.startagainNEWSYM pexecs2.sloop   mov bl,[ebp]   ; 1260, 10000/12625   inc ebp   call dword near [opcjmptab+ebx*4]   xor ebx,ebx   dec dword[soundcycleft]   jnz .sloop   retNEWSYM UpdatePORSCMR   push ebx   push eax   test byte[SfxPOR],10h   jnz .objmode   mov al,[SfxSCMR]   and al,00100100b     ; 4 + 32   cmp al,4   je .lines160   cmp al,32   je .lines192   cmp al,36   je .objmode   mov eax,[sfx128lineloc]   jmp .donelines.lines160   mov eax,[sfx160lineloc]   jmp .donelines.lines192   mov eax,[sfx192lineloc]   jmp .donelines.objmode   mov eax,[sfxobjlineloc].donelines   mov [sfxclineloc],eax   mov al,[SfxSCMR]   and eax,00000011b   mov bl,[SfxPOR]   and bl,0Fh   shl bl,2   or al,bl   mov ebx,[PLOTJmpb+eax*4]   mov eax,[PLOTJmpa+eax*4]   mov [FxTable+4Ch*4],eax   mov [FxTableb+4Ch*4],eax   mov [FxTablec+4Ch*4],eax   mov [FxTabled+4Ch*4],ebx   pop eax   pop ebx   retNEWSYM UpdateSCBRCOLR   push eax   push ebx   mov ebx,[SfxSCBR]   shl ebx,10   add ebx,[sfxramdata]   mov [SCBRrel],ebx   mov eax,[SfxCOLR]   mov ebx,[fxbit01+eax*4]   mov [fxbit01pcal],ebx   mov ebx,[fxbit23+eax*4]   mov [fxbit23pcal],ebx   mov ebx,[fxbit45+eax*4]   mov [fxbit45pcal],ebx   mov ebx,[fxbit67+eax*4]   mov [fxbit67pcal],ebx   pop ebx   pop eax   retNEWSYM UpdateCLSR   mov dword[NumberOfOpcodes2],350 ; 0FFFFFFFh;350   test byte[SfxCLSR],01h   jz .nohighsfx   mov dword[NumberOfOpcodes2],700 ;700.nohighsfx    cmp byte[SFXCounter],1    je .noyi    mov dword[NumberOfOpcodes2],0FFFFFFFh.noyi   retNEWSYM UpdateSFX   call UpdatePORSCMR   call UpdatePORSCMR   call UpdateCLSR   retNEWSYM StartSFX    push edx    push esi    push edi    push ebp    xor ebx,ebx    mov bl,[SfxPBR]    mov al,[SfxSCMR]    and bl,7Fh    cmp bl,70h    jae .ram    test al,10h    jz .noaccess    jmp .noram.ram    test al,08h    jz .noaccess.noram    mov eax,[NumberOfOpcodes2]    mov [NumberOfOpcodes],eax    call MainLoop.noaccess    pop ebp    pop edi    pop esi    pop edx    xor ebx,ebx    xor ecx,ecx    jmp cpuover.returnfromsfxNEWSYM StartSFXdebug    push edx    push esi    push edi    push ebx    mov bl,[SfxPBR]    mov al,[SfxSCMR]    and bl,7Fh    cmp bl,70h    jae .ram    test al,10h    jz .noaccess    jmp .noram.ram    test al,08h    jz .noaccess.noram    mov dword[NumberOfOpcodes],350 ; 0FFFFFFFh;350    test byte[SfxCLSR],01h    jz .nohighsfx    mov dword[NumberOfOpcodes],700 ;700.nohighsfx    cmp byte[SFXCounter],1    jne .noyi    mov dword[NumberOfOpcodes],0FFFFFFFFh.noyi;    call SFXDebugLoop.noaccess    pop ebx    pop edi    pop esi    pop edx    xor ecx,ecx    jmp execsingle.returnfromsfxNEWSYM StartSFXdebugb    push edx    push esi    push edi    push ebp    push ebx   test byte[SfxPOR],10h   jnz .objmode   mov al,[SfxSCMR]   and al,00100100b     ; 4 + 32   cmp al,4   je .lines160   cmp al,32   je .lines192   cmp al,36   je .objmode   mov eax,[sfx128lineloc]   jmp .donelines.lines160   mov eax,[sfx160lineloc]   jmp .donelines.lines192   mov eax,[sfx192lineloc]   jmp .donelines.objmode   mov eax,[sfxobjlineloc].donelines   mov [sfxclineloc],eax   mov al,[SfxSCMR]   and eax,00000011b   mov bl,[SfxPOR]   and bl,0Fh   shl bl,2   or al,bl   mov ebx,[PLOTJmpb+eax*4]   mov eax,[PLOTJmpa+eax*4]   mov [FxTable+4Ch*4],eax   mov [FxTableb+4Ch*4],eax   mov [FxTablec+4Ch*4],eax   mov [FxTabled+4Ch*4],ebx   mov ebx,[SfxSCBR]   shl ebx,10   add ebx,[sfxramdata]   mov [SCBRrel],ebx   mov eax,[SfxCOLR]   mov ebx,[fxbit01+eax*4]   mov [fxbit01pcal],ebx   mov ebx,[fxbit23+eax*4]   mov [fxbit23pcal],ebx   mov ebx,[fxbit45+eax*4]   mov [fxbit45pcal],ebx   mov ebx,[fxbit67+eax*4]   mov [fxbit67pcal],ebx   xor ebx,ebx    mov bl,[SfxPBR]    mov al,[SfxSCMR]    and bl,7Fh    cmp bl,70h    jae .ram    test al,10h    jz .noaccess    jmp .noram.ram    test al,08h    jz .noaccess.noram    mov dword[NumberOfOpcodes],420 ;678    test byte[SfxCLSR],01h    jz .nohighsfx    mov dword[NumberOfOpcodes],800 ;678*2.nohighsfx    cmp byte[SFXCounter],1    jne .noyi    mov dword[NumberOfOpcodes],0FFFFFFFh.noyi    call MainLoop.noaccess    pop ebx    pop ebp    pop edi    pop esi    pop edx    xor ecx,ecx    jmp execsingle.returnfromsfxNEWSYM StartSFXret    test byte[SfxSFR],20h    jz .endfx    pushad    mov bl,[SfxPBR]    mov al,[SfxSCMR]    and bl,7Fh    cmp bl,70h    jae .ram    test al,10h    jz .noaccess    jmp .noram.ram    test al,08h    jz .noaccess.noram    mov dword[NumberOfOpcodes],420 ;678    test byte[SfxCLSR],01h    jz .nohighsfx    mov dword[NumberOfOpcodes],800 ;678*2.nohighsfx    mov dword[NumberOfOpcodes],0FFFFFFFFh    call MainLoop.noaccess    popad.endfx    ret;*******************************************************; Execute a Single 65816 instruction (debugging purpose);*******************************************************NEWSYM execloopdeb    jmp exitloop2NEWSYM execsingle    xor ebx,ebx    test byte[curexecstate],2    jz .nosoundb    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.nosoundb    mov bl,dl    mov byte[exiter],01h    mov edi,[tablead+ebx*4]    mov bl,[esi]    inc esi    sub dh,[cpucycle+ebx]    jc .cpuover    mov [pdh],dh    xor dh,dh    jmp dword near [edi+ebx*4].cpuover    cmp byte[SA1Enable],0    je near .nosa1    mov byte[cycpl],150    test byte[SA1Control],60h    jnz near .nosa1    dec esi    call SA1Swap    mov bl,[esi]    inc esi    mov [pdh],dh    xor dh,dh    cmp byte[CurrentExecSA1],17    jb near cpuover    mov byte[CurrentExecSA1],0    mov byte[cycpl],5    jmp .nosa1.nosa1    cmp byte[KeyOnStB],0    je .nokeyon    mov al,[KeyOnStB]    call ProcessKeyOn.nokeyon    mov al,[KeyOnStA]    mov [KeyOnStB],al    mov byte[KeyOnStA],0    test byte[SfxSFR],20h    jnz near StartSFXdebugb.returnfromsfx    add dh,[cycpl]    mov [pdh],dh    cmp byte[spcon],0    je .nosound    call updatetimer    push ebx    xor ebx,ebx    mov bl,dl    mov edi,[tablead+ebx*4]    pop ebx.nosound    xor dh,dh    inc word[curypos]    mov ax,[resolutn]    inc ax    cmp word[curypos],ax    je near .nmi    mov ax,[totlines]    cmp word[curypos],ax    jae near .overy    ; check for VIRQ/HIRQ/NMI    ProcessIRQStuff;    test dl,04h;    jnz .noirq;    test byte[INTEnab],20h;    jz .novirq;    mov ax,[VIRQLoc];    cmp word[curypos],ax;    je near .virq;    jmp .noirq;.novirq;    test byte[INTEnab],10h;    jnz near .virq;.noirq;    test byte[INTEnab],20h;    jz .novirq2b;    mov ax,[VIRQLoc];    cmp word[curypos],ax;    jne .novirq2b;    cmp byte[intrset],1;    jne .nointrset2b;    mov byte[intrset],2;.nointrset2b;.novirq2b    mov ax,[resolutn]    cmp word[curypos],ax    jb .drawline    jmp dword near [edi+ebx*4].drawline    cmp byte[hdmadelay],0    je .dohdma    dec byte[hdmadelay]    jmp .nodohdma.dohdma    call exechdma.nodohdma    cmp byte[curblank],0    jne .nodrawlineb    call drawline.nodrawlineb    jmp dword near [edi+ebx*4].nmi    mov byte[irqon],80h    cmp byte[C4Enable],0    je .noC4    call C4VBlank.noC4;    mov byte[hdmastartsc],0    mov byte[joycontren],0    mov ax,[VIRQLoc]    cmp word[curypos],ax    jne .novirqz    inc word[VIRQLoc].novirqz    call ReadInputDevice    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 byte[JoyCRead],0.noresetjoy    cmp byte[device2],3    jne .nolethalen1    mov eax,[LethEnData]    mov [JoyBNow],eax.nolethalen1    cmp byte[device2],4    jne .nolethalen2    mov eax,[LethEnData]    mov [JoyBNow],eax.nolethalen2    mov byte[MultiTapStat],80h    mov byte[NMIEnab],81h    test byte[INTEnab],80h    jz .nonmi    mov byte[curnmi],1    dec esi    cmp byte[intrset],1    jne .nointrset    mov byte[intrset],2.nointrset    jmp switchtonmideb.nonmi    cmp byte[intrset],1    jne .nointrset2w    mov byte[intrset],2.nointrset2w    cmp byte[esi],0CBh    jne .nowai    and dl,0FBh.nowai    jmp dword near [edi+ebx*4].overy    mov dh,80    mov word[curypos],0    xor byte[ppustatus],80h    mov byte[NMIEnab],01h    add dword[opcd],170*262    call cachevideo    call starthdma    ProcessIRQStuff;    test dl,04h;    jnz .novirq2;    test byte[INTEnab],20h;    jz .novirq2;    mov ax,[VIRQLoc];    cmp word[curypos],ax;    je near .virq;    mov ax,[VIRQLoc];    cmp ax,[totlines];    jae .virq;.novirq2    jmp dword near [edi+ebx*4].virq    mov ax,[resolutn]    cmp word[curypos],ax    jnb .nodrawline    cmp byte[hdmadelay],0    je .dohdma2    dec byte[hdmadelay]    jmp .nodohdma2.dohdma2    call exechdma.nodohdma2    cmp byte[curblank],0    jne .nodrawline    call drawline.nodrawline    dec esi    cmp byte[intrset],1    jne .nointrset2    mov byte[intrset],2.nointrset2    jmp switchtovirqdeb

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?