Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1845 yogev_ezra 1
; FASM.ASM
2
; --------
3
; uFMOD public source code release. Provided as-is.
4
 
5
; *** This stub allows compiling uFMOD sources using FASM.
6
 
7
; *** CONSTANTS ***
8
 
9
if UF_FREQ eq 44100
10
	FSOUND_MixRate = 44100
11
	FREQ_40HZ_p    = 1DB8Bh
12
	FREQ_40HZ_f    = 3B7160h
13
	PCM_format     = 3 ; PCM_2_16_44
14
else
15
	if UF_FREQ eq 22050
16
		FSOUND_MixRate = 22050
17
		FREQ_40HZ_p    = 3B716h
18
		FREQ_40HZ_f    = 76E2C0h
19
		PCM_format     = 9 ; PCM_2_16_22
20
	else
21
		if UF_FREQ eq 48000
22
		else
23
			display 'UF_FREQ not specified (defaulting to 48KHz)',13,10
24
		end if
25
		FSOUND_MixRate = 48000
26
		FREQ_40HZ_p    = 1B4E8h
27
		FREQ_40HZ_f    = 369D00h
28
		PCM_format     = 1 ; PCM_2_16_48
29
	end if
30
end if
31
 
32
if UF_RAMP eq NONE
33
	RAMP_NONE   = 1
34
	RAMP_WEAK   = 0
35
	RAMP_STRONG = 0
36
else
37
	if UF_RAMP eq WEAK
38
		RAMP_NONE   = 0
39
		RAMP_WEAK   = 1
40
		RAMP_STRONG = 0
41
	else
42
		if UF_RAMP eq STRONG
43
		else
44
			display 'UF_RAMP not specified (defaulting to STRONG)',13,10
45
		end if
46
		RAMP_NONE   = 0
47
		RAMP_WEAK   = 0
48
		RAMP_STRONG = 1
49
	end if
50
end if
51
 
52
UCODE equ 0
53
 
54
if UF_MODE eq UNSAFE
55
	display 'WARNING! Unsafe mod is ON. Library may crash while loading damaged XM tracks!',13,10
56
	CHK4VALIDITY = 0
57
	AC97SND_ON   = 0
58
else
59
	CHK4VALIDITY = 1
60
	if UF_MODE eq AC97SND
61
		AC97SND_ON = 1
62
	else
63
		AC97SND_ON = 0
64
	end if
65
end if
66
 
67
if NOLINKER
68
else
69
	format MS COFF
70
	section '.text' code readable executable
71
end if
72
 
73
; *** STRUCTS ***
74
 
75
; Sample type - contains info on sample
76
struc FSOUND_SAMPLE{
77
 
78
	; Don't change order .:.
79
	._length   dd ? ; sample length
80
	.loopstart dd ? ; loop start
81
	.looplen   dd ? ; loop length
82
	.defvol    db ? ; default volume
83
	.finetune  db ? ; finetune value from -128 to 127
84
	.bytes     db ? ; type [b 0-1] : 0 - no loop
85
	                ;                1 - forward loop
86
	                ;                2 - bidirectional loop (aka ping-pong)
87
	                ;      [b 4]   : 0 - 8-bit sample data
88
	                ;                1 - 16-bit sample data
89
	.defpan    db ? ; default pan value from 0 to 255
90
	.relative  db ? ; relative note (signed value)
91
	.Resved    db ? ; reserved, known values: 00h - regular delta packed sample data
92
	                ;                         ADh - ModPlug 4-bit ADPCM packed sample data
93
	; .:.
94
 
95
	.loopmode  db ?
96
	._align    db ?
97
	.buff      db ?,? ; sound data
98
}
99
virtual at 0
100
FSOUND_SAMPLE FSOUND_SAMPLE
101
FSOUND_SAMPLE_size = $-FSOUND_SAMPLE
102
end virtual
103
 
104
 
105
; Channel type - contains information on a mixing channel
106
struc FSOUND_CHANNEL{
107
	.actualvolume     dd ? ; driver level current volume
108
	.actualpan        dd ? ; driver level panning value
109
	.fsampleoffset    dd ? ; sample offset (sample starts playing from here)
110
	.leftvolume       dd ? ; mixing information. adjusted volume for left channel (panning involved)
111
	.rightvolume      dd ? ; mixing information. adjusted volume for right channel (panning involved)
112
	.mixpos           dd ? ; mixing information. high part of 32:32 fractional position in sample
113
	.speedlo          dd ? ; mixing information. playback rate - low part fractional
114
	.speedhi          dd ? ; mixing information. playback rate - high part fractional
115
	.ramp_lefttarget  dw ?
116
	.ramp_righttarget dw ?
117
	.ramp_leftspeed   dd ?
118
	.ramp_rightspeed  dd ?
119
 
120
	; Don't change order .:.
121
	.fsptr            dd ? ; pointer to FSOUND_SAMPLE currently playing sample
122
	.mixposlo         dd ? ; mixing information. low part of 32:32 fractional position in sample
123
	.ramp_leftvolume  dd ?
124
	.ramp_rightvolume dd ?
125
	.ramp_count       dw ?
126
	.speeddir         db ?,? ; mixing information. playback direction - forwards or backwards
127
	; .:.
128
 
129
}
130
virtual at 0
131
FSOUND_CHANNEL FSOUND_CHANNEL
132
FSOUND_CHANNEL_size = $-FSOUND_CHANNEL
133
end virtual
134
 
135
; Single note type - contains info on 1 note in a pattern
136
struc FMUSIC_NOTE{
137
	.unote   db ? ; note to play at (0-97) 97=keyoff
138
	.number  db ? ; sample being played (0-128)
139
	.uvolume db ? ; volume column value (0-64)  255=no volume
140
	.effect  db ? ; effect number (0-1Ah)
141
	.eparam  db ? ; effect parameter (0-255)
142
}
143
virtual at 0
144
FMUSIC_NOTE FMUSIC_NOTE
145
FMUSIC_NOTE_size = $-FMUSIC_NOTE
146
end virtual
147
 
148
; Pattern data type
149
struc FMUSIC_PATTERN{
150
	.rows        dw ?
151
	.patternsize dw ?
152
	.data        dd ? ; pointer to FMUSIC_NOTE
153
}
154
virtual at 0
155
FMUSIC_PATTERN FMUSIC_PATTERN
156
FMUSIC_PATTERN_size = $-FMUSIC_PATTERN
157
end virtual
158
 
159
; Multi sample extended instrument
160
struc FMUSIC_INSTRUMENT{
161
	.sample       rd 16 ; 16 pointers to FSOUND_SAMPLE per instrument
162
 
163
	; Don't change order .:.
164
	.keymap       rb 96 ; sample keymap assignments
165
	.VOLPoints    rw 24 ; volume envelope points
166
	.PANPoints    rw 24 ; panning envelope points
167
	.VOLnumpoints db ? ; number of volume envelope points
168
	.PANnumpoints db ? ; number of panning envelope points
169
	.VOLsustain   db ? ; volume sustain point
170
	.VOLLoopStart db ? ; volume envelope loop start
171
	.VOLLoopEnd   db ? ; volume envelope loop end
172
	.PANsustain   db ? ; panning sustain point
173
	.PANLoopStart db ? ; panning envelope loop start
174
	.PANLoopEnd   db ? ; panning envelope loop end
175
	.VOLtype      db ? ; type of envelope,bit 0:On 1:Sustain 2:Loop
176
	.PANtype      db ? ; type of envelope,bit 0:On 1:Sustain 2:Loop
177
	.VIBtype      db ? ; instrument vibrato type
178
	.VIBsweep     db ? ; time it takes for vibrato to fully kick in
179
	.iVIBdepth    db ? ; depth of vibrato
180
	.VIBrate      db ? ; rate of vibrato
181
	.VOLfade      dw ? ; fade out value
182
	; .:.
183
 
184
}
185
virtual at 0
186
FMUSIC_INSTRUMENT FMUSIC_INSTRUMENT
187
FMUSIC_INSTRUMENT_size = $-FMUSIC_INSTRUMENT
188
end virtual
189
 
190
; Channel type - contains information on a mod channel
191
struc FMUSIC_CHANNEL{
192
	.note          db ? ; last note set in channel
193
	.samp          db ? ; last sample set in channel
194
	.notectrl      db ? ; flags for DoFlags proc
195
	.inst          db ? ; last instrument set in channel
196
	.cptr          dd ? ; pointer to FSOUND_CHANNEL system mixing channel
197
	.freq          dd ? ; current mod frequency period for this channel
198
	.volume        dd ? ; current mod volume for this channel
199
	.voldelta      dd ? ; delta for volume commands... tremolo/tremor, etc
200
	.freqdelta     dd ? ; delta for frequency commands... vibrato/arpeggio, etc
201
	.pan           dd ? ; current mod pan for this channel
202
 
203
	; Don't change order .:.
204
	.envvoltick    dd ? ; tick counter for envelope position
205
	.envvolpos     dd ? ; envelope position
206
	.envvoldelta   dd ? ; delta step between points
207
	.envpantick    dd ? ; tick counter for envelope position
208
	.envpanpos     dd ? ; envelope position
209
	.envpandelta   dd ? ; delta step between points
210
	.ivibsweeppos  dd ? ; instrument vibrato sweep position
211
	.ivibpos       dd ? ; instrument vibrato position
212
	.keyoff        db ?,? ; flag whether keyoff has been hit or not
213
	.envvolstopped db ? ; flag to say whether envelope has finished or not
214
	.envpanstopped db ? ; flag to say whether envelope has finished or not
215
	; .:.
216
 
217
	.envvolfrac    dd ? ; fractional interpolated envelope volume
218
	.envvol        dd ? ; final interpolated envelope volume
219
	.fadeoutvol    dd ? ; volume fade out
220
	.envpanfrac    dd ? ; fractional interpolated envelope pan
221
	.envpan        dd ? ; final interpolated envelope pan
222
	.period        dd ? ; last period set in channel
223
	.sampleoffset  dd ? ; sample offset for this channel in SAMPLES
224
	.portatarget   dd ? ; note to porta to
225
	.patloopno     db ?,?,?,? ; pattern loop variables for effect E6x
226
	.patlooprow    dd ?
227
	.realnote      db ? ; last realnote set in channel
228
	.recenteffect  db ? ; previous row's effect... used to correct tremolo volume
229
	.portaupdown   db ? ; last porta up/down value
230
	               db ? ; unused
231
	.xtraportadown db ? ; last porta down value
232
	.xtraportaup   db ? ; last porta up value
233
	.volslide      db ? ; last volume slide value
234
	.panslide      db ? ; pan slide parameter
235
	.retrigx       db ? ; last retrig volume slide used
236
	.retrigy       db ? ; last retrig tick count used
237
	.portaspeed    db ? ; porta speed
238
	.vibpos        db ? ; vibrato position
239
	.vibspeed      db ? ; vibrato speed
240
	.vibdepth      db ? ; vibrato depth
241
	.tremolopos    db ? ; tremolo position
242
	.tremolospeed  db ? ; tremolo speed
243
	.tremolodepth  db ? ; tremolo depth
244
	.tremorpos     db ? ; tremor position
245
	.tremoron      db ? ; remembered parameters for tremor
246
	.tremoroff     db ? ; remembered parameters for tremor
247
	.wavecontrol   db ? ; waveform type for vibrato and tremolo (4bits each)
248
	.finevslup     db ? ; parameter for fine volume slide down
249
	.fineportaup   db ? ; parameter for fine porta slide up
250
	.fineportadown db ? ; parameter for fine porta slide down
251
}
252
virtual at 0
253
FMUSIC_CHANNEL FMUSIC_CHANNEL
254
FMUSIC_CHANNEL_size = $-FMUSIC_CHANNEL
255
end virtual
256
 
257
; Song type - contains info on song
258
struc FMUSIC_MODULE{
259
 
260
	; Don't change order .:.
261
	.pattern              dd ? ; pointer to FMUSIC_PATTERN array for this song
262
	.instrument           dd ? ; pointer to FMUSIC_INSTRUMENT array for this song
263
	.mixer_samplesleft    dd ?
264
	.globalvolume         dd ? ; global mod volume
265
	.tick                 dd ? ; current mod tick
266
	.speed                dd ? ; speed of song in ticks per row
267
	.order                dd ? ; current song order position
268
	.row                  dd ? ; current row in pattern
269
	.patterndelay         dd ? ; pattern delay counter
270
	.nextorder            dd ? ; current song order position
271
	.nextrow              dd ? ; current row in pattern
272
	.unused1              dd ?
273
	.numchannels          dd ? ; number of channels
274
	.Channels             dd ? ; channel pool
275
	.uFMOD_Ch             dd ? ; channel array for this song
276
	.mixer_samplespertick dd ?
277
	.numorders            dw ? ; number of orders (song length)
278
	.restart              dw ? ; restart position
279
	.numchannels_xm       db ?
280
	.globalvsl            db ? ; global mod volume
281
	.numpatternsmem       dw ? ; number of allocated patterns
282
	.numinsts             dw ? ; number of instruments
283
	.flags                dw ? ; flags such as linear frequency, format specific quirks, etc
284
	.defaultspeed         dw ?
285
	.defaultbpm           dw ?
286
	.orderlist            rb 256 ; pattern playing order list
287
	; .:.
288
 
289
}
290
virtual at 0
291
FMUSIC_MODULE FMUSIC_MODULE
292
FMUSIC_MODULE_size = $-FMUSIC_MODULE
293
end virtual
294
 
295
OFFSET equ
296
PTR    equ
297
endif  equ end if
298
 
299
include 'ufmod.asm'
300
include 'core.asm'
301
 
302
if NOLINKER
303
	uFMOD_IMG_END: ; End of uFMOD's code. BSS follows.
304
	align 16
305
else
306
	section '.bss' readable writeable align 16
307
end if
308
 
309
; Don't change order!
310
_mod          rb FMUSIC_MODULE_size ; currently playing track
311
mmt           rd 3
312
ufmod_heap    dd ?
313
              dd ? ; unused
314
if AC97SND_ON
315
	extrn hSound
316
	      dd ?
317
else
318
	hSound dd ?
319
endif
320
hBuff         dd ?
321
SW_Exit       dd ?
322
; mix buffer memory block (align 16!)
323
MixBuf        rb FSOUND_BlockSize*8
324
ufmod_noloop  db ?
325
ufmod_pause_  db ?
326
mix_endflag   rb 2
327
mmf           rd 4
328
ufmod_vol     dd ? ; global volume scale
329
; * LPCALLBACKS *
330
uFMOD_fopen   dd ?
331
uFMOD_fread   dd ?
332
file_struct   rd 7
333
cache_offset  dd ?
334
if INFO_API_ON
335
	time_ms dd ?
336
	L_vol   dw ? ; L channel RMS volume
337
	R_vol   dw ? ; R channel RMS volume
338
	s_row   dw ?
339
	s_order dw ?
340
	szTtl   rb 24
341
end if
342
DummySamp rb FSOUND_SAMPLE_size