📄 sfxproc.asm
字号:
; Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.;; Super FX assembler emulator code; (c) Copyright 1998, 1999 zsKnight and _Demo_.;; Permission to use, copy, modify and distribute Snes9x in both binary and; source form, for non-commercial purposes, is hereby granted without fee,; providing that this license information and copyright notice appear with; all copies and any derived work.;; This software is provided 'as-is', without any express or implied; warranty. In no event shall the authors be held liable for any damages; arising from the use of this software.;; Snes9x is freeware for PERSONAL USE only. Commercial users should; seek permission of the copyright holders first. Commercial use includes; charging money for Snes9x or software derived from Snes9x.;; The copyright holders request that bug fixes and improvements to the code; should be forwarded to them so everyone can benefit from the modifications; in future versions.;; Super NES and Super Nintendo Entertainment System are trademarks of; Nintendo Co., Limited and its subsidiary companies.;%include "i386/macros.mac"%include "i386/regs.mac"%include "i386/regsw.mac"EXTSYM NumberOfOpcodes,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,StartSFX,debstop,regptr,regptw,sfxramdataEXTSYM SfxPOR,sfxclinelocEXTSYM sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc%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 .dataNEWSYM cachewarning, db 0SECTION .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 mov al,[SfxSFR+1] and byte[SfxSFR+1],07Fh ; clear IRQ flag retNEWSYM 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 ret NEWSYM 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 mov byte[debstop],1 ; 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; call StartSFXret ret; Other SFX stuffNEWSYM reg3030w mov [SfxSFR],al; mov dh,10 ; Disassemble Flags test al,20h jz .noexec pushad mov dword [NumberOfOpcodes],100 call StartSFX popad.noexec 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 retNEWSYM reg3039w ; CLSR (Clock Speed Register) and al,0FEh mov [SfxCLSR],al retNEWSYM reg303Aw ; SCMR (Screen Mode Register) mov [SfxSCMR],al 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 dword [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 byte[debstop],1 mov ebx,[sfxramdata] mov [ebx+ecx],ax xor ebx,ebx retNEWSYM sfxaccessbankr8b mov byte[debstop],1 mov ebx,[sfxramdata] mov al,[ebx+ecx+65536] xor ebx,ebx retNEWSYM sfxaccessbankw8b mov byte[debstop],1 mov ebx,[sfxramdata] mov [ebx+ecx+65536],al xor ebx,ebx retNEWSYM sfxaccessbankr16b mov byte[debstop],1 mov ebx,[sfxramdata] mov ax,[ebx+ecx+65536] xor ebx,ebx retNEWSYM sfxaccessbankw16b mov byte[debstop],1 mov ebx,[sfxramdata] mov [ebx+ecx+65536],ax xor ebx,ebx retNEWSYM sfxaccessbankr8c mov byte[debstop],1 mov ebx,[sfxramdata] mov al,[ebx+ecx+65536*2] xor ebx,ebx retNEWSYM sfxaccessbankw8c mov byte[debstop],1 mov ebx,[sfxramdata] mov [ebx+ecx+65536*2],al xor ebx,ebx retNEWSYM sfxaccessbankr16c mov byte[debstop],1 mov ebx,[sfxramdata] mov ax,[ebx+ecx+65536*2] xor ebx,ebx retNEWSYM sfxaccessbankw16c mov byte[debstop],1 mov ebx,[sfxramdata] mov [ebx+ecx+65536*2],ax xor ebx,ebx retNEWSYM sfxaccessbankr8d mov byte[debstop],1 mov ebx,[sfxramdata] mov al,[ebx+ecx+65536*3] xor ebx,ebx retNEWSYM sfxaccessbankw8d mov byte[debstop],1 mov ebx,[sfxramdata] mov [ebx+ecx+65536*3],al xor ebx,ebx retNEWSYM sfxaccessbankr16d mov byte[debstop],1 mov ebx,[sfxramdata] mov ax,[ebx+ecx+65536*3] xor ebx,ebx retNEWSYM sfxaccessbankw16d mov byte[debstop],1 mov ebx,[sfxramdata] mov [ebx+ecx+65536*3],ax xor ebx,ebx ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -