// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/ilbm.c
// Function: do_vdat_chunk
static void do_vdat_chunk(deark *c, struct vdat_ctx *vdctx, i64 pos1, i64 len)
{
	i64 pos;
	i64 endpos;
	i64 count;
	i64 cmd_cnt;
	i64 i, k;
	u8 cmd;
	u8 *cmds = NULL;
	u8 elembuf[2];

	vdctx->cur_col = 0;
	vdctx->ypos = 0;
	pos = pos1;
	endpos = pos1+len;

	cmd_cnt = de_getu16be(pos); // command count + 2
	pos+=2;
	cmd_cnt -= 2;
	de_dbg(c, "number of command bytes: %d", (int)cmd_cnt);
	if(cmd_cnt<1) goto done;

	cmds = de_mallocarray(c, cmd_cnt, sizeof(u8));

	// Read commands
	de_read(cmds, pos, cmd_cnt);
	pos += cmd_cnt;

	// Read data
	for(i=0; i<cmd_cnt; i++) {
		if(pos>=endpos) {
			break;
		}

		cmd = cmds[i];

		if(cmd==0x00) {
			count = de_getu16be(pos);
			pos += 2;
			for(k=0; k<count; k++) {
				de_read(elembuf, pos, 2);
				pos += 2;
				vdat_write_element(c, vdctx, elembuf);
			}
		}
		else if(cmd==0x01) {
			count = de_getu16be(pos);
			pos += 2;
			de_read(elembuf, pos, 2);
			pos += 2;
			for(k=0; k<count; k++) {
				vdat_write_element(c, vdctx, elembuf);
			}
		}
		else if(cmd>=0x80) {
			count = (128-(i64)(cmd&0x7f));
			for(k=0; k<count; k++) {
				de_read(elembuf, pos, 2);
				pos += 2;
				vdat_write_element(c, vdctx, elembuf);
			}
		}
		else { // cmd is from 0x02 to 0x7f
			de_read(elembuf, pos, 2);
			pos += 2;
			count = (i64)cmd;
			for(k=0; k<count; k++) {
				vdat_write_element(c, vdctx, elembuf);
			}
		}
	}

done:
	de_free(c, cmds);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq $0x0, -0x60(%rbp)
movq -0x10(%rbp), %rax
movq $0x0, 0x20(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x28(%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
addq -0x20(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x28(%rbp), %rsi
callq 0x1651d0
movq %rax, -0x40(%rbp)
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movq -0x40(%rbp), %rax
subq $0x2, %rax
movq %rax, -0x40(%rbp)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movl %eax, %edx
leaq 0x100db1(%rip), %rsi    # 0x1b48ab
movb $0x0, %al
callq 0x15b0d0
cmpq $0x1, -0x40(%rbp)
jge 0xb3b0d
jmp 0xb3d7b
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rsi
movl $0x1, %edx
callq 0x15c450
movq %rax, -0x60(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x60(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0x40(%rbp), %rcx
callq 0x164d10
movq -0x40(%rbp), %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x40(%rbp), %rax
jge 0xb3d79
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jl 0xb3b6d
jmp 0xb3d79
movq -0x60(%rbp), %rax
movq -0x48(%rbp), %rcx
movb (%rax,%rcx), %al
movb %al, -0x51(%rbp)
movzbl -0x51(%rbp), %eax
cmpl $0x0, %eax
jne 0xb3c01
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x28(%rbp), %rsi
callq 0x1651d0
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0xb3bfc
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x62(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0x2, %ecx
callq 0x164d10
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x62(%rbp), %rdx
callq 0xb3d90
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0xb3bad
jmp 0xb3d66
movzbl -0x51(%rbp), %eax
cmpl $0x1, %eax
jne 0xb3c87
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x28(%rbp), %rsi
callq 0x1651d0
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x62(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0x2, %ecx
callq 0x164d10
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0xb3c82
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x62(%rbp), %rdx
callq 0xb3d90
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0xb3c59
jmp 0xb3d64
movzbl -0x51(%rbp), %eax
cmpl $0x80, %eax
jl 0xb3d01
movzbl -0x51(%rbp), %eax
andl $0x7f, %eax
movslq %eax, %rcx
movl $0x80, %eax
subq %rcx, %rax
movq %rax, -0x38(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0xb3cff
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x62(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0x2, %ecx
callq 0x164d10
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x62(%rbp), %rdx
callq 0xb3d90
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0xb3cb0
jmp 0xb3d62
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x62(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0x2, %ecx
callq 0x164d10
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movzbl -0x51(%rbp), %eax
movq %rax, -0x38(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0xb3d60
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x62(%rbp), %rdx
callq 0xb3d90
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0xb3d37
jmp 0xb3d62
jmp 0xb3d64
jmp 0xb3d66
jmp 0xb3d68
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0xb3b50
jmp 0xb3d7b
movq -0x8(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x15b820
addq $0x70, %rsp
popq %rbp
retq
nop