0,0 → 1,342 |
; FASM.ASM |
; -------- |
; uFMOD public source code release. Provided as-is. |
|
; *** This stub allows compiling uFMOD sources using FASM. |
|
; *** CONSTANTS *** |
|
if UF_FREQ eq 44100 |
FSOUND_MixRate = 44100 |
FREQ_40HZ_p = 1DB8Bh |
FREQ_40HZ_f = 3B7160h |
PCM_format = 3 ; PCM_2_16_44 |
else |
if UF_FREQ eq 22050 |
FSOUND_MixRate = 22050 |
FREQ_40HZ_p = 3B716h |
FREQ_40HZ_f = 76E2C0h |
PCM_format = 9 ; PCM_2_16_22 |
else |
if UF_FREQ eq 48000 |
else |
display 'UF_FREQ not specified (defaulting to 48KHz)',13,10 |
end if |
FSOUND_MixRate = 48000 |
FREQ_40HZ_p = 1B4E8h |
FREQ_40HZ_f = 369D00h |
PCM_format = 1 ; PCM_2_16_48 |
end if |
end if |
|
if UF_RAMP eq NONE |
RAMP_NONE = 1 |
RAMP_WEAK = 0 |
RAMP_STRONG = 0 |
else |
if UF_RAMP eq WEAK |
RAMP_NONE = 0 |
RAMP_WEAK = 1 |
RAMP_STRONG = 0 |
else |
if UF_RAMP eq STRONG |
else |
display 'UF_RAMP not specified (defaulting to STRONG)',13,10 |
end if |
RAMP_NONE = 0 |
RAMP_WEAK = 0 |
RAMP_STRONG = 1 |
end if |
end if |
|
UCODE equ 0 |
|
if UF_MODE eq UNSAFE |
display 'WARNING! Unsafe mod is ON. Library may crash while loading damaged XM tracks!',13,10 |
CHK4VALIDITY = 0 |
AC97SND_ON = 0 |
else |
CHK4VALIDITY = 1 |
if UF_MODE eq AC97SND |
AC97SND_ON = 1 |
else |
AC97SND_ON = 0 |
end if |
end if |
|
if NOLINKER |
else |
format MS COFF |
section '.text' code readable executable |
end if |
|
; *** STRUCTS *** |
|
; Sample type - contains info on sample |
struc FSOUND_SAMPLE{ |
|
; Don't change order .:. |
._length dd ? ; sample length |
.loopstart dd ? ; loop start |
.looplen dd ? ; loop length |
.defvol db ? ; default volume |
.finetune db ? ; finetune value from -128 to 127 |
.bytes db ? ; type [b 0-1] : 0 - no loop |
; 1 - forward loop |
; 2 - bidirectional loop (aka ping-pong) |
; [b 4] : 0 - 8-bit sample data |
; 1 - 16-bit sample data |
.defpan db ? ; default pan value from 0 to 255 |
.relative db ? ; relative note (signed value) |
.Resved db ? ; reserved, known values: 00h - regular delta packed sample data |
; ADh - ModPlug 4-bit ADPCM packed sample data |
; .:. |
|
.loopmode db ? |
._align db ? |
.buff db ?,? ; sound data |
} |
virtual at 0 |
FSOUND_SAMPLE FSOUND_SAMPLE |
FSOUND_SAMPLE_size = $-FSOUND_SAMPLE |
end virtual |
|
|
; Channel type - contains information on a mixing channel |
struc FSOUND_CHANNEL{ |
.actualvolume dd ? ; driver level current volume |
.actualpan dd ? ; driver level panning value |
.fsampleoffset dd ? ; sample offset (sample starts playing from here) |
.leftvolume dd ? ; mixing information. adjusted volume for left channel (panning involved) |
.rightvolume dd ? ; mixing information. adjusted volume for right channel (panning involved) |
.mixpos dd ? ; mixing information. high part of 32:32 fractional position in sample |
.speedlo dd ? ; mixing information. playback rate - low part fractional |
.speedhi dd ? ; mixing information. playback rate - high part fractional |
.ramp_lefttarget dw ? |
.ramp_righttarget dw ? |
.ramp_leftspeed dd ? |
.ramp_rightspeed dd ? |
|
; Don't change order .:. |
.fsptr dd ? ; pointer to FSOUND_SAMPLE currently playing sample |
.mixposlo dd ? ; mixing information. low part of 32:32 fractional position in sample |
.ramp_leftvolume dd ? |
.ramp_rightvolume dd ? |
.ramp_count dw ? |
.speeddir db ?,? ; mixing information. playback direction - forwards or backwards |
; .:. |
|
} |
virtual at 0 |
FSOUND_CHANNEL FSOUND_CHANNEL |
FSOUND_CHANNEL_size = $-FSOUND_CHANNEL |
end virtual |
|
; Single note type - contains info on 1 note in a pattern |
struc FMUSIC_NOTE{ |
.unote db ? ; note to play at (0-97) 97=keyoff |
.number db ? ; sample being played (0-128) |
.uvolume db ? ; volume column value (0-64) 255=no volume |
.effect db ? ; effect number (0-1Ah) |
.eparam db ? ; effect parameter (0-255) |
} |
virtual at 0 |
FMUSIC_NOTE FMUSIC_NOTE |
FMUSIC_NOTE_size = $-FMUSIC_NOTE |
end virtual |
|
; Pattern data type |
struc FMUSIC_PATTERN{ |
.rows dw ? |
.patternsize dw ? |
.data dd ? ; pointer to FMUSIC_NOTE |
} |
virtual at 0 |
FMUSIC_PATTERN FMUSIC_PATTERN |
FMUSIC_PATTERN_size = $-FMUSIC_PATTERN |
end virtual |
|
; Multi sample extended instrument |
struc FMUSIC_INSTRUMENT{ |
.sample rd 16 ; 16 pointers to FSOUND_SAMPLE per instrument |
|
; Don't change order .:. |
.keymap rb 96 ; sample keymap assignments |
.VOLPoints rw 24 ; volume envelope points |
.PANPoints rw 24 ; panning envelope points |
.VOLnumpoints db ? ; number of volume envelope points |
.PANnumpoints db ? ; number of panning envelope points |
.VOLsustain db ? ; volume sustain point |
.VOLLoopStart db ? ; volume envelope loop start |
.VOLLoopEnd db ? ; volume envelope loop end |
.PANsustain db ? ; panning sustain point |
.PANLoopStart db ? ; panning envelope loop start |
.PANLoopEnd db ? ; panning envelope loop end |
.VOLtype db ? ; type of envelope,bit 0:On 1:Sustain 2:Loop |
.PANtype db ? ; type of envelope,bit 0:On 1:Sustain 2:Loop |
.VIBtype db ? ; instrument vibrato type |
.VIBsweep db ? ; time it takes for vibrato to fully kick in |
.iVIBdepth db ? ; depth of vibrato |
.VIBrate db ? ; rate of vibrato |
.VOLfade dw ? ; fade out value |
; .:. |
|
} |
virtual at 0 |
FMUSIC_INSTRUMENT FMUSIC_INSTRUMENT |
FMUSIC_INSTRUMENT_size = $-FMUSIC_INSTRUMENT |
end virtual |
|
; Channel type - contains information on a mod channel |
struc FMUSIC_CHANNEL{ |
.note db ? ; last note set in channel |
.samp db ? ; last sample set in channel |
.notectrl db ? ; flags for DoFlags proc |
.inst db ? ; last instrument set in channel |
.cptr dd ? ; pointer to FSOUND_CHANNEL system mixing channel |
.freq dd ? ; current mod frequency period for this channel |
.volume dd ? ; current mod volume for this channel |
.voldelta dd ? ; delta for volume commands... tremolo/tremor, etc |
.freqdelta dd ? ; delta for frequency commands... vibrato/arpeggio, etc |
.pan dd ? ; current mod pan for this channel |
|
; Don't change order .:. |
.envvoltick dd ? ; tick counter for envelope position |
.envvolpos dd ? ; envelope position |
.envvoldelta dd ? ; delta step between points |
.envpantick dd ? ; tick counter for envelope position |
.envpanpos dd ? ; envelope position |
.envpandelta dd ? ; delta step between points |
.ivibsweeppos dd ? ; instrument vibrato sweep position |
.ivibpos dd ? ; instrument vibrato position |
.keyoff db ?,? ; flag whether keyoff has been hit or not |
.envvolstopped db ? ; flag to say whether envelope has finished or not |
.envpanstopped db ? ; flag to say whether envelope has finished or not |
; .:. |
|
.envvolfrac dd ? ; fractional interpolated envelope volume |
.envvol dd ? ; final interpolated envelope volume |
.fadeoutvol dd ? ; volume fade out |
.envpanfrac dd ? ; fractional interpolated envelope pan |
.envpan dd ? ; final interpolated envelope pan |
.period dd ? ; last period set in channel |
.sampleoffset dd ? ; sample offset for this channel in SAMPLES |
.portatarget dd ? ; note to porta to |
.patloopno db ?,?,?,? ; pattern loop variables for effect E6x |
.patlooprow dd ? |
.realnote db ? ; last realnote set in channel |
.recenteffect db ? ; previous row's effect... used to correct tremolo volume |
.portaupdown db ? ; last porta up/down value |
db ? ; unused |
.xtraportadown db ? ; last porta down value |
.xtraportaup db ? ; last porta up value |
.volslide db ? ; last volume slide value |
.panslide db ? ; pan slide parameter |
.retrigx db ? ; last retrig volume slide used |
.retrigy db ? ; last retrig tick count used |
.portaspeed db ? ; porta speed |
.vibpos db ? ; vibrato position |
.vibspeed db ? ; vibrato speed |
.vibdepth db ? ; vibrato depth |
.tremolopos db ? ; tremolo position |
.tremolospeed db ? ; tremolo speed |
.tremolodepth db ? ; tremolo depth |
.tremorpos db ? ; tremor position |
.tremoron db ? ; remembered parameters for tremor |
.tremoroff db ? ; remembered parameters for tremor |
.wavecontrol db ? ; waveform type for vibrato and tremolo (4bits each) |
.finevslup db ? ; parameter for fine volume slide down |
.fineportaup db ? ; parameter for fine porta slide up |
.fineportadown db ? ; parameter for fine porta slide down |
} |
virtual at 0 |
FMUSIC_CHANNEL FMUSIC_CHANNEL |
FMUSIC_CHANNEL_size = $-FMUSIC_CHANNEL |
end virtual |
|
; Song type - contains info on song |
struc FMUSIC_MODULE{ |
|
; Don't change order .:. |
.pattern dd ? ; pointer to FMUSIC_PATTERN array for this song |
.instrument dd ? ; pointer to FMUSIC_INSTRUMENT array for this song |
.mixer_samplesleft dd ? |
.globalvolume dd ? ; global mod volume |
.tick dd ? ; current mod tick |
.speed dd ? ; speed of song in ticks per row |
.order dd ? ; current song order position |
.row dd ? ; current row in pattern |
.patterndelay dd ? ; pattern delay counter |
.nextorder dd ? ; current song order position |
.nextrow dd ? ; current row in pattern |
.unused1 dd ? |
.numchannels dd ? ; number of channels |
.Channels dd ? ; channel pool |
.uFMOD_Ch dd ? ; channel array for this song |
.mixer_samplespertick dd ? |
.numorders dw ? ; number of orders (song length) |
.restart dw ? ; restart position |
.numchannels_xm db ? |
.globalvsl db ? ; global mod volume |
.numpatternsmem dw ? ; number of allocated patterns |
.numinsts dw ? ; number of instruments |
.flags dw ? ; flags such as linear frequency, format specific quirks, etc |
.defaultspeed dw ? |
.defaultbpm dw ? |
.orderlist rb 256 ; pattern playing order list |
; .:. |
|
} |
virtual at 0 |
FMUSIC_MODULE FMUSIC_MODULE |
FMUSIC_MODULE_size = $-FMUSIC_MODULE |
end virtual |
|
OFFSET equ |
PTR equ |
endif equ end if |
|
include 'ufmod.asm' |
include 'core.asm' |
|
if NOLINKER |
uFMOD_IMG_END: ; End of uFMOD's code. BSS follows. |
align 16 |
else |
section '.bss' readable writeable align 16 |
end if |
|
; Don't change order! |
_mod rb FMUSIC_MODULE_size ; currently playing track |
mmt rd 3 |
ufmod_heap dd ? |
dd ? ; unused |
if AC97SND_ON |
extrn hSound |
dd ? |
else |
hSound dd ? |
endif |
hBuff dd ? |
SW_Exit dd ? |
; mix buffer memory block (align 16!) |
MixBuf rb FSOUND_BlockSize*8 |
ufmod_noloop db ? |
ufmod_pause_ db ? |
mix_endflag rb 2 |
mmf rd 4 |
ufmod_vol dd ? ; global volume scale |
; * LPCALLBACKS * |
uFMOD_fopen dd ? |
uFMOD_fread dd ? |
file_struct rd 7 |
cache_offset dd ? |
if INFO_API_ON |
time_ms dd ? |
L_vol dw ? ; L channel RMS volume |
R_vol dw ? ; R channel RMS volume |
s_row dw ? |
s_order dw ? |
szTtl rb 24 |
end if |
DummySamp rb FSOUND_SAMPLE_size |