user: 请从给定的汇编指令推导出C源代码：

```asm
<inputsetup_menu>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %edi,-0x84(%rbp)
  mov    %esi,-0x88(%rbp)
  mov    %edx,-0x8c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D84(%rip),%rax
  mov    %rax,-0x70(%rbp)
  lea    D28(%rip),%rax
  mov    %rax,-0x68(%rbp)
  lea    D22(%rip),%rax
  mov    %rax,-0x60(%rbp)
  lea    D74(%rip),%rax
  mov    %rax,-0x58(%rbp)
  lea    D81(%rip),%rax
  mov    %rax,-0x50(%rbp)
  lea    D43(%rip),%rax
  mov    %rax,-0x48(%rbp)
  lea    D60(%rip),%rax
  mov    %rax,-0x40(%rbp)
  lea    D8(%rip),%rax
  mov    %rax,-0x38(%rbp)
  movq   $0x0,-0x30(%rbp)
  lea    D70(%rip),%rax
  mov    %rax,-0x28(%rbp)
  lea    D98(%rip),%rax
  mov    %rax,-0x20(%rbp)
  movabs $0x77636120746f5220,%rax
  mov    %rax,-0x11(%rbp)
  movb   $0x0,-0x9(%rbp)
  movl   $0x0,-0x78(%rbp)
  movl   $0x0,-0x80(%rbp)
  lea    -0x11(%rbp),%rax
  add    $0x5,%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <spellword@plt>
  lea    -0x11(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x80(%rbp),%edx
  mov    -0x8c(%rbp),%esi
  mov    -0x88(%rbp),%ecx
  lea    -0x70(%rbp),%rax
  mov    $0x0,%r9d
  mov    %esi,%r8d
  mov    $0x6,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <drawmenu@plt>
  mov    -0x88(%rbp),%eax
  lea    0xc(%rax),%edx
  lea    -0x70(%rbp),%rax
  add    $0x30,%rax
  mov    -0x8c(%rbp),%ecx
  mov    $0x0,%r9d
  mov    %ecx,%r8d
  mov    %edx,%ecx
  mov    $0xffffffff,%edx
  mov    $0x5,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <drawmenu@plt>
L47:
  mov    -0x8c(%rbp),%edx
  mov    -0x88(%rbp),%ecx
  mov    -0x78(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <inp_printkeys@plt>
  mov    -0x80(%rbp),%edx
  mov    -0x8c(%rbp),%ecx
  mov    -0x88(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <inp_setcurs@plt>
  mov    %eax,-0x74(%rbp)
  mov    $0xffffffff,%edi
  mov    $0x0,%eax
  call   <refreshwin@plt>
  mov    -0x80(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <inp_keypr@plt>
  mov    %eax,%edx
  mov    -0x78(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <setkeymapping@plt>
  mov    %eax,-0x7c(%rbp)
  cmpl   $0x3,-0x7c(%rbp)
  jne    L44
  mov    -0x80(%rbp),%eax
  test   %eax,%eax
  jne    L44
  movl   $0x4,-0x7c(%rbp)
  jmp    L15
L44:
  cmpl   $0x4,-0x7c(%rbp)
  jne    L15
  mov    -0x80(%rbp),%eax
  cmp    $0xa,%eax
  jne    L15
  mov    -0x20(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printmenuitem@plt>
  movl   $0x0,-0x80(%rbp)
  mov    -0x80(%rbp),%edx
  mov    -0x8c(%rbp),%ecx
  mov    -0x88(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <inp_setcurs@plt>
  mov    -0x70(%rbp),%rax
  mov    $0x1,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printmenuitem@plt>
  jmp    L72
L15:
  mov    -0x80(%rbp),%edx
  movslq %edx,%rax
  imul   $0x2aaaaaab,%rax,%rax
  shr    $0x20,%rax
  mov    %edx,%esi
  sar    $0x1f,%esi
  mov    %eax,%ecx
  sub    %esi,%ecx
  mov    %ecx,%eax
  add    %eax,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    -0x8c(%rbp),%eax
  lea    (%rcx,%rax,1),%edi
  mov    -0x74(%rbp),%esi
  lea    -0x80(%rbp),%rdx
  lea    -0x70(%rbp),%rax
  mov    -0x7c(%rbp),%ecx
  push   %rcx
  push   $0x0
  mov    %edi,%r9d
  mov    %esi,%r8d
  mov    $0x6,%ecx
  mov    $0xb,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <handle_menuitem_2cols@plt>
  add    $0x10,%rsp
  cmp    $0x3,%eax
  je     L68
  cmp    $0x3,%eax
  jg     L47
  test   %eax,%eax
  je     L120
  cmp    $0x2,%eax
  jne    L47
  jmp    L120
L68:
  mov    -0x80(%rbp),%edx
  mov    -0x8c(%rbp),%ecx
  mov    -0x88(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <inp_setcurs@plt>
  mov    -0x80(%rbp),%eax
  cltq
  mov    -0x70(%rbp,%rax,8),%rax
  mov    $0x1,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printmenuitem@plt>
L72:
  jmp    L47
L120:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L115
  call   <__stack_chk_fail@plt>
L115:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D84
type_infered: string
name: disassemble_data
arguments: data_tag: D28
type_infered: string
name: disassemble_data
arguments: data_tag: D22
type_infered: string
name: disassemble_data
arguments: data_tag: D74
type_infered: string
name: disassemble_data
arguments: data_tag: D81
type_infered: string
name: disassemble_data
arguments: data_tag: D43
type_infered: string
name: disassemble_data
arguments: data_tag: D60
type_infered: string
name: disassemble_data
arguments: data_tag: D8
type_infered: string
name: disassemble_data
arguments: data_tag: D70
type_infered: string
name: disassemble_data
arguments: data_tag: D98
type_infered: string

tool: D84:  Up

tool: D28: Dwn

tool: D22: Lft

tool: D74: Rgt

tool: D81:   A

tool: D43:   B

tool: D60:  Rotate 

tool: D8:  Rot cw 

tool: D70: Harddrop

tool: D98: Softdrop

assistant: ```c
void inputsetup_menu(int pl, int x, int y) {
  const char *menu[11] = {" Up", "Dwn", "Lft", "Rgt", "  A", "  B", " Rotate ", " Rot cw ", (void *)0, "Harddrop", "Softdrop"};
  char rot_acw[9] = " Rot acw";
  int dev = 0;
  int i = 0;
  int xx, k;
  spellword(rot_acw + 5);
  menu[8] = rot_acw;
  drawmenu(menu, 6, i, x, y, (void *)0);
  drawmenu(menu + 6, 5, -1, x + 12, y, (void *)0);
  while (1) {
    inp_printkeys(dev, x, y);
    xx = inp_setcurs(x, y, i);
    refreshwin(-1);
    k = setkeymapping(dev, inp_keypr(i));
    if (k == 3 && !i)
      k = 4;
    else if (k == 4 && i == 10) {
      printmenuitem(menu[10], 0);
      inp_setcurs(x, y, i = 0);
      printmenuitem(menu[0], 1);
      continue;
    }
    switch (handle_menuitem_2cols(menu, 11, &i, 6, xx, y + i % 6, (void *)0, k)) {
    case 0:
    case 2:
      return;
    case 3:
      inp_setcurs(x, y, i);
      printmenuitem(menu[i], 1);
    }
  }
}
```