Assembler для начинающих






    Программа управления кассетным магнитофоном в BIOS - это пример
    работы с последовательным устройством с помощью временных циклов.
    Но из-за отличий временных параметров команд, программа
    обслуживания кассетного магнитофона BIOS во всех критических
    случаях использует таймер-счетчик 8253.  Здесь будут рассмотрены
    только две программы использующие таймер - READ_HALF_BIT и
    WRITE_BIT.
 
      В техническом описании содержится вся информация о методе
    кодировки данных, записываемых на кассету. Программа WRITE_BIT
    записывает на ленту один бит данных. Выход канала 2
    таймера/счетчика непосредственно подключается к выводному порту
    кассетного адаптера. Поэтому запись бита данных заключается в
    установке правильной частоты канала 2 таймера и ожидании одного
    полного цикла. Программа WRITE_BIT делает именно это, но в обратном
    порядке. Когда программа WRITE_BIT получает управление, предыдущий
    бит еще находится в процессе записи. Два цикла ожидания в программе
    WRITE_BIT обеспечивают задержку на пол-цикла, необходимую для
    завершения записи предыдущего бита. Когда запись бита завершена,
    BIOS заносит новое значение частоты в канал 2 таймера. Программа
    WRITE_BIT возвращает управление вызвавшей программе тогда, когда
    новая частота начала выдаваться на ленту. Программа управления
    кассетным магнитофоном достаточно быстрая (или скорость выдачи бит
    в кассету достаточно медленная - это зависит от вашей точки
    зрения), чтобы программа WRITE_BIT вызвалась снова до того, как
    таймер завершит первые полцикла записи бита.
 
      Программа READ_HALF_BIT выполняет противоположную работу. Эта
    программа ждет до тех пор, пока бит ввода с кассетного механизма
    (бит 4 порта 62H) не изменит состояние. Каждая смена состояния
    этого бита соответствует чтению половины бита. Программа кассетного
    механизма вычитает текущее значение таймера из его значения при
    предыдущей смене бита. Это число соответствует времени, которое
    потребовалось сигналу кассеты, чтобы перейти из одного состояния в
    другое. Сложение двух полубитовых переходов дает общую длительность
    цикла этого бита. Так как времена циклов у нулей и единиц разные,
    программа READ_BYTE может определить значение текущего бита. Из
    восьми прочтенных битов она формирует байт.
 
      Программа READ_HALF_BIT иллюстрирует использование канала 0
    таймера для целей измерения времени. BIOS замораживает значение
    счетчика таймера, а затем читает его в регистр AX. Использование
    значения 0, загружаемого в счетчик 0 таймера позволяет вычитать
    любые два значения таймера, не анализируя, какое из них больше; в
    любом случае получится верная разность.
 
      Программа управления кассетным магнитофоном BIOS содержит в
    себе подпрограммы, выполняющие четыре функции. Две из них - блочные
    операции ввода-вывода, чтение блока и запись блока. Для
    эффективного использования ленты данные записываются на нее блоками
    по 256 байт. BIOS проверяет правильность ввода этих блоков с
    помощью циклического избыточного кода CRC (Cyclic Redundacy Check).
    Проверка ошибок с помощью CRC выявляет почти все ошибки, которые
    могут возникнуть на ленте. Это позволяет IBM PC использовать
    кассеты в качестве средства памяти с уверенностью, что вновь
    читаемые с них данные правильны. Кроме того, BIOS помещает данные в
    блоки в связи с несовершенством механизма кассетного магнитофона,
    проявляющемся при записи блоков любого размера. Программа обязана
    ждать до тех пор, пока двигатель кассетного магнитофона не
    включится и разгонится до нужной скорости. Программа также должна
    записывать на ленту синхронизирующие импульсы для того, чтобы
    микропроцессор вошел в синхронизацию с данными тогда, когда они
    будут читаться. Наконец, BIOS записывает слово CRC и конечный байт
    в конце каждого блока. Вся эта дополнительная работа происходит с
    любым блоком данных, независимо от того, один это байт или 10000
    байт. Фирма IBM выбрала размер блока, равный 256, как компромисс
    между слижком большим размером блока и нерациональным
    использованием ленты.
 
      Другие две функции программы управления кассетным магнитофоном
    BIOS - просто включают двигатель ммагнитофона и выключают его. Если
    вы думаете о разработке простого способа подсоединения вашей
    аппаратуры к IBM PC, имейте в виду, что кассетный порт очень удобен
    для этой цели. С помощью разъема кассетного магнитофона,
    расположенного сзади корпуса машины, вы можете подключиться к
    последовательной линии ввода-вывода. Существует также реле, которое
    позволяет управлять низковольтным слаботочным двигателем. Но есть
    одна вещь, о которой надо помнить. Выходной бит подключается прямо
    к входному биту, когда реле двигателя включено. Такое соединение
    позволяет диагностическим программам фирмы IBM проверять входные и
    выходные цепи кассетного механизма без записи и чтения данных. Если
    вы отдельно используете последовательные вход и выход, нужно
    включить реле двигателя - даже если двигателя нет.