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; } }
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; }