param = this->readParam(address);
param = (param+1) & 0xFF;
- m_memory->writeByteTo(address, param);
+ this->writeParam(address, param);
m_zero = param == 0;
m_sign = (param & 0x80) != 0;
break;
param = this->readParam(address);
param = (param-1) & 0xFF;
- m_memory->writeByteTo(address, param);
+ this->writeParam(address, param);
m_zero = param == 0;
m_sign = (param & 0x80) != 0;
break;
m_programCounter++;
break;
+ case OP_ROR: // Rotate right
+ OpcodeDetails(0x66, MODE_ZERO_PAGE, 5);
+ OpcodeDetails(0x6a, MODE_ACCUMULATOR, 2);
+ OpcodeDetails(0x6e, MODE_ABSOLUTE, 6);
+ OpcodeDetails(0x76, MODE_ZERO_PAGE_X, 6);
+ OpcodeDetails(0x7e, MODE_ABSOLUTE_X, 7);
+
+ param = this->readParam(address);
+ if (m_carry) {
+ param |= 0x100;
+ }
+ m_carry = (param & 0x1) != 0;
+ this->writeParam(address, param >> 1);
+ break;
+
+ case OP_ROL: // Rotate left
+ OpcodeDetails(0x26, MODE_ZERO_PAGE, 5);
+ OpcodeDetails(0x2a, MODE_ACCUMULATOR, 2);
+ OpcodeDetails(0x2e, MODE_ABSOLUTE, 6);
+ OpcodeDetails(0x36, MODE_ZERO_PAGE_X, 6);
+ OpcodeDetails(0x3e, MODE_ABSOLUTE_X, 7);
+
+ param = this->readParam(address) << 1;
+ if (m_carry) {
+ param |= 0x1;
+ }
+ m_carry = (param & 0x100) != 0;
+ this->writeParam(address, param);
+ break;
+
+
////////////////////////////////////////////////////////////////
case OP_XXX:
OpcodeDetails(0x39, MODE_ABSOLUTE_Y, 4);
OpcodeDetails(0x3d, MODE_ABSOLUTE_X, 4);
- case OP_ROR:
- OpcodeDetails(0x66, MODE_ZERO_PAGE, 5);
- OpcodeDetails(0x6a, MODE_ACCUMULATOR, 2);
- OpcodeDetails(0x6e, MODE_ABSOLUTE, 6);
- OpcodeDetails(0x76, MODE_ZERO_PAGE_X, 6);
- OpcodeDetails(0x7e, MODE_ABSOLUTE_X, 7);
-
case OP_EOR:
OpcodeDetails(0x41, MODE_INDIRECT_X, 6);
OpcodeDetails(0x45, MODE_ZERO_PAGE, 3);
OpcodeDetails(0x56, MODE_ZERO_PAGE_X, 6);
OpcodeDetails(0x5e, MODE_ABSOLUTE_X, 7);
- case OP_ROL:
- OpcodeDetails(0x26, MODE_ZERO_PAGE, 5);
- OpcodeDetails(0x2a, MODE_ACCUMULATOR, 2);
- OpcodeDetails(0x2e, MODE_ABSOLUTE, 6);
- OpcodeDetails(0x36, MODE_ZERO_PAGE_X, 6);
- OpcodeDetails(0x3e, MODE_ABSOLUTE_X, 7);
-
case OP_JMP:
OpcodeDetails(0x4c, MODE_ABSOLUTE, 3);
OpcodeDetails(0x6c, MODE_INDIRECT, 5);
OpcodeDetails(0x79, MODE_ABSOLUTE_Y, 4);
OpcodeDetails(0x7d, MODE_ABSOLUTE_X, 4);
+ case OP_PHP:
+ OpcodeDetails(0x08, MODE_IMPLIED, 3);
+
+ case OP_PLP:
+ OpcodeDetails(0x28, MODE_IMPLIED, 4);
+
case OP_BRK:
OpcodeDetails(0x00, MODE_IMPLIED, 7);
default:
qDebug() << "Alert! Unimplemented opcode encountered: " << QString("%2 %1").arg(opcode, 2, 16).arg(opnames.mid(opcodes[opcode].operation*4, 3));
- throw "Unimplemented opcode.";
+ //throw "Unimplemented opcode.";
}
}
{ OP_ORA, MODE_ZERO_PAGE, 2 }, // 05
{ OP_ASL, MODE_ZERO_PAGE, 5 }, // 06
{ OP_XXX, MODE_IMPLIED, 0 }, // 07
- { OP_XXX, MODE_IMPLIED, 0 }, // 08
+ { OP_PHP, MODE_IMPLIED, 3 }, // 08
{ OP_ORA, MODE_IMMEDIATE, 2 }, // 09
{ OP_ASL, MODE_ACCUMULATOR, 2 }, // 0a
{ OP_XXX, MODE_IMPLIED, 0 }, // 0b
{ OP_AND, MODE_ZERO_PAGE, 2 }, // 25
{ OP_ROL, MODE_ZERO_PAGE, 5 }, // 26
{ OP_XXX, MODE_IMPLIED, 0 }, // 27
- { OP_XXX, MODE_IMPLIED, 0 }, // 28
+ { OP_PLP, MODE_IMPLIED, 4 }, // 28
{ OP_AND, MODE_IMMEDIATE, 2 }, // 29
{ OP_ROL, MODE_ACCUMULATOR, 2 }, // 2a
{ OP_XXX, MODE_IMPLIED, 0 }, // 2b