(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. Вот
вроде и все, что можно сказать по этому
поводу.
* * *