ZX Review
#7-8-9-10
08 ноября 1997 |
|
Этюды - Программа - каталогизатор дисков.
(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. Вот вроде и все, что можно сказать по этому поводу. * * *
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября