Этюды - Программа - каталогизатор дисков.

ZX Review #7-8-9-10
(c) Kettle, Лен.обл., п.Совет-
ский

   Я долго не  решался  написать
вам. Но вот зашел  в  тупик, мне
просто не с кем  посоветоваться.
Все, кого я знаю, и у кого  име-
ется  Спектрум, не  продвигаются
дальше игрушек. Я же прошел Бей-
сик и теперь пробую свои силы  в
ассемблере. Я второй год выписы-
ваю ваш журнал "ZX-Ревю" и  счи-
таю, что в вашем лице нашел луч-
шего собеседника  и  учителя.  И
вот теперь прошу помочь.
   Дело в том, что я долго искал
нормальный каталогизатор. Но бе-
зуспешно  -  один "виснет", дру-
гой не сортирует, третий не ищет
программу, четвертый не маркиру-
ет и т.д. Тогда я взялся  писать
сам. Программу я  хотел  сделать
максимально удобной и, как гово-
рится, дружественной, более  то-
го, с автопоиском на диске. Что-
бы даже  первоклассник  смог  ее
без подсказки использовать.
   Дело вроде бы пошло. Я разме-
тил  память, написал  процедуры,
обозначил буфер, почти  закончил
логическую  часть...  Но  тут  я
увидел, что памяти 48 Кб  (вмес-
те с программой) мне хватит  для
обработки лишь 16-20 дисков. Хо-
чется, чтобы  обрабатывались  не
только бейсик-блоки, а все  фай-
лы, или на выбор - любые.  А на-
до добавить, что  у  меня  более
50-ти дискет (купил оптом у быв-
шего синклериста, пересевшего на
IBM), и на этом я  не  собираюсь
останавливаться.
   Но, согласитесь, это смешно -
загружать данные с диска по час-
тям и не  использовать  всю  па-
мять - 256 Кб!!!  Да, да, да.  Я
подошел  к  главному  -  у  меня
"СКОРПИОН"! Но я, к своему вели-
кому стыду и к  великой  досаде,
не  умею  использовать  эту  чу-
до-машину "на  все  сто".  Ни  в
бейсике, ни  в  кодах.  Прочитал
кучу литературы и всюду натыкал-
ся на загадочные намеки на  порт
#7FFD. Извините, поэксперименти-
ровать не смог - мой GENS-4D  не
принимает команды с  полной  де-
шифрацией порта вывода.  Есть  у
меня еще TASM 4.0, но тот  поче-
му-то  не  отгружает   объектный
код. Через теневой монитор  тоже
пытался кодировать прямо  в  па-
мять,  но,  дизассемблируя  свои
коды, вижу  только  OUT (#FD),A.
Что делать? В книгах и  брошюрах
эта тема настолько сжата и  про-
тиворечива, что я  вконец  запу-
тался. Кроме того, в режиме 128-
бейсика есть  три  подпрограммки
обмена  страниц  памяти, но  вот
вопрос - как их использовать?
   Дорогая редакция! Надеюсь, вы
поняли мои затруднения и не  ос-
тавите без внимания мой  вопрос.
Буду весьма признателен. Подска-
жите, можно ли организовать  об-
работку данных в цикле из  одно-
го банка ОЗУ с  переброской  ре-
зультатов в другой? Какие  банки
и в какие адреса  можно  устано-
вить? Как это выполнить из  бей-
сика и из машинного кода?  Какие
конфликты предусмотреть?  Конеч-
но же, меня в первую очередь ин-
тересует "СКОРПИОН-256".
   А теперь немного  расскажу  о
моей идее  автопоиска  файлов  с
данными. При  входе  в  програм-
му-каталог она  запрашивает  те-
кущую дату:  6 цифр, либо  можно
организовать меню с  интерфейсом
и  наглядным выбором даты, имею-
щим в итоге все те  же  6  цифр.
При сбросе файла данных на  диск
эти цифры войдут в имя файла ав-
томатически. При  следующем  за-
пуске программы  не  надо  будет
вспоминать имя файла или дату  -
программа  сама  найдет  его  по
принципу  "больше-меньше", един-
ственное - после 1999 года  надо
будет сменить дискету.
   Ну вот, пожалуй, и все.  Буду
с надеждой ждать вашего отклика,
равно как и помощи других  чита-
телей best magazine "ZX-РЕВЮ"!

   Прим ред.: Да, рано или  поздно  кто-то
должен был задать подобный вопрос.  И  вот
наконец-то появился повод полностью  осве-
тить на страницах нашего журнала работу со
страницами. Итак, начнем  по  порядку.  Во
всех машинах  с  ОЗУ  128 Кб  присутствует
порт расширения с адресом #7FFD. Его стру-
ктура такова:

биты

 7 - не используется
 6 - не используется
 5 - защелка. При записи в этот бит 1 порт
     блокируется. Это необходимо для пере-
     вода машины в 48 Кб режим.  Блокиров-
     ка снимается только по сбросу кнопкой
     Reset.
 4 - выбор ПЗУ.  При записанном  туда  0 -
     впечатано ПЗУ бейсика-48.  Если  туда
     записать 1, то впечатывается ПЗУ бей-
     сика-128 и  одновременно  блокируется
     возможность включения  туда  ПЗУ  TR-
     DOS. Это необходимо, т.к. на  адресах
     #3D00 - #3DFF в  этом  ПЗУ  находится
     программа. При включенном ПЗУ  бейси-
     ка-48 блокировка TR-DOS снимается.
 3 - выбор экрана. В этих машинах есть две
     экранные области. 0 - это стандартный
     экран с адреса #4000. 1 - второй  эк-
     ран, находящийся в банке 7. Он  может
     быть впечатан  с  адреса  #C000.  Его
     структура полностью совпадает с обыч-
     ным.
 2 - Выбор страниц ОЗУ. Страница с  задан-
     ным  номером  (0-7)  впечатывается  с
     адреса #C000. Но!!! Страницы с  номе-
     рами  2 и 5  также  фиксированно  на-
     ходятся  по  адресам:  2 - #8000, 5 -
     #4000. То есть 0 экран по  сути  дела
     находится в странице 5.  Таким  обра-
     зом, при  работе  с  расширенной  па-
     мятью  надо  обходить  эти  страницы,
     поскольку они уже использованы.

   Но, как вы уже заметили, 8  страниц  по
16 Кб - это 128 Кб. Но у Скорпиона 256 Кб.
Как же быть с остальной памятью?  Для это-
го в Скорпионе введен еще один порт расши-
рения, которого не было в 128-ых  машинах.
Его адрес - #1FFD. Вот какова его структу-
ра:

биты

 7 - не используется
 6 - не используется
 5 - Стробирование Centronix. Этот  сигнал
     используется при работе с  принтером.
     Кратковременная установка его в 1 го-
     ворит принтеру, что на него  поступи-
     ли данные.
 4 - Самый важный бит. С его помошью и уп-
     равляется дополнительная память. Если
     он установлен в 0, то по порту  #7FFD
     переключаются  страницы  0 - 7; когда
     он установлен в  1, то  переключаются
     страницы 8 - 15. Итого 256 Кб. Только
     следует учесть, что восьмая  страница
     используется теневым монитором.  Если
     запортить ее  содержимое, то  монитор
     окажется неработоспособен, и по нажа-
     тию Magic машина просто зависнет.
 3 - вывод RS232, Через этот бит передают-
     ся данные для некоторых типов принте-
     ров.
 2 - не используется
 1 - установка этого бита в 1  приводит  к
     тому, что бит 4 порта #7FFD перестает
     работать, а с адреса 0  впечатывается
     ПЗУ теневого монитора. Установка это-
     го бита в 0 вернет все на места.
 0 - Очень интересная вещь.  При  поданной
     туда 1 с адреса 0 впечатывается нуле-
     вая страница ОЗУ. Очень  полезно  для
     тестирования своих версий ПЗУ, а так-
     же с его помощью можно  получить  не-
     посредственный доступ к портам  ВГ93!
     Идея такая. Мы устанавливаем этот бит
     в 1 и делаем переход по адресу в диа-
     пазоне #3D00 - #3DFF. Сработает логи-
     ка контроллера, которая должна подме-
     нить ПЗУ на TR-DOS и переключить пор-
     ты. Порты-то переключаются, а  ПЗУ-то
     не работает... И мы попадаем в  пред-
     варительно подготовленную  программу,
     которая имеет полный доступ к  портам
     ВГ93 до тех пор, пока  управление  не
     выйдет за адрес #3FFF.  При  переходе
     этого предела порты переключатся  об-
     ратно. Установка этого бита в 0  вер-
     нет все на привычные места.

   Итак, приводим пример процедуры, впеча-
тывающей с  адреса  #C000  страницу, номер
которой (0-15) вы поместите в регистр A:
140.
        PUSH AF       ;сохраняем номер страницы
        AND  #07      ;выделяем младшие биты
        OR   #10      ;чтобы включилось ПЗУ 3бейсика-48
        LD   BC,#7FFD ;установка порта #7FFD
        OUT  (C),A
        POP  AF       ;восстанавливаем номер страницы
        AND  #08      ;выделяем старший бит.
                      ;Он является номером группы страниц.
        RLA           ;в порту это будет 4 бит, а не 3.
        LD   B,#1F    ;меняем адрес порта на #1FFD
        OUT  (C),A    ;устанавливаем порт #1FFD.
2
   Естественно, стек и сама  процедура  не
должны  находиться  выше  #C000.  Обратите
внимание на команды  OUT (C),A!  Очевидно,
вы пытались набрать  OUT (#7FFD),A.  Такой
команды нет.  Адрес порта в этой команде -
только один байт. Для обращения  к  порту,
адрес которого задан  двумя  байтами, надо
использовать  команду  OUT (C),A, загрузив
предварительно адрес порта в BC.
   Теперь о том, как работать из  Бейсика.
Абсолютно так же. В принципе, бейсик вооб-
ще не приспособлен для работы со страница-
ми. Бейсик-128 использует  их  только  как
Ram-диск и дополнительный буфер.  Те  под-
программы, о которых  вы  упомянули, абсо-
лютно бесполезны. Они используются  бейси-
ком-128 для обмена ПЗУ при вызове подпрог-
рамм из бейсика-48. Внимание! На эти  под-
программы управление передается  также  по
прерываниям, если  включено  ПЗУ  бейсика-
128. Так что не впечатывайте его при  раз-
решенных прерываниях, если вы не уверены в
их наличии. Это может иметь место, если вы
запускались  из  48-го  бейсика.  А  лучше
вообще не трогать его, поскольку  полезно-
го в нем ничего нет.
   По этой же причине есть еще один нюанс.
Если вы переключаете порты из  Бейсика, то
перед тем, как  заслать  значение  в  порт
#7FFD, обязательно поместите его в  ячейку
#5B98. Без этого вы не сможете переключить
страницу - первое же прерывание вернет  на
место старую. То же самое  относится  и  к
ассемблеру, если уж вы  решили  залезть  в
ПЗУ 128-го бейсика при разрешенных  преры-
ваниях. Хотя с этим лучше  не  связываться
при работе с портом #1FFD. ПЗУ бейсика-128
не знает  о  его  существовании  и  крайне
удивится, когда на месте 7 страницы, кото-
рая используется ей для хранения  каких-то
своих переменных, вдруг окажется  15.  Вот
вроде и все, что можно  сказать  по  этому
поводу.

          *   *   *