/* * gfx_set_idle_hook — что вызывать, пока gfx_wait_vsync ждёт луч. * * ЗАЧЕМ. Ожидание кадра — это самый длинный простой в кадре: у игры с * пейсингом «3 растровых кадра на логический тик» процессор проводит там * ~42 мс из 60, крутя `in a,(#0xFE)` и больше ничего не делая. Хук * позволяет занять это время полезным опросом, не отнимая ни такта у * полезной работы. * * Первый потребитель (и повод завести) — клавиатура: приёмный FIFO SIO * всего 3 байта, а одно нажатие расширенной клавиши при зажатом Shift * даёт пачку из 5 байт («fake shift»); если импульс запроса прерывания * потерян, байты копятся и один теряется. Лечится вычерпыванием по * опросу (`kbd_raw_poll` из ) — но только ПЛОТНЫМ, раз в * ~0.5 мс, а не пару раз за кадр. Замер: applications/PoP/roomtest/ * TASKS_CLOSED.md, задача KBD-1. * * ТРЕБОВАНИЯ К ХУКУ: он зовётся в тесном цикле, поэтому обязан быть * дешёвым и НЕ рисовать (окно W3 в этот момент принадлежит вызывающему, * а не графике) и не ждать сам. fn = 0 — снять хук. */ #include "../_bgi.h" void gfx_set_idle_hook(void (*fn)(void)) { _gfx_idle_hook = fn; }