// File: /workspace/github_cpp_makefile_star2_O3/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 0x3983
movq %rsi, %r14
xorl %eax, %eax
movss 0x6d30(%rip), %xmm4     # 0xa010
movl $0x3ff, %r13d           # imm = 0x3FF
movss 0x6d32(%rip), %xmm5     # 0xa020
leaq 0xa21b(%rip), %r15      # 0xd510
leaq 0x6e44(%rip), %rbp      # 0xa140
leaq 0xb21d(%rip), %rbx      # 0xe520
cmpb $0x1, 0xa19a(%rip)      # 0xd4a4
jne 0x3983
movq %rax, 0x20(%rsp)
movl 0xb2b1(%rip), %eax      # 0xe5cc
incl %eax
movl %eax, 0xb2a9(%rip)      # 0xe5cc
movl 0xb2a7(%rip), %ecx      # 0xe5d0
testl %ecx, %ecx
sete %dl
cmpl %ecx, %eax
setl %al
orb %dl, %al
jne 0x335b
movl $0x0, 0xb28b(%rip)      # 0xe5cc
movl $0x1, %edi
callq 0x2e5c
movss 0x6ccd(%rip), %xmm5     # 0xa020
movss 0x6cb5(%rip), %xmm4     # 0xa010
movl 0xb273(%rip), %eax      # 0xe5d4
incl %eax
movl %eax, 0xb26b(%rip)      # 0xe5d4
movl 0xb269(%rip), %ecx      # 0xe5d8
testl %ecx, %ecx
sete %dl
cmpl %ecx, %eax
setl %al
orb %dl, %al
movsd 0xa12d(%rip), %xmm0     # 0xd4b0
jne 0x3397
movl $0x0, 0xb249(%rip)      # 0xe5d8
mulsd 0xb249(%rip), %xmm0     # 0xe5e0
movsd 0xa129(%rip), %xmm1     # 0xd4c8
addsd 0xa119(%rip), %xmm1     # 0xd4c0
movsd %xmm1, 0xa111(%rip)     # 0xd4c0
mulsd %xmm0, %xmm1
movsd %xmm1, 0xa0f5(%rip)     # 0xd4b0
movsd 0xa0f5(%rip), %xmm0     # 0xd4b8
ucomisd %xmm0, %xmm1
jbe 0x33ed
movsd %xmm0, 0xa0df(%rip)     # 0xd4b0
movss 0xa06f(%rip), %xmm1     # 0xd448
ucomiss 0x6c84(%rip), %xmm1     # 0xa064
jbe 0x33e9
movb $0x0, 0xa0bb(%rip)      # 0xd4a4
movapd %xmm0, %xmm1
movss 0xb1d3(%rip), %xmm0     # 0xe5c8
ucomiss 0x6c68(%rip), %xmm0     # 0xa064
jbe 0x344f
movss 0xb1be(%rip), %xmm0     # 0xe5c4
addss 0xb1b2(%rip), %xmm0     # 0xe5c0
movss %xmm0, 0xb1aa(%rip)     # 0xe5c0
movsd %xmm1, 0x10(%rsp)
callq 0x21e0
movsd 0x10(%rsp), %xmm1
movss 0x6bf1(%rip), %xmm5     # 0xa020
movss 0x6bd9(%rip), %xmm4     # 0xa010
mulss 0xb189(%rip), %xmm0     # 0xe5c8
cvtss2sd %xmm0, %xmm0
addsd 0x6c9d(%rip), %xmm0     # 0xa0e8
mulsd %xmm0, %xmm1
xorps %xmm0, %xmm0
cvtsd2ss %xmm1, %xmm0
cvttss2si %xmm0, %esi
cmpl $0x9, %esi
movl $0x8, %eax
cmovll %eax, %esi
movss 0xa06b(%rip), %xmm0     # 0xd4d8
addss 0xa05f(%rip), %xmm0     # 0xd4d4
movl %esi, 0xa055(%rip)      # 0xd4d0
xorps %xmm1, %xmm1
maxss %xmm0, %xmm1
movss 0x6b7e(%rip), %xmm0     # 0xa008
minss %xmm1, %xmm0
movss %xmm0, 0xa03e(%rip)     # 0xd4d4
movl 0xa044(%rip), %edx      # 0xd4e0
leal 0x1(%rdx), %eax
movl %eax, 0xa03b(%rip)      # 0xd4e0
movslq 0xa030(%rip), %rcx      # 0xd4dc
leaq 0xa035(%rip), %rdi      # 0xd4e8
cmpl (%rdi,%rcx,4), %edx
jl 0x34dd
movl $0x0, 0xa01e(%rip)      # 0xd4e0
incl %ecx
movl %ecx, 0xa012(%rip)      # 0xd4dc
xorl %eax, %eax
cmpl $0x3, %ecx
jne 0x34dd
movb $0x0, 0x9fcc(%rip)      # 0xd4a4
jmp 0x355f
cmpl $0x2, %ecx
je 0x353a
cmpl $0x1, %ecx
je 0x350b
testl %ecx, %ecx
jne 0x355f
xorps %xmm0, %xmm0
cvtsi2ss %eax, %xmm0
xorps %xmm1, %xmm1
cvtsi2ssl 0x9feb(%rip), %xmm1 # 0xd4e8
divss %xmm1, %xmm0
movss %xmm0, 0x9feb(%rip)     # 0xd4f4
jmp 0x355f
xorps %xmm0, %xmm0
cvtsi2ss %eax, %xmm0
xorps %xmm1, %xmm1
cvtsi2ssl 0x9fcf(%rip), %xmm1 # 0xd4ec
divss %xmm1, %xmm0
movaps %xmm4, %xmm1
subss %xmm0, %xmm1
addss %xmm1, %xmm1
mulss 0x9f40(%rip), %xmm1     # 0xd474
addss %xmm4, %xmm1
jmp 0x3557
xorps %xmm0, %xmm0
cvtsi2ss %eax, %xmm0
xorps %xmm1, %xmm1
cvtsi2ssl 0x9fa4(%rip), %xmm1 # 0xd4f0
divss %xmm1, %xmm0
movaps %xmm4, %xmm1
subss %xmm0, %xmm1
movss %xmm1, 0x9f95(%rip)     # 0xd4f4
movq %r14, 0x30(%rsp)
movss 0x9f90(%rip), %xmm0     # 0xd4fc
addss 0x9f84(%rip), %xmm0     # 0xd4f8
cvttss2si %xmm0, %eax
movl %eax, %ecx
negl %ecx
cmovsl %eax, %ecx
movss %xmm0, 0x9f71(%rip)     # 0xd4f8
cmpl %r13d, %ecx
cmovael %r13d, %ecx
movl %ecx, 0x9f6c(%rip)      # 0xd500
movss 0xb020(%rip), %xmm0     # 0xe5bc
ucomiss 0x6ac1(%rip), %xmm0     # 0xa064
jne 0x35a7
jnp 0x35d2
mulss 0xb009(%rip), %xmm0     # 0xe5b8
movss 0x6a91(%rip), %xmm1     # 0xa048
maxss %xmm0, %xmm1
movss %xmm1, 0xaff5(%rip)     # 0xe5b8
ucomiss %xmm5, %xmm1
jbe 0x35d2
movl $0x3dcccccd, 0xafe6(%rip) # imm = 0x3DCCCCCD
movl 0x9ed0(%rip), %ecx      # 0xd4a8
xorps %xmm6, %xmm6
xorl %r14d, %r14d
movl 0x9e5c(%rip), %edi      # 0xd440
incl %ecx
movl %ecx, 0x9ebc(%rip)      # 0xd4a8
cmpl %esi, %ecx
jl 0x368f
movl %ecx, %eax
cltd
idivl %esi
movl %edx, %ecx
movl %edx, 0x9ea7(%rip)      # 0xd4a8
cmpl $0x3, %edi
jne 0x368f
movss %xmm6, 0x10(%rsp)
xorl %r12d, %r12d
callq 0x20c0
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 0x69bc(%rip), %xmm0     # 0xa004
addss %xmm0, %xmm0
addss 0x69f0(%rip), %xmm0     # 0xa044
movss %xmm0, (%r12,%rbx)
addq $0x4, %r12
cmpq $0x80, %r12
jne 0x3613
movl 0x9dd3(%rip), %edi      # 0xd440
movl 0x9e35(%rip), %ecx      # 0xd4a8
movl 0x9e57(%rip), %esi      # 0xd4d0
movss 0x698f(%rip), %xmm4     # 0xa010
movss 0x6997(%rip), %xmm5     # 0xa020
movss 0x10(%rsp), %xmm6
xorps %xmm7, %xmm7
cmpl $0x3, %edi
ja 0x3748
xorps %xmm1, %xmm1
cvtsi2ss %ecx, %xmm1
xorps %xmm0, %xmm0
cvtsi2ss %esi, %xmm0
divss %xmm0, %xmm1
movl %edi, %eax
movslq (%rbp,%rax,4), %rax
addq %rbp, %rax
jmpq *%rax
movss 0x9e13(%rip), %xmm0     # 0xd4d4
xorl %eax, %eax
ucomiss %xmm1, %xmm0
seta %al
leaq 0x6a38(%rip), %rdx      # 0xa108
movss (%rdx,%rax,4), %xmm0
xorl %edi, %edi
jmp 0x374b
addss %xmm1, %xmm1
mulss 0x6967(%rip), %xmm1     # 0xa04c
movaps %xmm1, %xmm0
movss %xmm6, 0x10(%rsp)
callq 0x21e0
xorps %xmm7, %xmm7
movss 0x10(%rsp), %xmm6
movss 0x691c(%rip), %xmm5     # 0xa020
movss 0x6904(%rip), %xmm4     # 0xa010
movl 0x9d96(%rip), %ecx      # 0xd4a8
movl 0x9db8(%rip), %esi      # 0xd4d0
movl 0x9d22(%rip), %edi      # 0xd440
jmp 0x374b
movl %ecx, %eax
shll $0x5, %eax
cltd
idivl %esi
cltq
movss (%rbx,%rax,4), %xmm0
movl $0x3, %edi
jmp 0x374b
addss %xmm1, %xmm1
movaps %xmm4, %xmm0
subss %xmm1, %xmm0
movl $0x1, %edi
jmp 0x374b
xorps %xmm0, %xmm0
movss 0xae4d(%rip), %xmm1     # 0xe5a0
movss 0xae51(%rip), %xmm2     # 0xe5ac
mulss 0xae45(%rip), %xmm2     # 0xe5a8
xorps %xmm3, %xmm3
maxss %xmm2, %xmm3
movaps %xmm5, %xmm2
minss %xmm3, %xmm2
movss %xmm2, 0xae2f(%rip)     # 0xe5a8
movss 0x9cff(%rip), %xmm3     # 0xd480
ucomiss %xmm4, %xmm3
jne 0x3788
jnp 0x37ae
subss %xmm1, %xmm0
mulss %xmm2, %xmm0
addss 0xae0c(%rip), %xmm0     # 0xe5a4
movss 0xae10(%rip), %xmm2     # 0xe5b0
mulss %xmm0, %xmm2
movaps %xmm0, %xmm7
subss %xmm2, %xmm7
movaps %xmm1, %xmm0
movss %xmm7, 0xadee(%rip)     # 0xe5a4
addss %xmm7, %xmm0
movss %xmm0, 0xadde(%rip)     # 0xe5a0
subss %xmm1, %xmm0
addss 0xade6(%rip), %xmm0     # 0xe5b4
movss 0xade2(%rip), %xmm1     # 0xe5b8
mulss %xmm0, %xmm1
subss %xmm1, %xmm0
movl 0xad2c(%rip), %eax      # 0xe510
movl %eax, %edx
andl %r13d, %edx
movss %xmm0, (%r15,%rdx,4)
movl %eax, %edx
subl 0x9d09(%rip), %edx      # 0xd500
movss %xmm0, 0xadb5(%rip)     # 0xe5b4
andl %r13d, %edx
addss (%r15,%rdx,4), %xmm0
incl %eax
andl %r13d, %eax
mulss 0x9cdf(%rip), %xmm0     # 0xd4f4
movl %eax, 0xacf5(%rip)      # 0xe510
addss %xmm0, %xmm6
incl %r14d
cmpl $0x8, %r14d
jne 0x35e4
mulss 0x681c(%rip), %xmm6     # 0xa050
mulss 0x9a4c(%rip), %xmm6     # 0xd288
movss 0x9a48(%rip), %xmm0     # 0xd28c
addss %xmm0, %xmm0
mulss %xmm6, %xmm0
movq 0x30(%rsp), %r14
testq %r14, %r14
je 0x3874
movaps %xmm4, %xmm1
minss %xmm0, %xmm1
movss 0x67df(%rip), %xmm0     # 0xa044
maxss %xmm1, %xmm0
movss %xmm0, (%r14)
addq $0x4, %r14
jmp 0x3877
xorl %r14d, %r14d
movq 0x20(%rsp), %rax
cmpq $0x0, 0x18(%rsp)
je 0x3977
mulss 0x67c4(%rip), %xmm0     # 0xa054
movaps %xmm4, %xmm1
minss %xmm0, %xmm1
movss 0x67a5(%rip), %xmm0     # 0xa044
maxss %xmm1, %xmm0
addss 0xad49(%rip), %xmm0     # 0xe5f4
movss %xmm0, 0xad41(%rip)     # 0xe5f4
movl 0xad3f(%rip), %eax      # 0xe5f8
incl %eax
movl %eax, 0xad37(%rip)      # 0xe5f8
cmpl $0xac44, 0x99cd(%rip)   # imm = 0xAC44
sete %cl
cmpl $0x2, %eax
sete %dl
orb %cl, %dl
cmpb $0x1, %dl
jne 0x396c
xorps %xmm1, %xmm1
cvtsi2ss %eax, %xmm1
divss %xmm1, %xmm0
movss %xmm0, 0xad02(%rip)     # 0xe5f4
movl $0x0, 0xacfc(%rip)      # 0xe5f8
cmpl $0x10, 0x9991(%rip)     # 0xd294
jne 0x3931
mulss 0x6753(%rip), %xmm0     # 0xa060
cvttss2si %xmm0, %eax
movw %ax, 0xe(%rsp)
movl $0x1, %esi
movl $0x2, %edx
leaq 0xe(%rsp), %rdi
movq 0x18(%rsp), %rcx
callq 0x24e0
jmp 0x3952
mulss 0x671f(%rip), %xmm0     # 0xa058
addss 0x671b(%rip), %xmm0     # 0xa05c
cvttss2si %xmm0, %eax
movsbl %al, %edi
movq 0x18(%rsp), %rsi
callq 0x2340
movl $0x0, 0xac98(%rip)      # 0xe5f4
movss 0x66ac(%rip), %xmm4     # 0xa010
movss 0x66b4(%rip), %xmm5     # 0xa020
incl 0xac7e(%rip)            # 0xe5f0
movq 0x20(%rsp), %rax
incl %eax
cmpl 0x2c(%rsp), %eax
jne 0x3303
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq