#ifndef JUMPLINEMANAGER_H #define JUMPLINEMANAGER_H #include #include #include #include #include "util.h" typedef QPair TJump; typedef enum { IsUnknownJump, IsJMP, IsBranch, IsJSR, IsBRA } JumpType; typedef QMap JumpMap; class JumpLine { public: JumpLine() : from(0), to(0), channel(-1), type(IsUnknownJump) { } quint16 from; quint16 to; int channel; JumpType type; inline quint16 min() const { return qMin(from,to); } inline quint16 max() const { return qMax(from,to); } inline bool isUp() const { return (from > to); } inline bool isDown() const { return !isUp(); } }; ////////////////// class JumpLines { public: JumpLines() : m_maxChannel(0) { } QList channelsAtAddress(quint16 address) { return m_channelsAtAddress[address]; } QList jumpLinesAtAddress(quint16 addrs); QList jumpLines; int m_maxChannel; QMap > m_channelsAtAddress; }; ////////////////// class JumpLineManager { public: JumpLineManager(quint16 from = 0x0000, quint16 to = 0xffff); void addJump(quint16 src, quint16 dest, JumpType type,quint16 from = 0, quint16 to = 0xffff); void dumpJumps() const; JumpLines buildJumpLines(); JumpLines getJumpLines() const { return m_jumplines; } void clear() { m_jumpmap.clear(); } void dumpJumpLines() const; int getNumJumpLineChannels() const { return m_jumplines.m_maxChannel; } protected: int findBestChannel(JumpLine &jl); void setChannelForJumpLine(int channel, JumpLine &jl); private: quint16 m_start; quint16 m_end; JumpMap m_jumpmap; JumpLines m_jumplines; QMap> m_channelsAtAddress; bool doJumpsIntersect(TJump &A, TJump &B) const; bool isLineWithinRange(quint16 line, TJump &jm) const; void dumpJumps(JumpMap map) const; }; #endif // JUMPLINEMANAGER_H