;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 FxTable,FxTableb,FxTablec,FxTabled,SfxMemTable,flagnz,fxbit01,fxbit23 EXTSYM fxxand,sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc EXTSYM sfxramdata,fxbit45,fxbit67,SFXProc,ChangeOps EXTSYM PLOTJmpa,PLOTJmpb NEWSYM FxEmu2AsmStart %include "fxemu2.mac" ; * Optimise PLOT, COLOR! SECTION .text NEWSYM FlushCache ; Copy 512 bytes from pb:eax to SfxCACHERAM ret SECTION .bss NEWSYM tempsfx, resb 3 SECTION .data ;ALIGN=32 ; FxChip emulation by _Demo_ ; Optimised by zsKnight ; based on fxemu by lestat NEWSYM SfxR0, dd 0 ; default source/destination register NEWSYM SfxR1, dd 0 ; pixel plot X position register NEWSYM SfxR2, dd 0 ; pixel plot Y position register NEWSYM SfxR3, dd 0 ; NEWSYM SfxR4, dd 0 ; lower 16 bit result of lmult NEWSYM SfxR5, dd 0 ; NEWSYM SfxR6, dd 0 ; multiplier for fmult and lmult NEWSYM SfxR7, dd 0 ; fixed point texel X position for merge NEWSYM SfxR8, dd 0 ; fixed point texel Y position for merge NEWSYM SfxR9, dd 0 ; NEWSYM SfxR10, dd 0 ; NEWSYM SfxR11, dd 0 ; return address set by link NEWSYM SfxR12, dd 0 ; loop counter NEWSYM SfxR13, dd 0 ; loop point address NEWSYM SfxR14, dd 0 ; rom address for getb, getbh, getbl, getbs NEWSYM SfxR15, dd 0 ; program counter NEWSYM SfxSFR, dd 0 ; status flag register (16bit) ;SFR status flag register bits: ; 0 - ; 1 Z Zero flag ; 2 CY Carry flag ; 3 S Sign flag ; 4 OV Overflow flag ; 5 G Go flag (set to 1 when the GSU is running) ; 6 R Set to 1 when reading ROM using R14 address ; 7 - ; 8 ALT1 Mode set-up flag for the next instruction ; 9 ALT2 Mode set-up flag for the next instruction ;10 IL Immediate lower 8-bit flag ;11 IH Immediate higher 8-bit flag ;12 B Set to 1 when the WITH instruction is executed ;13 - ;14 - ;15 IRQ Set to 1 when GSU caused an interrupt ; Set to 0 when read by 658c16 NEWSYM SfxBRAMR, dd 0 ; backup ram read only on/off (8bit) NEWSYM SfxPBR, dd 0 ; program bank register (8bit) NEWSYM SfxROMBR, dd 0 ; rom bank register (8bit) NEWSYM SfxCFGR, dd 0 ; control flags register (8bit) NEWSYM SfxSCBR, dd 0 ; screen bank register (8bit) NEWSYM SfxCLSR, dd 0 ; clock speed register (8bit) NEWSYM SfxSCMR, dd 0 ; screen mode register (8bit) NEWSYM SfxVCR, dd 0 ; version code register (8bit) NEWSYM SfxRAMBR, dd 0 ; ram bank register (8bit) NEWSYM SfxCBR, dd 0 ; cache base register (16bit) NEWSYM SfxCOLR, dd 0 ; Internal color register NEWSYM SfxPOR, dd 0 ; Plot option register NEWSYM SfxCacheFlags, dd 0 ; Saying what parts of the cache was written to NEWSYM SfxLastRamAdr, dd 0 ; Last RAM address accessed NEWSYM SfxDREG, dd 0 ; Current destination register index NEWSYM SfxSREG, dd 0 ; Current source register index NEWSYM SfxRomBuffer, dd 0 ; Current byte read by R14 NEWSYM SfxPIPE, dd 0 ; Instructionset pipe NEWSYM SfxPipeAdr, dd 0 ; The address of where the pipe was read from NEWSYM SfxnRamBanks, dd 4 ; Number of 64kb-banks in FxRam (Don't confuse it with SNES-Ram!!!) NEWSYM SfxnRomBanks, dd 0 ; Number of 32kb-banks in Cart-ROM NEWSYM SfxvScreenHeight, dd 0 ; 128, 160 or 192 NEWSYM SfxvScreenSize, dd 0 NEWSYM SfxCacheActive, dd 0 ; Cache Active NEWSYM SfxCarry, dd 0 ; Carry flag NEWSYM SfxSignZero, dd 1 ; Sign and Zero flag NEWSYM SfxB, dd 0 ; B flag (1 when with instruction executed) NEWSYM SfxOverflow, dd 0 ; Overflow flag NEWSYM SfxCACHERAM, times 512 db 0 ; 512 bytes of GSU cache memory num2writesfxreg equ $-SfxR0 ; pharos equ hack *sigh* NEWSYM PHnum2writesfxreg, dd num2writesfxreg NEWSYM SfxCPB, dd 0 NEWSYM SfxCROM, dd 0 NEWSYM SfxRAMMem, dd 0 NEWSYM withr15sk, dd 0 NEWSYM sfxclineloc, dd 0 NEWSYM SCBRrel, dd 0 NEWSYM fxbit01pcal, dd 0 NEWSYM fxbit23pcal, dd 0 NEWSYM fxbit45pcal, dd 0 NEWSYM fxbit67pcal, dd 0 ;SfxRAM times 256*1024 db 0 ; If we need this later... SECTION .text NEWSYM FxOp00 ; 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 mov dword[SFXProc],0 xor cl,cl ret NEWSYM FxOp01 ; NOP no operation ; Verified. FETCHPIPE CLRFLAGS inc ebp ; Increase program counter ret NEWSYM FxOp02 ; 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 ret NEWSYM FxOp03 ; 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 ret NEWSYM FxOp04 ; 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 ret NEWSYM FxOp05 ; BRA branch always ; Verified. movsx eax,byte[ebp] mov cl,[ebp+1] inc ebp add ebp,eax call [FxTable+ecx*4] ret NEWSYM FxOp06 ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp07 ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp08 ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp09 ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp0A ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp0B ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp0C ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp0D ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp0E ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp0F ; 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] ret .nojump inc ebp call [FxTable+ecx*4] ret NEWSYM FxOp10 ; TO RN set register n as destination register TORN 0 NEWSYM FxOp11 ; TO RN set register n as destination register TORN 1 NEWSYM FxOp12 ; TO RN set register n as destination register TORN 2 NEWSYM FxOp13 ; TO RN set register n as destination register TORN 3 NEWSYM FxOp14 ; TO RN set register n as destination register TORN 4 NEWSYM FxOp15 ; TO RN set register n as destination register TORN 5 NEWSYM FxOp16 ; TO RN set register n as destination register TORN 6 NEWSYM FxOp17 ; TO RN set register n as destination register TORN 7 NEWSYM FxOp18 ; TO RN set register n as destination register TORN 8 NEWSYM FxOp19 ; TO RN set register n as destination register TORN 9 NEWSYM FxOp1A ; TO RN set register n as destination register TORN 10 NEWSYM FxOp1B ; TO RN set register n as destination register TORN 11 NEWSYM FxOp1C ; TO RN set register n as destination register TORN 12 NEWSYM FxOp1D ; TO RN set register n as destination register TORN 13 NEWSYM FxOp1E ; TO RN set register n as destination register FETCHPIPE mov edi,SfxR0+14*4 inc ebp call [FxTable+ecx*4] mov edi,SfxR0 UpdateR14 ret NEWSYM FxOp1F ; 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 ret NEWSYM FxOp20 ; WITH set register n as source and destination register WITH 0 NEWSYM FxOp21 ; WITH set register n as source and destination register WITH 1 NEWSYM FxOp22 ; WITH set register n as source and destination register WITH 2 NEWSYM FxOp23 ; WITH set register n as source and destination register WITH 3 NEWSYM FxOp24 ; WITH set register n as source and destination register WITH 4 NEWSYM FxOp25 ; WITH set register n as source and destination register WITH 5 NEWSYM FxOp26 ; WITH set register n as source and destination register WITH 6 NEWSYM FxOp27 ; WITH set register n as source and destination register WITH 7 NEWSYM FxOp28 ; WITH set register n as source and destination register WITH 8 NEWSYM FxOp29 ; WITH set register n as source and destination register WITH 9 NEWSYM FxOp2A ; WITH set register n as source and destination register WITH 10 NEWSYM FxOp2B ; WITH set register n as source and destination register WITH 11 NEWSYM FxOp2C ; WITH set register n as source and destination register WITH 12 NEWSYM FxOp2D ; WITH set register n as source and destination register WITH 13 NEWSYM FxOp2E ; 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 ret NEWSYM FxOp2F ; 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 ret NEWSYM FxOp30 ; STW RN store word STWRN 0 NEWSYM FxOp31 ; STW RN store word STWRN 1 NEWSYM FxOp32 ; STW RN store word STWRN 2 NEWSYM FxOp33 ; STW RN store word STWRN 3 NEWSYM FxOp34 ; STW RN store word STWRN 4 NEWSYM FxOp35 ; STW RN store word STWRN 5 NEWSYM FxOp36 ; STW RN store word STWRN 6 NEWSYM FxOp37 ; STW RN store word STWRN 7 NEWSYM FxOp38 ; STW RN store word STWRN 8 NEWSYM FxOp39 ; STW RN store word STWRN 9 NEWSYM FxOp3A ; STW RN store word STWRN 10 NEWSYM FxOp3B ; STW RN store word STWRN 11 NEWSYM FxOp30A1 ; STB RN store byte STBRN 0 NEWSYM FxOp31A1 ; STB RN store byte STBRN 1 NEWSYM FxOp32A1 ; STB RN store byte STBRN 2 NEWSYM FxOp33A1 ; STB RN store byte STBRN 3 NEWSYM FxOp34A1 ; STB RN store byte STBRN 4 NEWSYM FxOp35A1 ; STB RN store byte STBRN 5 NEWSYM FxOp36A1 ; STB RN store byte STBRN 6 NEWSYM FxOp37A1 ; STB RN store byte STBRN 7 NEWSYM FxOp38A1 ; STB RN store byte STBRN 8 NEWSYM FxOp39A1 ; STB RN store byte STBRN 9 NEWSYM FxOp3AA1 ; STB RN store byte STBRN 10 NEWSYM FxOp3BA1 ; STB RN store byte STBRN 11 NEWSYM FxOp3C ; 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 ret .NoBranch inc ebp CLRFLAGS ret NEWSYM FxOp3D ; ALT1 set alt1 mode ; Verified. FETCHPIPE mov dword [SfxB],0 or ch,01h inc ebp call [FxTable+ecx*4] xor ch,ch ret NEWSYM FxOp3E ; ALT2 set alt1 mode ; Verified. FETCHPIPE mov dword [SfxB],0 or ch,02h inc ebp call [FxTable+ecx*4] xor ch,ch ret NEWSYM FxOp3F ; ALT3 set alt3 mode ; Verified. FETCHPIPE mov dword [SfxB],0 or ch,03h inc ebp call [FxTable+ecx*4] xor ch,ch ret NEWSYM FxOp40 ; LDW RN load word from RAM LDWRN 0 NEWSYM FxOp41 ; LDW RN load word from RAM LDWRN 1 NEWSYM FxOp42 ; LDW RN load word from RAM LDWRN 2 NEWSYM FxOp43 ; LDW RN load word from RAM LDWRN 3 NEWSYM FxOp44 ; LDW RN load word from RAM LDWRN 4 NEWSYM FxOp45 ; LDW RN load word from RAM LDWRN 5 NEWSYM FxOp46 ; LDW RN load word from RAM LDWRN 6 NEWSYM FxOp47 ; LDW RN load word from RAM LDWRN 7 NEWSYM FxOp48 ; LDW RN load word from RAM LDWRN 8 NEWSYM FxOp49 ; LDW RN load word from RAM LDWRN 9 NEWSYM FxOp4A ; LDW RN load word from RAM LDWRN 10 NEWSYM FxOp4B ; LDW RN load word from RAM LDWRN 11 NEWSYM FxOp40A1 ; LDB RN load byte from RAM LDBRN 0 NEWSYM FxOp41A1 ; LDB RN load byte from RAM LDBRN 1 NEWSYM FxOp42A1 ; LDB RN load byte from RAM LDBRN 2 NEWSYM FxOp43A1 ; LDB RN load byte from RAM LDBRN 3 NEWSYM FxOp44A1 ; LDB RN load byte from RAM LDBRN 4 NEWSYM FxOp45A1 ; LDB RN load byte from RAM LDBRN 5 NEWSYM FxOp46A1 ; LDB RN load byte from RAM LDBRN 6 NEWSYM FxOp47A1 ; LDB RN load byte from RAM LDBRN 7 NEWSYM FxOp48A1 ; LDB RN load byte from RAM LDBRN 8 NEWSYM FxOp49A1 ; LDB RN load byte from RAM LDBRN 9 NEWSYM FxOp4AA1 ; LDB RN load byte from RAM LDBRN 10 NEWSYM FxOp4BA1 ; LDB RN load byte from RAM LDBRN 11 NEWSYM FxOp4C1284b ; PLOT 4bit plotlines4b plotb NEWSYM FxOp4C1284bz ; PLOT 4bit, zero check plotlines4b plotbz NEWSYM FxOp4C1284bd ; PLOT 4bit, dither plotlines4b plotbd NEWSYM FxOp4C1284bzd ; PLOT 4bit, zero check + dither plotlines4b plotbzd NEWSYM FxOp4C1282b ; PLOT 2bit plotlines2b plotb NEWSYM FxOp4C1282bz ; PLOT 2bit, zero check plotlines2b plotbz NEWSYM FxOp4C1282bd ; PLOT 2bit, dither plotlines2b plotbd NEWSYM FxOp4C1282bzd ; PLOT 2bit, zero check + dither plotlines2b plotbzd NEWSYM FxOp4C1288b ; PLOT 8bit plotlines8b plotb NEWSYM FxOp4C1288bz ; PLOT 8bit, zero check plotlines8b plotbz NEWSYM FxOp4C1288bd ; PLOT 8bit, dither plotlines8b plotbd NEWSYM FxOp4C1288bzd ; PLOT 8bit, zero check + dither plotlines8b plotbzd NEWSYM FxOp4C1288bl ; PLOT 8bit plotlines8bl plotb NEWSYM FxOp4C1288bzl ; PLOT 8bit, zero check plotlines8bl plotbz NEWSYM FxOp4C1288bdl ; PLOT 8bit, dither plotlines8bl plotbd NEWSYM FxOp4C1288bzdl ; PLOT 8bit, zero check + dither plotlines8bl plotbzd NEWSYM FxOp4C ; PLOT plot pixel with R1,R2 as x,y and the color register as the color jmp FxOp4C1284b 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] ret .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] ret .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] ret SECTION .bss .prevx resw 1 .prevy resw 1 sfxwarning resb 1 SECTION .text NEWSYM FxOp4CA1 ; 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 ret .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 ret .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 ret NEWSYM FxOp4D ; 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 ret NEWSYM FxOp4E ; 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 ret .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 ret NEWSYM FxOp4EA1 ; 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 ret NEWSYM FxOp4F ; 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 ret NEWSYM FxOp50 ; ADD RN add, register + register ADDRN 0 NEWSYM FxOp51 ; ADD RN add, register + register ADDRN 1 NEWSYM FxOp52 ; ADD RN add, register + register ADDRN 2 NEWSYM FxOp53 ; ADD RN add, register + register ADDRN 3 NEWSYM FxOp54 ; ADD RN add, register + register ADDRN 4 NEWSYM FxOp55 ; ADD RN add, register + register ADDRN 5 NEWSYM FxOp56 ; ADD RN add, register + register ADDRN 6 NEWSYM FxOp57 ; ADD RN add, register + register ADDRN 7 NEWSYM FxOp58 ; ADD RN add, register + register ADDRN 8 NEWSYM FxOp59 ; ADD RN add, register + register ADDRN 9 NEWSYM FxOp5A ; ADD RN add, register + register ADDRN 10 NEWSYM FxOp5B ; ADD RN add, register + register ADDRN 11 NEWSYM FxOp5C ; ADD RN add, register + register ADDRN 12 NEWSYM FxOp5D ; ADD RN add, register + register ADDRN 13 NEWSYM FxOp5E ; ADD RN add, register + register ADDRN 14 NEWSYM FxOp5F ; 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 ret NEWSYM FxOp50A1 ; ADC RN add with carry, register + register ADCRN 0 NEWSYM FxOp51A1 ; ADC RN add with carry, register + register ADCRN 1 NEWSYM FxOp52A1 ; ADC RN add with carry, register + register ADCRN 2 NEWSYM FxOp53A1 ; ADC RN add with carry, register + register ADCRN 3 NEWSYM FxOp54A1 ; ADC RN add with carry, register + register ADCRN 4 NEWSYM FxOp55A1 ; ADC RN add with carry, register + register ADCRN 5 NEWSYM FxOp56A1 ; ADC RN add with carry, register + register ADCRN 6 NEWSYM FxOp57A1 ; ADC RN add with carry, register + register ADCRN 7 NEWSYM FxOp58A1 ; ADC RN add with carry, register + register ADCRN 8 NEWSYM FxOp59A1 ; ADC RN add with carry, register + register ADCRN 9 NEWSYM FxOp5AA1 ; ADC RN add with carry, register + register ADCRN 10 NEWSYM FxOp5BA1 ; ADC RN add with carry, register + register ADCRN 11 NEWSYM FxOp5CA1 ; ADC RN add with carry, register + register ADCRN 12 NEWSYM FxOp5DA1 ; ADC RN add with carry, register + register ADCRN 13 NEWSYM FxOp5EA1 ; ADC RN add with carry, register + register ADCRN 14 NEWSYM FxOp5FA1 ; 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 ret ; Weird opcode (FxOp50A2, add 0, wow!) NEWSYM FxOp50A2 ; ADI RN add, register + immediate ADIRN 0 NEWSYM FxOp51A2 ; ADI RN add, register + immediate ADIRN 1 NEWSYM FxOp52A2 ; ADI RN add, register + immediate ADIRN 2 NEWSYM FxOp53A2 ; ADI RN add, register + immediate ADIRN 3 NEWSYM FxOp54A2 ; ADI RN add, register + immediate ADIRN 4 NEWSYM FxOp55A2 ; ADI RN add, register + immediate ADIRN 5 NEWSYM FxOp56A2 ; ADI RN add, register + immediate ADIRN 6 NEWSYM FxOp57A2 ; ADI RN add, register + immediate ADIRN 7 NEWSYM FxOp58A2 ; ADI RN add, register + immediate ADIRN 8 NEWSYM FxOp59A2 ; ADI RN add, register + immediate ADIRN 9 NEWSYM FxOp5AA2 ; ADI RN add, register + immediate ADIRN 10 NEWSYM FxOp5BA2 ; ADI RN add, register + immediate ADIRN 11 NEWSYM FxOp5CA2 ; ADI RN add, register + immediate ADIRN 12 NEWSYM FxOp5DA2 ; ADI RN add, register + immediate ADIRN 13 NEWSYM FxOp5EA2 ; ADI RN add, register + immediate ADIRN 14 NEWSYM FxOp5FA2 ; ADI RN add, register + immediate ADIRN 15 ; Another very useful opcode NEWSYM FxOp50A3 ; ADCIRN add with carry, register + immediate ADCIRN 0 NEWSYM FxOp51A3 ; ADCIRN add with carry, register + immediate ADCIRN 1 NEWSYM FxOp52A3 ; ADCIRN add with carry, register + immediate ADCIRN 2 NEWSYM FxOp53A3 ; ADCIRN add with carry, register + immediate ADCIRN 3 NEWSYM FxOp54A3 ; ADCIRN add with carry, register + immediate ADCIRN 4 NEWSYM FxOp55A3 ; ADCIRN add with carry, register + immediate ADCIRN 5 NEWSYM FxOp56A3 ; ADCIRN add with carry, register + immediate ADCIRN 6 NEWSYM FxOp57A3 ; ADCIRN add with carry, register + immediate ADCIRN 7 NEWSYM FxOp58A3 ; ADCIRN add with carry, register + immediate ADCIRN 8 NEWSYM FxOp59A3 ; ADCIRN add with carry, register + immediate ADCIRN 9 NEWSYM FxOp5AA3 ; ADCIRN add with carry, register + immediate ADCIRN 10 NEWSYM FxOp5BA3 ; ADCIRN add with carry, register + immediate ADCIRN 11 NEWSYM FxOp5CA3 ; ADCIRN add with carry, register + immediate ADCIRN 12 NEWSYM FxOp5DA3 ; ADCIRN add with carry, register + immediate ADCIRN 13 NEWSYM FxOp5EA3 ; ADCIRN add with carry, register + immediate ADCIRN 14 NEWSYM FxOp5FA3 ; ADCIRN add with carry, register + immediate ADCIRN 15 NEWSYM FxOp60 ; SUBRN subtract, register - register SUBRN 0 NEWSYM FxOp61 ; SUBRN subtract, register - register SUBRN 1 NEWSYM FxOp62 ; SUBRN subtract, register - register SUBRN 2 NEWSYM FxOp63 ; SUBRN subtract, register - register SUBRN 3 NEWSYM FxOp64 ; SUBRN subtract, register - register SUBRN 4 NEWSYM FxOp65 ; SUBRN subtract, register - register SUBRN 5 NEWSYM FxOp66 ; SUBRN subtract, register - register SUBRN 6 NEWSYM FxOp67 ; SUBRN subtract, register - register SUBRN 7 NEWSYM FxOp68 ; SUBRN subtract, register - register SUBRN 8 NEWSYM FxOp69 ; SUBRN subtract, register - register SUBRN 9 NEWSYM FxOp6A ; SUBRN subtract, register - register SUBRN 10 NEWSYM FxOp6B ; SUBRN subtract, register - register SUBRN 11 NEWSYM FxOp6C ; SUBRN subtract, register - register SUBRN 12 NEWSYM FxOp6D ; SUBRN subtract, register - register SUBRN 13 NEWSYM FxOp6E ; SUBRN subtract, register - register SUBRN 14 NEWSYM FxOp6F ; 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 ret NEWSYM FxOp60A1 ; SBCRN subtract with carry, register - register SBCRN 0 NEWSYM FxOp61A1 ; SBCRN subtract with carry, register - register SBCRN 1 NEWSYM FxOp62A1 ; SBCRN subtract with carry, register - register SBCRN 2 NEWSYM FxOp63A1 ; SBCRN subtract with carry, register - register SBCRN 3 NEWSYM FxOp64A1 ; SBCRN subtract with carry, register - register SBCRN 4 NEWSYM FxOp65A1 ; SBCRN subtract with carry, register - register SBCRN 5 NEWSYM FxOp66A1 ; SBCRN subtract with carry, register - register SBCRN 6 NEWSYM FxOp67A1 ; SBCRN subtract with carry, register - register SBCRN 7 NEWSYM FxOp68A1 ; SBCRN subtract with carry, register - register SBCRN 8 NEWSYM FxOp69A1 ; SBCRN subtract with carry, register - register SBCRN 9 NEWSYM FxOp6AA1 ; SBCRN subtract with carry, register - register SBCRN 10 NEWSYM FxOp6BA1 ; SBCRN subtract with carry, register - register SBCRN 11 NEWSYM FxOp6CA1 ; SBCRN subtract with carry, register - register SBCRN 12 NEWSYM FxOp6DA1 ; SBCRN subtract with carry, register - register SBCRN 13 NEWSYM FxOp6EA1 ; SBCRN subtract with carry, register - register SBCRN 14 NEWSYM FxOp6FA1 ; 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 ret NEWSYM FxOp60A2 ; SUBIRN subtract, register - immediate SUBIRN 0 NEWSYM FxOp61A2 ; SUBIRN subtract, register - immediate SUBIRN 1 NEWSYM FxOp62A2 ; SUBIRN subtract, register - immediate SUBIRN 2 NEWSYM FxOp63A2 ; SUBIRN subtract, register - immediate SUBIRN 3 NEWSYM FxOp64A2 ; SUBIRN subtract, register - immediate SUBIRN 4 NEWSYM FxOp65A2 ; SUBIRN subtract, register - immediate SUBIRN 5 NEWSYM FxOp66A2 ; SUBIRN subtract, register - immediate SUBIRN 6 NEWSYM FxOp67A2 ; SUBIRN subtract, register - immediate SUBIRN 7 NEWSYM FxOp68A2 ; SUBIRN subtract, register - immediate SUBIRN 8 NEWSYM FxOp69A2 ; SUBIRN subtract, register - immediate SUBIRN 9 NEWSYM FxOp6AA2 ; SUBIRN subtract, register - immediate SUBIRN 10 NEWSYM FxOp6BA2 ; SUBIRN subtract, register - immediate SUBIRN 11 NEWSYM FxOp6CA2 ; SUBIRN subtract, register - immediate SUBIRN 12 NEWSYM FxOp6DA2 ; SUBIRN subtract, register - immediate SUBIRN 13 NEWSYM FxOp6EA2 ; SUBIRN subtract, register - immediate SUBIRN 14 NEWSYM FxOp6FA2 ; SUBIRN subtract, register - immediate SUBIRN 15 NEWSYM FxOp60A3 ; CMPRN compare, register, register CMPRN 0 NEWSYM FxOp61A3 ; CMPRN compare, register, register CMPRN 1 NEWSYM FxOp62A3 ; CMPRN compare, register, register CMPRN 2 NEWSYM FxOp63A3 ; CMPRN compare, register, register CMPRN 3 NEWSYM FxOp64A3 ; CMPRN compare, register, register CMPRN 4 NEWSYM FxOp65A3 ; CMPRN compare, register, register CMPRN 5 NEWSYM FxOp66A3 ; CMPRN compare, register, register CMPRN 6 NEWSYM FxOp67A3 ; CMPRN compare, register, register CMPRN 7 NEWSYM FxOp68A3 ; CMPRN compare, register, register CMPRN 8 NEWSYM FxOp69A3 ; CMPRN compare, register, register CMPRN 9 NEWSYM FxOp6AA3 ; CMPRN compare, register, register CMPRN 10 NEWSYM FxOp6BA3 ; CMPRN compare, register, register CMPRN 11 NEWSYM FxOp6CA3 ; CMPRN compare, register, register CMPRN 12 NEWSYM FxOp6DA3 ; CMPRN compare, register, register CMPRN 13 NEWSYM FxOp6EA3 ; CMPRN compare, register, register CMPRN 14 NEWSYM FxOp6FA3 ; 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 ret NEWSYM FxOp70 ; 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 ret NEWSYM FxOp71 ; AND RN register & register ANDRN 1 NEWSYM FxOp72 ; AND RN register & register ANDRN 2 NEWSYM FxOp73 ; AND RN register & register ANDRN 3 NEWSYM FxOp74 ; AND RN register & register ANDRN 4 NEWSYM FxOp75 ; AND RN register & register ANDRN 5 NEWSYM FxOp76 ; AND RN register & register ANDRN 6 NEWSYM FxOp77 ; AND RN register & register ANDRN 7 NEWSYM FxOp78 ; AND RN register & register ANDRN 8 NEWSYM FxOp79 ; AND RN register & register ANDRN 9 NEWSYM FxOp7A ; AND RN register & register ANDRN 10 NEWSYM FxOp7B ; AND RN register & register ANDRN 11 NEWSYM FxOp7C ; AND RN register & register ANDRN 12 NEWSYM FxOp7D ; AND RN register & register ANDRN 13 NEWSYM FxOp7E ; AND RN register & register ANDRN 14 NEWSYM FxOp7F ; 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 ret NEWSYM FxOp71A1 ; BIC RN register & ~register BICRN 1 NEWSYM FxOp72A1 ; BIC RN register & ~register BICRN 2 NEWSYM FxOp73A1 ; BIC RN register & ~register BICRN 3 NEWSYM FxOp74A1 ; BIC RN register & ~register BICRN 4 NEWSYM FxOp75A1 ; BIC RN register & ~register BICRN 5 NEWSYM FxOp76A1 ; BIC RN register & ~register BICRN 6 NEWSYM FxOp77A1 ; BIC RN register & ~register BICRN 7 NEWSYM FxOp78A1 ; BIC RN register & ~register BICRN 8 NEWSYM FxOp79A1 ; BIC RN register & ~register BICRN 9 NEWSYM FxOp7AA1 ; BIC RN register & ~register BICRN 10 NEWSYM FxOp7BA1 ; BIC RN register & ~register BICRN 11 NEWSYM FxOp7CA1 ; BIC RN register & ~register BICRN 12 NEWSYM FxOp7DA1 ; BIC RN register & ~register BICRN 13 NEWSYM FxOp7EA1 ; BIC RN register & ~register BICRN 14 NEWSYM FxOp7FA1 ; 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 ret NEWSYM FxOp71A2 ; ANDIRN and #n - register & immediate ANDIRN 1 NEWSYM FxOp72A2 ; ANDIRN and #n - register & immediate ANDIRN 2 NEWSYM FxOp73A2 ; ANDIRN and #n - register & immediate ANDIRN 3 NEWSYM FxOp74A2 ; ANDIRN and #n - register & immediate ANDIRN 4 NEWSYM FxOp75A2 ; ANDIRN and #n - register & immediate ANDIRN 5 NEWSYM FxOp76A2 ; ANDIRN and #n - register & immediate ANDIRN 6 NEWSYM FxOp77A2 ; ANDIRN and #n - register & immediate ANDIRN 7 NEWSYM FxOp78A2 ; ANDIRN and #n - register & immediate ANDIRN 8 NEWSYM FxOp79A2 ; ANDIRN and #n - register & immediate ANDIRN 9 NEWSYM FxOp7AA2 ; ANDIRN and #n - register & immediate ANDIRN 10 NEWSYM FxOp7BA2 ; ANDIRN and #n - register & immediate ANDIRN 11 NEWSYM FxOp7CA2 ; ANDIRN and #n - register & immediate ANDIRN 12 NEWSYM FxOp7DA2 ; ANDIRN and #n - register & immediate ANDIRN 13 NEWSYM FxOp7EA2 ; ANDIRN and #n - register & immediate ANDIRN 14 NEWSYM FxOp7FA2 ; ANDIRN and #n - register & immediate ANDIRN 15 NEWSYM FxOp71A3 ; BICIRN register & ~immediate BICIRN 1 ^ 0FFFFh NEWSYM FxOp72A3 ; BICIRN register & ~immediate BICIRN 2 ^ 0FFFFh NEWSYM FxOp73A3 ; BICIRN register & ~immediate BICIRN 3 ^ 0FFFFh NEWSYM FxOp74A3 ; BICIRN register & ~immediate BICIRN 4 ^ 0FFFFh NEWSYM FxOp75A3 ; BICIRN register & ~immediate BICIRN 5 ^ 0FFFFh NEWSYM FxOp76A3 ; BICIRN register & ~immediate BICIRN 6 ^ 0FFFFh NEWSYM FxOp77A3 ; BICIRN register & ~immediate BICIRN 7 ^ 0FFFFh NEWSYM FxOp78A3 ; BICIRN register & ~immediate BICIRN 8 ^ 0FFFFh NEWSYM FxOp79A3 ; BICIRN register & ~immediate BICIRN 9 ^ 0FFFFh NEWSYM FxOp7AA3 ; BICIRN register & ~immediate BICIRN 10 ^ 0FFFFh NEWSYM FxOp7BA3 ; BICIRN register & ~immediate BICIRN 11 ^ 0FFFFh NEWSYM FxOp7CA3 ; BICIRN register & ~immediate BICIRN 12 ^ 0FFFFh NEWSYM FxOp7DA3 ; BICIRN register & ~immediate BICIRN 13 ^ 0FFFFh NEWSYM FxOp7EA3 ; BICIRN register & ~immediate BICIRN 14 ^ 0FFFFh NEWSYM FxOp7FA3 ; BICIRN register & ~immediate BICIRN 15 ^ 0FFFFh NEWSYM FxOp80 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 0 NEWSYM FxOp81 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 1 NEWSYM FxOp82 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 2 NEWSYM FxOp83 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 3 NEWSYM FxOp84 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 4 NEWSYM FxOp85 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 5 NEWSYM FxOp86 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 6 NEWSYM FxOp87 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 7 NEWSYM FxOp88 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 8 NEWSYM FxOp89 ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 9 NEWSYM FxOp8A ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 10 NEWSYM FxOp8B ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 11 NEWSYM FxOp8C ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 12 NEWSYM FxOp8D ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 13 NEWSYM FxOp8E ; MULTRN 8 bit to 16 bit signed multiply, register * register MULTRN 14 NEWSYM FxOp8F ; MULTRN 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 ret NEWSYM FxOp80A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 0 NEWSYM FxOp81A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 1 NEWSYM FxOp82A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 2 NEWSYM FxOp83A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 3 NEWSYM FxOp84A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 4 NEWSYM FxOp85A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 5 NEWSYM FxOp86A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 6 NEWSYM FxOp87A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 7 NEWSYM FxOp88A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 8 NEWSYM FxOp89A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 9 NEWSYM FxOp8AA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 10 NEWSYM FxOp8BA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 11 NEWSYM FxOp8CA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 12 NEWSYM FxOp8DA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 13 NEWSYM FxOp8EA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register UMULTRN 14 NEWSYM FxOp8FA1 ; 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 ret NEWSYM FxOp80A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 0 NEWSYM FxOp81A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 1 NEWSYM FxOp82A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 2 NEWSYM FxOp83A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 3 NEWSYM FxOp84A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 4 NEWSYM FxOp85A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 5 NEWSYM FxOp86A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 6 NEWSYM FxOp87A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 7 NEWSYM FxOp88A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 8 NEWSYM FxOp89A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 9 NEWSYM FxOp8AA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 10 NEWSYM FxOp8BA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 11 NEWSYM FxOp8CA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 12 NEWSYM FxOp8DA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 13 NEWSYM FxOp8EA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 14 NEWSYM FxOp8FA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate MULTIRN 15 NEWSYM FxOp80A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 0 NEWSYM FxOp81A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 1 NEWSYM FxOp82A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 2 NEWSYM FxOp83A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 3 NEWSYM FxOp84A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 4 NEWSYM FxOp85A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 5 NEWSYM FxOp86A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 6 NEWSYM FxOp87A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 7 NEWSYM FxOp88A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 8 NEWSYM FxOp89A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 9 NEWSYM FxOp8AA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 10 NEWSYM FxOp8BA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 11 NEWSYM FxOp8CA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 12 NEWSYM FxOp8DA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 13 NEWSYM FxOp8EA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 14 NEWSYM FxOp8FA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate UMULTIRN 15 NEWSYM FxOp90 ; 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 ret NEWSYM FxOp91 ; LINK#n R11 = R15 + immediate LINK 1 NEWSYM FxOp92 ; LINK#n R11 = R15 + immediate LINK 2 NEWSYM FxOp93 ; LINK#n R11 = R15 + immediate LINK 3 NEWSYM FxOp94 ; LINK#n R11 = R15 + immediate LINK 4 NEWSYM FxOp95 ; 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 ret NEWSYM FxOp96 ; 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 ret NEWSYM FxOp96A1 ; 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 ret .minusone mov byte[SfxCarry],1 xor eax,eax inc ebp ; Increase program counter mov [edi],eax ; Write Destination mov dword [SfxSignZero],eax CLRFLAGS ret NEWSYM FxOp97 ; 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 ret NEWSYM FxOp98 ; JMPRN jump to address of register JMPRN 8 NEWSYM FxOp99 ; JMPRN jump to address of register JMPRN 9 NEWSYM FxOp9A ; JMPRN jump to address of register JMPRN 10 NEWSYM FxOp9B ; JMPRN jump to address of register JMPRN 11 NEWSYM FxOp9C ; JMPRN jump to address of register JMPRN 12 NEWSYM FxOp9D ; JMPRN jump to address of register JMPRN 13 NEWSYM FxOp98A1 ; LJMPRN set program bank to source register and jump to address of register LJMPRN 8 NEWSYM FxOp99A1 ; LJMPRN set program bank to source register and jump to address of register LJMPRN 9 NEWSYM FxOp9AA1 ; LJMPRN set program bank to source register and jump to address of register LJMPRN 10 NEWSYM FxOp9BA1 ; LJMPRN set program bank to source register and jump to address of register LJMPRN 11 NEWSYM FxOp9CA1 ; LJMPRN set program bank to source register and jump to address of register LJMPRN 12 NEWSYM FxOp9DA1 ; LJMPRN set program bank to source register and jump to address of register LJMPRN 13 NEWSYM FxOp9E ; 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 ret NEWSYM FxOp9F ; 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 ret NEWSYM FxOp9FA1 ; 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 ret NEWSYM FxOpA0 ; IBTRN,#PP immediate byte transfer IBTRN 0 NEWSYM FxOpA1 ; IBTRN,#PP immediate byte transfer IBTRN 1 NEWSYM FxOpA2 ; IBTRN,#PP immediate byte transfer IBTRN 2 NEWSYM FxOpA3 ; IBTRN,#PP immediate byte transfer IBTRN 3 NEWSYM FxOpA4 ; IBTRN,#PP immediate byte transfer IBTRN 4 NEWSYM FxOpA5 ; IBTRN,#PP immediate byte transfer IBTRN 5 NEWSYM FxOpA6 ; IBTRN,#PP immediate byte transfer IBTRN 6 NEWSYM FxOpA7 ; IBTRN,#PP immediate byte transfer IBTRN 7 NEWSYM FxOpA8 ; IBTRN,#PP immediate byte transfer IBTRN 8 NEWSYM FxOpA9 ; IBTRN,#PP immediate byte transfer IBTRN 9 NEWSYM FxOpAA ; IBTRN,#PP immediate byte transfer IBTRN 10 NEWSYM FxOpAB ; IBTRN,#PP immediate byte transfer IBTRN 11 NEWSYM FxOpAC ; IBTRN,#PP immediate byte transfer IBTRN 12 NEWSYM FxOpAD ; IBTRN,#PP immediate byte transfer IBTRN 13 NEWSYM FxOpAE ; IBTRN,#PP immediate byte transfer movsx eax,byte[ebp] mov cl,[ebp+1] add ebp,2 mov [SfxR0+14*4],ax UpdateR14 CLRFLAGS ret NEWSYM FxOpAF ; IBTRN,#PP immediate byte transfer movsx eax,byte[ebp] mov cl,[ebp+1] and eax,0FFFFh mov ebp,[SfxCPB] add ebp,eax CLRFLAGS ret NEWSYM FxOpA0A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 0 NEWSYM FxOpA1A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 1 NEWSYM FxOpA2A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 2 NEWSYM FxOpA3A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 3 NEWSYM FxOpA4A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 4 NEWSYM FxOpA5A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 5 NEWSYM FxOpA6A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 6 NEWSYM FxOpA7A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 7 NEWSYM FxOpA8A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 8 NEWSYM FxOpA9A1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 9 NEWSYM FxOpAAA1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 10 NEWSYM FxOpABA1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 11 NEWSYM FxOpACA1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 12 NEWSYM FxOpADA1 ; LMS rn,(yy) load word from RAM (short address) LMSRN 13 NEWSYM FxOpAEA1 ; 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 ret NEWSYM FxOpAFA1 ; 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 ret NEWSYM FxOpA0A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 0 NEWSYM FxOpA1A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 1 NEWSYM FxOpA2A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 2 NEWSYM FxOpA3A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 3 NEWSYM FxOpA4A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 4 NEWSYM FxOpA5A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 5 NEWSYM FxOpA6A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 6 NEWSYM FxOpA7A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 7 NEWSYM FxOpA8A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 8 NEWSYM FxOpA9A2 ; SMS (yy),rn store word in RAM (short address) SMSRN 9 NEWSYM FxOpAAA2 ; SMS (yy),rn store word in RAM (short address) SMSRN 10 NEWSYM FxOpABA2 ; SMS (yy),rn store word in RAM (short address) SMSRN 11 NEWSYM FxOpACA2 ; SMS (yy),rn store word in RAM (short address) SMSRN 12 NEWSYM FxOpADA2 ; SMS (yy),rn store word in RAM (short address) SMSRN 13 NEWSYM FxOpAEA2 ; SMS (yy),rn store word in RAM (short address) SMSRN 14 NEWSYM FxOpAFA2 ; 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 ret NEWSYM FxOpB0 ; FROM rn set source register FROMRN 0 NEWSYM FxOpB1 ; FROM rn set source register FROMRN 1 NEWSYM FxOpB2 ; FROM rn set source register FROMRN 2 NEWSYM FxOpB3 ; FROM rn set source register FROMRN 3 NEWSYM FxOpB4 ; FROM rn set source register FROMRN 4 NEWSYM FxOpB5 ; FROM rn set source register FROMRN 5 NEWSYM FxOpB6 ; FROM rn set source register FROMRN 6 NEWSYM FxOpB7 ; FROM rn set source register FROMRN 7 NEWSYM FxOpB8 ; FROM rn set source register FROMRN 8 NEWSYM FxOpB9 ; FROM rn set source register FROMRN 9 NEWSYM FxOpBA ; FROM rn set source register FROMRN 10 NEWSYM FxOpBB ; FROM rn set source register FROMRN 11 NEWSYM FxOpBC ; FROM rn set source register FROMRN 12 NEWSYM FxOpBD ; FROM rn set source register FROMRN 13 NEWSYM FxOpBE ; FROM rn set source register FROMRN 14 NEWSYM FxOpBF ; 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 ret NEWSYM FxOpC0 ; 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 ret NEWSYM FxOpC1 ; OR rn or rn ORRN 1 NEWSYM FxOpC2 ; OR rn or rn ORRN 2 NEWSYM FxOpC3 ; OR rn or rn ORRN 3 NEWSYM FxOpC4 ; OR rn or rn ORRN 4 NEWSYM FxOpC5 ; OR rn or rn ORRN 5 NEWSYM FxOpC6 ; OR rn or rn ORRN 6 NEWSYM FxOpC7 ; OR rn or rn ORRN 7 NEWSYM FxOpC8 ; OR rn or rn ORRN 8 NEWSYM FxOpC9 ; OR rn or rn ORRN 9 NEWSYM FxOpCA ; OR rn or rn ORRN 10 NEWSYM FxOpCB ; OR rn or rn ORRN 11 NEWSYM FxOpCC ; OR rn or rn ORRN 12 NEWSYM FxOpCD ; OR rn or rn ORRN 13 NEWSYM FxOpCE ; OR rn or rn ORRN 14 NEWSYM FxOpCF ; 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 ret NEWSYM FxOpC1A1 ; XOR rn xor rn XORRN 1 NEWSYM FxOpC2A1 ; XOR rn xor rn XORRN 2 NEWSYM FxOpC3A1 ; XOR rn xor rn XORRN 3 NEWSYM FxOpC4A1 ; XOR rn xor rn XORRN 4 NEWSYM FxOpC5A1 ; XOR rn xor rn XORRN 5 NEWSYM FxOpC6A1 ; XOR rn xor rn XORRN 6 NEWSYM FxOpC7A1 ; XOR rn xor rn XORRN 7 NEWSYM FxOpC8A1 ; XOR rn xor rn XORRN 8 NEWSYM FxOpC9A1 ; XOR rn xor rn XORRN 9 NEWSYM FxOpCAA1 ; XOR rn xor rn XORRN 10 NEWSYM FxOpCBA1 ; XOR rn xor rn XORRN 11 NEWSYM FxOpCCA1 ; XOR rn xor rn XORRN 12 NEWSYM FxOpCDA1 ; XOR rn xor rn XORRN 13 NEWSYM FxOpCEA1 ; XOR rn xor rn XORRN 14 NEWSYM FxOpCFA1 ; 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 ret NEWSYM FxOpC1A2 ; OR #n OR #n ORI 1 NEWSYM FxOpC2A2 ; OR #n OR #n ORI 2 NEWSYM FxOpC3A2 ; OR #n OR #n ORI 3 NEWSYM FxOpC4A2 ; OR #n OR #n ORI 4 NEWSYM FxOpC5A2 ; OR #n OR #n ORI 5 NEWSYM FxOpC6A2 ; OR #n OR #n ORI 6 NEWSYM FxOpC7A2 ; OR #n OR #n ORI 7 NEWSYM FxOpC8A2 ; OR #n OR #n ORI 8 NEWSYM FxOpC9A2 ; OR #n OR #n ORI 9 NEWSYM FxOpCAA2 ; OR #n OR #n ORI 10 NEWSYM FxOpCBA2 ; OR #n OR #n ORI 11 NEWSYM FxOpCCA2 ; OR #n OR #n ORI 12 NEWSYM FxOpCDA2 ; OR #n OR #n ORI 13 NEWSYM FxOpCEA2 ; OR #n OR #n ORI 14 NEWSYM FxOpCFA2 ; OR #n OR #n ORI 15 NEWSYM FxOpC1A3 ; XOR #n xor #n XORI 1 NEWSYM FxOpC2A3 ; XOR #n xor #n XORI 2 NEWSYM FxOpC3A3 ; XOR #n xor #n XORI 3 NEWSYM FxOpC4A3 ; XOR #n xor #n XORI 4 NEWSYM FxOpC5A3 ; XOR #n xor #n XORI 5 NEWSYM FxOpC6A3 ; XOR #n xor #n XORI 6 NEWSYM FxOpC7A3 ; XOR #n xor #n XORI 7 NEWSYM FxOpC8A3 ; XOR #n xor #n XORI 8 NEWSYM FxOpC9A3 ; XOR #n xor #n XORI 9 NEWSYM FxOpCAA3 ; XOR #n xor #n XORI 10 NEWSYM FxOpCBA3 ; XOR #n xor #n XORI 11 NEWSYM FxOpCCA3 ; XOR #n xor #n XORI 12 NEWSYM FxOpCDA3 ; XOR #n xor #n XORI 13 NEWSYM FxOpCEA3 ; XOR #n xor #n XORI 14 NEWSYM FxOpCFA3 ; XOR #n xor #n XORI 15 NEWSYM FxOpD0 ; INC rn increase by one INCRN 0 NEWSYM FxOpD1 ; INC rn increase by one INCRN 1 NEWSYM FxOpD2 ; INC rn increase by one INCRN 2 NEWSYM FxOpD3 ; INC rn increase by one INCRN 3 NEWSYM FxOpD4 ; INC rn increase by one INCRN 4 NEWSYM FxOpD5 ; INC rn increase by one INCRN 5 NEWSYM FxOpD6 ; INC rn increase by one INCRN 6 NEWSYM FxOpD7 ; INC rn increase by one INCRN 7 NEWSYM FxOpD8 ; INC rn increase by one INCRN 8 NEWSYM FxOpD9 ; INC rn increase by one INCRN 9 NEWSYM FxOpDA ; INC rn increase by one INCRN 10 NEWSYM FxOpDB ; INC rn increase by one INCRN 11 NEWSYM FxOpDC ; INC rn increase by one INCRN 12 NEWSYM FxOpDD ; INC rn increase by one INCRN 13 NEWSYM FxOpDE ; 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 ret NEWSYM FxOpDF ; 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 ret .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 ret NEWSYM FxOpDFA2 ; 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 ret NEWSYM FxOpDFA3 ; 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 ret NEWSYM FxOpE0 ; DEC rn decrement by one DECRN 0 NEWSYM FxOpE1 ; DEC rn decrement by one DECRN 1 NEWSYM FxOpE2 ; DEC rn decrement by one DECRN 2 NEWSYM FxOpE3 ; DEC rn decrement by one DECRN 3 NEWSYM FxOpE4 ; DEC rn decrement by one DECRN 4 NEWSYM FxOpE5 ; DEC rn decrement by one DECRN 5 NEWSYM FxOpE6 ; DEC rn decrement by one DECRN 6 NEWSYM FxOpE7 ; DEC rn decrement by one DECRN 7 NEWSYM FxOpE8 ; DEC rn decrement by one DECRN 8 NEWSYM FxOpE9 ; DEC rn decrement by one DECRN 9 NEWSYM FxOpEA ; DEC rn decrement by one DECRN 10 NEWSYM FxOpEB ; DEC rn decrement by one DECRN 11 NEWSYM FxOpEC ; DEC rn decrement by one DECRN 12 NEWSYM FxOpED ; DEC rn decrement by one DECRN 13 NEWSYM FxOpEE ; 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 ret NEWSYM FxOpEF ; 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 ret .nor15 ; mov eax,ebp ; sub eax,[SfxCPB] ; mov [SfxR15],al or eax,8000h mov [edi],eax ; Write DREG CLRFLAGS ret NEWSYM FxOpEFA1 ; 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 ret NEWSYM FxOpEFA2 ; 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 ret NEWSYM FxOpEFA3 ; 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 ret NEWSYM FxOpF0 ; IWT RN,#xx immediate word transfer to register IWTRN 0 NEWSYM FxOpF1 ; IWT RN,#xx immediate word transfer to register IWTRN 1 NEWSYM FxOpF2 ; IWT RN,#xx immediate word transfer to register IWTRN 2 NEWSYM FxOpF3 ; IWT RN,#xx immediate word transfer to register IWTRN 3 NEWSYM FxOpF4 ; IWT RN,#xx immediate word transfer to register IWTRN 4 NEWSYM FxOpF5 ; IWT RN,#xx immediate word transfer to register IWTRN 5 NEWSYM FxOpF6 ; IWT RN,#xx immediate word transfer to register IWTRN 6 NEWSYM FxOpF7 ; IWT RN,#xx immediate word transfer to register IWTRN 7 NEWSYM FxOpF8 ; IWT RN,#xx immediate word transfer to register IWTRN 8 NEWSYM FxOpF9 ; IWT RN,#xx immediate word transfer to register IWTRN 9 NEWSYM FxOpFA ; IWT RN,#xx immediate word transfer to register IWTRN 10 NEWSYM FxOpFB ; IWT RN,#xx immediate word transfer to register IWTRN 11 NEWSYM FxOpFC ; IWT RN,#xx immediate word transfer to register IWTRN 12 NEWSYM FxOpFD ; IWT RN,#xx immediate word transfer to register IWTRN 13 NEWSYM FxOpFE ; 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 ret NEWSYM FxOpFF ; 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 ret NEWSYM FxOpF0A1 ; LM RN,(XX) load word from RAM LMRN 0 NEWSYM FxOpF1A1 ; LM RN,(XX) load word from RAM LMRN 1 NEWSYM FxOpF2A1 ; LM RN,(XX) load word from RAM LMRN 2 NEWSYM FxOpF3A1 ; LM RN,(XX) load word from RAM LMRN 3 NEWSYM FxOpF4A1 ; LM RN,(XX) load word from RAM LMRN 4 NEWSYM FxOpF5A1 ; LM RN,(XX) load word from RAM LMRN 5 NEWSYM FxOpF6A1 ; LM RN,(XX) load word from RAM LMRN 6 NEWSYM FxOpF7A1 ; LM RN,(XX) load word from RAM LMRN 7 NEWSYM FxOpF8A1 ; LM RN,(XX) load word from RAM LMRN 8 NEWSYM FxOpF9A1 ; LM RN,(XX) load word from RAM LMRN 9 NEWSYM FxOpFAA1 ; LM RN,(XX) load word from RAM LMRN 10 NEWSYM FxOpFBA1 ; LM RN,(XX) load word from RAM LMRN 11 NEWSYM FxOpFCA1 ; LM RN,(XX) load word from RAM LMRN 12 NEWSYM FxOpFDA1 ; LM RN,(XX) load word from RAM LMRN 13 NEWSYM FxOpFEA1 ; 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 ret NEWSYM FxOpFFA1 ; 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 ret NEWSYM FxOpF0A2 ; SM (XX),RN store word in RAM SMRN 0 NEWSYM FxOpF1A2 ; SM (XX),RN store word in RAM SMRN 1 NEWSYM FxOpF2A2 ; SM (XX),RN store word in RAM SMRN 2 NEWSYM FxOpF3A2 ; SM (XX),RN store word in RAM SMRN 3 NEWSYM FxOpF4A2 ; SM (XX),RN store word in RAM SMRN 4 NEWSYM FxOpF5A2 ; SM (XX),RN store word in RAM SMRN 5 NEWSYM FxOpF6A2 ; SM (XX),RN store word in RAM SMRN 6 NEWSYM FxOpF7A2 ; SM (XX),RN store word in RAM SMRN 7 NEWSYM FxOpF8A2 ; SM (XX),RN store word in RAM SMRN 8 NEWSYM FxOpF9A2 ; SM (XX),RN store word in RAM SMRN 9 NEWSYM FxOpFAA2 ; SM (XX),RN store word in RAM SMRN 10 NEWSYM FxOpFBA2 ; SM (XX),RN store word in RAM SMRN 11 NEWSYM FxOpFCA2 ; SM (XX),RN store word in RAM SMRN 12 NEWSYM FxOpFDA2 ; SM (XX),RN store word in RAM SMRN 13 NEWSYM FxOpFEA2 ; SM (XX),RN store word in RAM SMRN 14 NEWSYM FxOpFFA2 ; 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 ret SECTION .bss ;ALIGN=32 NEWSYM NumberOfOpcodes, resd 1 ; Number of opcodes to execute NEWSYM NumberOfOpcodesBU, resd 1 ; Number of opcodes to execute backup value NEWSYM sfxwarningb, resb 1 SECTION .text NEWSYM MainLoop mov eax,[SfxPBR] and eax,0FFh ; mov byte[fxtrace+eax],1 mov ebp,[SfxCPB] add ebp,[SfxR15] xor ecx,ecx mov cl,[SfxPIPE] mov ch,[SfxSFR+1] and ch,03h ; pack esi/edi PackEsiEdi jmp [FxTabled+ecx*4] jmp .LoopAgain ALIGN16 .LoopAgain call [FxTable+ecx*4] dec dword [NumberOfOpcodes] jnz .LoopAgain .EndLoop NEWSYM FXEndLoop sub ebp,[SfxCPB] mov [SfxR15],ebp mov [SfxPIPE],cl and byte[SfxSFR+1],0FFh-03h or [SfxSFR+1],ch UnPackEsiEdi ret SECTION .data NEWSYM fxtrace, db 0; times 65536 db 0 SECTION .text NEWSYM FxEmu2AsmEnd