; NASM.ASM
; --------
; uFMOD public source code release. Provided as-is.

; *** This stub allows compiling uFMOD sources using NASM.
; Everything documented in fasm stub!

; %error directive in NASM causes multiple prompts to appear due to
; multiple passes :( So, we'd better avoid using %error.

ifdef f44100
	FSOUND_MixRate equ 44100
	FREQ_40HZ_p    equ 1DB8Bh
	FREQ_40HZ_f    equ 3B7160h
	PCM_format     equ 3
else
	ifdef f22050
		FSOUND_MixRate equ 22050
		FREQ_40HZ_p    equ 3B716h
		FREQ_40HZ_f    equ 76E2C0h
		PCM_format     equ 9
	else
		FSOUND_MixRate equ 48000
		FREQ_40HZ_p    equ 1B4E8h
		FREQ_40HZ_f    equ 369D00h
		PCM_format     equ 1
	endif
endif

ifdef NONE
	RAMP_NONE   equ 1
	RAMP_WEAK   equ 0
	RAMP_STRONG equ 0
else
	ifdef WEAK
		RAMP_NONE   equ 0
		RAMP_WEAK   equ 1
		RAMP_STRONG equ 0
	else
		RAMP_NONE   equ 0
		RAMP_WEAK   equ 0
		RAMP_STRONG equ 1
	endif
endif

UCODE equ 0

ifdef NODEBUG
	DEBUG equ 0
else
	DEBUG equ 1
endif

ifdef UNSAFE
	CHK4VALIDITY equ 0
	AC97SND_ON   equ 0
else
	CHK4VALIDITY equ 1
	ifdef AC97SND
		AC97SND_ON equ 1
	else
		AC97SND_ON equ 0
	endif
endif

ifndef NOLINKER
	%include "eff.inc"

	[segment .text align=4]
endif

STRUC FSOUND_SAMPLE
	FSOUND_SAMPLE._length   resd 1
	FSOUND_SAMPLE.loopstart resd 1
	FSOUND_SAMPLE.looplen   resd 1
	FSOUND_SAMPLE.defvol    resb 1
	FSOUND_SAMPLE.finetune  resb 1
	FSOUND_SAMPLE.bytes     resb 1
	FSOUND_SAMPLE.defpan    resb 1
	FSOUND_SAMPLE.relative  resb 1
	FSOUND_SAMPLE.Resved    resb 1
	FSOUND_SAMPLE.loopmode  resb 1
	FSOUND_SAMPLE._align    resb 1
	FSOUND_SAMPLE.buff      resb 2
ENDSTRUC

STRUC FSOUND_CHANNEL
	FSOUND_CHANNEL.actualvolume     resd 1
	FSOUND_CHANNEL.actualpan        resd 1
	FSOUND_CHANNEL.fsampleoffset    resd 1
	FSOUND_CHANNEL.leftvolume       resd 1
	FSOUND_CHANNEL.rightvolume      resd 1
	FSOUND_CHANNEL.mixpos           resd 1
	FSOUND_CHANNEL.speedlo          resd 1
	FSOUND_CHANNEL.speedhi          resd 1
	FSOUND_CHANNEL.ramp_lefttarget  resw 1
	FSOUND_CHANNEL.ramp_righttarget resw 1
	FSOUND_CHANNEL.ramp_leftspeed   resd 1
	FSOUND_CHANNEL.ramp_rightspeed  resd 1
	FSOUND_CHANNEL.fsptr            resd 1
	FSOUND_CHANNEL.mixposlo         resd 1
	FSOUND_CHANNEL.ramp_leftvolume  resd 1
	FSOUND_CHANNEL.ramp_rightvolume resd 1
	FSOUND_CHANNEL.ramp_count       resw 1
	FSOUND_CHANNEL.speeddir         resb 2
ENDSTRUC

STRUC FMUSIC_NOTE
	FMUSIC_NOTE.unote   resb 1
	FMUSIC_NOTE.number  resb 1
	FMUSIC_NOTE.uvolume resb 1
	FMUSIC_NOTE.effect  resb 1
	FMUSIC_NOTE.eparam  resb 1
ENDSTRUC

STRUC FMUSIC_PATTERN
	FMUSIC_PATTERN.rows        resw 1
	FMUSIC_PATTERN.patternsize resw 1
	FMUSIC_PATTERN.data        resd 1
ENDSTRUC

STRUC FMUSIC_INSTRUMENT
	FMUSIC_INSTRUMENT.sample       resd 16
	FMUSIC_INSTRUMENT.keymap       resb 96
	FMUSIC_INSTRUMENT.VOLPoints    resw 24
	FMUSIC_INSTRUMENT.PANPoints    resw 24
	FMUSIC_INSTRUMENT.VOLnumpoints resb 1
	FMUSIC_INSTRUMENT.PANnumpoints resb 1
	FMUSIC_INSTRUMENT.VOLsustain   resb 1
	FMUSIC_INSTRUMENT.VOLLoopStart resb 1
	FMUSIC_INSTRUMENT.VOLLoopEnd   resb 1
	FMUSIC_INSTRUMENT.PANsustain   resb 1
	FMUSIC_INSTRUMENT.PANLoopStart resb 1
	FMUSIC_INSTRUMENT.PANLoopEnd   resb 1
	FMUSIC_INSTRUMENT.VOLtype      resb 1
	FMUSIC_INSTRUMENT.PANtype      resb 1
	FMUSIC_INSTRUMENT.VIBtype      resb 1
	FMUSIC_INSTRUMENT.VIBsweep     resb 1
	FMUSIC_INSTRUMENT.iVIBdepth    resb 1
	FMUSIC_INSTRUMENT.VIBrate      resb 1
	FMUSIC_INSTRUMENT.VOLfade      resw 1
ENDSTRUC

STRUC FMUSIC_CHANNEL
	FMUSIC_CHANNEL.note          resb 1
	FMUSIC_CHANNEL.samp          resb 1
	FMUSIC_CHANNEL.notectrl      resb 1
	FMUSIC_CHANNEL.inst          resb 1
	FMUSIC_CHANNEL.cptr          resd 1
	FMUSIC_CHANNEL.freq          resd 1
	FMUSIC_CHANNEL.volume        resd 1
	FMUSIC_CHANNEL.voldelta      resd 1
	FMUSIC_CHANNEL.freqdelta     resd 1
	FMUSIC_CHANNEL.pan           resd 1
	FMUSIC_CHANNEL.envvoltick    resd 1
	FMUSIC_CHANNEL.envvolpos     resd 1
	FMUSIC_CHANNEL.envvoldelta   resd 1
	FMUSIC_CHANNEL.envpantick    resd 1
	FMUSIC_CHANNEL.envpanpos     resd 1
	FMUSIC_CHANNEL.envpandelta   resd 1
	FMUSIC_CHANNEL.ivibsweeppos  resd 1
	FMUSIC_CHANNEL.ivibpos       resd 1
	FMUSIC_CHANNEL.keyoff        resb 2
	FMUSIC_CHANNEL.envvolstopped resb 1
	FMUSIC_CHANNEL.envpanstopped resb 1
	FMUSIC_CHANNEL.envvolfrac    resd 1
	FMUSIC_CHANNEL.envvol        resd 1
	FMUSIC_CHANNEL.fadeoutvol    resd 1
	FMUSIC_CHANNEL.envpanfrac    resd 1
	FMUSIC_CHANNEL.envpan        resd 1
	FMUSIC_CHANNEL.period        resd 1
	FMUSIC_CHANNEL.sampleoffset  resd 1
	FMUSIC_CHANNEL.portatarget   resd 1
	FMUSIC_CHANNEL.patloopno     resb 4
	FMUSIC_CHANNEL.patlooprow    resd 1
	FMUSIC_CHANNEL.realnote      resb 1
	FMUSIC_CHANNEL.recenteffect  resb 1
	FMUSIC_CHANNEL.portaupdown   resb 2
	FMUSIC_CHANNEL.xtraportadown resb 1
	FMUSIC_CHANNEL.xtraportaup   resb 1
	FMUSIC_CHANNEL.volslide      resb 1
	FMUSIC_CHANNEL.panslide      resb 1
	FMUSIC_CHANNEL.retrigx       resb 1
	FMUSIC_CHANNEL.retrigy       resb 1
	FMUSIC_CHANNEL.portaspeed    resb 1
	FMUSIC_CHANNEL.vibpos        resb 1
	FMUSIC_CHANNEL.vibspeed      resb 1
	FMUSIC_CHANNEL.vibdepth      resb 1
	FMUSIC_CHANNEL.tremolopos    resb 1
	FMUSIC_CHANNEL.tremolospeed  resb 1
	FMUSIC_CHANNEL.tremolodepth  resb 1
	FMUSIC_CHANNEL.tremorpos     resb 1
	FMUSIC_CHANNEL.tremoron      resb 1
	FMUSIC_CHANNEL.tremoroff     resb 1
	FMUSIC_CHANNEL.wavecontrol   resb 1
	FMUSIC_CHANNEL.finevslup     resb 1
	FMUSIC_CHANNEL.fineportaup   resb 1
	FMUSIC_CHANNEL.fineportadown resb 1
ENDSTRUC

STRUC FMUSIC_MODULE
	FMUSIC_MODULE.pattern              resd 1
	FMUSIC_MODULE.instrument           resd 1
	FMUSIC_MODULE.mixer_samplesleft    resd 1
	FMUSIC_MODULE.globalvolume         resd 1
	FMUSIC_MODULE.tick                 resd 1
	FMUSIC_MODULE.speed                resd 1
	FMUSIC_MODULE.order                resd 1
	FMUSIC_MODULE.row                  resd 1
	FMUSIC_MODULE.patterndelay         resd 1
	FMUSIC_MODULE.nextorder            resd 1
	FMUSIC_MODULE.nextrow              resd 1
	FMUSIC_MODULE.unused1              resd 1
	FMUSIC_MODULE.numchannels          resd 1
	FMUSIC_MODULE.Channels             resd 1
	FMUSIC_MODULE.uFMOD_Ch             resd 1
	FMUSIC_MODULE.mixer_samplespertick resd 1
	FMUSIC_MODULE.numorders            resw 1
	FMUSIC_MODULE.restart              resw 1
	FMUSIC_MODULE.numchannels_xm       resb 1
	FMUSIC_MODULE.globalvsl            resb 1
	FMUSIC_MODULE.numpatternsmem       resw 1
	FMUSIC_MODULE.numinsts             resw 1
	FMUSIC_MODULE.flags                resw 1
	FMUSIC_MODULE.defaultspeed         resw 1
	FMUSIC_MODULE.defaultbpm           resw 1
	FMUSIC_MODULE.orderlist            resb 256
ENDSTRUC

%macro PUBLIC 1
	ifndef NOLINKER
		GLOBAL %1
	endif
%endmacro
%define OFFSET
%define PTR

include "ufmod.asm"
include "core.asm"

ifdef NOLINKER
	uFMOD_IMG_END: ; End of uFMOD's code. BSS follows.
	align 16
	[segment .bss]
else
	[segment .bss align=16]
endif

_mod          resb FMUSIC_MODULE_size
mmt           resd 3
ufmod_heap    resd 2
if AC97SND_ON
	extern hSound
	      resd 1
else
	hSound resd 1
endif
hBuff         resd 1
SW_Exit       resd 1
MixBuf        resb FSOUND_BlockSize*8
ufmod_noloop  resb 1
ufmod_pause_  resb 1
mix_endflag   resb 2
mmf           resd 4
ufmod_vol     resd 1
uFMOD_fopen   resd 1
uFMOD_fread   resd 1
file_struct   resd 7
cache_offset  resd 1
if INFO_API_ON
	time_ms   resd 1
	L_vol     resw 1
	R_vol     resw 1
	s_row     resw 1
	s_order   resw 1
	szTtl     resb 24
endif
DummySamp resb FSOUND_SAMPLE_size