This is simple.
:NN - amount of bytes in followed string (20 is 32, 0x20 hex == 32 dec)
Then LLLL is a 2 bytes offset from HHHH pointer. HHHHLLLL is absolete address. For example, second string: 20 1080 mease 32 bytes starting from HHHH1080
HHHH pointer is defined in first string: 02 - fixed size of this pointer. For 32 bit it always will be 2 bytes (half). Than 0000, always. Than 04 is a command that we need to define this HHHH pointer and 0000 at the end of first string is that pointer value, so HHHH == 0x0000.
0xFA is CRC.
So, starting from second string we need to put 32 bytes to the 0x00001080 address. 0x50 is CRC.
Next string - 32 bytes to the 0x000010A0 address and so on
This is my HEX flasher code:
https://github.com/Virviglaz/MyLibraries/blob/master/Common/HEX_Flasher.c
https://github.com/Virviglaz/MyLibraries/blob/master/Common/HEX_Flasher.h