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

```asm
<WriteDigital>:
  endbr64
  cmp    $0x6,%edi
  ja     L70
  lea    D5(%rip),%rdx
  mov    %edi,%edi
  movslq (%rdx,%rdi,4),%rax
  add    %rdx,%rax
  cmp    $0x1,%esi
  notrack jmp *%rax
  nop
  mov    0x50003ffc,%eax
  je     L67
  and    $0xfe,%ah
  mov    %eax,0x50003ffc
L70:
  ret
  nopl   0x0(%rax,%rax,1)
  mov    0x50003ffc,%eax
  je     L61
  and    $0x7f,%al
  mov    %eax,0x50003ffc
  ret
  nopw   0x0(%rax,%rax,1)
  mov    0x50003ffc,%eax
  je     L55
  and    $0xfffffffb,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax,%rax,1)
  mov    0x50003ffc,%eax
  je     L14
  and    $0xfffffff7,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax,%rax,1)
  mov    0x50003ffc,%eax
  je     L32
  and    $0xffffffef,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax)
  mov    0x50003ffc,%eax
  je     L18
  and    $0xffffffdf,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax)
  mov    0x50003ffc,%eax
  je     L19
  and    $0xffffffbf,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax)
L61:
  or     $0x80,%al
  mov    %eax,0x50003ffc
  ret
  nopw   0x0(%rax,%rax,1)
L19:
  or     $0x40,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax,%rax,1)
L18:
  or     $0x20,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax,%rax,1)
L32:
  or     $0x10,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax,%rax,1)
L14:
  or     $0x8,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax,%rax,1)
L55:
  or     $0x4,%eax
  mov    %eax,0x50003ffc
  ret
  nopl   0x0(%rax,%rax,1)
L67:
  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;
  }
  }
}
```