user: What is the c source code of the assembly code below:

```asm
<mode>:
  endbr64
  push   %r15
  movsbl %sil,%r15d
  push   %r14
  mov    %ecx,%r14d
  push   %r13
  mov    %edx,%r13d
  push   %r12
  push   %rbp
  mov    %r8d,%ebp
  push   %rbx
  mov    %edi,%ebx
  mov    %r15d,%edi
  sub    $0x8,%rsp
  call   <stox@plt>
  mov    %r15d,%edi
  and    $0x4,%eax
  mov    %eax,%r12d
  call   <stox@plt>
  movsbl %r13b,%edi
  call   <stox@plt>
  movsbl %bpl,%edi
  mov    %eax,%r13d
  call   <stox@plt>
  movsbl %bl,%edi
  mov    %eax,%ebp
  call   <stox@plt>
  movsbl %r14b,%edi
  mov    %eax,%ebx
  call   <stox@plt>
  cmp    $0x5,%ebx
  ja     L100
  mov    %eax,%ecx
  lea    D51(%rip),%rax
  movslq (%rax,%rbx,4),%rdx
  add    %rax,%rdx
  notrack jmp *%rdx
  nopl   (%rax)
  lea    D74(%rip),%rax
L3:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cs nopw 0x0(%rax,%rax,1)
  add    $0x8,%rsp
  lea    D116(%rip),%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cs nopw 0x0(%rax,%rax,1)
  test   %r12d,%r12d
  lea    D91(%rip),%rax
  lea    D84(%rip),%rdx
  cmove  %rdx,%rax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
  test   %r12d,%r12d
  je     L126
  lea    D23(%rip),%rax
  cmp    $0x4,%bpl
  je     L3
  jg     L92
  lea    D232(%rip),%rax
  test   %bpl,%bpl
  je     L3
  cmp    $0x2,%bpl
  lea    D70(%rip),%rax
  lea    D133(%rip),%rdx
  cmove  %rdx,%rax
  jmp    L3
  nop
  and    $0x8,%r13d
  lea    D105(%rip),%rax
  lea    D37(%rip),%rdx
  cmove  %rdx,%rax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
  lea    D33(%rip),%rax
  cmp    $0x4,%cl
  je     L3
  lea    D162(%rip),%rax
  cmp    $0x5,%cl
  je     L3
  cmp    $0x6,%cl
  lea    D40(%rip),%rax
  lea    D206(%rip),%rdx
  cmovne %rdx,%rax
  jmp    L3
  nopw   0x0(%rax,%rax,1)
L92:
  cmp    $0x6,%bpl
  lea    D70(%rip),%rax
  lea    D108(%rip),%rdx
  cmove  %rdx,%rax
  jmp    L3
L100:
  add    $0x8,%rsp
  lea    D151(%rip),%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L126:
  lea    D113(%rip),%rax
  cmp    $0x4,%bpl
  je     L3
  jg     L113
  lea    D101(%rip),%rax
  test   %bpl,%bpl
  je     L3
  cmp    $0x2,%bpl
  lea    D137(%rip),%rax
  lea    D169(%rip),%rdx
  cmove  %rdx,%rax
  jmp    L3
  xchg   %ax,%ax
L113:
  cmp    $0x6,%bpl
  lea    D137(%rip),%rax
  lea    D185(%rip),%rdx
  cmove  %rdx,%rax
  jmp    L3
```

tool_calls: name: disassemble_data
arguments: label: D74
type_infered: string
name: disassemble_data
arguments: label: D116
type_infered: string
name: disassemble_data
arguments: label: D91
type_infered: string
name: disassemble_data
arguments: label: D84
type_infered: string
name: disassemble_data
arguments: label: D23
type_infered: string
name: disassemble_data
arguments: label: D232
type_infered: string
name: disassemble_data
arguments: label: D70
type_infered: string
name: disassemble_data
arguments: label: D133
type_infered: string
name: disassemble_data
arguments: label: D105
type_infered: string
name: disassemble_data
arguments: label: D37
type_infered: string
name: disassemble_data
arguments: label: D33
type_infered: string
name: disassemble_data
arguments: label: D162
type_infered: string
name: disassemble_data
arguments: label: D40
type_infered: string
name: disassemble_data
arguments: label: D206
type_infered: string
name: disassemble_data
arguments: label: D108
type_infered: string
name: disassemble_data
arguments: label: D151
type_infered: string
name: disassemble_data
arguments: label: D113
type_infered: string
name: disassemble_data
arguments: label: D101
type_infered: string
name: disassemble_data
arguments: label: D137
type_infered: string
name: disassemble_data
arguments: label: D169
type_infered: string
name: disassemble_data
arguments: label: D185
type_infered: string

tool: D74: USB

tool: D116: LSB

tool: D91: CW REV

tool: D84: CW

tool: D23: DATA REV, fsk D

tool: D232: DATA REV, data A

tool: D70: DATA REV, ???

tool: D133: DATA REV, afsk A

tool: D105: AM-S

tool: D37: AM

tool: D33: FM

tool: D162: FM+

tool: D40: FM-

tool: D206: FM?

tool: D108: DATA REV, psk D

tool: D151: ?

tool: D113: DATA, fsk D

tool: D101: DATA, data A

tool: D137: DATA, ???

tool: D169: DATA, afsk A

tool: D185: DATA, psk D

assistant: ```c
const char *mode(char modeChar, char altChar, char flags7, char fmInfo, char dataMode) {
  int modeByte, revCw, revMode;
  revCw = stox(altChar) & 0x4;
  revMode = stox(altChar) & 0x1;
  flags7 = stox(flags7);
  dataMode = stox(dataMode);
  modeByte = stox(modeChar);
  fmInfo = stox(fmInfo);
  switch (modeByte) {
  case 0:
    return revCw ? "CW REV" : "CW";
  case 1:
    return "LSB";
  case 2:
    return "USB";
  case 3:
    if (revCw)
      switch (dataMode) {
      case 0:
        return "DATA REV, data A";
      case 2:
        return "DATA REV, afsk A";
      case 4:
        return "DATA REV, fsk D";
      case 6:
        return "DATA REV, psk D";
      default:
        return "DATA REV, ???";
      }
    else
      switch (dataMode) {
      case 0:
        return "DATA, data A";
      case 2:
        return "DATA, afsk A";
      case 4:
        return "DATA, fsk D";
      case 6:
        return "DATA, psk D";
      default:
        return "DATA, ???";
      }
  case 4:
    return flags7 & 0x8 ? "AM-S" : "AM";
  case 5:
    if (fmInfo == 0x04)
      return "FM";
    else if (fmInfo == 0x05)
      return "FM+";
    else if (fmInfo == 0x06)
      return "FM-";
    else {
      return "FM?";
    }
  default:
    return "?";
  }
}
```