user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<sq905c_first_decompress>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %rdi,-0x88(%rbp)
  mov    %rsi,-0x90(%rbp)
  mov    %edx,-0x94(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movb   $0x0,-0x79(%rbp)
  movb   $0x0,-0x78(%rbp)
  movb   $0x0,-0x77(%rbp)
  movb   $0x0,-0x76(%rbp)
  movl   $0x0,-0x74(%rbp)
  movl   $0x0,-0x70(%rbp)
  movl   $0x0,-0x6c(%rbp)
  movl   $0x8,-0x68(%rbp)
  movl   $0x0,-0x64(%rbp)
  movl   $0xffffffff,-0x60(%rbp)
  movl   $0x0,-0x5c(%rbp)
  movl   $0x2,-0x58(%rbp)
  movl   $0x6,-0x54(%rbp)
  movl   $0xe,-0x50(%rbp)
  movl   $0xe,-0x4c(%rbp)
  movl   $0xe,-0x48(%rbp)
  movl   $0xe,-0x44(%rbp)
  movl   $0xfb,-0x40(%rbp)
  movabs $0xf3f2f1f00e060200,%rax
  movabs $0xfbfaf9f8f7f6f5f4,%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
  movabs $0xd0c0b0a06090708,%rax
  movabs $0x1020304050f0e,%rdx
  mov    %rax,-0x20(%rbp)
  mov    %rdx,-0x18(%rbp)
  movb   $0x0,-0x32(%rbp)
  movb   $0x0,-0x31(%rbp)
  jmp    L64
L130:
  cmpl   $0x8,-0x68(%rbp)
  jne    L107
  mov    -0x70(%rbp),%edx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x75(%rbp)
  addl   $0x1,-0x70(%rbp)
  movzbl -0x75(%rbp),%eax
  mov    %al,-0x78(%rbp)
  movl   $0x0,-0x68(%rbp)
L107:
  movzbl -0x78(%rbp),%eax
  mov    %al,-0x75(%rbp)
  movzbl -0x77(%rbp),%eax
  add    %eax,%eax
  mov    %al,-0x77(%rbp)
  shrb   $0x7,-0x75(%rbp)
  movzbl -0x75(%rbp),%eax
  or     %al,-0x77(%rbp)
  movzbl -0x78(%rbp),%eax
  add    %eax,%eax
  mov    %al,-0x78(%rbp)
  addl   $0x1,-0x68(%rbp)
  addl   $0x1,-0x64(%rbp)
  cmpl   $0x9,-0x64(%rbp)
  jbe    L48
  mov    $0xffffffff,%eax
  jmp    L99
L48:
  movzbl -0x77(%rbp),%eax
  mov    %al,-0x76(%rbp)
L118:
  movzbl -0x76(%rbp),%edx
  mov    -0x64(%rbp),%eax
  mov    -0x60(%rbp,%rax,4),%eax
  cmp    %eax,%edx
  jg     L130
  movb   $0x0,-0x77(%rbp)
  movl   $0x0,-0x74(%rbp)
  jmp    L19
L120:
  mov    -0x74(%rbp),%eax
  movzbl -0x30(%rbp,%rax,1),%eax
  cmp    %al,-0x76(%rbp)
  jne    L109
  movzbl -0x79(%rbp),%ecx
  mov    -0x74(%rbp),%eax
  movzbl -0x20(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x32(%rbp,%rax,1)
  jmp    L47
L109:
  cmpl   $0x10,-0x74(%rbp)
  jne    L110
  mov    $0xffffffff,%eax
  jmp    L99
L110:
  addl   $0x1,-0x74(%rbp)
L19:
  cmpl   $0x10,-0x74(%rbp)
  jbe    L120
L47:
  movl   $0x0,-0x64(%rbp)
  movzbl -0x79(%rbp),%eax
  add    $0x1,%eax
  mov    %al,-0x79(%rbp)
L49:
  cmpb   $0x1,-0x79(%rbp)
  jbe    L118
  movzbl -0x32(%rbp),%eax
  movzbl %al,%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  movzbl -0x31(%rbp),%eax
  mov    %edx,%ecx
  or     %eax,%ecx
  mov    -0x6c(%rbp),%edx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  addl   $0x1,-0x6c(%rbp)
  movb   $0x0,-0x79(%rbp)
L64:
  mov    -0x6c(%rbp),%eax
  cmp    -0x94(%rbp),%eax
  jb     L49
  mov    $0x0,%eax
L99:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L78
  call   <__stack_chk_fail@plt>
L78:
  leave
  ret
```

assistant: ```c
int sq905c_first_decompress(unsigned char *output, const unsigned char *input, unsigned int outputsize) {
  unsigned char parity = 0;
  unsigned char nibble_to_keep[2];
  unsigned char temp1 = 0, temp2 = 0;
  unsigned char input_byte;
  unsigned char lookup = 0;
  unsigned int i = 0;
  unsigned int bytes_used = 0;
  unsigned int bytes_done = 0;
  unsigned int bit_counter = 8;
  unsigned int cycles = 0;
  int table[9] = {-1, 0, 2, 6, 0x0e, 0x0e, 0x0e, 0x0e, 0xfb};
  unsigned char lookup_table[16] = {0, 2, 6, 0x0e, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb};
  unsigned char translator[16] = {8, 7, 9, 6, 10, 11, 12, 13, 14, 15, 5, 4, 3, 2, 1, 0};
  nibble_to_keep[0] = 0;
  nibble_to_keep[1] = 0;
  while (bytes_done < outputsize) {
    while (parity < 2) {
      while (lookup > table[cycles]) {
        if (bit_counter == 8) {
          input_byte = input[bytes_used];
          bytes_used++;
          temp1 = input_byte;
          bit_counter = 0;
        }
        input_byte = temp1;
        temp2 = (temp2 << 1) & 0xFF;
        input_byte = input_byte >> 7;
        temp2 = temp2 | input_byte;
        temp1 = (temp1 << 1) & 0xFF;
        bit_counter++;
        cycles++;
        if (cycles > 9)
          return -1;
        lookup = temp2 & 0xff;
      }
      temp2 = 0;
      for (i = 0; i < 17; i++) {
        if (lookup == lookup_table[i]) {
          nibble_to_keep[parity] = translator[i];
          break;
        }
        if (i == 16)
          return -1;
      }
      cycles = 0;
      parity++;
    }
    output[bytes_done] = (nibble_to_keep[0] << 4) | nibble_to_keep[1];
    bytes_done++;
    parity = 0;
  }
  return 0;
}
```