diff --git a/MC6809/inc/mc6809.h b/MC6809/inc/mc6809.h
index 3604d77..bd722e8 100644
--- a/MC6809/inc/mc6809.h
+++ b/MC6809/inc/mc6809.h
@@ -254,18 +254,21 @@ namespace EightBit {
// Flag checking
+ int fastInterruptMasked() { return CC() & FF; }
+ int interruptMasked() { return CC() & IF; }
+
int negative() { return CC() & NF; }
int zero() { return CC() & ZF; }
int overflow() { return CC() & VF; }
int carry() { return CC() & CF; }
int halfCarry() { return CC() & HF; }
- bool BLS() { return carry() | (zero() >> 2); } // (C OR Z)
- bool BHI() { return !BLS(); } // !(C OR Z)
- bool BLT() { return (negative() >> 1) ^ overflow(); } // (N XOR V)
- bool BGE() { return !BLT(); } // !(N XOR V)
- bool BLE() { return (zero() >> 2) & ((negative() >> 3) ^ (overflow() >> 1)); } // (Z OR (N XOR V))
- bool BGT() { return !BLE(); } // !(Z OR (N XOR V))
+ bool LS() { return carry() | (zero() >> 2); } // (C OR Z)
+ bool HI() { return !LS(); } // !(C OR Z)
+ bool LT() { return (negative() >> 1) ^ overflow(); } // (N XOR V)
+ bool GE() { return !LT(); } // !(N XOR V)
+ bool LE() { return (zero() >> 2) & ((negative() >> 3) ^ (overflow() >> 1)); } // (Z OR (N XOR V))
+ bool GT() { return !LE(); } // !(Z OR (N XOR V))
// Branching
@@ -275,12 +278,13 @@ namespace EightBit {
return !!condition;
}
- bool branchShort(int condition) {
- return branch(Address_relative_byte(), condition);
+ void branchShort(int condition) {
+ branch(Address_relative_byte(), condition);
}
- bool branchLong(int condition) {
- return branch(Address_relative_word(), condition);
+ void branchLong(int condition) {
+ if (branch(Address_relative_word(), condition))
+ addCycle();
}
// Miscellaneous
diff --git a/MC6809/inc/stdafx.h b/MC6809/inc/stdafx.h
deleted file mode 100644
index cf71f60..0000000
Binary files a/MC6809/inc/stdafx.h and /dev/null differ
diff --git a/MC6809/src/MC6809.vcxproj b/MC6809/src/MC6809.vcxproj
index 071bfae..2010afb 100644
--- a/MC6809/src/MC6809.vcxproj
+++ b/MC6809/src/MC6809.vcxproj
@@ -21,7 +21,7 @@
-
+
diff --git a/MC6809/src/MC6809.vcxproj.filters b/MC6809/src/MC6809.vcxproj.filters
index 0d7fa97..9e68e67 100644
--- a/MC6809/src/MC6809.vcxproj.filters
+++ b/MC6809/src/MC6809.vcxproj.filters
@@ -11,15 +11,15 @@
-
- Header Files
-
Header Files
Header Files
+
+ Header Files
+
diff --git a/MC6809/src/mc6809.cpp b/MC6809/src/mc6809.cpp
index ef183ea..502478d 100644
--- a/MC6809/src/mc6809.cpp
+++ b/MC6809/src/mc6809.cpp
@@ -24,9 +24,9 @@ int EightBit::mc6809::step() {
handleRESET();
else if (UNLIKELY(lowered(NMI())))
handleNMI();
- else if (UNLIKELY(lowered(FIRQ()) && !(CC() & FF)))
+ else if (UNLIKELY(lowered(FIRQ()) && !fastInterruptMasked()))
handleFIRQ();
- else if (UNLIKELY(lowered(IRQ()) && !(CC() & IF)))
+ else if (UNLIKELY(lowered(IRQ()) && !interruptMasked()))
handleIRQ();
else
execute(fetchByte());
@@ -131,20 +131,20 @@ void EightBit::mc6809::executeUnprefixed(const uint8_t opcode) {
case 0xf9: addCycles(4); B() = adc(B(), AM_extended_byte()); break; // ADC (ADCB extended)
// ADD
- case 0x8b: addCycles(2); A() = add(A(), AM_immediate_byte()); break; // ADD (ADDA immediate)
- case 0x9b: addCycles(4); A() = add(A(), AM_direct_byte()); break; // ADD (ADDA direct)
- case 0xab: addCycles(4); A() = add(A(), AM_indexed_byte()); break; // ADD (ADDA indexed)
- case 0xbb: addCycles(5); A() = add(A(), AM_extended_byte()); break; // ADD (ADDA extended)
+ case 0x8b: addCycles(2); A() = add(A(), AM_immediate_byte()); break; // ADD (ADDA immediate)
+ case 0x9b: addCycles(4); A() = add(A(), AM_direct_byte()); break; // ADD (ADDA direct)
+ case 0xab: addCycles(4); A() = add(A(), AM_indexed_byte()); break; // ADD (ADDA indexed)
+ case 0xbb: addCycles(5); A() = add(A(), AM_extended_byte()); break; // ADD (ADDA extended)
- case 0xcb: addCycles(2); B() = add(B(), AM_immediate_byte()); break; // ADD (ADDB immediate)
- case 0xdb: addCycles(4); B() = add(B(), AM_direct_byte()); break; // ADD (ADDB direct)
- case 0xeb: addCycles(4); B() = add(B(), AM_indexed_byte()); break; // ADD (ADDB indexed)
- case 0xfb: addCycles(5); B() = add(B(), AM_extended_byte()); break; // ADD (ADDB extended)
+ case 0xcb: addCycles(2); B() = add(B(), AM_immediate_byte()); break; // ADD (ADDB immediate)
+ case 0xdb: addCycles(4); B() = add(B(), AM_direct_byte()); break; // ADD (ADDB direct)
+ case 0xeb: addCycles(4); B() = add(B(), AM_indexed_byte()); break; // ADD (ADDB indexed)
+ case 0xfb: addCycles(5); B() = add(B(), AM_extended_byte()); break; // ADD (ADDB extended)
- case 0xc3: addCycles(4); D() = add(D(), AM_immediate_word()); break; // ADD (ADDD immediate)
- case 0xd3: addCycles(6); D() = add(D(), AM_direct_word()); break; // ADD (ADDD direct)
- case 0xe3: addCycles(6); D() = add(D(), AM_indexed_word()); break; // ADD (ADDD indexed)
- case 0xf3: addCycles(7); D() = add(D(), AM_extended_word()); break; // ADD (ADDD extended)
+ case 0xc3: addCycles(4); D() = add(D(), AM_immediate_word()); break; // ADD (ADDD immediate)
+ case 0xd3: addCycles(6); D() = add(D(), AM_direct_word()); break; // ADD (ADDD direct)
+ case 0xe3: addCycles(6); D() = add(D(), AM_indexed_word()); break; // ADD (ADDD indexed)
+ case 0xf3: addCycles(7); D() = add(D(), AM_extended_word()); break; // ADD (ADDD extended)
// AND
case 0x84: addCycles(2); A() = andr(A(), AM_immediate_byte()); break; // AND (ANDA immediate)
@@ -454,8 +454,8 @@ void EightBit::mc6809::executeUnprefixed(const uint8_t opcode) {
case 0x17: addCycles(9); jsr(Address_relative_word()); break; // BSR (LBSR relative)
case 0x20: addCycles(3); jump(Address_relative_byte()); break; // BRA (relative)
case 0x21: addCycles(3); Address_relative_byte(); break; // BRN (relative)
- case 0x22: addCycles(3); branchShort(BHI()); break; // BHI (relative)
- case 0x23: addCycles(3); branchShort(BLS()); break; // BLS (relative)
+ case 0x22: addCycles(3); branchShort(HI()); break; // BHI (relative)
+ case 0x23: addCycles(3); branchShort(LS()); break; // BLS (relative)
case 0x24: addCycles(3); branchShort(!carry()); break; // BCC (relative)
case 0x25: addCycles(3); branchShort(carry()); break; // BCS (relative)
case 0x26: addCycles(3); branchShort(!zero()); break; // BNE (relative)
@@ -464,10 +464,10 @@ void EightBit::mc6809::executeUnprefixed(const uint8_t opcode) {
case 0x29: addCycles(3); branchShort(overflow()); break; // BVS (relative)
case 0x2a: addCycles(3); branchShort(!negative()); break; // BPL (relative)
case 0x2b: addCycles(3); branchShort(negative()); break; // BMI (relative)
- case 0x2c: addCycles(3); branchShort(BGE()); break; // BGE (relative)
- case 0x2d: addCycles(3); branchShort(BLT()); break; // BLT (relative)
- case 0x2e: addCycles(3); branchShort(BGT()); break; // BGT (relative)
- case 0x2f: addCycles(3); branchShort(BLE()); break; // BLE (relative)
+ case 0x2c: addCycles(3); branchShort(GE()); break; // BGE (relative)
+ case 0x2d: addCycles(3); branchShort(LT()); break; // BLT (relative)
+ case 0x2e: addCycles(3); branchShort(GT()); break; // BGT (relative)
+ case 0x2f: addCycles(3); branchShort(LE()); break; // BLE (relative)
case 0x8d: addCycles(7); jsr(Address_relative_byte()); break; // BSR (relative)
@@ -514,20 +514,20 @@ void EightBit::mc6809::execute10(const uint8_t opcode) {
// Branching
case 0x21: addCycles(5); Address_relative_word(); break; // BRN (LBRN relative)
- case 0x22: addCycles(5); if (branchLong(BHI())) addCycle(); break; // BHI (LBHI relative)
- case 0x23: addCycles(5); if (branchLong(BLS())) addCycle(); break; // BLS (LBLS relative)
- case 0x24: addCycles(5); if (branchLong(!carry())) addCycle(); break; // BCC (LBCC relative)
- case 0x25: addCycles(5); if (branchLong(carry())) addCycle(); break; // BCS (LBCS relative)
- case 0x26: addCycles(5); if (branchLong(!zero())) addCycle(); break; // BNE (LBNE relative)
- case 0x27: addCycles(5); if (branchLong(zero())) addCycle(); break; // BEQ (LBEQ relative)
- case 0x28: addCycles(5); if (branchLong(!overflow())) addCycle(); break; // BVC (LBVC relative)
- case 0x29: addCycles(5); if (branchLong(overflow())) addCycle(); break; // BVS (LBVS relative)
- case 0x2a: addCycles(5); if (branchLong(!negative())) addCycle(); break; // BPL (LBPL relative)
- case 0x2b: addCycles(5); if (branchLong(negative())) addCycle(); break; // BMI (LBMI relative)
- case 0x2c: addCycles(5); if (branchLong(BGE())) addCycle(); break; // BGE (LBGE relative)
- case 0x2d: addCycles(5); if (branchLong(BLT())) addCycle(); break; // BLT (LBLT relative)
- case 0x2e: addCycles(5); if (branchLong(BGT())) addCycle(); break; // BGT (LBGT relative)
- case 0x2f: addCycles(5); if (branchLong(BLE())) addCycle(); break; // BLE (LBLE relative)
+ case 0x22: addCycles(5); branchLong(HI()); break; // BHI (LBHI relative)
+ case 0x23: addCycles(5); branchLong(LS()); break; // BLS (LBLS relative)
+ case 0x24: addCycles(5); branchLong(!carry()); break; // BCC (LBCC relative)
+ case 0x25: addCycles(5); branchLong(carry()); break; // BCS (LBCS relative)
+ case 0x26: addCycles(5); branchLong(!zero()); break; // BNE (LBNE relative)
+ case 0x27: addCycles(5); branchLong(zero()); break; // BEQ (LBEQ relative)
+ case 0x28: addCycles(5); branchLong(!overflow()); break; // BVC (LBVC relative)
+ case 0x29: addCycles(5); branchLong(overflow()); break; // BVS (LBVS relative)
+ case 0x2a: addCycles(5); branchLong(!negative()); break; // BPL (LBPL relative)
+ case 0x2b: addCycles(5); branchLong(negative()); break; // BMI (LBMI relative)
+ case 0x2c: addCycles(5); branchLong(GE()); break; // BGE (LBGE relative)
+ case 0x2d: addCycles(5); branchLong(LT()); break; // BLT (LBLT relative)
+ case 0x2e: addCycles(5); branchLong(GT()); break; // BGT (LBGT relative)
+ case 0x2f: addCycles(5); branchLong(LE()); break; // BLE (LBLE relative)
// STS
case 0xdf: addCycles(6); Processor::setWord(Address_direct(), st(S())); break; // ST (STS direct)
@@ -1057,7 +1057,8 @@ void EightBit::mc6809::rts() {
void EightBit::mc6809::swi() {
saveEntireRegisterState();
- setFlag(CC(), (IF | FF));
+ setFlag(CC(), IF); // Disable IRQ
+ setFlag(CC(), FF); // Disable FIRQ
jump(getWordPaged(0xff, SWIvector));
}