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

📄 65816emu.cpp

📁 SNES game emulator. C and asm files.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				#define ISWORDOP XY_IS16BIT
			TRAPWRITE (mem);
				#undef ISWORDOP
				#define ISWORDOP A_IS16BIT		
			PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0x8F: //   "STA %L", 4, 5,
			*(ATYPE*)(mem = ABS_LONG) = ACCUM;
			TRAPWRITE (mem);
			PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x90: //   "BCC @%b", 2, 2,
			if (P & CARRY) { // False
				PC += 2; cycles -= 2; DOBREAK;
			}
			PC += 2 + ((signed char) opdata);
			cycles -= 3; DOBREAK;
		case 0x91: //   "STA (<%b),Y", 2, 6,
			*(ATYPE*)(mem = DIR_INDIR_INDEX_Y) = ACCUM;
			TRAPWRITE (mem);
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x92: //   "STA (<%b)", 2, 5,
			*(ATYPE*)(mem = DIR_INDIR) = ACCUM;
			TRAPWRITE (mem);
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x93: //   "STA (<%b,S),Y", 2, 7,
			*(ATYPE*)(mem = S_REL_INDIR_INDEX_Y) = ACCUM;
			TRAPWRITE (mem);
			PC += 2; cycles -= 7+A_IS16BIT; DOBREAK;
		case 0x94: //   "STY <%b,X", 2, 4,
			*(XYTYPE*)(mem = DIR_INDEX_X) = INDEX_Y;
				#undef ISWORDOP
				#define ISWORDOP XY_IS16BIT
			TRAPWRITE (mem);
				#undef ISWORDOP
				#define ISWORDOP A_IS16BIT		
			PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0x95: //   "STA <%b,X", 2, 4,
			*(ATYPE*)(mem = DIR_INDEX_X) = ACCUM;
			TRAPWRITE (mem);
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x96: //   "STX <%b,Y", 2, 4,
			*(XYTYPE*)(mem = DIR_INDEX_Y) = INDEX_X;
				#undef ISWORDOP
				#define ISWORDOP XY_IS16BIT
			TRAPWRITE (mem);
				#undef ISWORDOP
				#define ISWORDOP A_IS16BIT		
			PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0x97: //   "STA [<%b],Y", 2, 6,
			*(ATYPE*)(mem = DIR_INDIR_LONG_INDEX_Y) = ACCUM;
			TRAPWRITE (mem);
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0x98: //   "TYA", 1, 2,
			//(*((XYTYPE*)&reg.Y)) = INDEX_Y;
			ACCUM = (ATYPE)INDEX_Y_16BIT;
			//ACCUM = (ATYPE)INDEX_Y;
			SETZERO (ACCUM); // Flags are changed
			SETNEGATIVE (ACCUM);
			PC += 1; cycles -= 2; DOBREAK;
		case 0x99: //   "STA %w,Y", 3, 5,
			*(ATYPE*)(mem = ABS_INDEX_Y) = ACCUM;
			TRAPWRITE (mem);
			PC += 3; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x9A: //   "TXS", 1, 2,
			S = INDEX_X_16BIT;
			// Has no effect on flags
			PC += 1; cycles -= 2; DOBREAK;
		case 0x9B: //   "TXY", 1, 2,
			INDEX_Y = INDEX_X;
			SETZERO (INDEX_Y); // Flags are changed
			SETNEGATIVEXY (INDEX_Y);
			PC += 1; cycles -= 2; DOBREAK;
		case 0x9C: //   "CLR %w", 3, 4,
			*(ATYPE*)(mem = ABS) = 0;
			TRAPWRITE (mem);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0x9D: //   "STA %w,X", 3, 5,
			*(ATYPE*)(mem = ABS_INDEX_X) = ACCUM;
			TRAPWRITE (mem);
			PC += 3; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x9E: //   "CLR %w,X", 3, 5,
			*(ATYPE*)(mem = ABS_INDEX_X) = 0;
			TRAPWRITE (mem);
			PC += 3; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0x9F: //   "STA %L,X", 4, 5,
			*(ATYPE*)(mem = ABS_LONG_INDEX_X) = ACCUM;
			TRAPWRITE (mem);
			PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0xA0: //   "LDY %#i", 2, 2,
			INDEX_Y = IMM_INDEX;
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 2+XY_IS16BIT; cycles -= 2+XY_IS16BIT; DOBREAK;
		case 0xA1: //   "LDA (<%b,X)", 2, 6,
			mem = DIR_INDEX_INDIR_X;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0xA2: //   "LDX %#i", 2, 2,
			INDEX_X = IMM_INDEX;
			SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
			PC += 2+XY_IS16BIT; cycles -= 2+XY_IS16BIT; DOBREAK;
		case 0xA3: //   "LDA <%b,S", 2, 4,
			mem = S_REL;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0xA4: //   "LDY <%b", 2, 3,
			mem = DIR;
			INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
		case 0xA5: //   "LDA <%b", 2, 3,
			mem = DIR;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
		case 0xA6: //   "LDX <%b", 2, 3,
			mem = DIR;
			INDEX_X = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
			PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
		case 0xA7: //   "LDA [<%b]", 2, 6,
			mem = DIR_INDIR_LONG;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0xA8: //   "TAY", 1, 2,
			//(*((ATYPE*)&reg.A)) = ACCUM;
			INDEX_Y = (XYTYPE)ACCUM_16BIT;
			//INDEX_Y = (XYTYPE)ACCUM;
			SETZERO (INDEX_Y); // Flags are changed
			SETNEGATIVEXY (INDEX_Y);
			PC += 1; cycles -= 2; DOBREAK;
		case 0xA9: //   "LDA %#", 2, 2,
			ACCUM = IMM_ACCUM;
			SETZERO (ACCUM); 
			/*debug0 ("LDA # - P=%X after setzero", P);
			if ((ACCUM) & SIGN_BIT)
				P |= NEGATIVE;
			else
				P &= ~NEGATIVE;
			//(((ACCUM) & SIGN_BIT) ?  : );
			debug0 ("(byte)0xB5 & ~NEGATIVE = %X  NEGATIVE=%X, ~=%X", (byte)0xB5 & ~NEGATIVE, NEGATIVE, ~(byte)NEGATIVE);*/
			SETNEGATIVE (ACCUM);
			PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
		case 0xAA: //   "TAX", 1, 2,
			//(*((ATYPE*)&reg.A)) = ACCUM;
			INDEX_X = (XYTYPE)ACCUM_16BIT;
			//INDEX_X = (XYTYPE)ACCUM;
			SETZERO (INDEX_X); // Flags are changed
			SETNEGATIVEXY (INDEX_X);
			PC += 1; cycles -= 2; DOBREAK;
		case 0xAB: //   "PUL DBR", 1, 4, // PLB
			PULLBYTE (DBR);
			SETZERO (DBR);
			if (DBR & 0x80) P |= NEGATIVE;
			else P &= ~NEGATIVE;
			PC += 1; cycles -= 4; DOBREAK;
		case 0xAC: //   "LDY %w", 3, 4,
			mem = ABS;
			INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0xAD: //   "LDA %w", 3, 4,
			mem = ABS;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0xAE: //   "LDX %w", 3, 4,
			mem = ABS;
			INDEX_X = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
			PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0xAF: //   "LDA %L", 4, 5,
			mem = ABS_LONG;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0xB0: //   "BCS @%b", 2, 2,
			if (!(P & CARRY)) { // False
				PC += 2; cycles -= 2; DOBREAK;
			}
			PC += 2 + ((signed char) opdata);
			cycles -= 3; DOBREAK;
		case 0xB1: //   "LDA (<%b),Y", 2, 5,
			mem = DIR_INDIR_INDEX_Y;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0xB2: //   "LDA (<%b)", 2, 5,
			mem = DIR_INDIR;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0xB3: //   "LDA (<%b,S),Y", 2, 7,
			mem = S_REL_INDIR_INDEX_Y;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 7+A_IS16BIT; DOBREAK;
		case 0xB4: //   "LDY <%b,X", 2, 4,
			mem = DIR_INDEX_X;
			INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0xB5: //   "LDA <%b,X", 2, 4,
			mem = DIR_INDEX_X;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0xB6: //   "LDX <%b,Y", 2, 4,
			mem = DIR_INDEX_Y;
			INDEX_X = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
			PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0xB7: //   "LDA [<%b],Y", 2, 6,
			mem = DIR_INDIR_LONG_INDEX_Y;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 2; cycles -= 6+A_IS16BIT;
			DOBREAK;
		case 0xB8: //   "CLV", 1, 2,
			P &= ~OVERFLOW;
			PC += 1; cycles -= 2; DOBREAK;
		case 0xB9: //   "LDA %w,Y", 3, 4,
			mem = ABS_INDEX_Y;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0xBA: //   "TSX", 1, 2,
			INDEX_X = (XYTYPE) *(XYTYPE*)&S;
			SETZERO (INDEX_X); // Flags are changed
			SETNEGATIVEXY (INDEX_X);
			PC += 1; cycles -= 2; DOBREAK;
		case 0xBB: //   "TYX", 1, 2,
			INDEX_X = INDEX_Y;
			SETZERO (INDEX_X); // Flags are changed
			SETNEGATIVE (INDEX_X);
			PC += 1; cycles -= 2; DOBREAK;
		case 0xBC: //   "LDY %w,X", 3, 4,
			mem = ABS_INDEX_X;
			INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0xBD: //   "LDA %w,X", 3, 4,
			mem = ABS_INDEX_X;
			ACCUM = *(ATYPE*)TRAPREAD(mem);
			SETZERO (ACCUM); SETNEGATIVE (ACCUM);
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0xBE: //   "LDX %w,Y", 3, 4,
			mem = ABS_INDEX_Y;
			INDEX_X = *(XYTYPE*)TRAPREAD(mem);
			SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
			PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0xBF: //   "LDA %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 0xC0: //   "CPY %#i", 2, 2,
			oldXY = INDEX_Y - IMM_INDEX;
			SETNEGATIVEXY (oldXY); SETZERO (oldXY);
			if (oldXY > INDEX_Y)
				P &= ~CARRY; else P |= CARRY;
			PC += 2+XY_IS16BIT; cycles -= 2+XY_IS16BIT; DOBREAK;
		case 0xC1: //   "CMP (<%b,X)", 2, 6,
			mem = DIR_INDEX_INDIR_X;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0xC2: //   "CLP %#b", 2, 3,
			PC += 2; cycles -= 3;
			if (((P & ~IMM_BYTE) & (MEMORY | INDEX)) != (P & (MEMORY | INDEX))) { // Change
				P &= ~IMM_BYTE;
				goto saveregs_andexit;
			}
			P &= ~IMM_BYTE;
			DOBREAK;
		case 0xC3: //   "CMP <%b,S", 2, 4,
			mem = S_REL;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0xC4: //   "CPY <%b", 2, 3,
			mem = DIR;
			oldXY = INDEX_Y - *(XYTYPE*)TRAPREAD(mem);
			SETNEGATIVEXY (oldXY); SETZERO (oldXY);
			if (oldXY > INDEX_Y)
				P &= ~CARRY; else P |= CARRY;
			PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
		case 0xC5: //   "CMP <%b", 2, 3,
			mem = DIR;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
		case 0xC6: //   "DEC <%b", 2, 5,
			mem = DIR;
			(*(amem = (ATYPE*)TRAPREAD(mem)))--;
			SETZERO (*amem); SETNEGATIVE (*amem);
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0xC7: //   "CMP [<%b]", 2,6,
			mem = DIR_INDIR_LONG;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0xC8: //   "INY", 1, 2,
			INDEX_Y++;
			SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
			PC += 1; cycles -= 2; DOBREAK;
		case 0xC9: //   "CMP %#", 2, 2,
			oldA = ACCUM - IMM_ACCUM;
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
		case 0xCA: //   "DEX", 1, 2,
			INDEX_X--;
			SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
			PC += 1; cycles -= 2; DOBREAK;
		case 0xCB: //   "WAI", 1, 3,
			if (state.end_wai && state.within_wai) {
				PC += 1;
				state.end_wai = false;
				state.within_wai = false;
			} else {
				state.within_wai = true;
				state.end_wai = false;
			}
			cycles = -3; DOBREAK;
		case 0xCC: //   "CPY %w", 3, 4,
			mem = ABS;
			oldXY = INDEX_Y - *(XYTYPE*)TRAPREAD(mem);
			SETNEGATIVEXY (oldXY); SETZERO (oldXY);
			if (oldXY > INDEX_Y)
				P &= ~CARRY; else P |= CARRY;
			PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
		case 0xCD: //   "CMP %w", 3, 4,
			mem = ABS;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
		case 0xCE: //   "DEC %w", 3, 6,
			mem = ABS;
			(*(amem = (ATYPE*)TRAPREAD(mem)))--;
			SETZERO (*amem); SETNEGATIVE (*amem);
			PC += 3; cycles -= 6+A_IS16BIT; DOBREAK;
		case 0xCF: //   "CMP %L", 4, 5,
			mem = ABS_LONG;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0xD0: //   "BNE @%b", 2, 2,
			if (P & ZERO) { // False
				PC += 2; cycles -= 2; DOBREAK;
			}
			PC += 2 + ((signed char) opdata);
			cycles -= 3; DOBREAK;
		case 0xD1: //   "CMP (<%b),Y", 2, 5,
			mem = DIR_INDIR_INDEX_Y;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);
			if (oldA > ACCUM)
				P &= ~CARRY; else P |= CARRY;
			PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
		case 0xD2: //   "CMP (<%b)", 2, 5,
			mem = DIR_INDIR;
			oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
			SETNEGATIVE (oldA);	SETZERO (oldA);

⌨️ 快捷键说明

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