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