66#include < type_traits>
77#include < new>
88
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>
7810
7911/* *
8012 * Elements related to GBA's physical architecture.
@@ -118,18 +50,18 @@ namespace display {
11850/* *
11951 * Display Control Register.
12052 */
121- static auto & lcd_control = at<bitset<uint16_t >>(0x0400'0000 );
53+ static auto & lcd_control = at<gba::utils:: bitset<uint16_t >>(0x0400'0000 );
12254static_assert (sizeof (lcd_control) == 2 , " LCD Control must exactly have 2 bytes." );
12355
12456/* *
12557 * Green Swap Register (no official documentation).
12658 */
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 );
12860
12961/* *
13062 * Display status register.
13163 */
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 );
13365
13466/* *
13567 * Number of scanline currently being processed by PPU.
@@ -218,7 +150,7 @@ static auto& window_inside = raw_at<uint16_t>(0x0400'0048);
218150static auto & window_outside = raw_at<uint16_t >(0x0400'004a );
219151
220152static 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 );
222154static auto & blend_a = raw_at<uint8_t >(0x0400'0052 );
223155static auto & blend_b = raw_at<uint8_t >(0x0400'0054 );
224156
@@ -230,38 +162,38 @@ static auto& bg_palette = raw_at<std::array<uint16_t, 256>>(0x05
230162 */
231163namespace sound {
232164
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 );
236168
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 );
239171
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 );
243175
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 );
246178
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 );
250182
251- static auto & bias = raw_at<bitset<uint16_t >>(0x0400'0088 );
183+ static auto & bias = raw_at<gba::utils:: bitset<uint16_t >>(0x0400'0088 );
252184
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 );
255187
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 );
258190
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 );
261193
262194// 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 );
265197
266198static auto & dsa_fifo_0 = raw_at<uint8_t >(0x0400'00a0 );
267199static auto & dsa_fifo_1 = raw_at<uint8_t >(0x0400'00a1 );
@@ -317,14 +249,14 @@ static auto& serial_third = raw_at<uint16_t>(0x0400'0126);
317249static auto & serial_control = raw_at<uint16_t >(0x0400'0128 );
318250static auto & serial_send_data = raw_at<uint8_t >(0x0400'012a );
319251
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 );
322254
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 );
325257static auto & serial_joy_receive_data = raw_at<uint32_t >(0x0400'0150 );
326258static 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 );
328260
329261}
330262
@@ -333,9 +265,9 @@ static auto& serial_joy_receive_status = raw_at<bitset<uint32_t>>(0x0400'0158);
333265// ----------------------------------------------------------------------------
334266namespace cpu {
335267
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 );
337269static 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 );
339271static auto & master_enable = raw_at<bool >(0x0400'0208 );
340272
341273}
@@ -345,7 +277,7 @@ static auto& master_enable = raw_at<bool>(0x0400'0208);
345277// ----------------------------------------------------------------------------
346278namespace bios {
347279
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 );
349281
350282}
351283
0 commit comments