// File: /workspace/github_cpp_makefile_star2_O1/tjohnman[P]sfxr-sdl2/build/../src/main.cpp
// Function: SynthSample(int, float*, _IO_FILE*)
void SynthSample(int length, float* buffer, FILE* file)
{
	for(int i=0;i<length;i++)
	{
		if(!playing_sample)
			break;

		rep_time++;
		if(rep_limit!=0 && rep_time>=rep_limit)
		{
			rep_time=0;
			ResetSample(true);
		}

		// frequency envelopes/arpeggios
		arp_time++;
		if(arp_limit!=0 && arp_time>=arp_limit)
		{
			arp_limit=0;
			fperiod*=arp_mod;
		}
		fslide+=fdslide;
		fperiod*=fslide;
		if(fperiod>fmaxperiod)
		{
			fperiod=fmaxperiod;
			if(p_freq_limit>0.0f)
				playing_sample=false;
		}
		float rfperiod=fperiod;
		if(vib_amp>0.0f)
		{
			vib_phase+=vib_speed;
			rfperiod=fperiod*(1.0+sin(vib_phase)*vib_amp);
		}
		period=(int)rfperiod;
		if(period<8) period=8;
		square_duty+=square_slide;
		if(square_duty<0.0f) square_duty=0.0f;
		if(square_duty>0.5f) square_duty=0.5f;		
		// volume envelope
		env_time++;
		if(env_time>env_length[env_stage])
		{
			env_time=0;
			env_stage++;
			if(env_stage==3)
				playing_sample=false;
		}
		if(env_stage==0)
			env_vol=(float)env_time/env_length[0];
		if(env_stage==1)
			env_vol=1.0f+pow(1.0f-(float)env_time/env_length[1], 1.0f)*2.0f*p_env_punch;
		if(env_stage==2)
			env_vol=1.0f-(float)env_time/env_length[2];

		// phaser step
		fphase+=fdphase;
		iphase=abs((int)fphase);
		if(iphase>1023) iphase=1023;

		if(flthp_d!=0.0f)
		{
			flthp*=flthp_d;
			if(flthp<0.00001f) flthp=0.00001f;
			if(flthp>0.1f) flthp=0.1f;
		}

		float ssample=0.0f;
		for(int si=0;si<8;si++) // 8x supersampling
		{
			float sample=0.0f;
			phase++;
			if(phase>=period)
			{
//				phase=0;
				phase%=period;
				if(wave_type==3)
					for(int i=0;i<32;i++)
						noise_buffer[i]=frnd(2.0f)-1.0f;
			}
			// base waveform
			float fp=(float)phase/period;
			switch(wave_type)
			{
			case 0: // square
				if(fp<square_duty)
					sample=0.5f;
				else
					sample=-0.5f;
				break;
			case 1: // sawtooth
				sample=1.0f-fp*2;
				break;
			case 2: // sine
				sample=(float)sin(fp*2*PI);
				break;
			case 3: // noise
				sample=noise_buffer[phase*32/period];
				break;
			}
			// lp filter
			float pp=fltp;
			fltw*=fltw_d;
			if(fltw<0.0f) fltw=0.0f;
			if(fltw>0.1f) fltw=0.1f;
			if(p_lpf_freq!=1.0f)
			{
				fltdp+=(sample-fltp)*fltw;
				fltdp-=fltdp*fltdmp;
			}
			else
			{
				fltp=sample;
				fltdp=0.0f;
			}
			fltp+=fltdp;
			// hp filter
			fltphp+=fltp-pp;
			fltphp-=fltphp*flthp;
			sample=fltphp;
			// phaser
			phaser_buffer[ipp&1023]=sample;
			sample+=phaser_buffer[(ipp-iphase+1024)&1023];
			ipp=(ipp+1)&1023;
			// final accumulation and envelope application
			ssample+=sample*env_vol;
		}
		ssample=ssample/8*master_vol;

		ssample*=2.0f*sound_vol;

		if(buffer!=NULL)
		{
			if(ssample>1.0f) ssample=1.0f;
			if(ssample<-1.0f) ssample=-1.0f;
			*buffer++=ssample;
		}
		if(file!=NULL)
		{
			// quantize depending on format
			// accumulate/count to accomodate variable sample rate?
			ssample*=4.0f; // arbitrary gain to get reasonable output volume...
			if(ssample>1.0f) ssample=1.0f;
			if(ssample<-1.0f) ssample=-1.0f;
			filesample+=ssample;
			fileacc++;
			if(wav_freq==44100 || fileacc==2)
			{
				filesample/=fileacc;
				fileacc=0;
				if(wav_bits==16)
				{
					short isample=(short)(filesample*32000);
					fwrite(&isample, 1, 2, file);
				}
				else
				{
					unsigned char isample=(unsigned char)(filesample*127+128);
					fwrite(&isample, 1, 1, file);
				}
				filesample=0.0f;
			}
			file_sampleswritten++;
		}
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rdx, 0x18(%rsp)
movl %edi, 0x2c(%rsp)
testl %edi, %edi
jle 0x3977
movq %rsi, %r14
xorl %eax, %eax
movl $0x3ff, %r13d           # imm = 0x3FF
leaq 0xa20b(%rip), %r15      # 0xd500
movss 0x6d47(%rip), %xmm4     # 0xa044
leaq 0x6e2c(%rip), %rbp      # 0xa130
leaq 0xb205(%rip), %rbx      # 0xe510
cmpb $0x1, 0xa192(%rip)      # 0xd4a4
jne 0x3977
movq %rax, 0x20(%rsp)
movl 0xb299(%rip), %eax      # 0xe5bc
incl %eax
movl %eax, 0xb291(%rip)      # 0xe5bc
movl 0xb28f(%rip), %ecx      # 0xe5c0
testl %ecx, %ecx
sete %dl
cmpl %ecx, %eax
setl %al
orb %dl, %al
jne 0x335b
movl $0x0, 0xb273(%rip)      # 0xe5bc
movl $0x1, %edi
callq 0x2e5c
movss 0x6ce9(%rip), %xmm4     # 0xa044
movl 0xb263(%rip), %eax      # 0xe5c4
incl %eax
movl %eax, 0xb25b(%rip)      # 0xe5c4
movl 0xb259(%rip), %ecx      # 0xe5c8
testl %ecx, %ecx
sete %dl
cmpl %ecx, %eax
setl %al
orb %dl, %al
jne 0x339f
movl $0x0, 0xb241(%rip)      # 0xe5c8
movsd 0xb241(%rip), %xmm0     # 0xe5d0
mulsd 0xa119(%rip), %xmm0     # 0xd4b0
movsd %xmm0, 0xa111(%rip)     # 0xd4b0
movsd 0xa121(%rip), %xmm1     # 0xd4c8
addsd 0xa111(%rip), %xmm1     # 0xd4c0
movsd %xmm1, 0xa109(%rip)     # 0xd4c0
mulsd 0xa0f1(%rip), %xmm1     # 0xd4b0
movsd %xmm1, 0xa0e9(%rip)     # 0xd4b0
movsd 0xa0e9(%rip), %xmm0     # 0xd4b8
ucomisd %xmm0, %xmm1
jbe 0x33f5
movsd %xmm0, 0xa0d3(%rip)     # 0xd4b0
movss 0xa063(%rip), %xmm0     # 0xd448
ucomiss 0x6c78(%rip), %xmm0     # 0xa064
jbe 0x33f5
movb $0x0, 0xa0af(%rip)      # 0xd4a4
movsd 0xa0b3(%rip), %xmm1     # 0xd4b0
movss 0xb1b3(%rip), %xmm0     # 0xe5b8
ucomiss 0x6c58(%rip), %xmm0     # 0xa064
jbe 0x3457
movss 0xb19e(%rip), %xmm0     # 0xe5b4
addss 0xb192(%rip), %xmm0     # 0xe5b0
movss %xmm0, 0xb18a(%rip)     # 0xe5b0
movsd %xmm1, 0x8(%rsp)
callq 0x21e0
movsd 0x8(%rsp), %xmm1
movss 0x6c05(%rip), %xmm4     # 0xa044
mulss 0xb171(%rip), %xmm0     # 0xe5b8
cvtss2sd %xmm0, %xmm0
addsd 0x6c95(%rip), %xmm0     # 0xa0e8
mulsd %xmm0, %xmm1
xorps %xmm0, %xmm0
cvtsd2ss %xmm1, %xmm0
cvttss2si %xmm0, %eax
cmpl $0x9, %eax
movl $0x8, %ecx
cmovll %ecx, %eax
movss 0xa063(%rip), %xmm0     # 0xd4d8
addss 0xa057(%rip), %xmm0     # 0xd4d4
movl %eax, 0xa04d(%rip)      # 0xd4d0
xorps %xmm1, %xmm1
maxss %xmm0, %xmm1
movss 0x6b76(%rip), %xmm0     # 0xa008
minss %xmm1, %xmm0
movss %xmm0, 0xa036(%rip)     # 0xd4d4
movl 0xa03c(%rip), %ecx      # 0xd4e0
leal 0x1(%rcx), %eax
movl %eax, 0xa033(%rip)      # 0xd4e0
movslq 0xa028(%rip), %rax      # 0xd4dc
leaq 0xa029(%rip), %rdx      # 0xd4e4
cmpl (%rdx,%rax,4), %ecx
jl 0x34de
movl $0x0, 0xa016(%rip)      # 0xd4e0
incl %eax
movl %eax, 0xa00a(%rip)      # 0xd4dc
cmpl $0x3, %eax
jne 0x34de
movb $0x0, 0x9fc6(%rip)      # 0xd4a4
movl 0x9ff8(%rip), %eax      # 0xd4dc
cmpl $0x1, %eax
je 0x3509
testl %eax, %eax
jne 0x354a
xorps %xmm0, %xmm0
cvtsi2ssl 0x9fe8(%rip), %xmm0 # 0xd4e0
xorps %xmm1, %xmm1
cvtsi2ssl 0x9fe1(%rip), %xmm1 # 0xd4e4
divss %xmm1, %xmm0
jmp 0x3542
xorps %xmm1, %xmm1
cvtsi2ssl 0x9fcc(%rip), %xmm1 # 0xd4e0
xorps %xmm0, %xmm0
cvtsi2ssl 0x9fc9(%rip), %xmm0 # 0xd4e8
divss %xmm0, %xmm1
movss 0x6ae5(%rip), %xmm2     # 0xa010
movaps %xmm2, %xmm0
subss %xmm1, %xmm0
addss %xmm0, %xmm0
mulss 0x9f36(%rip), %xmm0     # 0xd474
addss %xmm2, %xmm0
movss %xmm0, 0x9fa6(%rip)     # 0xd4f0
cmpl $0x2, 0x9f8b(%rip)      # 0xd4dc
jne 0x3581
xorps %xmm0, %xmm0
cvtsi2ssl 0x9f82(%rip), %xmm0 # 0xd4e0
xorps %xmm1, %xmm1
cvtsi2ssl 0x9f83(%rip), %xmm1 # 0xd4ec
divss %xmm1, %xmm0
movss 0x6a9b(%rip), %xmm1     # 0xa010
subss %xmm0, %xmm1
movss %xmm1, 0x9f6f(%rip)     # 0xd4f0
movq %r14, 0x30(%rsp)
movss 0x9f6a(%rip), %xmm0     # 0xd4f8
addss 0x9f5e(%rip), %xmm0     # 0xd4f4
cvttss2si %xmm0, %eax
movl %eax, %ecx
negl %ecx
cmovsl %eax, %ecx
movss %xmm0, 0x9f4b(%rip)     # 0xd4f4
cmpl %r13d, %ecx
cmovael %r13d, %ecx
movl %ecx, 0x9f46(%rip)      # 0xd4fc
movss 0xafee(%rip), %xmm0     # 0xe5ac
ucomiss 0x6a9f(%rip), %xmm0     # 0xa064
jne 0x35c9
jnp 0x35f8
mulss 0xafd7(%rip), %xmm0     # 0xe5a8
movss 0x6a6f(%rip), %xmm1     # 0xa048
maxss %xmm0, %xmm1
movss %xmm1, 0xafc3(%rip)     # 0xe5a8
ucomiss 0x6a34(%rip), %xmm1     # 0xa020
jbe 0x35f8
movl $0x3dcccccd, 0xafb0(%rip) # imm = 0x3DCCCCCD
xorps %xmm5, %xmm5
xorl %r14d, %r14d
movss %xmm5, 0x8(%rsp)
movl 0x9e9e(%rip), %eax      # 0xd4a8
incl %eax
movl %eax, 0x9e96(%rip)      # 0xd4a8
movl 0x9eb8(%rip), %ecx      # 0xd4d0
cmpl %ecx, %eax
jl 0x368d
cltd
idivl %ecx
movl %edx, 0x9e83(%rip)      # 0xd4a8
cmpl $0x3, 0x9e14(%rip)      # 0xd440
jne 0x368d
xorl %r12d, %r12d
callq 0x20c0
movss 0x69c6(%rip), %xmm1     # 0xa004
movss 0x69fe(%rip), %xmm4     # 0xa044
cltq
imulq $-0x2e4e46e7, %rax, %rcx # imm = 0xD1B1B919
shrq $0x20, %rcx
addl %eax, %ecx
movl %ecx, %edx
shrl $0x1f, %edx
sarl $0xd, %ecx
addl %edx, %ecx
imull $0x2711, %ecx, %ecx     # imm = 0x2711
subl %ecx, %eax
xorps %xmm0, %xmm0
cvtsi2ss %eax, %xmm0
divss %xmm1, %xmm0
addss %xmm0, %xmm0
addss %xmm4, %xmm0
movss %xmm0, (%r12,%rbx)
addq $0x4, %r12
cmpq $0x80, %r12
jne 0x3631
movl 0x9dad(%rip), %edx      # 0xd440
cmpq $0x3, %rdx
ja 0x3722
movl 0x9e05(%rip), %eax      # 0xd4a8
xorps %xmm1, %xmm1
cvtsi2ss %eax, %xmm1
movl 0x9e20(%rip), %ecx      # 0xd4d0
xorps %xmm0, %xmm0
cvtsi2ss %ecx, %xmm0
divss %xmm0, %xmm1
movslq (%rbp,%rdx,4), %rdx
addq %rbp, %rdx
jmpq *%rdx
movss 0x9e07(%rip), %xmm0     # 0xd4d4
xorl %eax, %eax
ucomiss %xmm1, %xmm0
seta %al
leaq 0x6a2c(%rip), %rcx      # 0xa108
movss (%rcx,%rax,4), %xmm0
jmp 0x3725
addss %xmm1, %xmm1
mulss 0x695d(%rip), %xmm1     # 0xa04c
movaps %xmm1, %xmm0
callq 0x21e0
movss 0x6945(%rip), %xmm4     # 0xa044
jmp 0x3725
shll $0x5, %eax
cltd
idivl %ecx
cltq
movss (%rbx,%rax,4), %xmm0
jmp 0x3725
addss %xmm1, %xmm1
movss 0x68f4(%rip), %xmm0     # 0xa010
subss %xmm1, %xmm0
jmp 0x3725
xorps %xmm0, %xmm0
movss 0x8(%rsp), %xmm5
movss 0xae5d(%rip), %xmm1     # 0xe590
movss 0xae61(%rip), %xmm2     # 0xe59c
mulss 0xae55(%rip), %xmm2     # 0xe598
xorps %xmm3, %xmm3
maxss %xmm2, %xmm3
movss 0x68ce(%rip), %xmm2     # 0xa020
minss %xmm3, %xmm2
movss %xmm2, 0xae3a(%rip)     # 0xe598
movss 0x9d1a(%rip), %xmm3     # 0xd480
ucomiss 0x68a3(%rip), %xmm3     # 0xa010
jne 0x3771
jnp 0x379b
subss %xmm1, %xmm0
mulss %xmm2, %xmm0
addss 0xae13(%rip), %xmm0     # 0xe594
movss %xmm0, 0xae0b(%rip)     # 0xe594
movss 0xae0f(%rip), %xmm2     # 0xe5a0
mulss %xmm0, %xmm2
subss %xmm2, %xmm0
jmp 0x37a6
movss %xmm0, 0xaded(%rip)     # 0xe590
xorps %xmm0, %xmm0
movss %xmm0, 0xade6(%rip)     # 0xe594
addss 0xadda(%rip), %xmm0     # 0xe590
movss %xmm0, 0xadd2(%rip)     # 0xe590
subss %xmm1, %xmm0
addss 0xadda(%rip), %xmm0     # 0xe5a4
movss 0xadd6(%rip), %xmm1     # 0xe5a8
mulss %xmm0, %xmm1
subss %xmm1, %xmm0
movl 0xad20(%rip), %eax      # 0xe500
movl %eax, %ecx
andl %r13d, %ecx
movss %xmm0, (%r15,%rcx,4)
movl %eax, %ecx
subl 0x9d09(%rip), %ecx      # 0xd4fc
movss %xmm0, 0xada9(%rip)     # 0xe5a4
andl %r13d, %ecx
addss (%r15,%rcx,4), %xmm0
incl %eax
andl %r13d, %eax
mulss 0x9cdf(%rip), %xmm0     # 0xd4f0
movl %eax, 0xace9(%rip)      # 0xe500
addss %xmm0, %xmm5
incl %r14d
cmpl $0x8, %r14d
jne 0x35fe
mulss 0x6820(%rip), %xmm5     # 0xa050
mulss 0x9a50(%rip), %xmm5     # 0xd288
movss 0x9a4c(%rip), %xmm0     # 0xd28c
addss %xmm0, %xmm0
mulss %xmm5, %xmm0
movq 0x30(%rsp), %r14
testq %r14, %r14
je 0x3870
movss 0x67b6(%rip), %xmm1     # 0xa010
minss %xmm0, %xmm1
movaps %xmm4, %xmm0
maxss %xmm1, %xmm0
movss %xmm0, (%r14)
addq $0x4, %r14
jmp 0x3873
xorl %r14d, %r14d
movq 0x20(%rsp), %rax
cmpq $0x0, 0x18(%rsp)
je 0x396b
mulss 0x67c8(%rip), %xmm0     # 0xa054
movss 0x677c(%rip), %xmm1     # 0xa010
minss %xmm0, %xmm1
movaps %xmm4, %xmm0
maxss %xmm1, %xmm0
addss 0xad3d(%rip), %xmm0     # 0xe5e4
movss %xmm0, 0xad35(%rip)     # 0xe5e4
movl 0xad33(%rip), %eax      # 0xe5e8
incl %eax
movl %eax, 0xad2b(%rip)      # 0xe5e8
cmpl $0xac44, 0x99d1(%rip)   # imm = 0xAC44
sete %cl
cmpl $0x2, %eax
sete %dl
orb %cl, %dl
cmpb $0x1, %dl
jne 0x3960
xorps %xmm1, %xmm1
cvtsi2ss %eax, %xmm1
divss %xmm1, %xmm0
movss %xmm0, 0xacf6(%rip)     # 0xe5e4
movl $0x0, 0xacf0(%rip)      # 0xe5e8
cmpl $0x10, 0x9995(%rip)     # 0xd294
jne 0x392d
mulss 0x6757(%rip), %xmm0     # 0xa060
cvttss2si %xmm0, %eax
movw %ax, 0x16(%rsp)
movl $0x1, %esi
movl $0x2, %edx
leaq 0x16(%rsp), %rdi
movq 0x18(%rsp), %rcx
callq 0x24e0
jmp 0x394e
mulss 0x6723(%rip), %xmm0     # 0xa058
addss 0x671f(%rip), %xmm0     # 0xa05c
cvttss2si %xmm0, %eax
movsbl %al, %edi
movq 0x18(%rsp), %rsi
callq 0x2340
movl $0x0, 0xac8c(%rip)      # 0xe5e4
movss 0x66e4(%rip), %xmm4     # 0xa044
incl 0xac7a(%rip)            # 0xe5e0
movq 0x20(%rsp), %rax
incl %eax
cmpl 0x2c(%rsp), %eax
jne 0x330b
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq