// File: klyushinmisha[P]GBEmu/./src/Interrupts.cpp
// Function: Interrupts::Drawing()
bool Interrupts::Drawing()
{
    if (gb->DMATransfer)
    {
        ushort addr = (ushort)((ushort)RAM[0xFF46] * 0x100);
        gb->DMATransfer = false;
        for (int i = 0; i < 160; i++)
            RAM[0xFE00 + i] = RAM[addr + i];
    }

    switch (gb->getMode())
    {
        case 0:
            if (interruptCounter >= 204)
            {
                interruptCounter %= 204;
                gb->DrawLine();
                if (gb->getYCoordinate() == 144)
                {
                    gb->setMode(1);
                    RAM[0xFF0F] |= 3;
                }
                else
                {
                    //gb->FindSprites();
                    gb->setMode(2);
                    RAM[0xFF0F] |= 2;
                }
                
            }
            break;
        case 2:
            if (interruptCounter >= 80)
            {
                interruptCounter %= 80;
                gb->setMode(3);
                RAM[0xFF0F] |= 2;
            }
            break;
        case 3:
            if (interruptCounter >= 172)
            {
                interruptCounter %= 172;
                gb->setMode(0);
                RAM[0xFF0F] |= 2;
            }
            break;
        case 1:
            if (interruptCounter >= 456)
            {
                gb->setYCoordinate(gb->getYCoordinate() + 1);
                interruptCounter %= 456;
            }
            if (gb->getYCoordinate() == 154)
            {
                gb->setYCoordinate(0);
                interruptCounter = 0;
                gb->setMode(2);
                RAM[0xFF0F] |= 2;
                return false;
            }
            break;
    }
    if (gb->getLYCompare() == gb->getYCoordinate())
        gb->setCoincidenceFlag(true);
    else
        gb->setCoincidenceFlag(false);
    if (gb->getCoincidenceFlag() & gb->getLYCLYCoincidenceInterrupt())
        RAM[0xFF0F] |= 2;
    return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x20(%rbp)
movq (%rax), %rax
testb $0x1, 0x58(%rax)
je 0x9a82
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rcx
movzbl 0xff46(%rcx), %ecx
movzwl %cx, %ecx
shll $0x8, %ecx
movw %cx, -0x12(%rbp)
movq (%rax), %rax
movb $0x0, 0x58(%rax)
movl $0x0, -0x18(%rbp)
cmpl $0xa0, -0x18(%rbp)
jge 0x9a80
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rcx
movzwl -0x12(%rbp), %edx
addl -0x18(%rbp), %edx
movslq %edx, %rdx
movb (%rcx,%rdx), %dl
movq 0x8(%rax), %rax
movl -0x18(%rbp), %ecx
addl $0xfe00, %ecx           # imm = 0xFE00
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
movl -0x18(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x18(%rbp)
jmp 0x9a44
jmp 0x9a82
movq -0x20(%rbp), %rax
movq (%rax), %rdi
callq 0x9db0
movzbl %al, %ecx
movq %rcx, -0x28(%rbp)
subb $0x3, %al
ja 0x9c8c
movq -0x28(%rbp), %rax
leaq 0x1ee8(%rip), %rcx      # 0xb990
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x20(%rbp), %rax
cmpl $0xcc, 0x10(%rax)
jl 0x9b4c
movq -0x20(%rbp), %rax
movl 0x10(%rax), %eax
movl $0xcc, %ecx
cltd
idivl %ecx
movq -0x20(%rbp), %rax
movl %edx, 0x10(%rax)
movq (%rax), %rdi
callq 0x3150
movq -0x20(%rbp), %rax
movq (%rax), %rdi
callq 0x8900
movzbl %al, %eax
cmpl $0x90, %eax
jne 0x9b21
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movl $0x1, %esi
callq 0x33d0
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movzbl 0xff0f(%rax), %ecx
orl $0x3, %ecx
movb %cl, 0xff0f(%rax)
jmp 0x9b4a
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movl $0x2, %esi
callq 0x33d0
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movzbl 0xff0f(%rax), %ecx
orl $0x2, %ecx
movb %cl, 0xff0f(%rax)
jmp 0x9b4c
jmp 0x9c8c
movq -0x20(%rbp), %rax
cmpl $0x50, 0x10(%rax)
jl 0x9b96
movq -0x20(%rbp), %rax
movl 0x10(%rax), %eax
movl $0x50, %ecx
cltd
idivl %ecx
movq -0x20(%rbp), %rax
movl %edx, 0x10(%rax)
movq (%rax), %rdi
movl $0x3, %esi
callq 0x33d0
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movzbl 0xff0f(%rax), %ecx
orl $0x2, %ecx
movb %cl, 0xff0f(%rax)
jmp 0x9c8c
movq -0x20(%rbp), %rax
cmpl $0xac, 0x10(%rax)
jl 0x9be0
movq -0x20(%rbp), %rax
movl 0x10(%rax), %eax
movl $0xac, %ecx
cltd
idivl %ecx
movq -0x20(%rbp), %rax
movl %edx, 0x10(%rax)
movq (%rax), %rdi
xorl %esi, %esi
callq 0x33d0
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movzbl 0xff0f(%rax), %ecx
orl $0x2, %ecx
movb %cl, 0xff0f(%rax)
jmp 0x9c8c
movq -0x20(%rbp), %rax
cmpl $0x1c8, 0x10(%rax)      # imm = 0x1C8
jl 0x9c2d
movq -0x20(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x30(%rbp)
movq (%rax), %rdi
callq 0x8900
movq -0x30(%rbp), %rdi
movzbl %al, %eax
addl $0x1, %eax
movzbl %al, %esi
callq 0x8920
movq -0x20(%rbp), %rax
movl 0x10(%rax), %eax
movl $0x1c8, %ecx            # imm = 0x1C8
cltd
idivl %ecx
movq -0x20(%rbp), %rax
movl %edx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
callq 0x8900
movzbl %al, %eax
cmpl $0x9a, %eax
jne 0x9c8a
movq -0x20(%rbp), %rax
movq (%rax), %rdi
xorl %esi, %esi
callq 0x8920
movq -0x20(%rbp), %rax
movl $0x0, 0x10(%rax)
movq (%rax), %rdi
movl $0x2, %esi
callq 0x33d0
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movzbl 0xff0f(%rax), %ecx
orl $0x2, %ecx
movb %cl, 0xff0f(%rax)
movb $0x0, -0x1(%rbp)
jmp 0x9d2a
jmp 0x9c8c
movq -0x20(%rbp), %rax
movq (%rax), %rdi
callq 0x9dd0
movb %al, %cl
movq -0x20(%rbp), %rax
movzbl %cl, %ecx
movl %ecx, -0x34(%rbp)
movq (%rax), %rdi
callq 0x8900
movb %al, %cl
movl -0x34(%rbp), %eax
movzbl %cl, %ecx
cmpl %ecx, %eax
jne 0x9ccb
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movl $0x1, %esi
callq 0x9df0
jmp 0x9cd9
movq -0x20(%rbp), %rax
movq (%rax), %rdi
xorl %esi, %esi
callq 0x9df0
movq -0x20(%rbp), %rax
movq (%rax), %rdi
callq 0x9e30
movb %al, %cl
movq -0x20(%rbp), %rax
andb $0x1, %cl
movzbl %cl, %ecx
movl %ecx, -0x38(%rbp)
movq (%rax), %rdi
callq 0x9e60
movb %al, %cl
movl -0x38(%rbp), %eax
andb $0x1, %cl
movzbl %cl, %ecx
andl %ecx, %eax
cmpl $0x0, %eax
je 0x9d26
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movzbl 0xff0f(%rax), %ecx
orl $0x2, %ecx
movb %cl, 0xff0f(%rax)
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)