OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
mem32.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <cstdint>
5#include <functional>
6#include <type_traits>
7
8#include <Tempest/Log>
9
11
12class Mem32 {
13 private:
14 struct Region;
15
16 public:
17 Mem32();
18 ~Mem32();
19
20 enum class Type : uint32_t {
21 plain,
25 };
26
28 static constexpr uint32_t memAlign = 8;
29
30 template<class T>
31 void setCallbackR(Type t, const T& fn) { setCallbackR(t, std::function{fn}); }
32
33 template<class T>
34 void setCallbackW(Type t, const T& fn) { setCallbackW(t, std::function{fn}); }
35
36 template<class T>
37 void setCallbackR(Type t, std::function<void(T& t, uint32_t)> fn) {
38 implSetCallbackR(t, [f = std::move(fn)](void* ptr, uint32_t id) {
39 f(*reinterpret_cast<T*>(ptr), id);
40 }, sizeof(T));
41 }
42
43 template<class T>
44 void setCallbackW(Type t, std::function<void(T& t, uint32_t)> fn) {
45 implSetCallbackW(t, [f = std::move(fn)](void* ptr, uint32_t id) {
46 f(*reinterpret_cast<T*>(ptr), id);
47 }, sizeof(T));
48 }
49
50 ptr32_t pin (void* mem, ptr32_t address, uint32_t size, const char* comment = nullptr);
51 ptr32_t pin (void* mem, uint32_t size, const char* comment = nullptr);
52 ptr32_t pin (ptr32_t address, uint32_t size, Type type);
53
54 ptr32_t alloc(uint32_t size, const char* comment = nullptr);
55 ptr32_t alloc(ptr32_t address, uint32_t size, const char* comment = nullptr);
56 ptr32_t alloc(uint32_t size, Type type, const char* comment = nullptr);
57
58 void free (ptr32_t at);
59
60 ptr32_t realloc(ptr32_t address, uint32_t size);
61
62 auto deref (ptr32_t address) -> std::tuple<void*, uint32_t>;
63 const void* deref (ptr32_t address, uint32_t size);
64 void* derefv(ptr32_t address, uint32_t size);
65
66 template<class T>
67 T* deref(ptr32_t address) {
68 if constexpr(std::is_const<T>::value) {
69 return reinterpret_cast<const T*>(deref(address, sizeof(T)));
70 } else {
71 return reinterpret_cast<T*>(derefv(address, sizeof(T)));
72 }
73 }
74
75 void writeInt (ptr32_t address, int32_t v);
76 int32_t readInt (ptr32_t address);
77 void copyBytes(ptr32_t src, ptr32_t dst, uint32_t size);
78
79 private:
80 enum Status:uint8_t {
81 S_Unused,
82 S_Allocated,
83 S_Pin,
84 S_Callback,
85 };
86
87 struct Region {
88 Region();
89 Region(ptr32_t b, uint32_t sz):address(b),size(sz){}
90
91 Type type = Type::plain;
92 ptr32_t address = 0;
93 uint32_t size = 0;
94 void* real = nullptr;
95 const char* comment = nullptr;
96 Status status = S_Unused;
97 };
98
99 struct Callback {
100 std::function<void(void*,uint32_t)> read;
101 std::function<void(void*,uint32_t)> write;
102 ptr32_t elementSize = 0;
103 };
104
105 void implSetCallbackR(Type t, std::function<void (void*, uint32_t)> fn, size_t elt);
106 void implSetCallbackW(Type t, std::function<void (void*, uint32_t)> fn, size_t elt);
107
108 Region* implAlloc(uint32_t size);
109 Region* implAllocAt(ptr32_t address, uint32_t size);
110 bool implRealloc(ptr32_t address, uint32_t size);
111 Region* implTranslate(ptr32_t address);
112 Region* translate(ptr32_t address);
113 void compactage();
114
115 void memSyncRead(Type t, const Region& rgn, ptr32_t address, uint32_t size);
116 void memSyncRead(Callback& cb, const Region& rgn, ptr32_t address, uint32_t size);
117
118 void memSyncWrite(Type t, const Region& rgn, ptr32_t address, uint32_t size);
119 void memSyncWrite(Callback& cb, const Region& rgn, ptr32_t address, uint32_t size);
120
121 std::vector<Region> region;
122 std::unordered_map<Type, Callback> memMap;
123 };
124
Definition mem32.h:12
Compatibility::ptr32_t ptr32_t
Definition mem32.h:27
void setCallbackW(Type t, const T &fn)
Definition mem32.h:34
T * deref(ptr32_t address)
Definition mem32.h:67
~Mem32()
Definition mem32.cpp:20
int32_t readInt(ptr32_t address)
Definition mem32.cpp:205
void * derefv(ptr32_t address, uint32_t size)
Definition mem32.cpp:144
ptr32_t alloc(uint32_t size, const char *comment=nullptr)
Definition mem32.cpp:89
ptr32_t realloc(ptr32_t address, uint32_t size)
Definition mem32.cpp:277
void setCallbackR(Type t, std::function< void(T &t, uint32_t)> fn)
Definition mem32.h:37
ptr32_t pin(void *mem, ptr32_t address, uint32_t size, const char *comment=nullptr)
Definition mem32.cpp:41
static constexpr uint32_t memAlign
Definition mem32.h:28
void setCallbackR(Type t, const T &fn)
Definition mem32.h:31
void copyBytes(ptr32_t src, ptr32_t dst, uint32_t size)
Definition mem32.cpp:222
auto deref(ptr32_t address) -> std::tuple< void *, uint32_t >
Definition mem32.cpp:163
void free(ptr32_t at)
Definition mem32.cpp:113
void setCallbackW(Type t, std::function< void(T &t, uint32_t)> fn)
Definition mem32.h:44
Type
Definition mem32.h:20
void writeInt(ptr32_t address, int32_t v)
Definition mem32.cpp:191
Mem32()
Definition mem32.cpp:11
uint32_t ptr32_t