ВНИМАНИЕ: в 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