libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
load_mem.h
1#pragma once
2
4#include "libmicroemu/types.h"
5
6namespace libmicroemu::internal {
7
14template <typename TInstrContext> class LoadMemU8 {
15public:
16 static inline Result<u32> Read(const TInstrContext &ictx, const me_adr_t &address) {
17 TRY_ASSIGN(r_data, u32,
18 ictx.bus.template ReadOrRaise<u8>(ictx.cpua, address,
19 BusExceptionType::kRaisePreciseDataBusError));
20 const u32 data = Bm32::ZeroExtend<u8>(r_data);
21 return Ok(data);
22 }
23};
24
30template <typename TInstrContext> class LoadMemI8 {
31public:
32 static inline Result<u32> Read(const TInstrContext &ictx, const me_adr_t &address) {
33 TRY_ASSIGN(data, u32,
34 ictx.bus.template ReadOrRaise<u8>(ictx.cpua, address,
35 BusExceptionType::kRaisePreciseDataBusError));
36 const u32 sign_extended_data = Bm16::SignExtend<u32, 7U>(data);
37
38 return Ok(sign_extended_data);
39 }
40};
41
47template <typename TInstrContext> class LoadMemU16 {
48public:
49 static inline Result<u32> Read(const TInstrContext &ictx, const me_adr_t &address) {
50 TRY_ASSIGN(r_data, u32,
51 ictx.bus.template ReadOrRaise<u16>(ictx.cpua, address,
52 BusExceptionType::kRaisePreciseDataBusError));
53 const u32 data = Bm16::ZeroExtend<u32>(r_data);
54 return Ok(data);
55 }
56};
57
63template <typename TInstrContext> class LoadMemI16 {
64public:
65 static inline Result<u32> Read(const TInstrContext &ictx, const me_adr_t &address) {
66 TRY_ASSIGN(r_data, u32,
67 ictx.bus.template ReadOrRaise<u16>(ictx.cpua, address,
68 BusExceptionType::kRaisePreciseDataBusError));
69 const u32 sign_extended_data = Bm16::SignExtend<u32, 15U>(r_data);
70 return Ok(sign_extended_data);
71 }
72};
73
79template <typename TInstrContext> class LoadMemU32 {
80public:
81 static inline Result<u32> Read(const TInstrContext &ictx, const me_adr_t &address) {
82 TRY_ASSIGN(r_data, u32,
83 ictx.bus.template ReadOrRaise<u32>(ictx.cpua, address,
84 BusExceptionType::kRaisePreciseDataBusError));
85 return Ok(r_data);
86 }
87};
88
94template <typename TInstrContext> class LoadMemExU32 {
95public:
96 static inline Result<u32> Read(const TInstrContext &ictx, const me_adr_t &address) {
97 TRY_ASSIGN(r_data, u32,
98 ictx.bus.template ReadOrRaise<u32>(ictx.cpua, address,
99 BusExceptionType::kRaisePreciseDataBusError));
100 return Ok(r_data);
101 }
102};
103} // namespace libmicroemu::internal
static U ZeroExtend(const u32 &value)
Definition bit_manip.h:200
static U SignExtend(const u16 &value)
Definition bit_manip.h:214
Loads u32 (exlusive) from memory.
Definition load_mem.h:94
Loads i16 from memory and extends the result to u32.
Definition load_mem.h:63
Loads i8 from memory and extends the result to i32.
Definition load_mem.h:30
Loads u16 from memory and extends the result to u32.
Definition load_mem.h:47
Loads u32 from memory.
Definition load_mem.h:79
Loads u8 from memory and extends the result to u32.
Definition load_mem.h:14
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6
Contains the Result class which is used to return the result of a function.
#define TRY_ASSIGN(NAME, OUT_TYPE, CALL)
Try to assign a value to a variable and return an error if the assignment fails.
Definition result.h:123
Definition result.h:15