global enlight

section .data
  red dq 0 ; some comment
  green dq 0
  blue dq 0
  data dq 0
  N dd 0
  M dd 0
  change dd 0
  delta db 0

section .text
enlight:
  call assign_arguments
  call set_data
  call make_deltas
  ret

assign_arguments:
  mov qword[red], rdi
  mov qword[green], rsi
  mov qword[blue], rdx
  mov dword[N], ecx
  mov dword[M], r8d
  mov dword[change], r9d
  mov al, byte[rsp + 16]
  mov byte[delta], al
  ret

set_data:
  mov eax, dword[change]
  cmp eax, 1
  jne not_1
  mov rax, qword[red]
  mov qword[data], rax
  ret
not_1:
  cmp eax, 2
  jne not_2
  mov rax, qword[green]
  mov qword[data], rax
  ret
not_2:
  mov rax, qword[blue]
  mov qword[data], rax
  ret


make_deltas:
  mov ecx, dword[N]
  mov eax, dword[M]
  imul ecx, eax
loop_start:
  call make_delta
  loop loop_start
  ret

make_delta:
  mov rax, qword[data]
  add rax, rcx
  dec rax
  mov dl, byte[delta]
  cmp dl, 0
  jl substracting
adding:
  add dl, byte[rax]
  jc adding_overflow
  mov byte[rax], dl
  ret
adding_overflow:
  mov byte[rax], 255 
  ret
substracting:
  mov r9b, dl
  mov dl, 0
  sub dl, r9b
  mov r8b, byte[rax]
  sub r8b, dl
  jc substracting_overflow
  mov byte[rax], r8b
  ret
; another comment
substracting_overflow:
  mov byte[rax], 0
  ret