// File: mdpkh[P]retro6k/src/fake6502.c
// Function: adc
static void adc() {
    penaltyop = 1;
    value = getvalue();
#ifdef NES_CPU
    result = (uint16_t)a + value + (uint16_t)(status & FLAG_CARRY); // ORIGINAL BY MC
   
    carrycalc(result);
    zerocalc(result);
    overflowcalc(result, a, value);
    signcalc(result);
#else
    if (status & FLAG_DECIMAL) {
        // set or clear zero flag based on binary-mode result
        zerocalc((uint16_t)a + value + (uint16_t)(status & FLAG_CARRY));
        
        result = ((uint16_t)a & 0x0f) + ((uint16_t)value & 0x0f) + ((uint16_t)status & FLAG_CARRY); // MODIFIED BY MDPKH

        clearcarry();
        if (result > 0x09) {
            result = (result + 0x06) & 0x0f | 0x10;
        }
        result += ((uint16_t)a & 0xf0) + ((uint16_t)value & 0xf0); // MODIFIED BY MDPKH, PART 2 OF CALCULATION
        
        overflowcalc(result, a, value);
        signcalc(result);
        
        if (result > 0x9f) {
            result += 0x60;
            setcarry();
        }
        carrycalc(result);
        
        // clockticks6502++; // 65C02 only!
    } else {
        result = (uint16_t)a + value + (uint16_t)(status & FLAG_CARRY); // ORIGINAL BY MC
        
        carrycalc(result);
        zerocalc(result);
        overflowcalc(result, a, value);
        signcalc(result);
    }
#endif
    saveaccum(result);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movb $0x1, 0x814b1b(%rip)    # 0x832876
callq 0x1d420
movw %ax, 0x814b1f(%rip)     # 0x832886
movzbl 0x814b05(%rip), %eax    # 0x832873
andl $0x8, %eax
cmpl $0x0, %eax
je 0x1df47
movzbl 0x814aef(%rip), %eax    # 0x832870
movzwl %ax, %eax
movzwl 0x814afb(%rip), %ecx    # 0x832886
addl %ecx, %eax
movzbl 0x814adf(%rip), %ecx    # 0x832873
andl $0x1, %ecx
movzwl %cx, %ecx
addl %ecx, %eax
andl $0xff, %eax
cmpl $0x0, %eax
je 0x1ddb8
movzbl 0x814ac6(%rip), %eax    # 0x832873
andl $-0x3, %eax
movb %al, 0x814abd(%rip)     # 0x832873
jmp 0x1ddc8
movzbl 0x814ab4(%rip), %eax    # 0x832873
orl $0x2, %eax
movb %al, 0x814aab(%rip)     # 0x832873
movzbl 0x814aa1(%rip), %eax    # 0x832870
movzwl %ax, %eax
andl $0xf, %eax
movzwl 0x814aaa(%rip), %ecx    # 0x832886
andl $0xf, %ecx
addl %ecx, %eax
movzbl 0x814a8b(%rip), %ecx    # 0x832873
movzwl %cx, %ecx
andl $0x1, %ecx
addl %ecx, %eax
movw %ax, 0x814a91(%rip)     # 0x832888
movzbl 0x814a75(%rip), %eax    # 0x832873
andl $-0x2, %eax
movb %al, 0x814a6c(%rip)     # 0x832873
movzwl 0x814a7a(%rip), %eax    # 0x832888
cmpl $0x9, %eax
jle 0x1de2a
movzwl 0x814a6e(%rip), %eax    # 0x832888
addl $0x6, %eax
andl $0xf, %eax
orl $0x10, %eax
movw %ax, 0x814a5e(%rip)     # 0x832888
movzbl 0x814a3f(%rip), %eax    # 0x832870
movzwl %ax, %ecx
andl $0xf0, %ecx
movzwl 0x814a45(%rip), %eax    # 0x832886
andl $0xf0, %eax
addl %eax, %ecx
movzwl 0x814a39(%rip), %eax    # 0x832888
addl %ecx, %eax
movw %ax, 0x814a30(%rip)     # 0x832888
movzwl 0x814a29(%rip), %eax    # 0x832888
movzbl 0x814a0a(%rip), %ecx    # 0x832870
movzwl %cx, %ecx
xorl %ecx, %eax
movzwl 0x814a16(%rip), %ecx    # 0x832888
movzwl 0x814a0d(%rip), %edx    # 0x832886
xorl %edx, %ecx
andl %ecx, %eax
andl $0x80, %eax
cmpl $0x0, %eax
je 0x1de99
movzbl 0x8149e5(%rip), %eax    # 0x832873
orl $0x40, %eax
movb %al, 0x8149dc(%rip)     # 0x832873
jmp 0x1dea9
movzbl 0x8149d3(%rip), %eax    # 0x832873
andl $-0x41, %eax
movb %al, 0x8149ca(%rip)     # 0x832873
movzwl 0x8149d8(%rip), %eax    # 0x832888
andl $0x80, %eax
cmpl $0x0, %eax
je 0x1dece
movzbl 0x8149b2(%rip), %eax    # 0x832873
orl $0x80, %eax
movb %al, 0x8149a7(%rip)     # 0x832873
jmp 0x1dee0
movzbl 0x81499e(%rip), %eax    # 0x832873
andl $0xffffff7f, %eax       # imm = 0xFFFFFF7F
movb %al, 0x814993(%rip)     # 0x832873
movzwl 0x8149a1(%rip), %eax    # 0x832888
cmpl $0x9f, %eax
jle 0x1df0f
movzwl 0x814993(%rip), %eax    # 0x832888
addl $0x60, %eax
movw %ax, 0x814989(%rip)     # 0x832888
movzbl 0x81496d(%rip), %eax    # 0x832873
orl $0x1, %eax
movb %al, 0x814964(%rip)     # 0x832873
movzwl 0x814972(%rip), %eax    # 0x832888
andl $0xff00, %eax           # imm = 0xFF00
cmpl $0x0, %eax
je 0x1df32
movzbl 0x81494c(%rip), %eax    # 0x832873
orl $0x1, %eax
movb %al, 0x814943(%rip)     # 0x832873
jmp 0x1df42
movzbl 0x81493a(%rip), %eax    # 0x832873
andl $-0x2, %eax
movb %al, 0x814931(%rip)     # 0x832873
jmp 0x1e060
movzbl 0x814922(%rip), %eax    # 0x832870
movzwl %ax, %eax
movzwl 0x81492e(%rip), %ecx    # 0x832886
addl %ecx, %eax
movzbl 0x814912(%rip), %ecx    # 0x832873
andl $0x1, %ecx
movzwl %cx, %ecx
addl %ecx, %eax
movw %ax, 0x814918(%rip)     # 0x832888
movzwl 0x814911(%rip), %eax    # 0x832888
andl $0xff00, %eax           # imm = 0xFF00
cmpl $0x0, %eax
je 0x1df93
movzbl 0x8148eb(%rip), %eax    # 0x832873
orl $0x1, %eax
movb %al, 0x8148e2(%rip)     # 0x832873
jmp 0x1dfa3
movzbl 0x8148d9(%rip), %eax    # 0x832873
andl $-0x2, %eax
movb %al, 0x8148d0(%rip)     # 0x832873
movzwl 0x8148de(%rip), %eax    # 0x832888
andl $0xff, %eax
cmpl $0x0, %eax
je 0x1dfc6
movzbl 0x8148b8(%rip), %eax    # 0x832873
andl $-0x3, %eax
movb %al, 0x8148af(%rip)     # 0x832873
jmp 0x1dfd6
movzbl 0x8148a6(%rip), %eax    # 0x832873
orl $0x2, %eax
movb %al, 0x81489d(%rip)     # 0x832873
movzwl 0x8148ab(%rip), %eax    # 0x832888
movzbl 0x81488c(%rip), %ecx    # 0x832870
movzwl %cx, %ecx
xorl %ecx, %eax
movzwl 0x814898(%rip), %ecx    # 0x832888
movzwl 0x81488f(%rip), %edx    # 0x832886
xorl %edx, %ecx
andl %ecx, %eax
andl $0x80, %eax
cmpl $0x0, %eax
je 0x1e017
movzbl 0x814867(%rip), %eax    # 0x832873
orl $0x40, %eax
movb %al, 0x81485e(%rip)     # 0x832873
jmp 0x1e027
movzbl 0x814855(%rip), %eax    # 0x832873
andl $-0x41, %eax
movb %al, 0x81484c(%rip)     # 0x832873
movzwl 0x81485a(%rip), %eax    # 0x832888
andl $0x80, %eax
cmpl $0x0, %eax
je 0x1e04c
movzbl 0x814834(%rip), %eax    # 0x832873
orl $0x80, %eax
movb %al, 0x814829(%rip)     # 0x832873
jmp 0x1e05e
movzbl 0x814820(%rip), %eax    # 0x832873
andl $0xffffff7f, %eax       # imm = 0xFFFFFF7F
movb %al, 0x814815(%rip)     # 0x832873
jmp 0x1e060
movzwl 0x814821(%rip), %eax    # 0x832888
andl $0xff, %eax
movb %al, 0x8147fe(%rip)     # 0x832870
popq %rbp
retq
nopw %cs:(%rax,%rax)