// File: /workspace/github_c_makefile_star2_O0/calmopyrin[P]tedplay/./Cpu.h
// Function: CPU::ADC(unsigned char)
inline void CPU::ADC(const unsigned char value)
{
	if (ST&0x08) {
		unsigned int bin_adc = AC + value + (ST&0x01);
		unsigned char AL, AH;

		AL=(AC&0x0F) + (value & 0x0F) + (ST&0x01);
		AH=(AC >> 4) + (value >> 4 ) ;
		// fix lower nybble
		if (AL>9) {
			AL+=6;
			AH++;
		}
		// zero bit depends on the normal ADC...
		(bin_adc)&0xFF ? ST&=0xFD : ST|=0x02;
		// negative flag also...
		( AH & 0x08 ) ? ST|=0x80 : ST&=0x7F; 
		// V flag
		((((AH << 4) ^ AC) & 0x80) && !((AC ^ value) & 0x80)) ? SetVFlag() : ClearVFlag();
		// fix upper nybble
		if (AH>9) 
			AH+=6;
		// set the Carry if the decimal add has an overflow
		(AH > 0x0f) ? ST|=0x01 : ST&=0xFE;
		// calculate new AC value
		AC = (AH<<4)|(AL & 0x0F);
	} else {
		unsigned int bin_adc = AC + value + (ST&0x01);
		(bin_adc>=0x100) ? ST|=0x01 : ST&=0xFE;
		(!((AC ^ value) & 0x80) && ((AC ^ bin_adc) & 0x80) ) ? SetVFlag() : ClearVFlag();
		AC=(unsigned char) bin_adc;
		SETFLAGS_ZN(AC);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movb %sil, %al
movq %rdi, -0x8(%rbp)
movb %al, -0x9(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x20(%rbp)
movl 0x18(%rax), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0x1329b
movq -0x20(%rbp), %rax
movzbl 0x1c(%rax), %ecx
movzbl -0x9(%rbp), %edx
addl %edx, %ecx
movl 0x18(%rax), %edx
andl $0x1, %edx
addl %edx, %ecx
movl %ecx, -0x10(%rbp)
movzbl 0x1c(%rax), %ecx
andl $0xf, %ecx
movzbl -0x9(%rbp), %edx
andl $0xf, %edx
addl %edx, %ecx
movl 0x18(%rax), %edx
andl $0x1, %edx
addl %edx, %ecx
movb %cl, -0x11(%rbp)
movzbl 0x1c(%rax), %eax
sarl $0x4, %eax
movzbl -0x9(%rbp), %ecx
sarl $0x4, %ecx
addl %ecx, %eax
movb %al, -0x12(%rbp)
movzbl -0x11(%rbp), %eax
cmpl $0x9, %eax
jle 0x1317b
movzbl -0x11(%rbp), %eax
addl $0x6, %eax
movb %al, -0x11(%rbp)
movb -0x12(%rbp), %al
addb $0x1, %al
movb %al, -0x12(%rbp)
movl -0x10(%rbp), %eax
andl $0xff, %eax
cmpl $0x0, %eax
je 0x131a1
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
andl $0xfd, %ecx
movl %ecx, 0x18(%rax)
jmp 0x131b5
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
orl $0x2, %ecx
movl %ecx, 0x18(%rax)
movzbl -0x12(%rbp), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0x131da
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
orl $0x80, %ecx
movl %ecx, 0x18(%rax)
jmp 0x131ee
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
andl $0x7f, %ecx
movl %ecx, 0x18(%rax)
movq -0x20(%rbp), %rcx
movzbl -0x12(%rbp), %eax
shll $0x4, %eax
movzbl 0x1c(%rcx), %ecx
xorl %ecx, %eax
andl $0x80, %eax
cmpl $0x0, %eax
je 0x1322c
movq -0x20(%rbp), %rax
movzbl 0x1c(%rax), %eax
movzbl -0x9(%rbp), %ecx
xorl %ecx, %eax
andl $0x80, %eax
cmpl $0x0, %eax
jne 0x1322c
movq -0x20(%rbp), %rdi
callq 0x13650
jmp 0x13236
movq -0x20(%rbp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
movzbl -0x12(%rbp), %eax
cmpl $0x9, %eax
jle 0x13249
movzbl -0x12(%rbp), %eax
addl $0x6, %eax
movb %al, -0x12(%rbp)
movzbl -0x12(%rbp), %eax
cmpl $0xf, %eax
jle 0x13268
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
orl $0x1, %ecx
movl %ecx, 0x18(%rax)
jmp 0x1327f
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
andl $0xfe, %ecx
movl %ecx, 0x18(%rax)
movq -0x20(%rbp), %rax
movzbl -0x12(%rbp), %ecx
shll $0x4, %ecx
movzbl -0x11(%rbp), %edx
andl $0xf, %edx
orl %edx, %ecx
movb %cl, 0x1c(%rax)
jmp 0x1335f
movq -0x20(%rbp), %rcx
movzbl 0x1c(%rcx), %eax
movzbl -0x9(%rbp), %edx
addl %edx, %eax
movl 0x18(%rcx), %ecx
andl $0x1, %ecx
addl %ecx, %eax
movl %eax, -0x18(%rbp)
cmpl $0x100, -0x18(%rbp)     # imm = 0x100
jb 0x132d3
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
orl $0x1, %ecx
movl %ecx, 0x18(%rax)
jmp 0x132ea
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movl 0x18(%rax), %ecx
andl $0xfe, %ecx
movl %ecx, 0x18(%rax)
movq -0x20(%rbp), %rax
movzbl 0x1c(%rax), %eax
movzbl -0x9(%rbp), %ecx
xorl %ecx, %eax
andl $0x80, %eax
cmpl $0x0, %eax
jne 0x13322
movq -0x20(%rbp), %rax
movzbl 0x1c(%rax), %eax
xorl -0x18(%rbp), %eax
andl $0x80, %eax
cmpl $0x0, %eax
je 0x13322
movq -0x20(%rbp), %rdi
callq 0x13650
jmp 0x1332c
movq -0x20(%rbp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
movq -0x20(%rbp), %rax
movl -0x18(%rbp), %ecx
movb %cl, 0x1c(%rax)
movl 0x18(%rax), %ecx
andl $0x7d, %ecx
movzbl 0x1c(%rax), %edx
cmpl $0x0, %edx
sete %dl
andb $0x1, %dl
movzbl %dl, %edx
shll %edx
orl %edx, %ecx
movzbl 0x1c(%rax), %edx
andl $0x80, %edx
orl %edx, %ecx
movl %ecx, 0x18(%rax)
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nop