2558 lines
69 KiB
NASM
2558 lines
69 KiB
NASM
;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.
|
|
|
|
%include "macros.mac"
|
|
|
|
EXTSYM FXEndLoop,FlushCache,FxOp02,FxTable,FxTableb,FxTablec,FxTabled
|
|
EXTSYM NumberOfOpcodes,SfxB,SfxCBR,SfxCFGR,SfxCOLR,SfxCPB,SfxCROM
|
|
EXTSYM SfxCacheActive,SfxCarry,SfxLastRamAdr,SfxMemTable,SfxOverflow
|
|
EXTSYM SfxPBR,SfxPIPE,SfxPOR,SfxR0,SfxR1,SfxR11,SfxR12,SfxR13,SfxR14
|
|
EXTSYM SfxR15,SfxR2,SfxR4,SfxR6,SfxR7,SfxR8,SfxRAMBR,SfxRAMMem,SfxROMBR
|
|
EXTSYM SfxRomBuffer,SfxSCBR,SfxSCMR,SfxSFR,SfxSignZero,SfxnRamBanks,flagnz
|
|
EXTSYM sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc,sfxramdata
|
|
EXTSYM withr15sk,sfxclineloc,SCBRrel,ChangeOps
|
|
EXTSYM fxbit01pcal,fxbit23pcal,fxbit45pcal,fxbit67pcal
|
|
EXTSYM fxbit01,fxbit23,fxbit45,fxbit67
|
|
EXTSYM fxxand
|
|
EXTSYM PLOTJmpa,PLOTJmpb
|
|
|
|
NEWSYM FxEmu2CAsmStart
|
|
|
|
%include "fxemu2.mac"
|
|
%include "fxemu2b.mac"
|
|
%include "fxemu2c.mac"
|
|
|
|
|
|
|
|
|
|
SECTION .text ;ALIGN=32
|
|
|
|
ALIGN32
|
|
NEWSYM FxOpd00 ; STOP stop GSU execution (and maybe generate an IRQ) ; Verified.
|
|
FETCHPIPE
|
|
mov [SfxPIPE],cl
|
|
and dword [SfxSFR],0FFFFh-32 ; Clear Go flag (set to 1 when the GSU is running)
|
|
test dword [SfxCFGR],080h ; Check if the interrupt generation is on
|
|
jnz .NoIRQ
|
|
or dword [SfxSFR],08000h ; Set IRQ Flag
|
|
.NoIRQ
|
|
CLRFLAGS
|
|
inc ebp
|
|
mov eax,[NumberOfOpcodes]
|
|
add eax,0F0000000h
|
|
add [ChangeOps],eax
|
|
mov dword [NumberOfOpcodes],1
|
|
jmp FXEndLoop
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd01 ; NOP no operation ; Verified.
|
|
FETCHPIPE
|
|
CLRFLAGS
|
|
inc ebp ; Increase program counter
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd02 ; CACHE reintialize GSU cache
|
|
mov eax,ebp
|
|
FETCHPIPE
|
|
sub eax,[SfxCPB]
|
|
and eax,0FFF0h
|
|
cmp dword [SfxCBR],eax
|
|
je .SkipUpdate
|
|
cmp byte [SfxCacheActive],1
|
|
je .SkipUpdate
|
|
mov dword [SfxCBR],eax
|
|
mov dword [SfxCacheActive],1
|
|
call FlushCache
|
|
.SkipUpdate
|
|
CLRFLAGS
|
|
inc ebp ; Increase program counter
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd03 ; LSR logic shift right ; Verified.
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
mov [SfxCarry],al
|
|
and byte[SfxCarry],1
|
|
shr ax,1 ; logic shift right
|
|
inc ebp ; Increase program counter
|
|
mov [edi],eax ; Write Destination
|
|
mov dword [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd04 ; ROL rotate left (RCL?) ; V
|
|
shr byte[SfxCarry],1
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
rcl ax,1
|
|
rcl byte[SfxCarry],1
|
|
inc ebp ; Increase program counter
|
|
mov [edi],eax ; Write Destination
|
|
mov [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd05 ; BRA branch always ; Verified.
|
|
movsx eax,byte[ebp]
|
|
mov cl,[ebp+1]
|
|
inc ebp
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd06 ; BGE branch on greater or equals ; Verified.
|
|
movsx eax,byte[ebp]
|
|
mov ebx,[SfxSignZero]
|
|
shr ebx,15
|
|
inc ebp
|
|
xor bl,[SfxOverflow]
|
|
mov cl,[ebp]
|
|
test bl,01h
|
|
jnz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd07 ; BLT branch on lesss than ; Verified.
|
|
movsx eax,byte[ebp]
|
|
mov ebx,[SfxSignZero]
|
|
shr ebx,15
|
|
inc ebp
|
|
xor bl,[SfxOverflow]
|
|
mov cl,[ebp]
|
|
test bl,01h
|
|
jz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd08 ; BNE branch on not equal ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test dword[SfxSignZero],0FFFFh
|
|
mov cl,[ebp]
|
|
jz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd09 ; BEQ branch on equal (z=1) ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test dword[SfxSignZero],0FFFFh
|
|
mov cl,[ebp]
|
|
jnz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd0A ; BPL branch on plus ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test dword[SfxSignZero],088000h
|
|
mov cl,[ebp]
|
|
jnz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd0B ; BMI branch on minus ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test dword[SfxSignZero],088000h
|
|
mov cl,[ebp]
|
|
jz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd0C ; BCC branch on carry clear ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test byte[SfxCarry],01h
|
|
mov cl,[ebp]
|
|
jnz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd0D ; BCS branch on carry set ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test byte[SfxCarry],01h
|
|
mov cl,[ebp]
|
|
jz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd0E ; BVC branch on overflow clear ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test byte[SfxOverflow],01h
|
|
mov cl,[ebp]
|
|
jnz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd0F ; BVS branch on overflow set ; Verified.
|
|
movsx eax,byte[ebp]
|
|
inc ebp
|
|
test byte[SfxOverflow],01h
|
|
mov cl,[ebp]
|
|
jz .nojump
|
|
add ebp,eax
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
.nojump
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
FXReturn2
|
|
|
|
NEWSYM FxOpd10 ; TO RN set register n as destination register
|
|
TORNd 0
|
|
NEWSYM FxOpd11 ; TO RN set register n as destination register
|
|
TORNd 1
|
|
NEWSYM FxOpd12 ; TO RN set register n as destination register
|
|
TORNd 2
|
|
NEWSYM FxOpd13 ; TO RN set register n as destination register
|
|
TORNd 3
|
|
NEWSYM FxOpd14 ; TO RN set register n as destination register
|
|
TORNd 4
|
|
NEWSYM FxOpd15 ; TO RN set register n as destination register
|
|
TORNd 5
|
|
NEWSYM FxOpd16 ; TO RN set register n as destination register
|
|
TORNd 6
|
|
NEWSYM FxOpd17 ; TO RN set register n as destination register
|
|
TORNd 7
|
|
NEWSYM FxOpd18 ; TO RN set register n as destination register
|
|
TORNd 8
|
|
NEWSYM FxOpd19 ; TO RN set register n as destination register
|
|
TORNd 9
|
|
NEWSYM FxOpd1A ; TO RN set register n as destination register
|
|
TORNd 10
|
|
NEWSYM FxOpd1B ; TO RN set register n as destination register
|
|
TORNd 11
|
|
NEWSYM FxOpd1C ; TO RN set register n as destination register
|
|
TORNd 12
|
|
NEWSYM FxOpd1D ; TO RN set register n as destination register
|
|
TORNd 13
|
|
NEWSYM FxOpd1E ; TO RN set register n as destination register
|
|
FETCHPIPE
|
|
mov edi,SfxR0+14*4
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
mov edi,SfxR0
|
|
UpdateR14
|
|
FXReturn
|
|
NEWSYM FxOpd1F ; TO RN set register n as destination register
|
|
FETCHPIPE
|
|
mov edi,SfxR0+15*4
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
mov ebp,[SfxCPB]
|
|
add ebp,[SfxR15]
|
|
mov edi,SfxR0
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd20 ; WITH set register n as source and destination register
|
|
WITHc 0
|
|
NEWSYM FxOpd21 ; WITH set register n as source and destination register
|
|
WITHc 1
|
|
NEWSYM FxOpd22 ; WITH set register n as source and destination register
|
|
WITHc 2
|
|
NEWSYM FxOpd23 ; WITH set register n as source and destination register
|
|
WITHc 3
|
|
NEWSYM FxOpd24 ; WITH set register n as source and destination register
|
|
WITHc 4
|
|
NEWSYM FxOpd25 ; WITH set register n as source and destination register
|
|
WITHc 5
|
|
NEWSYM FxOpd26 ; WITH set register n as source and destination register
|
|
WITHc 6
|
|
NEWSYM FxOpd27 ; WITH set register n as source and destination register
|
|
WITHc 7
|
|
NEWSYM FxOpd28 ; WITH set register n as source and destination register
|
|
WITHc 8
|
|
NEWSYM FxOpd29 ; WITH set register n as source and destination register
|
|
WITHc 9
|
|
NEWSYM FxOpd2A ; WITH set register n as source and destination register
|
|
WITHc 10
|
|
NEWSYM FxOpd2B ; WITH set register n as source and destination register
|
|
WITHc 11
|
|
NEWSYM FxOpd2C ; WITH set register n as source and destination register
|
|
WITHc 12
|
|
NEWSYM FxOpd2D ; WITH set register n as source and destination register
|
|
WITHc 13
|
|
NEWSYM FxOpd2E ; WITH set register n as source and destination register
|
|
FETCHPIPE
|
|
mov esi,SfxR0+14*4
|
|
mov edi,SfxR0+14*4
|
|
mov dword [SfxB],1
|
|
inc ebp
|
|
call [FxTablec+ecx*4]
|
|
mov dword [SfxB],0 ; Clear B Flag
|
|
mov esi,SfxR0
|
|
mov edi,SfxR0
|
|
UpdateR14
|
|
FXReturn
|
|
NEWSYM FxOpd2F ; WITH set register n as source and destination register
|
|
FETCHPIPE
|
|
mov esi,SfxR0+15*4
|
|
mov edi,SfxR0+15*4
|
|
mov dword [SfxB],1
|
|
inc ebp
|
|
mov eax,ebp
|
|
sub eax,[SfxCPB]
|
|
mov dword[withr15sk],0
|
|
mov [SfxR15],eax
|
|
call [FxTableb+ecx*4]
|
|
cmp dword[withr15sk],1
|
|
je .skip
|
|
mov ebp,[SfxCPB]
|
|
add ebp,[SfxR15]
|
|
.skip
|
|
mov dword [SfxB],0 ; Clear B Flag
|
|
mov esi,SfxR0
|
|
mov edi,SfxR0
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd30 ; STW RN store word
|
|
STWRNc 0
|
|
NEWSYM FxOpd31 ; STW RN store word
|
|
STWRNc 1
|
|
NEWSYM FxOpd32 ; STW RN store word
|
|
STWRNc 2
|
|
NEWSYM FxOpd33 ; STW RN store word
|
|
STWRNc 3
|
|
NEWSYM FxOpd34 ; STW RN store word
|
|
STWRNc 4
|
|
NEWSYM FxOpd35 ; STW RN store word
|
|
STWRNc 5
|
|
NEWSYM FxOpd36 ; STW RN store word
|
|
STWRNc 6
|
|
NEWSYM FxOpd37 ; STW RN store word
|
|
STWRNc 7
|
|
NEWSYM FxOpd38 ; STW RN store word
|
|
STWRNc 8
|
|
NEWSYM FxOpd39 ; STW RN store word
|
|
STWRNc 9
|
|
NEWSYM FxOpd3A ; STW RN store word
|
|
STWRNc 10
|
|
NEWSYM FxOpd3B ; STW RN store word
|
|
STWRNc 11
|
|
|
|
NEWSYM FxOpd30A1 ; STB RN store byte
|
|
STBRNc 0
|
|
NEWSYM FxOpd31A1 ; STB RN store byte
|
|
STBRNc 1
|
|
NEWSYM FxOpd32A1 ; STB RN store byte
|
|
STBRNc 2
|
|
NEWSYM FxOpd33A1 ; STB RN store byte
|
|
STBRNc 3
|
|
NEWSYM FxOpd34A1 ; STB RN store byte
|
|
STBRNc 4
|
|
NEWSYM FxOpd35A1 ; STB RN store byte
|
|
STBRNc 5
|
|
NEWSYM FxOpd36A1 ; STB RN store byte
|
|
STBRNc 6
|
|
NEWSYM FxOpd37A1 ; STB RN store byte
|
|
STBRNc 7
|
|
NEWSYM FxOpd38A1 ; STB RN store byte
|
|
STBRNc 8
|
|
NEWSYM FxOpd39A1 ; STB RN store byte
|
|
STBRNc 9
|
|
NEWSYM FxOpd3AA1 ; STB RN store byte
|
|
STBRNc 10
|
|
NEWSYM FxOpd3BA1 ; STB RN store byte
|
|
STBRNc 11
|
|
|
|
NEWSYM FxOpd3C ; LOOP decrement loop counter, and branch on not zero ; V
|
|
dec word [SfxR12] ; decrement loop counter
|
|
FETCHPIPE
|
|
mov eax,[SfxR12]
|
|
mov [SfxSignZero],eax
|
|
or eax,eax
|
|
jz .NoBranch
|
|
mov eax,dword [SfxR13]
|
|
mov ebp,[SfxCPB]
|
|
add ebp,eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
.NoBranch
|
|
inc ebp
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd3D ; ALT1 set alt1 mode ; Verified.
|
|
FETCHPIPE
|
|
mov dword [SfxB],0
|
|
or ch,01h
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
xor ch,ch
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd3E ; ALT2 set alt1 mode ; Verified.
|
|
FETCHPIPE
|
|
mov dword [SfxB],0
|
|
or ch,02h
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
xor ch,ch
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd3F ; ALT3 set alt3 mode ; Verified.
|
|
FETCHPIPE
|
|
mov dword [SfxB],0
|
|
or ch,03h
|
|
inc ebp
|
|
call [FxTable+ecx*4]
|
|
xor ch,ch
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd40 ; LDW RN load word from RAM
|
|
LDWRNc 0
|
|
NEWSYM FxOpd41 ; LDW RN load word from RAM
|
|
LDWRNc 1
|
|
NEWSYM FxOpd42 ; LDW RN load word from RAM
|
|
LDWRNc 2
|
|
NEWSYM FxOpd43 ; LDW RN load word from RAM
|
|
LDWRNc 3
|
|
NEWSYM FxOpd44 ; LDW RN load word from RAM
|
|
LDWRNc 4
|
|
NEWSYM FxOpd45 ; LDW RN load word from RAM
|
|
LDWRNc 5
|
|
NEWSYM FxOpd46 ; LDW RN load word from RAM
|
|
LDWRNc 6
|
|
NEWSYM FxOpd47 ; LDW RN load word from RAM
|
|
LDWRNc 7
|
|
NEWSYM FxOpd48 ; LDW RN load word from RAM
|
|
LDWRNc 8
|
|
NEWSYM FxOpd49 ; LDW RN load word from RAM
|
|
LDWRNc 9
|
|
NEWSYM FxOpd4A ; LDW RN load word from RAM
|
|
LDWRNc 10
|
|
NEWSYM FxOpd4B ; LDW RN load word from RAM
|
|
LDWRNc 11
|
|
|
|
NEWSYM FxOpd40A1 ; LDB RN load byte from RAM
|
|
LDBRNc 0
|
|
NEWSYM FxOpd41A1 ; LDB RN load byte from RAM
|
|
LDBRNc 1
|
|
NEWSYM FxOpd42A1 ; LDB RN load byte from RAM
|
|
LDBRNc 2
|
|
NEWSYM FxOpd43A1 ; LDB RN load byte from RAM
|
|
LDBRNc 3
|
|
NEWSYM FxOpd44A1 ; LDB RN load byte from RAM
|
|
LDBRNc 4
|
|
NEWSYM FxOpd45A1 ; LDB RN load byte from RAM
|
|
LDBRNc 5
|
|
NEWSYM FxOpd46A1 ; LDB RN load byte from RAM
|
|
LDBRNc 6
|
|
NEWSYM FxOpd47A1 ; LDB RN load byte from RAM
|
|
LDBRNc 7
|
|
NEWSYM FxOpd48A1 ; LDB RN load byte from RAM
|
|
LDBRNc 8
|
|
NEWSYM FxOpd49A1 ; LDB RN load byte from RAM
|
|
LDBRNc 9
|
|
NEWSYM FxOpd4AA1 ; LDB RN load byte from RAM
|
|
LDBRNc 10
|
|
NEWSYM FxOpd4BA1 ; LDB RN load byte from RAM
|
|
LDBRNc 11
|
|
|
|
|
|
NEWSYM FxOpd4C1284b ; PLOT 4bit
|
|
plotlines4bb plotb
|
|
NEWSYM FxOpd4C1284bz ; PLOT 4bit, zero check
|
|
plotlines4bb plotbz
|
|
NEWSYM FxOpd4C1284bd ; PLOT 4bit, dither
|
|
plotlines4bb plotbd
|
|
NEWSYM FxOpd4C1284bzd ; PLOT 4bit, zero check + dither
|
|
plotlines4bb plotbzd
|
|
|
|
NEWSYM FxOpd4C1282b ; PLOT 2bit
|
|
plotlines2bb plotb
|
|
NEWSYM FxOpd4C1282bz ; PLOT 2bit, zero check
|
|
plotlines2bb plotbz
|
|
NEWSYM FxOpd4C1282bd ; PLOT 2bit, dither
|
|
plotlines2bb plotbd
|
|
NEWSYM FxOpd4C1282bzd ; PLOT 2bit, zero check + dither
|
|
plotlines2bb plotbzd
|
|
|
|
NEWSYM FxOpd4C1288b ; PLOT 8bit
|
|
plotlines8bb plotb
|
|
NEWSYM FxOpd4C1288bz ; PLOT 8bit, zero check
|
|
plotlines8bb plotbz
|
|
NEWSYM FxOpd4C1288bd ; PLOT 8bit, dither
|
|
plotlines8bb plotb
|
|
NEWSYM FxOpd4C1288bzd ; PLOT 8bit, zero check + dither
|
|
plotlines8bb plotbz
|
|
|
|
NEWSYM FxOpd4C1288bl ; PLOT 8bit
|
|
plotlines8bbl plotb
|
|
NEWSYM FxOpd4C1288bzl ; PLOT 8bit, zero check
|
|
plotlines8bbl plotbz
|
|
NEWSYM FxOpd4C1288bdl ; PLOT 8bit, dither
|
|
plotlines8bbl plotb
|
|
NEWSYM FxOpd4C1288bzdl ; PLOT 8bit, zero check + dither
|
|
plotlines8bbl plotbz
|
|
|
|
NEWSYM FxOpd4C ; PLOT plot pixel with R1,R2 as x,y and the color register as the color
|
|
jmp FxOpd4C1284b
|
|
|
|
FETCHPIPE
|
|
inc ebp
|
|
CLRFLAGS
|
|
mov ebx,[SfxR2]
|
|
mov bh,[SfxR1]
|
|
mov eax,[sfxclineloc]
|
|
mov ebx,[eax+ebx*4]
|
|
cmp ebx,0FFFFFFFFh
|
|
je near .nodraw
|
|
xor eax,eax
|
|
; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj
|
|
; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color
|
|
; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles
|
|
; 16+8(4/3) 16+4(4/2) 16(4/0)
|
|
push ecx
|
|
mov al,[SfxSCMR]
|
|
and al,00000011b ; 4 + 32
|
|
cmp al,0
|
|
je near .colors4
|
|
cmp al,3
|
|
je near .colors256
|
|
|
|
shl ebx,5 ; x32 (16 colors)
|
|
mov al,[SfxSCBR]
|
|
shl eax,10 ; Get SFX address
|
|
add eax,ebx
|
|
add eax,[sfxramdata]
|
|
mov ebx,[SfxR2]
|
|
and ebx,07h
|
|
shl ebx,1
|
|
add eax,ebx
|
|
mov cl,[SfxR1]
|
|
and cl,07h
|
|
xor cl,07h
|
|
mov bl,1
|
|
shl bl,cl
|
|
mov bh,bl
|
|
xor bh,0FFh
|
|
pop ecx
|
|
test byte[SfxPOR],01h
|
|
jnz .nozerocheck_16
|
|
test byte[SfxCOLR],0Fh
|
|
jz .nodraw
|
|
.nozerocheck_16
|
|
mov dl,[SfxCOLR]
|
|
test byte[SfxPOR],02h
|
|
jz .nodither4b
|
|
mov dh,[SfxR1]
|
|
xor dh,[SfxR2]
|
|
test dh,01h
|
|
jz .nodither4b
|
|
shr dh,4
|
|
.nodither4b
|
|
and byte[eax],bh
|
|
and byte[eax+1],bh
|
|
and byte[eax+16],bh
|
|
and byte[eax+17],bh
|
|
test dl,01h
|
|
jz .nodraw_16
|
|
or byte[eax], bl
|
|
.nodraw_16
|
|
test dl,02h
|
|
jz .nodraw2_16
|
|
or byte[eax+1], bl
|
|
.nodraw2_16
|
|
test dl,04h
|
|
jz .nodraw3_16
|
|
or byte[eax+16],bl
|
|
.nodraw3_16
|
|
test dl,08h
|
|
jz .nodraw4_16
|
|
or byte[eax+17],bl
|
|
.nodraw4_16
|
|
.nodraw
|
|
inc word [SfxR1]
|
|
FXReturn
|
|
|
|
.colors4
|
|
shl ebx,4 ; x16 (4 colors)
|
|
mov al,[SfxSCBR]
|
|
shl eax,10 ; Get SFX address
|
|
add eax,ebx
|
|
add eax,[sfxramdata]
|
|
mov ebx,[SfxR2]
|
|
and ebx,07h
|
|
shl ebx,1
|
|
add eax,ebx
|
|
mov cl,[SfxR1]
|
|
and cl,07h
|
|
xor cl,07h
|
|
mov bl,1
|
|
shl bl,cl
|
|
mov bh,bl
|
|
xor bh,0FFh
|
|
pop ecx
|
|
test byte[SfxPOR],01h
|
|
jnz .nozerocheck_4
|
|
test byte[SfxCOLR],03h
|
|
jz .noplot_4
|
|
.nozerocheck_4
|
|
mov dl,[SfxCOLR]
|
|
test byte[SfxPOR],02h
|
|
jz .nodither2b
|
|
mov dh,[SfxR1]
|
|
xor dh,[SfxR2]
|
|
test dh,01h
|
|
jz .nodither2b
|
|
shr dh,4
|
|
.nodither2b
|
|
and byte[eax],bh
|
|
and byte[eax+1],bh
|
|
test dl,01h
|
|
jz .nodraw_4
|
|
or byte[eax], bl
|
|
.nodraw_4
|
|
test dl,02h
|
|
jz .nodraw2_4
|
|
or byte[eax+1], bl
|
|
.nodraw2_4
|
|
.noplot_4
|
|
inc word [SfxR1]
|
|
FXReturn
|
|
|
|
.colors256
|
|
shl ebx,6 ; x64 (256 colors)
|
|
mov al,[SfxSCBR]
|
|
shl eax,10 ; Get SFX address
|
|
add eax,ebx
|
|
add eax,[sfxramdata]
|
|
mov ebx,[SfxR2]
|
|
and ebx,07h
|
|
shl ebx,1
|
|
add eax,ebx
|
|
mov cl,[SfxR1]
|
|
and cl,07h
|
|
xor cl,07h
|
|
mov bl,1
|
|
shl bl,cl
|
|
mov bh,bl
|
|
xor bh,0FFh
|
|
pop ecx
|
|
test byte[SfxPOR],01h
|
|
jnz .nozerocheck_256
|
|
mov dl,0FFh
|
|
test byte[SfxPOR],08h
|
|
jz .nozerocheckb_256
|
|
mov dl,0Fh
|
|
.nozerocheckb_256
|
|
test byte[SfxCOLR],dl
|
|
jz .noplot_256
|
|
.nozerocheck_256
|
|
mov dl,[SfxCOLR]
|
|
and byte[eax],bh
|
|
and byte[eax+1],bh
|
|
and byte[eax+16],bh
|
|
and byte[eax+17],bh
|
|
and byte[eax+32],bh
|
|
and byte[eax+33],bh
|
|
and byte[eax+48],bh
|
|
and byte[eax+49],bh
|
|
test dl,01h
|
|
jz .nodraw_256
|
|
or byte[eax], bl
|
|
.nodraw_256
|
|
test dl,02h
|
|
jz .nodraw2_256
|
|
or byte[eax+1], bl
|
|
.nodraw2_256
|
|
test dl,04h
|
|
jz .nodraw3_256
|
|
or byte[eax+16],bl
|
|
.nodraw3_256
|
|
test dl,08h
|
|
jz .nodraw4_256
|
|
or byte[eax+17],bl
|
|
.nodraw4_256
|
|
test dl,10h
|
|
jz .nodraw5_256
|
|
or byte[eax+32], bl
|
|
.nodraw5_256
|
|
test dl,20h
|
|
jz .nodraw6_256
|
|
or byte[eax+33], bl
|
|
.nodraw6_256
|
|
test dl,40h
|
|
jz .nodraw7_256
|
|
or byte[eax+48],bl
|
|
.nodraw7_256
|
|
test dl,80h
|
|
jz .nodraw8_256
|
|
or byte[eax+49],bl
|
|
.nodraw8_256
|
|
.noplot_256
|
|
inc word [SfxR1]
|
|
FXReturn
|
|
|
|
SECTION .bss
|
|
.prevx resw 1
|
|
.prevy resw 1
|
|
|
|
SECTION .text
|
|
|
|
NEWSYM FxOpd4CA1 ; RPIX read color of the pixel with R1,R2 as x,y
|
|
FETCHPIPE
|
|
mov ebx,[SfxR2]
|
|
mov bh,[SfxR1]
|
|
test byte[SfxPOR],10h
|
|
jnz .objmode
|
|
mov al,[SfxSCMR]
|
|
and al,00100100b ; 4 + 32
|
|
cmp al,4
|
|
je .lines160
|
|
cmp al,32
|
|
je .lines192
|
|
cmp al,36
|
|
je .objmode
|
|
mov eax,[sfx128lineloc]
|
|
jmp .donelines
|
|
.lines160
|
|
mov eax,[sfx160lineloc]
|
|
jmp .donelines
|
|
.lines192
|
|
mov eax,[sfx192lineloc]
|
|
jmp .donelines
|
|
.objmode
|
|
mov eax,[sfxobjlineloc]
|
|
.donelines
|
|
mov ebx,[eax+ebx*4]
|
|
cmp ebx,0FFFFFFFFh
|
|
je near .nodraw
|
|
xor eax,eax
|
|
; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj
|
|
; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color
|
|
; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles
|
|
; 16+8(4/3) 16+4(4/2) 16(4/0)
|
|
push ecx
|
|
mov al,[SfxSCMR]
|
|
and al,00000011b ; 4 + 32
|
|
|
|
cmp al,0
|
|
je near .colors4
|
|
cmp al,3
|
|
je near .colors256
|
|
|
|
shl ebx,5 ; x32 (16 colors)
|
|
mov al,[SfxSCBR]
|
|
shl eax,10 ; Get SFX address
|
|
add eax,ebx
|
|
add eax,[sfxramdata]
|
|
mov ebx,[SfxR2]
|
|
and ebx,07h
|
|
shl ebx,1
|
|
add eax,ebx
|
|
mov cl,[SfxR1]
|
|
and cl,07h
|
|
xor cl,07h
|
|
mov bl,1
|
|
shl bl,cl
|
|
pop ecx
|
|
xor bh,bh
|
|
test byte[eax],bl
|
|
jz .nodraw_16
|
|
or bh,01h
|
|
.nodraw_16
|
|
test byte[eax+1],bl
|
|
jz .nodraw2_16
|
|
or bh,02h
|
|
.nodraw2_16
|
|
test byte[eax+16],bl
|
|
jz .nodraw3_16
|
|
or bh,04h
|
|
.nodraw3_16
|
|
test byte[eax+17],bl
|
|
jz .nodraw4_16
|
|
or bh,08h
|
|
.nodraw4_16
|
|
.nodraw
|
|
mov bl,bh
|
|
and ebx,0FFh
|
|
inc ebp
|
|
; UpdateR14
|
|
CLRFLAGS
|
|
mov [edi],ebx ; Write Destination
|
|
mov [flagnz],ebx
|
|
FXReturn
|
|
|
|
.colors4
|
|
shl ebx,4 ; x16 (4 colors)
|
|
mov al,[SfxSCBR]
|
|
shl eax,10 ; Get SFX address
|
|
add eax,ebx
|
|
add eax,[sfxramdata]
|
|
mov ebx,[SfxR2]
|
|
and ebx,07h
|
|
shl ebx,1
|
|
add eax,ebx
|
|
mov cl,[SfxR1]
|
|
and cl,07h
|
|
xor cl,07h
|
|
mov bl,1
|
|
shl bl,cl
|
|
mov bh,bl
|
|
xor bh,0FFh
|
|
pop ecx
|
|
xor bh,bh
|
|
test byte[eax],bl
|
|
jz .nodraw_4
|
|
or bh,01h
|
|
.nodraw_4
|
|
test byte[eax+1],bl
|
|
jz .nodraw2_4
|
|
or bh,02h
|
|
.nodraw2_4
|
|
mov bl,bh
|
|
and ebx,0FFh
|
|
inc ebp
|
|
; UpdateR14
|
|
CLRFLAGS
|
|
mov [edi],ebx ; Write Destination
|
|
mov [flagnz],ebx
|
|
FXReturn
|
|
|
|
.colors256
|
|
shl ebx,6 ; x64 (256 colors)
|
|
mov al,[SfxSCBR]
|
|
shl eax,10 ; Get SFX address
|
|
add eax,ebx
|
|
add eax,[sfxramdata]
|
|
mov ebx,[SfxR2]
|
|
and ebx,07h
|
|
shl ebx,1
|
|
add eax,ebx
|
|
mov cl,[SfxR1]
|
|
and cl,07h
|
|
xor cl,07h
|
|
mov bl,1
|
|
shl bl,cl
|
|
mov bh,bl
|
|
xor bh,0FFh
|
|
pop ecx
|
|
xor bh,bh
|
|
test byte[eax],bl
|
|
jz .nodraw_256
|
|
or bh,01h
|
|
.nodraw_256
|
|
test byte[eax+1],bl
|
|
jz .nodraw2_256
|
|
or bh,02h
|
|
.nodraw2_256
|
|
test byte[eax+16],bl
|
|
jz .nodraw3_256
|
|
or bh,04h
|
|
.nodraw3_256
|
|
test byte[eax+17],bl
|
|
jz .nodraw4_256
|
|
or bh,08h
|
|
.nodraw4_256
|
|
test byte[eax+32],bl
|
|
jz .nodraw5_256
|
|
or bh,10h
|
|
.nodraw5_256
|
|
test byte[eax+33],bl
|
|
jz .nodraw6_256
|
|
or bh,20h
|
|
.nodraw6_256
|
|
test byte[eax+48],bl
|
|
jz .nodraw7_256
|
|
or bh,40h
|
|
.nodraw7_256
|
|
test byte[eax+49],bl
|
|
jz .nodraw8_256
|
|
or bh,80h
|
|
.nodraw8_256
|
|
mov bl,bh
|
|
and ebx,0FFh
|
|
inc ebp
|
|
; UpdateR14
|
|
CLRFLAGS
|
|
mov [edi],ebx ; Write Destination
|
|
mov [flagnz],ebx
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd4D ; SWAP swap upper and lower byte of a register ; V
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
ror ax,8
|
|
inc ebp ; Increase program counter
|
|
mov [SfxSignZero],eax
|
|
mov [edi],eax ; Write Destination
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd4E ; COLOR copy source register to color register ; V
|
|
FETCHPIPE
|
|
mov eax,[esi] ; Read Source
|
|
; if bit 3 of SfxPOR is set, then don't modify the upper 4 bits
|
|
test byte[SfxPOR],04h
|
|
jz .nohighnibble
|
|
mov bl,al
|
|
shr bl,4
|
|
and al,0F0h
|
|
or al,bl
|
|
.nohighnibble
|
|
test byte[SfxPOR],08h
|
|
jnz .preserveupper
|
|
cmp [SfxCOLR],al
|
|
je .nocolchange
|
|
mov [SfxCOLR],al
|
|
and eax,0FFh
|
|
mov ebx,[fxbit01+eax*4]
|
|
mov [fxbit01pcal],ebx
|
|
mov ebx,[fxbit23+eax*4]
|
|
mov [fxbit23pcal],ebx
|
|
mov ebx,[fxbit45+eax*4]
|
|
mov [fxbit45pcal],ebx
|
|
mov ebx,[fxbit67+eax*4]
|
|
mov [fxbit67pcal],ebx
|
|
.nocolchange
|
|
CLRFLAGS
|
|
inc ebp ; Increase program counter
|
|
FXReturn
|
|
.preserveupper
|
|
mov bl,[SfxCOLR]
|
|
and al,0Fh
|
|
and bl,0F0h
|
|
or al,bl
|
|
cmp [SfxCOLR],al
|
|
je .nocolchange
|
|
mov [SfxCOLR],al
|
|
and eax,0FFh
|
|
mov ebx,[fxbit01+eax*4]
|
|
mov [fxbit01pcal],ebx
|
|
mov ebx,[fxbit23+eax*4]
|
|
mov [fxbit23pcal],ebx
|
|
mov ebx,[fxbit45+eax*4]
|
|
mov [fxbit45pcal],ebx
|
|
mov ebx,[fxbit67+eax*4]
|
|
mov [fxbit67pcal],ebx
|
|
CLRFLAGS
|
|
inc ebp ; Increase program counter
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd4EA1 ; CMODE set plot option register ; V
|
|
FETCHPIPE
|
|
mov eax,[esi] ; Read Source
|
|
inc ebp ; Increase program counter
|
|
mov dword [SfxPOR],eax
|
|
|
|
test byte[SfxPOR],10h
|
|
jnz .objmode
|
|
mov al,[SfxSCMR]
|
|
and al,00100100b ; 4 + 32
|
|
cmp al,4
|
|
je .lines160
|
|
cmp al,32
|
|
je .lines192
|
|
cmp al,36
|
|
je .objmode
|
|
mov eax,[sfx128lineloc]
|
|
jmp .donelines
|
|
.lines160
|
|
mov eax,[sfx160lineloc]
|
|
jmp .donelines
|
|
.lines192
|
|
mov eax,[sfx192lineloc]
|
|
jmp .donelines
|
|
.objmode
|
|
mov eax,[sfxobjlineloc]
|
|
.donelines
|
|
mov [sfxclineloc],eax
|
|
|
|
|
|
push ebx
|
|
mov al,[SfxSCMR]
|
|
and eax,00000011b
|
|
mov bl,[SfxPOR]
|
|
and bl,0Fh
|
|
shl bl,2
|
|
or al,bl
|
|
mov ebx,[PLOTJmpb+eax*4]
|
|
mov eax,[PLOTJmpa+eax*4]
|
|
|
|
mov dword [FxTable+4Ch*4],eax
|
|
mov dword [FxTableb+4Ch*4],eax
|
|
mov dword [FxTablec+4Ch*4],eax
|
|
mov dword [FxTabled+4Ch*4],ebx
|
|
pop ebx
|
|
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd4F ; NOT perform exclusive exor with 1 on all bits ; V
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
xor eax,0FFFFh
|
|
inc ebp ; Increase program counter
|
|
mov [SfxSignZero],eax
|
|
mov [edi],eax ; Write Destination
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd50 ; ADD RN add, register + register
|
|
ADDRNc 0
|
|
NEWSYM FxOpd51 ; ADD RN add, register + register
|
|
ADDRNc 1
|
|
NEWSYM FxOpd52 ; ADD RN add, register + register
|
|
ADDRNc 2
|
|
NEWSYM FxOpd53 ; ADD RN add, register + register
|
|
ADDRNc 3
|
|
NEWSYM FxOpd54 ; ADD RN add, register + register
|
|
ADDRNc 4
|
|
NEWSYM FxOpd55 ; ADD RN add, register + register
|
|
ADDRNc 5
|
|
NEWSYM FxOpd56 ; ADD RN add, register + register
|
|
ADDRNc 6
|
|
NEWSYM FxOpd57 ; ADD RN add, register + register
|
|
ADDRNc 7
|
|
NEWSYM FxOpd58 ; ADD RN add, register + register
|
|
ADDRNc 8
|
|
NEWSYM FxOpd59 ; ADD RN add, register + register
|
|
ADDRNc 9
|
|
NEWSYM FxOpd5A ; ADD RN add, register + register
|
|
ADDRNc 10
|
|
NEWSYM FxOpd5B ; ADD RN add, register + register
|
|
ADDRNc 11
|
|
NEWSYM FxOpd5C ; ADD RN add, register + register
|
|
ADDRNc 12
|
|
NEWSYM FxOpd5D ; ADD RN add, register + register
|
|
ADDRNc 13
|
|
NEWSYM FxOpd5E ; ADD RN add, register + register
|
|
ADDRNc 14
|
|
NEWSYM FxOpd5F ; ADD RN add, register + register
|
|
FETCHPIPE
|
|
mov eax, [esi] ; Read Source
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
add ax,bx
|
|
seto byte[SfxOverflow]
|
|
setc byte[SfxCarry]
|
|
mov [SfxSignZero],eax
|
|
inc ebp ; Increase program counter
|
|
mov [edi],eax ; Write Destination
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd50A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 0
|
|
NEWSYM FxOpd51A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 1
|
|
NEWSYM FxOpd52A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 2
|
|
NEWSYM FxOpd53A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 3
|
|
NEWSYM FxOpd54A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 4
|
|
NEWSYM FxOpd55A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 5
|
|
NEWSYM FxOpd56A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 6
|
|
NEWSYM FxOpd57A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 7
|
|
NEWSYM FxOpd58A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 8
|
|
NEWSYM FxOpd59A1 ; ADC RN add with carry, register + register
|
|
ADCRNc 9
|
|
NEWSYM FxOpd5AA1 ; ADC RN add with carry, register + register
|
|
ADCRNc 10
|
|
NEWSYM FxOpd5BA1 ; ADC RN add with carry, register + register
|
|
ADCRNc 11
|
|
NEWSYM FxOpd5CA1 ; ADC RN add with carry, register + register
|
|
ADCRNc 12
|
|
NEWSYM FxOpd5DA1 ; ADC RN add with carry, register + register
|
|
ADCRNc 13
|
|
NEWSYM FxOpd5EA1 ; ADC RN add with carry, register + register
|
|
ADCRNc 14
|
|
NEWSYM FxOpd5FA1 ; ADC RN add with carry, register + register
|
|
FETCHPIPE
|
|
mov eax, [esi] ; Read Source
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
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
|
|
|
|
; Weird Opdode (FxOpd50A2, add 0, wow!)
|
|
NEWSYM FxOpd50A2 ; ADI RN add, register + immediate
|
|
ADIRNc 0
|
|
NEWSYM FxOpd51A2 ; ADI RN add, register + immediate
|
|
ADIRNc 1
|
|
NEWSYM FxOpd52A2 ; ADI RN add, register + immediate
|
|
ADIRNc 2
|
|
NEWSYM FxOpd53A2 ; ADI RN add, register + immediate
|
|
ADIRNc 3
|
|
NEWSYM FxOpd54A2 ; ADI RN add, register + immediate
|
|
ADIRNc 4
|
|
NEWSYM FxOpd55A2 ; ADI RN add, register + immediate
|
|
ADIRNc 5
|
|
NEWSYM FxOpd56A2 ; ADI RN add, register + immediate
|
|
ADIRNc 6
|
|
NEWSYM FxOpd57A2 ; ADI RN add, register + immediate
|
|
ADIRNc 7
|
|
NEWSYM FxOpd58A2 ; ADI RN add, register + immediate
|
|
ADIRNc 8
|
|
NEWSYM FxOpd59A2 ; ADI RN add, register + immediate
|
|
ADIRNc 9
|
|
NEWSYM FxOpd5AA2 ; ADI RN add, register + immediate
|
|
ADIRNc 10
|
|
NEWSYM FxOpd5BA2 ; ADI RN add, register + immediate
|
|
ADIRNc 11
|
|
NEWSYM FxOpd5CA2 ; ADI RN add, register + immediate
|
|
ADIRNc 12
|
|
NEWSYM FxOpd5DA2 ; ADI RN add, register + immediate
|
|
ADIRNc 13
|
|
NEWSYM FxOpd5EA2 ; ADI RN add, register + immediate
|
|
ADIRNc 14
|
|
NEWSYM FxOpd5FA2 ; ADI RN add, register + immediate
|
|
ADIRNc 15
|
|
|
|
; Another very useful Opdode
|
|
NEWSYM FxOpd50A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 0
|
|
NEWSYM FxOpd51A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 1
|
|
NEWSYM FxOpd52A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 2
|
|
NEWSYM FxOpd53A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 3
|
|
NEWSYM FxOpd54A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 4
|
|
NEWSYM FxOpd55A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 5
|
|
NEWSYM FxOpd56A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 6
|
|
NEWSYM FxOpd57A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 7
|
|
NEWSYM FxOpd58A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 8
|
|
NEWSYM FxOpd59A3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 9
|
|
NEWSYM FxOpd5AA3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 10
|
|
NEWSYM FxOpd5BA3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 11
|
|
NEWSYM FxOpd5CA3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 12
|
|
NEWSYM FxOpd5DA3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 13
|
|
NEWSYM FxOpd5EA3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 14
|
|
NEWSYM FxOpd5FA3 ; ADCIRN add with carry, register + immediate
|
|
ADCIRNc 15
|
|
|
|
NEWSYM FxOpd60 ; SUBRN subtract, register - register
|
|
SUBRNc 0
|
|
NEWSYM FxOpd61 ; SUBRN subtract, register - register
|
|
SUBRNc 1
|
|
NEWSYM FxOpd62 ; SUBRN subtract, register - register
|
|
SUBRNc 2
|
|
NEWSYM FxOpd63 ; SUBRN subtract, register - register
|
|
SUBRNc 3
|
|
NEWSYM FxOpd64 ; SUBRN subtract, register - register
|
|
SUBRNc 4
|
|
NEWSYM FxOpd65 ; SUBRN subtract, register - register
|
|
SUBRNc 5
|
|
NEWSYM FxOpd66 ; SUBRN subtract, register - register
|
|
SUBRNc 6
|
|
NEWSYM FxOpd67 ; SUBRN subtract, register - register
|
|
SUBRNc 7
|
|
NEWSYM FxOpd68 ; SUBRN subtract, register - register
|
|
SUBRNc 8
|
|
NEWSYM FxOpd69 ; SUBRN subtract, register - register
|
|
SUBRNc 9
|
|
NEWSYM FxOpd6A ; SUBRN subtract, register - register
|
|
SUBRNc 10
|
|
NEWSYM FxOpd6B ; SUBRN subtract, register - register
|
|
SUBRNc 11
|
|
NEWSYM FxOpd6C ; SUBRN subtract, register - register
|
|
SUBRNc 12
|
|
NEWSYM FxOpd6D ; SUBRN subtract, register - register
|
|
SUBRNc 13
|
|
NEWSYM FxOpd6E ; SUBRN subtract, register - register
|
|
SUBRNc 14
|
|
NEWSYM FxOpd6F ; SUBRN subtract, register - register
|
|
FETCHPIPE
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
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
|
|
|
|
NEWSYM FxOpd60A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 0
|
|
NEWSYM FxOpd61A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 1
|
|
NEWSYM FxOpd62A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 2
|
|
NEWSYM FxOpd63A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 3
|
|
NEWSYM FxOpd64A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 4
|
|
NEWSYM FxOpd65A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 5
|
|
NEWSYM FxOpd66A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 6
|
|
NEWSYM FxOpd67A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 7
|
|
NEWSYM FxOpd68A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 8
|
|
NEWSYM FxOpd69A1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 9
|
|
NEWSYM FxOpd6AA1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 10
|
|
NEWSYM FxOpd6BA1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 11
|
|
NEWSYM FxOpd6CA1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 12
|
|
NEWSYM FxOpd6DA1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 13
|
|
NEWSYM FxOpd6EA1 ; SBCRN subtract with carry, register - register
|
|
SBCRNc 14
|
|
NEWSYM FxOpd6FA1 ; SBCRN subtract with carry, register - register
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,ebp
|
|
FETCHPIPE
|
|
sub ebx,[SfxCPB]
|
|
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
|
|
|
|
NEWSYM FxOpd60A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 0
|
|
NEWSYM FxOpd61A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 1
|
|
NEWSYM FxOpd62A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 2
|
|
NEWSYM FxOpd63A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 3
|
|
NEWSYM FxOpd64A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 4
|
|
NEWSYM FxOpd65A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 5
|
|
NEWSYM FxOpd66A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 6
|
|
NEWSYM FxOpd67A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 7
|
|
NEWSYM FxOpd68A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 8
|
|
NEWSYM FxOpd69A2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 9
|
|
NEWSYM FxOpd6AA2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 10
|
|
NEWSYM FxOpd6BA2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 11
|
|
NEWSYM FxOpd6CA2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 12
|
|
NEWSYM FxOpd6DA2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 13
|
|
NEWSYM FxOpd6EA2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 14
|
|
NEWSYM FxOpd6FA2 ; SUBIRN subtract, register - immediate
|
|
SUBIRNc 15
|
|
|
|
NEWSYM FxOpd60A3 ; CMPRN compare, register, register
|
|
CMPRNc 0
|
|
NEWSYM FxOpd61A3 ; CMPRN compare, register, register
|
|
CMPRNc 1
|
|
NEWSYM FxOpd62A3 ; CMPRN compare, register, register
|
|
CMPRNc 2
|
|
NEWSYM FxOpd63A3 ; CMPRN compare, register, register
|
|
CMPRNc 3
|
|
NEWSYM FxOpd64A3 ; CMPRN compare, register, register
|
|
CMPRNc 4
|
|
NEWSYM FxOpd65A3 ; CMPRN compare, register, register
|
|
CMPRNc 5
|
|
NEWSYM FxOpd66A3 ; CMPRN compare, register, register
|
|
CMPRNc 6
|
|
NEWSYM FxOpd67A3 ; CMPRN compare, register, register
|
|
CMPRNc 7
|
|
NEWSYM FxOpd68A3 ; CMPRN compare, register, register
|
|
CMPRNc 8
|
|
NEWSYM FxOpd69A3 ; CMPRN compare, register, register
|
|
CMPRNc 9
|
|
NEWSYM FxOpd6AA3 ; CMPRN compare, register, register
|
|
CMPRNc 10
|
|
NEWSYM FxOpd6BA3 ; CMPRN compare, register, register
|
|
CMPRNc 11
|
|
NEWSYM FxOpd6CA3 ; CMPRN compare, register, register
|
|
CMPRNc 12
|
|
NEWSYM FxOpd6DA3 ; CMPRN compare, register, register
|
|
CMPRNc 13
|
|
NEWSYM FxOpd6EA3 ; CMPRN compare, register, register
|
|
CMPRNc 14
|
|
NEWSYM FxOpd6FA3 ; CMPRN compare, register, register
|
|
FETCHPIPE
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
sub ax,bx
|
|
seto byte[SfxOverflow]
|
|
setc byte[SfxCarry]
|
|
xor byte[SfxCarry],1
|
|
mov [SfxSignZero],eax
|
|
CLRFLAGS
|
|
inc ebp ; Increase program counter
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd70 ; MERGE R7 as upper byte, R8 as lower byte (used for texture-mapping) */
|
|
; V
|
|
xor eax,eax
|
|
FETCHPIPE
|
|
mov ah,byte [SfxR7+1]
|
|
mov al,byte [SfxR8+1]
|
|
inc ebp
|
|
mov [edi],eax ; Write Destination
|
|
mov dword[SfxSignZero],0001h
|
|
test eax,0F0F0h
|
|
jz .nozero
|
|
mov dword[SfxSignZero],0000h
|
|
.nozero
|
|
test eax,08080h
|
|
jz .nosign
|
|
or dword [SfxSignZero],80000h
|
|
.nosign
|
|
mov dword [SfxOverflow],1
|
|
test ax,0c0c0h
|
|
jnz .Overflow
|
|
mov dword [SfxOverflow],0
|
|
.Overflow
|
|
mov dword [SfxCarry],1
|
|
test ax,0e0e0h
|
|
jnz .Carry
|
|
mov dword [SfxCarry],0
|
|
.Carry
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd71 ; AND RN register & register
|
|
ANDRNc 1
|
|
NEWSYM FxOpd72 ; AND RN register & register
|
|
ANDRNc 2
|
|
NEWSYM FxOpd73 ; AND RN register & register
|
|
ANDRNc 3
|
|
NEWSYM FxOpd74 ; AND RN register & register
|
|
ANDRNc 4
|
|
NEWSYM FxOpd75 ; AND RN register & register
|
|
ANDRNc 5
|
|
NEWSYM FxOpd76 ; AND RN register & register
|
|
ANDRNc 6
|
|
NEWSYM FxOpd77 ; AND RN register & register
|
|
ANDRNc 7
|
|
NEWSYM FxOpd78 ; AND RN register & register
|
|
ANDRNc 8
|
|
NEWSYM FxOpd79 ; AND RN register & register
|
|
ANDRNc 9
|
|
NEWSYM FxOpd7A ; AND RN register & register
|
|
ANDRNc 10
|
|
NEWSYM FxOpd7B ; AND RN register & register
|
|
ANDRNc 11
|
|
NEWSYM FxOpd7C ; AND RN register & register
|
|
ANDRNc 12
|
|
NEWSYM FxOpd7D ; AND RN register & register
|
|
ANDRNc 13
|
|
NEWSYM FxOpd7E ; AND RN register & register
|
|
ANDRNc 14
|
|
NEWSYM FxOpd7F ; AND RN register & register
|
|
FETCHPIPE
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
and eax,ebx
|
|
inc ebp
|
|
mov dword [SfxSignZero],eax
|
|
mov [edi],eax ; Write Destination
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd71A1 ; BIC RN register & ~register
|
|
BICRNc 1
|
|
NEWSYM FxOpd72A1 ; BIC RN register & ~register
|
|
BICRNc 2
|
|
NEWSYM FxOpd73A1 ; BIC RN register & ~register
|
|
BICRNc 3
|
|
NEWSYM FxOpd74A1 ; BIC RN register & ~register
|
|
BICRNc 4
|
|
NEWSYM FxOpd75A1 ; BIC RN register & ~register
|
|
BICRNc 5
|
|
NEWSYM FxOpd76A1 ; BIC RN register & ~register
|
|
BICRNc 6
|
|
NEWSYM FxOpd77A1 ; BIC RN register & ~register
|
|
BICRNc 7
|
|
NEWSYM FxOpd78A1 ; BIC RN register & ~register
|
|
BICRNc 8
|
|
NEWSYM FxOpd79A1 ; BIC RN register & ~register
|
|
BICRNc 9
|
|
NEWSYM FxOpd7AA1 ; BIC RN register & ~register
|
|
BICRNc 10
|
|
NEWSYM FxOpd7BA1 ; BIC RN register & ~register
|
|
BICRNc 11
|
|
NEWSYM FxOpd7CA1 ; BIC RN register & ~register
|
|
BICRNc 12
|
|
NEWSYM FxOpd7DA1 ; BIC RN register & ~register
|
|
BICRNc 13
|
|
NEWSYM FxOpd7EA1 ; BIC RN register & ~register
|
|
BICRNc 14
|
|
NEWSYM FxOpd7FA1 ; BIC RN register & ~register
|
|
FETCHPIPE
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
mov eax,[esi] ; Read Source
|
|
xor ebx,0FFFFh
|
|
and eax,ebx
|
|
inc ebp
|
|
mov dword [SfxSignZero],eax
|
|
mov [edi],eax ; Write Destination
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd71A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 1
|
|
NEWSYM FxOpd72A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 2
|
|
NEWSYM FxOpd73A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 3
|
|
NEWSYM FxOpd74A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 4
|
|
NEWSYM FxOpd75A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 5
|
|
NEWSYM FxOpd76A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 6
|
|
NEWSYM FxOpd77A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 7
|
|
NEWSYM FxOpd78A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 8
|
|
NEWSYM FxOpd79A2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 9
|
|
NEWSYM FxOpd7AA2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 10
|
|
NEWSYM FxOpd7BA2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 11
|
|
NEWSYM FxOpd7CA2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 12
|
|
NEWSYM FxOpd7DA2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 13
|
|
NEWSYM FxOpd7EA2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 14
|
|
NEWSYM FxOpd7FA2 ; ANDIRNc and #n - register & immediate
|
|
ANDIRNc 15
|
|
|
|
NEWSYM FxOpd71A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 1 ^ 0FFFFh
|
|
NEWSYM FxOpd72A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 2 ^ 0FFFFh
|
|
NEWSYM FxOpd73A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 3 ^ 0FFFFh
|
|
NEWSYM FxOpd74A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 4 ^ 0FFFFh
|
|
NEWSYM FxOpd75A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 5 ^ 0FFFFh
|
|
NEWSYM FxOpd76A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 6 ^ 0FFFFh
|
|
NEWSYM FxOpd77A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 7 ^ 0FFFFh
|
|
NEWSYM FxOpd78A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 8 ^ 0FFFFh
|
|
NEWSYM FxOpd79A3 ; BICIRNc register & ~immediate
|
|
BICIRNc 9 ^ 0FFFFh
|
|
NEWSYM FxOpd7AA3 ; BICIRNc register & ~immediate
|
|
BICIRNc 10 ^ 0FFFFh
|
|
NEWSYM FxOpd7BA3 ; BICIRNc register & ~immediate
|
|
BICIRNc 11 ^ 0FFFFh
|
|
NEWSYM FxOpd7CA3 ; BICIRNc register & ~immediate
|
|
BICIRNc 12 ^ 0FFFFh
|
|
NEWSYM FxOpd7DA3 ; BICIRNc register & ~immediate
|
|
BICIRNc 13 ^ 0FFFFh
|
|
NEWSYM FxOpd7EA3 ; BICIRNc register & ~immediate
|
|
BICIRNc 14 ^ 0FFFFh
|
|
NEWSYM FxOpd7FA3 ; BICIRNc register & ~immediate
|
|
BICIRNc 15 ^ 0FFFFh
|
|
|
|
NEWSYM FxOpd80 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 0
|
|
NEWSYM FxOpd81 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 1
|
|
NEWSYM FxOpd82 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 2
|
|
NEWSYM FxOpd83 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 3
|
|
NEWSYM FxOpd84 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 4
|
|
NEWSYM FxOpd85 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 5
|
|
NEWSYM FxOpd86 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 6
|
|
NEWSYM FxOpd87 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 7
|
|
NEWSYM FxOpd88 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 8
|
|
NEWSYM FxOpd89 ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 9
|
|
NEWSYM FxOpd8A ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 10
|
|
NEWSYM FxOpd8B ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 11
|
|
NEWSYM FxOpd8C ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 12
|
|
NEWSYM FxOpd8D ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 13
|
|
NEWSYM FxOpd8E ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
MULTRNc 14
|
|
NEWSYM FxOpd8F ; MULTRNc 8 bit to 16 bit signed multiply, register * register
|
|
FETCHPIPE
|
|
mov ebx,ebp
|
|
mov al,byte [esi] ; Read Source
|
|
sub ebx,[SfxCPB]
|
|
imul bl
|
|
inc ebp
|
|
and eax,0FFFFh
|
|
mov [SfxSignZero],eax
|
|
mov [edi],eax ; Write Destination
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd80A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 0
|
|
NEWSYM FxOpd81A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 1
|
|
NEWSYM FxOpd82A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 2
|
|
NEWSYM FxOpd83A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 3
|
|
NEWSYM FxOpd84A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 4
|
|
NEWSYM FxOpd85A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 5
|
|
NEWSYM FxOpd86A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 6
|
|
NEWSYM FxOpd87A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 7
|
|
NEWSYM FxOpd88A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 8
|
|
NEWSYM FxOpd89A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 9
|
|
NEWSYM FxOpd8AA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 10
|
|
NEWSYM FxOpd8BA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 11
|
|
NEWSYM FxOpd8CA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 12
|
|
NEWSYM FxOpd8DA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 13
|
|
NEWSYM FxOpd8EA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
UMULTRNc 14
|
|
NEWSYM FxOpd8FA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register
|
|
FETCHPIPE
|
|
mov ebx,ebp
|
|
mov al,byte [esi] ; Read Source
|
|
sub ebx,[SfxCPB]
|
|
mul bl
|
|
inc ebp
|
|
and eax,0FFFFh
|
|
mov [SfxSignZero],eax
|
|
mov [edi],eax ; Write Destination
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd80A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 0
|
|
NEWSYM FxOpd81A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 1
|
|
NEWSYM FxOpd82A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 2
|
|
NEWSYM FxOpd83A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 3
|
|
NEWSYM FxOpd84A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 4
|
|
NEWSYM FxOpd85A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 5
|
|
NEWSYM FxOpd86A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 6
|
|
NEWSYM FxOpd87A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 7
|
|
NEWSYM FxOpd88A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 8
|
|
NEWSYM FxOpd89A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 9
|
|
NEWSYM FxOpd8AA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 10
|
|
NEWSYM FxOpd8BA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 11
|
|
NEWSYM FxOpd8CA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 12
|
|
NEWSYM FxOpd8DA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 13
|
|
NEWSYM FxOpd8EA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 14
|
|
NEWSYM FxOpd8FA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate
|
|
MULTIRNc 15
|
|
|
|
NEWSYM FxOpd80A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 0
|
|
NEWSYM FxOpd81A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 1
|
|
NEWSYM FxOpd82A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 2
|
|
NEWSYM FxOpd83A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 3
|
|
NEWSYM FxOpd84A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 4
|
|
NEWSYM FxOpd85A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 5
|
|
NEWSYM FxOpd86A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 6
|
|
NEWSYM FxOpd87A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 7
|
|
NEWSYM FxOpd88A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 8
|
|
NEWSYM FxOpd89A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 9
|
|
NEWSYM FxOpd8AA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 10
|
|
NEWSYM FxOpd8BA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 11
|
|
NEWSYM FxOpd8CA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 12
|
|
NEWSYM FxOpd8DA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 13
|
|
NEWSYM FxOpd8EA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 14
|
|
NEWSYM FxOpd8FA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate
|
|
UMULTIRNc 15
|
|
|
|
NEWSYM FxOpd90 ; SBK store word to last accessed RAM address ; V
|
|
mov ebx,[SfxLastRamAdr] ; Load last ram address
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
mov [ebx],al ; Store Word
|
|
sub ebx,[SfxRAMMem]
|
|
xor ebx,1
|
|
add ebx,[SfxRAMMem]
|
|
inc ebp ; Increase program counter
|
|
mov [ebx],ah ; Store Word
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd91 ; LINKc#n R11 = R15 + immediate
|
|
LINKc 1
|
|
NEWSYM FxOpd92 ; LINKc#n R11 = R15 + immediate
|
|
LINKc 2
|
|
NEWSYM FxOpd93 ; LINKc#n R11 = R15 + immediate
|
|
LINKc 3
|
|
NEWSYM FxOpd94 ; LINKc#n R11 = R15 + immediate
|
|
LINKc 4
|
|
|
|
NEWSYM FxOpd95 ; SEX sign extend 8 bit to 16 bit ; V
|
|
movsx eax, byte [esi] ; Read Source
|
|
FETCHPIPE
|
|
and eax,0FFFFh
|
|
inc ebp
|
|
mov [edi],eax ; Write Destination
|
|
mov [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd96 ; ASR aritmethic shift right by one ; V
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
mov [SfxCarry],al
|
|
and byte[SfxCarry],1
|
|
sar ax,1 ; logic shift right
|
|
inc ebp ; Increase program counter
|
|
mov [edi],eax ; Write Destination
|
|
mov dword [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd96A1 ; DIV2 aritmethic shift right by one ; V
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
cmp ax,-1
|
|
je .minusone
|
|
mov [SfxCarry],al
|
|
and byte[SfxCarry],1
|
|
sar ax,1 ; logic shift right
|
|
inc ebp ; Increase program counter
|
|
mov [edi],eax ; Write Destination
|
|
mov dword [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
.minusone
|
|
mov byte[SfxCarry],1
|
|
xor eax,eax
|
|
inc ebp ; Increase program counter
|
|
mov [edi],eax ; Write Destination
|
|
mov dword [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd97 ; ROR rotate right by one ; V
|
|
FETCHPIPE
|
|
mov eax,[esi] ; Read Source
|
|
shr byte[SfxCarry],1
|
|
rcr ax,1
|
|
setc byte[SfxCarry]
|
|
inc ebp ; Increase program counter
|
|
mov [edi],eax ; Write Destination
|
|
mov [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd98 ; JMPRNc jump to address of register
|
|
JMPRNc 8
|
|
NEWSYM FxOpd99 ; JMPRNc jump to address of register
|
|
JMPRNc 9
|
|
NEWSYM FxOpd9A ; JMPRNc jump to address of register
|
|
JMPRNc 10
|
|
NEWSYM FxOpd9B ; JMPRNc jump to address of register
|
|
JMPRNc 11
|
|
NEWSYM FxOpd9C ; JMPRNc jump to address of register
|
|
JMPRNc 12
|
|
NEWSYM FxOpd9D ; JMPRNc jump to address of register
|
|
JMPRNc 13
|
|
|
|
NEWSYM FxOpd98A1 ; LJMPRNc set program bank to source register and jump to address of register
|
|
LJMPRNc 8
|
|
NEWSYM FxOpd99A1 ; LJMPRNc set program bank to source register and jump to address of register
|
|
LJMPRNc 9
|
|
NEWSYM FxOpd9AA1 ; LJMPRNc set program bank to source register and jump to address of register
|
|
LJMPRNc 10
|
|
NEWSYM FxOpd9BA1 ; LJMPRNc set program bank to source register and jump to address of register
|
|
LJMPRNc 11
|
|
NEWSYM FxOpd9CA1 ; LJMPRNc set program bank to source register and jump to address of register
|
|
LJMPRNc 12
|
|
NEWSYM FxOpd9DA1 ; LJMPRNc set program bank to source register and jump to address of register
|
|
LJMPRNc 13
|
|
|
|
NEWSYM FxOpd9E ; LOB set upper byte to zero (keep low byte) ; V
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
and eax,0FFh
|
|
inc ebp
|
|
mov [edi],eax ; Write Destination
|
|
shl eax,8
|
|
mov dword [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd9F ; FMULT 16 bit to 32 bit signed multiplication, upper 16 bits only
|
|
; V
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,[SfxR6]
|
|
FETCHPIPE
|
|
imul bx
|
|
inc ebp
|
|
and edx,0FFFFh
|
|
mov [SfxSignZero],edx
|
|
mov [edi],edx ; Write Destination
|
|
shr ax,15
|
|
mov [SfxCarry],al
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpd9FA1 ; LMULT 16 bit to 32 bit signed multiplication ; V
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,[SfxR6]
|
|
FETCHPIPE
|
|
imul bx
|
|
and edx,0FFFFh
|
|
inc ebp
|
|
mov [edi],edx ; Write Destination
|
|
mov [SfxR4],ax
|
|
mov [SfxSignZero],edx
|
|
shr ax,15
|
|
mov [SfxCarry],al
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdA0 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 0
|
|
NEWSYM FxOpdA1 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 1
|
|
NEWSYM FxOpdA2 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 2
|
|
NEWSYM FxOpdA3 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 3
|
|
NEWSYM FxOpdA4 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 4
|
|
NEWSYM FxOpdA5 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 5
|
|
NEWSYM FxOpdA6 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 6
|
|
NEWSYM FxOpdA7 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 7
|
|
NEWSYM FxOpdA8 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 8
|
|
NEWSYM FxOpdA9 ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 9
|
|
NEWSYM FxOpdAA ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 10
|
|
NEWSYM FxOpdAB ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 11
|
|
NEWSYM FxOpdAC ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 12
|
|
NEWSYM FxOpdAD ; IBTRNc,#PP immediate byte transfer
|
|
IBTRNc 13
|
|
NEWSYM FxOpdAE ; IBTRNc,#PP immediate byte transfer
|
|
movsx eax,byte[ebp]
|
|
mov cl,[ebp+1]
|
|
add ebp,2
|
|
mov [SfxR0+14*4],ax
|
|
UpdateR14
|
|
CLRFLAGS
|
|
FXReturn
|
|
NEWSYM FxOpdAF ; IBTRNc,#PP immediate byte transfer
|
|
movsx eax,byte[ebp]
|
|
mov cl,[ebp+1]
|
|
and eax,0FFFFh
|
|
mov ebp,[SfxCPB]
|
|
add ebp,eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdA0A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 0
|
|
NEWSYM FxOpdA1A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 1
|
|
NEWSYM FxOpdA2A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 2
|
|
NEWSYM FxOpdA3A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 3
|
|
NEWSYM FxOpdA4A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 4
|
|
NEWSYM FxOpdA5A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 5
|
|
NEWSYM FxOpdA6A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 6
|
|
NEWSYM FxOpdA7A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 7
|
|
NEWSYM FxOpdA8A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 8
|
|
NEWSYM FxOpdA9A1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 9
|
|
NEWSYM FxOpdAAA1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 10
|
|
NEWSYM FxOpdABA1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 11
|
|
NEWSYM FxOpdACA1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 12
|
|
NEWSYM FxOpdADA1 ; LMS rn,(yy) load word from RAM (short address)
|
|
LMSRNc 13
|
|
NEWSYM FxOpdAEA1 ; LMS rn,(yy) load word from RAM (short address)
|
|
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+14*4],bx ; Write data
|
|
UpdateR14
|
|
CLRFLAGS
|
|
FXReturn
|
|
NEWSYM FxOpdAFA1 ; LMS rn,(yy) load word from RAM (short address)
|
|
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
|
|
and ebx,0FFFFh
|
|
mov ebp,[SfxCPB]
|
|
add ebp,ebx
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdA0A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 0
|
|
NEWSYM FxOpdA1A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 1
|
|
NEWSYM FxOpdA2A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 2
|
|
NEWSYM FxOpdA3A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 3
|
|
NEWSYM FxOpdA4A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 4
|
|
NEWSYM FxOpdA5A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 5
|
|
NEWSYM FxOpdA6A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 6
|
|
NEWSYM FxOpdA7A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 7
|
|
NEWSYM FxOpdA8A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 8
|
|
NEWSYM FxOpdA9A2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 9
|
|
NEWSYM FxOpdAAA2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 10
|
|
NEWSYM FxOpdABA2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 11
|
|
NEWSYM FxOpdACA2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 12
|
|
NEWSYM FxOpdADA2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 13
|
|
NEWSYM FxOpdAEA2 ; SMS (yy),rn store word in RAM (short address)
|
|
SMSRNc 14
|
|
NEWSYM FxOpdAFA2 ; SMS (yy),rn store word in RAM (short address)
|
|
xor eax,eax
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
mov al,[ebp]
|
|
inc ebp
|
|
add eax,eax
|
|
FETCHPIPE
|
|
add eax,[SfxRAMMem]
|
|
mov dword [SfxLastRamAdr],eax
|
|
inc ebp
|
|
mov [eax],bx ; Write word to ram
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdB0 ; FROM rn set source register
|
|
FROMRNd 0
|
|
NEWSYM FxOpdB1 ; FROM rn set source register
|
|
FROMRNd 1
|
|
NEWSYM FxOpdB2 ; FROM rn set source register
|
|
FROMRNd 2
|
|
NEWSYM FxOpdB3 ; FROM rn set source register
|
|
FROMRNd 3
|
|
NEWSYM FxOpdB4 ; FROM rn set source register
|
|
FROMRNd 4
|
|
NEWSYM FxOpdB5 ; FROM rn set source register
|
|
FROMRNd 5
|
|
NEWSYM FxOpdB6 ; FROM rn set source register
|
|
FROMRNd 6
|
|
NEWSYM FxOpdB7 ; FROM rn set source register
|
|
FROMRNd 7
|
|
NEWSYM FxOpdB8 ; FROM rn set source register
|
|
FROMRNd 8
|
|
NEWSYM FxOpdB9 ; FROM rn set source register
|
|
FROMRNd 9
|
|
NEWSYM FxOpdBA ; FROM rn set source register
|
|
FROMRNd 10
|
|
NEWSYM FxOpdBB ; FROM rn set source register
|
|
FROMRNd 11
|
|
NEWSYM FxOpdBC ; FROM rn set source register
|
|
FROMRNd 12
|
|
NEWSYM FxOpdBD ; FROM rn set source register
|
|
FROMRNd 13
|
|
NEWSYM FxOpdBE ; FROM rn set source register
|
|
FROMRNd 14
|
|
NEWSYM FxOpdBF ; FROM rn set source register
|
|
FETCHPIPE
|
|
mov esi,SfxR0+15*4
|
|
inc ebp ; Increase program counter
|
|
mov eax,ebp
|
|
sub eax,[SfxCPB]
|
|
mov [SfxR15],eax
|
|
call [FxTableb+ecx*4]
|
|
mov esi,SfxR0
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdC0 ; HIB move high-byte to low-byte ; V
|
|
mov eax,[esi] ; Read Source
|
|
FETCHPIPE
|
|
and eax,0FF00h
|
|
mov dword [SfxSignZero],eax
|
|
shr eax,8
|
|
inc ebp
|
|
mov [edi],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdC1 ; OR rn or rn
|
|
ORRNc 1
|
|
NEWSYM FxOpdC2 ; OR rn or rn
|
|
ORRNc 2
|
|
NEWSYM FxOpdC3 ; OR rn or rn
|
|
ORRNc 3
|
|
NEWSYM FxOpdC4 ; OR rn or rn
|
|
ORRNc 4
|
|
NEWSYM FxOpdC5 ; OR rn or rn
|
|
ORRNc 5
|
|
NEWSYM FxOpdC6 ; OR rn or rn
|
|
ORRNc 6
|
|
NEWSYM FxOpdC7 ; OR rn or rn
|
|
ORRNc 7
|
|
NEWSYM FxOpdC8 ; OR rn or rn
|
|
ORRNc 8
|
|
NEWSYM FxOpdC9 ; OR rn or rn
|
|
ORRNc 9
|
|
NEWSYM FxOpdCA ; OR rn or rn
|
|
ORRNc 10
|
|
NEWSYM FxOpdCB ; OR rn or rn
|
|
ORRNc 11
|
|
NEWSYM FxOpdCC ; OR rn or rn
|
|
ORRNc 12
|
|
NEWSYM FxOpdCD ; OR rn or rn
|
|
ORRNc 13
|
|
NEWSYM FxOpdCE ; OR rn or rn
|
|
ORRNc 14
|
|
NEWSYM FxOpdCF ; OR rn or rn
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,ebp
|
|
FETCHPIPE
|
|
sub ebx,[SfxCPB]
|
|
or eax,ebx
|
|
inc ebp
|
|
mov [edi],eax ; Write DREG
|
|
mov [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdC1A1 ; XOR rn xor rn
|
|
XORRNc 1
|
|
NEWSYM FxOpdC2A1 ; XOR rn xor rn
|
|
XORRNc 2
|
|
NEWSYM FxOpdC3A1 ; XOR rn xor rn
|
|
XORRNc 3
|
|
NEWSYM FxOpdC4A1 ; XOR rn xor rn
|
|
XORRNc 4
|
|
NEWSYM FxOpdC5A1 ; XOR rn xor rn
|
|
XORRNc 5
|
|
NEWSYM FxOpdC6A1 ; XOR rn xor rn
|
|
XORRNc 6
|
|
NEWSYM FxOpdC7A1 ; XOR rn xor rn
|
|
XORRNc 7
|
|
NEWSYM FxOpdC8A1 ; XOR rn xor rn
|
|
XORRNc 8
|
|
NEWSYM FxOpdC9A1 ; XOR rn xor rn
|
|
XORRNc 9
|
|
NEWSYM FxOpdCAA1 ; XOR rn xor rn
|
|
XORRNc 10
|
|
NEWSYM FxOpdCBA1 ; XOR rn xor rn
|
|
XORRNc 11
|
|
NEWSYM FxOpdCCA1 ; XOR rn xor rn
|
|
XORRNc 12
|
|
NEWSYM FxOpdCDA1 ; XOR rn xor rn
|
|
XORRNc 13
|
|
NEWSYM FxOpdCEA1 ; XOR rn xor rn
|
|
XORRNc 14
|
|
NEWSYM FxOpdCFA1 ; XOR rn xor rn
|
|
FETCHPIPE
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
xor eax,ebx
|
|
inc ebp
|
|
mov [edi],eax ; Write DREG
|
|
mov [SfxSignZero],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdC1A2 ; OR #n OR #n
|
|
ORIc 1
|
|
NEWSYM FxOpdC2A2 ; OR #n OR #n
|
|
ORIc 2
|
|
NEWSYM FxOpdC3A2 ; OR #n OR #n
|
|
ORIc 3
|
|
NEWSYM FxOpdC4A2 ; OR #n OR #n
|
|
ORIc 4
|
|
NEWSYM FxOpdC5A2 ; OR #n OR #n
|
|
ORIc 5
|
|
NEWSYM FxOpdC6A2 ; OR #n OR #n
|
|
ORIc 6
|
|
NEWSYM FxOpdC7A2 ; OR #n OR #n
|
|
ORIc 7
|
|
NEWSYM FxOpdC8A2 ; OR #n OR #n
|
|
ORIc 8
|
|
NEWSYM FxOpdC9A2 ; OR #n OR #n
|
|
ORIc 9
|
|
NEWSYM FxOpdCAA2 ; OR #n OR #n
|
|
ORIc 10
|
|
NEWSYM FxOpdCBA2 ; OR #n OR #n
|
|
ORIc 11
|
|
NEWSYM FxOpdCCA2 ; OR #n OR #n
|
|
ORIc 12
|
|
NEWSYM FxOpdCDA2 ; OR #n OR #n
|
|
ORIc 13
|
|
NEWSYM FxOpdCEA2 ; OR #n OR #n
|
|
ORIc 14
|
|
NEWSYM FxOpdCFA2 ; OR #n OR #n
|
|
ORIc 15
|
|
|
|
NEWSYM FxOpdC1A3 ; XOR #n xor #n
|
|
XORIc 1
|
|
NEWSYM FxOpdC2A3 ; XOR #n xor #n
|
|
XORIc 2
|
|
NEWSYM FxOpdC3A3 ; XOR #n xor #n
|
|
XORIc 3
|
|
NEWSYM FxOpdC4A3 ; XOR #n xor #n
|
|
XORIc 4
|
|
NEWSYM FxOpdC5A3 ; XOR #n xor #n
|
|
XORIc 5
|
|
NEWSYM FxOpdC6A3 ; XOR #n xor #n
|
|
XORIc 6
|
|
NEWSYM FxOpdC7A3 ; XOR #n xor #n
|
|
XORIc 7
|
|
NEWSYM FxOpdC8A3 ; XOR #n xor #n
|
|
XORIc 8
|
|
NEWSYM FxOpdC9A3 ; XOR #n xor #n
|
|
XORIc 9
|
|
NEWSYM FxOpdCAA3 ; XOR #n xor #n
|
|
XORIc 10
|
|
NEWSYM FxOpdCBA3 ; XOR #n xor #n
|
|
XORIc 11
|
|
NEWSYM FxOpdCCA3 ; XOR #n xor #n
|
|
XORIc 12
|
|
NEWSYM FxOpdCDA3 ; XOR #n xor #n
|
|
XORIc 13
|
|
NEWSYM FxOpdCEA3 ; XOR #n xor #n
|
|
XORIc 14
|
|
NEWSYM FxOpdCFA3 ; XOR #n xor #n
|
|
XORIc 15
|
|
|
|
NEWSYM FxOpdD0 ; INC rn increase by one
|
|
INCRNc 0
|
|
NEWSYM FxOpdD1 ; INC rn increase by one
|
|
INCRNc 1
|
|
NEWSYM FxOpdD2 ; INC rn increase by one
|
|
INCRNc 2
|
|
NEWSYM FxOpdD3 ; INC rn increase by one
|
|
INCRNc 3
|
|
NEWSYM FxOpdD4 ; INC rn increase by one
|
|
INCRNc 4
|
|
NEWSYM FxOpdD5 ; INC rn increase by one
|
|
INCRNc 5
|
|
NEWSYM FxOpdD6 ; INC rn increase by one
|
|
INCRNc 6
|
|
NEWSYM FxOpdD7 ; INC rn increase by one
|
|
INCRNc 7
|
|
NEWSYM FxOpdD8 ; INC rn increase by one
|
|
INCRNc 8
|
|
NEWSYM FxOpdD9 ; INC rn increase by one
|
|
INCRNc 9
|
|
NEWSYM FxOpdDA ; INC rn increase by one
|
|
INCRNc 10
|
|
NEWSYM FxOpdDB ; INC rn increase by one
|
|
INCRNc 11
|
|
NEWSYM FxOpdDC ; INC rn increase by one
|
|
INCRNc 12
|
|
NEWSYM FxOpdDD ; INC rn increase by one
|
|
INCRNc 13
|
|
NEWSYM FxOpdDE ; INC rn increase by one
|
|
FETCHPIPE
|
|
mov eax,[SfxR0+14*4] ; Read Source
|
|
inc ax
|
|
mov [SfxR0+14*4],eax
|
|
mov [SfxSignZero],eax
|
|
CLRFLAGS
|
|
inc ebp
|
|
UpdateR14
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdDF ; GETC transfer ROM buffer to color register
|
|
mov eax,[SfxRomBuffer]
|
|
FETCHPIPE
|
|
mov eax,[eax]
|
|
test byte[SfxPOR],04h
|
|
jz .nohighnibble
|
|
mov bl,al
|
|
shr bl,4
|
|
and al,0F0h
|
|
or al,bl
|
|
.nohighnibble
|
|
test byte[SfxPOR],08h
|
|
jnz .preserveupper
|
|
cmp [SfxCOLR],al
|
|
je .nocolchange
|
|
mov [SfxCOLR],al
|
|
and eax,0FFh
|
|
mov ebx,[fxbit01+eax*4]
|
|
mov [fxbit01pcal],ebx
|
|
mov ebx,[fxbit23+eax*4]
|
|
mov [fxbit23pcal],ebx
|
|
mov ebx,[fxbit45+eax*4]
|
|
mov [fxbit45pcal],ebx
|
|
mov ebx,[fxbit67+eax*4]
|
|
mov [fxbit67pcal],ebx
|
|
.nocolchange
|
|
CLRFLAGS
|
|
inc ebp ; Increase program counter
|
|
FXReturn
|
|
.preserveupper
|
|
mov bl,[SfxCOLR]
|
|
and al,0Fh
|
|
and bl,0F0h
|
|
or al,bl
|
|
cmp [SfxCOLR],al
|
|
je .nocolchange
|
|
mov [SfxCOLR],al
|
|
and eax,0FFh
|
|
mov ebx,[fxbit01+eax*4]
|
|
mov [fxbit01pcal],ebx
|
|
mov ebx,[fxbit23+eax*4]
|
|
mov [fxbit23pcal],ebx
|
|
mov ebx,[fxbit45+eax*4]
|
|
mov [fxbit45pcal],ebx
|
|
mov ebx,[fxbit67+eax*4]
|
|
mov [fxbit67pcal],ebx
|
|
CLRFLAGS
|
|
inc ebp ; Increase program counter
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdDFA2 ; RAMB set current RAM bank ; Verified
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,[SfxnRamBanks]
|
|
FETCHPIPE
|
|
dec ebx
|
|
and eax,ebx
|
|
mov dword [SfxRAMBR],eax
|
|
shl eax,16
|
|
add eax,[sfxramdata]
|
|
mov dword [SfxRAMMem],eax
|
|
CLRFLAGS
|
|
inc ebp
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdDFA3 ; ROMB set current ROM bank ; Verified
|
|
mov eax,[esi] ; Read Source
|
|
and eax,07Fh
|
|
FETCHPIPE
|
|
mov dword [SfxROMBR],eax
|
|
mov eax,[SfxMemTable+eax*4]
|
|
mov [SfxCROM],eax
|
|
CLRFLAGS
|
|
inc ebp
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdE0 ; DEC rn decrement by one
|
|
DECRNc 0
|
|
NEWSYM FxOpdE1 ; DEC rn decrement by one
|
|
DECRNc 1
|
|
NEWSYM FxOpdE2 ; DEC rn decrement by one
|
|
DECRNc 2
|
|
NEWSYM FxOpdE3 ; DEC rn decrement by one
|
|
DECRNc 3
|
|
NEWSYM FxOpdE4 ; DEC rn decrement by one
|
|
DECRNc 4
|
|
NEWSYM FxOpdE5 ; DEC rn decrement by one
|
|
DECRNc 5
|
|
NEWSYM FxOpdE6 ; DEC rn decrement by one
|
|
DECRNc 6
|
|
NEWSYM FxOpdE7 ; DEC rn decrement by one
|
|
DECRNc 7
|
|
NEWSYM FxOpdE8 ; DEC rn decrement by one
|
|
DECRNc 8
|
|
NEWSYM FxOpdE9 ; DEC rn decrement by one
|
|
DECRNc 9
|
|
NEWSYM FxOpdEA ; DEC rn decrement by one
|
|
DECRNc 10
|
|
NEWSYM FxOpdEB ; DEC rn decrement by one
|
|
DECRNc 11
|
|
NEWSYM FxOpdEC ; DEC rn decrement by one
|
|
DECRNc 12
|
|
NEWSYM FxOpdED ; DEC rn decrement by one
|
|
DECRNc 13
|
|
NEWSYM FxOpdEE ; DEC rn decrement by one
|
|
dec word[SfxR0+14*4]
|
|
FETCHPIPE
|
|
mov eax,[SfxR0+14*4] ; Read Source
|
|
mov [SfxSignZero],eax
|
|
UpdateR14
|
|
CLRFLAGS
|
|
inc ebp
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdEF ; getb get byte from ROM at address R14 ; V
|
|
FETCHPIPE
|
|
mov eax,[SfxRomBuffer]
|
|
inc ebp
|
|
mov eax,[eax]
|
|
and eax,0FFh
|
|
; cmp edi,SfxR15
|
|
; je .nor15
|
|
mov [edi],eax ; Write DREG
|
|
CLRFLAGS
|
|
FXReturn
|
|
.nor15
|
|
or eax,8000h
|
|
mov [edi],eax ; Write DREG
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
add eax,ebp
|
|
sub eax,[SfxCPB]
|
|
mov [SfxR15],eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdEFA1 ; getbh get high-byte from ROM at address R14 ; V
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,[SfxRomBuffer]
|
|
and eax,0FFh
|
|
FETCHPIPE
|
|
mov ah,[ebx]
|
|
inc ebp
|
|
mov [edi],eax ; Write DREG
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdEFA2 ; getbl get low-byte from ROM at address R14 ; V
|
|
mov eax,[esi] ; Read Source
|
|
mov ebx,[SfxRomBuffer]
|
|
and eax,0FF00h
|
|
FETCHPIPE
|
|
mov al,[ebx]
|
|
inc ebp
|
|
mov [edi],eax ; Write DREG
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdEFA3 ; getbs get sign extended byte from ROM at address R14 ; V
|
|
mov ebx,[SfxRomBuffer]
|
|
FETCHPIPE
|
|
movsx eax,byte[ebx]
|
|
inc ebp
|
|
mov [edi],ax ; Write DREG
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdF0 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 0
|
|
NEWSYM FxOpdF1 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 1
|
|
NEWSYM FxOpdF2 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 2
|
|
NEWSYM FxOpdF3 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 3
|
|
NEWSYM FxOpdF4 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 4
|
|
NEWSYM FxOpdF5 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 5
|
|
NEWSYM FxOpdF6 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 6
|
|
NEWSYM FxOpdF7 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 7
|
|
NEWSYM FxOpdF8 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 8
|
|
NEWSYM FxOpdF9 ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 9
|
|
NEWSYM FxOpdFA ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 10
|
|
NEWSYM FxOpdFB ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 11
|
|
NEWSYM FxOpdFC ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 12
|
|
NEWSYM FxOpdFD ; IWT RN,#xx immediate word transfer to register
|
|
IWTRNc 13
|
|
NEWSYM FxOpdFE ; IWT RN,#xx immediate word transfer to register
|
|
mov eax,[ebp]
|
|
mov cl,[ebp+2]
|
|
and eax,0FFFFh
|
|
add ebp,3
|
|
mov [SfxR0+14*4],eax
|
|
UpdateR14
|
|
CLRFLAGS
|
|
FXReturn
|
|
NEWSYM FxOpdFF ; IWT RN,#xx immediate word transfer to register
|
|
mov eax,[ebp]
|
|
mov cl,[ebp+2]
|
|
and eax,0FFFFh
|
|
mov ebp,[SfxCPB]
|
|
add ebp,eax
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdF0A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 0
|
|
NEWSYM FxOpdF1A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 1
|
|
NEWSYM FxOpdF2A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 2
|
|
NEWSYM FxOpdF3A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 3
|
|
NEWSYM FxOpdF4A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 4
|
|
NEWSYM FxOpdF5A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 5
|
|
NEWSYM FxOpdF6A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 6
|
|
NEWSYM FxOpdF7A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 7
|
|
NEWSYM FxOpdF8A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 8
|
|
NEWSYM FxOpdF9A1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 9
|
|
NEWSYM FxOpdFAA1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 10
|
|
NEWSYM FxOpdFBA1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 11
|
|
NEWSYM FxOpdFCA1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 12
|
|
NEWSYM FxOpdFDA1 ; LM RN,(XX) load word from RAM
|
|
LMRNc 13
|
|
NEWSYM FxOpdFEA1 ; LM RN,(XX) load word from RAM
|
|
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+14*4],dx ; Store Word
|
|
UpdateR14
|
|
CLRFLAGS
|
|
FXReturn
|
|
NEWSYM FxOpdFFA1 ; LM RN,(XX) load word from RAM
|
|
FETCHPIPE
|
|
mov eax,ecx
|
|
inc ebp
|
|
FETCHPIPE
|
|
inc ebp
|
|
mov ah,cl
|
|
FETCHPIPE
|
|
mov ebx,[SfxRAMMem]
|
|
mov [SfxLastRamAdr],eax
|
|
add [SfxLastRamAdr],ebx
|
|
mov dl,[eax+ebx]
|
|
xor eax,1
|
|
mov dh,[eax+ebx]
|
|
and edx,0FFFFh
|
|
mov ebp,[SfxCPB]
|
|
add ebp,edx
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxOpdF0A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 0
|
|
NEWSYM FxOpdF1A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 1
|
|
NEWSYM FxOpdF2A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 2
|
|
NEWSYM FxOpdF3A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 3
|
|
NEWSYM FxOpdF4A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 4
|
|
NEWSYM FxOpdF5A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 5
|
|
NEWSYM FxOpdF6A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 6
|
|
NEWSYM FxOpdF7A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 7
|
|
NEWSYM FxOpdF8A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 8
|
|
NEWSYM FxOpdF9A2 ; SM (XX),RN store word in RAM
|
|
SMRNc 9
|
|
NEWSYM FxOpdFAA2 ; SM (XX),RN store word in RAM
|
|
SMRNc 10
|
|
NEWSYM FxOpdFBA2 ; SM (XX),RN store word in RAM
|
|
SMRNc 11
|
|
NEWSYM FxOpdFCA2 ; SM (XX),RN store word in RAM
|
|
SMRNc 12
|
|
NEWSYM FxOpdFDA2 ; SM (XX),RN store word in RAM
|
|
SMRNc 13
|
|
NEWSYM FxOpdFEA2 ; SM (XX),RN store word in RAM
|
|
SMRNc 14
|
|
NEWSYM FxOpdFFA2 ; SM (XX),RN store word in RAM
|
|
FETCHPIPE
|
|
mov ebx,ebp
|
|
sub ebx,[SfxCPB]
|
|
mov eax,ecx
|
|
inc ebp
|
|
FETCHPIPE
|
|
inc ebp
|
|
mov ah,cl
|
|
FETCHPIPE
|
|
mov dx,bx
|
|
mov ebx,[SfxRAMMem]
|
|
mov [SfxLastRamAdr],eax
|
|
add [SfxLastRamAdr],ebx
|
|
mov [eax+ebx],dl
|
|
xor eax,1
|
|
inc ebp
|
|
mov [eax+ebx],dh
|
|
CLRFLAGS
|
|
FXReturn
|
|
|
|
NEWSYM FxEmu2CAsmEnd
|