// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/bintext.c
// Function: xbin_decompress_data
static void xbin_decompress_data(deark *c, lctx *d, i64 pos1, dbuf *unc_data)
{
	i64 pos;
	u8 cmprtype;
	i64 count;
	i64 xpos, ypos;
	u8 b;
	u8 b1, b2;
	i64 k;

	pos = pos1;

	xpos = 0; ypos = 0;

	while(pos < c->infile->len) {
		if(xpos >= d->csctx.width_in_chars) {
			ypos++;
			xpos = 0;
		}
		if(ypos >= d->csctx.height_in_chars) {
			break;
		}

		b = de_getbyte_p(&pos);
		cmprtype = b>>6;
		count = (i64)(b&0x3f) +1;

		switch(cmprtype) {
		case 0: // Uncompressed
			dbuf_copy(c->infile, pos, count*2, unc_data);
			pos += count*2;
			break;
		case 1: // Character compression
			b1 = de_getbyte_p(&pos); // character code
			for(k=0; k<count; k++) {
				b2 = de_getbyte_p(&pos); // attribute code
				dbuf_writebyte(unc_data, b1);
				dbuf_writebyte(unc_data, b2);
			}
			break;
		case 2: // Attribute compression
			b2 = de_getbyte_p(&pos); // attribute code
			for(k=0; k<count; k++) {
				b1 = de_getbyte_p(&pos); // character code
				dbuf_writebyte(unc_data, b1);
				dbuf_writebyte(unc_data, b2);
			}
			break;
		case 3: // Character/Attribute compression
			b1 = de_getbyte_p(&pos); // character code
			b2 = de_getbyte_p(&pos); // attribute code
			for(k=0; k<count; k++) {
				dbuf_writebyte(unc_data, b1);
				dbuf_writebyte(unc_data, b2);
			}
			break;
		}

		xpos += count;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x40(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x28(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0x18(%rcx), %rcx
cmpq 0x18(%rcx), %rax
jge 0x4126d
movq -0x40(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x50(%rcx), %rax
jl 0x41098
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x48(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x58(%rcx), %rax
jl 0x410ab
jmp 0x4126d
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, -0x49(%rbp)
movzbl -0x49(%rbp), %eax
shrl $0x6, %eax
movb %al, -0x29(%rbp)
movzbl -0x49(%rbp), %eax
andl $0x3f, %eax
incq %rax
movq %rax, -0x38(%rbp)
movzbl -0x29(%rbp), %eax
movq %rax, -0x60(%rbp)
subq $0x3, %rax
ja 0x4125c
movq -0x60(%rbp), %rax
leaq 0x161cb0(%rip), %rcx    # 0x1a2da4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rdx
shlq %rdx
movq -0x20(%rbp), %rcx
callq 0x166070
movq -0x38(%rbp), %rax
shlq %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x4125c
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, -0x4a(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x58(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x4118f
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, -0x4b(%rbp)
movq -0x20(%rbp), %rdi
movzbl -0x4a(%rbp), %esi
callq 0x168380
movq -0x20(%rbp), %rdi
movzbl -0x4b(%rbp), %esi
callq 0x168380
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x41149
jmp 0x4125c
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, -0x4b(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x58(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x411f6
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, -0x4a(%rbp)
movq -0x20(%rbp), %rdi
movzbl -0x4a(%rbp), %esi
callq 0x168380
movq -0x20(%rbp), %rdi
movzbl -0x4b(%rbp), %esi
callq 0x168380
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x411b0
jmp 0x4125c
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, -0x4a(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, -0x4b(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x58(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x4125a
movq -0x20(%rbp), %rdi
movzbl -0x4a(%rbp), %esi
callq 0x168380
movq -0x20(%rbp), %rdi
movzbl -0x4b(%rbp), %esi
callq 0x168380
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x41228
jmp 0x4125c
movq -0x38(%rbp), %rax
addq -0x40(%rbp), %rax
movq %rax, -0x40(%rbp)
jmp 0x41060
addq $0x60, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)