⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irq.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
字号:
;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.%include "macros.mac"EXTSYM flagnz,flago,flagc,SfxSCMR,curnmi,execloop,initaddrl,nmiv,snesmap2EXTSYM snesmmap,stackand,stackor,xe,xirqb,xpb,xpc,xs,irqon,irqv,irqv8EXTSYM execloopdeb,nmiv8,membank0w8;        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%endmacroSECTION .text;*******************************************************; SwitchToNMI/VIRQ                        Calls NMI/VIRQ;*******************************************************NEWSYM switchtonmi    mov byte[curnmi],1    sub dh,100    test byte[xe],1    jne near NMIemulmode    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    xor ebx,ebx    mov cx,[xs]    mov al,[xpb]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov bl,[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 execloopNEWSYM NMIemulmode    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov [xpb],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 execloopNEWSYM switchtovirq    mov byte[irqon],80h    sub dh,3    test byte[xe],1    jne near IRQemulmode    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpb]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov bl,[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 execloopNEWSYM switchtovirqret    mov byte[irqon],80h    test byte[xe],1    jne near IRQemulmode    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpb]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov bl,[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    retNEWSYM IRQemulmode    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov [xpb],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 execloopNEWSYM switchtovirqdeb    mov byte[irqon],80h    test byte[xe],1    jne near IRQemulmodedeb    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpb]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov bl,[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 execloopdebNEWSYM IRQemulmodedeb    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov [xpb],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 execloopdebNEWSYM switchtonmideb    mov byte[curnmi],1    test byte[xe],1    jne near NMIemulmodedeb    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpb]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov bl,[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 execloopdebNEWSYM NMIemulmodedeb    mov ebx,esi    sub ebx,[initaddrl]    mov [xpc],bx    mov cx,[xs]    mov al,[xpc+1]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov al,[xpc]    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    makedl    mov al,dl    call membank0w8    dec cx    and cx,word[stackand]    or cx,word[stackor]    mov [xs],cx    xor bh,bh    mov [xpb],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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -