📄 sa1ops.s
字号:
/******************************************************************************* 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.*******************************************************************************/#define Registers SA1Registers#undef VAR_CYCLES#include "sa1struc.h"#if 0#define PCS SA1PCS#define PB SA1PB#define PP SA1PP#define PL SA1PL#define PH SA1PH#define AA SA1AA#define AL SA1AL#define AH SA1AH#define DD SA1DD#define DL SA1DL#define DH SA1DH#define SS SA1SS#define SL SA1SL#define SH SA1SH#define XX SA1XX#define XL SA1XL#define XH SA1XH#define YY SA1YY#define YL SA1YL#define YH SA1YH#endif#undef _Carry#define _Carry SA1_Carry#undef _Zero#define _Zero SA1_Zero#undef _Negative#define _Negative SA1_Negative#undef _Overflow#define _Overflow SA1_Overflow#include "sa1addr.h"#include "sa1ops.h"#include "sa1gs.S".data.zzz:.string "*** IRQ\n".text.globl S9xSA1MainLoopS9xSA1MainLoop: LOAD_REGISTERS testl $IRQ_PENDING_FLAG, SA1Flags jz .nosa1irq2 testb $0xff, SA1IRQActive jz .nosa1irq1 testb $IRQ, FLAGS jnz .nosa1irq2 cmpb $0, WaitingForInterrupt je .nosa1wait incl PC movb $0, WaitingForInterrupt.nosa1wait: call S9xSA1Opcode_IRQ jmp .nosa1irq2.nosa1irq1: andl $~IRQ_PENDING_FLAG, SA1Flags .nosa1irq2: movl $3, %eax.instruction_loop: testb $0xff, SA1Executing jz .exit pushl %eax#ifdef DEBUGGER testb $TRACE_FLAG, SA1Flags jz .NO_SA1_TRACE STORE_REGISTERS ccall S9xSA1Trace LOAD_REGISTERS.NO_SA1_TRACE:#endif xorl %eax, %eax movl SA1Opcodes, %ecx#ifdef CPU_SHUTDOWN movl PC, SA1PCAtOpcodeStart#endif movb (PC), %al incl PC jmp *(%ecx,%eax,4).globl S9xSA1MainAsmLoopS9xSA1MainAsmLoop: popl %eax decl %eax jnz .instruction_loop.exit: STORE_REGISTERS ret/* ADC */Op69M1: Immediate8 ADC Adc8 IMM8Op69M0: Immediate16 ADC2 Adc16 IMM16Op65M1: Direct8 ADC2 call S9xSA1GetByte Adc8 DIR8Op65M0: Direct8 ADC call S9xSA1GetWord Adc16 DIR16 Op75M1: DirectIndexedX8 ADC call S9xSA1GetByte Adc8 DIX8Op75M0: DirectIndexedX8 ADC2 call S9xSA1GetWord Adc16 DIX16Op72M1: DirectIndirect8 ADC call S9xSA1GetByte Adc8 DI8Op72M0: DirectIndirect8 ADC2 call S9xSA1GetWord Adc16 DI16Op61M1: DirectIndexedIndirect8 ADC call S9xSA1GetByte Adc8 DII8Op61M0: DirectIndexedIndirect8 ADC2 call S9xSA1GetWord Adc16 DII16Op71M1: DirectIndirectIndexed8 ADC call S9xSA1GetByte Adc8 DIIY8Op71M0: DirectIndirectIndexed8 ADC2 call S9xSA1GetWord Adc16 DIIY16Op67M1: DirectIndirectLong8 ADC call S9xSA1GetByte Adc8 DIL8Op67M0: DirectIndirectLong8 ADC2 call S9xSA1GetWord Adc16 DIL16Op77M1: DirectIndirectIndexedLong8 ADC call S9xSA1GetByte Adc8 DIIL8Op77M0: DirectIndirectIndexedLong8 ADC2 call S9xSA1GetWord Adc16 DIIL8Op6DM1: Absolute8 ADC call S9xSA1GetByte Adc8 ABS8Op6DM0: Absolute8 ADC2 call S9xSA1GetWord Adc16 ABS16Op7DM1: AbsoluteIndexedX8 ADC call S9xSA1GetByte Adc8 ABSX8Op7DM0: AbsoluteIndexedX8 ADC2 call S9xSA1GetWord Adc16 ABSX16Op79M1: AbsoluteIndexedY8 ADC call S9xSA1GetByte Adc8 ABSY8Op79M0: AbsoluteIndexedY8 ADC2 call S9xSA1GetWord Adc16 ABSY16Op6FM1: AbsoluteLong8 ADC call S9xSA1GetByte Adc8 ABSL8Op6FM0: AbsoluteLong8 ADC2 call S9xSA1GetWord Adc16 ABSL16Op7FM1: AbsoluteLongIndexedX8 ADC call S9xSA1GetByte Adc8 ALX8Op7FM0: AbsoluteLongIndexedX8 ADC2 call S9xSA1GetWord Adc16 ALX16Op63M1: StackRelative8 ADC call S9xSA1GetByte Adc8 SREL8Op63M0: StackRelative8 ADC2 call S9xSA1GetWord Adc16 SREL16Op73M1: StackRelativeIndirectIndexed8 ADC call S9xSA1GetByte Adc8 SRII8Op73M0: StackRelativeIndirectIndexed8 ADC2 call S9xSA1GetWord Adc16 SRII16/* AND */Op29M1: Immediate8 AND And8 IMM8Op29M0: Immediate16 AND And16 IMM16Op25M1: Direct8 AND call S9xSA1GetByte And8 DIR8Op25M0: Direct8 AND2 call S9xSA1GetWord And16 DIR16Op35M1: DirectIndexedX8 AND call S9xSA1GetByte And8 DIX8Op35M0: DirectIndexedX8 AND2 call S9xSA1GetWord And16 DIX16Op32M1: DirectIndirect8 AND call S9xSA1GetByte And8 DI8Op32M0: DirectIndirect8 AND2 call S9xSA1GetWord And16 DI16Op21M1: DirectIndexedIndirect8 AND call S9xSA1GetByte And8 DII8Op21M0: DirectIndexedIndirect8 AND2 call S9xSA1GetWord And16 DII16Op31M1: DirectIndirectIndexed8 AND call S9xSA1GetByte And8 DIIY8Op31M0: DirectIndirectIndexed8 AND2 call S9xSA1GetWord And16 DIIY16Op27M1: DirectIndirectLong8 AND call S9xSA1GetByte And8 DIL8Op27M0: DirectIndirectLong8 AND2 call S9xSA1GetWord And16 DIL16Op37M1: DirectIndirectIndexedLong8 AND call S9xSA1GetByte And8 DIIL8Op37M0: DirectIndirectIndexedLong8 AND2 call S9xSA1GetWord And16 DIIL16Op2DM1: Absolute8 AND call S9xSA1GetByte And8 ABS8Op2DM0: Absolute8 AND2 call S9xSA1GetWord And16 ABS16Op3DM1: AbsoluteIndexedX8 AND call S9xSA1GetByte And8 ABSX8Op3DM0: AbsoluteIndexedX8 AND2 call S9xSA1GetWord And16 ABSX16Op39M1: AbsoluteIndexedY8 AND call S9xSA1GetByte And8 ABSY8Op39M0: AbsoluteIndexedY8 AND2 call S9xSA1GetWord And16 ABSY16Op2FM1: AbsoluteLong8 AND call S9xSA1GetByte And8 ABSL8Op2FM0: AbsoluteLong8 AND2 call S9xSA1GetWord And16 ABSL16Op3FM1: AbsoluteLongIndexedX8 AND call S9xSA1GetByte And8 ALX8Op3FM0: AbsoluteLongIndexedX8 AND2 call S9xSA1GetWord And16 ALX16Op23M1: StackRelative8 AND call S9xSA1GetByte And8 SREL8Op23M0: StackRelative8 AND2 call S9xSA1GetWord And16 SREL16Op33M1: StackRelativeIndirectIndexed8 AND call S9xSA1GetByte And8 SRII8Op33M0: StackRelativeIndirectIndexed8 AND2 call S9xSA1GetWord And16 SRII16/* ASL */Op0AM1: movb AL, %al salb %al movb %al, AL SetZNC jmp S9xSA1MainAsmLoopOp0AM0: movw AA, %ax salw %ax movw %ax, AA setnz SA1_Zero setc SA1_Carry movb %ah, SA1_Negative jmp S9xSA1MainAsmLoop Op06M1: Direct8 ASL Asl8 DIR8Op06M0: Direct8 ASL2 Asl16 DIR16Op16M1: DirectIndexedX8 ASL Asl8 DIXOp16M0: DirectIndexedX8 ASL2 Asl16 DIXOp0EM1: Absolute8 ASL Asl8 ABSOp0EM0: Absolute8 ASL2 Asl16 ABSOp1EM1: AbsoluteIndexedX8 ASL Asl8 ABSXOp1EM0: AbsoluteIndexedX8 ASL2 Asl16 ABSX/* BIT */Op89M1: Immediate8 BIT andb AL, %al movb %al, SA1_Zero jmp S9xSA1MainAsmLoopOp89M0: Immediate16 BIT andw AA, %ax setnz SA1_Zero jmp S9xSA1MainAsmLoopOp24M1: Direct8 BIT Bit8 DIROp24M0: Direct8 BIT Bit16 DIROp34M1: DirectIndexedX8 BIT Bit8 DIXOp34M0: DirectIndexedX8 BIT2 Bit16 DIXOp2CM1: Absolute8 BIT Bit8 ABSOp2CM0: Absolute8 BIT2 Bit16 ABSOp3CM1: AbsoluteIndexedX8 BIT Bit8 ABSXOp3CM0: AbsoluteIndexedX8 BIT2 Bit16 ABSX/* CMP */OpC9M1: Immediate8 CMP Cmp8 IMMOpC9M0: Immediate16 CMP Cmp16 IMMOpC5M1: Direct8 CMP call S9xSA1GetByte Cmp8 DIROpC5M0: Direct8 CMP2 call S9xSA1GetWord Cmp16 DIROpD5M1: DirectIndexedX8 CMP call S9xSA1GetByte Cmp8 DIXOpD5M0: DirectIndexedX8 CMP2 call S9xSA1GetWord Cmp16 DIXOpD2M1: DirectIndirect8 CMP call S9xSA1GetByte Cmp8 DIOpD2M0: DirectIndirect8 CMP2 call S9xSA1GetWord Cmp16 DIOpC1M1: DirectIndexedIndirect8 CMP call S9xSA1GetByte Cmp8 DIIOpC1M0: DirectIndexedIndirect8 CMP2 call S9xSA1GetWord Cmp16 DIIOpD1M1: DirectIndirectIndexed8 CMP call S9xSA1GetByte Cmp8 DIIYOpD1M0: DirectIndirectIndexed8 CMP2 call S9xSA1GetWord Cmp16 DIIYOpC7M1: DirectIndirectLong8 CMP call S9xSA1GetByte Cmp8 DILOpC7M0: DirectIndirectLong8 CMP2 call S9xSA1GetWord Cmp16 DILOpD7M1: DirectIndirectIndexedLong8 CMP call S9xSA1GetByte Cmp8 DIILOpD7M0: DirectIndirectIndexedLong8 CMP2 call S9xSA1GetWord Cmp16 DIILOpCDM1: Absolute8 CMP call S9xSA1GetByte Cmp8 ABSOpCDM0: Absolute8 CMP2 call S9xSA1GetWord Cmp16 ABSOpDDM1: AbsoluteIndexedX8 CMP call S9xSA1GetByte Cmp8 ABSXOpDDM0: AbsoluteIndexedX8 CMP2 call S9xSA1GetWord Cmp16 ABSXOpD9M1: AbsoluteIndexedY8 CMP call S9xSA1GetByte Cmp8 ABSYOpD9M0: AbsoluteIndexedY8 CMP2 call S9xSA1GetWord Cmp16 ABSYOpCFM1: AbsoluteLong8 CMP call S9xSA1GetByte Cmp8 ABSLOpCFM0: AbsoluteLong8 CMP2 call S9xSA1GetWord Cmp16 ABSLOpDFM1: AbsoluteLongIndexedX8 CMP call S9xSA1GetByte Cmp8 ALXOpDFM0: AbsoluteLongIndexedX8 CMP2 call S9xSA1GetWord Cmp16 ALXOpC3M1: StackRelative8 CMP call S9xSA1GetByte Cmp8 SRELOpC3M0: StackRelative8 CMP2 call S9xSA1GetWord Cmp16 SRELOpD3M1: StackRelativeIndirectIndexed8 CMP call S9xSA1GetByte Cmp8 SRIIOpD3M0: StackRelativeIndirectIndexed8 CMP2 call S9xSA1GetWord Cmp16 SRII/* CPX */OpE0X1: Immediate8 CPX Cpx8 IMMOpE0X0: Immediate16 CPX Cpx16 IMMOpE4X1: Direct8 CPX call S9xSA1GetByte Cpx8 DIROpE4X0: Direct8 CPX2 call S9xSA1GetWord Cpx16 DIROpECX1: Absolute8 CPX call S9xSA1GetByte Cpx8 ABSOpECX0: Absolute8 CPX2 call S9xSA1GetWord Cpx16 ABS/* CPY */OpC0X1: Immediate8 CPY Cpy8 IMMOpC0X0: Immediate16 CPY Cpy16 IMMOpC4X1: Direct8 CPY call S9xSA1GetByte Cpy8 DIROpC4X0: Direct8 CPY2 call S9xSA1GetWord Cpy16 DIROpCCX1: Absolute8 CPY call S9xSA1GetByte Cpy8 ABSOpCCX0: Absolute8 CPY2 call S9xSA1GetWord Cpy16 ABS/* DEC */Op3AM1: movb AL, %al decb %al movb %al, AL SetZN jmp S9xSA1MainAsmLoopOp3AM0: decw AA setnz SA1_Zero movb AH, %al movb %al, SA1_Negative jmp S9xSA1MainAsmLoopOpC6M1: Direct8 DEC Dec8 DIROpC6M0: Direct8 DEC2 Dec16 DIROpD6M1: DirectIndexedX8 DEC Dec8 DIXOpD6M0: DirectIndexedX8 DEC2 Dec16 DIXOpCEM1: Absolute8 DEC Dec8 ABSOpCEM0: Absolute8 DEC2 Dec16 ABSOpDEM1: AbsoluteIndexedX8 DEC Dec8 ABSXOpDEM0: AbsoluteIndexedX8 DEC2 Dec16 ABSX/* EOR */Op49M1: Immediate8 EOR Eor8 IMMOp49M0: Immediate16 EOR Eor16 IMMOp45M1: Direct8 EOR call S9xSA1GetByte Eor8 DIROp45M0: Direct8 EOR2 call S9xSA1GetWord Eor16 DIROp55M1: DirectIndexedX8 EOR call S9xSA1GetByte Eor8 DIXOp55M0: DirectIndexedX8 EOR2 call S9xSA1GetWord Eor16 DIXOp52M1: DirectIndirect8 EOR call S9xSA1GetByte Eor8 DIOp52M0: DirectIndirect8 EOR2 call S9xSA1GetWord Eor16 DIOp41M1: DirectIndexedIndirect8 EOR call S9xSA1GetByte Eor8 DIIOp41M0: DirectIndexedIndirect8 EOR2 call S9xSA1GetWord Eor16 DIIOp51M1: DirectIndirectIndexed8 EOR call S9xSA1GetByte Eor8 DIIYOp51M0: DirectIndirectIndexed8 EOR2 call S9xSA1GetWord Eor16 DIIYOp47M1: DirectIndirectLong8 EOR call S9xSA1GetByte Eor8 DILOp47M0: DirectIndirectLong8 EOR2 call S9xSA1GetWord Eor16 DILOp57M1: DirectIndirectIndexedLong8 EOR call S9xSA1GetByte Eor8 DIILOp57M0: DirectIndirectIndexedLong8 EOR2 call S9xSA1GetWord Eor16 DIILOp4DM1: Absolute8 EOR call S9xSA1GetByte Eor8 ABSOp4DM0: Absolute8 EOR2 call S9xSA1GetWord Eor16 ABSOp5DM1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -