6
6
#include < type_traits>
7
7
#include < new>
8
8
9
-
10
- template <typename T>
11
- class bitset_bit {
12
- public:
13
- bitset_bit (T& value, std::size_t index)
14
- : index_(index)
15
- , value_(value)
16
- {}
17
-
18
- bitset_bit& operator =(bool bit) {
19
- if (bit) {
20
- value_ |= (1 << index_);
21
- } else {
22
- value_ &= ~(1 << index_);
23
- }
24
- return *this ;
25
- };
26
-
27
- operator bool () const {
28
- return value_ & (1 << index_);
29
- }
30
-
31
- operator bool () {
32
- return value_ & (1 << index_);
33
- }
34
-
35
- private:
36
- std::size_t index_;
37
- T& value_;
38
- };
39
-
40
- template <typename T>
41
- class bitset {
42
- public:
43
- bitset () = default ;
44
-
45
- bitset (T value)
46
- : value_(value)
47
- {}
48
-
49
- auto operator [](std::size_t index) -> bitset_bit<T> {
50
- return bitset_bit (value_, index );
51
- }
52
-
53
- auto operator [](std::size_t index) const -> const bitset_bit<const T> {
54
- return bitset_bit (value_, index );
55
- }
56
-
57
- auto operator [](std::size_t index) volatile const -> const bitset_bit<const volatile T> {
58
- return bitset_bit (value_, index );
59
- }
60
-
61
- auto operator =(const T& other) -> uint32_t {
62
- value_ = other;
63
- return value_;
64
- }
65
-
66
- auto operator |=(const T& other) -> T& {
67
- value_ |= other;
68
- return value_;
69
- }
70
-
71
- auto to_ulong () const -> unsigned long int {
72
- return value_;
73
- }
74
-
75
- private:
76
- T value_;
77
- };
9
+ #include < libgba-cpp/utils/bitset.h>
78
10
79
11
/* *
80
12
* Elements related to GBA's physical architecture.
@@ -118,18 +50,18 @@ namespace display {
118
50
/* *
119
51
* Display Control Register.
120
52
*/
121
- static auto & lcd_control = at<bitset<uint16_t >>(0x0400'0000 );
53
+ static auto & lcd_control = at<gba::utils:: bitset<uint16_t >>(0x0400'0000 );
122
54
static_assert (sizeof (lcd_control) == 2 , " LCD Control must exactly have 2 bytes." );
123
55
124
56
/* *
125
57
* Green Swap Register (no official documentation).
126
58
*/
127
- static auto & green_swap = raw_at<bitset<uint16_t >>(0x0400'0002 );
59
+ static auto & green_swap = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0002 );
128
60
129
61
/* *
130
62
* Display status register.
131
63
*/
132
- static auto & lcd_status = raw_at<bitset<uint16_t >>(0x0400'0004 );
64
+ static auto & lcd_status = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0004 );
133
65
134
66
/* *
135
67
* Number of scanline currently being processed by PPU.
@@ -218,7 +150,7 @@ static auto& window_inside = raw_at<uint16_t>(0x0400'0048);
218
150
static auto & window_outside = raw_at<uint16_t >(0x0400'004a );
219
151
220
152
static auto & mosaic_size = raw_at<uint16_t >(0x0400'004c );
221
- static auto & effect_control = raw_at<bitset<uint16_t >>(0x0400'0050 );
153
+ static auto & effect_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0050 );
222
154
static auto & blend_a = raw_at<uint8_t >(0x0400'0052 );
223
155
static auto & blend_b = raw_at<uint8_t >(0x0400'0054 );
224
156
@@ -230,38 +162,38 @@ static auto& bg_palette = raw_at<std::array<uint16_t, 256>>(0x05
230
162
*/
231
163
namespace sound {
232
164
233
- static auto & channel1_sweep = raw_at<bitset<uint16_t >>(0x0400'0060 );
234
- static auto & channel1_envelope = raw_at<bitset<uint16_t >>(0x0400'0062 );
235
- static auto & channel1_control = raw_at<bitset<uint16_t >>(0x0400'0064 );
165
+ static auto & channel1_sweep = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0060 );
166
+ static auto & channel1_envelope = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0062 );
167
+ static auto & channel1_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0064 );
236
168
237
- static auto & channel2_envelope = raw_at<bitset<uint16_t >>(0x0400'0068 );
238
- static auto & channel2_control = raw_at<bitset<uint16_t >>(0x0400'006c );
169
+ static auto & channel2_envelope = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0068 );
170
+ static auto & channel2_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'006c );
239
171
240
- static auto & channel3_wave_bank = raw_at<bitset<uint16_t >>(0x0400'0070 );
241
- static auto & channel3_length = raw_at<bitset<uint16_t >>(0x0400'0072 );
242
- static auto & channel3_control = raw_at<bitset<uint16_t >>(0x0400'0074 );
172
+ static auto & channel3_wave_bank = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0070 );
173
+ static auto & channel3_length = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0072 );
174
+ static auto & channel3_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0074 );
243
175
244
- static auto & channel4_envelope = raw_at<bitset<uint16_t >>(0x0400'0078 );
245
- static auto & channel4_noise = raw_at<bitset<uint16_t >>(0x0400'007c );
176
+ static auto & channel4_envelope = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0078 );
177
+ static auto & channel4_noise = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'007c );
246
178
247
- static auto & dmg_control = raw_at<bitset<uint16_t >>(0x0400'0080 );
248
- static auto & directsound_control = raw_at<bitset<uint16_t >>(0x0400'0082 );
249
- static auto & status = raw_at<bitset<uint16_t >>(0x0400'0084 );
179
+ static auto & dmg_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0080 );
180
+ static auto & directsound_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0082 );
181
+ static auto & status = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0084 );
250
182
251
- static auto & bias = raw_at<bitset<uint16_t >>(0x0400'0088 );
183
+ static auto & bias = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0088 );
252
184
253
- static auto & wave_ram0_l = raw_at<bitset<uint16_t >>(0x0400'0090 );
254
- static auto & wave_ram0_h = raw_at<bitset<uint16_t >>(0x0400'0092 );
185
+ static auto & wave_ram0_l = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0090 );
186
+ static auto & wave_ram0_h = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0092 );
255
187
256
- static auto & wave_ram1_l = raw_at<bitset<uint16_t >>(0x0400'0094 );
257
- static auto & wave_ram1_h = raw_at<bitset<uint16_t >>(0x0400'0096 );
188
+ static auto & wave_ram1_l = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0094 );
189
+ static auto & wave_ram1_h = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0096 );
258
190
259
- static auto & wave_ram2_l = raw_at<bitset<uint16_t >>(0x0400'0098 );
260
- static auto & wave_ram2_h = raw_at<bitset<uint16_t >>(0x0400'009a );
191
+ static auto & wave_ram2_l = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0098 );
192
+ static auto & wave_ram2_h = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'009a );
261
193
262
194
// TODO: Fix data types
263
- static auto & wave_ram3_l = raw_at<bitset<uint16_t >>(0x0400'009c );
264
- static auto & wave_ram3_h = raw_at<bitset<uint16_t >>(0x0400'009e );
195
+ static auto & wave_ram3_l = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'009c );
196
+ static auto & wave_ram3_h = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'009e );
265
197
266
198
static auto & dsa_fifo_0 = raw_at<uint8_t >(0x0400'00a0 );
267
199
static auto & dsa_fifo_1 = raw_at<uint8_t >(0x0400'00a1 );
@@ -317,14 +249,14 @@ static auto& serial_third = raw_at<uint16_t>(0x0400'0126);
317
249
static auto & serial_control = raw_at<uint16_t >(0x0400'0128 );
318
250
static auto & serial_send_data = raw_at<uint8_t >(0x0400'012a );
319
251
320
- static auto & keypad_status = raw_at<volatile const bitset<uint16_t >>(0x0400'0130 );
321
- static auto & keypad_interrupt = raw_at<bitset<uint16_t >>(0x0400'0132 );
252
+ static auto & keypad_status = raw_at<volatile const gba::utils:: bitset<uint16_t >>(0x0400'0130 );
253
+ static auto & keypad_interrupt = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0132 );
322
254
323
- static auto & serial_mode = raw_at<bitset<uint16_t >>(0x0400'0134 );
324
- static auto & serial_joy_control = raw_at<bitset<uint16_t >>(0x0400'0140 );
255
+ static auto & serial_mode = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0134 );
256
+ static auto & serial_joy_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0140 );
325
257
static auto & serial_joy_receive_data = raw_at<uint32_t >(0x0400'0150 );
326
258
static auto & serial_joy_transmit_data = raw_at<uint32_t >(0x0400'0154 );
327
- static auto & serial_joy_receive_status = raw_at<bitset<uint32_t >>(0x0400'0158 );
259
+ static auto & serial_joy_receive_status = raw_at<gba::utils:: bitset<uint32_t >>(0x0400'0158 );
328
260
329
261
}
330
262
@@ -333,9 +265,9 @@ static auto& serial_joy_receive_status = raw_at<bitset<uint32_t>>(0x0400'0158);
333
265
// ----------------------------------------------------------------------------
334
266
namespace cpu {
335
267
336
- static auto & interrupt_enable = raw_at<bitset<uint16_t >>(0x0400'0200 );
268
+ static auto & interrupt_enable = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0200 );
337
269
static volatile auto & interrupt_request = raw_at<volatile uint16_t >(0x0400'0202 );
338
- static auto & gamepak_wait_control = raw_at<bitset<uint16_t >>(0x0400'0204 );
270
+ static auto & gamepak_wait_control = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0204 );
339
271
static auto & master_enable = raw_at<bool >(0x0400'0208 );
340
272
341
273
}
@@ -345,7 +277,7 @@ static auto& master_enable = raw_at<bool>(0x0400'0208);
345
277
// ----------------------------------------------------------------------------
346
278
namespace bios {
347
279
348
- static volatile auto & interrupt_check = raw_at<bitset<uint16_t >>(0x0300'7ff8 );
280
+ static volatile auto & interrupt_check = raw_at<gba::utils:: bitset<uint16_t >>(0x0300'7ff8 );
349
281
350
282
}
351
283
0 commit comments