Try to share more flag adjustments in the 6809 implementation

Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
This commit is contained in:
Adrian Conlon 2018-08-20 22:18:41 +01:00
parent 9122b5aa76
commit 90805e76bf
2 changed files with 34 additions and 18 deletions

View File

@ -143,6 +143,34 @@ namespace EightBit {
setFlag(CC(), VF, (before ^ data) & (before ^ after) & Bit15);
}
void adjustAddition(uint8_t before, uint8_t data, register16_t after) {
const auto result = after.low;
adjustNZ(result);
adjustCarry(after.word);
adjustOverflow(before, data, result);
}
void adjustAddition(uint16_t before, uint16_t data, uint32_t after) {
const register16_t result = after & Mask16;
adjustNZ(result);
adjustCarry(after);
adjustOverflow(before, data, result.word);
}
void adjustSubtraction(uint8_t before, uint8_t data, register16_t after) {
const auto result = after.low;
adjustNZ(result);
adjustBorrow(after.word);
adjustOverflow(before, data, result);
}
void adjustSubtraction(uint16_t before, uint16_t data, uint32_t after) {
const register16_t result = after & Mask16;
adjustNZ(result);
adjustBorrow(after);
adjustOverflow(before, data, result.word);
}
// Instruction implementations
void abx();

View File

@ -386,20 +386,14 @@ uint8_t EightBit::mc6809::adc(uint8_t operand, uint8_t data) {
uint8_t EightBit::mc6809::add(uint8_t operand, uint8_t data, int carry) {
const register16_t addition = operand + data + carry;
const auto result = addition.low;
adjustNZ(result);
adjustCarry(addition.word);
adjustOverflow(operand, data, result);
return result;
adjustAddition(operand, data, addition);
return addition.low;
}
EightBit::register16_t EightBit::mc6809::add(register16_t operand, register16_t data) {
const uint32_t addition = operand.word + data.word;
const register16_t result = addition & Mask16;
adjustNZ(result.word);
adjustCarry(addition);
adjustOverflow(operand.word, data.word, result.word);
return result;
adjustAddition(operand.word, data.word, addition);
return addition & Mask16;
}
uint8_t EightBit::mc6809::andr(uint8_t operand, uint8_t data) {
@ -433,16 +427,10 @@ uint8_t EightBit::mc6809::clr() {
void EightBit::mc6809::cmp(const uint8_t operand, const uint8_t data) {
const register16_t difference = operand - data;
const auto result = difference.low;
adjustNZ(result);
adjustBorrow(difference.word);
adjustOverflow(operand, data, result);
adjustSubtraction(operand, data, difference);
}
void EightBit::mc6809::cmp(register16_t operand, register16_t data) {
const uint32_t difference = operand.word - data.word;
const register16_t result = difference & Mask16;
adjustNZ(result.word);
adjustBorrow(difference);
adjustOverflow(operand.word, data.word, result.word);
adjustSubtraction(operand.word, data.word, difference);
}