src/gba/gba-audio.h (view raw)
1#ifndef GBA_AUDIO_H
2#define GBA_AUDIO_H
3
4#include <stdint.h>
5
6union GBAAudioWave {
7 struct {
8 unsigned length : 6;
9 unsigned duty : 2;
10 unsigned stepTime : 3;
11 unsigned direction : 1;
12 unsigned initialVolume : 4;
13 };
14 uint16_t packed;
15};
16
17union GBAAudioSquareControl {
18 struct {
19 unsigned frequency : 11;
20 unsigned : 3;
21 unsigned stop : 1;
22 unsigned restart : 1;
23 };
24 uint16_t packed;
25};
26
27struct GBAAudioChannel1 {
28 union GBAAudioSquareSweep {
29 struct {
30 unsigned shift : 3;
31 unsigned direction : 1;
32 unsigned time : 3;
33 unsigned : 9;
34 };
35 uint16_t packed;
36 } sweep;
37
38 union GBAAudioWave wave;
39 union GBAAudioSquareControl control;
40};
41
42struct GBAAudioChannel2 {
43 union GBAAudioWave wave;
44 union GBAAudioSquareControl control;
45};
46
47struct GBAAudioChannel3 {
48 union {
49 struct {
50 unsigned : 5;
51 unsigned size : 1;
52 unsigned bank : 1;
53 unsigned disable : 1;
54 unsigned : 7;
55 };
56 uint16_t packed;
57 } bank;
58
59 union {
60 struct {
61 unsigned length : 8;
62 unsigned : 5;
63 unsigned volume : 3;
64 unsigned disable : 1;
65 unsigned : 7;
66 };
67 uint16_t packed;
68 } wave;
69
70 union {
71 struct {
72 unsigned rate : 11;
73 unsigned : 3;
74 unsigned stop : 1;
75 unsigned restart : 1;
76 };
77 uint16_t packed;
78 } control;
79};
80
81struct GBAAudioChannel4 {
82 union GBAAudioWave wave;
83 union {
84 struct {
85 unsigned ratio : 3;
86 unsigned power : 1;
87 unsigned frequency : 4;
88 unsigned : 6;
89 unsigned stop : 1;
90 unsigned restart : 1;
91 };
92 uint16_t packed;
93 } control;
94};
95
96struct GBAAudioFIFO {
97
98};
99
100struct GBAAudio {
101 struct GBA* p;
102
103 struct GBAAudioChannel1 ch1;
104 struct GBAAudioChannel2 ch2;
105 struct GBAAudioChannel3 ch3;
106 struct GBAAudioChannel4 ch4;
107
108 struct GBAAudioFIFO chA;
109 struct GBAAudioFIFO chB;
110};
111
112void GBAAudioInit(struct GBAAudio* audio);
113void GBAAudioDeinit(struct GBAAudio* audio);
114
115void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value);
116void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value);
117void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value);
118void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value);
119void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value);
120void GBAAudioWriteSOUND3CNT_LO(struct GBAAudio* audio, uint16_t value);
121void GBAAudioWriteSOUND3CNT_HI(struct GBAAudio* audio, uint16_t value);
122void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value);
123void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value);
124void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value);
125void GBAAudioWriteSOUNDCNT_LO(struct GBAAudio* audio, uint16_t value);
126void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value);
127void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value);
128
129void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value);
130void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value);
131
132#endif