Проблема режима "2,5 МГц"
Совершенно нечаянно обнаружилась ещё одна ошибка в Орионе-ПРО. Проблема возникает при включении режима "2,5 МГц". Некоторые программы, собственно ради которых этот режим и реализован, работают некорректно. Вот проги, в которых глюки воспроизводятся 100%-но: REKL$ (эффектная демка для Ориона-128), LINES$, ALMAZ$. В первой, в режиме "2,5 МГц" полностью отсутствуют спецэффекты (мерцающие звёзды, анимация переходов), только меняются статичные картинки/текст. В играх графический мусор, отдалённо напоминающий игровую сцену. Программы при этом работают, не зависают, наблюдаются только артефакты в графике. Также почему-то не работает загрузка файла по RS-232, серверная часть (на IBM-PC) получает ошибочный байт запроса передачи тела файла, в результате чего вываливается с ошибкой протокола, а Орион, соответственно, вываливается по ошибке тайм-аута (сервер не ответил).
В обычном режиме (такт ЦПУ 5 или 10 МГц) всё вышеперечисленное ПО работает нормально.
Попытался обнаружить, какой код вызывает глюки. Изначально грешил на олдскульный звук через INTE (для ВМ80), думал, что на малой скорости в короткие моменты подачи команды EI прерывания успевают "зацепиться" и вызвать непредсказуемое поведение программ.
Для "раскопок" я дизассемблировал небольшую программу REKL$ и стал затыкать NOP'ами потенциально проблеммные участки кода.
В результате, предположение насчёт активизации прерываний не подтвердилось, а выяснилось, что проблему вызывает следующий код:
MVI A,1
STA 0FA00H
Если меняю этот код на такой:
MVI A,1
OUT 0FAH
то программа в режиме "2,5 МГц" работает без глюков, со всеми спецэффектами.
Идеологически оба этих кода совершенно равнозначны, и в дефолтном режиме исполняются одинаково. Почему первый вариант глючит в режиме пониженной тактовой частоты ЦПУ - загадка.
В играх ещё не пробовал искать проблеммный код, но предполагаю, что инициализация того же порта методом записи как в ячейку памяти вызывает глюки.
У кого какие мысли?
П.С. переключение в режим "2,5 МГц" делается установкой бита D5 порта #0Ah, с помощью утилиты 2,5MHZ$.