⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sfxproc.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
字号:
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach );;http://www.zsnes.com;http://sourceforge.net/projects/zsnes;https://zsnes.bountysource.com;;This program is free software; you can redistribute it and/or;modify it under the terms of the GNU General Public License;version 2 as published by the Free Software Foundation.;;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 SfxB,SfxBRAMR,SfxCBR,SfxCFGR,SfxCLSR,SfxCPB,SfxCROMEXTSYM SfxCarry,SfxMemTable,SfxOverflow,SfxPBR,SfxPIPE,SfxR0,SfxR1,SfxR10EXTSYM SfxR11,SfxR12,SfxR13,SfxR14,SfxR15,SfxR2,SfxR3,SfxR4,SfxR5,SfxR6EXTSYM SfxR7,SfxR8,SfxR9,SfxRAMBR,SfxRAMMem,SfxROMBR,SfxSCBR,SfxSCMR,SfxSFREXTSYM SfxSignZero,SfxnRamBanks,regptr,regptw,sfxramdata,ChangeOpsEXTSYM SfxPOR,sfxclineloc,UpdatePORSCMR,UpdateCLSR,UpdateSCBRCOLR,SfxACEXTSYM sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc,SFXProc%include "cpu/regs.mac"%include "cpu/regsw.mac"%macro AssembleSFXFlags 0    and word[SfxSFR],8F60h    test byte[SfxCarry],1    jz .nosfxcarry    or word[SfxSFR],04h.nosfxcarry    cmp word[SfxSignZero],0    jne .nozero    or word[SfxSFR],02h.nozero    test word[SfxSignZero],8000h    jz .noneg    or word[SfxSFR],08h.noneg    cmp byte[SfxOverflow],0    je .noof    or word[SfxSFR],10h.noof    cmp byte[SfxB],0    je .bzero    or word[SfxSFR],1000h.bzero%endmacroSECTION .textNEWSYM initsfxregsr    setreg 3000h*4,reg3000r    setreg 3001h*4,reg3001r    setreg 3002h*4,reg3002r    setreg 3003h*4,reg3003r    setreg 3004h*4,reg3004r    setreg 3005h*4,reg3005r    setreg 3006h*4,reg3006r    setreg 3007h*4,reg3007r    setreg 3008h*4,reg3008r    setreg 3009h*4,reg3009r    setreg 300Ah*4,reg300Ar    setreg 300Bh*4,reg300Br    setreg 300Ch*4,reg300Cr    setreg 300Dh*4,reg300Dr    setreg 300Eh*4,reg300Er    setreg 300Fh*4,reg300Fr    setreg 3010h*4,reg3010r    setreg 3011h*4,reg3011r    setreg 3012h*4,reg3012r    setreg 3013h*4,reg3013r    setreg 3014h*4,reg3014r    setreg 3015h*4,reg3015r    setreg 3016h*4,reg3016r    setreg 3017h*4,reg3017r    setreg 3018h*4,reg3018r    setreg 3019h*4,reg3019r    setreg 301Ah*4,reg301Ar    setreg 301Bh*4,reg301Br    setreg 301Ch*4,reg301Cr    setreg 301Dh*4,reg301Dr    setreg 301Eh*4,reg301Er    setreg 301Fh*4,reg301Fr    setreg 3030h*4,reg3030r    setreg 3031h*4,reg3031r    setreg 3032h*4,reg3032r    setreg 3033h*4,reg3033r    setreg 3034h*4,reg3034r    setreg 3035h*4,reg3035r    setreg 3036h*4,reg3036r    setreg 3037h*4,reg3037r    setreg 3038h*4,reg3038r    setreg 3039h*4,reg3039r    setreg 303Ah*4,reg303Ar    setreg 303Bh*4,reg303Br    setreg 303Ch*4,reg303Cr    setreg 303Dh*4,reg303Dr    setreg 303Eh*4,reg303Er    setreg 303Fh*4,reg303Fr    ; set 3100-31FF to cacheregr    mov edi,3100h*4    add edi,[regptr]    mov eax,cacheregr    mov ecx,200h.loop    mov [edi],eax    add edi,4    dec ecx    jnz .loop    retNEWSYM initsfxregsw    setregw 3000h*4,reg3000w    setregw 3001h*4,reg3001w    setregw 3002h*4,reg3002w    setregw 3003h*4,reg3003w    setregw 3004h*4,reg3004w    setregw 3005h*4,reg3005w    setregw 3006h*4,reg3006w    setregw 3007h*4,reg3007w    setregw 3008h*4,reg3008w    setregw 3009h*4,reg3009w    setregw 300Ah*4,reg300Aw    setregw 300Bh*4,reg300Bw    setregw 300Ch*4,reg300Cw    setregw 300Dh*4,reg300Dw    setregw 300Eh*4,reg300Ew    setregw 300Fh*4,reg300Fw    setregw 3010h*4,reg3010w    setregw 3011h*4,reg3011w    setregw 3012h*4,reg3012w    setregw 3013h*4,reg3013w    setregw 3014h*4,reg3014w    setregw 3015h*4,reg3015w    setregw 3016h*4,reg3016w    setregw 3017h*4,reg3017w    setregw 3018h*4,reg3018w    setregw 3019h*4,reg3019w    setregw 301Ah*4,reg301Aw    setregw 301Bh*4,reg301Bw    setregw 301Ch*4,reg301Cw    setregw 301Dh*4,reg301Dw    setregw 301Eh*4,reg301Ew    setregw 301Fh*4,reg301Fw    setregw 3030h*4,reg3030w    setregw 3031h*4,reg3031w    setregw 3032h*4,reg3032w    setregw 3033h*4,reg3033w    setregw 3034h*4,reg3034w    setregw 3035h*4,reg3035w    setregw 3036h*4,reg3036w    setregw 3037h*4,reg3037w    setregw 3038h*4,reg3038w    setregw 3039h*4,reg3039w    setregw 303Ah*4,reg303Aw    setregw 303Bh*4,reg303Bw    setregw 303Ch*4,reg303Cw    setregw 303Dh*4,reg303Dw    setregw 303Eh*4,reg303Ew    setregw 303Fh*4,reg303Fw    ; set 3100-31FF to cacheregw    mov edi,3100h*4    add edi,[regptw]    mov eax,cacheregw    mov ecx,200h.loop    mov [edi],eax    add edi,4    dec ecx    jnz .loop    retNEWSYM cacheregr    or byte[cachewarning],1    retNEWSYM cacheregw    or byte[cachewarning],2    retSECTION .bssNEWSYM cachewarning, resb 1SECTION .text; SFX RegistersNEWSYM reg3000r    mov al,[SfxR0]    retNEWSYM reg3001r    mov al,[SfxR0+1]    retNEWSYM reg3002r    mov al,[SfxR1]    retNEWSYM reg3003r    mov al,[SfxR1+1]    retNEWSYM reg3004r    mov al,[SfxR2]    retNEWSYM reg3005r    mov al,[SfxR2+1]    retNEWSYM reg3006r    mov al,[SfxR3]    retNEWSYM reg3007r    mov al,[SfxR3+1]    retNEWSYM reg3008r    mov al,[SfxR4]    retNEWSYM reg3009r    mov al,[SfxR4+1]    retNEWSYM reg300Ar    mov al,[SfxR5]    retNEWSYM reg300Br    mov al,[SfxR5+1]    retNEWSYM reg300Cr    mov al,[SfxR6]    retNEWSYM reg300Dr    mov al,[SfxR6+1]    retNEWSYM reg300Er    mov al,[SfxR7]    retNEWSYM reg300Fr    mov al,[SfxR7+1]    retNEWSYM reg3010r    mov al,[SfxR8]    retNEWSYM reg3011r    mov al,[SfxR8+1]    retNEWSYM reg3012r    mov al,[SfxR9]    retNEWSYM reg3013r    mov al,[SfxR9+1]    retNEWSYM reg3014r    mov al,[SfxR10]    retNEWSYM reg3015r    mov al,[SfxR10+1]    retNEWSYM reg3016r    mov al,[SfxR11]    retNEWSYM reg3017r    mov al,[SfxR11+1]    retNEWSYM reg3018r    mov al,[SfxR12]    retNEWSYM reg3019r    mov al,[SfxR12+1]    retNEWSYM reg301Ar    mov al,[SfxR13]    retNEWSYM reg301Br    mov al,[SfxR13+1]    retNEWSYM reg301Cr    mov al,[SfxR14]    retNEWSYM reg301Dr    mov al,[SfxR14+1]    retNEWSYM reg301Er    mov al,[SfxR15]    retNEWSYM reg301Fr    mov al,[SfxR15+1]    ret; Other SFX stuffNEWSYM reg3030r    AssembleSFXFlags    mov al,[SfxSFR]    retNEWSYM reg3031r    cmp byte[SfxAC],1    je .alwaysclear    cmp dword[ChangeOps],-350*240    jl .noclear.alwaysclear    and byte[SfxSFR+1],07fh        ; clear IRQ flag    jmp .cleared.noclear    cmp dword[ChangeOps],-350*240*4    jge .clear    mov dword[ChangeOps],-350*240*4    jmp .cleared.clear    add dword[ChangeOps],350*240.cleared    mov al,[SfxSFR+1]    retSECTION .bss.test resb 1SECTION .textNEWSYM reg3032r       ; Unused    xor al,al    retNEWSYM reg3033r       ; BRAMR Backup Ram Read only on/off (bits 1-15 unused)    mov al,[SfxBRAMR]    retNEWSYM reg3034r       ; PBR (Program Bank)    mov al,[SfxPBR]    retNEWSYM reg3035r       ; Unused    xor al,al    retNEWSYM reg3036r       ; ROMBR (Gamepak Rom Bank Register)    mov al,[SfxROMBR]    retNEWSYM reg3037r       ; CFGR (Control Flags Register)    mov al,[SfxCFGR]    retNEWSYM reg3038r       ; SCBR (Screen Bank Register)    mov al,[SfxSCBR]    retNEWSYM reg3039r       ; CLSR (Clock Speed Register)    mov al,[SfxCLSR]    retNEWSYM reg303Ar       ; SCMR (Screen Mode Register)    mov al,[SfxSCMR]    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    retNEWSYM reg303Br       ; VCR (Version Code Register)    mov al,20h    retNEWSYM reg303Cr       ; RAMBR (Ram bank register)    mov al,[SfxRAMBR]    retNEWSYM reg303Dr       ; Unused    xor al,al    retNEWSYM reg303Er       ; CBR (Cache Base Register), lower byte    mov al,[SfxCBR]    retNEWSYM reg303Fr       ; CBR (Cache Base Register), upper byte    mov al,[SfxCBR+1]    ret; SFX Write RegistersNEWSYM reg3000w    mov [SfxR0],al    retNEWSYM reg3001w    mov [SfxR0+1],al    retNEWSYM reg3002w    mov [SfxR1],al    retNEWSYM reg3003w    mov [SfxR1+1],al    retNEWSYM reg3004w    mov [SfxR2],al    retNEWSYM reg3005w    mov [SfxR2+1],al    retNEWSYM reg3006w    mov [SfxR3],al    retNEWSYM reg3007w    mov [SfxR3+1],al    retNEWSYM reg3008w    mov [SfxR4],al    retNEWSYM reg3009w    mov [SfxR4+1],al    retNEWSYM reg300Aw    mov [SfxR5],al    retNEWSYM reg300Bw    mov [SfxR5+1],al    retNEWSYM reg300Cw    mov [SfxR6],al    retNEWSYM reg300Dw    mov [SfxR6+1],al    retNEWSYM reg300Ew    mov [SfxR7],al    retNEWSYM reg300Fw    mov [SfxR7+1],al    retNEWSYM reg3010w    mov [SfxR8],al    retNEWSYM reg3011w    mov [SfxR8+1],al    retNEWSYM reg3012w    mov [SfxR9],al    retNEWSYM reg3013w    mov [SfxR9+1],al    retNEWSYM reg3014w    mov [SfxR10],al    retNEWSYM reg3015w    mov [SfxR10+1],al    retNEWSYM reg3016w    mov [SfxR11],al    retNEWSYM reg3017w    mov [SfxR11+1],al    retNEWSYM reg3018w    mov [SfxR12],al    retNEWSYM reg3019w    mov [SfxR12+1],al    retNEWSYM reg301Aw    mov [SfxR13],al    retNEWSYM reg301Bw    mov [SfxR13+1],al    retNEWSYM reg301Cw    mov [SfxR14],al    retNEWSYM reg301Dw    mov [SfxR14+1],al    retNEWSYM reg301Ew    mov [SfxR15],al    retNEWSYM reg301Fw    mov [SfxR15+1],al    ; start execution    push edx    mov edx,[SfxPBR]    mov edx,[SfxMemTable+edx*4]    add edx,[SfxR15]    mov dl,[edx]    mov [SfxPIPE],dl    pop edx    inc word[SfxR15]    or byte[SfxSFR],20h    or dword[SfxSFR],08000h         ; Set IRQ Flag    mov dword[SFXProc],1;    call StartSFXret    ret; Other SFX stuffNEWSYM reg3030w    mov [SfxSFR],al    mov byte[SfxAC],1    mov dh,10    retNEWSYM reg3031w    mov [SfxSFR+1],al    retNEWSYM reg3032w       ; Unused    retNEWSYM reg3033w       ; BRAMR Backup Ram Read only on/off (bits 1-15 unused)    and al,0FEh    mov [SfxBRAMR],al    retNEWSYM reg3034w       ; PBR (Program Bank)    mov [SfxPBR],al    xor ebx,ebx    mov bl,al    mov ebx,[SfxMemTable+ebx*4]    mov [SfxCPB],ebx    retNEWSYM reg3035w       ; Unused    retNEWSYM reg3036w       ; ROMBR (Gamepak Rom Bank Register)    mov [SfxROMBR],al    xor ebx,ebx    mov bl,al    mov ebx,[SfxMemTable+ebx*4]    mov [SfxCROM],ebx    retNEWSYM reg3037w       ; CFGR (Control Flags Register)    mov [SfxCFGR],al    retNEWSYM reg3038w       ; SCBR (Screen Bank Register)    mov [SfxSCBR],al    call UpdateSCBRCOLR    retNEWSYM reg3039w       ; CLSR (Clock Speed Register)    and al,0FEh    mov [SfxCLSR],al    call UpdateCLSR    retNEWSYM reg303Aw       ; SCMR (Screen Mode Register)    mov [SfxSCMR],al    call UpdatePORSCMR    retNEWSYM reg303Bw       ; VCR (Version Code Register)    retNEWSYM reg303Cw       ; RAMBR (Ram bank register)    mov bl,[SfxnRamBanks]    dec bl    and al,bl    mov ebx,[SfxnRamBanks]    dec ebx    and eax,ebx    mov [SfxRAMBR],eax    xor ebx,ebx    mov bl,al    shl ebx,16    add ebx,[sfxramdata]    mov [SfxRAMMem],ebx    retNEWSYM reg303Dw       ; Unused    retNEWSYM reg303Ew       ; CBR (Cache Base Register), lower byte    mov [SfxCBR],al    retNEWSYM reg303Fw       ; CBR (Cache Base Register), upper byte    mov [SfxCBR+1],al    retNEWSYM sfxaccessbankr8    mov ebx,[sfxramdata]    mov al,[ebx+ecx]    xor ebx,ebx    retNEWSYM sfxaccessbankw8    mov ebx,[sfxramdata]    mov [ebx+ecx],al    xor ebx,ebx    retNEWSYM sfxaccessbankr16    mov ebx,[sfxramdata]    mov ax,[ebx+ecx]    xor ebx,ebx    retNEWSYM sfxaccessbankw16    mov ebx,[sfxramdata]    mov [ebx+ecx],ax    xor ebx,ebx    retNEWSYM sfxaccessbankr8b    mov ebx,[sfxramdata]    mov al,[ebx+ecx+65536]    xor ebx,ebx    retNEWSYM sfxaccessbankw8b    mov ebx,[sfxramdata]    mov [ebx+ecx+65536],al    xor ebx,ebx    retNEWSYM sfxaccessbankr16b    mov ebx,[sfxramdata]    mov ax,[ebx+ecx+65536]    xor ebx,ebx    retNEWSYM sfxaccessbankw16b    mov ebx,[sfxramdata]    mov [ebx+ecx+65536],ax    xor ebx,ebx    retNEWSYM sfxaccessbankr8c    mov ebx,[sfxramdata]    mov al,[ebx+ecx+65536*2]    xor ebx,ebx    retNEWSYM sfxaccessbankw8c    mov ebx,[sfxramdata]    mov [ebx+ecx+65536*2],al    xor ebx,ebx    retNEWSYM sfxaccessbankr16c    mov ebx,[sfxramdata]    mov ax,[ebx+ecx+65536*2]    xor ebx,ebx    retNEWSYM sfxaccessbankw16c    mov ebx,[sfxramdata]    mov [ebx+ecx+65536*2],ax    xor ebx,ebx    retNEWSYM sfxaccessbankr8d    mov ebx,[sfxramdata]    mov al,[ebx+ecx+65536*3]    xor ebx,ebx    retNEWSYM sfxaccessbankw8d    mov ebx,[sfxramdata]    mov [ebx+ecx+65536*3],al    xor ebx,ebx    retNEWSYM sfxaccessbankr16d    mov ebx,[sfxramdata]    mov ax,[ebx+ecx+65536*3]    xor ebx,ebx    retNEWSYM sfxaccessbankw16d    mov ebx,[sfxramdata]    mov [ebx+ecx+65536*3],ax    xor ebx,ebx    ret

⌨️ 快捷键说明

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