Наркоманы ворчуны.
Есть простая задача. Классическая игра, идет приемлемо на 3,5 но в некоторых моментах существенно тормозит, для примера квазатрон.
Разберемся что нужно сделать чтобы при включении турбо 20 Мгц (да хоть на 100) дроид не носился как безумный дракон, а при скролле все сдвигалось с максимальной скоростью.
Организуется счетчик отсчитывающий число прерываний между обновлениями экрана. Пока после предыдущей отрисовки не прошло 4 кадра ждем. Соответствующий код
Код:
org 0xdd7c
ld a, (0xaf2b) ;это было
cp 7
call nc, 0xc05a
l1
cnt equ $+1
ld a, 0
cp 4
jr c, l1
xor a
ld (cnt), a
ret
int
push hl
push af
ld hl, cnt
inc (hl)
pop af
pop hl
jp 0xbd2d
display $
org 0xe6e6
jp int
В данном случае потратил я на него с копаниями минут 15. На 3.5 мгц не будет дополнительной паузы и игра абсолютно не изменится.
Все, наблюдаем ровный фреймрейт при движении и шустрый скролл. Изначально квазатрон работал так, никакой синхры по прерывниям не было, но они включены, на них висят звуковые эффекты. Более менее постоянная скорость обеспечивается циклом паузы зависящей от количества врагов на экране, больше врагов меньше пауза.
Это не единственная проблема конкретно в этой игре, миниигра также не синхрится по прерываниям, причем в ней 2 фазы, выбор стороны и собственно сама схватка. Там тоже нужны задержки подобные игровому циклу, мне уже стало лениво искать куда их вставить.
При чем тут бла бла бла о том кто когда что с чем синхрил и какие турбы бывают, при чем тут демы.