Cleanup ROR instructions

This commit is contained in:
2025-07-28 12:33:13 -04:00
parent edac91baf9
commit 9ba05a45ef
2 changed files with 19 additions and 54 deletions

View File

@@ -367,6 +367,20 @@ uint16_t CPU::ROR16(uint16_t value) {
return value; return value;
} }
void CPU::ROR_AtAddress(const uint32_t address, const int base_cycles_8bit, const int base_cycles_16bit) {
if (P & FLAG_M) {
uint8_t value = ReadByte(address);
value = ROR8(value);
WriteByte(address, value);
cycles += base_cycles_8bit;
} else {
uint16_t value = ReadWord(address);
value = ROR16(value);
WriteWord(address, value);
cycles += base_cycles_16bit;
}
}
void CPU::SBC8(const uint8_t operand) { void CPU::SBC8(const uint8_t operand) {
const uint8_t acc = A & 0xFF; const uint8_t acc = A & 0xFF;
@@ -4313,19 +4327,7 @@ void CPU::ROR_Absolute() {
const uint16_t address = ReadWord(PC); const uint16_t address = ReadWord(PC);
PC += 2; PC += 2;
if (P & FLAG_M) { ROR_AtAddress((DB << 16) | address, 6, 7);
// 8-bit mode
uint8_t value = ReadByte((DB << 16) | address);
value = ROR8(value);
WriteByte((DB << 16) | address, value);
cycles += 6;
} else {
// 16-bit mode
uint16_t value = ReadWord((DB << 16) | address);
value = ROR16(value);
WriteWord((DB << 16) | address, value);
cycles += 7;
}
} }
void CPU::ROR_AbsoluteX() { void CPU::ROR_AbsoluteX() {
@@ -4333,39 +4335,14 @@ void CPU::ROR_AbsoluteX() {
PC += 2; PC += 2;
const uint32_t address = (DB << 16) | (base_address + X); const uint32_t address = (DB << 16) | (base_address + X);
if (P & FLAG_M) { ROR_AtAddress(address, 7, 8);
// 8-bit mode
uint8_t value = ReadByte(address);
value = ROR8(value);
WriteByte(address, value);
cycles += 7;
} else {
// 16-bit mode
uint16_t value = ReadWord(address);
value = ROR16(value);
WriteWord(address, value);
cycles += 8;
}
} }
void CPU::ROR_DirectPage() { void CPU::ROR_DirectPage() {
const uint8_t offset = ReadByte(PC++); const uint8_t offset = ReadByte(PC++);
const uint32_t address = D + offset; const uint32_t address = D + offset;
if (P & FLAG_M) { ROR_AtAddress(address, 5, 6);
// 8-bit mode
uint8_t value = ReadByte(address);
value = ROR8(value);
WriteByte(address, value);
cycles += 5;
} else {
// 16-bit mode
uint16_t value = ReadWord(address);
value = ROR16(value);
WriteWord(address, value);
cycles += 6;
}
if (D & 0xFF) cycles++; if (D & 0xFF) cycles++;
} }
@@ -4373,20 +4350,7 @@ void CPU::ROR_DirectPageX() {
const uint8_t offset = ReadByte(PC++); const uint8_t offset = ReadByte(PC++);
const uint32_t address = D + offset + (P & FLAG_X ? (X & 0xFF) : X); const uint32_t address = D + offset + (P & FLAG_X ? (X & 0xFF) : X);
if (P & FLAG_M) { ROR_AtAddress(address, 6, 7);
// 8-bit mode
uint8_t value = ReadByte(address);
value = ROR8(value);
WriteByte(address, value);
cycles += 6;
} else {
// 16-bit mode
uint16_t value = ReadWord(address);
value = ROR16(value);
WriteWord(address, value);
cycles += 7;
}
if (D & 0xFF) cycles++; if (D & 0xFF) cycles++;
} }

View File

@@ -85,6 +85,7 @@ class CPU {
uint16_t ROL16(uint16_t value); uint16_t ROL16(uint16_t value);
uint8_t ROR8(uint8_t value); uint8_t ROR8(uint8_t value);
uint16_t ROR16(uint16_t value); uint16_t ROR16(uint16_t value);
void ROR_AtAddress(uint32_t address, int base_cycles_8bit, int base_cycles_16bit);
// Helper methods for SBC operations // Helper methods for SBC operations
void SBC8(uint8_t operand); void SBC8(uint8_t operand);