Adventurer
#05
30 ноября 1996 |
|
Oбмен опытом - Некоторые особенности XAS'а. Передача параметров в программу в командной строке.
ВНИМАНИЕ: в 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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября