Beispiel #1
0
void emu_do_frame(bool draw) {
	// Exécute une frame
	lcd_frame_end_flag = false;
	while (!lcd_frame_end_flag) {
		unsigned elapsed = cpu_exec_instruction() * 4;
		lcd_tick(elapsed, draw);
		timer_tick(elapsed);
	}

	// ColorIt: une demande de rechargement est effectuée
	if (ColorIt_reload) {
		ColorIt_systemInit();
		ColorIt_exitingLcdc(mem_vram);
		ColorIt_reload = 0;
	}
}
Beispiel #2
0
int gb_tick(gb_t *gb)
{
    update_joypad(gb);

    if (!cpu_tick(gb))
        return 0;

    if (!lcd_tick(gb))
        return 0;

    if (++gb->ticks == TICKS_MAX)
    {
        ERR("Game Over");
        return 0;
    }

    // DMA
    if (gb->mem[IO_DMA] != 0xFF)
    {
        // XXX instant DMA?
        memcpy(&gb->mem[0xFE00], &gb->mem[gb->mem[IO_DMA] << 8], 0xA0);
        gb->mem[IO_DMA] = 0xFF;
    }

    if (++gb->ticks_divider == TICKS_DIVIDER)
    {
        gb->mem[IO_DIV]++;
        gb->ticks_divider = 0;
    }

    if (gb->mem[IO_TAC] & (1 << 2))
    {
        // timer ON
        unsigned int total_ticks;
        switch(gb->mem[IO_TAC] & 3)
        {
        case 0:
            total_ticks = 244;
            break;
        case 1:
            total_ticks = 4;
            break;
        case 2:
            total_ticks = 15;
            break;
        case 3:
            total_ticks = 61;
            break;
        }
        if (++gb->ticks_timer >= total_ticks)
        {
            gb->ticks_timer = 0;
            if (gb->mem[IO_TIMA]++ == 0xFF)
            {
                //overflow
                gb->mem[IO_TIMA] = gb->mem[IO_TMA];
                cpu_interrupt(gb, 2);
            }
        }
    }
    return 1;
}