// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/fat.c
// Function: do_vfat_entry
static void do_vfat_entry(deark *c, lctx *d, struct dirctx *dctx, i64 pos1, u8 seq_num_raw)
{
	u8 seq_num;
	u8 fn_cksum;
	int is_first_entry = 0;
	i64 startpos_in_lfn;

	if(seq_num_raw==0xe5) {
		de_dbg(c, "[deleted VFAT entry]");
		dctx->lfn_valid = 0;
		goto done;
	}

	de_dbg(c, "seq number: 0x%02x", (UI)seq_num_raw);

	seq_num = seq_num_raw & 0xbf;

	if(seq_num<1 || seq_num>LFN_MAX_FRAGMENTS) {
		de_warn(c, "Bad VFAT sequence number (%u)", (UI)seq_num);
		dctx->lfn_valid = 0;
		goto done;
	}

	if(seq_num_raw & 0x40) {
		is_first_entry = 1;
		de_zeromem(dctx->pending_lfn, sizeof(dctx->pending_lfn));
		dctx->first_seq_num = seq_num;
		dctx->lfn_valid = 1;
	}
	else {
		if(!dctx->lfn_valid || (seq_num+1 != dctx->prev_seq_num)) {
			de_dbg(c, "[stray VFAT entry]");
			dctx->lfn_valid = 0;
			goto done;
		}
	}
	dctx->prev_seq_num = seq_num;

	startpos_in_lfn = LFN_CHARS_PER_FRAGMENT*2*((i64)seq_num-1);

	de_read(&dctx->pending_lfn[startpos_in_lfn+ 0], pos1+ 1, 10); // 5 chars
	fn_cksum = de_getbyte(pos1+13);
	de_read(&dctx->pending_lfn[startpos_in_lfn+10], pos1+14, 12); // 6 more chars
	de_read(&dctx->pending_lfn[startpos_in_lfn+22], pos1+28,  4); // 2 more chars
	de_dbg(c, "filename checksum (reported): 0x%02x", (UI)fn_cksum);
	if(!is_first_entry) {
		if(fn_cksum != dctx->name_cksum) {
			de_dbg(c, "[inconsistent VFAT checksums]");
			dctx->lfn_valid = 0;
		}
	}
	dctx->name_cksum = fn_cksum;

done:
	;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movb %r8b, %al
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movb %al, -0x21(%rbp)
movl $0x0, -0x28(%rbp)
movzbl -0x21(%rbp), %eax
cmpl $0xe5, %eax
jne 0x8472e
movq -0x8(%rbp), %rdi
leaq 0x129bcf(%rip), %rsi    # 0x1ae2ea
movb $0x0, %al
callq 0x15b0d0
movq -0x18(%rbp), %rax
movb $0x0, (%rax)
jmp 0x84904
movq -0x8(%rbp), %rdi
movzbl -0x21(%rbp), %edx
leaq 0x129bc2(%rip), %rsi    # 0x1ae2ff
movb $0x0, %al
callq 0x15b0d0
movzbl -0x21(%rbp), %eax
andl $0xbf, %eax
movb %al, -0x22(%rbp)
movzbl -0x22(%rbp), %eax
cmpl $0x1, %eax
jl 0x84762
movzbl -0x22(%rbp), %eax
cmpl $0x14, %eax
jle 0x84784
movq -0x8(%rbp), %rdi
movzbl -0x22(%rbp), %edx
leaq 0x129ba1(%rip), %rsi    # 0x1ae312
movb $0x0, %al
callq 0x15bc10
movq -0x18(%rbp), %rax
movb $0x0, (%rax)
jmp 0x84904
movzbl -0x21(%rbp), %eax
andl $0x40, %eax
cmpl $0x0, %eax
je 0x847be
movl $0x1, -0x28(%rbp)
movq -0x18(%rbp), %rdi
addq $0x18, %rdi
xorl %esi, %esi
movl $0x208, %edx            # imm = 0x208
callq 0x19140
movb -0x22(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x18(%rbp), %rax
movb $0x1, (%rax)
jmp 0x847fa
movq -0x18(%rbp), %rax
cmpb $0x0, (%rax)
je 0x847da
movzbl -0x22(%rbp), %eax
addl $0x1, %eax
movq -0x18(%rbp), %rcx
movzbl 0x2(%rcx), %ecx
cmpl %ecx, %eax
je 0x847f8
movq -0x8(%rbp), %rdi
leaq 0x129b4b(%rip), %rsi    # 0x1ae330
movb $0x0, %al
callq 0x15b0d0
movq -0x18(%rbp), %rax
movb $0x0, (%rax)
jmp 0x84904
jmp 0x847fa
movb -0x22(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, 0x2(%rax)
movzbl -0x22(%rbp), %eax
subq $0x1, %rax
imulq $0x1a, %rax, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
addq $0x18, %rsi
movq -0x30(%rbp), %rax
addq $0x0, %rax
addq %rax, %rsi
movq -0x20(%rbp), %rdx
addq $0x1, %rdx
movl $0xa, %ecx
callq 0x164d10
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x20(%rbp), %rsi
addq $0xd, %rsi
callq 0x165060
movb %al, -0x23(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
addq $0x18, %rsi
movq -0x30(%rbp), %rax
addq $0xa, %rax
addq %rax, %rsi
movq -0x20(%rbp), %rdx
addq $0xe, %rdx
movl $0xc, %ecx
callq 0x164d10
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
addq $0x18, %rsi
movq -0x30(%rbp), %rax
addq $0x16, %rax
addq %rax, %rsi
movq -0x20(%rbp), %rdx
addq $0x1c, %rdx
movl $0x4, %ecx
callq 0x164d10
movq -0x8(%rbp), %rdi
movzbl -0x23(%rbp), %edx
leaq 0x129a81(%rip), %rsi    # 0x1ae343
movb $0x0, %al
callq 0x15b0d0
cmpl $0x0, -0x28(%rbp)
jne 0x848fa
movzbl -0x23(%rbp), %eax
movq -0x18(%rbp), %rcx
movzbl 0x3(%rcx), %ecx
cmpl %ecx, %eax
je 0x848f8
movq -0x8(%rbp), %rdi
leaq 0x129a7e(%rip), %rsi    # 0x1ae368
movb $0x0, %al
callq 0x15b0d0
movq -0x18(%rbp), %rax
movb $0x0, (%rax)
jmp 0x848fa
movb -0x23(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, 0x3(%rax)
addq $0x30, %rsp
popq %rbp
retq
nopw (%rax,%rax)