📄 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 + -