diff --git a/sources/APU/APU.cpp b/sources/APU/APU.cpp index cc56ec6..a41d04c 100644 --- a/sources/APU/APU.cpp +++ b/sources/APU/APU.cpp @@ -192,7 +192,7 @@ namespace ComSquare::APU case 0x02: return this->SET1(this->_getDirectAddr(), 0); case 0x03: - return this->BBS(this->_getDirectAddr(), 0); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 0); case 0x04: return this->ORacc(this->_getDirectAddr(), 3); case 0x05: @@ -218,13 +218,13 @@ namespace ComSquare::APU case 0x0F: return this->BRK(); case 0x10: - return this->BPL(); + return this->BPL(this->_getImmediateData()); case 0x11: return this->TCALL(1); case 0x12: return this->CLR1(this->_getDirectAddr(), 0); case 0x13: - return this->BBC(this->_getDirectAddr(), 0); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 0); case 0x14: return this->ORacc(this->_getDirectAddrByX(), 4); case 0x15: @@ -256,7 +256,7 @@ namespace ComSquare::APU case 0x22: return this->SET1(this->_getDirectAddr(), 1); case 0x23: - return this->BBS(this->_getDirectAddr(), 1); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 1); case 0x24: return this->ANDacc(this->_getDirectAddr(), 3); case 0x25: @@ -278,17 +278,17 @@ namespace ComSquare::APU case 0x2D: return this->PUSH(this->_internalRegisters.a); case 0x2E: - return this->CBNE(this->_getImmediateData()); + return this->CBNE(this->_getImmediateData(), this->_getImmediateData()); case 0x2F: - return this->BRA(); + return this->BRA(this->_getImmediateData()); case 0x30: - return this->BMI(); + return this->BMI(this->_getImmediateData()); case 0x31: return this->TCALL(3); case 0x32: return this->CLR1(this->_getDirectAddr(), 1); case 0x33: - return this->BBC(this->_getDirectAddr(), 1); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 1); case 0x34: return this->ANDacc(this->_getDirectAddrByX(), 4); case 0x35: @@ -320,7 +320,7 @@ namespace ComSquare::APU case 0x42: return this->SET1(this->_getDirectAddr(), 2); case 0x43: - return this->BBS(this->_getDirectAddr(), 2); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 2); case 0x44: return this->EORacc(this->_getDirectAddr(), 3); case 0x45: @@ -346,13 +346,13 @@ namespace ComSquare::APU case 0x4F: return this->PCALL(); case 0x50: - return this->BVC(); + return this->BVC(this->_getImmediateData()); case 0x51: return this->TCALL(5); case 0x52: return this->CLR1(this->_getDirectAddr(), 2); case 0x53: - return this->BBC(this->_getDirectAddr(), 2); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 2); case 0x54: return this->EORacc(this->_getDirectAddrByX(), 4); case 0x55: @@ -384,7 +384,7 @@ namespace ComSquare::APU case 0x62: return this->SET1(this->_getDirectAddr(), 3); case 0x63: - return this->BBS(this->_getDirectAddr(), 3); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 3); case 0x64: return this->CMPreg(this->_internalRegisters.a, this->_getDirectAddr(), 3); case 0x65: @@ -406,17 +406,17 @@ namespace ComSquare::APU case 0x6D: return this->PUSH(this->_internalRegisters.y); case 0x6E: - return this->DBNZ(true); + return this->DBNZ(this->_getImmediateData(), true); case 0x6F: return this->RET(); case 0x70: - return this->BVS(); + return this->BVS(this->_getImmediateData()); case 0x71: return this->TCALL(7); case 0x72: return this->CLR1(this->_getDirectAddr(), 3); case 0x73: - return this->BBC(this->_getDirectAddr(), 3); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 3); case 0x74: return this->CMPreg(this->_internalRegisters.a, this->_getDirectAddrByX(), 4); case 0x75: @@ -448,7 +448,7 @@ namespace ComSquare::APU case 0x82: return this->SET1(this->_getDirectAddr(), 4); case 0x83: - return this->BBS(this->_getDirectAddr(), 4); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 4); case 0x84: return this->ADCacc(this->_getDirectAddr(), 3); case 0x85: @@ -474,13 +474,13 @@ namespace ComSquare::APU case 0x8F: return this->MOV(this->_getImmediateData(), this->_getDirectAddr()); case 0x90: - return this->BCC(); + return this->BCC(this->_getImmediateData()); case 0x91: return this->TCALL(9); case 0x92: return this->CLR1(this->_getDirectAddr(), 4); case 0x93: - return this->BBC(this->_getDirectAddr(), 4); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 4); case 0x94: return this->ADCacc(this->_getDirectAddrByX(), 4); case 0x95: @@ -512,7 +512,7 @@ namespace ComSquare::APU case 0xA2: return this->SET1(this->_getDirectAddr(), 5); case 0xA3: - return this->BBS(this->_getDirectAddr(), 5); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 5); case 0xA4: return this->SBCacc(this->_getDirectAddr(), 3); case 0xA5: @@ -538,13 +538,13 @@ namespace ComSquare::APU case 0xAF: return this->MOV(this->_internalRegisters.a, this->_getIndexXAddr(), 4, true); case 0xB0: - return this->BCS(); + return this->BCS(this->_getImmediateData()); case 0xB1: return this->TCALL(11); case 0xB2: return this->CLR1(this->_getDirectAddr(), 5); case 0xB3: - return this->BBC(this->_getDirectAddr(), 5); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 5); case 0xB4: return this->SBCacc(this->_getDirectAddrByX(), 4); case 0xB5: @@ -576,7 +576,7 @@ namespace ComSquare::APU case 0xC2: return this->SET1(this->_getDirectAddr(), 6); case 0xC3: - return this->BBS(this->_getDirectAddr(), 6); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 6); case 0xC4: return this->MOV(this->_internalRegisters.a, this->_getDirectAddr(), 4); case 0xC5: @@ -602,13 +602,13 @@ namespace ComSquare::APU case 0xCF: return this->MUL(); case 0xD0: - return this->BNE(); + return this->BNE(this->_getImmediateData()); case 0xD1: return this->TCALL(13); case 0xD2: return this->CLR1(this->_getDirectAddr(), 6); case 0xD3: - return this->BBC(this->_getDirectAddr(), 6); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 6); case 0xD4: return this->MOV(this->_internalRegisters.a, this->_getDirectAddrByX(), 5); case 0xD5: @@ -630,7 +630,7 @@ namespace ComSquare::APU case 0xDD: return this->MOV(this->_internalRegisters.y, this->_internalRegisters.a); case 0xDE: - return this->CBNE(this->_getDirectAddrByX(), true); + return this->CBNE(this->_getDirectAddrByX(), this->_getImmediateData(), true); case 0xDF: return this->DAA(); case 0xE0: @@ -640,7 +640,7 @@ namespace ComSquare::APU case 0xE2: return this->SET1(this->_getDirectAddr(), 7); case 0xE3: - return this->BBS(this->_getDirectAddr(), 7); + return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 7); case 0xE4: return this->MOV(this->_getDirectAddr(), this->_internalRegisters.a, 3); case 0xE5: @@ -666,13 +666,13 @@ namespace ComSquare::APU case 0xEF: return this->SLEEP(); case 0xF0: - return BEQ(); + return BEQ(this->_getImmediateData()); case 0xF1: return this->TCALL(15); case 0xF2: return this->CLR1(this->_getDirectAddr(), 7); case 0xF3: - return this->BBC(this->_getDirectAddr(), 7); + return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 7); case 0xF4: return this->MOV(this->_getDirectAddrByX(), this->_internalRegisters.a, 4); case 0xF5: @@ -694,7 +694,7 @@ namespace ComSquare::APU case 0xFD: return this->MOV(this->_internalRegisters.a, this->_internalRegisters.y); case 0xFE: - return this->DBNZ(); + return this->DBNZ(this->_getImmediateData()); case 0xFF: return this->STOP(); default: diff --git a/sources/APU/APU.hpp b/sources/APU/APU.hpp index 5dbc43f..b692c6e 100644 --- a/sources/APU/APU.hpp +++ b/sources/APU/APU.hpp @@ -264,31 +264,31 @@ namespace ComSquare::APU int RETI(); //! @brief Branch Always, go to the specified location from the next instruction. - int BRA(); + int BRA(int8_t offset); //! @brief Branch if Zero Flag is set. - int BEQ(); + int BEQ(int8_t offset); //! @brief Branch if Zero Flag is clear. - int BNE(); + int BNE(int8_t offset); //! @brief Branch if Carry Flag is set. - int BCS(); + int BCS(int8_t offset); //! @brief Branch if Carry Flag is clear. - int BCC(); + int BCC(int8_t offset); //! @brief Branch if Overflow Flag is set. - int BVS(); + int BVS(int8_t offset); //! @brief Branch if Overflow Flag is set. - int BVC(); + int BVC(int8_t offset); //! @brief Branch if Negative Flag is set. - int BMI(); + int BMI(int8_t offset); //! @brief Branch if Negative Flag is clear. - int BPL(); + int BPL(int8_t offset); //! @brief Branch if the specified is set in the address, go to the specified location from the next instruction. - int BBS(uint24_t addr, uint8_t bit); + int BBS(uint24_t addr, uint8_t bit, int8_t offset); //! @brief Branch if the specified is clear in the address, go to the specified location from the next instruction. - int BBC(uint24_t addr, uint8_t bit); + int BBC(uint24_t addr, uint8_t bit, int8_t offset); //! @brief Branch if the value at the specified address is not equal to the Accumulator Flag. - int CBNE(uint24_t addr, bool by_x = false); + int CBNE(uint24_t addr, int8_t offset, bool by_x = false); //! @brief Decrement a value then branch to the specified location if the value is not zero. - int DBNZ(bool direct_addr = false); + int DBNZ(int8_t offset, bool direct_addr = false); //! @brief Jump to the specified location. int JMP(uint24_t addr, bool by_x = false); @@ -363,9 +363,9 @@ namespace ComSquare::APU int CMPreg(uint8_t ®, uint24_t addr, int cycles); int MOV(uint8_t ®From, uint8_t ®To, bool setFlags = true); - int MOV(uint24_t memFrom, uint24_t memTo); int MOV(uint8_t ®From, uint24_t memTo, int cycles, bool incrementX = false); int MOV(uint24_t memFrom, uint8_t ®To, int cycles, bool incrementX = false); + int MOV(uint24_t memTo, uint24_t memFrom); public: explicit APU(std::shared_ptr &map); APU(const APU &) = default; diff --git a/sources/APU/Instructions/8bitDataTransmission.cpp b/sources/APU/Instructions/8bitDataTransmission.cpp index f75e83d..7e08122 100644 --- a/sources/APU/Instructions/8bitDataTransmission.cpp +++ b/sources/APU/Instructions/8bitDataTransmission.cpp @@ -32,9 +32,9 @@ namespace ComSquare::APU return 2; } - int APU::MOV(uint24_t memFrom, uint24_t memTo) + int APU::MOV(uint24_t memTo, uint24_t memFrom) { - this->_internalWrite(memTo, this->_internalRead(memFrom)); + this->_internalWrite(memTo, memFrom); return 5; } } \ No newline at end of file diff --git a/sources/APU/Instructions/ProgramFlow.cpp b/sources/APU/Instructions/ProgramFlow.cpp index e8b6f39..f22bde2 100644 --- a/sources/APU/Instructions/ProgramFlow.cpp +++ b/sources/APU/Instructions/ProgramFlow.cpp @@ -6,109 +6,107 @@ namespace ComSquare::APU { - int APU::BRA() + int APU::BRA(int8_t offset) { - int8_t offset = this->_getImmediateData(); - this->_internalRegisters.pc += offset; return 4; } - int APU::BEQ() + int APU::BEQ(int8_t offset) { if (!this->_internalRegisters.z) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BNE() + int APU::BNE(int8_t offset) { if (this->_internalRegisters.z) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BCS() + int APU::BCS(int8_t offset) { if (!this->_internalRegisters.c) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BCC() + int APU::BCC(int8_t offset) { if (this->_internalRegisters.c) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BVS() + int APU::BVS(int8_t offset) { if (!this->_internalRegisters.v) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BVC() + int APU::BVC(int8_t offset) { if (this->_internalRegisters.v) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BMI() + int APU::BMI(int8_t offset) { if (!this->_internalRegisters.n) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BPL() + int APU::BPL(int8_t offset) { if (this->_internalRegisters.n) return 2; - this->BRA(); + this->BRA(offset); return 4; } - int APU::BBS(uint24_t addr, uint8_t bit) + int APU::BBS(uint24_t addr, uint8_t bit, int8_t offset) { uint8_t data = this->_internalRead(addr); if (!(data & (1u << bit))) return 5; - this->BRA(); + this->BRA(offset); return 7; } - int APU::BBC(uint24_t addr, uint8_t bit) + int APU::BBC(uint24_t addr, uint8_t bit, int8_t offset) { uint8_t data = this->_internalRead(addr); if (data & (1u << bit)) return 5; - this->BRA(); + this->BRA(offset); return 7; } - int APU::CBNE(uint24_t addr, bool by_x) + int APU::CBNE(uint24_t addr, int8_t offset, bool by_x) { uint8_t data = this->_internalRead(addr); if (this->_internalRegisters.a == data) return 5 + by_x; - this->BRA(); + this->BRA(offset); return 7 + by_x; } - int APU::DBNZ(bool direct_addr) + int APU::DBNZ(int8_t offset, bool direct_addr) { uint8_t data; @@ -122,7 +120,7 @@ namespace ComSquare::APU data = --this->_internalRegisters.y; if (!data) return 4 + direct_addr; - this->BRA(); + this->BRA(offset); return 6 + direct_addr; } diff --git a/sources/Debugger/APUDebug.cpp b/sources/Debugger/APUDebug.cpp index d0521a3..21bcdfa 100644 --- a/sources/Debugger/APUDebug.cpp +++ b/sources/Debugger/APUDebug.cpp @@ -35,11 +35,11 @@ namespace ComSquare::Debugger this->_ui.port1hexaLineEdit->setText(Utility::to_hex(this->_registers.port1).c_str()); this->_ui.port1LineEdit->setText(Utility::to_binary(this->_registers.port1).c_str()); - this->_ui.port2hexaLineEdit->setText(Utility::to_hex(this->_registers.port1).c_str()); - this->_ui.port2LineEdit->setText(Utility::to_binary(this->_registers.port1).c_str()); + this->_ui.port2hexaLineEdit->setText(Utility::to_hex(this->_registers.port2).c_str()); + this->_ui.port2LineEdit->setText(Utility::to_binary(this->_registers.port2).c_str()); - this->_ui.port3hexaLineEdit->setText(Utility::to_hex(this->_registers.port1).c_str()); - this->_ui.port3LineEdit->setText(Utility::to_binary(this->_registers.port1).c_str()); + this->_ui.port3hexaLineEdit->setText(Utility::to_hex(this->_registers.port2).c_str()); + this->_ui.port3LineEdit->setText(Utility::to_binary(this->_registers.port2).c_str()); this->_ui.controlhexaLineEdit->setText(Utility::to_hex(this->_registers.ctrlreg).c_str()); this->_ui.controlLineEdit->setText(Utility::to_binary(this->_registers.ctrlreg).c_str()); @@ -475,6 +475,8 @@ namespace ComSquare::Debugger int APUDebug::_executeInstruction() { + int cycles = 0; + if (this->_isPaused) return 0xFF; if (this->_isStepping) { @@ -482,8 +484,9 @@ namespace ComSquare::Debugger this->_isPaused = true; } this->_ui.logger->append(APUDebug::_getInstructionString().c_str()); + cycles = APU::_executeInstruction(); this->_updatePanel(); - return APU::_executeInstruction(); + return cycles; } void APUDebug::update(unsigned cycles)