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

📄 cpu.c

📁 wince下著名的视频播放器源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	OPCODE(46)				/* LSR ab */		ZPAGE;		data = dGetByte(addr);		C = data & 1;		Z = data >> 1;		N = 0;		dPutByte(addr, Z);		DONE	OPCODE(47)				/* LSE ab [unofficial - LSR then EOR result with A] */		ZPAGE;	lse_zpage:		data = dGetByte(addr);		C = data & 1;		data >>= 1;		dPutByte(addr, data);		Z = N = A ^= data;		DONE	OPCODE(48)				/* PHA */		PH(A);		DONE	OPCODE(49)				/* EOR #ab */		EOR(IMMEDIATE);		DONE	OPCODE(4a)				/* LSR */		C = A & 1;		Z = N = A >>= 1;		DONE	OPCODE(4b)				/* ALR #ab [unofficial - Acc AND Data, LSR result] */		data = A & IMMEDIATE;		C = data & 1;		Z = N = A = (data >> 1);		DONE	OPCODE(4c)				/* JMP abcd */#ifdef MONITOR_BREAK		remember_JMP[remember_jmp_curpos] = GET_PC() - 1;		remember_jmp_curpos = (remember_jmp_curpos + 1) % REMEMBER_JMP_STEPS;#endif		SET_PC(OP_WORD);		DONE	OPCODE(4d)				/* EOR abcd */		ABSOLUTE;		EOR(GetByte(addr));		DONE	OPCODE(4e)				/* LSR abcd */		ABSOLUTE;		RMW_GetByte(data, addr);		C = data & 1;		Z = data >> 1;		N = 0;		PutByte(addr, Z);		DONE	OPCODE(4f)				/* LSE abcd [unofficial - LSR then EOR result with A] */		ABSOLUTE;		goto lse;	OPCODE(50)				/* BVC */#ifndef NO_V_FLAG_VARIABLE		BRANCH(!V)#else		BRANCH(!(regP & 0x40))#endif	OPCODE(51)				/* EOR (ab),y */		INDIRECT_Y;		NCYCLES_Y;		EOR(GetByte(addr));		DONE	OPCODE(53)				/* LSE (ab),y [unofficial - LSR then EOR result with A] */		INDIRECT_Y;		goto lse;	OPCODE(55)				/* EOR ab,x */		ZPAGE_X;		EOR(dGetByte(addr));		DONE	OPCODE(56)				/* LSR ab,x */		ZPAGE_X;		data = dGetByte(addr);		C = data & 1;		Z = data >> 1;		N = 0;		dPutByte(addr, Z);		DONE	OPCODE(57)				/* LSE ab,x [unofficial - LSR then EOR result with A] */		ZPAGE_X;		goto lse_zpage;	OPCODE(58)				/* CLI */		ClrI;		CPUCHECKIRQ;		DONE	OPCODE(59)				/* EOR abcd,y */		ABSOLUTE_Y;		NCYCLES_Y;		EOR(GetByte(addr));		DONE	OPCODE(5b)				/* LSE abcd,y [unofficial - LSR then EOR result with A] */		ABSOLUTE_Y;		goto lse;	OPCODE(5d)				/* EOR abcd,x */		ABSOLUTE_X;		NCYCLES_X;		EOR(GetByte(addr));		DONE	OPCODE(5e)				/* LSR abcd,x */		ABSOLUTE_X;		RMW_GetByte(data, addr);		C = data & 1;		Z = data >> 1;		N = 0;		PutByte(addr, Z);		DONE	OPCODE(5f)				/* LSE abcd,x [unofficial - LSR then EOR result with A] */		ABSOLUTE_X;		goto lse;	OPCODE(60)				/* RTS */		data = PL;		SET_PC((PL << 8) + data + 1);#ifdef MONITOR_BREAK		if (break_ret && --ret_nesting <= 0)			break_step = TRUE;#endif		if (rts_handler != NULL) {			rts_handler();			rts_handler = NULL;		}		DONE	OPCODE(61)				/* ADC (ab,x) */		INDIRECT_X;		data = GetByte(addr);		goto adc;	OPCODE(63)				/* RRA (ab,x) [unofficial - ROR Mem, then ADC to Acc] */		INDIRECT_X;	rra:		RMW_GetByte(data, addr);		if (C) {			C = data & 1;			data = (data >> 1) + 0x80;		}		else {			C = data & 1;			data >>= 1;		}		PutByte(addr, data);		goto adc;	OPCODE(65)				/* ADC ab */		ZPAGE;		data = dGetByte(addr);		goto adc;	OPCODE(66)				/* ROR ab */		ZPAGE;		data = dGetByte(addr);		Z = N = (C << 7) + (data >> 1);		C = data & 1;		dPutByte(addr, Z);		DONE	OPCODE(67)				/* RRA ab [unofficial - ROR Mem, then ADC to Acc] */		ZPAGE;	rra_zpage:		data = dGetByte(addr);		if (C) {			C = data & 1;			data = (data >> 1) + 0x80;		}		else {			C = data & 1;			data >>= 1;		}		dPutByte(addr, data);		goto adc;	OPCODE(68)				/* PLA */		Z = N = A = PL;		DONE	OPCODE(69)				/* ADC #ab */		data = IMMEDIATE;		goto adc;	OPCODE(6a)				/* ROR */		Z = N = (C << 7) + (A >> 1);		C = A & 1;		A = Z;		DONE	OPCODE(6b)				/* ARR #ab [unofficial - Acc AND Data, ROR result] */		/* It does some 'BCD fixup' if D flag is set */		/* MPC 05/24/00 */		data = A & IMMEDIATE;		if (regP & D_FLAG) {			UBYTE temp = (data >> 1) + (C << 7);			Z = N = temp;#ifndef NO_V_FLAG_VARIABLE			V = ((temp ^ data) & 0x40);#else			regP = (regP & 0xbf) + ((temp ^ data) & 0x40);#endif			if ((data & 0x0F) + (data & 0x01) > 5)				temp = (temp & 0xF0) + ((temp + 0x6) & 0x0F);			if (data + (data & 0x10) >= 0x60) {				temp += 0x60;				C = 1;			}			else				C = 0;			A = (UBYTE) temp;		}		else {			Z = N = A = (data >> 1) + (C << 7);			C = data >> 7;#ifndef NO_V_FLAG_VARIABLE			V = C ^ ((A >> 5) & 1);#else			regP = (regP & 0xbf) + ((A ^ data) & 0x40);#endif		}		DONE	OPCODE(6c)				/* JMP (abcd) */#ifdef MONITOR_BREAK		remember_JMP[remember_jmp_curpos] = GET_PC() - 1;		remember_jmp_curpos = (remember_jmp_curpos + 1) % REMEMBER_JMP_STEPS;#endif		ABSOLUTE;#ifdef CPU65C02		/* XXX: if ((UBYTE) addr == 0xff) xpos++; */		SET_PC(dGetWord(addr));#else		/* original 6502 had a bug in JMP (addr) when addr crossed page boundary */		if ((UBYTE) addr == 0xff)			SET_PC((dGetByte(addr - 0xff) << 8) + dGetByte(addr));		else			SET_PC(dGetWord(addr));#endif		DONE	OPCODE(6d)				/* ADC abcd */		ABSOLUTE;		data = GetByte(addr);		goto adc;	OPCODE(6e)				/* ROR abcd */		ABSOLUTE;		RMW_GetByte(data, addr);		Z = N = (C << 7) + (data >> 1);		C = data & 1;		PutByte(addr, Z);		DONE	OPCODE(6f)				/* RRA abcd [unofficial - ROR Mem, then ADC to Acc] */		ABSOLUTE;		goto rra;	OPCODE(70)				/* BVS */#ifndef NO_V_FLAG_VARIABLE		BRANCH(V)#else		BRANCH(regP & 0x40)#endif	OPCODE(71)				/* ADC (ab),y */		INDIRECT_Y;		NCYCLES_Y;		data = GetByte(addr);		goto adc;	OPCODE(73)				/* RRA (ab),y [unofficial - ROR Mem, then ADC to Acc] */		INDIRECT_Y;		goto rra;	OPCODE(75)				/* ADC ab,x */		ZPAGE_X;		data = dGetByte(addr);		goto adc;	OPCODE(76)				/* ROR ab,x */		ZPAGE_X;		data = dGetByte(addr);		Z = N = (C << 7) + (data >> 1);		C = data & 1;		dPutByte(addr, Z);		DONE	OPCODE(77)				/* RRA ab,x [unofficial - ROR Mem, then ADC to Acc] */		ZPAGE_X;		goto rra_zpage;	OPCODE(78)				/* SEI */		SetI;		DONE	OPCODE(79)				/* ADC abcd,y */		ABSOLUTE_Y;		NCYCLES_Y;		data = GetByte(addr);		goto adc;	OPCODE(7b)				/* RRA abcd,y [unofficial - ROR Mem, then ADC to Acc] */		ABSOLUTE_Y;		goto rra;	OPCODE(7d)				/* ADC abcd,x */		ABSOLUTE_X;		NCYCLES_X;		data = GetByte(addr);		goto adc;	OPCODE(7e)				/* ROR abcd,x */		ABSOLUTE_X;		RMW_GetByte(data, addr);		Z = N = (C << 7) + (data >> 1);		C = data & 1;		PutByte(addr, Z);		DONE	OPCODE(7f)				/* RRA abcd,x [unofficial - ROR Mem, then ADC to Acc] */		ABSOLUTE_X;		goto rra;	OPCODE(81)				/* STA (ab,x) */		INDIRECT_X;		PutByte(addr, A);		DONE	/* AXS doesn't change flags and SAX is better name for it (Fox) */	OPCODE(83)				/* SAX (ab,x) [unofficial - Store result A AND X */		INDIRECT_X;		data = A & X;		PutByte(addr, data);		DONE	OPCODE(84)				/* STY ab */		ZPAGE;		dPutByte(addr, Y);		DONE	OPCODE(85)				/* STA ab */		ZPAGE;		dPutByte(addr, A);		DONE	OPCODE(86)				/* STX ab */		ZPAGE;		dPutByte(addr, X);		DONE	OPCODE(87)				/* SAX ab [unofficial - Store result A AND X] */		ZPAGE;		data = A & X;		dPutByte(addr, data);		DONE	OPCODE(88)				/* DEY */		Z = N = --Y;		DONE	OPCODE(8a)				/* TXA */		Z = N = A = X;		DONE	OPCODE(8b)				/* ANE #ab [unofficial - A AND X AND (Mem OR $EF) to Acc] (Fox) */		data = IMMEDIATE;		N = Z = A & X & data;		A &= X & (data | 0xef);		DONE	OPCODE(8c)				/* STY abcd */		ABSOLUTE;		PutByte(addr, Y);		DONE	OPCODE(8d)				/* STA abcd */		ABSOLUTE;		PutByte(addr, A);		DONE	OPCODE(8e)				/* STX abcd */		ABSOLUTE;		PutByte(addr, X);		DONE	OPCODE(8f)				/* SAX abcd [unofficial - Store result A AND X] */		ABSOLUTE;		data = A & X;		PutByte(addr, data);		DONE	OPCODE(90)				/* BCC */		BRANCH(!C)	OPCODE(91)				/* STA (ab),y */		INDIRECT_Y;		PutByte(addr, A);		DONE	OPCODE(93)				/* SHA (ab),y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] (Fox) */		/* It seems previous memory value is important - also in 9f */		ZPAGE;		data = dGetByte((UBYTE) (addr + 1));	/* Get high byte from zpage */		data = A & X & (data + 1);		addr = dGetWord(addr) + Y;		PutByte(addr, data);		DONE	OPCODE(94)				/* STY ab,x */		ZPAGE_X;		dPutByte(addr, Y);		DONE	OPCODE(95)				/* STA ab,x */		ZPAGE_X;		dPutByte(addr, A);		DONE	OPCODE(96)				/* STX ab,y */		ZPAGE_Y;		PutByte(addr, X);		DONE	OPCODE(97)				/* SAX ab,y [unofficial - Store result A AND X] */		ZPAGE_Y;		data = A & X;		dPutByte(addr, data);		DONE	OPCODE(98)				/* TYA */		Z = N = A = Y;		DONE	OPCODE(99)				/* STA abcd,y */		ABSOLUTE_Y;		PutByte(addr, A);		DONE	OPCODE(9a)				/* TXS */		S = X;		DONE	OPCODE(9b)				/* SHS abcd,y [unofficial, UNSTABLE] (Fox) */		/* Transfer A AND X to S, then store S AND (H+1)] */		/* S seems to be stable, only memory values vary */		ABSOLUTE;		S = A & X;		data = S & ((addr >> 8) + 1);		addr += Y;		PutByte(addr, data);		DONE	OPCODE(9c)				/* SHY abcd,x [unofficial - Store Y and (H+1)] (Fox) */		/* Seems to be stable */		ABSOLUTE;		/* MPC 05/24/00 */		data = Y & ((UBYTE) ((addr >> 8) + 1));		addr += X;		PutByte(addr, data);		DONE	OPCODE(9d)				/* STA abcd,x */		ABSOLUTE_X;		PutByte(addr, A);		DONE	OPCODE(9e)				/* SHX abcd,y [unofficial - Store X and (H+1)] (Fox) */		/* Seems to be stable */		ABSOLUTE;		/* MPC 05/24/00 */		data = X & ((UBYTE) ((addr >> 8) + 1));		addr += Y;		PutByte(addr, data);		DONE	OPCODE(9f)				/* SHA abcd,y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] (Fox) */		ABSOLUTE;		data = A & X & ((addr >> 8) + 1);		addr += Y;		PutByte(addr, data);		DONE	OPCODE(a0)				/* LDY #ab */		LDY(IMMEDIATE);		DONE	OPCODE(a1)				/* LDA (ab,x) */		INDIRECT_X;		LDA(GetByte(addr));		DONE	OPCODE(a2)				/* LDX #ab */		LDX(IMMEDIATE);		DONE	OPCODE(a3)				/* LAX (ab,x) [unofficial] */		INDIRECT_X;		Z = N = X = A = GetByte(addr);		DONE	OPCODE(a4)				/* LDY ab */		ZPAGE;		LDY(dGetByte(addr));		DONE	OPCODE(a5)				/* LDA ab */		ZPAGE;		LDA(dGetByte(addr));		DONE	OPCODE(a6)				/* LDX ab */		ZPAGE;		LDX(dGetByte(addr));		DONE	OPCODE(a7)				/* LAX ab [unofficial] */		ZPAGE;		Z = N = X = A = GetByte(addr);		DONE	OPCODE(a8)				/* TAY */		Z = N = Y = A;		DONE	OPCODE(a9)				/* LDA #ab */		LDA(IMMEDIATE);		DONE	OPCODE(aa)				/* TAX */		Z = N = X = A;		DONE	OPCODE(ab)				/* ANX #ab [unofficial - AND #ab, then TAX] */		Z = N = X = A &= IMMEDIATE;		DONE	OPCODE(ac)				/* LDY abcd */		ABSOLUTE;		LDY(GetByte(addr));		DONE	OPCODE(ad)				/* LDA abcd */		ABSOLUTE;		LDA(GetByte(addr));		DONE	OPCODE(ae)				/* LDX abcd */		ABSOLUTE;		LDX(GetByte(addr));		DONE	OPCODE(af)				/* LAX abcd [unofficial] */		ABSOLUTE;		Z = N = X = A = GetByte(addr);		DONE	OPCODE(b0)				/* BCS */		BRANCH(C)	OPCODE(b1)				/* LDA (ab),y */		INDIRECT_Y;		NCYCLES_Y;		LDA(GetByte(addr));		DONE	OPCODE(b3)				/* LAX (ab),y [unofficial] */		INDIRECT_Y;		NCYCLES_Y;		Z = N = X = A = GetByte(addr);		DONE	OPCODE(b4)				/* LDY ab,x */		ZPAGE_X;		LDY(dGetByte(addr));		DONE

⌨️ 快捷键说明

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