⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sa1ops.h

📁 著名SFC模拟器Snes9x的源代码。
💻 H
字号:
/* * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. * * (c) Copyright 1996 - 2001 Gary Henderson (gary@daniver.demon.co.uk) and *                           Jerremy Koot (jkoot@snes9x.com) * * Super FX C emulator code  * (c) Copyright 1997 - 1999 Ivar (Ivar@snes9x.com) and *                           Gary Henderson. * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. * * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. * C4 C code (c) Copyright 2001 Gary Henderson (gary@daniver.demon.co.uk). * * DOS port code contains the works of other authors. See headers in * individual files. * * Snes9x homepage: 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. */.macro Adc8 K	testb $Decimal, FLAGS	jnz .ADC8Decimal\K	GetCarry	adcb AL, %al	SetZNCV	movb %al, AL	jmp S9xSA1MainAsmLoop.ADC8Decimal\K:	GetCarry	adcb AL, %al	daa	movb %al, AL	SetZNCV	jmp S9xSA1MainAsmLoop.endm.macro Adc16 K	testb $Decimal, FLAGS	jnz .ADC16Decimal\K	GetCarry	adcw AA, %ax	movw %ax, AA	setc SA1_Carry	seto SA1_Overflow	setnz SA1_Zero	movb %ah, SA1_Negative	jmp S9xSA1MainAsmLoop.ADC16Decimal\K:	GetCarry	adcb AL, %al	daa	movb %al, AL	movb %ah, %al	adcb AH, %al	daa	movb %al, AH	setc SA1_Carry	seto SA1_Overflow	movw AA, %ax	movb %ah, SA1_Negative	orb %ah, %al	movb %al, SA1_Zero	jmp S9xSA1MainAsmLoop.endm.macro Sbc8 K	testb $Decimal, FLAGS	jnz .SBC8Decimal\K	GetNotCarry	sbbb %al, AL	movb AL, %al	setnc SA1_Carry	SetZNV	jmp S9xSA1MainAsmLoop.SBC8Decimal\K:	GetNotCarry	movb %al, %dl	movb AL, %al	sbbb %dl, %al	das	movb %al, AL	setnc SA1_Carry	SetZNV	jmp S9xSA1MainAsmLoop.endm.macro Sbc16 K	testb $Decimal, FLAGS	jnz .SBC16Decimal\K	GetNotCarry	sbbw %ax, AA	setnc SA1_Carry	setnz SA1_Zero	seto SA1_Overflow	movb AH, %al	movb %al, SA1_Negative	jmp S9xSA1MainAsmLoop.SBC16Decimal\K:	movl %eax, %edx	movw AA, %ax	GetNotCarry	sbbb %dl, %al	das	movb %al, AL	movb %ah, %al	sbbb %dh, %al	das	movb %al, AH	setnc SA1_Carry	seto SA1_Overflow	movw AA, %ax	movb %ah, SA1_Negative	orb %ah, %al	movb %al, SA1_Zero	jmp S9xSA1MainAsmLoop.endm.macro Ora8 K	orb AL, %al	movb %al, AL	SetZN	jmp S9xSA1MainAsmLoop.endm.macro Ora16 K	orw AA, %ax	movw %ax, AA	Set16ZN	jmp S9xSA1MainAsmLoop.endm.macro Eor8 K	xorb AL, %al	movb %al, AL	SetZN	jmp S9xSA1MainAsmLoop.endm.macro Eor16 K	xorw AA, %ax	movw %ax, AA	Set16ZN	jmp S9xSA1MainAsmLoop.endm.macro And8 K	andb AL, %al	movb %al, AL	SetZN	jmp S9xSA1MainAsmLoop.endm.macro And16 K	andw AA, %ax	movw %ax, AA	Set16ZN	jmp S9xSA1MainAsmLoop.endm.macro Lda8 K	movb %al, AL	SetZN	jmp S9xSA1MainAsmLoop.endm.macro Lda16 K	movw %ax, AA	testw %ax, %ax	Set16ZN	jmp S9xSA1MainAsmLoop.endm.macro Ldx8 K	movb %al, XL	SetZN	jmp S9xSA1MainAsmLoop.endm.macro Ldx16 K	movw %ax, XX	testw %ax, %ax	Set16ZN	jmp S9xSA1MainAsmLoop.endm.macro Ldy8 K	movb %al, YL	SetZN	jmp S9xSA1MainAsmLoop.endm.macro Ldy16 K	movw %ax, YY	testw %ax, %ax	Set16ZN	jmp S9xSA1MainAsmLoop.endm.macro Cmp8 K	movb AL, %ah	subb %al, %ah	setnc SA1_Carry	movb %ah, SA1_Negative	movb %ah, SA1_Zero	jmp S9xSA1MainAsmLoop.endm.macro Cmp16 K	movw AA, %dx	subw %ax, %dx	setnc SA1_Carry	setnz SA1_Zero	movb %dh, SA1_Negative	jmp S9xSA1MainAsmLoop.endm.macro Cpx8 K	movb XL, %ah	subb %al, %ah	setnc SA1_Carry	movb %ah, SA1_Negative	movb %ah, SA1_Zero	jmp S9xSA1MainAsmLoop.endm.macro Cpx16 K	movw XX, %dx	subw %ax, %dx	setnc SA1_Carry	setnz SA1_Zero	movb %dh, SA1_Negative	jmp S9xSA1MainAsmLoop.endm.macro Cpy8 K	movb YL, %ah	subb %al, %ah	setnc SA1_Carry	movb %ah, SA1_Negative	movb %ah, SA1_Zero	jmp S9xSA1MainAsmLoop.endm.macro Cpy16 K	movw YY, %dx	subw %ax, %dx	setnc SA1_Carry	setnz SA1_Zero	movb %dh, SA1_Negative	jmp S9xSA1MainAsmLoop.endm.macro Asl8 K	pushl %edx	call S9xSA1GetByte	salb %al	SetZNC	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Asl16 K	pushl %edx	call S9xSA1GetWord	salw %ax	Set16ZNC	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Lsr8 K	pushl %edx	call S9xSA1GetByte	shrb %al	SetZNC	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Lsr16 K	pushl %edx	call S9xSA1GetWord	shrw %ax	Set16ZNC	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Rol8 K	pushl %edx	call S9xSA1GetByte	GetCarry	rclb %al	SetZNC	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Rol16 K	pushl %edx	call S9xSA1GetWord	GetCarry	rclw %ax	setc SA1_Carry	movb %ah, SA1_Negative	testw %ax, %ax	setnz SA1_Zero	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Ror8 K	pushl %edx	call S9xSA1GetByte	GetCarry	rcrb %al	SetZNC	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Ror16 K	pushl %edx	call S9xSA1GetWord	GetCarry	rcrw %ax	setc SA1_Carry	movb %ah, SA1_Negative	testw %ax, %ax	setnz SA1_Zero	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Bit8 K	call S9xSA1GetByte	movb %al, SA1_Negative	testb $0x40, %al	setnz SA1_Overflow	andb AL, %al	movb %al, SA1_Zero	jmp S9xSA1MainAsmLoop.endm.macro Bit16 K	call S9xSA1GetWord	movb %ah, SA1_Negative	testb $0x40, %ah	setnz SA1_Overflow	andw AA, %ax	setnz SA1_Zero	jmp S9xSA1MainAsmLoop.endm.macro Dec8 K	pushl %edx	call S9xSA1GetByte	decb %al	SetZN	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Dec16 K	pushl %edx	call S9xSA1GetWord	decw %ax	Set16ZN	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Inc8 K	pushl %edx	call S9xSA1GetByte	incb %al	SetZN	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Inc16 K	pushl %edx	call S9xSA1GetWord	incw %ax	Set16ZN	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Sta8 K	movb AL, %al	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Sta16 K	movw AA, %ax	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Stx8 K	movb XL, %al	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Stx16 K	movw XX, %ax	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Sty8 K	movb YL, %al	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Sty16 K	movw YY, %ax	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Stz8 K	xorb %al, %al	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Stz16 K	xorl %eax, %eax	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Trb8 K	pushl %edx	call S9xSA1GetByte	movb AL, %dl	testb %al, %dl	setnz SA1_Zero	xorb $0xff, %dl	andb %dl, %al	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Trb16 K	pushl %edx	call S9xSA1GetWord	movw AA, %dx	testw %ax, %dx	setnz SA1_Zero	xorl $0xffffffff, %edx	andl %edx, %eax	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro Tsb8 K	pushl %edx	call S9xSA1GetByte	movb AL, %dl	testb %al, %dl	setnz SA1_Zero	orb %dl, %al	popl %edx	call S9xSA1SetByte	jmp S9xSA1MainAsmLoop.endm.macro Tsb16 K	pushl %edx	call S9xSA1GetWord	movw AA, %dx	testw %ax, %dx	setnz SA1_Zero	orw %dx, %ax	popl %edx	call S9xSA1SetWord	jmp S9xSA1MainAsmLoop.endm.macro CheckForIrq K	testb $0xff, SA1IRQActive	jz .CheckForIrqS9xSA1Exit\K	testb $IRQ, FLAGS	jnz .CheckForIrqS9xSA1Exit\K	call S9xSA1Opcode_IRQ.CheckForIrqS9xSA1Exit\K:.endm.macro S9xSA1FixCycles K	testw $Emulation, FLAGS16	jz .S9xSA1FixCyclesNoEmulation\K	movl $S9xSA1OpcodesM1X1, SA1Opcodes	jmp .S9xSA1FixCyclesS9xSA1Exit\K.S9xSA1FixCyclesNoEmulation\K:		testb $MemoryFlag, FLAGS	jz .S9xSA1FixCyclesNoMemory\K	testb $IndexFlag, FLAGS	jz .S9xSA1FixCyclesNoIndex\K	movl $S9xSA1OpcodesM1X1, SA1Opcodes	jmp .S9xSA1FixCyclesS9xSA1Exit\K.S9xSA1FixCyclesNoIndex\K:	movl $S9xSA1OpcodesM1X0, SA1Opcodes	jmp .S9xSA1FixCyclesS9xSA1Exit\K.S9xSA1FixCyclesNoMemory\K:	testb $IndexFlag, FLAGS	jz .S9xSA1FixCyclesNoIndex2\K	movl $S9xSA1OpcodesM0X1, SA1Opcodes	jmp .S9xSA1FixCyclesS9xSA1Exit\K.S9xSA1FixCyclesNoIndex2\K:	movl $S9xSA1OpcodesM0X0, SA1Opcodes.S9xSA1FixCyclesS9xSA1Exit\K:.endm.macro S9xSA1UnpackStatus K	movb FLAGS, %al	movb %al, SA1_Negative	testb $Zero, %al	setz SA1_Zero	testb $Carry, FLAGS	setnz SA1_Carry	testb $Overflow, FLAGS	setnz SA1_Overflow.endm.macro S9xSA1PackStatus K	movb SA1_Carry, %al	andb $~(Zero | Negative | Carry | Overflow), FLAGS	orb %al, FLAGS	movb SA1_Negative, %al	andb $0x80, %al	orb %al, FLAGS	movb SA1_Overflow, %al	salb $6, %al	orb %al, FLAGS	testb $0xff, SA1_Zero	setz %al	salb %al	orb %al, FLAGS.endm.macro CPUShutdown K//	cmpb $0, Shutdown//	jz .NoShutdown\K	cmpl PC, SA1WaitAddress	jnz .NoShutdown\K	cmpl $1, SA1WaitCounter	jl .NotYet\K	movb $0, SA1Executing	jp .NoShutdown\K.NotYet\K:	incl SA1WaitCounter.NoShutdown\K:.endm

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -