summaryrefslogtreecommitdiff
path: root/audio/engine.asm
blob: f7a9974a88830da22c8edfcd0d42a77dbd31a9ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
INCLUDE "constants.asm"

SECTION "Audio", ROMX[$4000], BANK[$3A]

_DisableAudio:: ; 3a:4000
    push hl
    push de
    push bc
    push af
    ld hl, rNR50
    xor a
    ld [hli], a
    ld [hli], a
    ld a, $80
    ld [hli], a
    ld hl, rNR10
    ld e, 4
.init_channel
    xor a
    ld [hli], a
    ld [hli], a
    ld a, 8
    ld [hli], a
    xor a
    ld [hli], a
    ld a, $80
    ld [hli], a
    dec e
    jr nz, .init_channel

    ld hl, wMusic
    ld de, wMusicInitEnd - wMusic
.clear
    xor a
    ld [hli], a
    dec de
    ld a, e
    or d
    jr nz, .clear

    ld a, $77
    ld [wVolume], a

    pop af
    pop bc
    pop de
    pop hl
    ret


_UpdateSound:: ; 3a:4037
    xor a
    ; So, I'm being told I need to disassemble this...
    ; OH HELL NO

    ; ... TODO :/



SECTION "Audio engine, part 2", ROMX[$4CEE],BANK[$3A] ; TODO: disassemble what's above (gulp) and remove this

SetGlobalTempo: ; 3a:4cee
    push bc
    ld a, [wCurChannel]
    cp CHAN5
    jr nc, .sfxchannels
    ld bc, wChannel1
    call Tempo
    ld bc, wChannel2
    call Tempo
    ld bc, wChannel3
    call Tempo
    ld bc, wChannel4
    call Tempo
    jr .end

.sfxchannels
    ld bc, wChannel5
    call Tempo
    ld bc, wChannel6
    call Tempo
    ld bc, wChannel7
    call Tempo
    ld bc, wChannel8
    call Tempo

.end
    pop bc
    ret

Tempo: ; 3a:4d2a
    ld hl, wChannel1Tempo - wChannel1
    add hl, bc
    ld [hl], e
    inc hl
    ld [hl], d
    xor a
    ld hl, wChannel1Field16 - wChannel1
    add hl, bc
    ld [hl], a
    ret


StartChannel: ; 3a:4d38
    call SetLRTracks
    ld hl, wChannel1Flags - wChannel1
    add hl, bc
    set SOUND_CHANNEL_ON, [hl]
    ret


StopChannel: ; 3a:4d42
    ld hl, wChannel1Flags - wChannel1
    add hl, bc
    res SOUND_CHANNEL_ON, [hl]
    ld hl, wChannel1MusicID - wChannel1
    add hl, bc
    xor a
    ld [hli], a
    ld [hli], a
    ld [hli], a
    ret


SetLRTracks: ; 3a:4d51
    push de
    ld a, [wCurChannel]
    maskbits NUM_MUSIC_CHANS
    ld e, a
    ld d, 0
    ld hl, $52B3 ; FIXME
    add hl, de
    ld a, [hl]
    ld hl, wChannel1Tracks - wChannel1
    add hl, bc
    ld [hl], a
    pop de
    ret


_PlayMusic:: ; 3a:4d66
    ld hl, wMusicID
    ld [hl], e
    inc hl
    ld [hl], d
    ld hl, Music
    add hl, de
    add hl, de
    add hl, de
    ld a, [hli]
    ld [wMusicBank], a
    ld e, [hl]
    inc hl
    ld d, [hl]
    call LoadMusicByte
    rlca
    rlca
    maskbits NUM_MUSIC_CHANS
    inc a
.loop
    push af
    call LoadChannel
    call StartChannel
    pop af
    dec a
    jr nz, .loop
    xor a
    ; TODO

SECTION "Song Header Pointers", ROMX[$52C7], BANK[$3A]
INCLUDE "audio/song_header_pointers.inc"