user: Converte this assembly snippet into its equivalent C code:

```asm
<self_reception_test>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  lea    D78(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0xfff20000,%eax
  movb   $0x1,(%rax)
  mov    $0xfff20000,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D132(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff2001f,%eax
  movb   $0x80,(%rax)
  mov    $0xfff2001f,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D98(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20006,%eax
  movb   $0x80,(%rax)
  mov    $0xfff20007,%eax
  movb   $0x34,(%rax)
  mov    $0xfff20010,%eax
  movb   $0xa6,(%rax)
  mov    $0xfff20010,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D92(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20011,%eax
  movb   $0xb0,(%rax)
  mov    $0xfff20011,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D61(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20012,%eax
  movb   $0x12,(%rax)
  mov    $0xfff20012,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D156(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20013,%eax
  movb   $0x30,(%rax)
  mov    $0xfff20013,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20014,%eax
  movb   $0x0,(%rax)
  mov    $0xfff20014,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D177(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20015,%eax
  movb   $0x0,(%rax)
  mov    $0xfff20015,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D177(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20016,%eax
  movb   $0x0,(%rax)
  mov    $0xfff20016,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D177(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20017,%eax
  movb   $0x0,(%rax)
  mov    $0xfff20017,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D170(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20000,%eax
  movb   $0x5,(%rax)
  mov    $0xfff20000,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D132(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x32,%edi
  mov    $0x0,%eax
  call   <kill_time@plt>
  mov    $0xfff20000,%eax
  movb   $0x4,(%rax)
  mov    $0xfff20000,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D82(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x96,%edi
  mov    $0x0,%eax
  call   <kill_time@plt>
  mov    $0xfff20010,%eax
  movb   $0x88,(%rax)
  lea    D128(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0xfff20011,%eax
  movb   $0xa6,(%rax)
  mov    $0xfff20012,%eax
  movb   $0xb0,(%rax)
  mov    $0xfff20013,%eax
  movb   $0x12,(%rax)
  mov    $0xfff20014,%eax
  movb   $0x30,(%rax)
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0xfff20015,%eax
  movb   $0x12,(%rax)
  mov    $0xfff20016,%eax
  movb   $0x34,(%rax)
  mov    $0xfff20017,%eax
  movb   $0x56,(%rax)
  mov    $0xfff20018,%eax
  movb   $0x78,(%rax)
  mov    $0xfff20019,%eax
  movb   $0x9a,(%rax)
  mov    $0xfff2001a,%eax
  movb   $0xbc,(%rax)
  mov    $0xfff2001b,%eax
  movb   $0xde,(%rax)
  mov    $0xfff2001c,%eax
  movb   $0xf0,(%rax)
  mov    $0xfff20004,%eax
  movb   $0xff,(%rax)
  mov    $0x32,%edi
  mov    $0x0,%eax
  call   <kill_time@plt>
  mov    $0x0,%eax
  call   <self_reception_request@plt>
  lea    D173(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0xfff20000,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D82(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20003,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D182(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xfff20000,%eax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%esi
  lea    D82(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D78
type_infered: string
name: retrieve_data
arguments: label: D132
type_infered: string
name: retrieve_data
arguments: label: D98
type_infered: string
name: retrieve_data
arguments: label: D92
type_infered: string
name: retrieve_data
arguments: label: D61
type_infered: string
name: retrieve_data
arguments: label: D156
type_infered: string
name: retrieve_data
arguments: label: D7
type_infered: string
name: retrieve_data
arguments: label: D177
type_infered: string
name: retrieve_data
arguments: label: D170
type_infered: string
name: retrieve_data
arguments: label: D82
type_infered: string
name: retrieve_data
arguments: label: D128
type_infered: string
name: retrieve_data
arguments: label: D66
type_infered: string
name: retrieve_data
arguments: label: D173
type_infered: string
name: retrieve_data
arguments: label: D182
type_infered: string

tool: D78: Switch on Reset Mode

tool: D132: control 0x%X 



tool: D98: clock_divider 0x%X 



tool: D92: acceptance 0 0x%X 


tool: D61: acceptance 1 0x%X 


tool: D156: acceptance 2 0x%X 


tool: D7: acceptance 3 0x%X 



tool: D177: acceptance mask 0x%X 


tool: D170: acceptance mask 0x%X 



tool: D82: control_register 0x%X 



tool: D128: Set identifier - 0xA6 0xB0 0x12 0x30

tool: D66: Set data - 0x12 0x34 0x56 0x78 0x9A 0xBC 0xDE 0xF0

tool: D173: Finnished 

tool: D182: interrupt_register 0x%X 



assistant: ```c
void self_reception_test() {
  volatile unsigned char r_val;
  printf("Switch on Reset Mode\n");
  *((volatile unsigned char *)(0xfff20000 + 0x0000)) = 0x01;
  printf("control 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0000)));
  *((volatile unsigned char *)(0xfff20000 + 0x001F)) = 0x80;
  printf("clock_divider 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x001F)));
  *((volatile unsigned char *)(0xfff20000 + 0x0006)) = 0x80;
  *((volatile unsigned char *)(0xfff20000 + 0x0007)) = 0x34;
  *((volatile unsigned char *)(0xfff20000 + 0x0010)) = 0xA6;
  printf("acceptance 0 0x%X \n", *((volatile unsigned char *)(0xfff20000 + 0x0010)));
  *((volatile unsigned char *)(0xfff20000 + 0x0011)) = 0xB0;
  printf("acceptance 1 0x%X \n", *((volatile unsigned char *)(0xfff20000 + 0x0011)));
  *((volatile unsigned char *)(0xfff20000 + 0x0012)) = 0x12;
  printf("acceptance 2 0x%X \n", *((volatile unsigned char *)(0xfff20000 + 0x0012)));
  *((volatile unsigned char *)(0xfff20000 + 0x0013)) = 0x30;
  printf("acceptance 3 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0013)));
  *((volatile unsigned char *)(0xfff20000 + 0x0014)) = 0x00;
  printf("acceptance mask 0x%X \n", *((volatile unsigned char *)(0xfff20000 + 0x0014)));
  *((volatile unsigned char *)(0xfff20000 + 0x0015)) = 0x00;
  printf("acceptance mask 0x%X \n", *((volatile unsigned char *)(0xfff20000 + 0x0015)));
  *((volatile unsigned char *)(0xfff20000 + 0x0016)) = 0x00;
  printf("acceptance mask 0x%X \n", *((volatile unsigned char *)(0xfff20000 + 0x0016)));
  *((volatile unsigned char *)(0xfff20000 + 0x0017)) = 0x00;
  printf("acceptance mask 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0017)));
  *((volatile unsigned char *)(0xfff20000 + 0x0000)) = 0x05;
  printf("control 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0000)));
  kill_time(50);
  *((volatile unsigned char *)(0xfff20000 + 0x0000)) = 0X04;
  printf("control_register 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0000)));
  kill_time(150);
  *((volatile unsigned char *)(0xfff20000 + 0x0010)) = 0x88;
  printf("Set identifier - 0xA6 0xB0 0x12 0x30\n");
  *((volatile unsigned char *)(0xfff20000 + 0x0011)) = 0xA6;
  *((volatile unsigned char *)(0xfff20000 + 0x0012)) = 0xB0;
  *((volatile unsigned char *)(0xfff20000 + 0x0013)) = 0x12;
  *((volatile unsigned char *)(0xfff20000 + 0x0014)) = 0x30;
  printf("Set data - 0x12 0x34 0x56 0x78 0x9A 0xBC 0xDE 0xF0\n");
  *((volatile unsigned char *)(0xfff20000 + 0x0015)) = 0x12;
  *((volatile unsigned char *)(0xfff20000 + 0x0016)) = 0x34;
  *((volatile unsigned char *)(0xfff20000 + 0x0017)) = 0x56;
  *((volatile unsigned char *)(0xfff20000 + 0x0018)) = 0x78;
  *((volatile unsigned char *)(0xfff20000 + 0x0019)) = 0x9A;
  *((volatile unsigned char *)(0xfff20000 + 0x001A)) = 0xBC;
  *((volatile unsigned char *)(0xfff20000 + 0x001B)) = 0xDE;
  *((volatile unsigned char *)(0xfff20000 + 0x001C)) = 0xF0;
  *((volatile unsigned char *)(0xfff20000 + 0x0004)) = 0xFF;
  kill_time(50);
  self_reception_request();
  printf("Finnished \n");
  printf("control_register 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0000)));
  printf("interrupt_register 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0003)));
  printf("control_register 0x%X \n\n", *((volatile unsigned char *)(0xfff20000 + 0x0000)));
}
```