// File: /workspace/github_cpp_makefile_star2_O2/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)
movq %rsi, 0x20(%rsp)
xorl %ebx, %ebx
testl %edi, %edi
cmovlel %ebx, %edi
movl %edi, 0x2c(%rsp)
movl $0x3ff, %r13d           # imm = 0x3FF
leaq 0x936a(%rip), %r15      # 0xd530
leaq 0x4f63(%rip), %rbp      # 0x9130
leaq 0xa36c(%rip), %r12      # 0xe540
cmpl 0x2c(%rsp), %ebx
je 0x479c
cmpb $0x1, 0x92df(%rip)      # 0xd4c4
jne 0x479c
movl 0xa3fb(%rip), %eax      # 0xe5ec
incl %eax
movl %eax, 0xa3f3(%rip)      # 0xe5ec
movl 0xa3f1(%rip), %ecx      # 0xe5f0
testl %ecx, %ecx
sete %dl
cmpl %ecx, %eax
setl %al
orb %dl, %al
jne 0x421c
andl $0x0, 0xa3d8(%rip)      # 0xe5ec
pushq $0x1
popq %rdi
callq 0x3d73
movl 0xa3d2(%rip), %eax      # 0xe5f4
incl %eax
movl %eax, 0xa3ca(%rip)      # 0xe5f4
movl 0xa3c8(%rip), %ecx      # 0xe5f8
testl %ecx, %ecx
sete %dl
cmpl %ecx, %eax
setl %al
orb %dl, %al
movsd 0x928c(%rip), %xmm0     # 0xd4d0
jne 0x4255
andl $0x0, 0xa3ab(%rip)      # 0xe5f8
mulsd 0xa3ab(%rip), %xmm0     # 0xe600
movsd 0x928b(%rip), %xmm1     # 0xd4e8
addsd 0x927b(%rip), %xmm1     # 0xd4e0
movsd %xmm1, 0x9273(%rip)     # 0xd4e0
mulsd %xmm0, %xmm1
movsd %xmm1, 0x9257(%rip)     # 0xd4d0
movsd 0x9257(%rip), %xmm0     # 0xd4d8
ucomisd %xmm0, %xmm1
jbe 0x42ab
movsd %xmm0, 0x9241(%rip)     # 0xd4d0
movss 0x91d1(%rip), %xmm1     # 0xd468
ucomiss 0x4dca(%rip), %xmm1     # 0x9068
jbe 0x42a7
movb $0x0, 0x921d(%rip)      # 0xd4c4
movapd %xmm0, %xmm1
movss 0xa335(%rip), %xmm0     # 0xe5e8
ucomiss 0x4dae(%rip), %xmm0     # 0x9068
jbe 0x42fd
movss 0xa320(%rip), %xmm0     # 0xe5e4
addss 0xa314(%rip), %xmm0     # 0xe5e0
movss %xmm0, 0xa30c(%rip)     # 0xe5e0
movsd %xmm1, 0x10(%rsp)
callq 0x3210
movsd 0x10(%rsp), %xmm1
mulss 0xa2fb(%rip), %xmm0     # 0xe5e8
cvtss2sd %xmm0, %xmm0
addsd 0x4de7(%rip), %xmm0     # 0x90e0
mulsd %xmm0, %xmm1
cvtsd2ss %xmm1, %xmm0
cvttss2si %xmm0, %eax
cmpl $0x9, %eax
pushq $0x8
popq %rcx
cmovll %ecx, %eax
movss 0x91e2(%rip), %xmm0     # 0xd4f8
addss 0x91d6(%rip), %xmm0     # 0xd4f4
movl %eax, 0x91cc(%rip)      # 0xd4f0
xorps %xmm1, %xmm1
maxss %xmm0, %xmm1
movss 0x4cd5(%rip), %xmm0     # 0x9008
minss %xmm1, %xmm0
movss %xmm0, 0x91b5(%rip)     # 0xd4f4
movl 0x91bb(%rip), %edx      # 0xd500
leal 0x1(%rdx), %ecx
movl %ecx, 0x91b2(%rip)      # 0xd500
movslq 0x91a7(%rip), %rax      # 0xd4fc
leaq 0x91ac(%rip), %rsi      # 0xd508
cmpl (%rsi,%rax,4), %edx
jl 0x4380
andl $0x0, 0x9198(%rip)      # 0xd500
incl %eax
movl %eax, 0x918c(%rip)      # 0xd4fc
xorl %ecx, %ecx
cmpl $0x3, %eax
jne 0x4380
movb $0x0, 0x9146(%rip)      # 0xd4c4
jmp 0x43f5
cvtsi2ss %ecx, %xmm0
cmpl $0x2, %eax
je 0x43d5
cmpl $0x1, %eax
je 0x43a8
testl %eax, %eax
jne 0x43f5
cvtsi2ssl 0x916e(%rip), %xmm1 # 0xd508
divss %xmm1, %xmm0
movss %xmm0, 0x916e(%rip)     # 0xd514
jmp 0x43f5
cvtsi2ssl 0x915c(%rip), %xmm1 # 0xd50c
divss %xmm1, %xmm0
movss 0x4c54(%rip), %xmm2     # 0x9010
movaps %xmm2, %xmm1
subss %xmm0, %xmm1
addss %xmm1, %xmm1
mulss 0x90c5(%rip), %xmm1     # 0xd494
addss %xmm2, %xmm1
jmp 0x43ed
cvtsi2ssl 0x9133(%rip), %xmm1 # 0xd510
divss %xmm1, %xmm0
movss 0x4c27(%rip), %xmm1     # 0x9010
subss %xmm0, %xmm1
movss %xmm1, 0x911f(%rip)     # 0xd514
movq %rbx, 0x30(%rsp)
movss 0x911a(%rip), %xmm0     # 0xd51c
addss 0x910e(%rip), %xmm0     # 0xd518
cvttss2si %xmm0, %eax
movl %eax, %ecx
negl %ecx
cmovsl %eax, %ecx
movss %xmm0, 0x90fb(%rip)     # 0xd518
cmpl %r13d, %ecx
cmovael %r13d, %ecx
movl %ecx, 0x90f6(%rip)      # 0xd520
movss 0xa1aa(%rip), %xmm0     # 0xe5dc
ucomiss 0x4c2f(%rip), %xmm0     # 0x9068
jne 0x443d
jnp 0x446c
mulss 0xa193(%rip), %xmm0     # 0xe5d8
movss 0x4bff(%rip), %xmm1     # 0x904c
maxss %xmm0, %xmm1
movss %xmm1, 0xa17f(%rip)     # 0xe5d8
ucomiss 0x4bc0(%rip), %xmm1     # 0x9020
jbe 0x446c
movl $0x3dcccccd, 0xa16c(%rip) # imm = 0x3DCCCCCD
xorl %ebx, %ebx
xorps %xmm0, %xmm0
movss %xmm0, 0x10(%rsp)
cmpl $0x8, %ebx
je 0x4656
movl 0x9042(%rip), %eax      # 0xd4c8
incl %eax
movl %eax, 0x903a(%rip)      # 0xd4c8
movl 0x905c(%rip), %ecx      # 0xd4f0
movl 0x8fc6(%rip), %esi      # 0xd460
cmpl %ecx, %eax
jl 0x44ed
cltd
idivl %ecx
movl %edx, %eax
movl %edx, 0x901f(%rip)      # 0xd4c8
cmpl $0x3, %esi
jne 0x44ed
xorl %r14d, %r14d
cmpq $0x80, %r14
je 0x44db
movss 0x4b82(%rip), %xmm0     # 0x9044
callq 0x370c
addss 0x4b79(%rip), %xmm0     # 0x9048
movss %xmm0, (%r14,%r12)
addq $0x4, %r14
jmp 0x44b1
movl 0x8f7f(%rip), %esi      # 0xd460
movl 0x8fe1(%rip), %eax      # 0xd4c8
movl 0x9003(%rip), %ecx      # 0xd4f0
xorps %xmm4, %xmm4
xorps %xmm0, %xmm0
cmpl $0x3, %esi
ja 0x4566
cvtsi2ss %eax, %xmm0
cvtsi2ss %ecx, %xmm1
divss %xmm1, %xmm0
movl %esi, %edx
movslq (%rbp,%rdx,4), %rdx
addq %rbp, %rdx
movaps %xmm0, %xmm1
addss %xmm0, %xmm1
jmpq *%rdx
movss 0x8fd5(%rip), %xmm1     # 0xd4f4
xorl %eax, %eax
ucomiss %xmm0, %xmm1
seta %al
leaq 0x4bd2(%rip), %rcx      # 0x9100
movss (%rcx,%rax,4), %xmm0
jmp 0x4566
mulss 0x4b13(%rip), %xmm1     # 0x9050
movaps %xmm1, %xmm0
callq 0x3210
xorps %xmm4, %xmm4
jmp 0x4566
shll $0x5, %eax
cltd
idivl %ecx
cltq
movss (%r12,%rax,4), %xmm0
jmp 0x4566
movss 0x4aae(%rip), %xmm0     # 0x9010
subss %xmm1, %xmm0
movss 0xa052(%rip), %xmm1     # 0xe5c0
movss 0xa056(%rip), %xmm2     # 0xe5cc
mulss 0xa04a(%rip), %xmm2     # 0xe5c8
xorps %xmm3, %xmm3
maxss %xmm2, %xmm3
movss 0x4a93(%rip), %xmm2     # 0x9020
minss %xmm3, %xmm2
movss %xmm2, 0xa02f(%rip)     # 0xe5c8
movss 0x8eff(%rip), %xmm3     # 0xd4a0
ucomiss 0x4a68(%rip), %xmm3     # 0x9010
jne 0x45ac
jnp 0x45d2
subss %xmm1, %xmm0
mulss %xmm2, %xmm0
addss 0xa008(%rip), %xmm0     # 0xe5c4
movss 0xa00c(%rip), %xmm2     # 0xe5d0
mulss %xmm0, %xmm2
movaps %xmm0, %xmm4
subss %xmm2, %xmm4
movaps %xmm1, %xmm0
addss %xmm4, %xmm0
movss %xmm0, 0x9fe2(%rip)     # 0xe5c0
subss %xmm1, %xmm0
addss 0x9fea(%rip), %xmm0     # 0xe5d4
movss 0x9fe6(%rip), %xmm1     # 0xe5d8
mulss %xmm0, %xmm1
subss %xmm1, %xmm0
movl 0x9f30(%rip), %eax      # 0xe530
movl %eax, %ecx
andl %r13d, %ecx
movss %xmm0, (%r15,%rcx,4)
movl %eax, %ecx
subl 0x8f0d(%rip), %ecx      # 0xd520
movss %xmm0, 0x9fb9(%rip)     # 0xe5d4
andl %r13d, %ecx
addss (%r15,%rcx,4), %xmm0
movss %xmm4, 0x9f98(%rip)     # 0xe5c4
incl %eax
andl %r13d, %eax
movl %eax, 0x9ef9(%rip)      # 0xe530
mulss 0x8ed5(%rip), %xmm0     # 0xd514
movss 0x10(%rsp), %xmm1
addss %xmm0, %xmm1
movss %xmm1, 0x10(%rsp)
incl %ebx
jmp 0x4477
movss 0x10(%rsp), %xmm1
mulss 0x49f0(%rip), %xmm1     # 0x9054
mulss 0x8c44(%rip), %xmm1     # 0xd2b0
movss 0x8c40(%rip), %xmm0     # 0xd2b4
addss %xmm0, %xmm0
mulss %xmm1, %xmm0
movq 0x20(%rsp), %rax
testq %rax, %rax
je 0x46ad
movss 0x4982(%rip), %xmm1     # 0x9010
minss %xmm0, %xmm1
movss 0x49ae(%rip), %xmm0     # 0x9048
maxss %xmm1, %xmm0
movss %xmm0, (%rax)
addq $0x4, %rax
movq %rax, 0x20(%rsp)
jmp 0x46b6
movq $0x0, 0x20(%rsp)
movq 0x30(%rsp), %rbx
cmpq $0x0, 0x18(%rsp)
je 0x4795
mulss 0x4989(%rip), %xmm0     # 0x9058
movss 0x4939(%rip), %xmm1     # 0x9010
minss %xmm0, %xmm1
movss 0x4965(%rip), %xmm0     # 0x9048
maxss %xmm1, %xmm0
addss 0x9f25(%rip), %xmm0     # 0xe614
movss %xmm0, 0x9f1d(%rip)     # 0xe614
movl 0x9f1b(%rip), %eax      # 0xe618
incl %eax
movl %eax, 0x9f13(%rip)      # 0xe618
cmpl $0xac44, 0x8bb1(%rip)   # imm = 0xAC44
sete %cl
cmpl $0x2, %eax
sete %dl
orb %cl, %dl
cmpb $0x1, %dl
jne 0x478f
cvtsi2ss %eax, %xmm1
andl $0x0, 0x9eee(%rip)      # 0xe618
divss %xmm1, %xmm0
movss %xmm0, 0x9ede(%rip)     # 0xe614
cmpl $0x10, 0x8b7f(%rip)     # 0xd2bc
jne 0x4767
mulss 0x491d(%rip), %xmm0     # 0x9064
cvttss2si %xmm0, %eax
movw %ax, 0xe(%rsp)
leaq 0xe(%rsp), %rdi
pushq $0x1
popq %rsi
pushq $0x2
popq %rdx
movq 0x18(%rsp), %rcx
callq 0x3510
jmp 0x4788
mulss 0x48ed(%rip), %xmm0     # 0x905c
addss 0x48e9(%rip), %xmm0     # 0x9060
cvttss2si %xmm0, %eax
movsbl %al, %edi
movq 0x18(%rsp), %rsi
callq 0x3360
andl $0x0, 0x9e85(%rip)      # 0xe614
incl 0x9e7b(%rip)            # 0xe610
incl %ebx
jmp 0x41d4
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq