Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  343.