#ifndef MAIN_WINDOW_H #define MAIN_WINDOW_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using QtNodes::DataFlowGraphicsScene; using QtNodes::ConnectionStyle; using QtNodes::NodeRole; using QtNodes::StyleCollection; using QtNodes::DataFlowGraphModel; using QtNodes::NodeDelegateModelRegistry; #include "ui_ost-log.h" #include "story_project.h" #include "story_graph_model.h" #include "story_graph_scene.h" #include "chip32_assembler.h" #include "chip32_vm.h" #include "vm_dock.h" #include "resources_dock.h" #include "script_editor_dock.h" #include "memory_view_dock.h" #include "osthmi_dock.h" #include "nodeeditor_dock.h" #include "toolbar.h" struct DebugContext { uint32_t event_mask{0}; bool wait_event{0}; bool running{false}; int line{-1}; chip32_result_t run_result{VM_FINISHED}; static void DumpCodeAssembler(Chip32::Assembler & assembler) { for (std::vector::const_iterator iter = assembler.Begin(); iter != assembler.End(); ++iter) { if (iter->isRomCode()) { qDebug() << "-------------------"; qDebug() << "Instr: " << iter->mnemonic.c_str(); qDebug() << "Addr: " << Qt::hex << iter->addr; qDebug() << "Line: " << iter->line; qDebug() << "\t- Opcode: " << Qt::hex << iter->code.opcode << ", Args: " << iter->code.bytes; int i = 1; for (auto arg : iter->compiledArgs) { qDebug() << "\t- Arg " << i << " : " << Qt::hex << arg; i++; } } } } }; #include template struct Callback; template struct Callback { template static Ret callback(Args... args) { return func(args...); } static std::function func; }; template std::function Callback::func; class VmEvent : public QEvent { public: VmEvent(QEvent::Type type) : QEvent(type) {} static const QEvent::Type evStep = static_cast(QEvent::User + 1); static const QEvent::Type evOkButton = static_cast(QEvent::User + 2); uint8_t ev{0}; }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); private slots: void stepInstruction(); void closeEvent(QCloseEvent *event); private: StoryGraphModel m_model; StoryGraphScene m_scene; // Qt stuff ToolBar *m_toolbar{nullptr}; NodeEditorDock *m_nodeEditorDock{nullptr}; OstHmiDock *m_ostHmiDock{nullptr}; ResourcesDock *m_resourcesDock{nullptr}; ScriptEditorDock *m_scriptEditorDock{nullptr}; VmDock *m_vmDock{nullptr}; MemoryViewDock *m_ramView{nullptr}; MemoryViewDock *m_romView{nullptr}; // Story pure C++ classes StoryProject m_project; // VM uint8_t m_rom_data[16*1024]; uint8_t m_ram_data[16*1024]; chip32_ctx_t m_chip32_ctx; // Assembleur & Debugger std::vector m_program; Chip32::Assembler m_assembler; Chip32::Result m_result; DebugContext m_dbg; // Private functions void createActions(); void createStatusBar(); void save(); void DisplayNode(StoryNode *m_tree, QtNodes::NodeId parentId); void about(); void open(); void buildScript(); void highlightNextLine(); void readSettings(); void updateAll(); uint8_t Syscall(uint8_t code); QString GetFileName(uint32_t addr); bool event(QEvent *event); }; #endif // MAIN_WINDOW_H