15 template <
typename TCpuStates,
typename TBus,
typename... Args,
16 typename = std::enable_if_t<(std::is_same_v<Args, uint32_t> && ...)>>
17 static Result<std::array<u32,
sizeof...(Args)>> ReadMemory(TCpuStates &cpua, TBus &bus,
19 using TElement =
typename std::tuple_element<0, std::tuple<Args...>>::type;
20 std::array<TElement,
sizeof...(Args)> result_ma;
21 auto sc = AssignReadResult(cpua, bus, result_ma, value...);
22 return Result<std::array<u32,
sizeof...(Args)>>(sc, result_ma);
32 template <
typename TCpuStates,
typename TBus>
33 static Result<void> CpyFromEmuMem(TCpuStates &cpua, TBus &bus,
char *dest_ptr,
34 std::size_t dest_len, me_adr_t src_ptr, me_size_t src_len) {
35 auto res_len = src_len <= dest_len ? src_len : dest_len;
37 for (u32 i = 0U; i < res_len; ++i) {
38 auto r_ch = bus.template Read<u8>(cpua, src_ptr);
40 return Err<u8, void>(r_ch);
42 const auto &ch = r_ch.content;
51 template <
typename TCpuStates,
typename TBus>
52 static Result<u32> CpyToEmuMem(TCpuStates &cpua, TBus &bus, me_adr_t dest_ptr, me_size_t dest_len,
53 char *src_ptr, std::size_t src_len) {
54 auto res_len = dest_len <= src_len ? dest_len : src_len;
56 for (u32 i = 0U; i < res_len; ++i) {
57 auto r_ch = bus.template Write<u8>(cpua, dest_ptr, src_ptr[i]);
59 return Err<void, u32>(r_ch);
64 return Ok<u32>(res_len);
70 template <std::size_t I = 0, std::size_t N,
typename TCpuStates,
typename TBus,
typename T,
72 static typename std::enable_if <
73 I<(N - 1),
StatusCode>::type AssignReadResult(TCpuStates &cpua, TBus &bus,
74 std::array<uint32_t, N> &result_ma, T value,
76 auto r_w1 = bus.template Read<u32>(cpua, value);
80 return r_w1.status_code;
83 result_ma[I] = r_w1.content;
84 auto sc = AssignReadResult<I + 1, N, TCpuStates, TBus, Args...>(cpua, bus, result_ma, args...);
88 template <std::
size_t I = 0, std::
size_t N,
typename TCpuStates,
typename TBus,
typename T>
89 static typename std::enable_if_t<I == (N - 1),
StatusCode>
90 AssignReadResult(TCpuStates &cpua, TBus &bus, std::array<uint32_t, N> &result_ma, T value) {
91 auto r_w1 = bus.template Read<u32>(cpua, value);
94 return r_w1.status_code;
96 result_ma[I] = r_w1.content;