www.pudn.com > zsnes117b-src.zip > fxemu2c.mac


;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. 
 
 
 
 
 
 
 
 
 
%macro FXReturn 0 
   dec dword [NumberOfOpcodes] 
   jmp [FxTabled+ecx*4] 
   ALIGN32 
%endmacro 
 
%macro FXReturn2 0 
   dec dword [NumberOfOpcodes] 
   js %%endloop 
   jmp [FxTabled+ecx*4] 
%%endloop 
   jmp FXEndLoop 
;   jmp [FxTabled+ecx*4] 
   ALIGN32 
%endmacro 
 
%macro TORNd 1   ; V 
   FETCHPIPE 
   mov edi, SfxR0+%1*4 
   inc ebp                ; Increase program counter 
   call [FxTable+ecx*4] 
   mov edi,SfxR0 
   FXReturn 
%endmacro 
 
%macro WITHc 1  ; Verified. 
   FETCHPIPE 
   mov esi,SfxR0+%1*4 
   mov edi,SfxR0+%1*4 
   mov dword [SfxB],1 
   inc ebp                ; Increase program counter 
   call [FxTablec+ecx*4] 
   mov esi,SfxR0 
   mov edi,SfxR0 
   mov dword [SfxB],0         ; Clear B Flag 
   FXReturn 
%endmacro 
 
%macro STWRNc 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   mov ebx,[SfxRAMMem] 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   add dword [SfxLastRamAdr],ebx    ; Save last ram address 
   mov edx,[esi]            ; Read Source 
   FETCHPIPE 
   mov [ebx+eax],dl         ; Store Word 
   xor eax,1 
   inc ebp                ; Increase program counter 
   mov [ebx+eax],dh         ; Store Word 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro STBRNc 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   FETCHPIPE 
   add eax,[SfxRAMMem] 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   mov ebx,[esi]            ; Read Source 
   mov byte [eax],bl         ; Store Byte 
   CLRFLAGS 
   inc ebp                ; Increase program counter 
   FXReturn 
%endmacro 
 
%macro LDWRNc 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   mov ebx,[SfxRAMMem] 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   FETCHPIPE 
   mov dl,[ebx+eax]         ; Store Word 
   add dword [SfxLastRamAdr],ebx    ; Save last ram address 
   xor eax,1 
   and edx,0FFFFh 
   inc ebp                ; Increase program counter 
   mov dh,[ebx+eax]         ; Store Word 
   mov [edi],edx            ; Read Source 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro LDBRNc 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   FETCHPIPE 
   add eax,[SfxRAMMem] 
   xor ebx,ebx 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   mov bl,[eax]                     ; Read Byte 
   inc ebp                ; Increase program counter 
   mov [edi],ebx            ; Store Result 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro ADDRNc 1  ; V 
   mov eax, [esi]    ; Read Source 
   mov ebx, [SfxR0+%1*4] 
   FETCHPIPE 
   add ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro ADCRNc 1  ; V 
   FETCHPIPE 
   mov eax, [esi]    ; Read Source 
   mov ebx, [SfxR0+%1*4] 
   shr byte[SfxCarry],1 
   adc ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro ADIRNc 1  ; V 
   mov eax, [esi]    ; Read Source 
   FETCHPIPE 
   add ax,%1 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro ADCIRNc 1 ; V 
   FETCHPIPE 
   mov eax, [esi]    ; Read Source 
   shr byte[SfxCarry],1 
   adc ax,%1 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro SUBRNc 1  ; V 
   mov eax,[esi]    ; Read Source 
   mov ebx,[SfxR0+%1*4] 
   FETCHPIPE 
   sub ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   inc ebp                   ; Increase program counter 
   mov [edi],eax                        ; Write Destination 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro SBCRNc 1  ; V 
   FETCHPIPE 
   mov eax,[esi]    ; Read Source 
   mov ebx,[SfxR0+%1*4] 
   cmp byte[SfxCarry],1 
   sbb ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro SUBIRNc 1 ; V 
   mov eax,[esi]    ; Read Source 
   FETCHPIPE 
   sub ax,%1 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro CMPRNc 1  ; V 
   mov eax,[esi]    ; Read Source 
   mov ebx,[SfxR0+%1*4] 
   FETCHPIPE 
   sub ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   inc ebp                ; Increase program counter 
   FXReturn 
%endmacro 
 
%macro ANDRNc 1  ; V 
   mov eax,[esi]            ; Read Source 
   mov ebx,[SfxR0+%1*4]             ; Read RN 
   FETCHPIPE 
   and eax,ebx 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro BICRNc 1  ; V 
   mov ebx,[SfxR0+%1*4]             ; Read RN 
   mov eax,[esi]            ; Read Source 
   xor ebx,0FFFFh 
   FETCHPIPE 
   and eax,ebx 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro ANDIRNc 1 ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   and eax,%1 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro BICIRNc 1 ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   and eax,%1 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro MULTRNc 1 ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,byte [SfxR0+%1*4]      ; Read RN 
   FETCHPIPE 
   imul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro UMULTRNc 1        ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,byte [SfxR0+%1*4]      ; Read RN 
   FETCHPIPE 
   mul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro MULTIRNc 1        ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,%1                  ; Read RN 
   FETCHPIPE 
   imul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro UMULTIRNc 1       ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,%1                  ; Read RN 
   FETCHPIPE 
   mul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro LINKc 1   ; Verified. 
   mov eax,ebp 
   sub eax,[SfxCPB] 
   add eax,%1 
   FETCHPIPE 
   mov word [SfxR11],ax 
   CLRFLAGS 
   inc ebp 
   FXReturn 
%endmacro 
 
%macro JMPRNc 1  ; V 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4]             ; Read RN 
   mov ebp,[SfxCPB] 
   add ebp,eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro LJMPRNc 1 ; V 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4] 
   and eax,07Fh 
   mov byte[SfxPBR],al 
;   mov byte[fxtrace+eax],1 
   mov eax,[SfxMemTable+eax*4] 
   mov [SfxCPB],eax 
   mov ebp,eax 
   add ebp,[esi]             ; Read RN 
   mov dword [SfxCacheActive],0 
   push ecx 
   call FxOp02 
   pop ecx 
   dec ebp 
   FXReturn 
%endmacro 
 
%macro IBTRNc 1  ; V 
   movsx eax,byte[ebp] 
   mov cl,[ebp+1] 
   add ebp,2 
   mov [SfxR0+%1*4],ax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro LMSRNc 1  ; Verified. 
   xor eax,eax 
   mov al,[ebp] 
   add eax,eax 
   inc ebp 
   add eax,[SfxRAMMem] 
   mov cl,[ebp] 
   mov dword [SfxLastRamAdr],eax 
   mov ebx,[eax]              ; Read word from ram 
   inc ebp 
   mov [SfxR0+%1*4],bx              ; Write data 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro SMSRNc 1  ; Verified. 
   xor eax,eax 
   mov al,[ebp] 
   inc ebp 
   add eax,eax 
   mov cl,[ebp] 
   add eax,[SfxRAMMem] 
   mov ebx,[SfxR0+%1*4]              ; Read data 
   mov dword [SfxLastRamAdr],eax 
   inc ebp 
   mov [eax],bx              ; Write word to ram 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro FROMRNd 1 ; V 
   FETCHPIPE 
   mov esi,SfxR0+%1*4 
   inc ebp                ; Increase program counter 
   call [FxTable+ecx*4] 
   mov esi,SfxR0 
   FXReturn 
%endmacro 
 
%macro ORRNc 1   ; V 
   mov eax,[esi]            ; Read Source 
   mov ebx,[SfxR0+%1*4]             ; Read 
   FETCHPIPE 
   or eax,ebx 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro XORRNc 1  ; V 
   mov eax,[esi]            ; Read Source 
   mov ebx,[SfxR0+%1*4]             ; Read 
   FETCHPIPE 
   xor eax,ebx 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro ORIc 1    ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   or eax,%1 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro XORIc 1   ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   xor eax,%1 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro INCRNc 1  ; Verified 
   inc word[SfxR0+%1*4] 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4]            ; Read Source 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   inc ebp 
   FXReturn 
%endmacro 
 
%macro DECRNc 1  ; Verified 
   dec word[SfxR0+%1*4] 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4]            ; Read Source 
   mov [SfxR0+%1*4],eax 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   inc ebp 
   FXReturn 
%endmacro 
 
%macro IWTRNc 1  ; aka LEA       ; Verified. 
   mov eax,[ebp] 
   mov cl,[ebp+2] 
   and eax,0FFFFh 
   add ebp,3 
   mov [SfxR0+%1*4],eax 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro LMRNc 1   ; Verified! 
   xor eax,eax 
   mov cl,[ebp+2] 
   mov ax,[ebp] 
   mov ebx,[SfxRAMMem] 
   mov [SfxLastRamAdr],eax 
   add [SfxLastRamAdr],ebx 
   mov dl,[eax+ebx] 
   xor eax,1 
   add ebp,3 
   mov dh,[eax+ebx] 
   mov word [SfxR0+%1*4],dx         ; Store Word 
   CLRFLAGS 
   FXReturn 
%endmacro 
 
%macro SMRNc 1   ; Verified 
   mov ebx,[SfxR0+%1*4] 
   mov eax,[ebp] 
   mov cl,[ebp+2] 
   and eax,0FFFFh 
   mov dx,bx 
   mov ebx,[SfxRAMMem] 
   mov [SfxLastRamAdr],eax 
   add [SfxLastRamAdr],ebx 
   mov [eax+ebx],dl 
   xor eax,1 
   add ebp,3 
   mov [eax+ebx],dh 
   CLRFLAGS 
   FXReturn 
%endmacro