📄 65816dc.inc
字号:
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;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 flagnz, flago, flagc, cpucycle, cycpbl, cycpblt, opcjmptab, doirqnext
EXTSYM dmadata
;*******************************************************
; Flag Setting Macros
;*******************************************************
%macro endloop 0
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
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[flagnz],0
test dl,80h
jz near %%noneg
or dword[flagnz],10000h
%%noneg
test dl,2h
jnz near %%zero
or dword[flagnz],1
%%zero
mov dword[flagc],0
test dl,01h
jz near %%nocarry
mov dword[flagc],0FFh
%%nocarry
mov dword[flago],0
test dl,40h
jz near %%nov
mov dword[flago],0FFh
%%nov
%endmacro
%macro makedl 0
and dl,00111100b
test dword[flagnz],18000h
jz %%noneg
or dl,80h
%%noneg
test dword[flagnz],0FFFFh
jnz %%nozero
or dl,02h
%%nozero
test dword[flagc],0FFh
jz %%nocarry
or dl,01h
%%nocarry
test dword[flago],0FFh
jz %%nov
or dl,40h
%%nov
%endmacro
; Sets flags n and z according to al
%macro flagsetnz8b 0
mov dword[flagnz],0
mov [flagnz+1],al
endloop
%endmacro
; Sets flags n and z according to ax
%macro flagsetnz16b 0
mov cx,ax
mov [flagnz],ecx
endloop
%endmacro
; Sets flags n and z according to al
%macro flagsetnz8bnel 0
mov dword[flagnz],0
mov [flagnz+1],al
%endmacro
; Sets flags n and z according to ax
%macro flagsetnz16bnel 0
mov cx,ax
mov [flagnz],ecx
%endmacro
; Sets flags N V . . . . Z C according to flags
%macro flagsetnvzc8b 0
mov dword[flagnz],0
mov al,[xa]
seto byte[flago]
mov [flagnz+1],al
jc .carry
mov dword[flagc],0h
endloop
.carry
mov dword[flagc],0FFh
endloop
%endmacro
%macro flagsetnvzc16b 0
mov cx,[xa]
seto byte[flago]
mov [flagnz],ecx
jc .carry
mov dword[flagc],0h
endloop
.carry
mov dword[flagc],0FFh
endloop
%endmacro
; Sets flags N V . . . . Z C according to flags
%macro flagsetnvzcs8b 0
mov dword[flagnz],0
mov al,[xa]
seto byte[flago]
mov [flagnz+1],al
jc .carry
mov dword[flagc],0FFh
endloop
.carry
mov dword[flagc],0h
endloop
%endmacro
%macro flagsetnvzcs16b 0
mov cx,[xa]
seto byte[flago]
mov [flagnz],ecx
jc .carry
mov dword[flagc],0FFh
endloop
.carry
mov dword[flagc],0h
endloop
%endmacro
; Sets flags N V . . . . Z C for 16-bit decimal mode only
%macro flagsetnvzcd 0
mov cx,[xa]
seto byte[flago]
mov [flagnz],ecx
jc .carry
mov dword[flagc],0h
endloop
.carry
mov dword[flagc],0FFh
endloop
%endmacro
; Sets flags N . . . . . Z C according to flags and don't jump to execloop
%macro flagsetnzc8b 0
mov dword[flagnz],0
mov dword[flagc],0h
mov [flagnz+1],al
jnc .carry
mov dword[flagc],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[flagc],0h
mov [flagnz],ecx
jnc .carry
mov dword[flagc],0FFh
.carry
%endmacro
; Sets flags N . . . . . Z C according to flags and jump to execloop
%macro flagsetnzcel8b 0
mov dword[flagnz],0h
jc .carry
mov [flagnz+1],cl
mov dword[flagc],0FFh
endloop
.carry
mov [flagnz+1],cl
mov dword[flagc],0h
endloop
%endmacro
%macro flagsetnzcel16b 0
jc .carry
mov [flagnz],ecx
mov dword[flagc],0FFh
endloop
.carry
mov [flagnz],ecx
mov dword[flagc],0h
endloop
%endmacro
;*******************************************************
; Opcode Instructions
;*******************************************************
%macro ADCMacro8bnd 0
mov cl,[flagc]
add cl,cl
adc [xa],al
flagsetnvzc8b
%endmacro
%macro ADCMacro16bnd 0
mov cl,[flagc]
add cl,cl
adc [xa],ax
flagsetnvzc16b
%endmacro
%macro ADCMacro8bd 0
mov cl,[flagc]
add cl,cl
mov cl,al
mov al,[xa]
adc al,cl
daa
mov [xa],al
flagsetnvzc8b
endloop
%endmacro
%macro ADCMacro16bd 0
mov cl,[flagc]
add cl,cl
mov cx,ax
mov al,[xa]
adc al,cl
daa
mov [xa],al
mov al,[xa+1]
adc al,ch
daa
mov [xa+1],al
flagsetnvzcd
%endmacro
%macro ANDMacro8b 0
and al,[xa]
mov dword[flagnz],0
mov [xa],al
mov [flagnz+1],al
endloop
%endmacro
%macro ANDMacro16b 0
and eax,[xa]
mov [xa],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[flagnz],18000h
jz .notflagnz
or dword[flagnz],10000h
.notflagnz
inc esi
test [xa],al
jz .zero
mov word[flagnz],1
endloop
.zero
mov word[flagnz],0
endloop
%endmacro
%macro BITMacroim16b 0
mov ax,[esi]
test dword[flagnz],18000h
jz .notflagnz
or dword[flagnz],10000h
.notflagnz
add esi,2
test [xa],ax
jz .zero
mov word[flagnz],1
endloop
.zero
mov word[flagnz],0
endloop
%endmacro
%macro BITMacro8b 0
mov dword[flagnz],10000h
test al,80h
jnz .flagn
mov dword[flagnz],0
.flagn
mov dword[flago],1
test al,40h
jnz .flago
mov dword[flago],0
.flago
test [xa],al
jz .zero
mov word[flagnz],1
endloop
.zero
mov word[flagnz],0
endloop
%endmacro
%macro BITMacro16b 0
mov dword[flagnz],10000h
test ax,8000h
jnz .flagn
mov dword[flagnz],0
.flagn
mov dword[flago],1
test ax,4000h
jnz .flago
mov dword[flago],0
.flago
test [xa],ax
jz .zero
mov word[flagnz],1
endloop
.zero
mov word[flagnz],0
endloop
%endmacro
%macro BRKMacro 0
inc esi
test byte[xe],1
jne near BRKemulmode
mov bl,[xpb]
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,[xs]
mov cl,[xpb]
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 [xs],bx
xor bh,bh
mov bl,byte[xirqb]
mov [xpb],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
endloop
BRKemulmode
mov bl,[xpb]
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,[xs]
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 [xs],bx
xor bh,bh
mov bl,[xpb]
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 ax,[xpc]
mov bl,[xpb]
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
add bx,2
xor eax,eax
add bx,[esi]
mov ax,bx
xor ebx,ebx
mov [xpc],ax
mov bl,[xpb]
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,[xa]
sub cl,al
flagsetnzcel8b
%endmacro
%macro CMPMacro16b 0
mov cx,[xa]
sub cx,ax
flagsetnzcel16b
%endmacro
%macro COPMacro 0
inc esi
test byte[xe],1
jne near COPemulmode
mov bl,[xpb]
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,[xs]
mov cl,[xpb]
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 [xs],bx
xor bh,bh
mov bl,byte[xirqb]
mov [xpb],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
endloop
COPemulmode
mov bl,[xpb]
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,[xs]
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 [xs],bx
xor bh,bh
mov bl,[xpb]
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,[xx]
sub cl,al
flagsetnzcel8b
%endmacro
%macro CPXMacro16b 0
mov cx,[xx]
sub cx,ax
flagsetnzcel16b
%endmacro
%macro CPYMacro8b 0
mov cl,[xy]
sub cl,al
flagsetnzcel8b
%endmacro
%macro CPYMacro16b 0
mov cx,[xy]
sub cx,ax
flagsetnzcel16b
%endmacro
%macro EORMacro8b 0
xor al,[xa]
mov dword[flagnz],0
mov [xa],al
mov [flagnz+1],al
endloop
%endmacro
%macro EORMacro16b 0
xor eax,[xa]
mov [xa],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 [xpb],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,[xpb]
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
mov esi,[snesmap2+ebx*4]
cmp eax,4300h
jae .upperlower
mov [initaddrl],esi
add esi,eax
endloop
.upperlower
cmp dword[memtabler8+ebx*4],regaccessbankr8
je .dma
mov [initaddrl],esi
add esi,eax
endloop
.dma
mov esi,dmadata-4300h
mov [initaddrl],esi
add esi,eax
endloop
%endmacro
%macro JMPMacro6C 0
mov cx,[esi]
xor eax,eax
call membank0r16
mov [xpc],ax
mov bl,[xpb]
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,[xx]
mov bl,[xpb]
call dword near [memtabler16+ebx*4]
mov [xpc],ax
mov bl,[xpb]
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 [xpb],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,[xs]
mov al,[xpb]
call membank0w8
dec cx
or cx,word[stackor]
mov al,[xpc+1]
call membank0w8
dec cx
or cx,word[stackor]
mov al,[xpc]
call membank0w8
dec cx
or cx,word[stackor]
mov [xs],cx
xor eax,eax
xor bh,bh
mov ax,[esi]
mov bl,[esi+2]
mov [xpc],ax
mov [xpb],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 JSRMacro20 0
mov ebx,esi
sub ebx,[initaddrl]
inc bx
mov [xpc],bx
mov cx,[xs]
mov al,[xpc+1]
call membank0w8
dec cx
or cx,word[stackor]
mov al,[xpc]
call membank0w8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -