Energy
#05
29 мая 1997 |
|
TR-DOS - О работе с портами TR-DOS'а.
╔════════════════════════════════════════╗ ║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 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. А может быть мы напишем об этом статью.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября