📄 s65816d.inc
字号:
;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.EXTSYM Sflagnz,Sflago,Sflagc,dmadata,IRAM%ifndef NO_DEBUGGEREXTSYM debuggeron%endif;*******************************************************; Flag Setting Macros;*******************************************************%macro endloop 0; call sa1debug mov bl,[esi] inc esi sub dh,[cpucycle+ebx] jc %%cpuover jmp dword near [edi+ebx*4]%%cpuover ret%endmacro%macro restoredl 0 mov dword[Sflagnz],0 test dl,80h jz %%noneg or dword[Sflagnz],10000h%%noneg test dl,2h jnz %%zero or dword[Sflagnz],1%%zero mov dword[Sflagc],0 test dl,01h jz %%nocarry mov dword[Sflagc],0FFh%%nocarry mov dword[Sflago],0 test dl,40h jz %%nov mov dword[Sflago],0FFh%%nov%endmacro%macro makedl 0 and dl,00111100b test dword[Sflagnz],18000h jz %%noneg or dl,80h%%noneg test dword[Sflagnz],0FFFFh jnz %%nozero or dl,02h%%nozero test dword[Sflagc],0FFh jz %%nocarry or dl,01h%%nocarry test dword[Sflago],0FFh jz %%nov or dl,40h%%nov%endmacroSECTION .textNEWSYM Ssplitflags restoredl retNEWSYM Sjoinflags makedl ret; Sets flags n and z according to al%macro flagsetnz8b 0 mov dword[Sflagnz],0 mov [Sflagnz+1],al endloop%endmacro; Sets flags n and z according to ax%macro flagsetnz16b 0 mov cx,ax mov [Sflagnz],ecx endloop%endmacro; Sets flags n and z according to al%macro flagsetnz8bnel 0 mov dword[Sflagnz],0 mov [Sflagnz+1],al%endmacro; Sets flags n and z according to ax%macro flagsetnz16bnel 0 mov cx,ax mov [Sflagnz],ecx%endmacro; Sets flags N V . . . . Z C according to flags%macro flagsetnvzc8b 0 mov dword[Sflagnz],0 mov al,[SA1xa] seto byte[Sflago] mov [Sflagnz+1],al jc .carry mov dword[Sflagc],0h endloop.carry mov dword[Sflagc],0FFh endloop%endmacro%macro flagsetnvzc16b 0 mov cx,[SA1xa] seto byte[Sflago] mov [Sflagnz],ecx jc .carry mov dword[Sflagc],0h endloop.carry mov dword[Sflagc],0FFh endloop%endmacro; Sets flags N V . . . . Z C according to flags%macro flagsetnvzcs8b 0 mov dword[Sflagnz],0 mov al,[SA1xa] seto byte[Sflago] mov [Sflagnz+1],al jc .carry mov dword[Sflagc],0FFh endloop.carry mov dword[Sflagc],0h endloop%endmacro%macro flagsetnvzcs16b 0 mov cx,[SA1xa] seto byte[Sflago] mov [Sflagnz],ecx jc .carry mov dword[Sflagc],0FFh endloop.carry mov dword[Sflagc],0h endloop%endmacro; Sets flags N V . . . . Z C for 16-bit decimal mode only%macro flagsetnvzcd 0 mov cx,[SA1xa] seto byte[Sflago] mov [Sflagnz],ecx jc .carry mov dword[Sflagc],0h endloop.carry mov dword[Sflagc],0FFh endloop%endmacro; Sets flags N . . . . . Z C according to flags and don't jump to execloop%macro flagsetnzc8b 0 mov dword[Sflagnz],0 mov dword[Sflagc],0h mov [Sflagnz+1],al jnc .carry mov dword[Sflagc],0FFh.carry%endmacro; Sets flags N . . . . . Z C according to flags and don't jump to execloop%macro flagsetnzc 0 mov cx,ax mov dword[Sflagc],0h mov [Sflagnz],ecx jnc .carry mov dword[Sflagc],0FFh.carry%endmacro; Sets flags N . . . . . Z C according to flags and jump to execloop%macro flagsetnzcel8b 0 mov dword[Sflagnz],0h jc .carry mov [Sflagnz+1],cl mov dword[Sflagc],0FFh endloop.carry mov [Sflagnz+1],cl mov dword[Sflagc],0h endloop%endmacro%macro flagsetnzcel16b 0 jc .carry mov [Sflagnz],ecx mov dword[Sflagc],0FFh endloop.carry mov [Sflagnz],ecx mov dword[Sflagc],0h endloop%endmacro;*******************************************************; Opcode Instructions;*******************************************************%macro ADCMacro8bnd 0 mov cl,[Sflagc] add cl,cl adc [SA1xa],al flagsetnvzc8b%endmacro%macro ADCMacro16bnd 0 mov cl,[Sflagc] add cl,cl adc [SA1xa],ax flagsetnvzc16b%endmacro%macro ADCMacro8bd 0 mov cl,[Sflagc] add cl,cl mov cl,al mov al,[SA1xa] adc al,cl daa mov [SA1xa],al flagsetnvzc8b endloop%endmacro%macro ADCMacro16bd 0 mov cl,[Sflagc] add cl,cl mov cx,ax mov al,[SA1xa] adc al,cl daa mov [SA1xa],al mov al,[SA1xa+1] adc al,ch daa mov [SA1xa+1],al flagsetnvzcd%endmacro%macro ANDMacro8b 0 and al,[SA1xa] mov dword[Sflagnz],0 mov [SA1xa],al mov [Sflagnz+1],al endloop%endmacro%macro ANDMacro16b 0 and eax,[SA1xa] mov [SA1xa],ax flagsetnz16b%endmacro%macro ASLMacro8b 0 add al,al flagsetnzc8b%endmacro%macro ASLMacro16b 0 add ax,ax flagsetnzc%endmacro%macro JumpMacro 0 movsx eax,byte[esi] add esi,eax.skip inc esi endloop%endmacro%macro BITMacroim8b 0 mov al,[esi] test dword[Sflagnz],18000h jz .notSflagnz or dword[Sflagnz],10000h.notSflagnz inc esi test [SA1xa],al jz .zero mov word[Sflagnz],1 endloop.zero mov word[Sflagnz],0 endloop%endmacro%macro BITMacroim16b 0 mov ax,[esi] test dword[Sflagnz],18000h jz .notSflagnz or dword[Sflagnz],10000h.notSflagnz add esi,2 test [SA1xa],ax jz .zero mov word[Sflagnz],1 endloop.zero mov word[Sflagnz],0 endloop%endmacro%macro BITMacro8b 0 mov dword[Sflagnz],10000h test al,80h jnz .flagn mov dword[Sflagnz],0.flagn mov dword[Sflago],1 test al,40h jnz .Sflago mov dword[Sflago],0.Sflago test [SA1xa],al jz .zero mov word[Sflagnz],1 endloop.zero mov word[Sflagnz],0 endloop%endmacro%macro BITMacro16b 0 mov dword[Sflagnz],10000h test ax,8000h jnz .flagn mov dword[Sflagnz],0.flagn mov dword[Sflago],1 test ax,4000h jnz .Sflago mov dword[Sflago],0.Sflago test [SA1xa],ax jz .zero mov word[Sflagnz],1 endloop.zero mov word[Sflagnz],0 endloop%endmacro%macro BRKMacro 0 inc esi test byte[xe],1 jne near BRKemulmode mov bl,[SA1xpb] mov ax,[xpc] test eax,8000h jz .loweraddr2 mov eax,[snesmmap+ebx*4] jmp .nextaddr.loweraddr2 mov eax,[snesmap2+ebx*4].nextaddr mov ebx,esi sub ebx,eax mov [xpc],bx mov eax,[wramdata] mov bx,[SA1xs] mov cl,[SA1xpb] mov [eax+ebx],cl dec bx and bx,word[stackand] or bx,word[stackor] mov cl,[xpc+1] mov [eax+ebx],cl dec bx and bx,word[stackand] or bx,word[stackor] mov cl,[xpc] mov [eax+ebx],cl dec bx and bx,word[stackand] or bx,word[stackor] makedl mov [eax+ebx],dl dec bx and bx,word[stackand] or bx,word[stackor] mov [SA1xs],bx xor bh,bh mov bl,[xirqb] mov [SA1xpb],bl xor eax,eax mov ax,[brkv] mov [xpc],ax and dl,11110011b or dl,00000100b test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloopBRKemulmode mov bl,[SA1xpb] mov ax,[xpc] test eax,8000h jz .loweraddr2 mov eax,[snesmmap+ebx*4] jmp .nextaddr.loweraddr2 mov eax,[snesmap2+ebx*4].nextaddr mov ebx,esi sub ebx,eax mov [xpc],bx mov eax,[wramdata] mov bx,[SA1xs] mov cl,[xpc+1] mov [eax+ebx],cl dec bx and bx,word[stackand] or bx,word[stackor] mov cl,[xpc] mov [eax+ebx],cl dec bx and bx,word[stackand] or bx,word[stackor] makedl mov [eax+ebx],dl dec bx and bx,word[stackand] or bx,word[stackor] mov [SA1xs],bx xor bh,bh mov bl,[SA1xpb] xor eax,eax mov ax,[brkv8] mov [xpc],ax and dl,11110011b or dl,00000100b test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloop%endmacro%macro BRLMacro 0 mov ebx,esi sub ebx,[initaddrl] add bx,2 xor eax,eax add bx,[esi] mov ax,bx xor ebx,ebx mov [xpc],ax mov bl,[SA1xpb] test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloop%endmacro%macro CMPMacro8b 0 mov cl,[SA1xa] sub cl,al flagsetnzcel8b%endmacro%macro CMPMacro16b 0 mov cx,[SA1xa] sub cx,ax flagsetnzcel16b%endmacro%macro COPMacro 0 inc esi test byte[xe],1 jne near COPemulmode mov bl,[SA1xpb] mov ax,[xpc] test eax,8000h jz .loweraddr2 mov eax,[snesmmap+ebx*4] jmp .nextaddr.loweraddr2 mov eax,[snesmap2+ebx*4].nextaddr mov ebx,esi sub ebx,eax mov [xpc],bx mov cx,[SA1xs] mov al,[SA1xpb] call membank0w8 dec cx mov al,[xpc+1] call membank0w8 dec cx or cx,word[stackor] mov al,[xpc] call membank0w8 dec cx or cx,word[stackor] makedl mov al,dl call membank0w8 dec cx or cx,word[stackor] mov [SA1xs],cx xor bh,bh mov bl,[xirqb] mov [SA1xpb],bl xor eax,eax mov ax,[copv] mov [xpc],ax and dl,11110011b or dl,00000100b test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloopCOPemulmode mov bl,[SA1xpb] mov ax,[xpc] test eax,8000h jz .loweraddr2 mov eax,[snesmmap+ebx*4] jmp .nextaddr.loweraddr2 mov eax,[snesmap2+ebx*4].nextaddr mov ebx,esi sub ebx,eax mov [xpc],bx mov eax,[wramdata] mov bx,[SA1xs] mov cl,[xpc+1] mov [eax+ebx],cl dec bx and bx,word[stackand] or bx,word[stackor] mov cl,[xpc] mov [eax+ebx],cl dec bx and bx,word[stackand] or bx,word[stackor] makedl mov [eax+ebx],dl dec bx and bx,word[stackand] or bx,word[stackor] mov [SA1xs],bx xor bh,bh mov bl,[SA1xpb] xor eax,eax mov ax,[copv8] mov [xpc],ax and dl,11110011b or dl,00000100b test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloop%endmacro%macro CPXMacro8b 0 mov cl,[SA1xx] sub cl,al flagsetnzcel8b%endmacro%macro CPXMacro16b 0 mov cx,[SA1xx] sub cx,ax flagsetnzcel16b%endmacro%macro CPYMacro8b 0 mov cl,[SA1xy] sub cl,al flagsetnzcel8b%endmacro%macro CPYMacro16b 0 mov cx,[SA1xy] sub cx,ax flagsetnzcel16b%endmacro%macro EORMacro8b 0 xor al,[SA1xa] mov dword[Sflagnz],0 mov [SA1xa],al mov [Sflagnz+1],al endloop%endmacro%macro EORMacro16b 0 xor eax,[SA1xa] mov [SA1xa],ax flagsetnz16b%endmacro%macro JMLMacro 0 mov cx,[esi] xor eax,eax call membank0r16 add cx,2 push eax call membank0r8 mov bl,al pop eax mov [xpc],ax mov [SA1xpb],bl test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloop%endmacro%macro JMPMacro4C 0 xor eax,eax mov ax,[esi] mov bl,[SA1xpb] mov [xpc],ax test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr; mov esi,[snesmap2+ebx*4]; mov [initaddrl],esi; add esi,eax mov esi,[snesmap2+ebx*4] cmp eax,4300h jae .upperlower mov [initaddrl],esi add esi,eax endloop.upperlower mov [initaddrl],esi add esi,eax endloop%endmacro%macro JMPMacro6C 0 mov cx,[esi] xor eax,eax call membank0r16 mov [xpc],ax mov bl,[SA1xpb] test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloop%endmacro%macro JMPMacro7C 0 mov cx,[esi] xor eax,eax add cx,[SA1xx] mov bl,[SA1xpb] call dword near [memtabler16+ebx*4] mov [xpc],ax mov bl,[SA1xpb] test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloop%endmacro%macro JMPMacro5C 0 xor eax,eax mov bl,[esi+2] mov ax,[esi] mov [SA1xpb],bl mov [xpc],ax test eax,8000h jz .loweraddr mov esi,[snesmmap+ebx*4] mov [initaddrl],esi add esi,eax endloop.loweraddr mov esi,[snesmap2+ebx*4] mov [initaddrl],esi add esi,eax endloop%endmacro%macro JSLMacro 0 mov ebx,esi sub ebx,[initaddrl] add bx,2 mov [xpc],bx mov cx,[SA1xs] mov al,[SA1xpb] call membank0w8 dec cx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -