835 lines
16 KiB
Plaintext
835 lines
16 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
|