// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/dms.c
// Function: dmsrle_codec_addbuf
static void dmsrle_codec_addbuf(struct de_dfilter_ctx *dfctx,
	const u8 *buf, i64 buf_len)
{
	i64 i;
	struct dmsrle_ctx *rctx = (struct dmsrle_ctx*)dfctx->codec_private;

	if(!rctx) goto done;

	for(i=0; i<buf_len; i++) {
		u8 n;
		i64 count;

		n = buf[i];

		switch(rctx->state) {
		case DMSRLE_STATE_NEUTRAL:
			if(n==0x90) {
				rctx->state = DMSRLE_STATE_90;
			}
			else {
				dbuf_writebyte(dfctx->dcmpro->f, n);
			}
			break;
		case DMSRLE_STATE_90:
			if(n==0x00) {
				dbuf_writebyte(dfctx->dcmpro->f, 0x90);
				rctx->state = DMSRLE_STATE_NEUTRAL;
			}
			else {
				rctx->n2 = n;
				rctx->state = DMSRLE_STATE_90_N2;
			}
			break;
		case DMSRLE_STATE_90_N2:
			if(rctx->n2==0xff) {
				rctx->n3 = n;
				rctx->state = DMSRLE_STATE_90_FF_N3;
			}
			else {
				count = (i64)rctx->n2;
				dbuf_write_run(dfctx->dcmpro->f, n, count);
				rctx->state = DMSRLE_STATE_NEUTRAL;
			}
			break;
		case DMSRLE_STATE_90_FF_N3:
			rctx->n4 = n;
			rctx->state = DMSRLE_STATE_90_FF_N3_N4;
			break;
		case DMSRLE_STATE_90_FF_N3_N4:
			count = (i64)(((UI)rctx->n4 << 8) | n);
			dbuf_write_run(dfctx->dcmpro->f, rctx->n3, count);
			rctx->state = DMSRLE_STATE_NEUTRAL;
			break;
		}
	}
done:
	;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x664ac
jmp 0x6662c
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq -0x18(%rbp), %rax
jge 0x6662a
movq -0x10(%rbp), %rax
movq -0x20(%rbp), %rcx
movb (%rax,%rcx), %al
movb %al, -0x29(%rbp)
movq -0x28(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x40(%rbp)
subq $0x4, %rax
ja 0x66617
movq -0x40(%rbp), %rax
leaq 0x143421(%rip), %rcx    # 0x1a9910
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movzbl -0x29(%rbp), %eax
cmpl $0x90, %eax
jne 0x6650f
movq -0x28(%rbp), %rax
movl $0x1, (%rax)
jmp 0x66523
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
movzbl -0x29(%rbp), %esi
callq 0x168380
jmp 0x66617
movzbl -0x29(%rbp), %eax
cmpl $0x0, %eax
jne 0x66552
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
movl $0x90, %esi
callq 0x168380
movq -0x28(%rbp), %rax
movl $0x0, (%rax)
jmp 0x66566
movb -0x29(%rbp), %cl
movq -0x28(%rbp), %rax
movb %cl, 0x4(%rax)
movq -0x28(%rbp), %rax
movl $0x2, (%rax)
jmp 0x66617
movq -0x28(%rbp), %rax
movzbl 0x4(%rax), %eax
cmpl $0xff, %eax
jne 0x66590
movb -0x29(%rbp), %cl
movq -0x28(%rbp), %rax
movb %cl, 0x5(%rax)
movq -0x28(%rbp), %rax
movl $0x3, (%rax)
jmp 0x665c0
movq -0x28(%rbp), %rax
movzbl 0x4(%rax), %eax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
movb -0x29(%rbp), %al
movq -0x38(%rbp), %rdx
movzbl %al, %esi
callq 0x168800
movq -0x28(%rbp), %rax
movl $0x0, (%rax)
jmp 0x66617
movb -0x29(%rbp), %cl
movq -0x28(%rbp), %rax
movb %cl, 0x6(%rax)
movq -0x28(%rbp), %rax
movl $0x4, (%rax)
jmp 0x66617
movq -0x28(%rbp), %rax
movzbl 0x6(%rax), %eax
shll $0x8, %eax
movzbl -0x29(%rbp), %ecx
orl %ecx, %eax
movl %eax, %eax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movb 0x5(%rax), %al
movq -0x38(%rbp), %rdx
movzbl %al, %esi
callq 0x168800
movq -0x28(%rbp), %rax
movl $0x0, (%rax)
jmp 0x66619
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x664b4
jmp 0x6662c
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)