user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<WriteDigital>:
  endbr64
  cmp    $0x6,%edi
  ja     L66
  mov    %edi,%edi
  lea    D3(%rip),%rdx
  movslq (%rdx,%rdi,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  cmp    $0x1,%esi
  je     L2
  mov    0x50003ffc,%eax
  and    $0xfffffffb,%eax
  mov    %eax,0x50003ffc
  ret
L2:
  mov    0x50003ffc,%eax
  or     $0x4,%eax
  mov    %eax,0x50003ffc
  ret
  cmp    $0x1,%esi
  je     L18
  mov    0x50003ffc,%eax
  and    $0xfffffff7,%eax
  mov    %eax,0x50003ffc
  ret
L18:
  mov    0x50003ffc,%eax
  or     $0x8,%eax
  mov    %eax,0x50003ffc
  ret
  cmp    $0x1,%esi
  je     L57
  mov    0x50003ffc,%eax
  and    $0xffffffef,%eax
  mov    %eax,0x50003ffc
  ret
L57:
  mov    0x50003ffc,%eax
  or     $0x10,%eax
  mov    %eax,0x50003ffc
  ret
  cmp    $0x1,%esi
  je     L23
  mov    0x50003ffc,%eax
  and    $0xffffffdf,%eax
  mov    %eax,0x50003ffc
  ret
L23:
  mov    0x50003ffc,%eax
  or     $0x20,%eax
  mov    %eax,0x50003ffc
  ret
  cmp    $0x1,%esi
  je     L7
  mov    0x50003ffc,%eax
  and    $0xffffffbf,%eax
  mov    %eax,0x50003ffc
  ret
L7:
  mov    0x50003ffc,%eax
  or     $0x40,%eax
  mov    %eax,0x50003ffc
  ret
  cmp    $0x1,%esi
  je     L26
  mov    0x50003ffc,%eax
  and    $0x7f,%al
  mov    %eax,0x50003ffc
  ret
L26:
  mov    0x50003ffc,%eax
  or     $0x80,%al
  mov    %eax,0x50003ffc
  ret
  cmp    $0x1,%esi
  je     L62
  mov    0x50003ffc,%eax
  and    $0xfe,%ah
  mov    %eax,0x50003ffc
L66:
  ret
L62:
  mov    0x50003ffc,%eax
  or     $0x1,%ah
  mov    %eax,0x50003ffc
  ret
```

assistant: ```c
void WriteDigital(int bitnumber, int value) {
  switch (bitnumber) {
  case 0: {
    if (value == 1)
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) | (1 << 2);
    else
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) & ~(1 << 2);
    break;
  }
  case 1: {
    if (value == 1)
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) | (1 << 3);
    else
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) & ~(1 << 3);
    break;
  }
  case 2: {
    if (value == 1)
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) | (1 << 4);
    else
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) & ~(1 << 4);
    break;
  }
  case 3: {
    if (value == 1)
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) | (1 << 5);
    else
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) & ~(1 << 5);
    break;
  }
  case 4: {
    if (value == 1)
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) | (1 << 6);
    else
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) & ~(1 << 6);
    break;
  }
  case 5: {
    if (value == 1)
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) | (1 << 7);
    else
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) & ~(1 << 7);
    break;
  }
  case 6: {
    if (value == 1)
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) | (1 << 8);
    else
      (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) = (*((volatile unsigned int *)(0x50000000 + 0x3ffc))) & ~(1 << 8);
    break;
  }
  }
}
```