╔════════════════════════════════════════╗
║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ TR-DOS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
╚════════════════════════════════════════╝
Docent/LGN '& Spectre/LGN
В этом номере ENERGY мы открываем
новую рубрику, посвященную мелким
хитростям, позволяющим облегчить нелегкую
жизнь кодера. Первая из этих статей
немного развернет тему начатую в
ZX-FORMAT'е #5 "TR-DOS для программистов".
ZX-FORMAT в лице Макса Петрова нам очень
подробно описал как написать turbo-loader;
Echo поведало, как избежать неприятностей
при работе с ВГ'шкой; ну а мы расскажем о
работе с портами TR-DOS'а. Существует
несколько способов работы с портами
TR-DOS'а:
- на некоторых компьютерах (например
PROFI) можно поставить ВГ'шку на
прямой доступ
- в некоторых ПЗУ (TR-DOS) по адресу
#3C30 прошиты коды команд
IN A,(#1F)
RET
- в TR-DOS v5.03 по адресу #09E7 есть
аналогичное сочетание
Тяга всех к порту #1F объясняется тем,
что остальные порты читать не столь важно
(кроме порта #7F конечно). А из порта #1F
считывается байт ошибок произошедших при
работе с диском. Небольшое отступление: с
записью в порты никаких проблем нет, так
как по адресу #2A53 прошито:
OUT (C),A
RET
Теперь про чтение, самый первый и
самый известный способ чтения из порта #1F
упомянут Родионовым в его книге "TR-DOS
для пользователей и программистов", он
несмотря на недостатки (портятся некоторые
регистры, портится содержимое порта
секторов, и т.д.) до сих пор активно
применяется. Более подробное описание
этого способа смотрите в вышеупомянутой
книге. Мы расскажем еще два:
#3EF3 IN H,(C)
#3EF5 IN A,(#FF)
AND #C0
JR Z,#3EF5
EI
RET M
DI
IN A,(#7F)
JR #3EF5
Этот способ работает на всех
компьютерах, с помощью него можно читать
содержимое любого регистра ВГ'шки. Для
этого в BC задаете номер порта и в H
получаете считанное значение, главное
чтобы в процессе выполнения этой процедуры
пришел сигнал об окончании выполнения
команды.
И второй:
#3FE5 IN A,(#FF)
AND #C0
JR Z,#3FE5
RET M
#3FEC INI
JR #3FE5
Эта процедура используется TR-DOS'ом
для чтения данных, но мы можем
использовать ее для чтения информации из
любого порта. Применение: в HL задаете
адрес куда поместится результат операции,
а в BC номер порта. Запускать ее нужно с
адреса #3FEC. Условия выполнения
аналогичны предыдущей. Соответствие битов
в прочитанной информации вы можете найти в
все той же книге Родионова о TR-DOS'е.
Если вас заинтересовало то можно упомянуть
об адресе #2099, результатом использования
данной процедуры будет состояние флага
ZERO: если не произошло ни одной ошибки то
будет Z, ну а при NZ - DISK ERROR !!! При
этом ошибкой считается любая ситуация (нет
диска, ошибка чтения/записи, и т.д.)
Теперь о вызове данной процедуры:
PUSH BC ; сохраним BC и HL
PUSH HL ; IN
LD HL,CONTIN ; A,(#1F)
PUSH HL ;
LD HL,METKA ; AND #7F
PUSH HL ;
LD B,1 ; OR A
PUSH BC ;
LD HL,#2099 ; RET Z
PUSH HL
JP #3D2F
METKA DB #01
CONTIN DI
POP HL ; продолжение
POP BC
Примечание: после выполнения делается EI.
В завершении статьи можем добавить,
что во избежание проблем с компьютером
"Байт-01" и с целью работоспособности
наших turbo-loader'ов на винчестерах
авторы этой статьи пользуются стандартной
точкой входа в TR-DOS - #3D13, а ошибки
отлавливают через #5CC2. Как отловить
ошибки через #5CC2 можете посмотреть в ART
STUDIO. А может быть мы напишем об этом
статью.