chiark / gitweb /
ROL and ROR
authorThomas Thurman <tthurman@gnome.org>
Fri, 26 Mar 2010 01:05:44 +0000 (21:05 -0400)
committerThomas Thurman <tthurman@gnome.org>
Fri, 26 Mar 2010 01:05:44 +0000 (21:05 -0400)
src/Processor.cpp
src/opcodes.cpp
src/opnames.cpp

index 8b8c41f..f98cf20 100644 (file)
@@ -531,7 +531,7 @@ void Processor::oneShot() {
 
     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;
@@ -544,7 +544,7 @@ void Processor::oneShot() {
 
     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;
@@ -568,6 +568,37 @@ void Processor::oneShot() {
     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:
@@ -597,13 +628,6 @@ void Processor::oneShot() {
     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);
@@ -638,13 +662,6 @@ void Processor::oneShot() {
     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);
@@ -659,12 +676,18 @@ void Processor::oneShot() {
     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.";
   }
 
 }
index 03d20d6..5c870f9 100644 (file)
@@ -8,7 +8,7 @@ struct Opcode opcodes[256] = {
   { 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
@@ -40,7 +40,7 @@ struct Opcode opcodes[256] = {
   { 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
index 8737fd7..40a1998 100644 (file)
@@ -37,9 +37,11 @@ typedef enum _Op {
   OP_NOP,  // 
   OP_ORA,  // 
   OP_PHA,  // 
+  OP_PHP,  // 
   OP_PLA,  // 
-  OP_ROL,  // 
-  OP_ROR,  // 
+  OP_PLP,  // 
+  OP_ROL,  // Rotate left
+  OP_ROR,   // Rotate right
   OP_RTI,  // 
   OP_RTS,  // 
   OP_SBC,  // 
@@ -96,7 +98,9 @@ QString opnames =
   "NOP "
   "ORA "
   "PHA "
+  "PHP "
   "PLA "
+  "PLP "
   "ROL "
   "ROR "
   "RTI "