fix unit tests for chip32, better debugger

This commit is contained in:
anthony@rabine.fr 2025-01-21 09:59:13 +01:00
parent 7973aa4709
commit 59114c2a80
47 changed files with 18168 additions and 314 deletions

168
.gitignore vendored
View file

@ -95,167 +95,13 @@ story-player-raylib/build/
story-player/linux/flutter/generated_plugin_registrant.cc
story-player/linux/flutter/generated_plugins.cmake
story-player-raylib/build-web/cmake_install.cmake
story-player-raylib/build-web/CMakeCache.txt
story-player-raylib/build-web/compile_commands.json
story-player-raylib/build-web/CPackConfig.cmake
story-player-raylib/build-web/CPackSourceConfig.cmake
story-player-raylib/build-web/cpm-package-lock.cmake
story-player-raylib/build-web/Makefile
story-player-raylib/build-web/CMakeFiles/cmake.check_cache
story-player-raylib/build-web/CMakeFiles/CMakeConfigureLog.yaml
story-player-raylib/build-web/CMakeFiles/CMakeDirectoryInformation.cmake
story-player-raylib/build-web/CMakeFiles/CMakeRuleHashes.txt
story-player-raylib/build-web/CMakeFiles/Makefile.cmake
story-player-raylib/build-web/CMakeFiles/Makefile2
story-player-raylib/build-web/CMakeFiles/progress.marks
story-player-raylib/build-web/CMakeFiles/TargetDirectories.txt
story-player-raylib/build-web/CMakeFiles/3.30.3/CMakeCCompiler.cmake
story-player-raylib/build-web/CMakeFiles/3.30.3/CMakeCXXCompiler.cmake
story-player-raylib/build-web/CMakeFiles/3.30.3/CMakeSystem.cmake
story-player-raylib/build-web/CMakeFiles/pkgRedirects/raylib-config.cmake
story-player-raylib/build-web/CMakeFiles/pkgRedirects/raylib-version.cmake
story-player-raylib/build-web/CMakeFiles/story-player.dir/build.make
story-player-raylib/build-web/CMakeFiles/story-player.dir/cmake_clean.cmake
story-player-raylib/build-web/CMakeFiles/story-player.dir/compiler_depend.internal
story-player-raylib/build-web/CMakeFiles/story-player.dir/compiler_depend.make
story-player-raylib/build-web/CMakeFiles/story-player.dir/compiler_depend.ts
story-player-raylib/build-web/CMakeFiles/story-player.dir/depend.make
story-player-raylib/build-web/CMakeFiles/story-player.dir/DependInfo.cmake
story-player-raylib/build-web/CMakeFiles/story-player.dir/flags.make
story-player-raylib/build-web/CMakeFiles/story-player.dir/includes_C.rsp
story-player-raylib/build-web/CMakeFiles/story-player.dir/includes_CXX.rsp
story-player-raylib/build-web/CMakeFiles/story-player.dir/link.txt
story-player-raylib/build-web/CMakeFiles/story-player.dir/linkLibs.rsp
story-player-raylib/build-web/CMakeFiles/story-player.dir/main.c.o
story-player-raylib/build-web/CMakeFiles/story-player.dir/main.c.o.d
story-player-raylib/build-web/CMakeFiles/story-player.dir/objects1.rsp
story-player-raylib/build-web/CMakeFiles/story-player.dir/progress.make
story-player-raylib/build-web/CMakeFiles/story-player.dir/mnt/work/git/open-story-teller/firmware/chip32/chip32_assembler.cpp.o
story-player-raylib/build-web/CMakeFiles/story-player.dir/mnt/work/git/open-story-teller/firmware/chip32/chip32_assembler.cpp.o.d
story-player-raylib/build-web/CMakeFiles/story-player.dir/mnt/work/git/open-story-teller/firmware/chip32/chip32_vm.c.o
story-player-raylib/build-web/CMakeFiles/story-player.dir/mnt/work/git/open-story-teller/firmware/chip32/chip32_vm.c.o.d
story-player-raylib/build-web/_deps/raylib-build/cmake_install.cmake
story-player-raylib/build-web/_deps/raylib-build/cmake_uninstall.cmake
story-player-raylib/build-web/_deps/raylib-build/CTestTestfile.cmake
story-player-raylib/build-web/_deps/raylib-build/Makefile
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/CMakeDirectoryInformation.cmake
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/progress.marks
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/uninstall.dir/build.make
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/uninstall.dir/cmake_clean.cmake
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/uninstall.dir/compiler_depend.make
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/uninstall.dir/compiler_depend.ts
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/uninstall.dir/DependInfo.cmake
story-player-raylib/build-web/_deps/raylib-build/CMakeFiles/uninstall.dir/progress.make
story-player-raylib/build-web/_deps/raylib-build/raylib/cmake_install.cmake
story-player-raylib/build-web/_deps/raylib-build/raylib/CTestTestfile.cmake
story-player-raylib/build-web/_deps/raylib-build/raylib/libraylib.a
story-player-raylib/build-web/_deps/raylib-build/raylib/Makefile
story-player-raylib/build-web/_deps/raylib-build/raylib/raylib-config-version.cmake
story-player-raylib/build-web/_deps/raylib-build/raylib/raylib.pc
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/CMakeDirectoryInformation.cmake
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/progress.marks
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/build.make
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/cmake_clean_target.cmake
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/cmake_clean.cmake
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/compiler_depend.internal
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/compiler_depend.make
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/compiler_depend.ts
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/depend.make
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/DependInfo.cmake
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/flags.make
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/includes_C.rsp
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/link.txt
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/progress.make
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/raudio.c.o
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/raudio.c.o.d
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rcore.c.o
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rcore.c.o.d
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rmodels.c.o
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rmodels.c.o.d
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rshapes.c.o
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rshapes.c.o.d
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rtext.c.o
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rtext.c.o.d
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rtextures.c.o
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/rtextures.c.o.d
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/utils.c.o
story-player-raylib/build-web/_deps/raylib-build/raylib/CMakeFiles/raylib.dir/utils.c.o.d
story-player-raylib/build-web/_deps/raylib-build/raylib/include/raylib.h
story-player-raylib/build-web/_deps/raylib-build/raylib/include/raymath.h
story-player-raylib/build-web/_deps/raylib-build/raylib/include/rlgl.h
story-player-raylib/build-web/_deps/raylib-subbuild/cmake_install.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeCache.txt
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeLists.txt
story-player-raylib/build-web/_deps/raylib-subbuild/Makefile
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/cmake.check_cache
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/CMakeConfigureLog.yaml
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/CMakeDirectoryInformation.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/CMakeRuleHashes.txt
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/Makefile.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/Makefile2
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/progress.marks
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate-complete
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/TargetDirectories.txt
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/3.30.3/CMakeSystem.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/build.make
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/cmake_clean.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/compiler_depend.make
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/compiler_depend.ts
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/DependInfo.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/Labels.json
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/Labels.txt
story-player-raylib/build-web/_deps/raylib-subbuild/CMakeFiles/raylib-populate.dir/progress.make
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/5.5.tar.gz
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/download-raylib-populate.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/extract-raylib-populate.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-build
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-configure
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-done
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-download
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-install
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-mkdir
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-patch
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-patch-info.txt
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-test
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-update
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-update-info.txt
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/raylib-populate-urlinfo.txt
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/src/raylib-populate-stamp/verify-raylib-populate.cmake
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/tmp/raylib-populate-cfgcmd.txt
story-player-raylib/build-web/_deps/raylib-subbuild/raylib-populate-prefix/tmp/raylib-populate-mkdirs.cmake
story-vm/build/cmake_install.cmake
story-vm/build/CMakeCache.txt
story-vm/build/libstoryvm.a
story-vm/build/Makefile
story-vm/build/CMakeFiles/cmake.check_cache
story-vm/build/CMakeFiles/CMakeConfigureLog.yaml
story-vm/build/CMakeFiles/CMakeDirectoryInformation.cmake
story-vm/build/CMakeFiles/Makefile.cmake
story-vm/build/CMakeFiles/Makefile2
story-vm/build/CMakeFiles/progress.marks
story-vm/build/CMakeFiles/TargetDirectories.txt
story-vm/build/CMakeFiles/3.30.3/CMakeCCompiler.cmake
story-vm/build/CMakeFiles/3.30.3/CMakeCXXCompiler.cmake
story-vm/build/CMakeFiles/3.30.3/CMakeSystem.cmake
story-vm/build/CMakeFiles/storyvm.dir/build.make
story-vm/build/CMakeFiles/storyvm.dir/cmake_clean_target.cmake
story-vm/build/CMakeFiles/storyvm.dir/cmake_clean.cmake
story-vm/build/CMakeFiles/storyvm.dir/compiler_depend.internal
story-vm/build/CMakeFiles/storyvm.dir/compiler_depend.make
story-vm/build/CMakeFiles/storyvm.dir/compiler_depend.ts
story-vm/build/CMakeFiles/storyvm.dir/depend.make
story-vm/build/CMakeFiles/storyvm.dir/DependInfo.cmake
story-vm/build/CMakeFiles/storyvm.dir/flags.make
story-vm/build/CMakeFiles/storyvm.dir/includes_C.rsp
story-vm/build/CMakeFiles/storyvm.dir/includes_CXX.rsp
story-vm/build/CMakeFiles/storyvm.dir/link.txt
story-vm/build/CMakeFiles/storyvm.dir/objects1.rsp
story-vm/build/CMakeFiles/storyvm.dir/progress.make
story-vm/build/CMakeFiles/storyvm.dir/storyvm.cpp.o
story-vm/build/CMakeFiles/storyvm.dir/storyvm.cpp.o.d
story-vm/build/CMakeFiles/storyvm.dir/mnt/work/git/open-story-teller/firmware/chip32/chip32_vm.c.o
story-vm/build/CMakeFiles/storyvm.dir/mnt/work/git/open-story-teller/firmware/chip32/chip32_vm.c.o.d
story-player-raylib/build-web
story-vm/build
story-player-raylib/bin/story-player.data
story-player-raylib/bin/story-player.js
story-player-raylib/bin/story-player.wasm
core/chip32/tests/build

28
.vscode/launch.json vendored
View file

@ -67,6 +67,34 @@
}
]
},
{
"name": "Debug VM Tests",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/core/chip32/tests/build/chip32_test", // Remplacez par le chemin de votre exécutable
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/core/chip32/tests",
"environment": [],
"externalConsole": false,
"linux": {
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb"
},
"osx": {
"MIMode": "lldb",
"miDebuggerPath": "/Users/user936511/.vscode/extensions/ms-vscode.cpptools-1.18.5-darwin-arm64/debugAdapters/lldb-mi/bin/lldb-mi"
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "Black Magic Probe",

View file

@ -3,7 +3,8 @@
"cmake.sourceDirectory": [
"${workspaceFolder}/story-editor",
"${workspaceFolder}/story-player-raylib",
"${workspaceFolder}/software"
"${workspaceFolder}/software",
"${workspaceFolder}/core/chip32/tests"
],
"files.associations": {
"*.css": "tailwindcss",

View file

@ -1,6 +1,6 @@
# StoryTeller core files
# StoryTeller core components
GUI agnostic implementation of the editor engine.
Each component is organized as follow:
Directories:
- interfaces: contains only pure virtual C++ interface classes
@ -8,3 +8,10 @@ Directories:
- src: core implementation (private files)
# story-manager
GUI agnostic implementation of the editor engine.
# story-vm

View file

@ -115,7 +115,7 @@ chip32_result_t chip32_run(chip32_ctx_t *ctx)
{
result = chip32_step(ctx);
if (result > VM_OK)
if ((result > VM_OK) || (result == VM_FINISHED))
{
break;
}

View file

@ -5,8 +5,15 @@ project(chip32_test LANGUAGES CXX C)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(chip32_test main.cpp test_parser.cpp test_vm.cpp ../../chip32/chip32_assembler.cpp ../../chip32/chip32.cpp)
target_include_directories(chip32_test PRIVATE ../../chip32 ../)
add_executable(chip32_test
main.cpp
test_parser.cpp
test_vm.cpp
../chip32_assembler.cpp
../chip32_vm.c
)
target_include_directories(chip32_test PRIVATE ../)
install(TARGETS chip32_test
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

17966
core/chip32/tests/catch.hpp Normal file

File diff suppressed because it is too large Load diff

View file

@ -48,12 +48,13 @@ $MyArray DV8 10 ; array of 10 bytes
; We create a stupid loop just for RAM variable testing
lcons r0, 4 ; prepare loop: 4 iterations
store $RamData1, r0 ; save R0 in RAM
lcons r2, $RamData1 ; save in R2 a ram address
store @r2, r0, 4 ; save R0 in RAM
lcons r1, 1
.loop:
load r0, $RamData1 ; load this variable
load r0, @r2, 4 ; load this variable
sub r0, r1
store $RamData1, r0 ; save R0 in RAM
store @r2, r0, 4 ; save R0 in RAM
skipz r0 ; skip loop if R0 == 0
jump .loop
@ -65,32 +66,45 @@ mov R0,R2 ; copy R2 into R0 (NO blank space between , and R2)
)";
static uint8_t story_player_syscall(chip32_ctx_t *ctx, uint8_t code)
{
uint8_t retCode = SYSCALL_RET_OK;
return retCode;
}
TEST_CASE( "Check various indentations and typos" ) {
std::vector<uint8_t> program;
Chip32Assembler assembler;
AssemblyResult result;
Chip32::Assembler assembler;
Chip32::Result result;
uint8_t data[8*1024];
REQUIRE( assembler.Parse(test1) == true );
bool parseResult = assembler.Parse(test1);
std::cout << assembler.GetLastError().ToString();
REQUIRE( parseResult == true );
REQUIRE( assembler.BuildBinary(program, result) == true);
result.Print();
hexdump(program.data(), program.size());
// --------- EXECUTE BINARY ---------
virtual_mem_t rom = {
.mem = program.data(),
.size = 8*1024,
.addr = 0
};
virtual_mem_t ram = {
.mem = data,
.size = sizeof(data),
.addr = 40 *1024
};
static chip32_ctx_t chip32_ctx;
chip32_initialize(&rom, &ram, 256);
chip32_result_t runResult = chip32_run(program.size(), 1000);
chip32_ctx.stack_size = 512;
chip32_ctx.rom.mem = program.data();
chip32_ctx.rom.addr = 0;
chip32_ctx.rom.size = program.size();
chip32_ctx.ram.mem = data;
chip32_ctx.ram.addr = 40 *1024,
chip32_ctx.ram.size = sizeof(data);
chip32_ctx.syscall = story_player_syscall;
chip32_initialize(&chip32_ctx);
chip32_result_t runResult = chip32_run(&chip32_ctx);
REQUIRE( runResult == VM_FINISHED );
}

View file

@ -25,7 +25,7 @@ THE SOFTWARE.
#include <iostream>
#include "catch.hpp"
#include "chip32_assembler.h"
#include "chip32.h"
#include "chip32_vm.h"
/*
Purpose: test all opcodes
@ -33,6 +33,14 @@ Purpose: test all opcodes
void hexdump(void *ptr, int buflen);
static uint8_t story_player_syscall(chip32_ctx_t *ctx, uint8_t code)
{
uint8_t retCode = SYSCALL_RET_OK;
return retCode;
}
class VmTestContext
{
public:
@ -47,27 +55,28 @@ public:
REQUIRE( assembler.BuildBinary(program, result) == true );
result.Print();
// --------- EXECUTE BINARY ---------
virtual_mem_t rom = {
.mem = program.data(),
.size = 8*1024,
.addr = 18 * 1024
};
virtual_mem_t ram = {
.mem = data,
.size = sizeof(data),
.addr = 56*1024
};
chip32_ctx.stack_size = 512;
chip32_initialize(&rom, &ram, 256);
chip32_result_t runResult = chip32_run(program.size(), 1000);
chip32_ctx.rom.mem = program.data();
chip32_ctx.rom.addr = 18*1024;
chip32_ctx.rom.size = program.size();
chip32_ctx.ram.mem = data;
chip32_ctx.ram.addr = 56 *1024,
chip32_ctx.ram.size = sizeof(data);
chip32_ctx.syscall = story_player_syscall;
chip32_initialize(&chip32_ctx);
chip32_result_t runResult = chip32_run(&chip32_ctx);
REQUIRE( runResult == VM_FINISHED );
}
uint8_t data[8*1024];
std::vector<uint8_t> program;
Chip32Assembler assembler;
AssemblyResult result;
Chip32::Assembler assembler;
Chip32::Result result;
chip32_ctx_t chip32_ctx;
};
@ -80,7 +89,7 @@ TEST_CASE_METHOD(VmTestContext, "MUL", "[vm]") {
)";
Execute(test1);
uint32_t result = chip32_get_register(R0);
uint32_t result = chip32_ctx.registers[R0];
REQUIRE (result == 37 * 0x695);
}
@ -93,6 +102,6 @@ TEST_CASE_METHOD(VmTestContext, "DIV", "[vm]") {
)";
Execute(test1);
uint32_t result = chip32_get_register(R0);
uint32_t result = chip32_ctx.registers[R0];
REQUIRE (result == (int)(37/8));
}

View file

@ -5,22 +5,40 @@
#include <sstream>
#include <iostream>
#include <string>
#include <gui.h>
#include "imgui.h"
void CodeEditor::TextViewDraw()
{
const ImVec2 childSize = ImVec2(0, 0);
// Début de la scrollview (Child)
ImGui::BeginChild("Table ScrollView", childSize, true, ImGuiWindowFlags_AlwaysVerticalScrollbar);
ImGui::BeginChild("TextView", ImVec2(0, 0), true, ImGuiWindowFlags_HorizontalScrollbar);
static ImGuiTableFlags flags1 = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody;
static ImGuiTableFlags tableFlags = ImGuiTableFlags_SizingFixedFit
| ImGuiTableFlags_BordersV
| ImGuiTableFlags_BordersOuterH
| ImGuiTableFlags_RowBg
| ImGuiTableFlags_ContextMenuInBody;
static ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.3f, 0.7f, 0.65f));
if (ImGui::BeginTable("AssemblyCode", 3, flags1))
// Hauteur de chaque ligne
float lineHeight = ImGui::GetTextLineHeightWithSpacing(); // Hauteur d'une ligne avec l'espacement
if (ImGui::BeginTable("AssemblyCode", 3, tableFlags))
{
int i = 0;
int i = 1;
std::string line;
std::istringstream is(m_text);
// Calcul de la position Y pour centrer la ligne cible
float scrollY = m_currentLine * lineHeight - ImGui::GetWindowHeight() * 0.5f + lineHeight * 0.5f;
// Début de la scrollview
ImGui::SetScrollY(scrollY);
while (std::getline(is, line))
{
ImGui::TableNextRow();
@ -38,6 +56,7 @@ void CodeEditor::TextViewDraw()
{
m_breakpoints.insert(i);
}
m_storyManager.ToggleBreakpoint(i);
}
if (m_breakpoints.contains(i)) {
@ -46,16 +65,16 @@ void CodeEditor::TextViewDraw()
}
ImGui::TableNextColumn();
if (m_highlights.count(i) > 0)
if (m_currentLine == i)
{
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color);
}
// Colonne des numéros de ligne
ImGui::Text("%d", static_cast<int>(i + 1));
ImGui::Text("%d", static_cast<int>(i));
ImGui::TableNextColumn();
if (m_highlights.count(i) > 0)
if (m_currentLine == i)
{
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color);
}
@ -67,7 +86,7 @@ void CodeEditor::TextViewDraw()
ImGui::EndTable();
}
ImGui::EndChild();
ImGui::EndChild();
}
@ -76,7 +95,7 @@ CodeEditor::CodeEditor(IStoryManager &project)
, m_storyManager(project)
{
// mEditor.SetReadOnly(false);
SetFlags(ImGuiWindowFlags_MenuBar);
// SetFlags(ImGuiWindowFlags_MenuBar);
}
void CodeEditor::Initialize()
@ -139,85 +158,23 @@ void CodeEditor::Draw()
// auto cpos = mEditor.GetCursorPosition();
ImGui::SetWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver);
/*
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("File"))
{
if (ImGui::MenuItem("Save"))
{
// auto textToSave = mEditor.GetText();
/// save text....
}
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Edit"))
{
// bool ro = mEditor.IsReadOnly();
// if (ImGui::MenuItem("Read-only mode", nullptr, &ro))
// mEditor.SetReadOnly(ro);
ImGui::Separator();
if (ImGui::MenuItem("Undo", "ALT-Backspace", nullptr, !ro && mEditor.CanUndo()))
mEditor.Undo();
if (ImGui::MenuItem("Redo", "Ctrl-Y", nullptr, !ro && mEditor.CanRedo()))
mEditor.Redo();
ImGui::Separator();
// if (ImGui::SmallButton("Toggle breakpoint")) {
// if (m_breakPoints.contains(cpos.mLine + 1))
// {
// m_breakPoints.erase(cpos.mLine + 1);
// }
// else
// {
// m_breakPoints.insert(cpos.mLine + 1);
// }
// mEditor.SetBreakpoints(m_breakPoints);
if (ImGui::MenuItem("Copy", "Ctrl-C", nullptr, mEditor.HasSelection()))
mEditor.Copy();
if (ImGui::MenuItem("Cut", "Ctrl-X", nullptr, !ro && mEditor.HasSelection()))
mEditor.Cut();
if (ImGui::MenuItem("Delete", "Del", nullptr, !ro && mEditor.HasSelection()))
mEditor.Delete();
if (ImGui::MenuItem("Paste", "Ctrl-V", nullptr, !ro && ImGui::GetClipboardText() != nullptr))
mEditor.Paste();
ImGui::Separator();
// if (ImGui::MenuItem("Select all", nullptr, nullptr))
// mEditor.SetSelection(TextEditor::Coordinates(), TextEditor::Coordinates(mEditor.GetTotalLines(), 0));
ImGui::EndMenu();
}
if (ImGui::BeginMenu("View"))
{
if (ImGui::MenuItem("Dark palette"))
mEditor.SetPalette(TextEditor::GetDarkPalette());
if (ImGui::MenuItem("Light palette"))
mEditor.SetPalette(TextEditor::GetLightPalette());
if (ImGui::MenuItem("Retro blue palette"))
mEditor.SetPalette(TextEditor::GetRetroBluePalette());
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}
*/
// ImGui::Text("%6d/%-6d %6d lines | %s | %s ", cpos.mLine + 1, cpos.mColumn + 1, mEditor.GetTotalLines(),
// mEditor.IsOverwrite() ? "Ovr" : "Ins",
// mEditor.CanUndo() ? "*" : " ");
ImGui::SameLine();
if (ImGui::SmallButton("Toggle breakpoint")) {
/*
if (m_breakPoints.contains(cpos.mLine + 1))
{
m_breakPoints.erase(cpos.mLine + 1);
}
else
{
m_breakPoints.insert(cpos.mLine + 1);
}
mEditor.SetBreakpoints(m_breakPoints);
m_storyManager.ToggleBreakpoint(cpos.mLine + 1);
*/
}
// m_storyManager.ToggleBreakpoint(cpos.mLine + 1);
// }
ImGui::SameLine();
if (ImGui::SmallButton(ICON_MDI_SKIP_NEXT "##step_instruction")) {
m_storyManager.Step();
@ -228,6 +185,11 @@ void CodeEditor::Draw()
m_storyManager.Run();
}
ImGui::SameLine();
if (ImGui::SmallButton(ICON_MDI_CONTENT_COPY "##copytocplipboard")) {
Gui::CopyToClipboard(m_text);
}
TextViewDraw();
// mEditor.Render("TextEditor");

View file

@ -21,15 +21,17 @@ public:
void HighlightLine(int line)
{
m_currentLine = line;
// mEditor.SetExecutionMarker(line);
m_highlights[line] = ImVec4(0.5f, 0.5f, 1.0f, 0.5f);
// m_highlights[line] = ImVec4(0.5f, 0.5f, 1.0f, 0.5f);
}
private:
IStoryManager &m_storyManager;
std::string m_text;
std::unordered_set<int> m_breakpoints;
std::map<int, ImVec4> m_highlights;
// std::map<int, ImVec4> m_highlights;
int m_currentLine{-1};
// TextEditor mEditor;
// TextEditor::Breakpoints m_breakPoints;
// TextEditor::ErrorMarkers m_markers;

View file

@ -280,6 +280,7 @@ end:
}
// Simple helper function to load an image into a OpenGL texture with common settings
bool LoadTextureFromFile(const char* filename, Gui::Image &img)
{
@ -376,6 +377,14 @@ Gui::Gui()
static ImFont* normalFont;
// static ImFont* bigFont;
void Gui::CopyToClipboard(const std::string &text)
{
SDL_SetClipboardText(text.c_str());
}
void Gui::PushBigFont()
{
// ImGui::PushFont(bigFont);

View file

@ -49,6 +49,7 @@ public:
static void PushBigFont();
static void PopBigFont();
static void CopyToClipboard(const std::string &text);
private:
std::string m_executablePath;

View file

@ -174,29 +174,35 @@ void MainWindow::ProcessStory()
if (m_dbg.run_result == VM_FINISHED)
return;
if (m_dbg.run_result == VM_READY)
return;
// Error states
if (m_dbg.run_result > VM_OK)
return;
// 1. First, check events
if (m_dbg.run_result == VM_WAIT_EVENT)
// Check events
VmEvent event;
if (m_eventQueue.try_pop(event))
{
VmEvent event;
if (m_eventQueue.try_pop(event))
if (event.type == VmEventType::EvStep)
{
if (event.type == VmEventType::EvStep)
{
StepInstruction();
m_dbg.run_result = VM_OK; // FIXME: bizarre d'écraser le code de retour...
}
else if (event.type == VmEventType::EvRun)
{
m_dbg.free_run = true;
m_dbg.run_result = VM_OK;
}
else if (event.type == VmEventType::EvOkButton)
StepInstruction();
m_dbg.run_result = VM_OK; // FIXME: bizarre d'écraser le code de retour...
}
else if (event.type == VmEventType::EvRun)
{
m_dbg.free_run = true;
m_dbg.run_result = VM_OK;
}
else if (event.type == VmEventType::EvStop)
{
m_dbg.run_result = VM_FINISHED;
}
// Events managed only if the code is in wait event state
if (m_dbg.run_result == VM_WAIT_EVENT)
{
if (event.type == VmEventType::EvOkButton)
{
if (m_dbg.IsValidEvent(EV_MASK_OK_BUTTON))
{
@ -236,10 +242,6 @@ void MainWindow::ProcessStory()
m_dbg.run_result = VM_OK;
}
}
else if (event.type == VmEventType::EvStop)
{
m_dbg.run_result = VM_FINISHED;
}
}
}