#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "gui.h" #include "console_window.h" #include "code_editor.h" #include "emulator_window.h" #include "resources_window.h" #include "node_editor_window.h" #include "properties_window.h" #include "chip32_assembler.h" #include "chip32_vm.h" #include "story_project.h" #include "i_story_manager.h" #include "thread_safe_queue.h" #include "audio_player.h" #include "library_manager.h" #include "library_window.h" struct DebugContext { uint32_t event_mask{0}; bool wait_event{0}; bool free_run{false}; int line{-1}; chip32_result_t run_result{VM_FINISHED}; std::set m_breakpoints; void Stop() { 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() || iter->isRomData) { std::cout << "-------------------" << std::endl; std::cout << "Instr: " << iter->mnemonic.c_str() << std::endl; std::cout << "Addr: " << std::hex << iter->addr << std::endl; std::cout << "Line: " << iter->line << std::endl; std::cout << "\t- Opcode: " << std::hex << iter->code.opcode << ", opcode args: " << iter->code.bytes << std::endl; int i = 1; for (auto arg : iter->compiledArgs) { std::cout << "\t- Arg " << i << " : " << std::hex << arg << std::endl; i++; } } } } }; class MainWindow : public IStoryManager, public IAudioEvent { public: MainWindow(); ~MainWindow(); void Initialize(); void Loop(); private: enum VmEventType { EvNoEvent, EvStep, EvOkButton, EvPreviousButton, EvNextButton, EvAudioFinished, EvStop}; std::shared_ptr m_story; // 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; std::string m_currentCode; std::vector m_recentProjects; ResourceManager m_resources; LibraryManager m_libraryManager; Gui m_gui; EmulatorWindow m_emulatorWindow; ConsoleWindow m_consoleWindow; CodeEditor m_editorWindow; char m_project_name[256] = ""; ResourcesWindow m_resourcesWindow; NodeEditorWindow m_nodeEditorWindow; PropertiesWindow m_PropertiesWindow; LibraryWindow m_libraryWindow; AudioPlayer m_player; struct VmEvent { VmEventType type; }; ThreadSafeQueue m_eventQueue; // From IStoryManager (proxy to StoryProject class) virtual void OpenProject(const std::string &uuid) override; virtual void ImportProject(const std::string &fileName, int format); virtual void Log(const std::string &txt, bool critical = false) override; virtual void PlaySoundFile(const std::string &fileName) override;; virtual std::string BuildFullAssetsPath(const std::string &fileName) const override; virtual std::pair Images() override; virtual std::pair Sounds() override; virtual void AddResource(std::shared_ptr res) override; virtual void ClearResources() override; virtual std::pair Resources() override; virtual void DeleteResource(FilterIterator &it) override; virtual void Build(bool compileonly) override; virtual std::list> GetNodeConnections(const std::string &nodeId) override; virtual std::string GetNodeEntryLabel(const std::string &nodeId) override; virtual void Play() override; virtual void Ok() override; virtual void Stop() override; virtual void Pause() override; virtual void Next() override; virtual void Previous() override; // From IAudioEvent virtual void EndOfAudio() override; void SaveParams(); void LoadParams(); void DrawMainMenuBar(); bool ShowQuitConfirm(); void NewProjectPopup(); void SaveProject(); void CloseProject(); void DrawStatusBar(); bool CompileToAssembler(); void ConvertResources(); void GenerateBinary(); void UpdateVmView(); uint8_t Syscall(chip32_ctx_t *ctx, uint8_t code); std::string GetFileNameFromMemory(uint32_t addr); void ProcessStory(); void StepInstruction(); void RefreshProjectInformation(); void ProjectPropertiesPopup(); }; #endif // MAINWINDOW_H