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

```asm
<VicSetup>:
  endbr64
  mov    %esi,%eax
  mov    %edx,%esi
  mov    %ecx,%edx
  test   %al,%al
  je     L135
  mov    $0xfffff00c,%r8d
  mov    (%r8),%r9
  mov    $0x1,%eax
  mov    %esi,%ecx
  shl    %cl,%eax
  cltq
  or     %r9,%rax
  mov    %rax,(%r8)
L22:
  cmp    $0xf,%dl
  ja     L70
  movzbl %dl,%edx
  lea    D8(%rip),%rcx
  movslq (%rcx,%rdx,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
L135:
  mov    $0xfffff00c,%r8d
  mov    (%r8),%r9
  mov    $0xfffffffe,%eax
  mov    %esi,%ecx
  rol    %cl,%eax
  cltq
  and    %r9,%rax
  mov    %rax,(%r8)
  jmp    L22
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff200
  mov    %edi,%eax
  movabs %rax,0xfffff100
L40:
  mov    $0xfffff010,%edx
  mov    (%rdx),%rdi
  mov    $0x1,%eax
  mov    %esi,%ecx
  shl    %cl,%eax
  cltq
  or     %rdi,%rax
  mov    %rax,(%rdx)
  mov    $0xfffff030,%eax
  movq   $0xff,(%rax)
  mov    $0x1,%eax
  ret
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff204
  mov    %edi,%eax
  movabs %rax,0xfffff104
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff208
  mov    %edi,%eax
  movabs %rax,0xfffff108
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff20c
  mov    %edi,%eax
  movabs %rax,0xfffff10c
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff210
  mov    %edi,%eax
  movabs %rax,0xfffff110
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff214
  mov    %edi,%eax
  movabs %rax,0xfffff114
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff218
  mov    %edi,%eax
  movabs %rax,0xfffff118
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff21c
  mov    %edi,%eax
  movabs %rax,0xfffff11c
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff220
  mov    %edi,%eax
  movabs %rax,0xfffff120
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff224
  mov    %edi,%eax
  movabs %rax,0xfffff124
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff228
  mov    %edi,%eax
  movabs %rax,0xfffff128
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff22c
  mov    %edi,%eax
  movabs %rax,0xfffff12c
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff230
  mov    %edi,%eax
  movabs %rax,0xfffff130
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff234
  mov    %edi,%eax
  movabs %rax,0xfffff134
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff238
  mov    %edi,%eax
  movabs %rax,0xfffff138
  jmp    L40
  mov    %esi,%eax
  or     $0x20,%eax
  movsbq %al,%rax
  movabs %rax,0xfffff23c
  mov    %edi,%eax
  movabs %rax,0xfffff13c
  jmp    L40
L70:
  mov    $0x0,%eax
  ret
```

assistant: ```c
char VicSetup(unsigned int intHandler, char intType, char intSource, char intVector) {
  if (intType) {
    (*((volatile unsigned long *)0xFFFFF00C)) |= (1 << intSource);
  } else {
    (*((volatile unsigned long *)0xFFFFF00C)) &= ~(1 << intSource);
  }
  switch (intVector) {
  case 0:
    (*((volatile unsigned long *)0xFFFFF200)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF100)) = (unsigned)intHandler;
    break;
  case 1:
    (*((volatile unsigned long *)0xFFFFF204)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF104)) = (unsigned)intHandler;
    break;
  case 2:
    (*((volatile unsigned long *)0xFFFFF208)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF108)) = (unsigned)intHandler;
    break;
  case 3:
    (*((volatile unsigned long *)0xFFFFF20C)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF10C)) = (unsigned)intHandler;
    break;
  case 4:
    (*((volatile unsigned long *)0xFFFFF210)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF110)) = (unsigned)intHandler;
    break;
  case 5:
    (*((volatile unsigned long *)0xFFFFF214)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF114)) = (unsigned)intHandler;
    break;
  case 6:
    (*((volatile unsigned long *)0xFFFFF218)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF118)) = (unsigned)intHandler;
    break;
  case 7:
    (*((volatile unsigned long *)0xFFFFF21C)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF11C)) = (unsigned)intHandler;
    break;
  case 8:
    (*((volatile unsigned long *)0xFFFFF220)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF120)) = (unsigned)intHandler;
    break;
  case 9:
    (*((volatile unsigned long *)0xFFFFF224)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF124)) = (unsigned)intHandler;
    break;
  case 10:
    (*((volatile unsigned long *)0xFFFFF228)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF128)) = (unsigned)intHandler;
    break;
  case 11:
    (*((volatile unsigned long *)0xFFFFF22C)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF12C)) = (unsigned)intHandler;
    break;
  case 12:
    (*((volatile unsigned long *)0xFFFFF230)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF130)) = (unsigned)intHandler;
    break;
  case 13:
    (*((volatile unsigned long *)0xFFFFF234)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF134)) = (unsigned)intHandler;
    break;
  case 14:
    (*((volatile unsigned long *)0xFFFFF238)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF138)) = (unsigned)intHandler;
    break;
  case 15:
    (*((volatile unsigned long *)0xFFFFF23C)) = 0x20 | intSource;
    (*((volatile unsigned long *)0xFFFFF13C)) = (unsigned)intHandler;
    break;
  default:
    return 0;
    break;
  }
  (*((volatile unsigned long *)0xFFFFF010)) |= 1 << intSource;
  (*((volatile unsigned long *)0xFFFFF030)) = 0xFF;
  return 1;
}
```