835 lines
17 KiB
Plaintext
835 lines
17 KiB
Plaintext
;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 FETCHPIPE 0
|
||
; mov edx,[SfxPBR]
|
||
; mov edx,[SfxMemTable+edx*4]
|
||
; mov edx,[SfxCPB]
|
||
; mov edx,[SfxR15]
|
||
mov cl,[ebp]
|
||
%endmacro
|
||
|
||
%macro UpdateR14 0
|
||
; mov edx,[SfxROMBR]
|
||
; mov edx,[SfxMemTable+edx*4]
|
||
mov eax,[SfxCROM]
|
||
; and dword[SfxR14],0FFFFh
|
||
add eax,[SfxR14]
|
||
mov [SfxRomBuffer],eax
|
||
%endmacro
|
||
|
||
%macro UpdateR15 0
|
||
mov ebp,[SfxCPB]
|
||
add ebp,[SfxR15]
|
||
%endmacro
|
||
|
||
%macro CLRFLAGS 0
|
||
;and dword [SfxSFR],0FFFFh-0100h-0200h-1000h ; Clear ALT1,ALT2 and B Flags
|
||
; xor ch,ch
|
||
; mov dword [SfxB],0 ; Clear B Flag
|
||
; mov esi,SfxR0
|
||
; mov edi,SfxR0
|
||
%endmacro
|
||
|
||
%macro TORN 1 ; V
|
||
FETCHPIPE
|
||
mov edi, SfxR0+%1*4
|
||
inc ebp ; Increase program counter
|
||
call [FxTable+ecx*4]
|
||
mov edi,SfxR0
|
||
ret
|
||
%endmacro
|
||
|
||
%macro WITH 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro STWRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro STBRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro LDWRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro LDBRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
; test byte[SfxPOR],01h
|
||
; jnz .nozerocheck
|
||
; test byte[SfxPOR],02h
|
||
; jz .nodither
|
||
|
||
; **** Can pre-calculate [SfxSCBR] << 10 + [sfxramdata]
|
||
; Pre-calculate fxbit values from color register
|
||
|
||
%macro drawpix4b 0
|
||
and [eax],edx
|
||
and [eax+16],edx
|
||
xor edx,0FFFFFFFFh
|
||
mov ebx,[fxbit01pcal]
|
||
and ebx,edx
|
||
or [eax], ebx
|
||
and edx,[fxbit23pcal]
|
||
or [eax+16], edx
|
||
%endmacro
|
||
|
||
%macro drawpix4bd 0
|
||
and [eax],edx
|
||
and [eax+16],edx
|
||
xor edx,0FFFFFFFFh
|
||
mov ebx,[fxbit45pcal]
|
||
and ebx,edx
|
||
or [eax], ebx
|
||
and edx,[fxbit67pcal]
|
||
or [eax+16], edx
|
||
%endmacro
|
||
|
||
%macro drawpix2b 0
|
||
and [eax],edx
|
||
xor edx,0FFFFFFFFh
|
||
and edx,[fxbit01pcal]
|
||
or [eax], edx
|
||
%endmacro
|
||
|
||
%macro drawpix2bd 0
|
||
and [eax],edx
|
||
xor edx,0FFFFFFFFh
|
||
and edx,[fxbit45pcal]
|
||
or [eax], edx
|
||
%endmacro
|
||
|
||
%macro drawpix8b 0
|
||
and [eax],edx
|
||
and [eax+16],edx
|
||
and [eax+32],edx
|
||
and [eax+48],edx
|
||
xor edx,0FFFFFFFFh
|
||
mov ebx,[fxbit01pcal]
|
||
and ebx,edx
|
||
or [eax], ebx
|
||
mov ebx,[fxbit23pcal]
|
||
and ebx,edx
|
||
or [eax+16], ebx
|
||
mov ebx,[fxbit45pcal]
|
||
and ebx,edx
|
||
or [eax+32], ebx
|
||
and edx,[fxbit67pcal]
|
||
or [eax+48], edx
|
||
%endmacro
|
||
|
||
%macro drawpix8bd 0
|
||
and [eax],edx
|
||
and [eax+16],edx
|
||
and [eax+32],edx
|
||
and [eax+48],edx
|
||
xor edx,0FFFFFFFFh
|
||
mov ebx,[fxbit45pcal]
|
||
and ebx,edx
|
||
or [eax], ebx
|
||
mov ebx,[fxbit67pcal]
|
||
and ebx,edx
|
||
or [eax+16], ebx
|
||
mov ebx,[fxbit01pcal]
|
||
and ebx,edx
|
||
or [eax+32], ebx
|
||
and edx,[fxbit23pcal]
|
||
or [eax+48], edx
|
||
%endmacro
|
||
|
||
%macro plotb 5
|
||
shl eax,%3
|
||
and ebx,07h
|
||
add ebx,ebx
|
||
add eax,ebx
|
||
add eax,[SCBRrel]
|
||
mov bl,[SfxR1]
|
||
mov edx,[fxxand+ebx*4]
|
||
%2
|
||
%endmacro
|
||
|
||
%macro plotbz 5
|
||
shl eax,%3
|
||
and ebx,07h
|
||
add ebx,ebx
|
||
add eax,ebx
|
||
add eax,[SCBRrel]
|
||
mov bl,[SfxR1]
|
||
mov edx,[fxxand+ebx*4]
|
||
test byte[SfxCOLR],%5
|
||
jz .nodraw
|
||
%2
|
||
%endmacro
|
||
|
||
%macro plotbd 5
|
||
shl eax,%3
|
||
and ebx,07h
|
||
add ebx,ebx
|
||
add eax,ebx
|
||
add eax,[SCBRrel]
|
||
mov bl,[SfxR1]
|
||
mov edx,[fxxand+ebx*4]
|
||
mov bl,[SfxR1]
|
||
xor bl,[SfxR2]
|
||
test bl,01h
|
||
jz near .nodither4b
|
||
%4
|
||
inc word [SfxR1]
|
||
%1
|
||
.nodither4b
|
||
%2
|
||
%endmacro
|
||
|
||
%macro plotbzd 5
|
||
shl eax,%3
|
||
and ebx,07h
|
||
add ebx,ebx
|
||
add eax,ebx
|
||
add eax,[SCBRrel]
|
||
mov bl,[SfxR1]
|
||
mov edx,[fxxand+ebx*4]
|
||
test byte[SfxCOLR],%5
|
||
jz near .nodraw
|
||
mov bl,[SfxR1]
|
||
xor bl,[SfxR2]
|
||
test bl,01h
|
||
jz .nodither4b
|
||
%4
|
||
inc word [SfxR1]
|
||
%1
|
||
.nodither4b
|
||
%2
|
||
%endmacro
|
||
|
||
%macro plotlines4b 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 ret, drawpix4b, 5, drawpix4bd, 0Fh
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
ret
|
||
%endmacro
|
||
|
||
%macro plotlines4bb 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 FXReturn, drawpix4b, 5, drawpix4bd, 0Fh
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
FXReturn
|
||
%endmacro
|
||
|
||
%macro plotlines2b 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 ret, drawpix2b, 4, drawpix2bd, 03h
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
ret
|
||
%endmacro
|
||
|
||
%macro plotlines2bb 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 FXReturn, drawpix2b, 4, drawpix2bd, 03h
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
FXReturn
|
||
%endmacro
|
||
|
||
%macro plotlines8b 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 ret, drawpix8b, 6, drawpix8bd, 0FFh
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
ret
|
||
%endmacro
|
||
|
||
%macro plotlines8bb 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 FXReturn, drawpix8b, 6, drawpix8bd, 0FFh
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
FXReturn
|
||
%endmacro
|
||
|
||
%macro plotlines8bl 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 ret, drawpix8b, 6, drawpix8bd, 0Fh
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
ret
|
||
%endmacro
|
||
|
||
%macro plotlines8bbl 1
|
||
mov ebx,[SfxR2]
|
||
FETCHPIPE
|
||
mov bh,[SfxR1]
|
||
mov eax,[sfxclineloc]
|
||
inc ebp
|
||
mov eax,[eax+ebx*4]
|
||
cmp eax,0FFFFFFFFh
|
||
je near .nodraw
|
||
%1 FXReturn, drawpix8b, 6, drawpix8bd, 0Fh
|
||
.nodraw
|
||
inc word [SfxR1]
|
||
FXReturn
|
||
%endmacro
|
||
|
||
%macro ADDRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro ADCRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro ADIRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro ADCIRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro SUBRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro SBCRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro SUBIRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro CMPRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro ANDRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro BICRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro ANDIRN 1 ; V
|
||
mov eax,[esi] ; Read Source
|
||
FETCHPIPE
|
||
and eax,%1
|
||
inc ebp
|
||
mov dword [SfxSignZero],eax
|
||
mov [edi],eax ; Write Destination
|
||
CLRFLAGS
|
||
ret
|
||
%endmacro
|
||
|
||
%macro BICIRN 1 ; V
|
||
mov eax,[esi] ; Read Source
|
||
FETCHPIPE
|
||
and eax,%1
|
||
inc ebp
|
||
mov dword [SfxSignZero],eax
|
||
mov [edi],eax ; Write Destination
|
||
CLRFLAGS
|
||
ret
|
||
%endmacro
|
||
|
||
%macro MULTRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro UMULTRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro MULTIRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro UMULTIRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro LINK 1 ; Verified.
|
||
mov eax,ebp
|
||
sub eax,[SfxCPB]
|
||
add eax,%1
|
||
FETCHPIPE
|
||
mov word [SfxR11],ax
|
||
CLRFLAGS
|
||
inc ebp
|
||
ret
|
||
%endmacro
|
||
|
||
%macro JMPRN 1 ; V
|
||
FETCHPIPE
|
||
mov eax,[SfxR0+%1*4] ; Read RN
|
||
mov ebp,[SfxCPB]
|
||
add ebp,eax
|
||
CLRFLAGS
|
||
ret
|
||
%endmacro
|
||
|
||
%macro LJMPRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro IBTRN 1 ; V
|
||
movsx eax,byte[ebp]
|
||
mov cl,[ebp+1]
|
||
add ebp,2
|
||
mov [SfxR0+%1*4],ax
|
||
CLRFLAGS
|
||
ret
|
||
%endmacro
|
||
|
||
%macro LMSRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro SMSRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro FROMRN 1 ; V
|
||
FETCHPIPE
|
||
mov esi,SfxR0+%1*4
|
||
inc ebp ; Increase program counter
|
||
call [FxTable+ecx*4]
|
||
mov esi,SfxR0
|
||
ret
|
||
%endmacro
|
||
|
||
%macro ORRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro XORRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro ORI 1 ; V
|
||
mov eax,[esi] ; Read Source
|
||
FETCHPIPE
|
||
or eax,%1
|
||
inc ebp
|
||
mov [edi],eax ; Write DREG
|
||
mov [SfxSignZero],eax
|
||
CLRFLAGS
|
||
ret
|
||
%endmacro
|
||
|
||
%macro XORI 1 ; V
|
||
mov eax,[esi] ; Read Source
|
||
FETCHPIPE
|
||
xor eax,%1
|
||
inc ebp
|
||
mov [edi],eax ; Write DREG
|
||
mov [SfxSignZero],eax
|
||
CLRFLAGS
|
||
ret
|
||
%endmacro
|
||
|
||
%macro INCRN 1 ; Verified
|
||
inc word[SfxR0+%1*4]
|
||
FETCHPIPE
|
||
mov eax,[SfxR0+%1*4] ; Read Source
|
||
mov [SfxSignZero],eax
|
||
CLRFLAGS
|
||
inc ebp
|
||
ret
|
||
%endmacro
|
||
|
||
%macro DECRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro IWTRN 1 ; aka LEA ; Verified.
|
||
mov eax,[ebp]
|
||
mov cl,[ebp+2]
|
||
and eax,0FFFFh
|
||
add ebp,3
|
||
mov [SfxR0+%1*4],eax
|
||
CLRFLAGS
|
||
ret
|
||
%endmacro
|
||
|
||
%macro LMRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro SMRN 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
|
||
ret
|
||
%endmacro
|
||
|
||
%macro PackEsiEdi 0
|
||
mov eax,[SfxSREG]
|
||
shl eax,2
|
||
add eax,SfxR0
|
||
mov esi,eax
|
||
mov eax,[SfxDREG]
|
||
shl eax,2
|
||
add eax,SfxR0
|
||
mov edi,eax
|
||
mov eax,[SfxRAMBR]
|
||
shl eax,16
|
||
add eax,[sfxramdata]
|
||
mov dword [SfxRAMMem],eax
|
||
%endmacro
|
||
|
||
%macro UnPackEsiEdi 0
|
||
mov eax,esi
|
||
sub eax,SfxR0
|
||
shr eax,2
|
||
mov [SfxSREG],eax
|
||
mov eax,edi
|
||
sub eax,SfxR0
|
||
shr eax,2
|
||
mov [SfxDREG],eax
|
||
%endmacro
|
||
|