Из журнала Adventurer #5, Рыбинск, 09.12.1996  Cav inc. +---------------------------------------+ | Знаете ли вы, что такое 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 год ----------------------