From 483917f105857e85af8c6959b8ee533fc6561bc2 Mon Sep 17 00:00:00 2001 From: Martin Perner Date: Thu, 13 Jan 2011 17:46:10 +0100 Subject: [PATCH] sim: brr fix, interrupt --- 3b_sim/ccpu.cpp | 12 +++++++++++- 3b_sim/ccpu.hpp | 5 ++++- 3b_sim/sim.cpp | 10 +++++++++- 3c_disasm/instr/branchreg.cpp | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/3b_sim/ccpu.cpp b/3b_sim/ccpu.cpp index 3c0049b..06461d6 100644 --- a/3b_sim/ccpu.cpp +++ b/3b_sim/ccpu.cpp @@ -40,6 +40,16 @@ void CCpu::applyToExtensions(const vector& in) } } +void CCpu::breakNext() +{ + m_breakNext = true; +} + +bool CCpu::shouldBreak() +{ + return m_breakNext; +} + void CCpu::tick() { // signal extensions @@ -273,7 +283,7 @@ void CCpu::incPerfBy(short inc) } -CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_exts(0), m_stack(0) +CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_breakNext(0), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_exts(0), m_stack(0) { } diff --git a/3b_sim/ccpu.hpp b/3b_sim/ccpu.hpp index fb9447d..17f90b1 100644 --- a/3b_sim/ccpu.hpp +++ b/3b_sim/ccpu.hpp @@ -18,7 +18,7 @@ class Iext; class CCpu { private: - bool m_Z, m_S, m_C, m_O; + bool m_Z, m_S, m_C, m_O, m_breakNext; CDat m_pc, m_pc_next, m_perf; CMem m_reg, m_ram; @@ -35,6 +35,9 @@ class CCpu { void applyToExtensions(const vector& in); void tick(); + void breakNext(); + bool shouldBreak(); + CDat getRegister(const int) const; void setRegister(const int, CDat); diff --git a/3b_sim/sim.cpp b/3b_sim/sim.cpp index 09808a0..d93e11e 100644 --- a/3b_sim/sim.cpp +++ b/3b_sim/sim.cpp @@ -21,6 +21,8 @@ #include "extensions/cprog.hpp" #include "extensions/cuart.hpp" +#include + #include "SReadline/SReadline.h" using namespace swift; @@ -90,6 +92,11 @@ bool ignoreBreak = false; bool exitProg = false; +void signalCpuBreak(int) +{ + global_cpu->breakNext(); +} + void doExit(const vector&) { exitProg = true; @@ -142,7 +149,7 @@ void execRun(const vector&) while(1) { try { auto breakp = find(breakpoints.begin(), breakpoints.end(), global_cpu->getNextPC()); - if(breakp == breakpoints.end() || ignoreBreak) { + if((breakp == breakpoints.end() || ignoreBreak) && !global_cpu->shouldBreak() ) { global_cpu->tick(); ignoreBreak = false; } @@ -547,6 +554,7 @@ int main(int argc, char* argv[]) global_cpu = &cpu; + signal(SIGINT, signalCpuBreak); Iinstr::setCPU(&cpu); Iext::setCPU(&cpu); diff --git a/3c_disasm/instr/branchreg.cpp b/3c_disasm/instr/branchreg.cpp index 2bd9235..1fbedbf 100644 --- a/3c_disasm/instr/branchreg.cpp +++ b/3c_disasm/instr/branchreg.cpp @@ -71,6 +71,7 @@ void Cbranchreg::execInstr() { //cout << "should exec " << this->toString() << endl; CDat pc = this->m_cpu->getRegister(this->m_rd); + pc *= 4; //komisch fix? if(this->m_typ == 1) { CDat sp = this->m_cpu->getStack(); -- 2.25.1