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_plugin_registrant.cc
story-player/linux/flutter/generated_plugins.cmake 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
story-player-raylib/build-web/compile_commands.json
story-player-raylib/build-web/CPackConfig.cmake story-vm/build
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/bin/story-player.data story-player-raylib/bin/story-player.data
story-player-raylib/bin/story-player.js story-player-raylib/bin/story-player.js
story-player-raylib/bin/story-player.wasm 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", "name": "Black Magic Probe",

View file

@ -3,7 +3,8 @@
"cmake.sourceDirectory": [ "cmake.sourceDirectory": [
"${workspaceFolder}/story-editor", "${workspaceFolder}/story-editor",
"${workspaceFolder}/story-player-raylib", "${workspaceFolder}/story-player-raylib",
"${workspaceFolder}/software" "${workspaceFolder}/software",
"${workspaceFolder}/core/chip32/tests"
], ],
"files.associations": { "files.associations": {
"*.css": "tailwindcss", "*.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: Directories:
- interfaces: contains only pure virtual C++ interface classes - interfaces: contains only pure virtual C++ interface classes
@ -8,3 +8,10 @@ Directories:
- src: core implementation (private files) - 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); result = chip32_step(ctx);
if (result > VM_OK) if ((result > VM_OK) || (result == VM_FINISHED))
{ {
break; break;
} }

View file

@ -5,8 +5,15 @@ project(chip32_test LANGUAGES CXX C)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) 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) add_executable(chip32_test
target_include_directories(chip32_test PRIVATE ../../chip32 ../) main.cpp
test_parser.cpp
test_vm.cpp
../chip32_assembler.cpp
../chip32_vm.c
)
target_include_directories(chip32_test PRIVATE ../)
install(TARGETS chip32_test install(TARGETS chip32_test
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) 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 ; We create a stupid loop just for RAM variable testing
lcons r0, 4 ; prepare loop: 4 iterations 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 lcons r1, 1
.loop: .loop:
load r0, $RamData1 ; load this variable load r0, @r2, 4 ; load this variable
sub r0, r1 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 skipz r0 ; skip loop if R0 == 0
jump .loop 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" ) { TEST_CASE( "Check various indentations and typos" ) {
std::vector<uint8_t> program; std::vector<uint8_t> program;
Chip32Assembler assembler; Chip32::Assembler assembler;
AssemblyResult result; Chip32::Result result;
uint8_t data[8*1024]; 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); REQUIRE( assembler.BuildBinary(program, result) == true);
result.Print(); result.Print();
hexdump(program.data(), program.size()); hexdump(program.data(), program.size());
// --------- EXECUTE BINARY --------- static chip32_ctx_t chip32_ctx;
virtual_mem_t rom = {
.mem = program.data(),
.size = 8*1024,
.addr = 0
};
virtual_mem_t ram = {
.mem = data,
.size = sizeof(data),
.addr = 40 *1024
};
chip32_initialize(&rom, &ram, 256); chip32_ctx.stack_size = 512;
chip32_result_t runResult = chip32_run(program.size(), 1000);
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 ); REQUIRE( runResult == VM_FINISHED );
} }

View file

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

View file

@ -5,22 +5,40 @@
#include <sstream> #include <sstream>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <gui.h>
#include "imgui.h" #include "imgui.h"
void CodeEditor::TextViewDraw() 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 tableFlags = ImGuiTableFlags_SizingFixedFit
| ImGuiTableFlags_BordersV
| ImGuiTableFlags_BordersOuterH
| ImGuiTableFlags_RowBg
| ImGuiTableFlags_ContextMenuInBody;
static ImGuiTableFlags flags1 = 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)); 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::string line;
std::istringstream is(m_text); 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)) while (std::getline(is, line))
{ {
ImGui::TableNextRow(); ImGui::TableNextRow();
@ -38,6 +56,7 @@ void CodeEditor::TextViewDraw()
{ {
m_breakpoints.insert(i); m_breakpoints.insert(i);
} }
m_storyManager.ToggleBreakpoint(i);
} }
if (m_breakpoints.contains(i)) { if (m_breakpoints.contains(i)) {
@ -46,16 +65,16 @@ void CodeEditor::TextViewDraw()
} }
ImGui::TableNextColumn(); ImGui::TableNextColumn();
if (m_highlights.count(i) > 0) if (m_currentLine == i)
{ {
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color);
} }
// Colonne des numéros de ligne // Colonne des numéros de ligne
ImGui::Text("%d", static_cast<int>(i + 1)); ImGui::Text("%d", static_cast<int>(i));
ImGui::TableNextColumn(); ImGui::TableNextColumn();
if (m_highlights.count(i) > 0) if (m_currentLine == i)
{ {
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color);
} }
@ -76,7 +95,7 @@ CodeEditor::CodeEditor(IStoryManager &project)
, m_storyManager(project) , m_storyManager(project)
{ {
// mEditor.SetReadOnly(false); // mEditor.SetReadOnly(false);
SetFlags(ImGuiWindowFlags_MenuBar); // SetFlags(ImGuiWindowFlags_MenuBar);
} }
void CodeEditor::Initialize() void CodeEditor::Initialize()
@ -139,85 +158,23 @@ void CodeEditor::Draw()
// auto cpos = mEditor.GetCursorPosition(); // auto cpos = mEditor.GetCursorPosition();
ImGui::SetWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver); 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::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::SmallButton("Toggle breakpoint")) {
// if (ImGui::MenuItem("Select all", nullptr, nullptr)) // if (m_breakPoints.contains(cpos.mLine + 1))
// mEditor.SetSelection(TextEditor::Coordinates(), TextEditor::Coordinates(mEditor.GetTotalLines(), 0)); // {
// m_breakPoints.erase(cpos.mLine + 1);
// }
// else
// {
// m_breakPoints.insert(cpos.mLine + 1);
// }
// mEditor.SetBreakpoints(m_breakPoints);
ImGui::EndMenu(); // m_storyManager.ToggleBreakpoint(cpos.mLine + 1);
}
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);
*/
}
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::SmallButton(ICON_MDI_SKIP_NEXT "##step_instruction")) { if (ImGui::SmallButton(ICON_MDI_SKIP_NEXT "##step_instruction")) {
m_storyManager.Step(); m_storyManager.Step();
@ -228,6 +185,11 @@ void CodeEditor::Draw()
m_storyManager.Run(); m_storyManager.Run();
} }
ImGui::SameLine();
if (ImGui::SmallButton(ICON_MDI_CONTENT_COPY "##copytocplipboard")) {
Gui::CopyToClipboard(m_text);
}
TextViewDraw(); TextViewDraw();
// mEditor.Render("TextEditor"); // mEditor.Render("TextEditor");

View file

@ -21,15 +21,17 @@ public:
void HighlightLine(int line) void HighlightLine(int line)
{ {
m_currentLine = line;
// mEditor.SetExecutionMarker(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: private:
IStoryManager &m_storyManager; IStoryManager &m_storyManager;
std::string m_text; std::string m_text;
std::unordered_set<int> m_breakpoints; 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 mEditor;
// TextEditor::Breakpoints m_breakPoints; // TextEditor::Breakpoints m_breakPoints;
// TextEditor::ErrorMarkers m_markers; // 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 // Simple helper function to load an image into a OpenGL texture with common settings
bool LoadTextureFromFile(const char* filename, Gui::Image &img) bool LoadTextureFromFile(const char* filename, Gui::Image &img)
{ {
@ -376,6 +377,14 @@ Gui::Gui()
static ImFont* normalFont; static ImFont* normalFont;
// static ImFont* bigFont; // static ImFont* bigFont;
void Gui::CopyToClipboard(const std::string &text)
{
SDL_SetClipboardText(text.c_str());
}
void Gui::PushBigFont() void Gui::PushBigFont()
{ {
// ImGui::PushFont(bigFont); // ImGui::PushFont(bigFont);

View file

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

View file

@ -174,15 +174,12 @@ void MainWindow::ProcessStory()
if (m_dbg.run_result == VM_FINISHED) if (m_dbg.run_result == VM_FINISHED)
return; return;
if (m_dbg.run_result == VM_READY) // Error states
return;
if (m_dbg.run_result > VM_OK) if (m_dbg.run_result > VM_OK)
return; return;
// 1. First, check events // Check events
if (m_dbg.run_result == VM_WAIT_EVENT)
{
VmEvent event; VmEvent event;
if (m_eventQueue.try_pop(event)) if (m_eventQueue.try_pop(event))
{ {
@ -196,7 +193,16 @@ void MainWindow::ProcessStory()
m_dbg.free_run = true; m_dbg.free_run = true;
m_dbg.run_result = VM_OK; m_dbg.run_result = VM_OK;
} }
else if (event.type == VmEventType::EvOkButton) 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)) if (m_dbg.IsValidEvent(EV_MASK_OK_BUTTON))
{ {
@ -236,10 +242,6 @@ void MainWindow::ProcessStory()
m_dbg.run_result = VM_OK; m_dbg.run_result = VM_OK;
} }
} }
else if (event.type == VmEventType::EvStop)
{
m_dbg.run_result = VM_FINISHED;
}
} }
} }