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

📄 65816emu.cpp

📁 SNES game emulator. C and asm files.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		case 0x59: //   "XOR %w,Y", 3, 4,
			mem = ABS_INDEX_Y;
			ACCUM ^= *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x5A: //   "PSH Y", 1, 3, // PHY
			#ifdef XY_16BIT
			PUSHWORD (INDEX_Y);
			#else
			PUSHBYTE (INDEX_Y);
			#endif
			PC += 1; cycles -= 3+XY_IS16BIT; DOBREAK;
		case 0x5B: //   "TAD", 1, 2,
			//(*((ATYPE*)&reg.A)) = ACCUM;
			D = ACCUM_16BIT;
			SETZERO (D); // Flags are changed
			SETNEGATIVE (D);
			PC += 1; cycles -= 2; DOBREAK;
		case 0x5C: //   "JML %L", 4, 4,
			PC = OPLONG;
			cycles -= 4; DOBREAK;
		case 0x5D: //   "XOR %w,X", 3, 4,
			mem = ABS_INDEX_X;
			ACCUM ^= *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x5E: //   "SHR %w,X", 3, 7,
			mem = ABS_INDEX_X;
			if (*(amem = (ATYPE*)TRAPREAD(mem)) & 1) P |= CARRY;
			else P &= ~CARRY;
			*amem >>= 1;
			TRAPWRITE ((byte*)amem);
			SETZERO (*amem);
			P &= ~NEGATIVE;
			PC += 3; cycles -= 7+A_IS16BIT; DOBREAK;
		case 0x5F: //   "XOR %L,X", 4, 5,
			mem = ABS_LONG_INDEX_X;
			ACCUM ^= *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x60: //   "RTS", 1, 6,
			_tmp = PC & 0xFFFF0000;
			PULLWORD (PC);
			PC |= _tmp;
			PC++;
			cycles -= 6; DOBREAK;
		case 0x61: //   "ADC (<%b,X)", 2, 6,
			SAVE(ACCUM);
			mem = DIR_INDEX_INDIR_X;
			amem = (ATYPE*)TRAPREAD(mem);			
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x62: //   "PSH @%w", 3, 6, // PER
			PC += 3;
			PUSHWORD ((word)PC + OPWORD);
			cycles -= 6; DOBREAK;
		case 0x63: //   "ADC <%b,S", 2, 4,
			SAVE(ACCUM);
			mem = S_REL;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x64: //   "CLR <%b", 2, 3,
			*(amem = (ATYPE*)DIR) = 0;
			TRAPWRITE ((byte*)amem);
			PC += 2; cycles -= 3+A_IS16BIT+A_IS16BIT; DOBREAK;
		case 0x65: //   "ADC <%b", 2, 3,
			SAVE(ACCUM);
			mem = DIR;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
		case 0x66: //   "ROR <%b", 2, 5,
			amem = (ATYPE*)DIR;
			_tmp = *amem & 1;
			*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
			TRAPWRITE ((byte*)amem);
			SETZERO (*amem);
			SETNEGATIVE (*amem);
			if (_tmp) P |= CARRY; else P &= ~CARRY;
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x67: //   "ADC [<%b]", 2, 6,
			SAVE(ACCUM);
			mem = DIR_INDIR_LONG;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x68: //   "PUL A", 1, 4, // PLA
			#ifdef A_16BIT
			PULLWORD (ACCUM);
			#else
			PULLBYTE (ACCUM);
			#endif
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 1; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x69: //   "ADC %#", 2, 2,
			SAVE(ACCUM);
			_tmpc = (dword)ACCUM + (P&1) + IMM_ACCUM;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
		case 0x6A: //   "ROR A", 1, 2,
			_tmp = ACCUM & 1;
			ACCUM = (ACCUM >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
			SETZERO (ACCUM);
			SETNEGATIVE (ACCUM);
			if (_tmp) P |= CARRY; else P &= ~CARRY;
			PC += 1; cycles -= 2; DOBREAK;
		case 0x6B: //   "RTL", 1, 6,
			PULLWORD (PC);
			PULLBYTE (_tmp2);
			PC |= (_tmp2 << 16);
			PC++; // If JSL %L only incs PC by 3, here there must be a final inc.
			cycles -= 6; DOBREAK;
		case 0x6C: //   "JMP (%w)", 3, 5,
			PC = (PC & 0xFF0000) | *(word*)ABS_INDIR;
			cycles -= 5; DOBREAK;
		case 0x6D: //   "ADC %w", 3, 4,
			SAVE(ACCUM);
			mem = ABS;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x6E: //   "ROR %w", 3, 6, 
			amem = (ATYPE*)ABS;
			_tmp = *amem & 1;
			*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
			TRAPWRITE ((byte*)amem);
			SETZERO (*amem);
			SETNEGATIVE (*amem);
			if (_tmp) P |= CARRY; else P &= ~CARRY;
			PC += 3; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x6F: //   "ADC %L", 4, 5,
			SAVE(ACCUM);
			mem = ABS_LONG;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x70: //   "BVS @%b", 2, 2,
			if (!(P & OVERFLOW)) { // False
				PC += 2; cycles -= 2; DOBREAK;
			}
			PC += 2 + ((signed char) opdata);
			cycles -= 3; DOBREAK;
		case 0x71: //   "ADC (<%b),Y", 2, 5,
			SAVE(ACCUM);
			mem = DIR_INDIR_INDEX_Y;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x72: //   "ADC (<%b)", 2, 5,
			SAVE(ACCUM);
			mem = DIR_INDIR;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x73: //   "ADC (<%b,s),Y", 2, 7,
			SAVE(ACCUM);
			mem = S_REL_INDIR_INDEX_Y;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 7+A_IS16BIT; DOBREAK;
		case 0x74: //   "CLR <%b,X", 2, 4,
			*(amem = (ATYPE*)DIR_INDEX_X) = 0;
			TRAPWRITE ((byte*)amem);
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x75: //   "ADC <%b,X", 2, 4,
			SAVE(ACCUM);
			mem = DIR_INDEX_X;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x76: //   "ROR <%b,X", 2, 6,
			amem = (ATYPE*)DIR_INDEX_X;
			_tmp = *amem & 1;
			*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
			TRAPWRITE ((byte*)amem);
			SETZERO (*amem);
			SETNEGATIVE (*amem);
			if (_tmp) P |= CARRY; else P &= ~CARRY;
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x77: //   "ADC [<%b],Y", 2, 6,
			SAVE(ACCUM);
			mem = DIR_INDIR_LONG_INDEX_Y;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x78: //   "SEI", 1, 2,
			P |= INT_DISABLE;
			PC += 1; cycles -= 2; DOBREAK;
		case 0x79: //   "ADC %w,Y", 3, 4,
			SAVE(ACCUM);
			mem = ABS_INDEX_Y;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x7A: //   "PUL Y", 1, 4, // PLY
			#ifdef XY_16BIT
			PULLWORD (INDEX_Y);
			#else
			PULLBYTE (INDEX_Y);
			#endif
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 1; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0x7B: //   "TDA", 1, 2,
			/*ACCUM = (ATYPE)*/ (ACCUM_16BIT = D);
			SETZERO (ACCUM); // Flags are changed
			SETNEGATIVE (ACCUM);
			PC += 1; cycles -= 2; DOBREAK;
		case 0x7C: //   "JMP (%w,X)", 3, 6,
			PC = ABS_INDEX_INDIR_X_JMP;
			cycles -= 6; DOBREAK;
		case 0x7D: //   "ADC %w,X", 3,4,
			SAVE(ACCUM);
			mem = ABS_INDEX_X;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x7E: //   "ROR %w,X", 3,7,
			amem = (ATYPE*)ABS_INDEX_X;
			_tmp = *amem & 1;
			*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
			TRAPWRITE ((byte*)amem);
			SETZERO (*amem);
			SETNEGATIVE (*amem);
			if (_tmp) P |= CARRY; else P &= ~CARRY;
			PC += 3; cycles -= 7+A_IS16BIT; DOBREAK;
		case 0x7F: //   "ADC %L,X",4,5,
			SAVE(ACCUM);
			mem = ABS_LONG_INDEX_X;
			amem = (ATYPE*)TRAPREAD(mem);
			_tmpc = (dword)ACCUM + (P&1) + *amem;
			ADCSETCARRY(_tmpc);
			ACCUM = _tmpc;
			if (P & BCD) BCDADDADJUST (ACCUM);
			SETZERO(ACCUM);
			SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
			PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x80: //   "BRA @%b", 2, 2,
			PC += 2 + ((signed char) opdata);
			cycles -= 2; DOBREAK;
		case 0x81: //   "STA (<%b,X)", 2, 6,
			*(ATYPE*)(mem = DIR_INDEX_INDIR_X) = ACCUM;
			TRAPWRITE (mem);			
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x82: //   "BRL @%w", 3, 3,
			_tmp = PC & 0xFF0000;
			PC = ((PC + 3 + (signed short) OPWORD) & 0xFFFF) | _tmp;
			cycles -= 3; DOBREAK;
		case 0x83: //   "STA <%b,S", 2, 4,
			*(ATYPE*)(mem = S_REL) = ACCUM;
			TRAPWRITE (mem);			
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x84: //   "STY <%b", 2, 3,
			*(XYTYPE*)(mem = DIR) = INDEX_Y;
				#undef ISWORDOP
				#define ISWORDOP XY_IS16BIT
			TRAPWRITE (mem);
				#undef ISWORDOP
				#define ISWORDOP A_IS16BIT		
			PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
		case 0x85: //   "STA <%b", 2, 3,
			*(ATYPE*)(mem = DIR) = ACCUM;
			TRAPWRITE (mem);
			PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
		case 0x86: //   "STX <%b", 2, 3,
			*(XYTYPE*)(mem = DIR) = INDEX_X;
				#undef ISWORDOP
				#define ISWORDOP XY_IS16BIT
			TRAPWRITE (mem);
				#undef ISWORDOP
				#define ISWORDOP A_IS16BIT		
			PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
		case 0x87: //   "STA [<%b]", 2, 6,
			*(ATYPE*)(mem = DIR_INDIR_LONG) = ACCUM;
			TRAPWRITE (mem);			
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x88: //   "DEY", 1, 2,
			INDEX_Y--;
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 1; cycles -= 2; DOBREAK;
		case 0x89: //   "BIT %#", 2, 2,
			if (ACCUM & IMM_ACCUM)
				P &= ~ZERO; else P |= ZERO;
			PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
		case 0x8A: //   "TXA", 1, 2,
			//(*((XYTYPE*)&reg.X)) = INDEX_X;
			ACCUM = (ATYPE)INDEX_X_16BIT;
			//ACCUM = (ATYPE)INDEX_X;
			SETZERO (ACCUM); // Flags are changed
			SETNEGATIVE (ACCUM);
			PC += 1; cycles -= 2; DOBREAK;
		case 0x8B: //   "PSH DBR", 1, 3, // PHB
			PUSHBYTE (DBR);
			PC += 1; cycles -= 3; DOBREAK;
		case 0x8C: //   "STY %w", 3, 4,
			*(XYTYPE*)(mem = ABS) = INDEX_Y;
				#undef ISWORDOP
				#define ISWORDOP XY_IS16BIT
			TRAPWRITE (mem);
				#undef ISWORDOP
				#define ISWORDOP A_IS16BIT		
			PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0x8D: //   "STA %w", 3, 4,
			*(ATYPE*)(mem = ABS) = ACCUM;
			TRAPWRITE (mem);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x8E: //   "STX %w", 3, 4,
			*(XYTYPE*)(mem = ABS) = INDEX_X;
				#undef ISWORDOP

⌨️ 快捷键说明

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