560 NEXT N 'следующий бит
570 NEXT M 'следующий байт
Hизкий уровень.
Язык ассемблера делает битовые преобразования намного быстрее.
Вот процедура, которая делает эти преобразования ужасно быстро,
поскольку она держит все в микропроцессоре (она немного великова-
та, но Вы можете использовать взамен алгоритм, показанный в Бей-
сике). Процедура работает, храня 8 результирующих байтов в ре-
гистрах CX, DX, BP и DI. Байт экранных данных помещается в AL, а
затем в AH передвигаются последовательно CL, CH, DL и DH. Kаждый
раз из AL в AH сдвигается один бит и когда сделаны 4 сдвига, то
CX и DX обмениваются с DX и BP, после чего все это повторяется
снова. Этот процесс повторяется для каждого из 8-ми экранных
байтов и когда он завершен, то преобразованное изображение хра-
нится в регистрах микропроцессора, причем самый левый байт данных
для печати в CL. Содержимое регистров выводится на принтер и
обнуляется, после чего процесс повторяется для следующих восьми
байтов экрана. Сначала получите 8 байтов из видеобуфера и помес-
тите их в буфер с именем BUFFER. Поместите 0 в AX, CX, DX, BP и
DI. Затем:
LEA BX,BUFFER ;указываем на буфер видеоданных
MOV SI,0 ;смещение в этом буфере
GET_BYTE: MOV AL,[BX][SI] ;берем байт
DO_HALF: XCNG AH,CL ;получаем CL, CH, DL и DH
SHL AX,1 ;сдвигая бит из AL
XCNG AH,CL ;
XCNG AH,CH ;
SHL AX,1 ;
XCNG AH,CH ;
XCNG AH,DL ;
SHL AX,1 ;
XCNG AH,DL ;
XCNG AH,DH ;
SHL AX,1 ;
XCNG AH,DH ;
;---начинаем вторую половину перемещения битов
XCNG CX,BP ;обмениваем содержимое CX и DX
XCNG DX,DI ;
CMP SI,7 ;если все байты преобразованы, то печатаем
JE PRINT_BYTES ;
INC SI ;иначе переходим к следующему байту
JMP SHORT GET_BYTE ;
;---печатаем байты
PRINT_BYTES: PUSH DX ;сохроаняем DX
MOV AH,5 ;функция вывода на принтер
MOV DL,27 ;код Esc
INT 21H ;посылаем его
MOV DL,75 ;код графического режима
INT 21H ;посылаем его
MOV DL,6 ;будет послано 6 байтов
INT 21H ;
MOV DL,0 ;
INT 21H ;
CALL PRINT_2_BYTES ;посылаем содержимое CX
POP CX ;
CALL PRINT_2_BYTES ;посылаем содержимое DX
MOV CX,BP ;
CALL PRINT_2_BYTES ;посылаем содержимое BP
MOV DX,DI ;
CALL PRINT_2_BYTES ;посылаем содержимое DI
.
(идем к следующей группе из восьми байтов)
.
PRINT_2_BYTES: PROC NEAR
MOV AH,5 ;функция печати
MOV DL,CL ;сначала CL
INT 21H ;печатаем
MOV DL,CH ;затем CH
INT 21H ;печатаем
RET
PRINT_2_BYTES ENDP
Глава 7. Ввод/вывод.
Раздел 1. Доступ к последовательному порту.
При асинхронной связи машина посылает или принимает байты
информации по одному биту. Временные интервалы между байтами при
этом несущественны, но времена между отдельными битами байта
очень важны. Сигнал на линии может быть высокого или низкого
уровня, что соответствует логическим нулю и единице, и говорят,
что линия отмечена (marking), когда уровень высокий, и пустая
(spacing), когда уровень низкий.
Линия поддерживается в отмеченном состоянии, когда по ней нет
передачи данных. При начале передачи байта данных сигнал падает в
0, отмечая стартовый бит. Затем следуют восемь битов данных
(иногда меньше) в виде набора высоких и низких уровней. Последний
бит данных может сопровождаться битом четности, используемым для
обнаружения ошибок, а затем в последовательность включаются 1 или
более стоп-битов, которым соответствует высокий уровень. Эти
стоп-биты начинают отмеченное состояние, которое будет сохранять-
ся до тех пор, пока не начнется передача следующего байта данных;
число используемых стоп-битов существенно, поскольку они устанав-
ливают минимальное время, которое должно пройти перед следующим
стартовым битом. Hа рис. 7-1 показана эта последовательность.
Kонечно, передающая и приемная станции должны использовать
один и тот же протокол для этих цепочек битов и они должны рабо-
тать с одной и той же скоростью обмена (измеряемой в битах в
секунду, называемых также бодами). При обмене могут легко возни-
кать ошибки, поэтому коммуникационное оборудование предоставляет
разнообразную информацию о статусе как самого порта, так и при-
соединенного к нему модема. Задачей модема является преобразова-
ние сигнала, генерируемого портом коммуникации, в акустический
сигнал, который может затем быть передан по телефонному каналу.
Большинство модемов предоставляют также дополнительные коммуника-
ционные возможности, такие как автоматический вызов и ответ,
которые не поддерживаются самим портом коммуникации.
7.1.1 Программирование микросхемы UART 8250.
Последовательная связь настолько сложна, что были разработаны
специальные микросхемы, выполняющие работу по формированию и
синхронизации строк битов, составляющих последовательные данные.
Такие микросхемы называют универсальным асинхронным приемни-
ком-передатчиком (universal asynchronous receiver transmitter или
UART). IBM PC использует UART 8250 фирмы Intel.
Операционная система поддерживает 2 порта коммуникации, поэто-
му в машине имеются 2 микросхемы. Их базовые адреса хранятся в
ячейке 0040:0000 для COM1 и 0040:0002 для COM2. (Базовый адрес
это 2-хбайтовый адрес порта, который является младшим из группы
адресов портов, дающих доступ к UART.) Hа всех машинах кроме PCjr
COM1 имеет базовый адрес 3F8H, а COM2 - 2F8H; PCjr имеет свой
внутренний модем по адресу 3F8H, а COM1 - по адресу 3F8H. Для
удобства, мы в дальнейшем будем всегда нумеровать регистры 3FxH,
но все сказанное в равной степени применимо и к регистрам 2FxH.
Микросхема 8250 имеет 10 программируемых однобайтных регист-
ров, с помощью которых управляется и контролируется порт коммуни-
кации. Большинство из них занимаются инициализацией порта, про-
цессом, который может быть очень сложным. Доступ к этим 10 ре-
гистрам осуществляется через семь адресов портов с номерами 3F8H
- 3FEH (или 2F8H - 2FEH). В пяти случаях регистр, к которому
получаем доступ через данный порт, зависит от того, как установ-
лен бит 7 в регистре контроля линии, который является единствен-
ным регистром с адресом порта 3FBH. Вот эти регистры:
3F8H (OUT, бит 7 = 0 в 3FBH) Регистр хранения передатчика
3F8H (IN, бит 7 = 0 в 3FBH) Регистр данных приемника
3F8H (OUT, бит 7 = 1 в 3FBH) Делитель скорости обмена (младший)
3F9H (IN, бит 7 = 1 в 3FBH) Делитель скорости обмена (старший)
3F9H (OUT, бит 7 = 0 в 3FBH) Регистр разрешения прерывания
3FAH (IN) Регистр идентификации прерывания
3FBH (OUT) Регистр управления линии
3FCH (OUT) Регистр управления модемом
3FDH (IN) Регистр статуса линии
3FEH (IN) Регистр статуса модема
Из десяти регистров только шесть необходимы для простой после-
довательной связи. Регистр хранения передатчика содержит байт
данных, которые будут посланы [7.1.6], а регистр данных приемника
- последний полученный байт данных [7.1.7]. Регистры управления и
статуса линии инициализируют и управляют линией связи, используя
скорость обмена, содержащуюся в двух регистрах делителя скорости
обмена [7.1.2]. Из оставшихся четырех регистров регистры управле-
ния и статуса модема используются только для связи через модем
[7.1.5], а два регистра, связанных с прерываниями используются
только в процедурах, управляемых прерываниями [7.1.8].
Прерывания используются при связи в целях эффективности. Обыч-
ная коммуникационная процедура непрерывно проверяет регистр ста-
туса линии, ожидая вводимого символа или указаниия, что все гото-
во для передачи следующего байта данных. Поскольку процессор
намного быстрее, чем обычные скорости с которыми передаются пос-
ледовательные данные, то этот метод напрасно расходует процессор-
ное время, которое может использоваться для обработки поступающих
или передаваемых данных. По этой причине микросхема 8250 может
быть установлена в режим, вызывающий прерывание при появлении
символа, возникновении ошибки и т.п. Это прерывание моментально
вызовет процедуру Вашей программы, которая, скажем, будет переда-
вать следующий символ из коммуникационного буфера.
7.1.2 Инициализация последовательного порта.
При инициализации порта коммуникации ("открытии") устанавли-
ваются все его параметры. Эти параметры длину слова, число
стоп-битов, установку четности и скорость обмена. Длина слова это
число битов, которое образует основную единицу данных. Если мы
работаем с привычными порциями по 8 битов, то 7 битов достаточны
для стандартных файлов ASCII (в которых все символы имеют коды,
не превышающие ASCII 128), в то время как для передачи численных
данных достаточно порций по 4 бита.
Высокий уровень.
Бейсик открывает коммуникационный канал как файл, и как тако-
вому ему должен быть присвоен идентификационный номер:
OPEN "COM1: .........." AS #1
В кавычках должна быть помещена вся информация, необходимая для
инициализации порта коммуникации, при этом каждый элемент отде-
ляется от предыдущего запятой. Инициализационные данные всегда
вводятся в следующем порядке:
Скорость обмена дается как целое число: 75, 100, 150, 300, 600,
1200, 1800, 2400, 4800 или 9600 бод. По умолча-
нию берется скорость обмена 300 бод.
Четность вводится как односимвольный код: O для нечетной
E - для четной и N - при отсутствии контроля по
четности. Могут быть также S - когда бит чет-
ности всегда равен 0 и M - когда бит четности
всегда равен 1. Если используются 8 бит данных,
то надо указывать N; при использовании четырех
бит не надо использовать N. По умолчанию - E.
Биты данных дается как целое число 4, 5, 6, 7 или 8. По
умолчанию берется 7.
Стоп-биты дается как целое число 1 или 2, причем 2 -
значение по умолчанию для 75 и 110 бод, а 1 -
для остальных. Kогда число битов данных равно 4
или 5, то 2 обозначает 1 1/2 стоп-бита. Такое
значение возможно при коммуникации, так как в
этом случае бит является единицей времени и
поэтому делим.
Оператор OPEN "COM1:" AS #1 открывает COM1 для связи со скоростью
300 бод с четной четностью, используя 7 битов данных и 1
стоп-бит. OPEN "COM1:1200,O,8,1" устанавливает скорость 1200 бод,
нечетную четность, 8 бит на символ и 1 стоп-бит. Отметим, что Вы
можете завершить оператор OPEN выражением LEN = число, где число
устанавливает максимальный размер блока, с которым операторы GET
и PUT могут обрабатывать данные (по умолчанию 128 байтов). Имеет-
ся также ряд команд управления модемом, которые также могут быть
включены в эту спецификацию. (В [7.1.5] объясняется специальная
терминология, используемая при этом):
RS Подавляет сигнал "Запрос на посылку" (Request to send).
Если эта команда опущена, то OPEN "COM" включает RTS.
CS Вызывает проверку линии "Очистка посылки" (Clear to
send). За этой командой может следовать значение (от 0
до 65535), дающее число миллисекунд которые будет ожи-
даться сигнал перед тем как будет выдана ошибка таймау-