// File: bstrysko[P]IntelHexParser/src/IntelHexFile.cpp
// Function: IntelHexFile::IntelHexFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
IntelHexFile::IntelHexFile(string filename)
{
	ifstream file(filename.c_str());

	if(!file.is_open())
	{
		stringstream o;
		o << "Cannot load file ";
		o << filename;
		throw ios_base::failure(o.str());
	}

	char buffer[INTEL_HEX_FILE_MAX_ENTRY_SIZE];

	while(true)
	{
		file.getline(buffer, INTEL_HEX_FILE_MAX_ENTRY_SIZE);

		/*
		 * End of file
		 */
		if(!file)
		{
			break;
		}

		IntelHexFileEntry entry(buffer);

		if((entry.getRecordType() != 0x0) && (entry.getRecordType() != 0x1))
		{
			stringstream o;
			o << "Unsupported record type: 0x";
			o << hex << (uint32_t)entry.getRecordType();
			throw ios_base::failure(o.str());
		}

		addressToFileEntries.insert(pair<uint16_t, IntelHexFileEntry>(entry.getAddress(), entry));
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x8a0, %rsp            # imm = 0x8A0
movq %rsi, -0x830(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x840(%rbp)
movq %rdi, %rax
movq %rax, -0x838(%rbp)
callq 0xbef0
movq -0x830(%rbp), %rdi
callq 0xb380
movq %rax, %rsi
leaq -0x218(%rbp), %rdi
movl $0x8, %edx
callq 0xc3a0
jmp 0xc6e6
leaq -0x218(%rbp), %rdi
callq 0xc0f0
movb %al, -0x841(%rbp)
jmp 0xc6fa
movb -0x841(%rbp), %al
testb $0x1, %al
jne 0xc848
jmp 0xc70a
leaq -0x3b0(%rbp), %rdi
callq 0xb740
jmp 0xc718
leaq -0x3a0(%rbp), %rdi
leaq 0x68da(%rip), %rsi      # 0x13000
callq 0xba50
jmp 0xc72d
movq -0x830(%rbp), %rsi
leaq -0x3a0(%rbp), %rdi
callq 0xb940
jmp 0xc742
movb $0x1, -0x3d1(%rbp)
movl $0x20, %edi
callq 0xb460
movq %rax, -0x850(%rbp)
leaq -0x3d0(%rbp), %rdi
leaq -0x3b0(%rbp), %rsi
callq 0xba30
jmp 0xc76f
movq -0x850(%rbp), %rdi
leaq -0x3d0(%rbp), %rsi
callq 0xc480
jmp 0xc784
movq -0x850(%rbp), %rdi
movb $0x0, -0x3d1(%rbp)
movq 0xb80f(%rip), %rsi      # 0x17fa8
movq 0xb820(%rip), %rdx      # 0x17fc0
callq 0xc250
jmp 0xcbe6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xcbce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xcbc2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xc837
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xc81e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
leaq -0x3d0(%rbp), %rdi
callq 0xb690
testb $0x1, -0x3d1(%rbp)
jne 0xc829
jmp 0xc835
movq -0x850(%rbp), %rdi
callq 0xb780
jmp 0xc837
leaq -0x3b0(%rbp), %rdi
callq 0xb800
jmp 0xcbc2
jmp 0xc84a
jmp 0xc84c
leaq -0x218(%rbp), %rdi
leaq -0x5e0(%rbp), %rsi
movl $0x20c, %edx            # imm = 0x20C
callq 0xb270
jmp 0xc866
movq -0x218(%rbp), %rax
movq -0x18(%rax), %rax
leaq -0x218(%rbp,%rax), %rdi
callq 0xb3e0
movb %al, -0x851(%rbp)
jmp 0xc886
movb -0x851(%rbp), %al
testb $0x1, %al
jne 0xc892
jmp 0xc897
jmp 0xcbad
leaq -0x629(%rbp), %rdi
movq %rdi, -0x860(%rbp)
callq 0xc2f0
movq -0x860(%rbp), %rdx
leaq -0x628(%rbp), %rdi
leaq -0x5e0(%rbp), %rsi
callq 0xc230
jmp 0xc8c6
leaq -0x608(%rbp), %rdi
leaq -0x628(%rbp), %rsi
callq 0xb4c0
jmp 0xc8db
leaq -0x628(%rbp), %rdi
callq 0xb690
leaq -0x629(%rbp), %rdi
callq 0xbb80
leaq -0x608(%rbp), %rdi
callq 0xc310
movb %al, -0x861(%rbp)
jmp 0xc907
movb -0x861(%rbp), %al
movzbl %al, %eax
cmpl $0x0, %eax
je 0xcadb
leaq -0x608(%rbp), %rdi
callq 0xc310
movb %al, -0x862(%rbp)
jmp 0xc92d
movb -0x862(%rbp), %al
movzbl %al, %eax
cmpl $0x1, %eax
je 0xcadb
leaq -0x7b8(%rbp), %rdi
callq 0xb740
jmp 0xc94d
leaq -0x7a8(%rbp), %rdi
leaq 0x66b7(%rip), %rsi      # 0x13012
callq 0xba50
jmp 0xc962
leaq -0x7a8(%rbp), %rdi
movq 0xb680(%rip), %rsi      # 0x17ff0
callq 0xb2e0
movq %rax, -0x870(%rbp)
jmp 0xc97e
leaq -0x608(%rbp), %rdi
callq 0xc310
movb %al, -0x871(%rbp)
jmp 0xc992
movq -0x870(%rbp), %rdi
movb -0x871(%rbp), %al
movzbl %al, %esi
callq 0xbe10
jmp 0xc9a9
movb $0x1, -0x7d9(%rbp)
movl $0x20, %edi
callq 0xb460
movq %rax, -0x880(%rbp)
leaq -0x7d8(%rbp), %rdi
leaq -0x7b8(%rbp), %rsi
callq 0xba30
jmp 0xc9d6
movq -0x880(%rbp), %rdi
leaq -0x7d8(%rbp), %rsi
callq 0xc480
jmp 0xc9eb
movq -0x880(%rbp), %rdi
movb $0x0, -0x7d9(%rbp)
movq 0xb5a8(%rip), %rsi      # 0x17fa8
movq 0xb5b9(%rip), %rdx      # 0x17fc0
callq 0xc250
jmp 0xcbe6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xca43
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
leaq -0x628(%rbp), %rdi
callq 0xb690
leaq -0x629(%rbp), %rdi
callq 0xbb80
jmp 0xcbc2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xcb9f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xcaca
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
jmp 0xcab1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
leaq -0x7d8(%rbp), %rdi
callq 0xb690
testb $0x1, -0x7d9(%rbp)
jne 0xcabc
jmp 0xcac8
movq -0x880(%rbp), %rdi
callq 0xb780
jmp 0xcaca
leaq -0x7b8(%rbp), %rdi
callq 0xb800
jmp 0xcb9f
movq -0x838(%rbp), %rax
movq %rax, -0x890(%rbp)
leaq -0x608(%rbp), %rdi
callq 0xb950
movw %ax, -0x882(%rbp)
jmp 0xcafe
movw -0x882(%rbp), %ax
movw %ax, -0x812(%rbp)
leaq -0x810(%rbp), %rdi
leaq -0x812(%rbp), %rsi
leaq -0x608(%rbp), %rdx
callq 0xb7b0
jmp 0xcb28
movq -0x890(%rbp), %rdi
leaq -0x810(%rbp), %rsi
callq 0xc2a0
movb %dl, -0x899(%rbp)
movq %rax, -0x898(%rbp)
jmp 0xcb4a
movb -0x899(%rbp), %al
movq -0x898(%rbp), %rcx
movq %rcx, -0x828(%rbp)
movb %al, -0x820(%rbp)
leaq -0x810(%rbp), %rdi
callq 0xb650
leaq -0x608(%rbp), %rdi
callq 0xb490
jmp 0xc84a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x220(%rbp)
movl %eax, -0x224(%rbp)
leaq -0x810(%rbp), %rdi
callq 0xb650
leaq -0x608(%rbp), %rdi
callq 0xb490
jmp 0xcbc2
leaq -0x218(%rbp), %rdi
callq 0xb200
addq $0x8a0, %rsp            # imm = 0x8A0
popq %rbp
retq
leaq -0x218(%rbp), %rdi
callq 0xb200
movq -0x840(%rbp), %rdi
callq 0xc380
movq -0x220(%rbp), %rdi
callq 0xc2b0
nopw %cs:(%rax,%rax)