;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