user: Please show me the C implementation that matches the assembly code listed below:

```asm
<cherry8x16_remap_fn_keys>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  and    $0x1,%eax
  test   %rax,%rax
  je     L155
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  and    $0xfffffffffffffffe,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  or     $0x10,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
L155:
  movq   $0x2,-0x8(%rbp)
  jmp    L111
L84:
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  sub    $0xc,%rax
  cmp    $0x2f,%rax
  ja     L121
  lea    0x0(,%rax,4),%rdx
  lea    D7(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D7(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x62,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x63,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x54,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x59,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x5a,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x5b,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x57,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x58,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x5c,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x5d,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x5e,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x56,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x5f,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x60,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x61,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x55,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x44,(%rax)
  jmp    L185
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movq   $0x45,(%rax)
  jmp    L185
L121:
  nop
L185:
  addq   $0x1,-0x8(%rbp)
L111:
  mov    -0x8(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jb     L84
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void cherry8x16_remap_fn_keys(uint8_t *keys, uint8_t number_of_keys) {
  if (keys[0] & (1UL << (0xE0 - 0xE0))) {
    keys[0] &= ~(1UL << (0xE0 - 0xE0));
    keys[0] |= (1UL << (0xE4 - 0xE0));
  }
  for (uint_fast8_t i = 2; i < number_of_keys; i++) {
    switch (keys[i]) {
    case 0x10:
      keys[i] = 0x62;
      break;
    case 0x37:
      keys[i] = 0x63;
      break;
    case 0x38:
      keys[i] = 0x54;
      break;
    case 0x0D:
      keys[i] = 0x59;
      break;
    case 0x0E:
      keys[i] = 0x5A;
      break;
    case 0x0F:
      keys[i] = 0x5B;
      break;
    case 0x33:
      keys[i] = 0x57;
      break;
    case 0x28:
      keys[i] = 0x58;
      break;
    case 0x18:
      keys[i] = 0x5C;
      break;
    case 0x0C:
      keys[i] = 0x5D;
      break;
    case 0x12:
      keys[i] = 0x5E;
      break;
    case 0x13:
      keys[i] = 0x56;
      break;
    case 0x24:
      keys[i] = 0x5F;
      break;
    case 0x25:
      keys[i] = 0x60;
      break;
    case 0x26:
      keys[i] = 0x61;
      break;
    case 0x27:
      keys[i] = 0x55;
      break;
    case 0x3A:
      keys[i] = 0x44;
      break;
    case 0x3B:
      keys[i] = 0x45;
      break;
    default:
      break;
    }
  }
}
```