First release of ZSNES sources
This commit is contained in:
524
zsnes/src/cpu/irq.asm
Normal file
524
zsnes/src/cpu/irq.asm
Normal file
@@ -0,0 +1,524 @@
|
||||
;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.
|
||||
|
||||
%include "macros.mac"
|
||||
|
||||
EXTSYM flagnz,flago,flagc
|
||||
EXTSYM SfxSCMR,curnmi,execloop,initaddrl,nmiv,snesmap2
|
||||
EXTSYM snesmmap,stackand,stackor,wramdata
|
||||
EXTSYM xe,xirqb,xpb,xpc,xs
|
||||
EXTSYM irqon,irqv
|
||||
EXTSYM irqv8
|
||||
EXTSYM execloopdeb
|
||||
EXTSYM nmiv8
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; NMI Hardware 00FFFA,B 00FFEA,B 3 -> 000108
|
||||
; RES Hardware 00FFFC.D 00FFFC,D 1
|
||||
; BRK Software 00FFFE,F 00FFE6,7 N/A
|
||||
; IRQ Hardware 00FFFE,F 00FFEE,F 4 -> 00010C
|
||||
|
||||
|
||||
%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
|
||||
|
||||
;*******************************************************
|
||||
; SwitchToNMI/VIRQ Calls NMI/VIRQ
|
||||
;*******************************************************
|
||||
NEWSYM switchtonmi
|
||||
mov byte[curnmi],1
|
||||
test byte[xe],1
|
||||
jne near NMIemulmode
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
mov [xpc],bx
|
||||
|
||||
xor ebx,ebx
|
||||
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,[nmiv]
|
||||
test byte[SfxSCMR],10h
|
||||
jz .nosfxnmi
|
||||
; mov ax,0108h
|
||||
.nosfxnmi
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
|
||||
NEWSYM NMIemulmode
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
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,[nmiv8]
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
|
||||
NEWSYM switchtovirq
|
||||
mov byte[irqon],80h
|
||||
test byte[xe],1
|
||||
jne near IRQemulmode
|
||||
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
mov [xpc],bx
|
||||
|
||||
xor ebx,ebx
|
||||
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,[irqv]
|
||||
; test byte[SfxSCMR],10h
|
||||
; jz .nosfxnmi
|
||||
; mov ax,010Ch
|
||||
;.nosfxnmi
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
|
||||
NEWSYM switchtovirqret
|
||||
mov byte[irqon],80h
|
||||
test byte[xe],1
|
||||
jne near IRQemulmode
|
||||
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
mov [xpc],bx
|
||||
|
||||
xor ebx,ebx
|
||||
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,[irqv]
|
||||
; test byte[SfxSCMR],10h
|
||||
; jz .nosfxnmi
|
||||
; mov ax,010Ch
|
||||
;.nosfxnmi
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
ret
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
ret
|
||||
|
||||
NEWSYM IRQemulmode
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
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,[irqv8]
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloop
|
||||
|
||||
|
||||
NEWSYM switchtovirqdeb
|
||||
mov byte[irqon],80h
|
||||
test byte[xe],1
|
||||
jne near IRQemulmodedeb
|
||||
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
mov [xpc],bx
|
||||
|
||||
xor ebx,ebx
|
||||
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,[irqv]
|
||||
; test byte[SfxSCMR],10h
|
||||
; jz .nosfxnmi
|
||||
; mov ax,010Ch
|
||||
;.nosfxnmi
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
|
||||
NEWSYM IRQemulmodedeb
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
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,[irqv8]
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
|
||||
NEWSYM switchtonmideb
|
||||
mov byte[curnmi],1
|
||||
test byte[xe],1
|
||||
jne near NMIemulmodedeb
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
mov [xpc],bx
|
||||
|
||||
xor ebx,ebx
|
||||
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,[nmiv]
|
||||
test byte[SfxSCMR],10h
|
||||
jz .nosfxnmi
|
||||
; mov ax,0108h
|
||||
.nosfxnmi
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
|
||||
NEWSYM NMIemulmodedeb
|
||||
mov ebx,esi
|
||||
sub ebx,[initaddrl]
|
||||
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,[nmiv8]
|
||||
mov [xpc],ax
|
||||
and dl,11110011b
|
||||
or dl,00000100b
|
||||
test ax,8000h
|
||||
jz .loweraddr
|
||||
mov esi,[snesmmap+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
.loweraddr
|
||||
mov esi,[snesmap2+ebx*4]
|
||||
mov [initaddrl],esi
|
||||
add esi,eax
|
||||
jmp execloopdeb
|
||||
|
||||
|
||||
Reference in New Issue
Block a user