spcdef.inc
bazz1tv_mac-zsnes-1_36/src/cpu/spcdef.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.








; move al at address ebx

; branch instructions
%macro spcbrancher 0
      inc ebp
      ret
.branch
      movsx ebx,byte [ebp]
      inc ebp
      add ebp,ebx
      ret
%endmacro      

; tcall instruction
%macro spctcall 1
      mov ebx,ebp
      sub ebx,spcRam
      mov eax,[spcS]
      mov [spcRam+eax],bh
      dec byte [spcS]
      mov eax,[spcS]
      mov [spcRam+eax],bl
      dec byte [spcS]
      mov bx,[spcextraram+%1]
      test byte[spcRam+0F1h],80h
      jnz %%finished
      mov bx,[spcRam+0FFC0h+%1]
%%finished
      add ebx,spcRam
      mov ebp,ebx
      ret
%endmacro

; SET1 instruction
%macro set1 1
      mov bl,[ebp]
      add ebx,[spcRamDP]
      inc ebp
      push ebx
      ReadByte
      pop ebx
      or al,%1
      WriteByte
      ret
%endmacro

; CLR1 instruction
%macro clr1 1
      mov bl,[ebp]
      add ebx,[spcRamDP]
      inc ebp
      push ebx
      ReadByte
      pop ebx
      and al,%1
      WriteByte
      ret
%endmacro

; BBS instruction
%macro bbs 1
      mov bl,[ebp]
      add ebx,[spcRamDP]
      ReadByte
      test al,%1
      jnz .dp0jump
      add ebp,2
      ret
.dp0jump
      movsx ebx,byte [ebp+1]
      add ebp,ebx
      add ebp,2
      ret
%endmacro

; BBC instruction
%macro bbc 1
      mov bl,[ebp]
      add ebx,[spcRamDP]
      ReadByte
      test al,%1
      jz .dp0jump
      add ebp,2
      ret
.dp0jump
      movsx ebx,byte [ebp+1]
      add ebp,ebx
      add ebp,2
      ret
%endmacro

; OR A, instruction
%macro SPC_OR_A 0
      or byte [spcA], al
      mov al,[spcA]
      mov [spcNZ],al
      ret
%endmacro

; AND A, instruction
%macro SPC_AND_A 0
      and byte [spcA], al
      mov al,[spcA]
      mov [spcNZ],al
      ret
%endmacro

; EOR A, instruction
%macro SPC_EOR_A 0
      xor byte [spcA], al
      mov al,[spcA]
      mov [spcNZ],al
      ret
%endmacro

; CMP A, instruction
%macro SPC_CMP_A 0
      cmp byte [spcA], al
      cmc
      SPCSetFlagnzc
%endmacro

%macro SPC_ADC_A 0
      mov cl,[spcP]
      shr cl,1
      adc byte [spcA], al
      SPCSetFlagnvhzc
%endmacro

%macro SPC_SBC_A 0
      mov cl,[spcP]
      xor cl,1
      shr cl,1
      sbb byte [spcA], al
      cmc
      SPCSetFlagnvhzc
%endmacro

%macro SPC_MOV_A 0
      mov byte [spcA], al
      mov [spcNZ],al
      ret
%endmacro
