aboutsummaryrefslogtreecommitdiff
path: root/src-68k/esf.68k
blob: 7f5aae540042fbd1e9c0532740664d520ca23ed4 (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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
;****************************************************************************
; Channel ID constants
;****************************************************************************

ESF_FM1     equ $00         ; FM channel #1
ESF_FM2     equ $01         ; FM channel #2
ESF_FM3     equ $02         ; FM channel #3
ESF_FM4     equ $04         ; FM channel #4
ESF_FM5     equ $05         ; FM channel #5
ESF_FM6     equ $06         ; FM channel #6
ESF_PSG1    equ $08         ; PSG square channel #1
ESF_PSG2    equ $09         ; PSG square channel #2
ESF_PSG3    equ $0A         ; PSG square channel #3
ESF_PSG4    equ $0B         ; PSG noise channel
ESF_PCM     equ $0C         ; PCM channel

;****************************************************************************
; FM note frequency constants
;****************************************************************************

ESF_FMFREQ_C    equ 644
ESF_FMFREQ_CS   equ 681
ESF_FMFREQ_D    equ 722
ESF_FMFREQ_DS   equ 765
ESF_FMFREQ_E    equ 810
ESF_FMFREQ_F    equ 858
ESF_FMFREQ_FS   equ 910
ESF_FMFREQ_G    equ 964
ESF_FMFREQ_GS   equ 1021
ESF_FMFREQ_A    equ 1081
ESF_FMFREQ_AS   equ 1146
ESF_FMFREQ_B    equ 1214

ESF_FMFREQ_0    equ ESF_FMFREQ_C
ESF_FMFREQ_1    equ ESF_FMFREQ_CS
ESF_FMFREQ_2    equ ESF_FMFREQ_D
ESF_FMFREQ_3    equ ESF_FMFREQ_DS
ESF_FMFREQ_4    equ ESF_FMFREQ_E
ESF_FMFREQ_5    equ ESF_FMFREQ_F
ESF_FMFREQ_6    equ ESF_FMFREQ_FS
ESF_FMFREQ_7    equ ESF_FMFREQ_G
ESF_FMFREQ_8    equ ESF_FMFREQ_GS
ESF_FMFREQ_9    equ ESF_FMFREQ_A
ESF_FMFREQ_10   equ ESF_FMFREQ_AS
ESF_FMFREQ_11   equ ESF_FMFREQ_B

;****************************************************************************
; Panning values
;****************************************************************************

ESF_PAN_OFF:    equ $00     ; Mute
ESF_PAN_L:      equ $80     ; Left speaker only
ESF_PAN_R:      equ $40     ; Right speaker only
ESF_PAN_LR:     equ $C0     ; Both speakers

;****************************************************************************
; ESF_NoteOn
; Start playing a note.
;----------------------------------------------------------------------------
; For FM channels:
;   ESF_NoteOn channel, octave, semitone
; For square PSG channels:
;   ESF_NoteOn channel, octave, semitone
; For noise PSG channel:
;   ESF_NoteOn channel, type
; For PCM channel:
;   ESF_NoteOn channel, instrument
;----------------------------------------------------------------------------
; param channel ...... channel to play on
; param octave ....... octave (0 to 7 for FM, 0 to 5 for PSG)
; param semitone ..... semitone (0 to 11)
; param type ......... noise type ($00 to $07)
; param instrument ... drum instrument ID ($00 to $FF)
;****************************************************************************

ESF_NoteOn macro
    dc.b    $00+(\1)
    if      (\1)<ESF_PSG1
    dc.b    (\2)*32+(\3)*2+1
    elseif  (\1)<ESF_PSG4
    dc.b    (\2)*24+(\3)*2
    else
    dc.b    \2
    endc
    endm

;****************************************************************************
; ESF_NoteOff
; Stop playing a note.
;----------------------------------------------------------------------------
; Format:
;   ESF_NoteOff channel
;----------------------------------------------------------------------------
; param channel ...... channel to stop
;****************************************************************************

ESF_NoteOff macro
    dc.b    $10+(\1)
    endm

;****************************************************************************
; ESF_SetVol
; Set the volume of a channel.
;----------------------------------------------------------------------------
; Format:
;   ESF_SetVol channel, volume
;----------------------------------------------------------------------------
; param channel ... channel to modify
; param volume .... new volume ($00 to $7F for FM, $00 to $0F for PSG)
;****************************************************************************

ESF_SetVol macro
    dc.b    $20+(\1)
    dc.b    (\2)
    endm

;****************************************************************************
; ESF_SetFreq
; Sets the frequency of a channel (allows note slides).
;----------------------------------------------------------------------------
; For FM channels:
;   ESF_SetFreq channel, octave, frequency
; For square PSG channels:
;   ESF_SetFreq channel, frequency
; For noise PSG channel:
;   ESF_SetFreq channel, type
;----------------------------------------------------------------------------
; param channel ..... affected channel
; param octave ...... octave
; param frequency ... frequency (0 to $7FF for FM, 0 to $3FF for PSG)
; param type ........ noise type ($00 to $07)
;****************************************************************************

ESF_SetFreq macro
    dc.b    $30+(\1)
    if      (\1)<ESF_PSG1
    dc.b    ((\2)<<3)|((\3)>>8)
    dc.b    (\3)&$FF
    elseif  (\1)<ESF_PSG4
    dc.b    (\2)&$0F
    dc.b    (\2)>>6
    else
    dc.b    (\2)
    endc
    endm

;****************************************************************************
; ESF_SetInstr
; Set the instrument of a channel.
;----------------------------------------------------------------------------
; Format:
;   ESF_SetInstr channel, instrument
;----------------------------------------------------------------------------
; param channel ...... Channel to lock
; param instrument ... Instrument ID ($00 to $FF)
;****************************************************************************

ESF_SetInstr macro
    dc.b    $40+(\1)
    dc.b    (\2)
    endm

;****************************************************************************
; ESF_Lock
; Lock SFX channel.
;----------------------------------------------------------------------------
; Format:
;   ESF_Lock channel
;----------------------------------------------------------------------------
; param channel ... Channel to lock
;****************************************************************************

ESF_Lock macro
    dc.b    $E0+(\1)
    endm

;****************************************************************************
; ESF_SetPan
; Set the panning of a FM channel.
;----------------------------------------------------------------------------
; Format:
;   ESF_SetPan channel, panning
;----------------------------------------------------------------------------
; param channel ... channel to modify
; param panning ... panning (see ESF_PAN_*)
;****************************************************************************

ESF_SetPan macro
    dc.b    $F0+(\1)
    dc.b    (\2)
    endm

;****************************************************************************
; ESF_SetFMReg
; Set a FM register directly.
;----------------------------------------------------------------------------
; Format:
;   ESF_SetFMReg bank, register, value
;----------------------------------------------------------------------------
; param bank ....... YM2612 bank (0 or 1)
; param register ... register to modify
; param value ...... value to write
;****************************************************************************

ESF_SetFMReg macro
    dc.b    $F8+(\1)
    dc.b    (\2)
    dc.b    (\3)
    endm

;****************************************************************************
; ESF_Delay
; Stop event.
;----------------------------------------------------------------------------
; Format:
;   ESF_Delay ticks
;----------------------------------------------------------------------------
; param ticks ... Ticks to wait (60 = 1 second)
;****************************************************************************

ESF_Delay macro
    if      (\1)>0
      if      (\1)>=$100
        rept    (\1)/$100
          dc.b    $FE, $00
        endr
      endc
      if      (\1)%$100
        if      ((\1)%$100)<=$10
          dc.b    $D0-1+((\1)%$100)
        else
          dc.b    $FE
          dc.b    (\1)%$100
        endc
      endc
    endc
    endm

;****************************************************************************
; ESF_Stop
; Stop event.
;****************************************************************************

ESF_Stop macro
    dc.b    $FF
    endm