// File: probonopd[P]decodeir/DecodeIR.cpp
// Function: Signal::trySony()
void Signal::trySony()
// Sony8  {40k,600}<1,-1|2,-1>(4,-1,F:8,^22200)
// Sony12 {40k,600}<1,-1|2,-1>(4,-1,F:7,D:5,^45m)+
// Sony15 {40k,600}<1,-1|2,-1>(4,-1,F:7,D:8,^45m)+
// Sony20 {40k,600}<1,-1|2,-1>(4,-1,F:7,D:5,S:8,^45m)+
{

	switch (nFrameL)
	{
		case 9:
            require( sortBurst.max2 < 3.3*600 )
            require( sortBurst.max1 < 5.5*600 )
			// max content = .6*(5+8*3) = 17.4m
			// min leadout = (22.2 - 17.4)/.6 = 8 units
			require( framed( max( nMaxDur*1.5, pFrame[1]*6.) ) )
			break;
		case 13:
			// Max content = .6*(5+12*3) = 24.6ms
			// Min leadout = (45-24.6)/.6 = 34 units
			require( framed(nMaxDur*7) )
			break;
		case 16:
			// Max content = .6*(5+15*3) = 30ms
			// Min leadout = (45-30)/.6 = 25 units
			require( framed( max( nMaxDur*1.5, pFrame[1]*6.) ) )
			break;
		case 21:
			// Max content = .6*(5+20*3) = 39ms
			// Min leadout = (45-39)/.6 = 10 units
			require( framed(nMaxDur*2) )
			break;
		default:
			require( false );
	}
	require( sortOff.min1 > 0.8*600)  // DAR 2012 avoid misdecode from Humax 4Phase
    float bigBurst = sortBurst.max2;
    float smallBurst = sortBurst.min1;
    float firstBurst = pFrame[0]+pFrame[1];
    if ( firstBurst > bigBurst )
    {
        require( sortBurst.max1 * (2. / 6) < smallBurst )  // Lead in too big
    }
    else
    {
        if ( firstBurst < sortBurst.min2 )
            smallBurst = sortBurst.min2;
        bigBurst = sortBurst.max1;
        require( bigBurst < 2350. )  // Avoid misdecode from RC5
    }

    require( bigBurst * (2. / 3.6) < smallBurst )  // Larger burst too big

    require( sortOff.min1*1.6 > sortOff.max1 )  // All but terminal gap should be the same size

                                    // bigBurst is nominal 3
	nMaxShort = bigBurst*(5./6);    // nMaxShort is nominal 2.5

	// If all the pulses are the same size, fall back on expected timing
	if ( nMaxShort < smallBurst )
	{
		require( pFrame[0]+pFrame[1] > 3.3*600 )
		require( bigBurst < 3.3*600 )
        require( smallBurst > 1.5*600 )
		nMaxShort = 1500;
	}

	cleanup();
	pBit+=2;
	decodeX2( nFrameL-2 );  // Can't use off half of last bit
	if ( pBit[0]*(2.5/1.33) > nMaxShort )   // Last On is nominal 1 or 2, but bias for battery problems
	{
		cBits[nBit>>3] |= 1 << (nBit & 7);
	}
	
	sprintf(pProtocol, "Sony%d", nFrameL-1);
	if (nFrameL == 9)
	{
		*pOBC = cBits[0];
		return;
	}
	newPreemptValue = prBySony; 	// Avoid Async decode of same frame
	newPreemptLength = nFrameL;
	*pOBC = getLsb(0,7);
	pHex[0] = msb(*pOBC);
	if (nFrameL <= 16 )
	{
		*pDevice = getLsb(7, nFrameL-8);
		pHex[1] = pHex[0]+1;
	}
	else
	{
		*pDevice = getLsb(7, 5);
		*pSubDevice = getLsb(12, 8);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x48(%rbp)
movl 0x48(%rax), %eax
addl $-0x9, %eax
movl %eax, %ecx
movq %rcx, -0x40(%rbp)
subl $0xc, %eax
ja 0x12337
movq -0x40(%rbp), %rax
leaq 0x868c(%rip), %rcx      # 0x1a840
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x48(%rbp), %rax
movss 0x1e0(%rax), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x84fb(%rip), %xmm0     # 0x1a6d0
ucomisd %xmm1, %xmm0
ja 0x121e0
jmp 0x126ce
movq -0x48(%rbp), %rax
movss 0x1dc(%rax), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x84e0(%rip), %xmm0     # 0x1a6d8
ucomisd %xmm1, %xmm0
ja 0x12203
jmp 0x126ce
movq -0x48(%rbp), %rax
movss 0x9c(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8075(%rip), %xmm1     # 0x1a290
mulsd %xmm1, %xmm0
movsd %xmm0, -0x10(%rbp)
movq 0x38(%rax), %rax
movss 0x4(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x81c7(%rip), %xmm1     # 0x1a400
mulsd %xmm1, %xmm0
movsd %xmm0, -0x18(%rbp)
leaq -0x10(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0x18af0
movq -0x48(%rbp), %rdi
movsd (%rax), %xmm0
cvtsd2ss %xmm0, %xmm0
callq 0x18840
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x1226e
jmp 0x12273
jmp 0x126ce
jmp 0x1233c
movq -0x48(%rbp), %rdi
movss 0x7da4(%rip), %xmm0     # 0x1a028
mulss 0x9c(%rdi), %xmm0
callq 0x18840
cmpl $0x0, %eax
jne 0x1229b
jmp 0x126ce
jmp 0x1233c
movq -0x48(%rbp), %rax
movss 0x9c(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x7fd8(%rip), %xmm1     # 0x1a290
mulsd %xmm1, %xmm0
movsd %xmm0, -0x20(%rbp)
movq 0x38(%rax), %rax
movss 0x4(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x812a(%rip), %xmm1     # 0x1a400
mulsd %xmm1, %xmm0
movsd %xmm0, -0x28(%rbp)
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x18af0
movq -0x48(%rbp), %rdi
movsd (%rax), %xmm0
cvtsd2ss %xmm0, %xmm0
callq 0x18840
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x1230b
jmp 0x12310
jmp 0x126ce
jmp 0x1233c
movq -0x48(%rbp), %rdi
movss 0x7cf6(%rip), %xmm0     # 0x1a014
mulss 0x9c(%rdi), %xmm0
callq 0x18840
cmpl $0x0, %eax
jne 0x12335
jmp 0x126ce
jmp 0x1233c
jmp 0x126ce
movq -0x48(%rbp), %rax
movss 0x18c(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x838c(%rip), %xmm1     # 0x1a6e0
ucomisd %xmm1, %xmm0
ja 0x1235f
jmp 0x126ce
movq -0x48(%rbp), %rax
movss 0x1e0(%rax), %xmm0
movss %xmm0, -0x2c(%rbp)
movss 0x1d0(%rax), %xmm0
movss %xmm0, -0x30(%rbp)
movq 0x38(%rax), %rcx
movss (%rcx), %xmm0
movq 0x38(%rax), %rax
addss 0x4(%rax), %xmm0
movss %xmm0, -0x34(%rbp)
movss -0x34(%rbp), %xmm0
ucomiss -0x2c(%rbp), %xmm0
jbe 0x123d0
movq -0x48(%rbp), %rax
movss 0x1dc(%rax), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x833a(%rip), %xmm0     # 0x1a6f0
mulsd %xmm0, %xmm1
movss -0x30(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
ucomisd %xmm1, %xmm0
ja 0x123ce
jmp 0x126ce
jmp 0x12426
movq -0x48(%rbp), %rax
movss -0x34(%rbp), %xmm1
movss 0x1cc(%rax), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x123f7
movq -0x48(%rbp), %rax
movss 0x1cc(%rax), %xmm0
movss %xmm0, -0x30(%rbp)
movq -0x48(%rbp), %rax
movss 0x1dc(%rax), %xmm0
movss %xmm0, -0x2c(%rbp)
movss -0x2c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x82cf(%rip), %xmm0     # 0x1a6e8
ucomisd %xmm1, %xmm0
ja 0x12424
jmp 0x126ce
jmp 0x12426
movss -0x2c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x7ff9(%rip), %xmm0     # 0x1a430
mulsd %xmm0, %xmm1
movss -0x30(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
ucomisd %xmm1, %xmm0
ja 0x1244f
jmp 0x126ce
movq -0x48(%rbp), %rax
movss 0x18c(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x7eb1(%rip), %xmm1     # 0x1a318
mulsd %xmm1, %xmm0
movss 0x190(%rax), %xmm1
cvtss2sd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
ja 0x12482
jmp 0x126ce
movq -0x48(%rbp), %rax
movss -0x2c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8261(%rip), %xmm1     # 0x1a6f8
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0xe8(%rax)
movss 0xe8(%rax), %xmm1
movss -0x30(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x12531
movq -0x48(%rbp), %rax
movq 0x38(%rax), %rcx
movss (%rcx), %xmm0
movq 0x38(%rax), %rax
addss 0x4(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x81f6(%rip), %xmm1     # 0x1a6d0
ucomisd %xmm1, %xmm0
ja 0x124e5
jmp 0x126ce
movss -0x2c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x81da(%rip), %xmm0     # 0x1a6d0
ucomisd %xmm1, %xmm0
ja 0x12501
jmp 0x126ce
movss -0x30(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x7dee(%rip), %xmm1     # 0x1a300
ucomisd %xmm1, %xmm0
ja 0x1251d
jmp 0x126ce
movq -0x48(%rbp), %rax
movss 0x7c27(%rip), %xmm0     # 0x1a150
movss %xmm0, 0xe8(%rax)
movq -0x48(%rbp), %rdi
callq 0x16180
movq -0x48(%rbp), %rdi
movq 0xc8(%rdi), %rax
addq $0x8, %rax
movq %rax, 0xc8(%rdi)
movl 0x48(%rdi), %esi
subl $0x2, %esi
callq 0x162c0
movq -0x48(%rbp), %rax
movq 0xc8(%rax), %rcx
movss (%rcx), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x818a(%rip), %xmm1     # 0x1a700
mulsd %xmm1, %xmm0
movss 0xe8(%rax), %xmm1
cvtss2sd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x125bd
movq -0x48(%rbp), %rax
movl 0xc0(%rax), %ecx
andl $0x7, %ecx
movl $0x1, %esi
shll %cl, %esi
movl 0xc0(%rax), %ecx
sarl $0x3, %ecx
movslq %ecx, %rcx
movzbl 0xa0(%rax,%rcx), %edx
orl %esi, %edx
movb %dl, 0xa0(%rax,%rcx)
movq -0x48(%rbp), %rax
movq 0x148(%rax), %rdi
movl 0x48(%rax), %edx
subl $0x1, %edx
leaq 0x8b0a(%rip), %rsi      # 0x1b0df
movb $0x0, %al
callq 0x2060
movq -0x48(%rbp), %rax
cmpl $0x9, 0x48(%rax)
jne 0x125ff
movq -0x48(%rbp), %rax
movzbl 0xa0(%rax), %ecx
movq 0x170(%rax), %rax
movl %ecx, (%rax)
jmp 0x126ce
movq -0x48(%rbp), %rdi
movl $0x2, 0x5c(%rdi)
movl 0x48(%rdi), %eax
movl %eax, 0x58(%rdi)
xorl %esi, %esi
movl $0x7, %edx
callq 0x16030
movq -0x48(%rbp), %rdi
movl %eax, %ecx
movq 0x170(%rdi), %rax
movl %ecx, (%rax)
movq 0x170(%rdi), %rax
movl (%rax), %esi
movl $0x8, %edx
callq 0x15e70
movl %eax, %edx
movq -0x48(%rbp), %rax
movq 0x178(%rax), %rcx
movl %edx, (%rcx)
cmpl $0x10, 0x48(%rax)
jg 0x1268e
movq -0x48(%rbp), %rdi
movl 0x48(%rdi), %edx
subl $0x8, %edx
movl $0x7, %esi
callq 0x16030
movl %eax, %edx
movq -0x48(%rbp), %rax
movq 0x160(%rax), %rcx
movl %edx, (%rcx)
movq 0x178(%rax), %rcx
movl (%rcx), %ecx
addl $0x1, %ecx
movq 0x178(%rax), %rax
movl %ecx, 0x4(%rax)
jmp 0x126ce
movq -0x48(%rbp), %rdi
movl $0x7, %esi
movl $0x5, %edx
callq 0x16030
movq -0x48(%rbp), %rdi
movl %eax, %ecx
movq 0x160(%rdi), %rax
movl %ecx, (%rax)
movl $0xc, %esi
movl $0x8, %edx
callq 0x16030
movl %eax, %ecx
movq -0x48(%rbp), %rax
movq 0x168(%rax), %rax
movl %ecx, (%rax)
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)