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

```asm
<GB_ADDR>:
  endbr64
  movzbl (%rdi),%eax
  mov    %esi,%edx
  test   %al,%al
  js     L135
  cmp    $0x1f,%al
  jbe    L152
  sub    $0x20,%eax
  cltq
  cmp    $0x8,%dl
  je     L214
L112:
  cmp    $0xc,%dl
  je     L150
  cmp    $0x10,%dl
  je     L9
  cmp    $0x18,%dl
  je     L95
  mov    %rax,%rcx
  shl    $0x6,%rcx
  add    $0x1e5a50,%rcx
  cmp    $0x20,%dl
  cmove  %rcx,%rax
  ret
  nopl   0x0(%rax)
L152:
  movb   $0x20,(%rdi)
  xor    %eax,%eax
  cmp    $0x8,%dl
  jne    L112
L214:
  shl    $0x3,%rax
  ret
  nop
L135:
  lea    0x5f(%rax),%esi
  movzbl 0x1(%rdi),%ecx
  cmp    $0xa,%sil
  ja     L30
  cmp    $0xa0,%cl
  ja     L169
  lea    0x58(%rax),%esi
  cmp    $0x1,%sil
  jbe    L49
L42:
  cmp    $0xc,%dl
  je     L114
  cmp    $0x10,%dl
  je     L72
  cmp    $0x18,%dl
  je     L198
  add    $0x2054,%r8
  xor    %eax,%eax
  shl    $0x7,%r8
  cmp    $0x20,%dl
  cmove  %r8,%rax
  ret
  nop
L30:
  lea    0x58(%rax),%esi
  cmp    $0x1,%sil
  jbe    L48
  lea    0x50(%rax),%esi
  cmp    $0x47,%sil
  ja     L42
  cmp    $0xa0,%cl
  jbe    L42
  sub    $0xb0,%eax
  imul   $0x5e,%eax,%eax
  lea    -0xa1(%rax,%rcx,1),%r8d
  movslq %r8d,%r8
  jmp    L42
  nopl   0x0(%rax)
L9:
  shl    $0x4,%rax
  add    $0x1a7fcc,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L48:
  cmp    $0xa0,%cl
  ja     L42
L49:
  cmp    $0x80,%cl
  lea    -0x1f8(%rax,%rax,2),%eax
  adc    $0xff,%cl
  shl    $0x5,%eax
  movzbl %cl,%ecx
  lea    0x30e(%rax,%rcx,1),%eax
  cltq
L125:
  cmp    $0xc,%dl
  je     L188
  cmp    $0x10,%dl
  je     L61
  cmp    $0x18,%dl
  je     L142
  add    $0x1dbe,%rax
  shl    $0x7,%rax
  cmp    $0x20,%dl
  mov    $0x0,%edx
  cmovne %rdx,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L150:
  lea    (%rax,%rax,2),%rax
  shl    $0x2,%rax
  ret
  nopl   0x0(%rax)
L114:
  lea    (%r8,%r8,2),%rax
  lea    0x3e10(,%rax,8),%rax
  ret
  nopl   (%rax)
L95:
  lea    (%rax,%rax,2),%rax
  shl    $0x4,%rax
  add    $0x1dff00,%rax
  ret
  nopw   0x0(%rax,%rax,1)
L72:
  lea    0x323c(%r8),%rax
  shl    $0x5,%rax
  ret
  nopl   0x0(%rax)
L169:
  sub    $0xa1,%eax
  imul   $0x5e,%eax,%eax
  lea    -0xa1(%rax,%rcx,1),%eax
  cltq
  jmp    L125
  cs nopw 0x0(%rax,%rax,1)
L198:
  lea    (%r8,%r8,8),%rax
  lea    0xe9ff0(,%rax,8),%rax
  ret
  nopl   (%rax)
L188:
  lea    (%rax,%rax,2),%rax
  jmp    L214
  nopl   0x0(%rax)
L61:
  add    $0x2fa6,%rax
  shl    $0x5,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L142:
  lea    (%rax,%rax,8),%rax
  lea    0xde5c0(,%rax,8),%rax
  ret
```

assistant: ```c
unsigned long GB_ADDR(unsigned char *HZ, unsigned char HZ_type) {
  unsigned long temp;
  unsigned char c1, c2;
  if (HZ[0] < 0x80) {
    if (HZ[0] < ' ')
      HZ[0] = ' ';
    temp = HZ[0] - ' ';
    if (HZ_type == 8)
      temp = temp * 8 + 0x00;
    else if (HZ_type == 12)
      temp = temp * 12 + 0x00;
    else if (HZ_type == 16)
      temp = temp * 16 + 0x1A7FCC;
    else if (HZ_type == 24)
      temp = temp * 48 + 0x1DFF00;
    else if (HZ_type == 32)
      temp = temp * 64 + 0x1E5A50;
  } else {
    c1 = HZ[0];
    c2 = HZ[1];
    if ((c1 >= 0xA1 && c1 <= 0xAB && c2 >= 0xa1) || (c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1)) {
      if (c1 >= 0xA1 && c1 <= 0xAB && c2 >= 0xa1)
        temp = (c1 - 0xA1) * 94 + (c2 - 0xA1);
      else {
        if (c2 > 0x7f)
          c2--;
        temp = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
      }
      if (HZ_type == 12)
        return (temp * 24 + 0x0000);
      else if (HZ_type == 16)
        return (temp * 32 + 0x5F4C0);
      else if (HZ_type == 24)
        return (temp * 72 + 0xDE5C0);
      else if (HZ_type == 32)
        return (temp * 128 + 0xEDF00);
      else
        return (0x00);
    } else if (c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) {
      temp = (c1 - 0xB0) * 94 + (c2 - 0xA1);
    }
    if (HZ_type == 12)
      temp = (temp + 846 - 184) * 24 + 0x0000;
    else if (HZ_type == 16)
      temp = (temp + 846 - 184) * 32 + 0x5F4C0;
    else if (HZ_type == 24)
      temp = (temp + 846 - 184) * 72 + 0xDE5C0;
    else if (HZ_type == 32)
      temp = (temp + 846 - 184) * 128 + 0xEDF00;
    else
      return (0x00);
  }
  return temp;
}
```