📄 cpu.c
字号:
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 + -