OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
cpu32.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <cstddef>
5#include <vector>
6#include <functional>
7#include <string>
8
9#include "mem32instances.h"
10
11class DirectMemory;
12class Mem32;
13
14class Cpu32 {
15 public:
17
18 Cpu32(DirectMemory& owner, Mem32& mem32);
19
20 void exec(const ptr32_t basePc, const uint8_t* code, size_t len);
21
22 template<class R, class...Args>
23 void register_stdcall(ptr32_t addr, const std::function<R(Args...)>& callback) {
24 register_stdcall_inner(addr, [callback](Cpu32& cpu32) {
25 cpu32.callExternal<R,Args...>(callback);
26 });
27 }
28
29 template<class R, class...Args>
30 void register_thiscall(ptr32_t addr, const std::function<R(Args...)>& callback) {
31 register_stdcall_inner(addr, [callback](Cpu32& cpu32) {
32 cpu32.stack.push_back(cpu32.ecx);
33 cpu32.callExternal<R,Args...>(callback);
34 });
35 }
36
37 template<class R, class...Args>
38 void register_cdecl(ptr32_t addr, const std::function<R(Args...)>& callback) {
39 register_stdcall_inner(addr, [callback](Cpu32& cpu32) {
40 cpu32.callExternal<R,Args...>(callback);
41 });
42 }
43
44 template <typename T>
45 void register_stdcall(ptr32_t addr, const T& cb) {
46 register_stdcall(addr, std::function {cb});
47 }
48
49 template <typename T>
50 void register_thiscall(ptr32_t addr, const T& cb) {
51 register_thiscall(addr, std::function {cb});
52 }
53
54 template <typename T>
55 void register_cdecl(ptr32_t addr, const T& cb) {
56 register_cdecl(addr, std::function {cb});
57 }
58
59 private:
60 DirectMemory& owner;
61 Mem32& mem32;
62 std::vector<uint32_t> stack;
63 uint32_t eax = 0;
64 uint32_t ecx = 0;
65 uint32_t edx = 0;
66 uint32_t esp = 0;
67
68 std::unordered_map<ptr32_t, std::function<void(Cpu32&)>> stdcall_Overrides;
69
70 bool exec1Byte(const ptr32_t basePc, ptr32_t& pc, const uint8_t* code, size_t len);
71 bool exec2Byte(const ptr32_t basePc, ptr32_t& pc, const uint8_t* code, size_t len);
72 bool exec3Byte(const ptr32_t basePc, ptr32_t& pc, const uint8_t* code, size_t len);
73
74 uint8_t readUInt8 (const uint8_t* code, size_t offset, size_t len);
75 uint16_t readUInt16(const uint8_t* code, size_t offset, size_t len);
76 uint32_t readUInt24(const uint8_t* code, size_t offset, size_t len);
77 uint32_t readUInt32(const uint8_t* code, size_t offset, size_t len);
78
79 void register_stdcall_inner(ptr32_t addr, std::function<void(Cpu32&)> f);
80
81 void callFunction(ptr32_t addr);
82
83 template<class R, class...Args>
84 void callExternal(const std::function<R(Args...)>& callback) {
85 auto v = std::make_tuple(this->pop<Args>()...);
86 if constexpr(std::is_same<void,R>::value) {
87 std::apply(callback, std::move(v));
88 } else {
89 auto r = std::apply(callback, std::move(v));
90 this->eax = uint32_t(r);
91 }
92 }
93
94 template<class T>
95 T pop();
96
97 std::string popString();
98 };
99
100template<>
101inline int32_t Cpu32::pop<int>() {
102 if(stack.size()==0)
103 return 0;
104 auto ret = stack.back();
105 stack.pop_back();
106 return int32_t(ret);
107 }
108
109template<>
110inline Cpu32::ptr32_t Cpu32::pop<Cpu32::ptr32_t>() {
111 if(stack.size()==0)
112 return 0;
113 auto ret = stack.back();
114 stack.pop_back();
115 return Cpu32::ptr32_t(ret);
116 }
117
118template<>
119inline std::string Cpu32::pop<std::string>() {
120 return popString();
121 }
Definition cpu32.h:14
void exec(const ptr32_t basePc, const uint8_t *code, size_t len)
Definition cpu32.cpp:16
void register_cdecl(ptr32_t addr, const std::function< R(Args...)> &callback)
Definition cpu32.h:38
void register_cdecl(ptr32_t addr, const T &cb)
Definition cpu32.h:55
void register_stdcall(ptr32_t addr, const std::function< R(Args...)> &callback)
Definition cpu32.h:23
Compatibility::ptr32_t ptr32_t
Definition cpu32.h:16
void register_stdcall(ptr32_t addr, const T &cb)
Definition cpu32.h:45
void register_thiscall(ptr32_t addr, const std::function< R(Args...)> &callback)
Definition cpu32.h:30
void register_thiscall(ptr32_t addr, const T &cb)
Definition cpu32.h:50
Definition mem32.h:12
uint32_t ptr32_t