yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
hyrule_magic.cc
Go to the documentation of this file.
1#include "util/hyrule_magic.h"
2
3namespace yaze {
4namespace zelda3 {
5
6namespace {
7
8// "load little endian value at the given byte offset and shift to get its
9// value relative to the base offset (powers of 256, essentially)"
10unsigned ldle(uint8_t const* const p_arr, unsigned const p_index) {
11 uint32_t v = p_arr[p_index];
12 v <<= (8 * p_index);
13 return v;
14}
15
16void stle(uint8_t* const p_arr, size_t const p_index, unsigned const p_val) {
17 uint8_t v = (p_val >> (8 * p_index)) & 0xff;
18 p_arr[p_index] = v;
19}
20
21void stle0(uint8_t* const p_arr, unsigned const p_val) {
22 stle(p_arr, 0, p_val);
23}
24
25void stle1(uint8_t* const p_arr, unsigned const p_val) {
26 stle(p_arr, 1, p_val);
27}
28
29void stle2(uint8_t* const p_arr, unsigned const p_val) {
30 stle(p_arr, 2, p_val);
31}
32
33void stle3(uint8_t* const p_arr, unsigned const p_val) {
34 stle(p_arr, 3, p_val);
35}
36
37// Helper function to get the first byte in a little endian number
38uint32_t ldle0(uint8_t const* const p_arr) {
39 return ldle(p_arr, 0);
40}
41
42// Helper function to get the second byte in a little endian number
43uint32_t ldle1(uint8_t const* const p_arr) {
44 return ldle(p_arr, 1);
45}
46
47// Helper function to get the third byte in a little endian number
48uint32_t ldle2(uint8_t const* const p_arr) {
49 return ldle(p_arr, 2);
50}
51
52// Helper function to get the third byte in a little endian number
53uint32_t ldle3(uint8_t const* const p_arr) {
54 return ldle(p_arr, 3);
55}
56
57} // namespace
58
59void stle16b_i(uint8_t* const p_arr, size_t const p_index,
60 uint16_t const p_val) {
61 stle16b(p_arr + (p_index * 2), p_val);
62}
63
64void stle16b(uint8_t* const p_arr, uint16_t const p_val) {
65 stle0(p_arr, p_val);
66 stle1(p_arr, p_val);
67}
68
69uint16_t ldle16b(uint8_t const* const p_arr) {
70 uint16_t v = 0;
71 v |= (ldle0(p_arr) | ldle1(p_arr));
72 return v;
73}
74
75uint16_t ldle16b_i(uint8_t const* const p_arr, size_t const p_index) {
76 return ldle16b(p_arr + (2 * p_index));
77}
78
79} // namespace zelda3
80} // namespace yaze
uint32_t ldle2(uint8_t const *const p_arr)
uint32_t ldle0(uint8_t const *const p_arr)
void stle2(uint8_t *const p_arr, unsigned const p_val)
void stle(uint8_t *const p_arr, size_t const p_index, unsigned const p_val)
unsigned ldle(uint8_t const *const p_arr, unsigned const p_index)
void stle0(uint8_t *const p_arr, unsigned const p_val)
uint32_t ldle3(uint8_t const *const p_arr)
void stle1(uint8_t *const p_arr, unsigned const p_val)
uint32_t ldle1(uint8_t const *const p_arr)
void stle3(uint8_t *const p_arr, unsigned const p_val)
void stle16b_i(uint8_t *const p_arr, size_t const p_index, uint16_t const p_val)
Store little endian 16-bit value using a byte pointer, offset by an index before dereferencing.
uint16_t ldle16b(uint8_t const *const p_arr)
uint16_t ldle16b_i(uint8_t const *const p_arr, size_t const p_index)
Load little endian halfword (16-bit) dereferenced from an arrays of bytes. This version provides an i...
void stle16b(uint8_t *const p_arr, uint16_t const p_val)