Commit 8791d241 authored by Donald Haase's avatar Donald Haase
Browse files

Initial commit of Beta 2 source code

parent ace7aae2
/*******************************************************************************
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
(c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and
Jerremy Koot (jkoot@snes9x.com)
(c) Copyright 2002 - 2003 Matthew Kendora and
Brad Jorsch (anomie@users.sourceforge.net)
C4 x86 assembler and some C emulation code
(c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com),
_Demo_ (_demo_@zsnes.com), and
Nach (n-a-c-h@users.sourceforge.net)
C4 C++ code
(c) Copyright 2003 Brad Jorsch
DSP-1 emulator code
(c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson,
John Weidman (jweidman@slip.net),
neviksti (neviksti@hotmail.com), and
Kris Bleakley (stinkfish@bigpond.com)
DSP-2 emulator code
(c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and
Lord Nightmare (lord_nightmare@users.sourceforge.net
OBC1 emulator code
(c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com)
Ported from x86 assembler to C by sanmaiwashi
SPC7110 and RTC C++ emulator code
(c) Copyright 2002 Matthew Kendora with research by
zsKnight, John Weidman, and Dark Force
S-RTC C emulator code
(c) Copyright 2001 John Weidman
Super FX x86 assembler emulator code
(c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
Super FX C emulator code
(c) Copyright 1997 - 1999 Ivar and Gary Henderson.
S-DD1 decompression code
(c) Copyright 2003 Jose Luis Bravo
Specific ports contains the works of other authors. See headers in
individual files.
Snes9x homepage: http://www.snes9x.com
Permission to use, copy, modify and distribute Snes9x in both binary and
source form, for non-commercial purposes, is hereby granted without fee,
providing that this license information and copyright notice appear with
all copies and any derived work.
This software is provided 'as-is', without any express or implied
warranty. In no event shall the authors be held liable for any damages
arising from the use of this software.
Snes9x is freeware for PERSONAL USE only. Commercial users should
seek permission of the copyright holders first. Commercial use includes
charging money for Snes9x or software derived from Snes9x.
The copyright holders request that bug fixes and improvements to the code
should be forwarded to them so everyone can benefit from the modifications
in future versions.
Super NES and Super Nintendo Entertainment System are trademarks of
Nintendo Co., Limited and its subsidiary companies.
*******************************************************************************/
#include "asmstruc.h"
#include "asmops.h"
#include "spcops.h"
.globl MainAsmLoop
.text
.align 4
.globl S9xMainLoop
S9xMainLoop:
pushl %ebp
pushl %edi
pushl %esi
pushl %ebx
LOAD_REGISTERS
.L9:
cmpb $0,APUExecuting
je .L12
.apuloop:
cmpl CYCLES, APUCycles
jg .L12
#ifdef DEBUGGER
testb $2,APUFlags
je .L14
STORE_REGISTERS
ccall S9xTraceAPU
LOAD_REGISTERS
.L14:
#endif
xorl %eax,%eax
#ifdef SPC700_C
movl APUPC, %edx
SAVE_CYCLES
movb (%edx),%al
#else
movb (APUPC),%al
#endif
movl S9xAPUCycles(,%eax,4), %edx
movl S9xApuOpcodes(,%eax,4),%eax
addl %edx, APUCycles
call *%eax
#ifdef SPC700_C
LOAD_CYCLES
#endif
jmp .apuloop
.L12:
cmpl $0, Flags
je .L15
movl Flags, %eax
testb %al, %al
jge .NO_NMI
decl NMICycleCount
jnz .NO_NMI
andb $~NMI_FLAG, %al
movl %eax, Flags
cmpb $0, WaitingForInterrupt
je .L17
movb $0, WaitingForInterrupt
incl PC
.L17:
call S9xOpcode_NMI
.NO_NMI:
#ifdef DEBUGGER
testb $BREAK_FLAG, Flags
jz .NO_BREAK_POINTS
pushl %esi
pushl %ebx
movl $S9xBreakpoint, %esi
movb PB, %bl
xorl %edx, %edx
movl PC, %ecx
subl PCBase, %ecx
.BREAK_CHECK_LOOP:
movzwl %dx, %eax
sall $2, %eax
cmpb $0, S9xBreakpoint(%eax)
je .BREAK_MATCH_FAILED
cmpb %bl, 1(%esi, %eax)
jne .BREAK_MATCH_FAILED
movzwl 2(%esi, %eax), %eax
cmpl %ecx, %eax
jne .BREAK_MATCH_FAILED
orb $DEBUG_MODE_FLAG, Flags
.BREAK_MATCH_FAILED:
incw %dx
cmpw $6, %dx
jne .BREAK_CHECK_LOOP
popl %ebx
popl %esi
.NO_BREAK_POINTS:
#endif
testl $IRQ_PENDING_FLAG, Flags
jz .NO_PENDING_IRQ
cmpl $0, IRQCycleCount
jne .DEC_IRQ_CYCLE_COUNT
testb $0xff, WaitingForInterrupt
jz .NOT_WAITING
movb $0, WaitingForInterrupt
incl PC
.NOT_WAITING:
testb $0xff, IRQActive
jz .CLEAR_PENDING_IRQ_FLAG
testb $0xff, DisableIRQ
jnz .CLEAR_PENDING_IRQ_FLAG
testb $IRQ, FLAGS
jnz .NO_PENDING_IRQ
call S9xOpcode_IRQ
jmp .NO_PENDING_IRQ
.CLEAR_PENDING_IRQ_FLAG:
andl $~IRQ_PENDING_FLAG, Flags
jmp .NO_PENDING_IRQ
.DEC_IRQ_CYCLE_COUNT:
decl IRQCycleCount
jnz .DEC_IRQ_CYCLE_COUNT_DONE
testb $IRQ, FLAGS
jz .DEC_IRQ_CYCLE_COUNT_DONE
movb $1, IRQCycleCount
.DEC_IRQ_CYCLE_COUNT_DONE:
.NO_PENDING_IRQ:
#ifdef DEBUGGER
movl Flags, %eax
testb $DEBUG_MODE_FLAG,%al
jnz .L31
#else
movl Flags, %eax
#endif
testb $SCAN_KEYS_FLAG, %al
jnz .L31
.L28:
#ifdef DEBUGGER
testb $TRACE_FLAG, %al
jz .NO_TRACE
STORE_REGISTERS
ccall S9xTrace
LOAD_REGISTERS
.NO_TRACE:
movl Flags, %eax
testb $SINGLE_STEP_FLAG, %al
jz .L15
andb $~SINGLE_STEP_FLAG, %al
orb $DEBUG_MODE_FLAG, %al
movl %eax, Flags
#endif
.L15:
xorl %eax,%eax
#ifdef CPU_SHUTDOWN
movl PC, PCAtOpcodeStart
#endif
movb (PC), %al
addl MemSpeed, CYCLES
movl CPUOpcodes, %ecx
incl PC
jmp *(%ecx,%eax,4)
MainAsmLoop:
SAVE_CYCLES
ccall S9xUpdateAPUTimer
cmpb $0, SA1Executing
je .nosa1
STORE_REGISTERS
call S9xSA1MainLoop
LOAD_REGISTERS
.nosa1:
cmpl NextEvent, CYCLES
jl .L9
STORE_REGISTERS
call S9xDoHBlankProcessing
LOAD_REGISTERS
jmp .L9
.L31:
S9xPackStatus S9xMainLoop
STORE_REGISTERS
subl PCBase, PC
movw %di, PCR
#ifdef SPC700_C
movl APUPC, %edx
movl APURAM, %eax
subl %eax, %edx
movw %dx, APUPCR
#else
subl APURAM, APUPC
movw %bp, APUPCR
#endif
APUS9xPackStatus S9xMainLoop
movl Flags, %eax
testb $SCAN_KEYS_FLAG, %al
jz .NoScanKeys
andb $~SCAN_KEYS_FLAG, %al
movl %eax, Flags
#ifdef DEBUGGER
testl $FRAME_ADVANCE_FLAG, %eax
jnz .NoScanKeys
#endif
ccall S9xSyncSpeed
.NoScanKeys:
#ifdef DETECT_NASTY_FX_INTERLEAVE
movb BRKTriggered, %al
andb SuperFXEnabled, %al
jz .NoSuperFXBrkTest
andb TriedInterleavedMode2, %al
jnz .NoSuperFXBrkTest
movb $1, TriedInterleavedMode2
movb $0, BRKTriggered
call S9xDeinterleaveMode2
.NoSuperFXBrkTest:
#endif
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.globl S9xDoHBlankProcessing
S9xDoHBlankProcessing:
pushl %edi
pushl %esi
pushl %ebx
#ifdef CPU_SHUTDOWN
incl WaitCounter
#endif
movb WhichEvent,%bl
cmpb $1,%bl
je .hblank_end
jg .L196
testb %bl,%bl
jz .hblank_start
jmp .reschedule
.L196:
cmpb $3,%bl
jle .htimer_trigger
jmp .reschedule
.hblank_start:
movb HDMA,%dl
testb %dl,%dl
je .reschedule
movl V_Counter, %eax
cmpw ScreenHeight, %ax
ja .reschedule
xorl %eax,%eax
movb %dl,%al
pushl %eax
ccall S9xDoHDMA
movb %al,HDMA
addl $4,%esp
jmp .reschedule
.hblank_end:
ccall S9xSuperFXExec
#ifndef USE_SOUND_DESYNC
ccall S9xGenerateSound
#endif
.nosoundsync:
movl H_Max,%eax
subl %eax, Cycles
imull $10000, %eax, %ecx
subl %ecx, NextAPUTimerPos
cmpb $0, APUExecuting
je .apunotrunning
subl %eax, APUCycles
// addl %eax, smpcyc
jmp .apucycleskip
.apunotrunning:
movl $0, APUCycles
.apucycleskip:
movl V_Counter,%ecx
incl %ecx
incl Scanline
movl $-1,NextEvent
movl %ecx,V_Counter
testb $0xff, PAL
jz .ntsc_tv
cmpl $312,%ecx
jb .L161
jmp .endofframe
.ntsc_tv:
cmpl $262,%ecx
jb .L161
.endofframe:
xorl %edx, %edx
movl Flags,%ecx
movb %dl,NMIActive
orl $16,%ecx
movl %edx,V_Counter
movb %dl,HVBeamCounterLatched
movl %ecx,Flags
movb %dl,RangeTimeOver
movl FillRAM, %ecx
xorb $0x80,0x213F(%ecx)
ccall S9xStartHDMA
.L161:
movb VTimerEnabled,%al
testb %al,%al
je .L162
movb HTimerEnabled,%dl
testb %dl,%dl
jne .L162
xorl %eax,%eax
movw IRQVBeamPos,%ax
movl V_Counter,%ecx
cmpl %eax,%ecx
jne .L162
pushl $2
call S9xSetIRQ
addl $4, %esp
.L162:
xorl %eax,%eax
movl V_Counter,%edx
movw ScreenHeight,%ax
incl %eax
cmpl %eax,%edx
jne .L165
ccall S9xEndScreenRefresh
movb Brightness,%al
xorl %ecx,%ecx
movb %al,MaxBrightness
movl FillRAM,%eax
movb %cl,HDMA
movb 0x2100(%eax),%cl
movb 0x4200(%eax),%dl
shrb $7,%cl
movb %cl,ForcedBlanking
movb $0x80, 0x4210(%eax)
testb $0xff, ForcedBlanking
jnz .noOAMreset
movw SavedOAMAddr,%ax
movw %ax,OAMAddr
movb %ch,FirstSprite
testb $0xff, OAMPriorityRotation
jz .noOAMreset
shrw %ax
andb $0x7F,%al
testb $0x01,OAMFlip
jne .yesOAMReset
cmpb %al,FirstSprite
je .noOAMreset
.yesOAMReset:
movb %al,FirstSprite
movb $0xff,OBJChanged
.noOAMreset:
movb %ch,OAMFlip
testb %dl,%dl
jge .L165
orl $NMI_FLAG, Flags
movb $1, NMIActive
movl NMITriggerPoint, %eax
movl %eax, NMICycleCount
.L165:
xorl %eax, %eax
movw ScreenHeight,%ax
addl $3,%eax
cmpl V_Counter,%eax
jne .NoJoypadUpdate
ccall S9xUpdateJoypads
.NoJoypadUpdate:
movl V_Counter,%eax
cmpl $1,%eax
jne .L177
movl FillRAM,%eax
andl $~NMI_FLAG,Flags
movb $0,0x4210(%eax)
ccall S9xStartScreenRefresh
.L177:
movl V_Counter,%edx
testl %edx,%edx
je .L178
xorl %eax,%eax
movw ScreenHeight,%ax
incl %eax
cmpl %eax,%edx
jae .L178
movb V_Counter,%al
decb %al
andl $255,%eax
pushl %eax
ccall RenderLine
addl $4,%esp
.L178:
#if 0
movl APUTimerErrorCounter,%eax
incl %eax
movl %eax,APUTimerErrorCounter
andl $31,%eax
jz .reschedule
#endif
#if 0
movb APUTimerEnabled + 2,%cl
testb %cl,%cl
je .L179
movw APUTimer + 4,%ax
addl $4,%eax
movw %ax,APUTimer + 4
cmpw %ax,APUTimerTarget + 4
ja .L179
.L182:
movl APURAM,%edx
movb 255(%edx),%al
incb %al
andb $15,%al
movb %al,255(%edx)
movw APUTimerTarget + 4,%dx
movw APUTimer + 4,%ax
movl APUWaitCounter,%ecx
subl %edx,%eax
incl %ecx
movb $1,APUExecuting
movw %ax,APUTimer + 4
movl %ecx,APUWaitCounter
cmpw %dx,%ax
jae .L182
.L179:
testb $1,V_Counter
je .reschedule
movb APUTimerEnabled,%al
testb %al,%al
je .L185
incw APUTimer
movw APUTimerTarget,%ax
cmpw %ax,APUTimer
jb .L185
movl APURAM,%edx
movb 253(%edx),%al
incb %al
andb $15,%al
movb %al,253(%edx)
movl APUWaitCounter,%edx
incl %edx
movw $0,APUTimer
movb $1,APUExecuting
movl %edx,APUWaitCounter
.L185:
movb APUTimerEnabled + 1,%al
testb %al,%al
je .reschedule
incw APUTimer + 2
movw APUTimerTarget + 2,%ax
cmpw %ax,APUTimer + 2
jb .reschedule
movl APURAM,%edx
movb 254(%edx),%al
incb %al
andb $15,%al
movb %al,254(%edx)
movl APUWaitCounter,%edx
incl %edx
movw $0,APUTimer + 2
movb $1,APUExecuting
movl %edx,APUWaitCounter
#endif
jmp .reschedule
.htimer_trigger:
cmpb $0, HTimerEnabled
je .reschedule
cmpb $0, VTimerEnabled
je .L191
xorl %eax,%eax
movw IRQVBeamPos,%ax
movl V_Counter,%edx
cmpl %eax,%edx
jne .reschedule
.L191:
// CHANGED: 20/11/00
pushl $1
call S9xSetIRQ
addl $4, %esp
.reschedule:
cmpb $0, WhichEvent
je .next_is_hblank_end
cmpb $3, WhichEvent
jne .next_is_hblank_start
.next_is_hblank_end:
movb $1,%bl
movl H_Max,%edx
jmp .skip
.next_is_hblank_start:
xorl %ebx,%ebx
movl HBlankStart,%edx
.skip:
cmpb $0, HTimerEnabled
je .not_enabled
movswl HTimerPosition,%esi
cmpl %edx,%esi
jge .not_enabled
movl NextEvent,%eax
cmpl %eax,%esi
jle .not_enabled
cmpb $0, VTimerEnabled
je .enabled
xorl %eax,%eax
movw IRQVBeamPos,%ax
movl V_Counter,%ecx
cmpl %eax,%ecx
jne .not_enabled
.enabled:
movb $2,%bl
cmpl %esi, HBlankStart
jg .before
movb $3,%bl
.before:
movl %esi,%edx
.not_enabled:
movb %bl,WhichEvent
popl %ebx
popl %esi
movl %edx,NextEvent
popl %edi
ret
.text
.align 4
.globl S9xSetIRQ
S9xSetIRQ:
movl 4(%esp), %eax
orb %al,IRQActive
// CHANGED: 20/11/00
movl $3, IRQCycleCount
orl $IRQ_PENDING_FLAG, Flags
cmpb $0, WaitingForInterrupt
je .NoIncPC
movb $0, WaitingForInterrupt
// IRQ must trigger immediately after a WAI instruction -
// Final Fantasy Mystic Quest requires this.
movl $0, IRQCycleCount
incl PCS
.NoIncPC:
ret
.globl S9xClearIRQ
S9xClearIRQ:
movl 4(%esp), %eax
xorl $~0, %eax
andb IRQActive, %al
movb %al, IRQActive
jnz .irqsstillpending
andl $~IRQ_PENDING_FLAG, Flags
.irqsstillpending:
ret
/*******************************************************************************
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
(c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and
Jerremy Koot (jkoot@snes9x.com)
(c) Copyright 2002 - 2003 Matthew Kendora and
Brad Jorsch (anomie@users.sourceforge.net)
C4 x86 assembler and some C emulation code
(c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com),
_Demo_ (_demo_@zsnes.com), and
Nach (n-a-c-h@users.sourceforge.net)
C4 C++ code
(c) Copyright 2003 Brad Jorsch
DSP-1 emulator code
(c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson,
John Weidman (jweidman@slip.net),
neviksti (neviksti@hotmail.com), and
Kris Bleakley (stinkfish@bigpond.com)
DSP-2 emulator code
(c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and
Lord Nightmare (lord_nightmare@users.sourceforge.net
OBC1 emulator code
(c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com)
Ported from x86 assembler to C by sanmaiwashi
SPC7110 and RTC C++ emulator code
(c) Copyright 2002 Matthew Kendora with research by
zsKnight, John Weidman, and Dark Force
S-RTC C emulator code
(c) Copyright 2001 John Weidman
Super FX x86 assembler emulator code
(c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
Super FX C emulator code
(c) Copyright 1997 - 1999 Ivar and Gary Henderson.
S-DD1 decompression code
(c) Copyright 2003 Jose Luis Bravo
Specific ports contains the works of other authors. See headers in
individual files.
Snes9x homepage: http://www.snes9x.com
Permission to use, copy, modify and distribute Snes9x in both binary and
source form, for non-commercial purposes, is hereby granted without fee,
providing that this license information and copyright notice appear with
all copies and any derived work.
This software is provided 'as-is', without any express or implied
warranty. In no event shall the authors be held liable for any damages
arising from the use of this software.
Snes9x is freeware for PERSONAL USE only. Commercial users should
seek permission of the copyright holders first. Commercial use includes
charging money for Snes9x or software derived from Snes9x.
The copyright holders request that bug fixes and improvements to the code
should be forwarded to them so everyone can benefit from the modifications
in future versions.
Super NES and Super Nintendo Entertainment System are trademarks of
Nintendo Co., Limited and its subsidiary companies.
*******************************************************************************/
#include "asmstruc.h"
#include "asmaddr.h"
#include "asmops.h"
#include "getset.S"
/* ADC */
Op69M1:
Immediate8 ADC READ
Adc8 IMM8
Op69M0:
Immediate16 ADC2 READ
Adc16 IMM16
Op65M1:
Direct8 ADC2 READ
call S9xGetByte
Adc8 DIR8
Op65M0:
Direct8 ADC READ
call S9xGetWord
Adc16 DIR16
Op75M1:
DirectIndexedX8 ADC READ
call S9xGetByte
Adc8 DIX8
Op75M0:
DirectIndexedX8 ADC2 READ
call S9xGetWord
Adc16 DIX16
Op72M1:
DirectIndirect8 ADC READ
call S9xGetByte
Adc8 DI8
Op72M0:
DirectIndirect8 ADC2 READ
call S9xGetWord
Adc16 DI16
Op61M1:
DirectIndexedIndirect8 ADC READ
call S9xGetByte
Adc8 DII8
Op61M0:
DirectIndexedIndirect8 ADC2 READ
call S9xGetWord
Adc16 DII16
Op71M1:
DirectIndirectIndexed8 ADC READ
call S9xGetByte
Adc8 DIIY8
Op71M0:
DirectIndirectIndexed8 ADC2 READ
call S9xGetWord
Adc16 DIIY16
Op67M1:
DirectIndirectLong8 ADC READ
call S9xGetByte
Adc8 DIL8
Op67M0:
DirectIndirectLong8 ADC2 READ
call S9xGetWord
Adc16 DIL16
Op77M1:
DirectIndirectIndexedLong8 ADC READ
call S9xGetByte
Adc8 DIIL8
Op77M0:
DirectIndirectIndexedLong8 ADC2 READ
call S9xGetWord
Adc16 DIIL8
Op6DM1:
Absolute8 ADC READ
call S9xGetByte
Adc8 ABS8
Op6DM0:
Absolute8 ADC2 READ
call S9xGetWord
Adc16 ABS16
Op7DM1:
AbsoluteIndexedX8 ADC READ
call S9xGetByte
Adc8 ABSX8
Op7DM0:
AbsoluteIndexedX8 ADC2 READ
call S9xGetWord
Adc16 ABSX16
Op79M1:
AbsoluteIndexedY8 ADC READ
call S9xGetByte
Adc8 ABSY8
Op79M0:
AbsoluteIndexedY8 ADC2 READ
call S9xGetWord
Adc16 ABSY16
Op6FM1:
AbsoluteLong8 ADC READ
call S9xGetByte
Adc8 ABSL8
Op6FM0:
AbsoluteLong8 ADC2 READ
call S9xGetWord
Adc16 ABSL16
Op7FM1:
AbsoluteLongIndexedX8 ADC READ
call S9xGetByte
Adc8 ALX8
Op7FM0:
AbsoluteLongIndexedX8 ADC2 READ
call S9xGetWord
Adc16 ALX16
Op63M1:
StackRelative8 ADC READ
call S9xGetByte
Adc8 SREL8
Op63M0:
StackRelative8 ADC2 READ
call S9xGetWord
Adc16 SREL16
Op73M1:
StackRelativeIndirectIndexed8 ADC READ
call S9xGetByte
Adc8 SRII8
Op73M0:
StackRelativeIndirectIndexed8 ADC2 READ
call S9xGetWord
Adc16 SRII16
/* AND */
Op29M1:
Immediate8 AND READ
And8 IMM8
Op29M0:
Immediate16 AND READ
And16 IMM16
Op25M1:
Direct8 AND READ
call S9xGetByte
And8 DIR8
Op25M0:
Direct8 AND2 READ
call S9xGetWord
And16 DIR16
Op35M1:
DirectIndexedX8 AND READ
call S9xGetByte
And8 DIX8
Op35M0:
DirectIndexedX8 AND2 READ
call S9xGetWord
And16 DIX16
Op32M1:
DirectIndirect8 AND READ
call S9xGetByte
And8 DI8
Op32M0:
DirectIndirect8 AND2 READ
call S9xGetWord
And16 DI16
Op21M1:
DirectIndexedIndirect8 AND READ
call S9xGetByte
And8 DII8
Op21M0:
DirectIndexedIndirect8 AND2 READ
call S9xGetWord
And16 DII16
Op31M1:
DirectIndirectIndexed8 AND READ
call S9xGetByte
And8 DIIY8
Op31M0:
DirectIndirectIndexed8 AND2 READ
call S9xGetWord
And16 DIIY16
Op27M1:
DirectIndirectLong8 AND READ
call S9xGetByte
And8 DIL8
Op27M0:
DirectIndirectLong8 AND2 READ
call S9xGetWord
And16 DIL16
Op37M1:
DirectIndirectIndexedLong8 AND READ
call S9xGetByte
And8 DIIL8
Op37M0:
DirectIndirectIndexedLong8 AND2 READ
call S9xGetWord
And16 DIIL16
Op2DM1:
Absolute8 AND READ
call S9xGetByte
And8 ABS8
Op2DM0:
Absolute8 AND2 READ
call S9xGetWord
And16 ABS16
Op3DM1:
AbsoluteIndexedX8 AND READ
call S9xGetByte
And8 ABSX8
Op3DM0:
AbsoluteIndexedX8 AND2 READ
call S9xGetWord
And16 ABSX16
Op39M1:
AbsoluteIndexedY8 AND READ
call S9xGetByte
And8 ABSY8
Op39M0:
AbsoluteIndexedY8 AND2 READ
call S9xGetWord
And16 ABSY16
Op2FM1:
AbsoluteLong8 AND READ
call S9xGetByte
And8 ABSL8
Op2FM0:
AbsoluteLong8 AND2 READ
call S9xGetWord
And16 ABSL16
Op3FM1:
AbsoluteLongIndexedX8 AND READ
call S9xGetByte
And8 ALX8
Op3FM0:
AbsoluteLongIndexedX8 AND2 READ
call S9xGetWord
And16 ALX16
Op23M1:
StackRelative8 AND READ
call S9xGetByte
And8 SREL8
Op23M0:
StackRelative8 AND2 READ
call S9xGetWord
And16 SREL16
Op33M1:
StackRelativeIndirectIndexed8 AND READ
call S9xGetByte
And8 SRII8
Op33M0:
StackRelativeIndirectIndexed8 AND2 READ
call S9xGetWord
And16 SRII16
/* ASL */
Op0AM1:
movb AL, %al
addl $6, CYCLES
salb %al
movb %al, AL
SetZNC
jmp MainAsmLoop
Op0AM0:
movw AA, %ax
addl $6, CYCLES
salw %ax
movw %ax, AA
setnz _Zero
setc _Carry
movb %ah, _Negative
jmp MainAsmLoop
Op06M1:
Direct8 ASL MODIFY
Asl8 DIR8
Op06M0:
Direct8 ASL2 MODIFY
Asl16 DIR16
Op16M1:
DirectIndexedX8 ASL MODIFY
Asl8 DIX
Op16M0:
DirectIndexedX8 ASL2 MODIFY
Asl16 DIX
Op0EM1:
Absolute8 ASL MODIFY
Asl8 ABS
Op0EM0:
Absolute8 ASL2 MODIFY
Asl16 ABS
Op1EM1:
AbsoluteIndexedX8 ASL MODIFY
Asl8 ABSX
Op1EM0:
AbsoluteIndexedX8 ASL2 MODIFY
Asl16 ABSX
/* BIT */
Op89M1:
Immediate8 BIT READ
andb AL, %al
movb %al, _Zero
jmp MainAsmLoop
Op89M0:
Immediate16 BIT READ
andw AA, %ax
setnz _Zero
jmp MainAsmLoop
Op24M1:
Direct8 BIT READ
Bit8 DIR
Op24M0:
Direct8 BIT READ
Bit16 DIR
Op34M1:
DirectIndexedX8 BIT READ
Bit8 DIX
Op34M0:
DirectIndexedX8 BIT2 READ
Bit16 DIX
Op2CM1:
Absolute8 BIT READ
Bit8 ABS
Op2CM0:
Absolute8 BIT2 READ
Bit16 ABS
Op3CM1:
AbsoluteIndexedX8 BIT READ
Bit8 ABSX
Op3CM0:
AbsoluteIndexedX8 BIT2 READ
Bit16 ABSX
/* CMP */
OpC9M1:
Immediate8 CMP READ
Cmp8 IMM
OpC9M0:
Immediate16 CMP READ
Cmp16 IMM
OpC5M1:
Direct8 CMP READ
call S9xGetByte
Cmp8 DIR
OpC5M0:
Direct8 CMP2 READ
call S9xGetWord
Cmp16 DIR
OpD5M1:
DirectIndexedX8 CMP READ
call S9xGetByte
Cmp8 DIX
OpD5M0:
DirectIndexedX8 CMP2 READ
call S9xGetWord
Cmp16 DIX
OpD2M1:
DirectIndirect8 CMP READ
call S9xGetByte
Cmp8 DI
OpD2M0:
DirectIndirect8 CMP2 READ
call S9xGetWord
Cmp16 DI
OpC1M1:
DirectIndexedIndirect8 CMP READ
call S9xGetByte
Cmp8 DII
OpC1M0:
DirectIndexedIndirect8 CMP2 READ
call S9xGetWord
Cmp16 DII
OpD1M1:
DirectIndirectIndexed8 CMP READ
call S9xGetByte
Cmp8 DIIY
OpD1M0:
DirectIndirectIndexed8 CMP2 READ
call S9xGetWord
Cmp16 DIIY
OpC7M1:
DirectIndirectLong8 CMP READ
call S9xGetByte
Cmp8 DIL
OpC7M0:
DirectIndirectLong8 CMP2 READ
call S9xGetWord
Cmp16 DIL
OpD7M1:
DirectIndirectIndexedLong8 CMP READ
call S9xGetByte
Cmp8 DIIL
OpD7M0:
DirectIndirectIndexedLong8 CMP2 READ
call S9xGetWord
Cmp16 DIIL
OpCDM1:
Absolute8 CMP READ
call S9xGetByte
Cmp8 ABS
OpCDM0:
Absolute8 CMP2 READ
call S9xGetWord
Cmp16 ABS
OpDDM1:
AbsoluteIndexedX8 CMP READ
call S9xGetByte
Cmp8 ABSX
OpDDM0:
AbsoluteIndexedX8 CMP2 READ
call S9xGetWord
Cmp16 ABSX
OpD9M1:
AbsoluteIndexedY8 CMP READ
call S9xGetByte
Cmp8 ABSY
OpD9M0:
AbsoluteIndexedY8 CMP2 READ
call S9xGetWord
Cmp16 ABSY
OpCFM1:
AbsoluteLong8 CMP READ
call S9xGetByte
Cmp8 ABSL
OpCFM0:
AbsoluteLong8 CMP2 READ
call S9xGetWord
Cmp16 ABSL
OpDFM1:
AbsoluteLongIndexedX8 CMP READ
call S9xGetByte
Cmp8 ALX
OpDFM0:
AbsoluteLongIndexedX8 CMP2 READ
call S9xGetWord
Cmp16 ALX
OpC3M1:
StackRelative8 CMP READ
call S9xGetByte
Cmp8 SREL
OpC3M0:
StackRelative8 CMP2 READ
call S9xGetWord
Cmp16 SREL
OpD3M1:
StackRelativeIndirectIndexed8 CMP READ
call S9xGetByte
Cmp8 SRII
OpD3M0:
StackRelativeIndirectIndexed8 CMP2 READ
call S9xGetWord
Cmp16 SRII
/* CPX */
OpE0X1:
Immediate8 CPX READ
Cpx8 IMM
OpE0X0:
Immediate16 CPX READ
Cpx16 IMM
OpE4X1:
Direct8 CPX READ
call S9xGetByte
Cpx8 DIR
OpE4X0:
Direct8 CPX2 READ
call S9xGetWord
Cpx16 DIR
OpECX1:
Absolute8 CPX READ
call S9xGetByte
Cpx8 ABS
OpECX0:
Absolute8 CPX2 READ
call S9xGetWord
Cpx16 ABS
/* CPY */
OpC0X1:
Immediate8 CPY READ
Cpy8 IMM
OpC0X0:
Immediate16 CPY READ
Cpy16 IMM
OpC4X1:
Direct8 CPY READ
call S9xGetByte
Cpy8 DIR
OpC4X0:
Direct8 CPY2 READ
call S9xGetWord
Cpy16 DIR
OpCCX1:
Absolute8 CPY READ
call S9xGetByte
Cpy8 ABS
OpCCX0:
Absolute8 CPY2 READ
call S9xGetWord
Cpy16 ABS
/* DEC */
Op3AM1:
movb AL, %al
addl $6, CYCLES
decb %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, AL
SetZN
jmp MainAsmLoop
Op3AM0:
addl $6, CYCLES
decw AA
setnz _Zero
movb AH, %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, _Negative
jmp MainAsmLoop
OpC6M1:
Direct8 DEC MODIFY
Dec8 DIR
OpC6M0:
Direct8 DEC2 MODIFY
Dec16 DIR
OpD6M1:
DirectIndexedX8 DEC MODIFY
Dec8 DIX
OpD6M0:
DirectIndexedX8 DEC2 MODIFY
Dec16 DIX
OpCEM1:
Absolute8 DEC MODIFY
Dec8 ABS
OpCEM0:
Absolute8 DEC2 MODIFY
Dec16 ABS
OpDEM1:
AbsoluteIndexedX8 DEC MODIFY
Dec8 ABSX
OpDEM0:
AbsoluteIndexedX8 DEC2 MODIFY
Dec16 ABSX
/* EOR */
Op49M1:
Immediate8 EOR READ
Eor8 IMM
Op49M0:
Immediate16 EOR READ
Eor16 IMM
Op45M1:
Direct8 EOR READ
call S9xGetByte
Eor8 DIR
Op45M0:
Direct8 EOR2 READ
call S9xGetWord
Eor16 DIR
Op55M1:
DirectIndexedX8 EOR READ
call S9xGetByte
Eor8 DIX
Op55M0:
DirectIndexedX8 EOR2 READ
call S9xGetWord
Eor16 DIX
Op52M1:
DirectIndirect8 EOR READ
call S9xGetByte
Eor8 DI
Op52M0:
DirectIndirect8 EOR2 READ
call S9xGetWord
Eor16 DI
Op41M1:
DirectIndexedIndirect8 EOR READ
call S9xGetByte
Eor8 DII
Op41M0:
DirectIndexedIndirect8 EOR2 READ
call S9xGetWord
Eor16 DII
Op51M1:
DirectIndirectIndexed8 EOR READ
call S9xGetByte
Eor8 DIIY
Op51M0:
DirectIndirectIndexed8 EOR2 READ
call S9xGetWord
Eor16 DIIY
Op47M1:
DirectIndirectLong8 EOR READ
call S9xGetByte
Eor8 DIL
Op47M0:
DirectIndirectLong8 EOR2 READ
call S9xGetWord
Eor16 DIL
Op57M1:
DirectIndirectIndexedLong8 EOR READ
call S9xGetByte
Eor8 DIIL
Op57M0:
DirectIndirectIndexedLong8 EOR2 READ
call S9xGetWord
Eor16 DIIL
Op4DM1:
Absolute8 EOR READ
call S9xGetByte
Eor8 ABS
Op4DM0:
Absolute8 EOR2 READ
call S9xGetWord
Eor16 ABS
Op5DM1:
AbsoluteIndexedX8 EOR READ
call S9xGetByte
Eor8 ABSX
Op5DM0:
AbsoluteIndexedX8 EOR2 READ
call S9xGetWord
Eor16 ABSX
Op59M1:
AbsoluteIndexedY8 EOR READ
call S9xGetByte
Eor8 ABSY
Op59M0:
AbsoluteIndexedY8 EOR2 READ
call S9xGetWord
Eor16 ABSY
Op4FM1:
AbsoluteLong8 EOR READ
call S9xGetByte
Eor8 ABSL
Op4FM0:
AbsoluteLong8 EOR2 READ
call S9xGetWord
Eor16 ABSL
Op5FM1:
AbsoluteLongIndexedX8 EOR READ
call S9xGetByte
Eor8 ALX
Op5FM0:
AbsoluteLongIndexedX8 EOR2 READ
call S9xGetWord
Eor16 ALX
Op43M1:
StackRelative8 EOR READ
call S9xGetByte
Eor8 SREL
Op43M0:
StackRelative8 EOR2 READ
call S9xGetWord
Eor16 SREL
Op53M1:
StackRelativeIndirectIndexed8 EOR READ
call S9xGetByte
Eor8 SRII
Op53M0:
StackRelativeIndirectIndexed8 EOR2 READ
call S9xGetWord
Eor16 SRII
/* INC */
Op1AM1:
movb AL, %al
addl $6, CYCLES
incb %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, AL
SetZN
jmp MainAsmLoop
Op1AM0:
addl $6, CYCLES
incw AA
setnz _Zero
movb AH, %ah
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %ah, _Negative
jmp MainAsmLoop
OpE6M1:
Direct8 INC MODIFY
Inc8 DIR
OpE6M0:
Direct8 INC2 MODIFY
Inc16 DIR
OpF6M1:
DirectIndexedX8 INC MODIFY
Inc8 DIX
OpF6M0:
DirectIndexedX8 INC2 MODIFY
Inc16 DIX
OpEEM1:
Absolute8 INC MODIFY
Inc8 ABS
OpEEM0:
Absolute8 INC2 MODIFY
Inc16 ABS
OpFEM1:
AbsoluteIndexedX8 INC MODIFY
Inc8 ABSX
OpFEM0:
AbsoluteIndexedX8 INC2 MODIFY
Inc16 ABSX
/* LDA */
OpA9M1:
Immediate8 LDA READ
Lda8 IMM
OpA9M0:
Immediate16 LDA READ
Lda16 IMM
OpA5M1:
Direct8 LDA READ
call S9xGetByte
Lda8 DIR
OpA5M0:
Direct8 LDA2 READ
call S9xGetWord
Lda16 DIR
OpB5M1:
DirectIndexedX8 LDA READ
call S9xGetByte
Lda8 DIX
OpB5M0:
DirectIndexedX8 LDA2 READ
call S9xGetWord
Lda16 DIX
OpB2M1:
DirectIndirect8 LDA READ
call S9xGetByte
Lda8 DI
OpB2M0:
DirectIndirect8 LDA2 READ
call S9xGetWord
Lda16 DI
OpA1M1:
DirectIndexedIndirect8 LDA READ
call S9xGetByte
Lda8 DII
OpA1M0:
DirectIndexedIndirect8 LDA2 READ
call S9xGetWord
Lda16 DII
OpB1M1:
DirectIndirectIndexed8 LDA READ
call S9xGetByte
Lda8 DIIY
OpB1M0:
DirectIndirectIndexed8 LDA2 READ
call S9xGetWord
Lda16 DIIY
OpA7M1:
DirectIndirectLong8 LDA READ
call S9xGetByte
Lda8 DIL
OpA7M0:
DirectIndirectLong8 LDA2 READ
call S9xGetWord
Lda16 DIL
OpB7M1:
DirectIndirectIndexedLong8 LDA READ
call S9xGetByte
Lda8 DIIL
OpB7M0:
DirectIndirectIndexedLong8 LDA2 READ
call S9xGetWord
Lda16 DIIL
OpADM1:
Absolute8 LDA READ
call S9xGetByte
Lda8 ABS
OpADM0:
Absolute8 LDA2 READ
call S9xGetWord
Lda16 ABS
OpBDM1:
AbsoluteIndexedX8 LDA READ
call S9xGetByte
Lda8 ABSX
OpBDM0:
AbsoluteIndexedX8 LDA2 READ
call S9xGetWord
Lda16 ABSX
OpB9M1:
AbsoluteIndexedY8 LDA READ
call S9xGetByte
Lda8 ABSY
OpB9M0:
AbsoluteIndexedY8 LDA2 READ
call S9xGetWord
Lda16 ABSY
OpAFM1:
AbsoluteLong8 LDA READ
call S9xGetByte
Lda8 ABSL
OpAFM0:
AbsoluteLong8 LDA2 READ
call S9xGetWord
Lda16 ABSL
OpBFM1:
AbsoluteLongIndexedX8 LDA READ
call S9xGetByte
Lda8 ALX
OpBFM0:
AbsoluteLongIndexedX8 LDA2 READ
call S9xGetWord
Lda16 ALX
OpA3M1:
StackRelative8 LDA READ
call S9xGetByte
Lda8 SREL
OpA3M0:
StackRelative8 LDA2 READ
call S9xGetWord
Lda16 SREL
OpB3M1:
StackRelativeIndirectIndexed8 LDA READ
call S9xGetByte
Lda8 SRII
OpB3M0:
StackRelativeIndirectIndexed8 LDA2 READ
call S9xGetWord
Lda16 SRII
/* LDX */
OpA2X1:
Immediate8 LDX READ
Ldx8 IMM
OpA2X0:
Immediate16 LDX READ
Ldx16 IMM
OpA6X1:
Direct8 LDX READ
call S9xGetByte
Ldx8 DIR
OpA6X0:
Direct8 LDX2 READ
call S9xGetWord
Ldx16 DIR
OpB6X1:
DirectIndexedY8 LDX READ
call S9xGetByte
Ldx8 DIY
OpB6X0:
DirectIndexedY8 LDX2 READ
call S9xGetWord
Ldx16 DIY
OpAEX1:
Absolute8 LDX READ
call S9xGetByte
Ldx8 ABS
OpAEX0:
Absolute8 LDX2 READ
call S9xGetWord
Ldx16 ABS
OpBEX1:
AbsoluteIndexedY8 LDX READ
call S9xGetByte
Ldx8 ABSY
OpBEX0:
AbsoluteIndexedY8 LDX2 READ
call S9xGetWord
Ldx16 ABSY
/* LDY */
OpA0X1:
Immediate8 LDY READ
Ldy8 IMM
OpA0X0:
Immediate16 LDY READ
Ldy16 IMM
OpA4X1:
Direct8 LDY READ
call S9xGetByte
Ldy8 DIR
OpA4X0:
Direct8 LDY2 READ
call S9xGetWord
Ldy16 DIR
OpB4X1:
DirectIndexedX8 LDY READ
call S9xGetByte
Ldy8 DIX
OpB4X0:
DirectIndexedX8 LDY2 READ
call S9xGetWord
Ldy16 DIX
OpACX1:
Absolute8 LDY READ
call S9xGetByte
Ldy8 ABS
OpACX0:
Absolute8 LDY2 READ
call S9xGetWord
Ldy16 ABS
OpBCX1:
AbsoluteIndexedX8 LDY READ
call S9xGetByte
Ldy8 ABSX
OpBCX0:
AbsoluteIndexedX8 LDY2 READ
call S9xGetWord
Ldy16 ABSX
/* LSR */
Op4AM1:
movb AL, %al
addl $6, CYCLES
shrb %al
movb %al, AL
SetZNC
jmp MainAsmLoop
Op4AM0:
addl $6, CYCLES
shrw AA
setnz _Zero
setc _Carry
movb AH, %ah
movb %ah, _Negative
jmp MainAsmLoop
Op46M1:
Direct8 LSR MODIFY
Lsr8 DIR
Op46M0:
Direct8 LSR2 MODIFY
Lsr16 DIR
Op56M1:
DirectIndexedX8 LSR MODIFY
Lsr8 DIX
Op56M0:
DirectIndexedX8 LSR2 MODIFY
Lsr16 DIX
Op4EM1:
Absolute8 LSR MODIFY
Lsr8 ABS
Op4EM0:
Absolute8 LSR2 MODIFY
Lsr16 ABS
Op5EM1:
AbsoluteIndexedX8 LSR MODIFY
Lsr8 ABSX
Op5EM0:
AbsoluteIndexedX8 LSR2 MODIFY
Lsr16 ABSX
/* ORA */
Op09M1:
Immediate8 ORA READ
Ora8 IMM
Op09M0:
Immediate16 ORA READ
Ora16 IMM
Op05M1:
Direct8 ORA READ
call S9xGetByte
Ora8 DIR
Op05M0:
Direct8 ORA2 READ
call S9xGetWord
Ora16 DIR
Op15M1:
DirectIndexedX8 ORA READ
call S9xGetByte
Ora8 DIX
Op15M0:
DirectIndexedX8 ORA2 READ
call S9xGetWord
Ora16 DIX
Op12M1:
DirectIndirect8 ORA READ
call S9xGetByte
Ora8 DI
Op12M0:
DirectIndirect8 ORA2 READ
call S9xGetWord
Ora16 DI
Op01M1:
DirectIndexedIndirect8 ORA READ
call S9xGetByte
Ora8 DII
Op01M0:
DirectIndexedIndirect8 ORA2 READ
call S9xGetWord
Ora16 DII
Op11M1:
DirectIndirectIndexed8 ORA READ
call S9xGetByte
Ora8 DIIY
Op11M0:
DirectIndirectIndexed8 ORA2 READ
call S9xGetWord
Ora16 DIIY
Op07M1:
DirectIndirectLong8 ORA READ
call S9xGetByte
Ora8 DIL
Op07M0:
DirectIndirectLong8 ORA2 READ
call S9xGetWord
Ora16 DIL
Op17M1:
DirectIndirectIndexedLong8 ORA READ
call S9xGetByte
Ora8 DIIL
Op17M0:
DirectIndirectIndexedLong8 ORA2 READ
call S9xGetWord
Ora16 DIIL
Op0DM1:
Absolute8 ORA READ
call S9xGetByte
Ora8 ABS
Op0DM0:
Absolute8 ORA2 READ
call S9xGetWord
Ora16 ABS
Op1DM1:
AbsoluteIndexedX8 ORA READ
call S9xGetByte
Ora8 ABSX
Op1DM0:
AbsoluteIndexedX8 ORA2 READ
call S9xGetWord
Ora16 ABSX
Op19M1:
AbsoluteIndexedY8 ORA READ
call S9xGetByte
Ora8 ABSY
Op19M0:
AbsoluteIndexedY8 ORA2 READ
call S9xGetWord
Ora16 ABSY
Op0FM1:
AbsoluteLong8 ORA READ
call S9xGetByte
Ora8 ABSL
Op0FM0:
AbsoluteLong8 ORA2 READ
call S9xGetWord
Ora16 ABSL
Op1FM1:
AbsoluteLongIndexedX8 ORA READ
call S9xGetByte
Ora8 ALX
Op1FM0:
AbsoluteLongIndexedX8 ORA2 READ
call S9xGetWord
Ora16 ALX
Op03M1:
StackRelative8 ORA READ
call S9xGetByte
Ora8 SREL
Op03M0:
StackRelative8 ORA2 READ
call S9xGetWord
Ora16 SREL
Op13M1:
StackRelativeIndirectIndexed8 ORA READ
call S9xGetByte
Ora8 SRII
Op13M0:
StackRelativeIndirectIndexed8 ORA2 READ
call S9xGetWord
Ora16 SRII
/* ROL */
Op2AM1:
addl $6, CYCLES
movb AL, %al
GetCarry
rclb %al
movb %al, AL
SetZNC
jmp MainAsmLoop
Op2AM0:
addl $6, CYCLES
GetCarry
movw AA, %ax
rclw %ax
movw %ax, AA
setc _Carry
movb %ah, _Negative
orb %ah, %al
movb %al, _Zero
jmp MainAsmLoop
Op26M1:
Direct8 ROL MODIFY
Rol8 DIR
Op26M0:
Direct8 ROL2 MODIFY
Rol16 DIR
Op36M1:
DirectIndexedX8 ROL MODIFY
Rol8 DIX
Op36M0:
DirectIndexedX8 ROL2 MODIFY
Rol16 DIX
Op2EM1:
Absolute8 ROL MODIFY
Rol8 ABS
Op2EM0:
Absolute8 ROL2 MODIFY
Rol16 ABS
Op3EM1:
AbsoluteIndexedX8 ROL MODIFY
Rol8 ABSX
Op3EM0:
AbsoluteIndexedX8 ROL2 MODIFY
Rol16 ABSX
/* ROR */
Op6AM1:
addl $6, CYCLES
movb AL, %al
GetCarry
rcrb %al
movb %al, AL
SetZNC
jmp MainAsmLoop
Op6AM0:
addl $6, CYCLES
GetCarry
movw AA, %ax
rcrw %ax
movw %ax, AA
setc _Carry
movb %ah, _Negative
orb %ah, %al
movb %al, _Zero
jmp MainAsmLoop
Op66M1:
Direct8 ROR MODIFY
Ror8 DIR
Op66M0:
Direct8 ROR2 MODIFY
Ror16 DIR
Op76M1:
DirectIndexedX8 ROR MODIFY
Ror8 DIX
Op76M0:
DirectIndexedX8 ROR2 MODIFY
Ror16 DIX
Op6EM1:
Absolute8 ROR MODIFY
Ror8 ABS
Op6EM0:
Absolute8 ROR2 MODIFY
Ror16 ABS
Op7EM1:
AbsoluteIndexedX8 ROR MODIFY
Ror8 ABSX
Op7EM0:
AbsoluteIndexedX8 ROR2 MODIFY
Ror16 ABSX
/* SBC */
OpE9M1:
Immediate8 SBC READ
Sbc8 IMM
OpE9M0:
Immediate16 SBC READ
Sbc16 IMM
OpE5M1:
Direct8 SBC READ
call S9xGetByte
Sbc8 DIR
OpE5M0:
Direct8 SBC2 READ
call S9xGetWord
Sbc16 DIR
OpF5M1:
DirectIndexedX8 SBC READ
call S9xGetByte
Sbc8 DIX
OpF5M0:
DirectIndexedX8 SBC2 READ
call S9xGetWord
Sbc16 DIX
OpF2M1:
DirectIndirect8 SBC READ
call S9xGetByte
Sbc8 DI
OpF2M0:
DirectIndirect8 SBC2 READ
call S9xGetWord
Sbc16 DI
OpE1M1:
DirectIndexedIndirect8 SBC READ
call S9xGetByte
Sbc8 DII
OpE1M0:
DirectIndexedIndirect8 SBC2 READ
call S9xGetWord
Sbc16 DII
OpF1M1:
DirectIndirectIndexed8 SBC READ
call S9xGetByte
Sbc8 DIIY
OpF1M0:
DirectIndirectIndexed8 SBC2 READ
call S9xGetWord
Sbc16 DIIY
OpE7M1:
DirectIndirectLong8 SBC READ
call S9xGetByte
Sbc8 DIL
OpE7M0:
DirectIndirectLong8 SBC2 READ
call S9xGetWord
Sbc16 DIL
OpF7M1:
DirectIndirectIndexedLong8 SBC READ
call S9xGetByte
Sbc8 DIIL
OpF7M0:
DirectIndirectIndexedLong8 SBC2 READ
call S9xGetWord
Sbc16 DIIL
OpEDM1:
Absolute8 SBC READ
call S9xGetByte
Sbc8 ABS
OpEDM0:
Absolute8 SBC2 READ
call S9xGetWord
Sbc16 ABS
OpFDM1:
AbsoluteIndexedX8 SBC READ
call S9xGetByte
Sbc8 ABSX
OpFDM0:
AbsoluteIndexedX8 SBC2 READ
call S9xGetWord
Sbc16 ABSX
OpF9M1:
AbsoluteIndexedY8 SBC READ
call S9xGetByte
Sbc8 ABSY
OpF9M0:
AbsoluteIndexedY8 SBC2 READ
call S9xGetWord
Sbc16 ABSY
OpEFM1:
AbsoluteLong8 SBC READ
call S9xGetByte
Sbc8 ABSL
OpEFM0:
AbsoluteLong8 SBC2 READ
call S9xGetWord
Sbc16 ABSL
OpFFM1:
AbsoluteLongIndexedX8 SBC READ
call S9xGetByte
Sbc8 ALX
OpFFM0:
AbsoluteLongIndexedX8 SBC2 READ
call S9xGetWord
Sbc16 ALX
OpE3M1:
StackRelative8 SBC READ
call S9xGetByte
Sbc8 SREL
OpE3M0:
StackRelative8 SBC2 READ
call S9xGetWord
Sbc16 SREL
OpF3M1:
StackRelativeIndirectIndexed8 SBC READ
call S9xGetByte
Sbc8 SRII
OpF3M0:
StackRelativeIndirectIndexed8 SBC2 READ
call S9xGetWord
Sbc16 SRII
/* STA */
Op85M1:
Direct8 STA WRITE
Sta8 DIR
Op85M0:
Direct8 STA2 WRITE
Sta16 DIR
Op95M1:
DirectIndexedX8 STA WRITE
Sta8 DIX
Op95M0:
DirectIndexedX8 STA2 WRITE
Sta16 DIX
Op92M1:
DirectIndirect8 STA WRITE
Sta8 DI
Op92M0:
DirectIndirect8 STA2 WRITE
Sta16 DI
Op81M1:
DirectIndexedIndirect8 STA WRITE
Sta8 DII
Op81M0:
DirectIndexedIndirect8 STA2 WRITE
Sta16 DII
Op91M1:
DirectIndirectIndexed8 STA WRITE
Sta8 DIIY
Op91M0:
DirectIndirectIndexed8 STA2 WRITE
Sta16 DIIY
Op87M1:
DirectIndirectLong8 STA WRITE
Sta8 DIL
Op87M0:
DirectIndirectLong8 STA2 WRITE
Sta16 DIL
Op97M1:
DirectIndirectIndexedLong8 STA WRITE
Sta8 DIIL
Op97M0:
DirectIndirectIndexedLong8 STA2 WRITE
Sta16 DIIL
Op8DM1:
Absolute8 STA WRITE
Sta8 ABS
Op8DM0:
Absolute8 STA WRITE
Sta16 ABS
Op9DM1:
AbsoluteIndexedX8 STA WRITE
Sta8 ABSX
Op9DM0:
AbsoluteIndexedX8 STA2 WRITE
Sta16 ABSX
Op99M1:
AbsoluteIndexedY8 STA WRITE
Sta8 ABSY
Op99M0:
AbsoluteIndexedY8 STA2 WRITE
Sta16 ABSY
Op8FM1:
AbsoluteLong8 STA WRITE
Sta8 ABSL
Op8FM0:
AbsoluteLong8 STA2 WRITE
Sta16 ABSL
Op9FM1:
AbsoluteLongIndexedX8 STA WRITE
Sta8 ALX
Op9FM0:
AbsoluteLongIndexedX8 STA2 WRITE
Sta16 ALX
Op83M1:
StackRelative8 STA WRITE
Sta8 SREL
Op83M0:
StackRelative8 STA2 WRITE
Sta16 SREL
Op93M1:
StackRelativeIndirectIndexed8 STA WRITE
Sta8 SRII
Op93M0:
StackRelativeIndirectIndexed8 STA2 WRITE
Sta16 SRII
/* STX */
Op86X1:
Direct8 STX WRITE
Stx8 DIR
Op86X0:
Direct8 STX2 WRITE
Stx16 DIR
Op96X1:
DirectIndexedY8 STX WRITE
Stx8 DIY
Op96X0:
DirectIndexedY8 STX2 WRITE
Stx16 DIY
Op8EX1:
Absolute8 STX WRITE
Stx8 ABS
Op8EX0:
Absolute8 STX2 WRITE
Stx16 ABS
/* STY */
Op84X1:
Direct8 STY WRITE
Sty8 DIR
Op84X0:
Direct8 STY2 WRITE
Sty16 DIR
Op94X1:
DirectIndexedX8 STY WRITE
Sty8 DIX
Op94X0:
DirectIndexedX8 STY2 WRITE
Sty16 DIX
Op8CX1:
Absolute8 STY WRITE
Sty8 ABS
Op8CX0:
Absolute8 STY2 WRITE
Sty16 ABS
/* STZ */
Op64M1:
Direct8 STZ WRITE
Stz8 DIR
Op64M0:
Direct8 STZ2 WRITE
Stz16 DIR
Op74M1:
DirectIndexedX8 STZ WRITE
Stz8 DIX
Op74M0:
DirectIndexedX8 STZ2 WRITE
Stz16 DIX
Op9CM1:
Absolute8 STZ WRITE
Stz8 ABS
Op9CM0:
Absolute8 STZ2 WRITE
Stz16 ABS
Op9EM1:
AbsoluteIndexedX8 STZ WRITE
Stz8 ABSX
Op9EM0:
AbsoluteIndexedX8 STZ2 WRITE
Stz16 ABSX
/* TRB */
Op14M1:
Direct8 TRB MODIFY
Trb8 DIR
Op14M0:
Direct8 TRB2 MODIFY
Trb16 DIR
Op1CM1:
Absolute8 TRB MODIFY
Trb8 ABS
Op1CM0:
Absolute8 TRB2 MODIFY
Trb16 ABS
/* TSB */
Op04M1:
Direct8 TSB MODIFY
Tsb8 DIR
Op04M0:
Direct8 TSB2 MODIFY
Tsb16 DIR
Op0CM1:
Absolute8 TSB MODIFY
Tsb8 ABS
Op0CM0:
Absolute8 TSB2 MODIFY
Tsb16 ABS
/* BCC */
Op90:
Relative JUMP
BranchCheck0 BCC
testb $0xff, _Carry
jnz .BCC_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
.BCC_EXIT:
jmp MainAsmLoop
/* BCS */
OpB0:
Relative JUMP
BranchCheck0 BCS
testb $0xff, _Carry
jz .BCS_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
.BCS_EXIT:
jmp MainAsmLoop
/* BEQ */
OpF0:
Relative JUMP
BranchCheck2 BEQ
testb $0xff, _Zero
jnz .BEQ_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
CPUShutdown BEQ
.BEQ_EXIT:
jmp MainAsmLoop
/* BMI */
Op30:
Relative JUMP
BranchCheck1 BMI
testb $0x80, _Negative
jz .BMI_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
CPUShutdown BMI
.BMI_EXIT:
jmp MainAsmLoop
/* BNE */
OpD0:
Relative JUMP
BranchCheck1 BNE
testb $0xff, _Zero
jz .BNE_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
CPUShutdown BNE
.BNE_EXIT:
jmp MainAsmLoop
/* BPL */
Op10:
Relative JUMP
BranchCheck1 BPL
testb $0x80, _Negative
jnz .BPL_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
CPUShutdown BPL
.BPL_EXIT:
jmp MainAsmLoop
/* BRA */
Op80:
Relative JUMP
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
jmp MainAsmLoop
/* BVC */
Op50:
Relative JUMP
BranchCheck0 BVC
testb $0xff, _Overflow
jnz .BVC_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
CPUShutdown BVC
.BVC_EXIT:
jmp MainAsmLoop
/* BVS */
Op70:
Relative JUMP
BranchCheck0 BVS
testb $0xff, _Overflow
jz .BVS_EXIT
addl $6, CYCLES
andl $0xffff, %edx
addl PCBase, %edx
movl %edx, PC
CPUShutdown BVS
.BVS_EXIT:
jmp MainAsmLoop
/* BRL */
Op82:
RelativeLong BRL JUMP
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
/* CLC */
Op18:
movb $0, _Carry
addl $6, CYCLES
jmp MainAsmLoop
/* CLD */
OpD8:
andb $~Decimal, FLAGS
addl $6, CYCLES
jmp MainAsmLoop
/* CLI */
Op58:
andb $~IRQ, FLAGS
addl $6, CYCLES
#if 0 /* C version has this commented out? */
cmpb $0, IRQActive
jz .CLI_EXIT
/* XXX: test for Settings.DisableIRQ */
call S9xOpcode_IRQ
#endif
.CLI_EXIT:
jmp MainAsmLoop
/* CLV */
OpB8:
movb $0, _Overflow
addl $6, CYCLES
jmp MainAsmLoop
/* DEX */
OpCAX1:
addl $6, CYCLES
movb XL, %al
decb %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, XL
SetZN
jmp MainAsmLoop
OpCAX0:
addl $6, CYCLES
decw XX
setnz _Zero
movb XH, %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, _Negative
jmp MainAsmLoop
/* DEY */
Op88X1:
addl $6, CYCLES
movb YL, %al
decb %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, YL
SetZN
jmp MainAsmLoop
Op88X0:
addl $6, CYCLES
decw YY
setnz _Zero
movb YH, %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, _Negative
jmp MainAsmLoop
/* INX */
OpE8X1:
addl $6, CYCLES
movb XL, %al
incb %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, XL
SetZN
jmp MainAsmLoop
OpE8X0:
addl $6, CYCLES
incw XX
setnz _Zero
movb XH, %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, _Negative
jmp MainAsmLoop
/* INY */
OpC8X1:
addl $6, CYCLES
movb YL, %al
incb %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, YL
SetZN
jmp MainAsmLoop
OpC8X0:
addl $6, CYCLES
incw YY
setnz _Zero
movb YH, %al
#ifdef CPU_SHUTDOWN
movl $0, WaitAddress
#endif
movb %al, _Negative
jmp MainAsmLoop
/* NOP */
OpEA:
addl $6,CYCLES
jmp MainAsmLoop
/* PEA */
OpF4E1:
Immediate16 PEA NONE
PushWordENew PEA
jmp MainAsmLoop
OpF4:
Immediate16 PEA NONE
PushWord PEA
jmp MainAsmLoop
/* PEI */
OpD4E1:
DirectIndirect8 PEI NONE
movl %edx, %eax
PushWordENew PEI
jmp MainAsmLoop
OpD4:
DirectIndirect8 PEI NONE
movl %edx, %eax
PushWord PEI
jmp MainAsmLoop
/* PER */
Op62E1:
RelativeLong PER NONE
movl %edx, %eax
PushWordENew PER
jmp MainAsmLoop
Op62:
RelativeLong PER NONE
movl %edx, %eax
PushWord PER
jmp MainAsmLoop
/* PHA */
Op48E1:
addl $6, CYCLES
movb AL, %al
PushByteE PHA
jmp MainAsmLoop
Op48M1:
addl $6, CYCLES
movb AL, %al
PushByte PHA
jmp MainAsmLoop
Op48M0:
addl $6, CYCLES
movw AA, %ax
PushWord PHA
jmp MainAsmLoop
/* PHB */
Op8BE1:
addl $6, CYCLES
movb DB, %al
PushByteE PHB
jmp MainAsmLoop
Op8B:
addl $6, CYCLES
movb DB, %al
PushByte PHB
jmp MainAsmLoop
/* PHD */
Op0BE1:
addl $6, CYCLES
movw DD, %ax
PushWordENew PHD
jmp MainAsmLoop
Op0B:
addl $6, CYCLES
movw DD, %ax
PushWord PHD
jmp MainAsmLoop
/* PHK */
Op4BE1:
addl $6, CYCLES
movb PB, %al
PushByteE PHK
jmp MainAsmLoop
Op4B:
addl $6, CYCLES
movb PB, %al
PushByte PHK
jmp MainAsmLoop
/* PHP */
Op08E1:
addl $6, CYCLES
S9xPackStatus PHP
movb FLAGS, %al
PushByteE PHP
jmp MainAsmLoop
Op08:
addl $6, CYCLES
S9xPackStatus PHP
movb FLAGS, %al
PushByte PHP
jmp MainAsmLoop
/* PHX */
OpDAE1:
addl $6, CYCLES
movb XL, %al
PushByteE PHX
jmp MainAsmLoop
OpDAX1:
addl $6, CYCLES
movb XL, %al
PushByte PHX
jmp MainAsmLoop
OpDAX0:
addl $6, CYCLES
movw XX, %ax
PushWord PHX
jmp MainAsmLoop
/* PHY */
Op5AE1:
addl $6, CYCLES
movb YL, %al
PushByteE PHY
jmp MainAsmLoop
Op5AX1:
addl $6, CYCLES
movb YL, %al
PushByte PHY
jmp MainAsmLoop
Op5AX0:
addl $6, CYCLES
movw YY, %ax
PushWord PHY
jmp MainAsmLoop
/* PLA */
Op68E1:
addl $12, CYCLES
PullByteE PLA
movb %al, AL
SetZN
jmp MainAsmLoop
Op68M1:
addl $12, CYCLES
PullByte PLA
movb %al, AL
SetZN
jmp MainAsmLoop
Op68M0:
addl $12, CYCLES
PullWord PLA
movw %ax, AA
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* PLB */
OpABE1:
addl $12, CYCLES
PullByteE PLB
movb %al, DB
SetZN
andl $0xff, %eax
sall $16, %eax
movl %eax, ShiftedDB
jmp MainAsmLoop
OpAB:
addl $12, CYCLES
PullByte PLB
movb %al, DB
SetZN
andl $0xff, %eax
sall $16, %eax
movl %eax, ShiftedDB
jmp MainAsmLoop
/* PLD */
Op2BE1:
addl $12, CYCLES
PullWordENew PLD
movw %ax, DD
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
Op2B:
addl $12, CYCLES
PullWord PLD
movw %ax, DD
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* PLP */
Op28E1:
addl $12, CYCLES
PullByteE PLPE
movb %al, FLAGS
testb $IndexFlag, FLAGS
jz .PLP16E
xorb %al, %al
movb %al, XH
movb %al, YH
.PLP16E:
S9xUnpackStatus PLPE
S9xFixCycles PLPE
/* CheckForIrq PLP */
jmp MainAsmLoop
Op28:
addl $12, CYCLES
PullByte PLP
movb %al, FLAGS
testb $IndexFlag, FLAGS
jz .PLP16
xorb %al, %al
movb %al, XH
movb %al, YH
.PLP16:
S9xUnpackStatus PLP
S9xFixCycles PLP
/* CheckForIrq PLP */
jmp MainAsmLoop
/* PLX */
OpFAE1:
addl $12, CYCLES
PullByteE PLX
movb %al, XL
SetZN
jmp MainAsmLoop
OpFAX1:
addl $12, CYCLES
PullByte PLX
movb %al, XL
SetZN
jmp MainAsmLoop
OpFAX0:
addl $12, CYCLES
PullWord PLX
movw %ax, XX
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* PLY */
Op7AE1:
addl $12, CYCLES
PullByteE PLY
movb %al, YL
SetZN
jmp MainAsmLoop
Op7AX1:
addl $12, CYCLES
PullByte PLY
movb %al, YL
SetZN
jmp MainAsmLoop
Op7AX0:
addl $12, CYCLES
PullWord PLY
movw %ax, YY
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* SEC */
Op38:
movb $1, _Carry
addl $6, CYCLES
jmp MainAsmLoop
/* SED */
OpF8:
orb $Decimal, FLAGS
addl $6, CYCLES
jmp MainAsmLoop
/* SEI */
Op78:
orb $IRQ, FLAGS
addl $6, CYCLES
jmp MainAsmLoop
/* TAX */
OpAAX1:
addl $6, CYCLES
movb AL, %al
movb %al, XL
SetZN
jmp MainAsmLoop
OpAAX0:
addl $6, CYCLES
movw AA, %ax
movw %ax, XX
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TAY */
OpA8X1:
addl $6, CYCLES
movb AL, %al
movb %al, YL
SetZN
jmp MainAsmLoop
OpA8X0:
addl $6, CYCLES
movw AA, %ax
movw %ax, YY
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TCD */
Op5B:
addl $6, CYCLES
movw AA, %ax
movw %ax, DD
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TCS */
Op1B:
addl $6, CYCLES
movw AA, %ax
movw %ax, SS
testw $Emulation, FLAGS16
jz .TCS_EXIT
movb $1, SH
.TCS_EXIT:
jmp MainAsmLoop
/* TDC */
Op7B:
addl $6, CYCLES
movw DD, %ax
movw %ax, AA
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TSC */
Op3B:
addl $6, CYCLES
movw SS, %ax
movw %ax, AA
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TSX */
OpBAX1:
addl $6, CYCLES
movb SL, %al
movb %al, XL
SetZN
jmp MainAsmLoop
OpBAX0:
addl $6, CYCLES
movw SS, %ax
movw %ax, XX
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TXA */
Op8AM1:
addl $6, CYCLES
movb XL, %al
movb %al, AL
SetZN
jmp MainAsmLoop
Op8AM0:
addl $6, CYCLES
movw XX, %ax
movw %ax, AA
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TXS */
Op9A:
addl $6, CYCLES
movw XX, %ax
movw %ax, SS
testw $Emulation, FLAGS16
jz .TXS_EXIT
movb $1, SH
.TXS_EXIT:
jmp MainAsmLoop
/* TXY */
Op9BX1:
addl $6, CYCLES
movb XL, %al
movb %al, YL
SetZN
jmp MainAsmLoop
Op9BX0:
addl $6, CYCLES
movw XX, %ax
movw %ax, YY
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TYA */
Op98M1:
addl $6, CYCLES
movb YL, %al
movb %al, AL
SetZN
jmp MainAsmLoop
Op98M0:
addl $6, CYCLES
movw YY, %ax
movw %ax, AA
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* TYX */
OpBBX1:
addl $6, CYCLES
movb YL, %al
movb %al, XL
SetZN
jmp MainAsmLoop
OpBBX0:
addl $6, CYCLES
movw YY, %ax
movw %ax, XX
testw %ax, %ax
Set16ZN
jmp MainAsmLoop
/* XCE */
OpFB:
addl $6, CYCLES
movw FLAGS16, %ax
andw $~(Emulation | Carry), FLAGS16
GetCarry
jnc .XCE_NO_CARRY
orw $Emulation, FLAGS16
.XCE_NO_CARRY:
testw $Emulation, %ax
setnz _Carry
testw $Emulation, FLAGS16
jz .XCE_NO_EMULATION2
orw $(MemoryFlag | IndexFlag), FLAGS16
movb $1, SH
.XCE_NO_EMULATION2:
testw $IndexFlag, FLAGS16
jz .XCE_NO_INDEX
xorl %eax, %eax
movb %al, XH
movb %al, YH
.XCE_NO_INDEX:
S9xFixCycles XCE
jmp MainAsmLoop
.data
.LC0:
.string "*** BRK"
.text
Op00:
#ifdef DEBUGGER
testb $TRACE_FLAG, Flags
je .BRK_NO_TRACE
pushl $.LC0
ccall S9xTraceMessage
addl $4,%esp
.BRK_NO_TRACE:
#endif
movb $1, BRKTriggered
testw $Emulation, FLAGS16
jnz .BRK_EMULATION
movb PB, %al
PushByte BRK1
movl PC, %eax
subl PCBase, %eax
incl %eax
PushWord BRK2
S9xPackStatus BRK
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte BRK3
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $12, CYCLES
movl $0xFFE6, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
call S9xSetPCBase
jmp MainAsmLoop
.BRK_EMULATION:
movl PC, %eax
subl PCBase, %eax
incl %eax
PushWord BRK2
S9xPackStatus BRK2
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte BRK3
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $6, CYCLES
movl $0xFFFE, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
call S9xSetPCBase
jmp MainAsmLoop
.data
.LC1:
.string "*** IRQ"
.text
.globl S9xOpcode_IRQ
S9xOpcode_IRQ:
#ifdef DEBUGGER
testb $TRACE_FLAG, Flags
je .IRQ_NO_TRACE
pushl $.LC1
ccall S9xTraceMessage
addl $4, %esp
.IRQ_NO_TRACE:
#endif
testw $Emulation, FLAGS16
jnz .IRQ_EMULATION
movb PB, %al
PushByte IRQ1
movl PC, %eax
subl PCBase, %eax
PushWord IRQ2
S9xPackStatus IRQ
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte IRQ3
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $12, CYCLES
testb $0xff, SA1Enabled
jz .noirqsa1vector
movl FillRAM, %eax
movb 0x2209(%eax), %dl
testb $0x40, %dl
jz .noirqsa1vector
xorl %edx, %edx
movw 0x220e(%eax), %dx
jmp S9xSetPCBase
.noirqsa1vector:
movl $0xFFEE, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
jmp S9xSetPCBase
.IRQ_EMULATION:
movl PC, %eax
subl PCBase, %eax
PushWord IRQ4
S9xPackStatus IRQ2
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte IRQ5
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $6, CYCLES
movl $0xFFFE, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
jmp S9xSetPCBase
.data
.LC2:
.string "*** NMI"
.text
.globl S9xOpcode_NMI
S9xOpcode_NMI:
#ifdef DEBUGGER
testb $TRACE_FLAG, Flags
je .NMI_NO_TRACE
pushl $.LC2
ccall S9xTraceMessage
addl $4, %esp
.NMI_NO_TRACE:
#endif
testw $Emulation, FLAGS16
jnz .NMI_EMULATION
movb PB, %al
PushByte NMI1
movl PC, %eax
subl PCBase, %eax
PushWord NMI2
S9xPackStatus NMI
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte NMI3
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $12, CYCLES
movl $0xFFEA, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
jmp S9xSetPCBase
.NMI_EMULATION:
movl PC, %eax
subl PCBase, %eax
PushWord NMI4
S9xPackStatus NMI2
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte NMI5
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $6, CYCLES
movl $0xFFFA, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
jmp S9xSetPCBase
.data
.LC3:
.string "*** COP"
.text
Op02:
#ifdef DEBUGGER
testb $TRACE_FLAG, Flags
je .COP_NO_TRACE
pushl $.LC3
ccall S9xTraceMessage
addl $4,%esp
.COP_NO_TRACE:
#endif
testw $Emulation, FLAGS16
jnz .COP_EMULATION
movb PB, %al
PushByte COP1
movl PC, %eax
subl PCBase, %eax
incl %eax
PushWord COP2
S9xPackStatus COP
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte COP3
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $12, CYCLES
movl $0xFFE4, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
call S9xSetPCBase
jmp MainAsmLoop
.COP_EMULATION:
movl PC, %eax
subl PCBase, %eax
incl %eax
PushWord COP4
S9xPackStatus COP2
movb FLAGS, %al
movb %al, OpenBus
andb $~Decimal, FLAGS
orb $IRQ, FLAGS
PushByte COP5
xorl %ecx, %ecx
movl %ecx, ShiftedPB
movb %cl, PB
addl $6, CYCLES
movl $0xFFF4, %edx
call S9xGetWord
movl %eax, %edx
andl $0xffff, %edx
call S9xSetPCBase
jmp MainAsmLoop
/* JML */
OpDC:
AbsoluteIndirectLong8 JML JUMP
movl %edx, %ecx
andl $0xff0000, %ecx
movl %ecx, ShiftedPB
sarl $16, %ecx
movb %cl, PB
addl $12, CYCLES
call S9xSetPCBase
jmp MainAsmLoop
Op5C:
AbsoluteLong8 JML JUMP
movl %edx, %ecx
andl $0xff0000, %ecx
movl %ecx, ShiftedPB
sarl $16, %ecx
movb %cl, PB
call S9xSetPCBase
jmp MainAsmLoop
/* JMP */
Op4C:
Absolute8 JMP JUMP
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
Op6C:
AbsoluteIndirect8 JMP JUMP
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
Op7C:
AbsoluteIndexedIndirect8 JMP JUMP
addl $6, CYCLES
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
/* JSL */
Op22E1:
movb PB, %al
PushByte JSL_ABSL_E
movl PC, %eax
subl PCBase, %eax
addl $2, %eax
PushWordENew JSL_ABSL_E
AbsoluteLong8 JSL JUMP
movl %edx, %ecx
andl $0xff0000, %ecx
movl %ecx, ShiftedPB
sarl $16, %ecx
movb %cl, PB
call S9xSetPCBase
jmp MainAsmLoop
Op22:
movb PB, %al
PushByte JSL_ABSL
movl PC, %eax
subl PCBase, %eax
addl $2, %eax
PushWord JSL_ABSL
AbsoluteLong8 JSL JUMP
movl %edx, %ecx
andl $0xff0000, %ecx
movl %ecx, ShiftedPB
sarl $16, %ecx
movb %cl, PB
call S9xSetPCBase
jmp MainAsmLoop
/* RTL */
Op6BE1:
addl $12, CYCLES
PullWord RTL_E
pushl %eax
PullByte RTL_E
movl SS, %edx
addl $0xFF, %edx
movb $0x01, %dh
movw %dx, SS
popl %edx
movb %al, PB
incw %dx
andl $0xff, %eax
andl $0xffff, %edx
sall $16, %eax
movl %eax, ShiftedPB
orl %eax, %edx
call S9xSetPCBase
jmp MainAsmLoop
Op6B:
addl $12, CYCLES
PullWord RTL
pushl %eax
PullByte RTL
popl %edx
movb %al, PB
incw %dx
andl $0xff, %eax
andl $0xffff, %edx
sall $16, %eax
movl %eax, ShiftedPB
orl %eax, %edx
call S9xSetPCBase
jmp MainAsmLoop
/* JSR ABS */
Op20:
addl $6, CYCLES
movl PC, %eax
subl PCBase, %eax
incl %eax
PushWord JSR_ABS
Absolute8 JSR_ABS JUMP
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
/* JSR ABS INDEXED INDIRECT */
OpFCE1:
addl $6, CYCLES
movl PC, %eax
subl PCBase, %eax
incl %eax
PushWordENew JSR_AII_E
AbsoluteIndexedIndirect8 JSR JUMP
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
OpFC:
addl $6, CYCLES
movl PC, %eax
subl PCBase, %eax
incl %eax
PushWord JSR_AII
AbsoluteIndexedIndirect8 JSR JUMP
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
/* RTS */
Op60:
addl $6 * 3, CYCLES
PullWord RTS
incl %eax
movl %eax, %edx
andl $0xffff, %edx
orl ShiftedPB, %edx
call S9xSetPCBase
jmp MainAsmLoop
/* MVN */
Op54X1:
addl MemSpeedx2, CYCLES
addl $12, CYCLES
xorl %edx, %edx
movb (PC), %dl
movb %dl, DB
sall $16, %edx
movl %edx, ShiftedDB
movb 1(PC), %dl
movb %dl, OpenBus
sall $16, %edx
movw XX, %dx
call S9xGetByte
movl ShiftedDB, %edx
movw YY, %dx
call S9xSetByte
incb XL
incb YL
movw AA, %ax
decw %ax
movw %ax, AA
cmpw $0xffff, %ax
je .MVN_EXIT8
decl PC
jmp MainAsmLoop
.MVN_EXIT8:
addl $2, PC
jmp MainAsmLoop
Op54X0:
addl MemSpeedx2, CYCLES
addl $12, CYCLES
xorl %edx, %edx
movb (PC), %dl
movb %dl, DB
sall $16, %edx
movl %edx, ShiftedDB
movb 1(PC), %dl
movb %dl, OpenBus
sall $16, %edx
movw XX, %dx
call S9xGetByte
movl ShiftedDB, %edx
movw YY, %dx
call S9xSetByte
incw XX
incw YY
movw AA, %ax
decw %ax
movw %ax, AA
cmpw $0xffff, %ax
je .MVN_EXIT16
decl PC
jmp MainAsmLoop
.MVN_EXIT16:
addl $2, PC
jmp MainAsmLoop
/* MVP */
Op44X1:
addl MemSpeedx2, CYCLES
addl $12, CYCLES
xorl %edx, %edx
movb (PC), %dl
movb %dl, DB
sall $16, %edx
movl %edx, ShiftedDB
movb 1(PC), %dl
movb %dl, OpenBus
sall $16, %edx
movw XX, %dx
call S9xGetByte
movl ShiftedDB, %edx
movw YY, %dx
call S9xSetByte
decb XL
decb YL
movw AA, %ax
decw %ax
movw %ax, AA
cmpw $0xffff, %ax
je .MVP_EXIT8
decl PC
jmp MainAsmLoop
.MVP_EXIT8:
addl $2, PC
jmp MainAsmLoop
Op44X0:
addl MemSpeedx2, CYCLES
addl $12, CYCLES
xorl %edx, %edx
movb (PC), %dl
movb %dl, DB
sall $16, %edx
movl %edx, ShiftedDB
movb 1(PC), %dl
movb %dl, OpenBus
sall $16, %edx
movw XX, %dx
call S9xGetByte
movl ShiftedDB, %edx
movw YY, %dx
call S9xSetByte
decw XX
decw YY
movw AA, %ax
decw %ax
movw %ax, AA
cmpw $0xffff, %ax
je .MVP_EXIT16
decl PC
jmp MainAsmLoop
.MVP_EXIT16:
addl $2, PC
jmp MainAsmLoop
/* REP */
OpC2:
addl MemSpeed, CYCLES
addl $6, CYCLES
movb (PC), %al
incl PC
notb %al
andb %al, FLAGS
andb %al, _Negative
andb %al, _Carry
testb $Zero, %al
setz %ah
orb %ah, _Zero
shrb $6, %al
andb %al, _Overflow
testw $Emulation, FLAGS16
jz .REP_NO_EMU
orb $(MemoryFlag | IndexFlag), FLAGS
.REP_NO_EMU:
testb $IndexFlag, FLAGS
jz .REP16
xorb %al, %al
movb %al, XH
movb %al, YH
.REP16:
S9xFixCycles REP
/* CheckForIrq REP */
jmp MainAsmLoop
/* SEP */
OpE2:
addl MemSpeed, CYCLES
addl $6, CYCLES
movb (PC), %al
incl PC
orb %al, FLAGS
orb %al, _Negative
movb %al, %ah
shrb $6, %ah
andb $1, %ah
orb %ah, _Overflow
test $Zero, %al
jz .SEP_NO_ZERO
movb $0, _Zero
.SEP_NO_ZERO:
andb $1, %al
orb %al, _Carry
testw $Emulation, FLAGS16
jz .SEP_NO_EMU
orb $(MemoryFlag | IndexFlag), FLAGS
.SEP_NO_EMU:
testb $IndexFlag, FLAGS
jz .SEP16
xorb %al, %al
movb %al, XH
movb %al, YH
.SEP16:
S9xFixCycles SEP
jmp MainAsmLoop
/* XBA */
OpEB:
addl $12, CYCLES
movb AL, %ah
movb AH, %al
movb %ah, AH
movb %al, AL
SetZN
jmp MainAsmLoop
/* RTI */
Op40:
addl $12, CYCLES
PullByte RTI
movb %al, FLAGS
PullWord RTI
andl $0xffff, %eax
pushl %eax
testw $Emulation, FLAGS16
jnz .RTI_EMU
PullByte RTI2
andl $0xff, %eax
jmp .RTI_SKIP_EMU
.RTI_EMU:
orb $(MemoryFlag | IndexFlag), FLAGS
/*XXX: HERE xorl %eax, %eax*/
movl ShiftedPB, %eax
sarl $16, %eax
.RTI_SKIP_EMU:
movb %al, PB
popl %edx
sall $16, %eax
orl %eax, %edx
movl %eax, ShiftedPB
call S9xSetPCBase
testb $IndexFlag, FLAGS
jz .RTI16
xorb %al, %al
movb %al, XH
movb %al, YH
.RTI16:
S9xUnpackStatus RTI
S9xFixCycles RTI
/* CheckForIrq RTI */
jmp MainAsmLoop
/* WAI */
OpCB:
#if 0
cmpb $0, IRQActive
je .L5334
addl $12, CYCLES
jmp MainAsmLoop
.L5334:
#endif
movb $1, WaitingForInterrupt
decl PC
movb Shutdown, %al
testb %al, %al
je .NoShutdown
movl NextEvent, CYCLES
SAVE_CYCLES
ccall S9xUpdateAPUTimer
cmpb $0, APUExecuting
je MainAsmLoop
movb $0, CPUExecuting
.WAITExecAPU:
#ifdef DEBUGGER
testb $2,APUFlags
je .WAITNoAPUS9xTrace
STORE_REGISTERS
ccall S9xTraceAPU
LOAD_REGISTERS
.WAITNoAPUS9xTrace:
#endif
xorl %eax,%eax
#ifdef SPC700_C
movl APUPC,%edx
SAVE_CYCLES
movb (%edx),%al
#else
movb (APUPC),%al
#endif
movl S9xAPUCycles(,%eax,4), %edx
movl S9xApuOpcodes(,%eax,4),%eax
addl %edx, APUCycles
call *%eax
#ifdef SPC700_C
LOAD_CYCLES
#endif
movl NextEvent, %eax
cmpl %eax, APUCycles
jl .WAITExecAPU
movb $1, CPUExecuting
jmp MainAsmLoop
.NoShutdown:
addl $12, CYCLES
jmp MainAsmLoop
/* STP */
OpDB:
decl PC
orb $DEBUG_MODE_FLAG, Flags
jmp MainAsmLoop
/* Reserved opcode (WDM) */
Op42:
jmp MainAsmLoop
.globl S9xOpcodesM1X1
.data
.align 4
S9xOpcodesM1X1:
.long Op00
.long Op01M1
.long Op02
.long Op03M1
.long Op04M1
.long Op05M1
.long Op06M1
.long Op07M1
.long Op08
.long Op09M1
.long Op0AM1
.long Op0B
.long Op0CM1
.long Op0DM1
.long Op0EM1
.long Op0FM1
.long Op10
.long Op11M1
.long Op12M1
.long Op13M1
.long Op14M1
.long Op15M1
.long Op16M1
.long Op17M1
.long Op18
.long Op19M1
.long Op1AM1
.long Op1B
.long Op1CM1
.long Op1DM1
.long Op1EM1
.long Op1FM1
.long Op20
.long Op21M1
.long Op22
.long Op23M1
.long Op24M1
.long Op25M1
.long Op26M1
.long Op27M1
.long Op28
.long Op29M1
.long Op2AM1
.long Op2B
.long Op2CM1
.long Op2DM1
.long Op2EM1
.long Op2FM1
.long Op30
.long Op31M1
.long Op32M1
.long Op33M1
.long Op34M1
.long Op35M1
.long Op36M1
.long Op37M1
.long Op38
.long Op39M1
.long Op3AM1
.long Op3B
.long Op3CM1
.long Op3DM1
.long Op3EM1
.long Op3FM1
.long Op40
.long Op41M1
.long Op42
.long Op43M1
.long Op44X1
.long Op45M1
.long Op46M1
.long Op47M1
.long Op48M1
.long Op49M1
.long Op4AM1
.long Op4B
.long Op4C
.long Op4DM1
.long Op4EM1
.long Op4FM1
.long Op50
.long Op51M1
.long Op52M1
.long Op53M1
.long Op54X1
.long Op55M1
.long Op56M1
.long Op57M1
.long Op58
.long Op59M1
.long Op5AX1
.long Op5B
.long Op5C
.long Op5DM1
.long Op5EM1
.long Op5FM1
.long Op60
.long Op61M1
.long Op62
.long Op63M1
.long Op64M1
.long Op65M1
.long Op66M1
.long Op67M1
.long Op68M1
.long Op69M1
.long Op6AM1
.long Op6B
.long Op6C
.long Op6DM1
.long Op6EM1
.long Op6FM1
.long Op70
.long Op71M1
.long Op72M1
.long Op73M1
.long Op74M1
.long Op75M1
.long Op76M1
.long Op77M1
.long Op78
.long Op79M1
.long Op7AX1
.long Op7B
.long Op7C
.long Op7DM1
.long Op7EM1
.long Op7FM1
.long Op80
.long Op81M1
.long Op82
.long Op83M1
.long Op84X1
.long Op85M1
.long Op86X1
.long Op87M1
.long Op88X1
.long Op89M1
.long Op8AM1
.long Op8B
.long Op8CX1
.long Op8DM1
.long Op8EX1
.long Op8FM1
.long Op90
.long Op91M1
.long Op92M1
.long Op93M1
.long Op94X1
.long Op95M1
.long Op96X1
.long Op97M1
.long Op98M1
.long Op99M1
.long Op9A
.long Op9BX1
.long Op9CM1
.long Op9DM1
.long Op9EM1
.long Op9FM1
.long OpA0X1
.long OpA1M1
.long OpA2X1
.long OpA3M1
.long OpA4X1
.long OpA5M1
.long OpA6X1
.long OpA7M1
.long OpA8X1
.long OpA9M1
.long OpAAX1
.long OpAB
.long OpACX1
.long OpADM1
.long OpAEX1
.long OpAFM1
.long OpB0
.long OpB1M1
.long OpB2M1
.long OpB3M1
.long OpB4X1
.long OpB5M1
.long OpB6X1
.long OpB7M1
.long OpB8
.long OpB9M1
.long OpBAX1
.long OpBBX1
.long OpBCX1
.long OpBDM1
.long OpBEX1
.long OpBFM1
.long OpC0X1
.long OpC1M1
.long OpC2
.long OpC3M1
.long OpC4X1
.long OpC5M1
.long OpC6M1
.long OpC7M1
.long OpC8X1
.long OpC9M1
.long OpCAX1
.long OpCB
.long OpCCX1
.long OpCDM1
.long OpCEM1
.long OpCFM1
.long OpD0
.long OpD1M1
.long OpD2M1
.long OpD3M1
.long OpD4
.long OpD5M1
.long OpD6M1
.long OpD7M1
.long OpD8
.long OpD9M1
.long OpDAX1
.long OpDB
.long OpDC
.long OpDDM1
.long OpDEM1
.long OpDFM1
.long OpE0X1
.long OpE1M1
.long OpE2
.long OpE3M1
.long OpE4X1
.long OpE5M1
.long OpE6M1
.long OpE7M1
.long OpE8X1
.long OpE9M1
.long OpEA
.long OpEB
.long OpECX1
.long OpEDM1
.long OpEEM1
.long OpEFM1
.long OpF0
.long OpF1M1
.long OpF2M1
.long OpF3M1
.long OpF4
.long OpF5M1
.long OpF6M1
.long OpF7M1
.long OpF8
.long OpF9M1
.long OpFAX1
.long OpFB
.long OpFC
.long OpFDM1
.long OpFEM1
.long OpFFM1
.globl S9xOpcodesE1
.data
.align 4
S9xOpcodesE1:
.long Op00
.long Op01M1
.long Op02
.long Op03M1
.long Op04M1
.long Op05M1
.long Op06M1
.long Op07M1
.long Op08E1
.long Op09M1
.long Op0AM1
.long Op0BE1
.long Op0CM1
.long Op0DM1
.long Op0EM1
.long Op0FM1
.long Op10
.long Op11M1
.long Op12M1
.long Op13M1
.long Op14M1
.long Op15M1
.long Op16M1
.long Op17M1
.long Op18
.long Op19M1
.long Op1AM1
.long Op1B
.long Op1CM1
.long Op1DM1
.long Op1EM1
.long Op1FM1
.long Op20
.long Op21M1
.long Op22E1
.long Op23M1
.long Op24M1
.long Op25M1
.long Op26M1
.long Op27M1
.long Op28E1
.long Op29M1
.long Op2AM1
.long Op2BE1
.long Op2CM1
.long Op2DM1
.long Op2EM1
.long Op2FM1
.long Op30
.long Op31M1
.long Op32M1
.long Op33M1
.long Op34M1
.long Op35M1
.long Op36M1
.long Op37M1
.long Op38
.long Op39M1
.long Op3AM1
.long Op3B
.long Op3CM1
.long Op3DM1
.long Op3EM1
.long Op3FM1
.long Op40
.long Op41M1
.long Op42
.long Op43M1
.long Op44X1
.long Op45M1
.long Op46M1
.long Op47M1
.long Op48E1
.long Op49M1
.long Op4AM1
.long Op4BE1
.long Op4C
.long Op4DM1
.long Op4EM1
.long Op4FM1
.long Op50
.long Op51M1
.long Op52M1
.long Op53M1
.long Op54X1
.long Op55M1
.long Op56M1
.long Op57M1
.long Op58
.long Op59M1
.long Op5AE1
.long Op5B
.long Op5C
.long Op5DM1
.long Op5EM1
.long Op5FM1
.long Op60
.long Op61M1
.long Op62E1
.long Op63M1
.long Op64M1
.long Op65M1
.long Op66M1
.long Op67M1
.long Op68E1
.long Op69M1
.long Op6AM1
.long Op6BE1
.long Op6C
.long Op6DM1
.long Op6EM1
.long Op6FM1
.long Op70
.long Op71M1
.long Op72M1
.long Op73M1
.long Op74M1
.long Op75M1
.long Op76M1
.long Op77M1
.long Op78
.long Op79M1
.long Op7AE1
.long Op7B
.long Op7C
.long Op7DM1
.long Op7EM1
.long Op7FM1
.long Op80
.long Op81M1
.long Op82
.long Op83M1
.long Op84X1
.long Op85M1
.long Op86X1
.long Op87M1
.long Op88X1
.long Op89M1
.long Op8AM1
.long Op8BE1
.long Op8CX1
.long Op8DM1
.long Op8EX1
.long Op8FM1
.long Op90
.long Op91M1
.long Op92M1
.long Op93M1
.long Op94X1
.long Op95M1
.long Op96X1
.long Op97M1
.long Op98M1
.long Op99M1
.long Op9A
.long Op9BX1
.long Op9CM1
.long Op9DM1
.long Op9EM1
.long Op9FM1
.long OpA0X1
.long OpA1M1
.long OpA2X1
.long OpA3M1
.long OpA4X1
.long OpA5M1
.long OpA6X1
.long OpA7M1
.long OpA8X1
.long OpA9M1
.long OpAAX1
.long OpABE1
.long OpACX1
.long OpADM1
.long OpAEX1
.long OpAFM1
.long OpB0
.long OpB1M1
.long OpB2M1
.long OpB3M1
.long OpB4X1
.long OpB5M1
.long OpB6X1
.long OpB7M1
.long OpB8
.long OpB9M1
.long OpBAX1
.long OpBBX1
.long OpBCX1
.long OpBDM1
.long OpBEX1
.long OpBFM1
.long OpC0X1
.long OpC1M1
.long OpC2
.long OpC3M1
.long OpC4X1
.long OpC5M1
.long OpC6M1
.long OpC7M1
.long OpC8X1
.long OpC9M1
.long OpCAX1
.long OpCB
.long OpCCX1
.long OpCDM1
.long OpCEM1
.long OpCFM1
.long OpD0
.long OpD1M1
.long OpD2M1
.long OpD3M1
.long OpD4E1
.long OpD5M1
.long OpD6M1
.long OpD7M1
.long OpD8
.long OpD9M1
.long OpDAE1
.long OpDB
.long OpDC
.long OpDDM1
.long OpDEM1
.long OpDFM1
.long OpE0X1
.long OpE1M1
.long OpE2
.long OpE3M1
.long OpE4X1
.long OpE5M1
.long OpE6M1
.long OpE7M1
.long OpE8X1
.long OpE9M1
.long OpEA
.long OpEB
.long OpECX1
.long OpEDM1
.long OpEEM1
.long OpEFM1
.long OpF0
.long OpF1M1
.long OpF2M1
.long OpF3M1
.long OpF4E1
.long OpF5M1
.long OpF6M1
.long OpF7M1
.long OpF8
.long OpF9M1
.long OpFAE1
.long OpFB
.long OpFCE1
.long OpFDM1
.long OpFEM1
.long OpFFM1
.globl S9xOpcodesM1X0
.align 4
S9xOpcodesM1X0:
.long Op00
.long Op01M1
.long Op02
.long Op03M1
.long Op04M1
.long Op05M1
.long Op06M1
.long Op07M1
.long Op08
.long Op09M1
.long Op0AM1
.long Op0B
.long Op0CM1
.long Op0DM1
.long Op0EM1
.long Op0FM1
.long Op10
.long Op11M1
.long Op12M1
.long Op13M1
.long Op14M1
.long Op15M1
.long Op16M1
.long Op17M1
.long Op18
.long Op19M1
.long Op1AM1
.long Op1B
.long Op1CM1
.long Op1DM1
.long Op1EM1
.long Op1FM1
.long Op20
.long Op21M1
.long Op22
.long Op23M1
.long Op24M1
.long Op25M1
.long Op26M1
.long Op27M1
.long Op28
.long Op29M1
.long Op2AM1
.long Op2B
.long Op2CM1
.long Op2DM1
.long Op2EM1
.long Op2FM1
.long Op30
.long Op31M1
.long Op32M1
.long Op33M1
.long Op34M1
.long Op35M1
.long Op36M1
.long Op37M1
.long Op38
.long Op39M1
.long Op3AM1
.long Op3B
.long Op3CM1
.long Op3DM1
.long Op3EM1
.long Op3FM1
.long Op40
.long Op41M1
.long Op42
.long Op43M1
.long Op44X0
.long Op45M1
.long Op46M1
.long Op47M1
.long Op48M1
.long Op49M1
.long Op4AM1
.long Op4B
.long Op4C
.long Op4DM1
.long Op4EM1
.long Op4FM1
.long Op50
.long Op51M1
.long Op52M1
.long Op53M1
.long Op54X0
.long Op55M1
.long Op56M1
.long Op57M1
.long Op58
.long Op59M1
.long Op5AX0
.long Op5B
.long Op5C
.long Op5DM1
.long Op5EM1
.long Op5FM1
.long Op60
.long Op61M1
.long Op62
.long Op63M1
.long Op64M1
.long Op65M1
.long Op66M1
.long Op67M1
.long Op68M1
.long Op69M1
.long Op6AM1
.long Op6B
.long Op6C
.long Op6DM1
.long Op6EM1
.long Op6FM1
.long Op70
.long Op71M1
.long Op72M1
.long Op73M1
.long Op74M1
.long Op75M1
.long Op76M1
.long Op77M1
.long Op78
.long Op79M1
.long Op7AX0
.long Op7B
.long Op7C
.long Op7DM1
.long Op7EM1
.long Op7FM1
.long Op80
.long Op81M1
.long Op82
.long Op83M1
.long Op84X0
.long Op85M1
.long Op86X0
.long Op87M1
.long Op88X0
.long Op89M1
.long Op8AM1
.long Op8B
.long Op8CX0
.long Op8DM1
.long Op8EX0
.long Op8FM1
.long Op90
.long Op91M1
.long Op92M1
.long Op93M1
.long Op94X0
.long Op95M1
.long Op96X0
.long Op97M1
.long Op98M1
.long Op99M1
.long Op9A
.long Op9BX0
.long Op9CM1
.long Op9DM1
.long Op9EM1
.long Op9FM1
.long OpA0X0
.long OpA1M1
.long OpA2X0
.long OpA3M1
.long OpA4X0
.long OpA5M1
.long OpA6X0
.long OpA7M1
.long OpA8X0
.long OpA9M1
.long OpAAX0
.long OpAB
.long OpACX0
.long OpADM1
.long OpAEX0
.long OpAFM1
.long OpB0
.long OpB1M1
.long OpB2M1
.long OpB3M1
.long OpB4X0
.long OpB5M1
.long OpB6X0
.long OpB7M1
.long OpB8
.long OpB9M1
.long OpBAX0
.long OpBBX0
.long OpBCX0
.long OpBDM1
.long OpBEX0
.long OpBFM1
.long OpC0X0
.long OpC1M1
.long OpC2
.long OpC3M1
.long OpC4X0
.long OpC5M1
.long OpC6M1
.long OpC7M1
.long OpC8X0
.long OpC9M1
.long OpCAX0
.long OpCB
.long OpCCX0
.long OpCDM1
.long OpCEM1
.long OpCFM1
.long OpD0
.long OpD1M1
.long OpD2M1
.long OpD3M1
.long OpD4
.long OpD5M1
.long OpD6M1
.long OpD7M1
.long OpD8
.long OpD9M1
.long OpDAX0
.long OpDB
.long OpDC
.long OpDDM1
.long OpDEM1
.long OpDFM1
.long OpE0X0
.long OpE1M1
.long OpE2
.long OpE3M1
.long OpE4X0
.long OpE5M1
.long OpE6M1
.long OpE7M1
.long OpE8X0
.long OpE9M1
.long OpEA
.long OpEB
.long OpECX0
.long OpEDM1
.long OpEEM1
.long OpEFM1
.long OpF0
.long OpF1M1
.long OpF2M1
.long OpF3M1
.long OpF4
.long OpF5M1
.long OpF6M1
.long OpF7M1
.long OpF8
.long OpF9M1
.long OpFAX0
.long OpFB
.long OpFC
.long OpFDM1
.long OpFEM1
.long OpFFM1
.globl S9xOpcodesM0X0
.align 4
S9xOpcodesM0X0:
.long Op00
.long Op01M0
.long Op02
.long Op03M0
.long Op04M0
.long Op05M0
.long Op06M0
.long Op07M0
.long Op08
.long Op09M0
.long Op0AM0
.long Op0B
.long Op0CM0
.long Op0DM0
.long Op0EM0
.long Op0FM0
.long Op10
.long Op11M0
.long Op12M0
.long Op13M0
.long Op14M0
.long Op15M0
.long Op16M0
.long Op17M0
.long Op18
.long Op19M0
.long Op1AM0
.long Op1B
.long Op1CM0
.long Op1DM0
.long Op1EM0
.long Op1FM0
.long Op20
.long Op21M0
.long Op22
.long Op23M0
.long Op24M0
.long Op25M0
.long Op26M0
.long Op27M0
.long Op28
.long Op29M0
.long Op2AM0
.long Op2B
.long Op2CM0
.long Op2DM0
.long Op2EM0
.long Op2FM0
.long Op30
.long Op31M0
.long Op32M0
.long Op33M0
.long Op34M0
.long Op35M0
.long Op36M0
.long Op37M0
.long Op38
.long Op39M0
.long Op3AM0
.long Op3B
.long Op3CM0
.long Op3DM0
.long Op3EM0
.long Op3FM0
.long Op40
.long Op41M0
.long Op42
.long Op43M0
.long Op44X0
.long Op45M0
.long Op46M0
.long Op47M0
.long Op48M0
.long Op49M0
.long Op4AM0
.long Op4B
.long Op4C
.long Op4DM0
.long Op4EM0
.long Op4FM0
.long Op50
.long Op51M0
.long Op52M0
.long Op53M0
.long Op54X0
.long Op55M0
.long Op56M0
.long Op57M0
.long Op58
.long Op59M0
.long Op5AX0
.long Op5B
.long Op5C
.long Op5DM0
.long Op5EM0
.long Op5FM0
.long Op60
.long Op61M0
.long Op62
.long Op63M0
.long Op64M0
.long Op65M0
.long Op66M0
.long Op67M0
.long Op68M0
.long Op69M0
.long Op6AM0
.long Op6B
.long Op6C
.long Op6DM0
.long Op6EM0
.long Op6FM0
.long Op70
.long Op71M0
.long Op72M0
.long Op73M0
.long Op74M0
.long Op75M0
.long Op76M0
.long Op77M0
.long Op78
.long Op79M0
.long Op7AX0
.long Op7B
.long Op7C
.long Op7DM0
.long Op7EM0
.long Op7FM0
.long Op80
.long Op81M0
.long Op82
.long Op83M0
.long Op84X0
.long Op85M0
.long Op86X0
.long Op87M0
.long Op88X0
.long Op89M0
.long Op8AM0
.long Op8B
.long Op8CX0
.long Op8DM0
.long Op8EX0
.long Op8FM0
.long Op90
.long Op91M0
.long Op92M0
.long Op93M0
.long Op94X0
.long Op95M0
.long Op96X0
.long Op97M0
.long Op98M0
.long Op99M0
.long Op9A
.long Op9BX0
.long Op9CM0
.long Op9DM0
.long Op9EM0
.long Op9FM0
.long OpA0X0
.long OpA1M0
.long OpA2X0
.long OpA3M0
.long OpA4X0
.long OpA5M0
.long OpA6X0
.long OpA7M0
.long OpA8X0
.long OpA9M0
.long OpAAX0
.long OpAB
.long OpACX0
.long OpADM0
.long OpAEX0
.long OpAFM0
.long OpB0
.long OpB1M0
.long OpB2M0
.long OpB3M0
.long OpB4X0
.long OpB5M0
.long OpB6X0
.long OpB7M0
.long OpB8
.long OpB9M0
.long OpBAX0
.long OpBBX0
.long OpBCX0
.long OpBDM0
.long OpBEX0
.long OpBFM0
.long OpC0X0
.long OpC1M0
.long OpC2
.long OpC3M0
.long OpC4X0
.long OpC5M0
.long OpC6M0
.long OpC7M0
.long OpC8X0
.long OpC9M0
.long OpCAX0
.long OpCB
.long OpCCX0
.long OpCDM0
.long OpCEM0
.long OpCFM0
.long OpD0
.long OpD1M0
.long OpD2M0
.long OpD3M0
.long OpD4
.long OpD5M0
.long OpD6M0
.long OpD7M0
.long OpD8
.long OpD9M0
.long OpDAX0
.long OpDB
.long OpDC
.long OpDDM0
.long OpDEM0
.long OpDFM0
.long OpE0X0
.long OpE1M0
.long OpE2
.long OpE3M0
.long OpE4X0
.long OpE5M0
.long OpE6M0
.long OpE7M0
.long OpE8X0
.long OpE9M0
.long OpEA
.long OpEB
.long OpECX0
.long OpEDM0
.long OpEEM0
.long OpEFM0
.long OpF0
.long OpF1M0
.long OpF2M0
.long OpF3M0
.long OpF4
.long OpF5M0
.long OpF6M0
.long OpF7M0
.long OpF8
.long OpF9M0
.long OpFAX0
.long OpFB
.long OpFC
.long OpFDM0
.long OpFEM0
.long OpFFM0
.globl S9xOpcodesM0X1
.align 4
S9xOpcodesM0X1:
.long Op00
.long Op01M0
.long Op02
.long Op03M0
.long Op04M0
.long Op05M0
.long Op06M0
.long Op07M0
.long Op08
.long Op09M0
.long Op0AM0
.long Op0B
.long Op0CM0
.long Op0DM0
.long Op0EM0
.long Op0FM0
.long Op10
.long Op11M0
.long Op12M0
.long Op13M0
.long Op14M0
.long Op15M0
.long Op16M0
.long Op17M0
.long Op18
.long Op19M0
.long Op1AM0
.long Op1B
.long Op1CM0
.long Op1DM0
.long Op1EM0
.long Op1FM0
.long Op20
.long Op21M0
.long Op22
.long Op23M0
.long Op24M0
.long Op25M0
.long Op26M0
.long Op27M0
.long Op28
.long Op29M0
.long Op2AM0
.long Op2B
.long Op2CM0
.long Op2DM0
.long Op2EM0
.long Op2FM0
.long Op30
.long Op31M0
.long Op32M0
.long Op33M0
.long Op34M0
.long Op35M0
.long Op36M0
.long Op37M0
.long Op38
.long Op39M0
.long Op3AM0
.long Op3B
.long Op3CM0
.long Op3DM0
.long Op3EM0
.long Op3FM0
.long Op40
.long Op41M0
.long Op42
.long Op43M0
.long Op44X1
.long Op45M0
.long Op46M0
.long Op47M0
.long Op48M0
.long Op49M0
.long Op4AM0
.long Op4B
.long Op4C
.long Op4DM0
.long Op4EM0
.long Op4FM0
.long Op50
.long Op51M0
.long Op52M0
.long Op53M0
.long Op54X1
.long Op55M0
.long Op56M0
.long Op57M0
.long Op58
.long Op59M0
.long Op5AX1
.long Op5B
.long Op5C
.long Op5DM0
.long Op5EM0
.long Op5FM0
.long Op60
.long Op61M0
.long Op62
.long Op63M0
.long Op64M0
.long Op65M0
.long Op66M0
.long Op67M0
.long Op68M0
.long Op69M0
.long Op6AM0
.long Op6B
.long Op6C
.long Op6DM0
.long Op6EM0
.long Op6FM0
.long Op70
.long Op71M0
.long Op72M0
.long Op73M0
.long Op74M0
.long Op75M0
.long Op76M0
.long Op77M0
.long Op78
.long Op79M0
.long Op7AX1
.long Op7B
.long Op7C
.long Op7DM0
.long Op7EM0
.long Op7FM0
.long Op80
.long Op81M0
.long Op82
.long Op83M0
.long Op84X1
.long Op85M0
.long Op86X1
.long Op87M0
.long Op88X1
.long Op89M0
.long Op8AM0
.long Op8B
.long Op8CX1
.long Op8DM0
.long Op8EX1
.long Op8FM0
.long Op90
.long Op91M0
.long Op92M0
.long Op93M0
.long Op94X1
.long Op95M0
.long Op96X1
.long Op97M0
.long Op98M0
.long Op99M0
.long Op9A
.long Op9BX1
.long Op9CM0
.long Op9DM0
.long Op9EM0
.long Op9FM0
.long OpA0X1
.long OpA1M0
.long OpA2X1
.long OpA3M0
.long OpA4X1
.long OpA5M0
.long OpA6X1
.long OpA7M0
.long OpA8X1
.long OpA9M0
.long OpAAX1
.long OpAB
.long OpACX1
.long OpADM0
.long OpAEX1
.long OpAFM0
.long OpB0
.long OpB1M0
.long OpB2M0
.long OpB3M0
.long OpB4X1
.long OpB5M0
.long OpB6X1
.long OpB7M0
.long OpB8
.long OpB9M0
.long OpBAX1
.long OpBBX1
.long OpBCX1
.long OpBDM0
.long OpBEX1
.long OpBFM0
.long OpC0X1
.long OpC1M0
.long OpC2
.long OpC3M0
.long OpC4X1
.long OpC5M0
.long OpC6M0
.long OpC7M0
.long OpC8X1
.long OpC9M0
.long OpCAX1
.long OpCB
.long OpCCX1
.long OpCDM0
.long OpCEM0
.long OpCFM0
.long OpD0
.long OpD1M0
.long OpD2M0
.long OpD3M0
.long OpD4
.long OpD5M0
.long OpD6M0
.long OpD7M0
.long OpD8
.long OpD9M0
.long OpDAX1
.long OpDB
.long OpDC
.long OpDDM0
.long OpDEM0
.long OpDFM0
.long OpE0X1
.long OpE1M0
.long OpE2
.long OpE3M0
.long OpE4X1
.long OpE5M0
.long OpE6M0
.long OpE7M0
.long OpE8X1
.long OpE9M0
.long OpEA
.long OpEB
.long OpECX1
.long OpEDM0
.long OpEEM0
.long OpEFM0
.long OpF0
.long OpF1M0
.long OpF2M0
.long OpF3M0
.long OpF4
.long OpF5M0
.long OpF6M0
.long OpF7M0
.long OpF8
.long OpF9M0
.long OpFAX1
.long OpFB
.long OpFC
.long OpFDM0
.long OpFEM0
.long OpFFM0
;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 "src/i386/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 "src/i386/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
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%macro FETCHPIPE 0
; mov edx,[SfxPBR]
; mov edx,[SfxMemTable+edx*4]
; mov edx,[SfxCPB]
; mov edx,[SfxR15]
mov cl,[ebp]
%endmacro
%macro UpdateR14 0
; mov edx,[SfxROMBR]
; mov edx,[SfxMemTable+edx*4]
mov eax,[SfxCROM]
; and dword[SfxR14],0FFFFh
add eax,[SfxR14]
mov [SfxRomBuffer],eax
%endmacro
%macro UpdateR15 0
mov ebp,[SfxCPB]
add ebp,[SfxR15]
%endmacro
%macro CLRFLAGS 0
;and dword [SfxSFR],0FFFFh-0100h-0200h-1000h ; Clear ALT1,ALT2 and B Flags
; xor ch,ch
; mov dword [SfxB],0 ; Clear B Flag
; mov esi,SfxR0
; mov edi,SfxR0
%endmacro
%macro TORN 1 ; V
FETCHPIPE
mov edi, SfxR0+%1*4
inc ebp ; Increase program counter
call [FxTable+ecx*4]
mov edi,SfxR0
ret
%endmacro
%macro WITH 1 ; Verified.
FETCHPIPE
mov esi,SfxR0+%1*4
mov edi,SfxR0+%1*4
mov dword [SfxB],1
inc ebp ; Increase program counter
call [FxTablec+ecx*4]
mov esi,SfxR0
mov edi,SfxR0
mov dword [SfxB],0 ; Clear B Flag
ret
%endmacro
%macro STWRN 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
mov ebx,[SfxRAMMem]
mov dword [SfxLastRamAdr],eax ; Save last ram address
add dword [SfxLastRamAdr],ebx ; Save last ram address
mov edx,[esi] ; Read Source
FETCHPIPE
mov [ebx+eax],dl ; Store Word
xor eax,1
inc ebp ; Increase program counter
mov [ebx+eax],dh ; Store Word
CLRFLAGS
ret
%endmacro
%macro STBRN 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
FETCHPIPE
add eax,[SfxRAMMem]
mov dword [SfxLastRamAdr],eax ; Save last ram address
mov ebx,[esi] ; Read Source
mov byte [eax],bl ; Store Byte
CLRFLAGS
inc ebp ; Increase program counter
ret
%endmacro
%macro LDWRN 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
mov ebx,[SfxRAMMem]
mov dword [SfxLastRamAdr],eax ; Save last ram address
FETCHPIPE
mov dl,[ebx+eax] ; Store Word
add dword [SfxLastRamAdr],ebx ; Save last ram address
xor eax,1
and edx,0FFFFh
inc ebp ; Increase program counter
mov dh,[ebx+eax] ; Store Word
mov [edi],edx ; Read Source
CLRFLAGS
ret
%endmacro
%macro LDBRN 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
FETCHPIPE
add eax,[SfxRAMMem]
xor ebx,ebx
mov dword [SfxLastRamAdr],eax ; Save last ram address
mov bl,[eax] ; Read Byte
inc ebp ; Increase program counter
mov [edi],ebx ; Store Result
CLRFLAGS
ret
%endmacro
; test byte[SfxPOR],01h
; jnz .nozerocheck
; test byte[SfxPOR],02h
; jz .nodither
; **** Can pre-calculate [SfxSCBR] << 10 + [sfxramdata]
; Pre-calculate fxbit values from color register
%macro drawpix4b 0
and [eax],edx
and [eax+16],edx
xor edx,0FFFFFFFFh
mov ebx,[fxbit01pcal]
and ebx,edx
or [eax], ebx
and edx,[fxbit23pcal]
or [eax+16], edx
%endmacro
%macro drawpix4bd 0
and [eax],edx
and [eax+16],edx
xor edx,0FFFFFFFFh
mov ebx,[fxbit45pcal]
and ebx,edx
or [eax], ebx
and edx,[fxbit67pcal]
or [eax+16], edx
%endmacro
%macro drawpix2b 0
and [eax],edx
xor edx,0FFFFFFFFh
and edx,[fxbit01pcal]
or [eax], edx
%endmacro
%macro drawpix2bd 0
and [eax],edx
xor edx,0FFFFFFFFh
and edx,[fxbit45pcal]
or [eax], edx
%endmacro
%macro drawpix8b 0
and [eax],edx
and [eax+16],edx
and [eax+32],edx
and [eax+48],edx
xor edx,0FFFFFFFFh
mov ebx,[fxbit01pcal]
and ebx,edx
or [eax], ebx
mov ebx,[fxbit23pcal]
and ebx,edx
or [eax+16], ebx
mov ebx,[fxbit45pcal]
and ebx,edx
or [eax+32], ebx
and edx,[fxbit67pcal]
or [eax+48], edx
%endmacro
%macro drawpix8bd 0
and [eax],edx
and [eax+16],edx
and [eax+32],edx
and [eax+48],edx
xor edx,0FFFFFFFFh
mov ebx,[fxbit45pcal]
and ebx,edx
or [eax], ebx
mov ebx,[fxbit67pcal]
and ebx,edx
or [eax+16], ebx
mov ebx,[fxbit01pcal]
and ebx,edx
or [eax+32], ebx
and edx,[fxbit23pcal]
or [eax+48], edx
%endmacro
%macro plotb 5
shl eax,%3
and ebx,07h
add ebx,ebx
add eax,ebx
add eax,[SCBRrel]
mov bl,[SfxR1]
mov edx,[fxxand+ebx*4]
%2
%endmacro
%macro plotbz 5
shl eax,%3
and ebx,07h
add ebx,ebx
add eax,ebx
add eax,[SCBRrel]
mov bl,[SfxR1]
mov edx,[fxxand+ebx*4]
test byte[SfxCOLR],%5
jz .nodraw
%2
%endmacro
%macro plotbd 5
shl eax,%3
and ebx,07h
add ebx,ebx
add eax,ebx
add eax,[SCBRrel]
mov bl,[SfxR1]
mov edx,[fxxand+ebx*4]
mov bl,[SfxR1]
xor bl,[SfxR2]
test bl,01h
jz near .nodither4b
%4
inc word [SfxR1]
%1
.nodither4b
%2
%endmacro
%macro plotbzd 5
shl eax,%3
and ebx,07h
add ebx,ebx
add eax,ebx
add eax,[SCBRrel]
mov bl,[SfxR1]
mov edx,[fxxand+ebx*4]
test byte[SfxCOLR],%5
jz near .nodraw
mov bl,[SfxR1]
xor bl,[SfxR2]
test bl,01h
jz .nodither4b
%4
inc word [SfxR1]
%1
.nodither4b
%2
%endmacro
%macro plotlines4b 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 ret, drawpix4b, 5, drawpix4bd, 0Fh
.nodraw
inc word [SfxR1]
ret
%endmacro
%macro plotlines4bb 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 FXReturn, drawpix4b, 5, drawpix4bd, 0Fh
.nodraw
inc word [SfxR1]
FXReturn
%endmacro
%macro plotlines2b 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 ret, drawpix2b, 4, drawpix2bd, 03h
.nodraw
inc word [SfxR1]
ret
%endmacro
%macro plotlines2bb 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 FXReturn, drawpix2b, 4, drawpix2bd, 03h
.nodraw
inc word [SfxR1]
FXReturn
%endmacro
%macro plotlines8b 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 ret, drawpix8b, 6, drawpix8bd, 0FFh
.nodraw
inc word [SfxR1]
ret
%endmacro
%macro plotlines8bb 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 FXReturn, drawpix8b, 6, drawpix8bd, 0FFh
.nodraw
inc word [SfxR1]
FXReturn
%endmacro
%macro plotlines8bl 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 ret, drawpix8b, 6, drawpix8bd, 0Fh
.nodraw
inc word [SfxR1]
ret
%endmacro
%macro plotlines8bbl 1
mov ebx,[SfxR2]
FETCHPIPE
mov bh,[SfxR1]
mov eax,[sfxclineloc]
inc ebp
mov eax,[eax+ebx*4]
cmp eax,0FFFFFFFFh
je near .nodraw
%1 FXReturn, drawpix8b, 6, drawpix8bd, 0Fh
.nodraw
inc word [SfxR1]
FXReturn
%endmacro
%macro ADDRN 1 ; V
mov eax, [esi] ; Read Source
mov ebx, [SfxR0+%1*4]
FETCHPIPE
add ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro ADCRN 1 ; V
FETCHPIPE
mov eax, [esi] ; Read Source
mov ebx, [SfxR0+%1*4]
shr byte[SfxCarry],1
adc ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro ADIRN 1 ; V
mov eax, [esi] ; Read Source
FETCHPIPE
add ax,%1
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro ADCIRN 1 ; V
FETCHPIPE
mov eax, [esi] ; Read Source
shr byte[SfxCarry],1
adc ax,%1
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro SUBRN 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4]
FETCHPIPE
sub ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
CLRFLAGS
ret
%endmacro
%macro SBCRN 1 ; V
FETCHPIPE
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4]
cmp byte[SfxCarry],1
sbb ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
CLRFLAGS
ret
%endmacro
%macro SUBIRN 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
sub ax,%1
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
CLRFLAGS
ret
%endmacro
%macro CMPRN 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4]
FETCHPIPE
sub ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
mov [SfxSignZero],eax
CLRFLAGS
inc ebp ; Increase program counter
ret
%endmacro
%macro ANDRN 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4] ; Read RN
FETCHPIPE
and eax,ebx
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro BICRN 1 ; V
mov ebx,[SfxR0+%1*4] ; Read RN
mov eax,[esi] ; Read Source
xor ebx,0FFFFh
FETCHPIPE
and eax,ebx
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro ANDIRN 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
and eax,%1
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro BICIRN 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
and eax,%1
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro MULTRN 1 ; V
mov al,byte [esi] ; Read Source
mov bl,byte [SfxR0+%1*4] ; Read RN
FETCHPIPE
imul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro UMULTRN 1 ; V
mov al,byte [esi] ; Read Source
mov bl,byte [SfxR0+%1*4] ; Read RN
FETCHPIPE
mul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro MULTIRN 1 ; V
mov al,byte [esi] ; Read Source
mov bl,%1 ; Read RN
FETCHPIPE
imul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro UMULTIRN 1 ; V
mov al,byte [esi] ; Read Source
mov bl,%1 ; Read RN
FETCHPIPE
mul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
%endmacro
%macro LINK 1 ; Verified.
mov eax,ebp
sub eax,[SfxCPB]
add eax,%1
FETCHPIPE
mov word [SfxR11],ax
CLRFLAGS
inc ebp
ret
%endmacro
%macro JMPRN 1 ; V
FETCHPIPE
mov eax,[SfxR0+%1*4] ; Read RN
mov ebp,[SfxCPB]
add ebp,eax
CLRFLAGS
ret
%endmacro
%macro LJMPRN 1 ; V
FETCHPIPE
mov eax,[SfxR0+%1*4]
and eax,07Fh
mov byte[SfxPBR],al
; mov byte[fxtrace+eax],1
mov eax,[SfxMemTable+eax*4]
mov [SfxCPB],eax
mov ebp,eax
add ebp,[esi] ; Read RN
mov dword [SfxCacheActive],0
push ecx
call FxOp02
pop ecx
dec ebp
ret
%endmacro
%macro IBTRN 1 ; V
movsx eax,byte[ebp]
mov cl,[ebp+1]
add ebp,2
mov [SfxR0+%1*4],ax
CLRFLAGS
ret
%endmacro
%macro LMSRN 1 ; Verified.
xor eax,eax
mov al,[ebp]
add eax,eax
inc ebp
add eax,[SfxRAMMem]
mov cl,[ebp]
mov dword [SfxLastRamAdr],eax
mov ebx,[eax] ; Read word from ram
inc ebp
mov [SfxR0+%1*4],bx ; Write data
CLRFLAGS
ret
%endmacro
%macro SMSRN 1 ; Verified.
xor eax,eax
mov al,[ebp]
inc ebp
add eax,eax
mov cl,[ebp]
add eax,[SfxRAMMem]
mov ebx,[SfxR0+%1*4] ; Read data
mov dword [SfxLastRamAdr],eax
inc ebp
mov [eax],bx ; Write word to ram
CLRFLAGS
ret
%endmacro
%macro FROMRN 1 ; V
FETCHPIPE
mov esi,SfxR0+%1*4
inc ebp ; Increase program counter
call [FxTable+ecx*4]
mov esi,SfxR0
ret
%endmacro
%macro ORRN 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4] ; Read
FETCHPIPE
or eax,ebx
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
ret
%endmacro
%macro XORRN 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4] ; Read
FETCHPIPE
xor eax,ebx
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
ret
%endmacro
%macro ORI 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
or eax,%1
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
ret
%endmacro
%macro XORI 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
xor eax,%1
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
ret
%endmacro
%macro INCRN 1 ; Verified
inc word[SfxR0+%1*4]
FETCHPIPE
mov eax,[SfxR0+%1*4] ; Read Source
mov [SfxSignZero],eax
CLRFLAGS
inc ebp
ret
%endmacro
%macro DECRN 1 ; Verified
dec word[SfxR0+%1*4]
FETCHPIPE
mov eax,[SfxR0+%1*4] ; Read Source
mov [SfxR0+%1*4],eax
mov [SfxSignZero],eax
CLRFLAGS
inc ebp
ret
%endmacro
%macro IWTRN 1 ; aka LEA ; Verified.
mov eax,[ebp]
mov cl,[ebp+2]
and eax,0FFFFh
add ebp,3
mov [SfxR0+%1*4],eax
CLRFLAGS
ret
%endmacro
%macro LMRN 1 ; Verified!
xor eax,eax
mov cl,[ebp+2]
mov ax,[ebp]
mov ebx,[SfxRAMMem]
mov [SfxLastRamAdr],eax
add [SfxLastRamAdr],ebx
mov dl,[eax+ebx]
xor eax,1
add ebp,3
mov dh,[eax+ebx]
mov word [SfxR0+%1*4],dx ; Store Word
CLRFLAGS
ret
%endmacro
%macro SMRN 1 ; Verified
mov ebx,[SfxR0+%1*4]
mov eax,[ebp]
mov cl,[ebp+2]
and eax,0FFFFh
mov dx,bx
mov ebx,[SfxRAMMem]
mov [SfxLastRamAdr],eax
add [SfxLastRamAdr],ebx
mov [eax+ebx],dl
xor eax,1
add ebp,3
mov [eax+ebx],dh
CLRFLAGS
ret
%endmacro
%macro PackEsiEdi 0
mov eax,[SfxSREG]
shl eax,2
add eax,SfxR0
mov esi,eax
mov eax,[SfxDREG]
shl eax,2
add eax,SfxR0
mov edi,eax
mov eax,[SfxRAMBR]
shl eax,16
add eax,[sfxramdata]
mov dword [SfxRAMMem],eax
%endmacro
%macro UnPackEsiEdi 0
mov eax,esi
sub eax,SfxR0
shr eax,2
mov [SfxSREG],eax
mov eax,edi
sub eax,SfxR0
shr eax,2
mov [SfxDREG],eax
%endmacro
;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 "src/i386/macros.mac"
EXTSYM FxTable,FxTableb,FxTablec,SfxB,SfxCPB,SfxCROM,SfxCarry,SfxOverflow
EXTSYM SfxR0,SfxR14,SfxR15,SfxRomBuffer,SfxSignZero,withr15sk
NEWSYM FxEmu2BAsmStart
%include "src/i386/fxemu2.mac"
%include "src/i386/fxemu2b.mac"
NEWSYM FxOpb05 ; BRA branch always ; Verified.
movsx eax,byte[ebp]
mov cl,[ebp+1]
inc ebp
add ebp,eax
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb06 ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb07 ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb08 ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb09 ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb0A ; BPL branch on plus ; Verified.
movsx eax,byte[ebp]
inc ebp
test dword[SfxSignZero],088000h
mov cl,[ebp]
jnz .nojump
add ebp,eax
call [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb0B ; BMI branch on minus ; Verified.
movsx eax,byte[ebp]
inc ebp
test dword[SfxSignZero],088000h
mov cl,[ebp]
jz .nojump
add ebp,eax
call [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb0C ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb0D ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb0E ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb0F ; 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 [FxTableb+ecx*4]
ret
.nojump
inc ebp
call [FxTableb+ecx*4]
ret
NEWSYM FxOpb10 ; TO RN set register n as destination register
TORNb 0
NEWSYM FxOpb11 ; TO RN set register n as destination register
TORNb 1
NEWSYM FxOpb12 ; TO RN set register n as destination register
TORNb 2
NEWSYM FxOpb13 ; TO RN set register n as destination register
TORNb 3
NEWSYM FxOpb14 ; TO RN set register n as destination register
TORNb 4
NEWSYM FxOpb15 ; TO RN set register n as destination register
TORNb 5
NEWSYM FxOpb16 ; TO RN set register n as destination register
TORNb 6
NEWSYM FxOpb17 ; TO RN set register n as destination register
TORNb 7
NEWSYM FxOpb18 ; TO RN set register n as destination register
TORNb 8
NEWSYM FxOpb19 ; TO RN set register n as destination register
TORNb 9
NEWSYM FxOpb1A ; TO RN set register n as destination register
TORNb 10
NEWSYM FxOpb1B ; TO RN set register n as destination register
TORNb 11
NEWSYM FxOpb1C ; TO RN set register n as destination register
TORNb 12
NEWSYM FxOpb1D ; TO RN set register n as destination register
TORNb 13
NEWSYM FxOpb1E ; TO RN set register n as destination register
FETCHPIPE
test dword [SfxB],1
jnz .VersionB
mov edi,SfxR0+14*4
inc ebp
mov eax,ebp
sub eax,[SfxCPB]
mov dword[withr15sk],1
mov [SfxR15],eax
call [FxTableb+ecx*4]
mov edi,SfxR0
UpdateR14
ret
.VersionB
mov eax,[esi] ; Read Source
mov dword[withr15sk],1
mov [SfxR0+14*4],eax ; Write
CLRFLAGS
UpdateR14
inc ebp ; Increase program counter
ret
NEWSYM FxOpb1F ; TO RN set register n as destination register
FETCHPIPE
test dword [SfxB],1
jnz .VersionB
mov edi,SfxR0+15*4
inc ebp
mov eax,ebp
sub eax,[SfxCPB]
mov [SfxR15],eax
call [FxTableb+ecx*4]
mov ebp,[SfxCPB]
mov dword[withr15sk],1
add ebp,[SfxR15]
mov edi,SfxR0
ret
.VersionB
mov eax,[esi] ; Read Source
mov ebp,[SfxCPB]
mov dword[withr15sk],1
add ebp,eax
CLRFLAGS
ret
NEWSYM FxOpb3D ; ALT1 set alt1 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,01h
inc ebp
mov eax,ebp
sub eax,[SfxCPB]
mov [SfxR15],eax
call [FxTableb+ecx*4]
xor ch,ch
ret
NEWSYM FxOpb3E ; ALT2 set alt1 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,02h
inc ebp
mov eax,ebp
sub eax,[SfxCPB]
mov [SfxR15],eax
call [FxTable+ecx*4]
xor ch,ch
ret
NEWSYM FxOpb3F ; ALT3 set alt3 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,03h
inc ebp
mov eax,ebp
sub eax,[SfxCPB]
mov [SfxR15],eax
call [FxTable+ecx*4]
xor ch,ch
ret
NEWSYM FxOpbB0 ; FROM rn set source register
FROMRNb 0
NEWSYM FxOpbB1 ; FROM rn set source register
FROMRNb 1
NEWSYM FxOpbB2 ; FROM rn set source register
FROMRNb 2
NEWSYM FxOpbB3 ; FROM rn set source register
FROMRNb 3
NEWSYM FxOpbB4 ; FROM rn set source register
FROMRNb 4
NEWSYM FxOpbB5 ; FROM rn set source register
FROMRNb 5
NEWSYM FxOpbB6 ; FROM rn set source register
FROMRNb 6
NEWSYM FxOpbB7 ; FROM rn set source register
FROMRNb 7
NEWSYM FxOpbB8 ; FROM rn set source register
FROMRNb 8
NEWSYM FxOpbB9 ; FROM rn set source register
FROMRNb 9
NEWSYM FxOpbBA ; FROM rn set source register
FROMRNb 10
NEWSYM FxOpbBB ; FROM rn set source register
FROMRNb 11
NEWSYM FxOpbBC ; FROM rn set source register
FROMRNb 12
NEWSYM FxOpbBD ; FROM rn set source register
FROMRNb 13
NEWSYM FxOpbBE ; FROM rn set source register
FROMRNb 14
NEWSYM FxOpbBF ; FROM rn set source register
test dword [SfxB],1
jnz .VersionB
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
.VersionB
FETCHPIPE
mov eax,ebp
sub eax,[SfxCPB]
inc ebp
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
shr al,7
mov byte[SfxOverflow],al
CLRFLAGS
ret
NEWSYM FxOpc05 ; BRA branch always ; Verified.
movsx eax,byte[ebp]
mov cl,[ebp+1]
inc ebp
add ebp,eax
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc06 ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc07 ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc08 ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc09 ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc0A ; BPL branch on plus ; Verified.
movsx eax,byte[ebp]
inc ebp
test dword[SfxSignZero],088000h
mov cl,[ebp]
jnz .nojump
add ebp,eax
call [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc0B ; BMI branch on minus ; Verified.
movsx eax,byte[ebp]
inc ebp
test dword[SfxSignZero],088000h
mov cl,[ebp]
jz .nojump
add ebp,eax
call [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc0C ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc0D ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc0E ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc0F ; 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 [FxTablec+ecx*4]
ret
.nojump
inc ebp
call [FxTablec+ecx*4]
ret
NEWSYM FxOpc10 ; TO RN set register n as destination register
TORNc 0
NEWSYM FxOpc11 ; TO RN set register n as destination register
TORNc 1
NEWSYM FxOpc12 ; TO RN set register n as destination register
TORNc 2
NEWSYM FxOpc13 ; TO RN set register n as destination register
TORNc 3
NEWSYM FxOpc14 ; TO RN set register n as destination register
TORNc 4
NEWSYM FxOpc15 ; TO RN set register n as destination register
TORNc 5
NEWSYM FxOpc16 ; TO RN set register n as destination register
TORNc 6
NEWSYM FxOpc17 ; TO RN set register n as destination register
TORNc 7
NEWSYM FxOpc18 ; TO RN set register n as destination register
TORNc 8
NEWSYM FxOpc19 ; TO RN set register n as destination register
TORNc 9
NEWSYM FxOpc1A ; TO RN set register n as destination register
TORNc 10
NEWSYM FxOpc1B ; TO RN set register n as destination register
TORNc 11
NEWSYM FxOpc1C ; TO RN set register n as destination register
TORNc 12
NEWSYM FxOpc1D ; TO RN set register n as destination register
TORNc 13
NEWSYM FxOpc1E ; TO RN set register n as destination register
FETCHPIPE
mov eax,[esi] ; Read Source
mov [SfxR0+14*4],eax ; Write
CLRFLAGS
UpdateR14
inc ebp ; Increase program counter
ret
NEWSYM FxOpc1F ; TO RN set register n as destination register
FETCHPIPE
mov eax,[esi] ; Read Source
mov ebp,[SfxCPB]
mov [SfxR15],eax
add ebp,eax
CLRFLAGS
ret
NEWSYM FxOpc3D ; ALT1 set alt1 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,01h
inc ebp
call [FxTablec+ecx*4]
xor ch,ch
ret
NEWSYM FxOpc3E ; ALT2 set alt1 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,02h
inc ebp
call [FxTablec+ecx*4]
xor ch,ch
ret
NEWSYM FxOpc3F ; ALT3 set alt3 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,03h
inc ebp
call [FxTablec+ecx*4]
xor ch,ch
ret
NEWSYM FxOpcB0 ; FROM rn set source register
FROMRNc 0
NEWSYM FxOpcB1 ; FROM rn set source register
FROMRNc 1
NEWSYM FxOpcB2 ; FROM rn set source register
FROMRNc 2
NEWSYM FxOpcB3 ; FROM rn set source register
FROMRNc 3
NEWSYM FxOpcB4 ; FROM rn set source register
FROMRNc 4
NEWSYM FxOpcB5 ; FROM rn set source register
FROMRNc 5
NEWSYM FxOpcB6 ; FROM rn set source register
FROMRNc 6
NEWSYM FxOpcB7 ; FROM rn set source register
FROMRNc 7
NEWSYM FxOpcB8 ; FROM rn set source register
FROMRNc 8
NEWSYM FxOpcB9 ; FROM rn set source register
FROMRNc 9
NEWSYM FxOpcBA ; FROM rn set source register
FROMRNc 10
NEWSYM FxOpcBB ; FROM rn set source register
FROMRNc 11
NEWSYM FxOpcBC ; FROM rn set source register
FROMRNc 12
NEWSYM FxOpcBD ; FROM rn set source register
FROMRNc 13
NEWSYM FxOpcBE ; FROM rn set source register
FROMRNc 14
NEWSYM FxOpcBF ; FROM rn set source register
FETCHPIPE
mov eax,ebp
sub eax,[SfxCPB]
inc ebp
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
shr al,7
mov byte[SfxOverflow],al
CLRFLAGS
ret
NEWSYM FxEmu2BAsmEnd
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%macro TORNb 1 ; V
FETCHPIPE
test dword [SfxB],1
jnz .VersionB
mov edi, SfxR0+%1*4
inc ebp ; Increase program counter
mov eax,ebp
sub eax,[SfxCPB]
mov dword[withr15sk],1
mov [SfxR15],eax
call [FxTableb+ecx*4]
mov edi,SfxR0
ret
.VersionB
mov eax,[esi] ; Read Source
mov dword[withr15sk],1
inc ebp ; Increase program counter
mov [SfxR0+%1*4],eax ; Write
CLRFLAGS
ret
%endmacro
%macro FROMRNb 1 ; V
FETCHPIPE
test dword [SfxB],1
jnz .VersionB
mov esi,SfxR0+%1*4
inc ebp ; Increase program counter
call [FxTable+ecx*4]
mov esi,SfxR0
ret
.VersionB
mov eax,[SfxR0+%1*4] ; Read
inc ebp
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
shr al,7
mov byte[SfxOverflow],al
CLRFLAGS
ret
%endmacro
%macro TORNc 1 ; V
FETCHPIPE
mov eax,[esi] ; Read Source
inc ebp ; Increase program counter
mov [SfxR0+%1*4],eax ; Write
CLRFLAGS
ret
%endmacro
%macro FROMRNc 1 ; V
FETCHPIPE
mov eax,[SfxR0+%1*4] ; Read
inc ebp
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
shr al,7
mov byte[SfxOverflow],al
CLRFLAGS
ret
%endmacro
;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 "src/i386/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 "src/i386/fxemu2.mac"
%include "src/i386/fxemu2b.mac"
%include "src/i386/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
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%macro FXReturn 0
dec dword [NumberOfOpcodes]
jmp [FxTabled+ecx*4]
ALIGN32
%endmacro
%macro FXReturn2 0
dec dword [NumberOfOpcodes]
js %%endloop
jmp [FxTabled+ecx*4]
%%endloop
jmp FXEndLoop
; jmp [FxTabled+ecx*4]
ALIGN32
%endmacro
%macro TORNd 1 ; V
FETCHPIPE
mov edi, SfxR0+%1*4
inc ebp ; Increase program counter
call [FxTable+ecx*4]
mov edi,SfxR0
FXReturn
%endmacro
%macro WITHc 1 ; Verified.
FETCHPIPE
mov esi,SfxR0+%1*4
mov edi,SfxR0+%1*4
mov dword [SfxB],1
inc ebp ; Increase program counter
call [FxTablec+ecx*4]
mov esi,SfxR0
mov edi,SfxR0
mov dword [SfxB],0 ; Clear B Flag
FXReturn
%endmacro
%macro STWRNc 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
mov ebx,[SfxRAMMem]
mov dword [SfxLastRamAdr],eax ; Save last ram address
add dword [SfxLastRamAdr],ebx ; Save last ram address
mov edx,[esi] ; Read Source
FETCHPIPE
mov [ebx+eax],dl ; Store Word
xor eax,1
inc ebp ; Increase program counter
mov [ebx+eax],dh ; Store Word
CLRFLAGS
FXReturn
%endmacro
%macro STBRNc 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
FETCHPIPE
add eax,[SfxRAMMem]
mov dword [SfxLastRamAdr],eax ; Save last ram address
mov ebx,[esi] ; Read Source
mov byte [eax],bl ; Store Byte
CLRFLAGS
inc ebp ; Increase program counter
FXReturn
%endmacro
%macro LDWRNc 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
mov ebx,[SfxRAMMem]
mov dword [SfxLastRamAdr],eax ; Save last ram address
FETCHPIPE
mov dl,[ebx+eax] ; Store Word
add dword [SfxLastRamAdr],ebx ; Save last ram address
xor eax,1
and edx,0FFFFh
inc ebp ; Increase program counter
mov dh,[ebx+eax] ; Store Word
mov [edi],edx ; Read Source
CLRFLAGS
FXReturn
%endmacro
%macro LDBRNc 1 ; V
mov eax,[SfxR0+%1*4] ; Read register
FETCHPIPE
add eax,[SfxRAMMem]
xor ebx,ebx
mov dword [SfxLastRamAdr],eax ; Save last ram address
mov bl,[eax] ; Read Byte
inc ebp ; Increase program counter
mov [edi],ebx ; Store Result
CLRFLAGS
FXReturn
%endmacro
%macro ADDRNc 1 ; V
mov eax, [esi] ; Read Source
mov ebx, [SfxR0+%1*4]
FETCHPIPE
add ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro ADCRNc 1 ; V
FETCHPIPE
mov eax, [esi] ; Read Source
mov ebx, [SfxR0+%1*4]
shr byte[SfxCarry],1
adc ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro ADIRNc 1 ; V
mov eax, [esi] ; Read Source
FETCHPIPE
add ax,%1
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro ADCIRNc 1 ; V
FETCHPIPE
mov eax, [esi] ; Read Source
shr byte[SfxCarry],1
adc ax,%1
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro SUBRNc 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4]
FETCHPIPE
sub ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
CLRFLAGS
FXReturn
%endmacro
%macro SBCRNc 1 ; V
FETCHPIPE
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4]
cmp byte[SfxCarry],1
sbb ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
CLRFLAGS
FXReturn
%endmacro
%macro SUBIRNc 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
sub ax,%1
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
CLRFLAGS
FXReturn
%endmacro
%macro CMPRNc 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4]
FETCHPIPE
sub ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
mov [SfxSignZero],eax
CLRFLAGS
inc ebp ; Increase program counter
FXReturn
%endmacro
%macro ANDRNc 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4] ; Read RN
FETCHPIPE
and eax,ebx
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro BICRNc 1 ; V
mov ebx,[SfxR0+%1*4] ; Read RN
mov eax,[esi] ; Read Source
xor ebx,0FFFFh
FETCHPIPE
and eax,ebx
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro ANDIRNc 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
and eax,%1
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro BICIRNc 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
and eax,%1
inc ebp
mov dword [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro MULTRNc 1 ; V
mov al,byte [esi] ; Read Source
mov bl,byte [SfxR0+%1*4] ; Read RN
FETCHPIPE
imul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro UMULTRNc 1 ; V
mov al,byte [esi] ; Read Source
mov bl,byte [SfxR0+%1*4] ; Read RN
FETCHPIPE
mul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro MULTIRNc 1 ; V
mov al,byte [esi] ; Read Source
mov bl,%1 ; Read RN
FETCHPIPE
imul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro UMULTIRNc 1 ; V
mov al,byte [esi] ; Read Source
mov bl,%1 ; Read RN
FETCHPIPE
mul bl
inc ebp
and eax,0FFFFh
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
FXReturn
%endmacro
%macro LINKc 1 ; Verified.
mov eax,ebp
sub eax,[SfxCPB]
add eax,%1
FETCHPIPE
mov word [SfxR11],ax
CLRFLAGS
inc ebp
FXReturn
%endmacro
%macro JMPRNc 1 ; V
FETCHPIPE
mov eax,[SfxR0+%1*4] ; Read RN
mov ebp,[SfxCPB]
add ebp,eax
CLRFLAGS
FXReturn
%endmacro
%macro LJMPRNc 1 ; V
FETCHPIPE
mov eax,[SfxR0+%1*4]
and eax,07Fh
mov byte[SfxPBR],al
; mov byte[fxtrace+eax],1
mov eax,[SfxMemTable+eax*4]
mov [SfxCPB],eax
mov ebp,eax
add ebp,[esi] ; Read RN
mov dword [SfxCacheActive],0
push ecx
call FxOp02
pop ecx
dec ebp
FXReturn
%endmacro
%macro IBTRNc 1 ; V
movsx eax,byte[ebp]
mov cl,[ebp+1]
add ebp,2
mov [SfxR0+%1*4],ax
CLRFLAGS
FXReturn
%endmacro
%macro LMSRNc 1 ; Verified.
xor eax,eax
mov al,[ebp]
add eax,eax
inc ebp
add eax,[SfxRAMMem]
mov cl,[ebp]
mov dword [SfxLastRamAdr],eax
mov ebx,[eax] ; Read word from ram
inc ebp
mov [SfxR0+%1*4],bx ; Write data
CLRFLAGS
FXReturn
%endmacro
%macro SMSRNc 1 ; Verified.
xor eax,eax
mov al,[ebp]
inc ebp
add eax,eax
mov cl,[ebp]
add eax,[SfxRAMMem]
mov ebx,[SfxR0+%1*4] ; Read data
mov dword [SfxLastRamAdr],eax
inc ebp
mov [eax],bx ; Write word to ram
CLRFLAGS
FXReturn
%endmacro
%macro FROMRNd 1 ; V
FETCHPIPE
mov esi,SfxR0+%1*4
inc ebp ; Increase program counter
call [FxTable+ecx*4]
mov esi,SfxR0
FXReturn
%endmacro
%macro ORRNc 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4] ; Read
FETCHPIPE
or eax,ebx
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
FXReturn
%endmacro
%macro XORRNc 1 ; V
mov eax,[esi] ; Read Source
mov ebx,[SfxR0+%1*4] ; Read
FETCHPIPE
xor eax,ebx
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
FXReturn
%endmacro
%macro ORIc 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
or eax,%1
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
FXReturn
%endmacro
%macro XORIc 1 ; V
mov eax,[esi] ; Read Source
FETCHPIPE
xor eax,%1
inc ebp
mov [edi],eax ; Write DREG
mov [SfxSignZero],eax
CLRFLAGS
FXReturn
%endmacro
%macro INCRNc 1 ; Verified
inc word[SfxR0+%1*4]
FETCHPIPE
mov eax,[SfxR0+%1*4] ; Read Source
mov [SfxSignZero],eax
CLRFLAGS
inc ebp
FXReturn
%endmacro
%macro DECRNc 1 ; Verified
dec word[SfxR0+%1*4]
FETCHPIPE
mov eax,[SfxR0+%1*4] ; Read Source
mov [SfxR0+%1*4],eax
mov [SfxSignZero],eax
CLRFLAGS
inc ebp
FXReturn
%endmacro
%macro IWTRNc 1 ; aka LEA ; Verified.
mov eax,[ebp]
mov cl,[ebp+2]
and eax,0FFFFh
add ebp,3
mov [SfxR0+%1*4],eax
CLRFLAGS
FXReturn
%endmacro
%macro LMRNc 1 ; Verified!
xor eax,eax
mov cl,[ebp+2]
mov ax,[ebp]
mov ebx,[SfxRAMMem]
mov [SfxLastRamAdr],eax
add [SfxLastRamAdr],ebx
mov dl,[eax+ebx]
xor eax,1
add ebp,3
mov dh,[eax+ebx]
mov word [SfxR0+%1*4],dx ; Store Word
CLRFLAGS
FXReturn
%endmacro
%macro SMRNc 1 ; Verified
mov ebx,[SfxR0+%1*4]
mov eax,[ebp]
mov cl,[ebp+2]
and eax,0FFFFh
mov dx,bx
mov ebx,[SfxRAMMem]
mov [SfxLastRamAdr],eax
add [SfxLastRamAdr],ebx
mov [eax+ebx],dl
xor eax,1
add ebp,3
mov [eax+ebx],dh
CLRFLAGS
FXReturn
%endmacro
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment