Тема: Особенности вызова процедур Монитора девятки
Делал тут одну тестовую программку и обнаружил странное: вызываю процедуру Монитора CLREOL (адрес $FCB4), которая должна очищать конец строки, печатая пробелы от текущей позиции курсора, а результата никакого. Не чистит и все тут.
Долго бродил вокруг и около и, наконец, заметил, что указатель BASL (адреса $28, $29), который должен указывать на начало текущей строки экрана, при выбранной 2-й текстовой странице содержит адрес > $3000, то есть указывает на диапазон адресов 6-й текстовой страницы. И что интересно, по этому адресу нашел все свои пропавшие пробелы. А если бы там код программы лежал? Вот был бы прикол.
Стал изучать, как вообще в девяточном Мониторе работает вывод на экран. И оказалось, что Монитор делает вот какую штуку: он перед каждым выводом символа переключает диспетчер памяти, и вывод на экран делает строго через адреса в диапазоне $2000 - $3FFF (первая логическая страница памяти).
Для этого Монитор при выборе текстовой страницы запоминает в ячейке $1E номер страницы памяти, к которой относится текстовая страница. А в момент вызова процедуры печати символа COUT ($FDED) или выполнения косвенного вызова по адресу ($36), Монитор переключает диспетчер памяти, так, чтобы через 1-ю логическую страницу памяти была видна та страница памяти, к которой относится текстовая страница.
Например, если выбрать текстовую страницу 8 командой 8T, то Монитор запомнит номер страницы памяти (2), и при каждом выводе символа на экран будет настраивать диспетчер памяти так, чтобы первой логической странице соответствовала вторая физическая страница (короче, делать запись по адресу $C112). А после вывода символа возвращать все в исходное состояние. Для этого в Мониторе есть две подпрограммы $F84F и $F85A. Первая перенастраивает диспетчер памяти перед выводом символа, вторая восстанавливает исходное состояние.
Почему так устроен вывод на экран - понятно: поскольку в девятке есть диспетчер памяти, который кто угодно может перенастроить, то нельзя быть уверенным, что в момент вызова процедуры печати символа указатель BASL указывает именно на текущую текстовую страницу. И Монитор всегда делает правильную настройку сам.
А вот для вспомогательных процедур, типа CLREOL такая настройка не делается, поэтому результат вызова получается странным. В общем, ничего хитрого, но напороться на такое было неожиданно :)