Спустя 30 лет после молодости решил под ностальгическим настроением намалевать игрулю под Спектрум. Пишу на АСМе в SpectnetIDE под Visual Studio. Штука исключительная, очень нравится.Хочу сделать XONIX. Нолики (враги) будут кубики из 4 пикселов, рутину рисования написал сам (т.к. готовые граф движки с первого взгляда сложны и громоздки, а спрайты мне в принципе не нужны). Программеры знают, что экран надо обновлять когда он не отрисовывается. Обратный луч отлавливаем через HALT. Сейчас пришел к такому алгориту:
while (1) {
HALT (начался обратный ход луча)
Рисуем врагов
Задержка (цикл)
Разные задачи (чтение клавы, перемещение игрока итд)
Удаляем врагов
Перемещаем координаты врагов
}
Схема эта работает, всё летает плавно на 50 Гц до 7 врагов (пока), проблема только в том, что подпрограмма рисования врагов выполняется разное кол-во циклов в зависимости от кол-ва врагов, и вся остальная часть программы сдвигается. Также и Разные задачи занимают разное время в зависимости от действий игрока. В принципе, это можно компенсировать табличной подстройкой задержки, но моя цель,что задержка должна автоматически заканчиваться когда луч начинает рисовать бордюр в нижней части экрана. Иными словами, мне нужно задержкой автоматически охватить всю видимую часть экрана, исключая бордюр. Но команда HALT наступает позже (когда бордюр полностью нарисован). Если ставить задержку сразу после HALT и дотягивать её до низа экрана, теряется добрая половина хорошего времени обратного хода когда я мог бы рисовать.
Поэтому вопрос такой: чем засинхронизироваться в нижней части экрана где начинается нижний бордюр? Нашёл в инете описание способа floating bus (никогда раньше о нем не слышал. Вкратце суть: если читать из несуществующего порта (например #FF), можно получить байты данных, которые "видеокарта" в данный момент выводит на экран. Описание вот http://sky.relative-path.com/zx/floating_bus.html), это конечно очень круто, но большие проблемы с совместимостью: на разных спектрумах работает по-разному, в эмуляторах тоже не очень корректно либо не работает совсем. Живой синклер 48к у меня есть, но пока руки не дошли его запустить (куплен на Ebay с неисправностью, повозиться с ним надо). Да и загружать постоянно на спектрум конечно долго и неудобно.
Может кто сталкивался с такой проблемой и знает её корректное решение?