// File: rockytriton[P]dreamsys_emu_gb/src/cpu.cpp
// Function: dsemu::cpu::tick()
void tick() {
    totalTicks++;

    if (remainingTicks) {
        remainingTicks--;
        return;
    }

    if (!haltWaitingForInterrupt) {
        byte b = bus::read(regPC);

        OpCode opCode = opCodes[b];
        n++;
        
        if ((n % 1000) == 0) {
            usleep(1);
        }

        if (n == 0xeae8a) {
            //paused = true;
        }

        std::stringstream ss;
        ss << Int64(n) << ": " << Short(regPC) << ": " << Byte(b) << " " << Byte(bus::read(regPC + 1)) << " " << Byte(bus::read(regPC + 2)) << " (" << std::left << std::setfill(' ') << std::setw(10) << opCode.name << ") "
                << std::right
                << " - AF: " << Short(toShort(regAF.lo, regAF.hi))
                << " - BC: " << Short(toShort(regBC.lo, regBC.hi))
                << " - DE: " << Short(toShort(regDE.lo, regDE.hi))
                << " - HL: " << Short(toShort(regHL.lo, regHL.hi))
                << " - SP: " << Short(toShort(regSP.lo, regSP.hi))
                << " - Cycles: " << (totalTicks - 1)
                << endl;

        if (DEBUG) cout << ss.str();

        int n = handle_op(opCode);

        if (opCode.value == 0xff) {
            cout << "HIT FF" << endl;
            //sleep(5);
        }

        regPC += opCode.length;

        remainingTicks = ((n + opCode.cycles) / 4) - 1;

        if (extraCycles) {
            remainingTicks += extraCycles;
            extraCycles = 0;
        }
    }

    std::this_thread::sleep_for(std::chrono::milliseconds(cpuSpeed));

    if (interruptsEnabled && bus::read(0xFF0F)) {
        handleInterrupt(bus::read(0xFF0F), true, false);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x360, %rsp            # imm = 0x360
movq 0x1b05e(%rip), %rax     # 0x2f5b0
addq $0x1, %rax
movq %rax, 0x1b053(%rip)     # 0x2f5b0
cmpl $0x0, 0x1b03c(%rip)     # 0x2f5a0
je 0x1457a
movl 0x1b034(%rip), %eax     # 0x2f5a0
addl $-0x1, %eax
movl %eax, 0x1b02b(%rip)     # 0x2f5a0
jmp 0x14ca8
testb $0x1, 0x1ae08(%rip)     # 0x2f389
jne 0x14c56
movzwl 0x1b010(%rip), %edi     # 0x2f59e
callq 0x13450
movb %al, -0x1(%rbp)
movzbl -0x1(%rbp), %eax
leaq 0x3b16f(%rip), %rsi     # 0x4f710
imulq $0x30, %rax, %rax
addq %rax, %rsi
leaq -0x38(%rbp), %rdi
movl $0x30, %edx
callq 0x3240
movl 0x1b018(%rip), %eax     # 0x2f5d4
addl $0x1, %eax
movl %eax, 0x1b00f(%rip)     # 0x2f5d4
movl 0x1b009(%rip), %eax     # 0x2f5d4
movl $0x3e8, %ecx            # imm = 0x3E8
cltd
idivl %ecx
cmpl $0x0, %edx
jne 0x145e2
movl $0x1, %edi
callq 0x33f0
cmpl $0xeae8a, 0x1afe8(%rip) # imm = 0xEAE8A
jne 0x145f0
jmp 0x145f0
leaq -0x1c0(%rbp), %rdi
callq 0x31c0
leaq -0x1b0(%rbp), %rax
movq %rax, -0x228(%rbp)
movslq 0x1afc3(%rip), %rsi     # 0x2f5d4
leaq -0x1c8(%rbp), %rdi
callq 0x151e0
jmp 0x1461f
movq -0x228(%rbp), %rdi
movq -0x1c8(%rbp), %rsi
callq 0x15160
movq %rax, -0x230(%rbp)
jmp 0x1463b
movq -0x230(%rbp), %rdi
leaq 0xfa9b(%rip), %rsi      # 0x240e4
callq 0x32c0
movq %rax, -0x238(%rbp)
jmp 0x14657
movzwl 0x1af40(%rip), %esi     # 0x2f59e
leaq -0x1d6(%rbp), %rdi
callq 0x13840
jmp 0x1466c
movq -0x238(%rbp), %rdi
movzwl -0x1d6(%rbp), %esi
callq 0x137b0
movq %rax, -0x240(%rbp)
jmp 0x14688
movq -0x240(%rbp), %rdi
leaq 0xfa4e(%rip), %rsi      # 0x240e4
callq 0x32c0
movq %rax, -0x248(%rbp)
jmp 0x146a4
movzbl -0x1(%rbp), %esi
leaq -0x1d7(%rbp), %rdi
callq 0x13860
jmp 0x146b6
movq -0x248(%rbp), %rdi
movzbl -0x1d7(%rbp), %esi
callq 0x13720
movq %rax, -0x250(%rbp)
jmp 0x146d2
movq -0x250(%rbp), %rdi
leaq 0xf9f5(%rip), %rsi      # 0x240d5
callq 0x32c0
movq %rax, -0x258(%rbp)
jmp 0x146ee
movzwl 0x1aea9(%rip), %eax     # 0x2f59e
incl %eax
movzwl %ax, %edi
callq 0x13450
movb %al, -0x259(%rbp)
jmp 0x14707
movb -0x259(%rbp), %al
movzbl %al, %esi
leaq -0x1d8(%rbp), %rdi
callq 0x13860
jmp 0x1471e
movq -0x258(%rbp), %rdi
movzbl -0x1d8(%rbp), %esi
callq 0x13720
movq %rax, -0x268(%rbp)
jmp 0x1473a
movq -0x268(%rbp), %rdi
leaq 0xf98d(%rip), %rsi      # 0x240d5
callq 0x32c0
movq %rax, -0x270(%rbp)
jmp 0x14756
movzwl 0x1ae41(%rip), %eax     # 0x2f59e
addl $0x2, %eax
movzwl %ax, %edi
callq 0x13450
movb %al, -0x271(%rbp)
jmp 0x14770
movb -0x271(%rbp), %al
movzbl %al, %esi
leaq -0x1d9(%rbp), %rdi
callq 0x13860
jmp 0x14787
movq -0x270(%rbp), %rdi
movzbl -0x1d9(%rbp), %esi
callq 0x13720
movq %rax, -0x280(%rbp)
jmp 0x147a3
movq -0x280(%rbp), %rdi
leaq 0xf920(%rip), %rsi      # 0x240d1
callq 0x32c0
movq %rax, -0x288(%rbp)
jmp 0x147bf
movq -0x288(%rbp), %rdi
leaq 0xa33(%rip), %rsi       # 0x15200
callq 0x3100
movq %rax, -0x290(%rbp)
jmp 0x147db
movl $0x20, %edi
callq 0x138b0
movb %al, -0x291(%rbp)
jmp 0x147ed
movq -0x290(%rbp), %rdi
movb -0x291(%rbp), %al
movb %al, -0x1da(%rbp)
movzbl -0x1da(%rbp), %esi
callq 0x3430
movq %rax, -0x2a0(%rbp)
jmp 0x14815
movl $0xa, %edi
callq 0x138d0
movl %eax, -0x2a4(%rbp)
jmp 0x14827
movq -0x2a0(%rbp), %rdi
movl -0x2a4(%rbp), %eax
movl %eax, -0x1e0(%rbp)
movl -0x1e0(%rbp), %esi
callq 0x3380
movq %rax, -0x2b0(%rbp)
jmp 0x1484e
movq -0x2b0(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x3270
movq %rax, -0x2b8(%rbp)
jmp 0x14867
movq -0x2b8(%rbp), %rdi
leaq 0xf85f(%rip), %rsi      # 0x240d4
callq 0x32c0
movq %rax, -0x2c0(%rbp)
jmp 0x14883
movq -0x2c0(%rbp), %rdi
leaq 0x99f(%rip), %rsi       # 0x15230
callq 0x3100
movq %rax, -0x2c8(%rbp)
jmp 0x1489f
movq -0x2c8(%rbp), %rdi
leaq 0xf82a(%rip), %rsi      # 0x240d7
callq 0x32c0
movq %rax, -0x2d0(%rbp)
jmp 0x148bb
movzbl 0x1acce(%rip), %edi     # 0x2f590
movzbl 0x1acc8(%rip), %esi     # 0x2f591
callq 0x19ad0
movw %ax, -0x2d2(%rbp)
jmp 0x148d7
movw -0x2d2(%rbp), %ax
movzwl %ax, %esi
leaq -0x1e2(%rbp), %rdi
callq 0x13840
jmp 0x148ef
movq -0x2d0(%rbp), %rdi
movzwl -0x1e2(%rbp), %esi
callq 0x137b0
movq %rax, -0x2e0(%rbp)
jmp 0x1490b
movq -0x2e0(%rbp), %rdi
leaq 0xf7c6(%rip), %rsi      # 0x240df
callq 0x32c0
movq %rax, -0x2e8(%rbp)
jmp 0x14927
movzbl 0x1ac64(%rip), %edi     # 0x2f592
movzbl 0x1ac5e(%rip), %esi     # 0x2f593
callq 0x19ad0
movw %ax, -0x2ea(%rbp)
jmp 0x14943
movw -0x2ea(%rbp), %ax
movzwl %ax, %esi
leaq -0x1e4(%rbp), %rdi
callq 0x13840
jmp 0x1495b
movq -0x2e8(%rbp), %rdi
movzwl -0x1e4(%rbp), %esi
callq 0x137b0
movq %rax, -0x2f8(%rbp)
jmp 0x14977
movq -0x2f8(%rbp), %rdi
leaq 0xf762(%rip), %rsi      # 0x240e7
callq 0x32c0
movq %rax, -0x300(%rbp)
jmp 0x14993
movzbl 0x1abfa(%rip), %edi     # 0x2f594
movzbl 0x1abf4(%rip), %esi     # 0x2f595
callq 0x19ad0
movw %ax, -0x302(%rbp)
jmp 0x149af
movw -0x302(%rbp), %ax
movzwl %ax, %esi
leaq -0x1e6(%rbp), %rdi
callq 0x13840
jmp 0x149c7
movq -0x300(%rbp), %rdi
movzwl -0x1e6(%rbp), %esi
callq 0x137b0
movq %rax, -0x310(%rbp)
jmp 0x149e3
movq -0x310(%rbp), %rdi
leaq 0xf6fe(%rip), %rsi      # 0x240ef
callq 0x32c0
movq %rax, -0x318(%rbp)
jmp 0x149ff
movzbl 0x1ab90(%rip), %edi     # 0x2f596
movzbl 0x1ab8a(%rip), %esi     # 0x2f597
callq 0x19ad0
movw %ax, -0x31a(%rbp)
jmp 0x14a1b
movw -0x31a(%rbp), %ax
movzwl %ax, %esi
leaq -0x1e8(%rbp), %rdi
callq 0x13840
jmp 0x14a33
movq -0x318(%rbp), %rdi
movzwl -0x1e8(%rbp), %esi
callq 0x137b0
movq %rax, -0x328(%rbp)
jmp 0x14a4f
movq -0x328(%rbp), %rdi
leaq 0xf69a(%rip), %rsi      # 0x240f7
callq 0x32c0
movq %rax, -0x330(%rbp)
jmp 0x14a6b
movzbl 0x1ab2a(%rip), %edi     # 0x2f59c
movzbl 0x1ab24(%rip), %esi     # 0x2f59d
callq 0x19ad0
movw %ax, -0x332(%rbp)
jmp 0x14a87
movw -0x332(%rbp), %ax
movzwl %ax, %esi
leaq -0x1ea(%rbp), %rdi
callq 0x13840
jmp 0x14a9f
movq -0x330(%rbp), %rdi
movzwl -0x1ea(%rbp), %esi
callq 0x137b0
movq %rax, -0x340(%rbp)
jmp 0x14abb
movq -0x340(%rbp), %rdi
leaq 0xf636(%rip), %rsi      # 0x240ff
callq 0x32c0
movq %rax, -0x348(%rbp)
jmp 0x14ad7
movq -0x348(%rbp), %rdi
movq 0x1aacb(%rip), %rsi     # 0x2f5b0
decq %rsi
callq 0x30b0
movq %rax, -0x350(%rbp)
jmp 0x14af6
movq -0x350(%rbp), %rdi
movq 0x1a4ac(%rip), %rsi     # 0x2efb0
callq 0x3310
jmp 0x14b0b
leaq 0x1aac7(%rip), %rax     # 0x2f5d9
testb $0x1, (%rax)
je 0x14b89
leaq -0x210(%rbp), %rdi
leaq -0x1c0(%rbp), %rsi
callq 0x32b0
jmp 0x14b2c
movq 0x1a49d(%rip), %rdi     # 0x2efd0
leaq -0x210(%rbp), %rsi
callq 0x3270
jmp 0x14b41
leaq -0x210(%rbp), %rdi
callq 0x3518
jmp 0x14b89
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1d0(%rbp)
movl %eax, -0x1d4(%rbp)
jmp 0x14c48
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1d0(%rbp)
movl %eax, -0x1d4(%rbp)
leaq -0x210(%rbp), %rdi
callq 0x3518
jmp 0x14c48
leaq -0x38(%rbp), %rdi
callq 0x1d610
movl %eax, -0x354(%rbp)
jmp 0x14b9a
movl -0x354(%rbp), %eax
movl %eax, -0x214(%rbp)
movzbl -0x38(%rbp), %eax
cmpl $0xff, %eax
jne 0x14be4
movq 0x1a418(%rip), %rdi     # 0x2efd0
leaq 0xf54c(%rip), %rsi      # 0x2410b
callq 0x32c0
movq %rax, -0x360(%rbp)
jmp 0x14bcd
movq -0x360(%rbp), %rdi
movq 0x1a3d5(%rip), %rsi     # 0x2efb0
callq 0x3310
jmp 0x14be2
jmp 0x14be4
movzbl -0x24(%rbp), %ecx
movzwl 0x1a9af(%rip), %eax     # 0x2f59e
addl %ecx, %eax
movw %ax, 0x1a9a6(%rip)      # 0x2f59e
movl -0x214(%rbp), %eax
movzbl -0x23(%rbp), %ecx
addl %ecx, %eax
movl $0x4, %ecx
cltd
idivl %ecx
subl $0x1, %eax
movl %eax, 0x1a98b(%rip)     # 0x2f5a0
cmpl $0x0, 0x1a97c(%rip)     # 0x2f598
je 0x14c3a
movl 0x1a974(%rip), %eax     # 0x2f598
addl 0x1a976(%rip), %eax     # 0x2f5a0
movl %eax, 0x1a970(%rip)     # 0x2f5a0
movl $0x0, 0x1a95e(%rip)     # 0x2f598
leaq -0x1c0(%rbp), %rdi
callq 0x31f0
jmp 0x14c56
leaq -0x1c0(%rbp), %rdi
callq 0x31f0
jmp 0x14cb1
leaq -0x220(%rbp), %rdi
leaq 0x1a96c(%rip), %rsi     # 0x2f5d0
callq 0x15310
leaq -0x220(%rbp), %rdi
callq 0x15260
leaq 0x3aa3d(%rip), %rax     # 0x4f6b9
testb $0x1, (%rax)
je 0x14ca8
movl $0xff0f, %edi           # imm = 0xFF0F
callq 0x13450
cmpb $0x0, %al
je 0x14ca8
movl $0xff0f, %edi           # imm = 0xFF0F
callq 0x13450
movl $0x1, %esi
xorl %edx, %edx
movzbl %al, %edi
callq 0x14cc0
addq $0x360, %rsp            # imm = 0x360
popq %rbp
retq
movq -0x1d0(%rbp), %rdi
callq 0x34b0
nopl (%rax)