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

```asm
<z80_OpcodeLen>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movb   $0x1,-0xd(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  jne    L141
  lea    -0xc(%rbp),%rax
  mov    %rax,-0x28(%rbp)
L141:
  mov    -0x18(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    $0xfe,%eax
  jg     L681
  cmp    $0xdb,%eax
  jge    L21
  cmp    $0x3e,%eax
  jg     L322
  test   %eax,%eax
  jg     L505
  jmp    L681
L21:
  sub    $0xdb,%eax
  cmp    $0x23,%eax
  ja     L681
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D6(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
L445:
  sub    $0xc2,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  mov    %rax,%rdx
  and    $0x1010103,%edx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L541
  mov    %rax,%rdx
  and    $0x121210,%edx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L315
  and    $0x40c04,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L705
  jmp    L681
L505:
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  movabs $0x406040600020002,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L684
  movabs $0x4040404040404040,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L315
  movabs $0x101010101010000,%rdx
  and    %rdx,%rax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L310
  jmp    L681
L322:
  cmp    $0xda,%eax
  jg     L681
  cmp    $0xc2,%eax
  jge    L445
  jmp    L681
L310:
  mov    -0x28(%rbp),%rax
  movl   $0x62,(%rax)
L315:
  movb   $0x2,-0xd(%rbp)
  jmp    L681
L684:
  movb   $0x3,-0xd(%rbp)
  jmp    L681
L705:
  movb   $0x3,-0xd(%rbp)
  mov    -0x28(%rbp),%rax
  movl   $0x63,(%rax)
  jmp    L681
L541:
  mov    -0x28(%rbp),%rax
  movl   $0x62,(%rax)
  movb   $0x3,-0xd(%rbp)
  jmp    L681
  movb   $0x2,-0xd(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    $0xcb,%eax
  jg     L410
  cmp    $0x8e,%eax
  jge    L369
  cmp    $0x46,%eax
  jg     L360
  cmp    $0x21,%eax
  jge    L318
  jmp    L410
L369:
  sub    $0x8e,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  movabs $0x1010101010101,%rax
  and    %rdx,%rax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L617
  movabs $0x2000000000000000,%rax
  and    %rdx,%rax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L194
  jmp    L410
L391:
  sub    $0x4e,%eax
  movabs $0x10102fd01010101,%rdx
  mov    %eax,%ecx
  shr    %cl,%rdx
  mov    %rdx,%rax
  and    $0x1,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L617
  jmp    L410
L318:
  sub    $0x21,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  and    $0x200203,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L194
  movabs $0x2000180000,%rax
  and    %rdx,%rax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L617
  jmp    L410
L360:
  cmp    $0x86,%eax
  jg     L410
  cmp    $0x4e,%eax
  jge    L391
  jmp    L410
L617:
  movb   $0x3,-0xd(%rbp)
  jmp    L655
L194:
  movb   $0x4,-0xd(%rbp)
  nop
L655:
  jmp    L410
  movb   $0x2,-0xd(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sub    $0x43,%eax
  cmp    $0x38,%eax
  seta   %dl
  test   %dl,%dl
  jne    L306
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  movabs $0x101000001010101,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L30
  and    $0x400,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  je     L306
  mov    -0x28(%rbp),%rax
  movl   $0x72,(%rax)
  jmp    L658
L30:
  movb   $0x4,-0xd(%rbp)
  nop
L658:
  jmp    L306
  movb   $0x2,-0xd(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    $0xe9,%eax
  je     L473
  cmp    $0xe9,%eax
  jg     L672
  cmp    $0xcb,%eax
  je     L58
  cmp    $0xcb,%eax
  jg     L672
  cmp    $0xbe,%eax
  je     L213
  cmp    $0xbe,%eax
  jg     L672
  cmp    $0xb6,%eax
  je     L213
  cmp    $0xb6,%eax
  jg     L672
  cmp    $0xae,%eax
  je     L213
  cmp    $0xae,%eax
  jg     L672
  cmp    $0xa6,%eax
  jg     L672
  cmp    $0x6e,%eax
  jge    L544
  cmp    $0x22,%eax
  jg     L381
  cmp    $0x21,%eax
  jge    L58
  jmp    L672
L544:
  sub    $0x6e,%eax
  movabs $0x1010101010102fd,%rdx
  mov    %eax,%ecx
  shr    %cl,%rdx
  mov    %rdx,%rax
  and    $0x1,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L213
  jmp    L672
L731:
  sub    $0x2a,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  movabs $0x1010101010000c00,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L213
  and    $0x1001,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L58
  jmp    L672
L381:
  cmp    $0x66,%eax
  jg     L672
  cmp    $0x2a,%eax
  jge    L731
  jmp    L672
L213:
  movb   $0x3,-0xd(%rbp)
  jmp    L246
L473:
  mov    -0x28(%rbp),%rax
  movl   $0x62,(%rax)
  jmp    L246
L58:
  movb   $0x4,-0xd(%rbp)
  nop
L246:
  jmp    L672
L410:
  nop
  jmp    L681
L306:
  nop
  jmp    L681
L672:
  nop
L681:
  movzbl -0xd(%rbp),%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L662
  call   <__stack_chk_fail@plt>
L662:
  leave
  ret
```

assistant: ```c
unsigned char z80_OpcodeLen(unsigned char *Opcodes, unsigned long p, int *type) {
  unsigned char len = 1;
  int type_tmp;
  if (type == NULL)
    type = &type_tmp;
  switch (Opcodes[p]) {
  case 0x10:
  case 0x18:
  case 0x20:
  case 0x28:
  case 0x30:
  case 0x38:
    *type = 'b';
  case 0x06:
  case 0x0E:
  case 0x16:
  case 0x1E:
  case 0x26:
  case 0x2E:
  case 0x36:
  case 0x3E:
  case 0xC6:
  case 0xCE:
  case 0xD3:
  case 0xD6:
  case 0xDB:
  case 0xDE:
  case 0xE6:
  case 0xEE:
  case 0xF6:
  case 0xFE:
  case 0xCB:
    len = 2;
    break;
  case 0x01:
  case 0x11:
  case 0x21:
  case 0x22:
  case 0x2A:
  case 0x31:
  case 0x32:
  case 0x3A:
    len = 3;
    break;
  case 0xC4:
  case 0xCC:
  case 0xCD:
  case 0xD4:
  case 0xDC:
  case 0xE4:
  case 0xEC:
  case 0xF4:
  case 0xFC:
    len = 3;
    *type = 'c';
    break;
  case 0xC2:
  case 0xC3:
  case 0xCA:
  case 0xD2:
  case 0xDA:
  case 0xE2:
  case 0xEA:
  case 0xF2:
  case 0xFA:
    *type = 'b';
    len = 3;
    break;
  case 0xDD:
    len = 2;
    switch (Opcodes[p + 1]) {
    case 0x34:
    case 0x35:
    case 0x46:
    case 0x4E:
    case 0x56:
    case 0x5E:
    case 0x66:
    case 0x6E:
    case 0x70:
    case 0x71:
    case 0x72:
    case 0x73:
    case 0x74:
    case 0x75:
    case 0x77:
    case 0x7E:
    case 0x86:
    case 0x8E:
    case 0x96:
    case 0x9E:
    case 0xA6:
    case 0xAE:
    case 0xB6:
    case 0xBE:
      len = 3;
      break;
    case 0x21:
    case 0x22:
    case 0x2A:
    case 0x36:
    case 0xCB:
      len = 4;
      break;
    }
    break;
  case 0xED:
    len = 2;
    switch (Opcodes[p + 1]) {
    case 0x4D:
      *type = 'r';
      break;
    case 0x43:
    case 0x4B:
    case 0x53:
    case 0x5B:
    case 0x73:
    case 0x7B:
      len = 4;
      break;
    }
    break;
  case 0xFD:
    len = 2;
    switch (Opcodes[p + 1]) {
    case 0x34:
    case 0x35:
    case 0x46:
    case 0x4E:
    case 0x56:
    case 0x5E:
    case 0x66:
    case 0x6E:
    case 0x70:
    case 0x71:
    case 0x72:
    case 0x73:
    case 0x74:
    case 0x75:
    case 0x77:
    case 0x7E:
    case 0x86:
    case 0x8E:
    case 0x96:
    case 0x9E:
    case 0xA6:
    case 0xAE:
    case 0xB6:
    case 0xBE:
      len = 3;
      break;
    case 0xe9:
      *type = 'b';
      break;
    case 0x21:
    case 0x22:
    case 0x2A:
    case 0x36:
    case 0xCB:
      len = 4;
      break;
    }
    break;
  }
  return (len);
}
```