// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/bintext.c
// Function: de_run_xbin
static void de_run_xbin(deark *c, de_module_params *mparams)
{
	lctx *d = NULL;
	struct de_char_context *charctx = NULL;
	struct de_SAUCE_detection_data sdd;
	struct de_SAUCE_info *si = NULL;
	i64 pos = 0;
	u8 flags;
	dbuf *unc_data = NULL;

	d = de_malloc(c, sizeof(lctx));

	charctx = de_create_charctx(c, 0);
	charctx->prefer_image_output = 1;
	de_char_decide_output_format(c, charctx);

	fmtutil_detect_SAUCE(c, c->infile, &sdd, 0x1);
	if(sdd.has_SAUCE) {
		si = fmtutil_create_SAUCE(c);

		de_dbg_indent(c, 1);
		fmtutil_handle_SAUCE(c, c->infile, si);
		de_dbg_indent(c, -1);

		charctx->title = si->title;
		charctx->artist = si->artist;
		charctx->organization = si->organization;
		charctx->creation_date = si->creation_date;
		charctx->comment = si->comment;
	}

	d->csctx.width_in_chars = de_getu16le(5);
	d->csctx.height_in_chars = de_getu16le(7);
	d->font_height = (i64)de_getbyte(9);

	flags = de_getbyte(10);
	de_dbg(c, "dimensions: %d"DE_CHAR_TIMES"%d characters", (int)d->csctx.width_in_chars,
		(int)d->csctx.height_in_chars);
	de_dbg(c, "font height: %d", (int)d->font_height);
	de_dbg(c, "flags: 0x%02x", (UI)flags);
	d->has_palette = (flags&0x01)?1:0;
	d->has_font = (flags&0x02)?1:0;
	d->compression = (flags&0x04)?1:0;
	d->csctx.nonblink = (flags&0x08)?1:0;
	d->has_512chars = (flags&0x10)?1:0;
	de_dbg_indent(c, 1);
	de_dbg(c, "has palette: %u", (UI)d->has_palette);
	de_dbg(c, "has font: %u", (UI)d->has_font);
	de_dbg(c, "compression: %u", (UI)d->compression);
	de_dbg(c, "non-blink mode: %u", (UI)d->csctx.nonblink);
	de_dbg(c, "512 character mode: %u", (UI)d->has_512chars);
	de_dbg_indent(c, -1);

	if(d->has_font && (d->font_height<1 || d->font_height>32)) {
		de_err(c, "Invalid font height: %d", (int)d->font_height);
		goto done;
	}
	pos = 11;

	if(d->has_palette) {
		do_read_palette(c, d, charctx, pos, 0);
		pos += 48;
	}
	else {
		de_dbg(c, "using default palette");
		d->csctx.use_default_pal = 1;
	}

	if(d->has_font) {
		d->font = de_create_bitmap_font(c);
		d->font->has_nonunicode_codepoints = 1;
		d->font->has_unicode_codepoints = 1;
		d->font->prefer_unicode = 0;
		d->font->num_chars = d->has_512chars ? 512 : 256;
		d->font_data_len = d->font->num_chars * d->font_height;
		if(d->font->num_chars!=256) {
			de_err(c, "%d-character mode is not supported", (int)d->font->num_chars);
			goto done;
		}

		do_read_font_data(c, d, pos);
		pos += d->font_data_len;

		if(d->is_standard_font) {
			charctx->suppress_custom_font_warning = 1;
		}

		if(!do_generate_font(c, d)) goto done;

		if(c->extract_level>=2) {
			do_extract_font(c, d);
		}

		charctx->font = d->font;
	}
	else {
		// Use default font

		if(d->has_512chars) {
			de_err(c, "This type of XBIN file is not supported.");
			goto done;
		}

		if(d->font_height==0) {
			// Not really legal, but we'll let it mean "default".
		}
		else if(d->font_height!=16) {
			if(charctx->outfmt==1) { // image output
				de_warn(c, "Incompatible font height (%d), using 16 instead.", (int)d->font_height);
			}
		}
		d->font_height = 16;
	}

	de_dbg(c, "image data at %"I64_FMT, pos);

	if(d->compression) {
		unc_data = dbuf_create_membuf(c, d->csctx.width_in_chars * d->csctx.height_in_chars * 2, 1);
		xbin_decompress_data(c, d, pos, unc_data);
	}
	else {
		unc_data = dbuf_open_input_subfile(c->infile, pos, c->infile->len-pos);
	}
	d->csctx.inf = unc_data;
	d->csctx.inf_pos = 0;
	d->csctx.inf_len = unc_data->len;
	fmtutil_char_simple_run(c, &d->csctx, charctx);

done:
	dbuf_close(unc_data);
	de_free_charctx_screens(c, charctx);
	de_destroy_charctx(c, charctx);
	fmtutil_free_SAUCE(c, si);
	free_lctx(c, d);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq $0x0, -0x18(%rbp)
movq $0x0, -0x20(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x8(%rbp), %rdi
movl $0x70, %esi
callq 0x15b780
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0x16d7b0
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movb $0x1, (%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x16d9a0
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rsi
leaq -0x23(%rbp), %rdx
movl $0x1, %ecx
callq 0x173ca0
cmpb $0x0, -0x23(%rbp)
je 0x3e8f0
movq -0x8(%rbp), %rdi
callq 0x173e20
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0x15b560
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x30(%rbp), %rdx
callq 0x173db0
movq -0x8(%rbp), %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
callq 0x15b560
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x68(%rax)
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x70(%rax)
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x78(%rax)
movq -0x20(%rbp), %rax
movq -0x30(%rbp), %rcx
movq 0x20(%rcx), %rdx
movq %rdx, 0x80(%rax)
movq 0x28(%rcx), %rcx
movq %rcx, 0x88(%rax)
movq -0x30(%rbp), %rax
movq 0x60(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x90(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x5, %esi
callq 0x165280
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x7, %esi
callq 0x165280
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x58(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x9, %esi
callq 0x165060
movzbl %al, %eax
movl %eax, %ecx
movq -0x18(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0xa, %esi
callq 0x165060
movb %al, -0x39(%rbp)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rax
movl %eax, %edx
movq -0x18(%rbp), %rax
movq 0x58(%rax), %rax
movl %eax, %ecx
leaq 0x164588(%rip), %rsi    # 0x1a2f05
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movl %eax, %edx
leaq 0x1645d9(%rip), %rsi    # 0x1a2f72
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movzbl -0x39(%rbp), %edx
leaq 0x17d16a(%rip), %rsi    # 0x1bbb19
movb $0x0, %al
callq 0x15b0d0
movzbl -0x39(%rbp), %edx
andl $0x1, %edx
xorl %eax, %eax
movl $0x1, %ecx
cmpl $0x0, %edx
cmovnel %ecx, %eax
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x2(%rax)
movzbl -0x39(%rbp), %edx
andl $0x2, %edx
xorl %eax, %eax
movl $0x1, %ecx
cmpl $0x0, %edx
cmovnel %ecx, %eax
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x3(%rax)
movzbl -0x39(%rbp), %edx
andl $0x4, %edx
xorl %eax, %eax
movl $0x1, %ecx
cmpl $0x0, %edx
cmovnel %ecx, %eax
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x4(%rax)
movzbl -0x39(%rbp), %edx
andl $0x8, %edx
xorl %eax, %eax
movl $0x1, %ecx
cmpl $0x0, %edx
cmovnel %ecx, %eax
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x4d(%rax)
movzbl -0x39(%rbp), %edx
andl $0x10, %edx
xorl %eax, %eax
movl $0x1, %ecx
cmpl $0x0, %edx
cmovnel %ecx, %eax
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x5(%rax)
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0x15b560
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movzbl 0x2(%rax), %edx
leaq 0x1644bb(%rip), %rsi    # 0x1a2f23
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movzbl 0x3(%rax), %edx
leaq 0x1644b1(%rip), %rsi    # 0x1a2f33
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movzbl 0x4(%rax), %edx
leaq 0x160cf2(%rip), %rsi    # 0x19f78e
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movzbl 0x4d(%rax), %edx
leaq 0x16448a(%rip), %rsi    # 0x1a2f40
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movzbl 0x5(%rax), %edx
leaq 0x164483(%rip), %rsi    # 0x1a2f53
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
callq 0x15b560
movq -0x18(%rbp), %rax
movzbl 0x3(%rax), %eax
cmpl $0x0, %eax
je 0x3eb29
movq -0x18(%rbp), %rax
cmpq $0x1, 0x8(%rax)
jl 0x3eb08
movq -0x18(%rbp), %rax
cmpq $0x20, 0x8(%rax)
jle 0x3eb29
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movl %eax, %edx
leaq 0x16444d(%rip), %rsi    # 0x1a2f6a
movb $0x0, %al
callq 0x15bfb0
jmp 0x3ede0
movq $0xb, -0x38(%rbp)
movq -0x18(%rbp), %rax
cmpb $0x0, 0x2(%rax)
je 0x3eb61
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x38(%rbp), %rcx
xorl %r8d, %r8d
callq 0x40a90
movq -0x38(%rbp), %rax
addq $0x30, %rax
movq %rax, -0x38(%rbp)
jmp 0x3eb7b
movq -0x8(%rbp), %rdi
leaq 0x164416(%rip), %rsi    # 0x1a2f82
movb $0x0, %al
callq 0x15b0d0
movq -0x18(%rbp), %rax
movb $0x1, 0x4c(%rax)
movq -0x18(%rbp), %rax
cmpb $0x0, 0x3(%rax)
je 0x3ecb2
movq -0x8(%rbp), %rdi
callq 0x16f6f0
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movb $0x1, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movb $0x1, 0x11(%rax)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movb $0x0, 0x12(%rax)
movq -0x18(%rbp), %rax
movzbl 0x5(%rax), %edx
movl $0x100, %eax            # imm = 0x100
movl $0x200, %ecx            # imm = 0x200
cmpl $0x0, %edx
cmovnel %ecx, %eax
movslq %eax, %rcx
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x18(%rax), %rcx
movq -0x18(%rbp), %rax
imulq 0x8(%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
cmpq $0x100, 0x18(%rax)      # imm = 0x100
je 0x3ec3c
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x18(%rax), %rax
movl %eax, %edx
leaq 0x164368(%rip), %rsi    # 0x1a2f98
movb $0x0, %al
callq 0x15bfb0
jmp 0x3ede0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x38(%rbp), %rdx
callq 0x40c20
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
addq -0x38(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x0, 0x20(%rax)
je 0x3ec6f
movq -0x20(%rbp), %rax
movb $0x1, 0x4(%rax)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x40d90
cmpl $0x0, %eax
jne 0x3ec86
jmp 0x3ede0
movq -0x8(%rbp), %rax
cmpl $0x2, 0x90(%rax)
jl 0x3eca0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x40fa0
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x60(%rax)
jmp 0x3ed21
movq -0x18(%rbp), %rax
cmpb $0x0, 0x5(%rax)
je 0x3ecd3
movq -0x8(%rbp), %rdi
leaq 0x1642f4(%rip), %rsi    # 0x1a2fbb
movb $0x0, %al
callq 0x15bfb0
jmp 0x3ede0
movq -0x18(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x3ece0
jmp 0x3ed15
movq -0x18(%rbp), %rax
cmpq $0x10, 0x8(%rax)
je 0x3ed13
movq -0x20(%rbp), %rax
cmpl $0x1, 0x8(%rax)
jne 0x3ed11
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movl %eax, %edx
leaq 0x1642da(%rip), %rsi    # 0x1a2fe4
movb $0x0, %al
callq 0x15bc10
jmp 0x3ed13
jmp 0x3ed15
movq -0x18(%rbp), %rax
movq $0x10, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rdx
leaq 0x187d35(%rip), %rsi    # 0x1c6a65
movb $0x0, %al
callq 0x15b0d0
movq -0x18(%rbp), %rax
cmpb $0x0, 0x4(%rax)
je 0x3ed7e
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rsi
movq -0x18(%rbp), %rax
imulq 0x58(%rax), %rsi
shlq %rsi
movl $0x1, %edx
callq 0x168020
movq %rax, -0x48(%rbp)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq -0x48(%rbp), %rcx
callq 0x41030
jmp 0x3eda3
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x38(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x18(%rax), %rdx
subq -0x38(%rbp), %rdx
callq 0x1691b0
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x18(%rbp), %rax
movq $0x0, 0x38(%rax)
movq -0x48(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq $0x30, %rsi
movq -0x20(%rbp), %rdx
callq 0x176610
movq -0x48(%rbp), %rdi
callq 0x1676a0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x16d7e0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x16d910
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x173e40
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x41280
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)