www.pudn.com > zsnes117b-src.zip > irq.asm


;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