Oбмен опытом - Некоторые особенности XAS'а. Передача параметров в программу в командной строке.

Adventurer #05
ВНИМАНИЕ: в ADVENTURER N4  в  статье
"Обмен опытом" была допущена ошибка! Пра-
вильно должно быть так:
чтобы подпрограммы ПЗУ нормально работали
в 128-м режиме, надо сбросить 4-й бит пe-
ременной FLAGS (23611/#5C3B).
     Редакция приносит  извинения читате-
лям за допущенную неточность.

               (C) Cav inc.
╔───────────────────────────────────────╗
│ ──── Некоторые особенности XAS'a ──── │
╚───────────────────────────────────────╝

     Внимание !!!  Речь пойдет о XAS'е, в
котором НЕ указана версия, а просто выда-
ется копирайт автора с указанием 1996 г.
     Первая особенность XAS'a, замеченная
мной - то,  что  после  выхода  в JEMMINI
COMMANDER и,  допустим, уплотнения диска,
при запуске  XAS'a загружается текст, ко-
торый  был  последним при редактировании.
(Но не всегда).
     Вторая  особенность  заключается   в
том, что при запуске вашей программы,  вы
можете как хотите  "портить"  3,4,5,6 и 0
страницы  памяти;  можно даже 7 (если вам
STS не нужен) - ваш текст не "умрет"  при
выходе  обратно  в  XAS, он подгрузится с
диска. (Совет: сохраняйте  перед запуском
текст на диске).
     Третья  особенность  заключается   в
том, что инструкция   LD (adr)  ассембли-

руется как LD (adr),BC.
     Четвертая особенность относится не к
XAS'у, а к  STS 3.2, который попал ко мне
вместе с XAS'ом на диске, он  имеет имя :
"xsts.C".  Особенность заключается в кно-
пке [C] - она  вызывает  каталог диска. И
еще: в этой версии сделана трассировка до
нужного  вам  адреса,  а не по количеству
команд.

От редакции: Еще  одна, к  сожалению, не-
приятная  особенность  состоит в том, что
нет контроля - сохранен  ли  рабочий файл
перед запуском или загрузкой с диска  но-
вого  (есть, конечно, цветовая индикация,
но после ассемблирования  она  показывает
неверную информацию).

           ──────────────────────  
╔───────────────────────────────────────╗
│ ── К вопросу о передаче параметров ── │
│ ── в программу  в командной строке ── │
╚───────────────────────────────────────╝

     Какой  обычный  способ запуска прог-
рамм с диска в системе TR-DOS ?  Правиль-
но, с помощью boot'а. Во всяком случае, в
90 % всех запусков. Параметры же програм-
ма запрашивает уже после запуска.  Но хо-
телось бы указывать параметры или  данные
для программы во время запуска  так,  как
это делается в  MS DOS или RT-11.  Долгое
время я не знал,как это реализовать (вер-
нее, не было нужно), и вот как-то раз ре-
шил с этим разобраться.  Что из этого по-
лучилось - читайте ниже...
     Первой идеей, которaя приходит в го-
лову - это использовать  буфер  редактора
строки  (на  него указывает E_LINE).  Тем
более,  при  наборе  командной  строки  в
TR-DOS'e он используется. Идея была хоро-
шая, но нереализуемая, так как этот буфер

затирался  при  загрузке BASIC'ом.  Около
двух  дней  я ломал голову и приставал ко
всем знакомым кодерам с вопросами.. Поко-
вырял INSULT, но то, что я  там наковырял
мне было не нужно. Оказалось, что наличие
чего-то после имени файла определялось по
последним символам строки. То есть строка
должна быть достаточно длинной.   Обдумав
этот вопрос,  я нашел решение, но получи-
лась не очень удобная вещь (в смысле дли-
ны).  Чтобы  все работало, пришлось напи-
сать  самый короткий из возможных загруз-
чиков, с таким текстом :

      10 RANDOMIZE USR VAL "23883":REM...

после REM шел такой код:
       LD   HL,ADDR
       LD   DE,(#5CF4)
       LD   BC,#nn05
       PUSH HL
       CALL #3D13
       RET 

     здесь ADDR - адрес загрузки кодового
     блока, nn - число секторов.

     Даже при  таком коротком BASIC-файле
пришлось в командной строке набивать пят-
надцать(!) лишних символов  (ненужных)  и
только после  них  уже пустить нужную ин-
формацию (в моем случае это было имя фай-
ла). Вот такая получилась история. В све-
те  всего вышесказанного, можно заключить
то, что запуск программы с параметрами из
командной строки не получит широкого рас-
пространения.

╔───────────────────────────────────────╗
│ Знаете ли вы, что такое RST 16(#10) ? │
╚───────────────────────────────────────╝

     Конечно,- ответит начинающий кодер,-
это подпрограмма печати символа,  код ко-
торого помещен в регистр A. И он будет не
прав! Или представьте реакцию того же на-
чинающего хакера, когда он залазит,  ска-
жем, в программу  LIST III (by G.D.C.)  и

с трепетом обнаруживает, что через RST 16
осуществляется  печать  фонтом шириной  в
четыре пиксела с растоянием между буквами
в один пиксел!

     То, о чем пойдет речь ниже, является
заказным материалом, поэтому все,кто счи-
тают  себя  крутыми  хакерами и кодерами,
могут его не читать.

     Использование каналов в программах
    ────────────────────────────────────

     Вообще-то,  информацию  по   данному
вопросу  можно  найти  в изданиях "Инфор-
ком"'а. Но не у всех они есть, да и напи-
сано там не всегда понятно.   Итак, после
включения  машины определено четыре стан-
дартных канала.  Число каналов ограничено
лишь размером ОЗУ. Область каналов распо-
ложена  перед  областью  BASIC'а и на нее
(область  каналов)  указывает  переменная
CHANS (#5C4F).  Концепция  каналов играет
важную роль в Spectrum'е. Весь символьный

ввод/вывод, идущий через RST #10 на самом
деле идет через каналы. Поэтому, если вы,
ковыряясь в чужой программе,увидели, что,
допустим, печать  в 64 символа идет через
RST #10 или же через этот рестарт делает-
ся вообще почти все, то не пугайтесь и не
копайте судорожно ПЗУ'шку!  Просто в этой
программе переопределен канал.
     Переопределение  каналов  по  своему
усмотрению дает иногда значительное преи-
мущество в работе.  Теперь перейдем к бо-
лее глубокому рассмотрению вопроса.
     Стандартные  каналы имеют достаточно
простую структуру :

длина(байт)    имя        комментарий
─────────────────────────────────────────
    2       proc_out    - адрес процедуры
                          вывода
    2       proc_in     - адрес процедуры
                          ввода
    1       name chanel - имя канала
─────────────────────────────────────────

     Адреса  процедур  ввода (proc_in)  у
всех стандартных каналов,кроме канала "К"
установлены на #15C4 (RST #8),  т. е.  на
печать сообщения об  ошибке  "Invalid I/O
device". У канала "К" (нижняя часть экра-
на) указатель proc_in указывает на  #10А8
(КEY-INPUT). Если вы собрались менять ад-
реса proc_out и proc_in у стандартных ка-
налов,  то  имейте  в виду, что некоторые
команды BASIC'a при своем выполнении ини-
циализируют  в стандартных каналах значе-
ния из ПЗУ.  Поэтому  желательно  создать
СВОЙ канал и делать с ним все, что угодно
вашей душе.  В литературе  написано,  что
ТОЛЬКО СТАНДАРТНЫЕ  каналы имеют длину  в
5 байт,  а  если пользователь  решил  из-
вратиться, то ему нужно отводить под блок
информации о канале не менее 11 байт. Бы-
ла произведена проверка и оказалось,  что
вполне  хватает  и  пяти (если устройство
ввода/вывода не блочное). Свой канал мож-
но создать таким образом :

    LD   HL,(PROG)   ; сист.перем. #5C53
                     ; (начало BASIC'а)
    DEC  HL          ;
    LD   BC,len      ; длина резерви-
                     ; руемой области
    CALL #1655       ; п/п MAKE_ROOM
    INC  HL          ; адрес канала
    LD   DE,adr_data ; адрес ваших дан-
                     ; ных о канале
    EX   DE,HL       ;
    LD   BC,len_data ; длина данных,
                     ; должна быть рав-
                     ; на len
    LDIR             ;

      ...

adr_data
      DEFW print_my  ;  адрес proc_out
      DEFW input_my  ;  адрес proc_in
      DEFB "E"       ;  имя канала

Таким образом вы получаете свой канал, но
его нужно еще подключить к потоку.  Пото-
ков всего 19 и их не может быть больше. К
потоку нужно обязательно подключатся,если
вы собрались использовать RST#10. Область
информации  о  потоках  занимает память с
адреса #5C10 до адреса #5C34.  Под каждый
поток отведено два байта.  Если в  данных
потока содержится #0000, то это означает,
что этот поток  не подключен.   Для того,
чтобы подключить канал к нужному вам  по-
току, нужно в данные потока внести смеще-
ние начала описания вашего канала относи-
тельно начала области каналов.  Звучит не
очень понятно, но на самом деле все прос-
то и расчитывается по формуле:
   ┌──────────────────────────────────┐
   │ adr_my_chanel-adr_begin_chanel+1 │
   └──────────────────────────────────┘

Здесь adr_my_chanel - адрес начала вашего
                      канала;
      adr_begin_chanel - адрес начала об-
                         ласти о каналах.

     Открыть канал легко, гораздо труднее
закрыть его. Нет, если канал последний,то
проблем нет, но если вы собрались удалить
описание  канала, допустим, предпоследне-
го, то вам придется повозиться. То  есть:
отключить поток, сместить конец области о
каналах  в  меньшую  сторону, передвинуть
BASIC  и  все, что выше его  до RAMTOP'а,
пересчитать смещения в потоках для остав-
шихся каналов.  Но  не стоит пугаться, не
такое уж это сложное дело.
     Кстати, из-за того, что область  ка-
налов находится после системных  перемен-
ных (как SOS, так и DOS), возможно созда-
ние самозапускающихся дисков  (т.е по ко-
мандам CAT, LIST и т.п.).   А  происходит
это так : при обработке комадны CAT, LIST
и др. с адреса #5D25 образуется временный
буфер,  куда  читается восьмой сектор для
произведения настройки на диск. Стандарт-
ные сектора TR-DOS'a имеют 256 байт, поэ-
тому  отводится  именно это число под бу-
фер.  Но  ВГ93 может читать любые сектора
(128, 256, 512 и 1024 байта)  и если раз-

мер сектора БОЛЬШЕ стандартного, то оста-
ток  сектора  наезжает на область о кана-
лах. После этого TR-DOS, ничего не подоз-
ревая,пытается напечатать "ОК", а так как
у нас в данных на канал совсем не то, что
надо (вернее, то,  если диск с автозапус-
ком), то происходит переход или на  нахо-
дящуюся в этом же считанном секторе  про-
цедуру загрузки  или  в  "ахун"  (понятие
"ахун" объяснено  в  произведениях Ф.Кар-
сака /прим. редактора/).  В  свете  всего
вышесказанного становится понятно поведе-
ние TR-DOS  при попытке поглядеть каталог
МS-DOS диска (512 байт на сектор).  А так
же, как работает запуск в iS-DOS.
     Вообще-то, при использовании концеп-
ции переопределения каналов, можно делать
довольно-таки занятные штуки.  Так,  я до
появления у меня STS 4.1,  получал  текст
дизассемблера программ  (чужих) следующим
образом: я открывал файл последовательно-
го доступа на чтение: (OPEN #4,"NAME",W),
переопределял   принтерный      п о т о к
(stream #3)  на  вновь  открытый  поток в

файл (POKE 23580, PEEK 23582:
      POKE 23581, PEEK 23583),
грузил  MONS,  потом блок кодов, входил в
MONS и давал команду "вывод дизассемблера
блока  на  принтер",  выходил из  MONS'a,
закрывал файл (CLOSE #4) и получал  гото-
вый к употреблению текст в ASCII формате.

     Вот, вроде,  и все, что я хотел ска-
зать. Кто не понял, можете написать пись-
мо с конкретными вопросами ЧТО непонятно.

         Используемая литература :

  Ю. Поморцев   "TR-DOS для профессио-
                 налов  и любителей"

  "Инфорком"    Трехтомник по графике.
                том второй "Прикладная
                графика"

  "Инфорком"    ZX-Ревю 1991 год

           ────────────────────── 

                 (C) RAY