Гигаскрин2 от создателя гигаскрин1 :)
Как оказалось, на Спектрумах гигаскрин делается не переключением кадров, а переключением строк. В связи с этим пришлось гоняться за телевизионным лучом, программку переписать полностью (пару раз) и заодно словить кучу самых разных проблем.
Проблема 1: частоты. В отличие от Спектрума, у Агата ДК и процессор работают от разных тактовых генераторов. Поэтому надо не просто выждать нужные 65,3 такта процессора, но еще и принять меры на случай уползания момента переключения. Ясно, что дробное число тактов отмерить нельзя, поэтому момент переключения постепенно сползает к началу гасящего импульса. Но за 8 строк он далеко не уползает и остается внутри гасящего импульса, а там приходит новое прерывание и все заново синхронизируется. Тем не менее, с кварцем 14 МГц момент переключения поползет вперед и переключение будет где-то посреди строки.
Проблема 2: время вызова обработчика. Процессор может выполнять какую-то инструкцию (до 7 тактов), плюс сам вызов занимает 7 тактов, плюс команда STA производит запись только спустя 3 такта. Итого задержка от начала гасящего импульса может достигать 17 тактов, в то время как сам гасящий импульс имеет длительность 16 мкс.
В связи с этим пришлось отказаться от штатного способа установки обработчиков через адреса $36F, $37E, потому что обработка прерываний в DOS занимает слишком много времени. Кроме того, основной код программы не должен содержать инструкций длинее 5 тактов :) У меня основной код - это цикл опроса клавиатуры, поэтому там все нормально. Но вообще, делать что-то полезное одновременно с показом гигаскрина довольно трудно, потому что процессор 80% времени проводит внутри обработчиков прерываний.
Проблема 3: IRQ возникает в начале 7, 15, 23 и т.д. строк. Со строками 0-6 возникает конфликт двух обработчиков: в 311 строке предыдущего кадра вызывается IRQ, а в нулевой строке его перешибает NMI. Пришлось изменить код еще раз и заставить обработчик IRQ во время кадрового гасящего импульса быстренько выходить, а NMI научить переключать строки. Когда это не заработало так, как ожидалось, то выяснилось, что NMI вызывается синхронно со строчным гасящим импульсом, а не с началом отображения строки. (Владимир выкладывал картинку, но я эту тонкость с импульсами прохлопал.)
Для окончательной проверки я к плате подцепил осциллограф чтобы видеть моменты переключения страниц относительно гасящих импульсов. И не зря - оказалось, что с фазировкой я тоже где-то слажал и некоторые группы строк не переключались вообще. Так что пришлось подкручивать порядок переключения и контролировать результат по осциллографу, пока все не стало переключаться нормально.
Мерцание, к сожалению, все равно ощущается, хотя, на мой взгляд, умеренное.
Post's attachments gigascreen.zip 21.69 kb, 176 downloads since 2021-04-15