MOV CX,CURADR ;Последняя дорожка/сектор
CMP CL,10 ;Последний сектор?
JNE C90 ; нет - выйти
CMP SIDE,00 ;Обойти, если сторона = 0
JE C20
INC CH ;Увеличить номер дорожки
C20:
XOR SIDE,01 ;Сменить сторону
MOV CL,01 ;Установить сектор = 1
MOV CURADR,CX
C90: RET
C10ADDR ENDP
; Чтение дискового сектора:
; ------------------------
F10READ PROC NEAR
MOV AL,01 ;Число секторов
MOV AH,02 ;Функция чтения
LEA BX,RECDIN ;Адрес буфера
MOV CX,CURADR ;Дорожка/сектор
MOV DH,SIDE ;Сторона
MOV DL,01 ;Дисковод B
INT 13H ;Выполнить ввод
CMP AH,00 ;Ошибка чтения?
JZ F90 ; нет - выйти
MOV ENDCDE,01 ; да -
CALL X10ERR ; ошибка чтения
F90:
INC CURADR ;Увеличить номер сектора
RET
F10READ ENDP
; Вывод сектора на экран:
; ----------------------
G10DISP PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BX,01 ;Номер устройства
MOV CX,512 ;Длина
LEA DX,RECDIN
INT 21H
RET
G10DISP ENDP
; Очистка экрана:
; --------------
Q10SCR PROC NEAR
MOV AX,0600H ;Полный экран
MOV BH,1EH ;Установить цвет
MOV CX,0000 ;Функция прокрутки
MOV DX,184FH
INT 10H
RET
Q10SCR ENDP
; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02 ;Функция установки
MOV BH,00 ; курсора
MOV DX,0000
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке на диске:
; ----------------------------------
X10ERR PROC NEAR
MOV AH,40H ;Функция вывода на экран
MOV BH,01 ;Номер устройства
MOV CX,18 ;Длина сообщения
LEA DX,READMSG
INT 21H
RET
X10ERR ENDP
CODESG ENDS
END BEGIN
__________________________________________________________________________
Рис.18.1. Использование BIOS для чтения дискового файла.
Рассмотрим программу, приведенную на рис.18.1, в которой используется
команда BIOS INT 13H для чтения секторов диска. Программа базируется на
примере, приведенном на рис.16.3, со следующими изменениями:
1. Отсутствует описание FCB и подпрограмма открытия.
2. Программа расчитывает каждый дисковый адрес. После каждого
чтения происходит увеличение номера сектора. При достижении номера
сектора 10 процедура C10ADDR сбрасывает это значение в 01. Если номер
стороны = 1, программа увеличивает номер дорожки; затем меняется
номер стороны: 0 на 1 и 1 на 0.
3. Область CURADR содержит начальные значения номеров дорожки и
сектора (их программа увеличивает), а область ENDADR - конечные
значения. Один из способов улучшения программы - предоставить
пользователю возможность указать начальные и конечные номера дорожки
и сектора с помощью соответствующего запроса.
Выполните данную программу под управлением отладчика DEBUG.
Проделайте трассировку команд, которые инициализируют сегментные регистры,
и установите начальный и конечный номера секторов для файловой таблицы FAT
(расположение таблицы FAT различно в разных версиях операционной системы).
Используя команду G (до) для выполнения ввода с диска и проверки
считанного содержимого таблицы FAT и элементов оглавления.
В качестве альтернативы отладчику DEBUG можно преобразовать
ASCII-символы в области ввода в их шест. эквиваленты и выдать на экран эти
значения, как это делает отладчик DEBUG (см. программу на рис.14.5). Таким
образом можно проверить содержимое любого сектора (в том числе
"спрятанного"), а также предоставить пользователю возможность внести
изменения и записать измененный сектор на диск.
Следует помнить, что при создании файла DOS может вносить записи на
любые доступные сектора, которые не обязательно будут смежными на диске.
Следовательно, с помощью команды BIOS INT 13H нельзя выполнить
последовательное чтение файла.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Команда BIOS INT 13H обеспечивает прямой доступ к дорожкам и
секторам диска.
- Команда BIOS INT 13H не поддерживает операции с оглавлением,
обнаружение конца файла, блокирование и деблокирование записей.
- Верификация сектора выполняет элементарную проверку записанных
данных, что приводит к увеличению времени обработки.
- Проверяйте байт состояния после каждой дисковой операции через
BIOS.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________
18.1. Напишите команды для сброса дискового контролера.
18.2. Напишите команды для чтения байта состояния дискеты.
18.3. Напишите команды для BIOS INT 13H, выполняющие чтение одного
сектора в область памяти INDISK, с дисковода A, головки 0, дорожки 6 и
сектора 3.
18.4. Напишите команды для BIOS INT 13H, выполняющие запись трех
секторов из области памяти OUTDISK, на дисковод B, головку 0, дорожку 8 и
сектор 1.
18.5. При записи данных в вопросе 18.4, как можно распознать попытку
записи на защищенный диск?
18.6. На основе вопроса 18.4 напишите команды контроля записи
(операция верификации).
ГЛАВА 19 Печать
__________________________________________________________________________
Ц е л ь: Описать возможности программ на языке ассемблера для вывода
информации на печатающее устройство (принтер).
ВВЕДЕНИЕ
________________________________________________________________
Вывод на принтер несколько проще операций с экраном и диском. Для
печати существует несколько операций, выполняющихся через DOS INT 21H и
BIOS INT 17H. Команды, посылаемые на принтер, включают коды "конец
страницы", "конец строки" и "возврат каретки".
Принтеры классифицируются по качеству печати. Матричный принтер
формирует символы в виде матрицы точек и обеспечивает нормальный, узкий и
широкий форматы символов. Более совершенные матричные принтеры
обеспечивают точечную графику, наклонный шрифт, жирную печать и двойную
плотность, а также могут печатать, например, символы игральных карт и
другие алфавитно-цифровые символы. Высококачественные печатающие
устройства ограничены набором символов на сменной "ромашке" или барабане,
но обеспечивают отличное качество печати и большое разнообразие принтеров.
Многие высококачественные принтеры обеспечивают печать 10, 12 или 15
символов на дюйм, а также пропорциональное расположение пробелов,
подчеркивание, теневую и полужирную печать. Лазерные принтеры обладают
преимуществами как для матричной графики, так и для качественной печати
текстов.
Другая классификация печатающих устройств связана с интерфейсами.
Компьютеры IBM PC имеют параллельный интерфейс, позволяющий передавать
одновременно восемь битов из процессора на принтер. Кроме того, существует
последовательный интерфейс, который выполняет побитовую передачу данных.
Многие принтеры имеют буфер памяти, объемом в несколько тысяч байтов.
Принтеры также могут принимать биты контроля на четность (нечетность).
Принтеры должны "понимать" специальные сигналы из процессора, например,
для прогона листа, перевода строки или горизонтальной табуляции. В свою
очередь, процессор должен "понимать" сигналы от принтера, указывающие на
конец бумаги или состояние "занято".
К сожалению многие типы принтеров по разному реагируют на сигналы
процессора и одной из наиболее сложных проблем для программистов -
обеспечить соответствие собственных программ имеющимся печатающим
устройством.
СИМВОЛЫ УПРАВЛЕНИЯ ПЕЧАТЬЮ
________________________________________________________________
Стандартными символами управления печатью являются следующие:
Десятичн. Шест. Назначение
08 08 Возврат на шаг
09 09 Горизонтальная табуляция
10 0A Перевод строки
11 0B Вертикальная табуляция
12 0C Прогон страницы
13 0D Возврат каретки
Г о р и з о н т а л ь н а я т а б у л я ц и я. Горизонтальная
табуляция (шест. 09) возможна только на принтерах, имеющих соответствующее
обеспечение, иначе символы табуляции игнорируются. В последнем случае
можно имитировать табуляцию выводом соответствующего числа пробелов.
П е р е в о д с т р о к и. Символ перевода строки (шест.OA)
используется для прогона листа на один интервал. Соответственно для печати
через два интервала используется два символа перевода строки.
П р о г о н с т р а н и ц ы. Установка бумаги после включения
принтера определяет начальную позицию печати страницы. Длина страницы по
умолчанию составляет 11 дюймов. Ни процессор, ни принтер автоматически не
определяют конец страницы. Если ваша программа продолжает печатать после
конца страницы, то произойдет переход через межстраничную перфорацию на на
чало следующей страницы. Для управления страницами необходимо подсчитывать
число напечатанных строк и при достижении максимального значения
(например, 55 строк) выдать код прогона страницы (шест.0C) и, затем,
сбросить счетчик строк в 0 или 1.
В конце печати необходимо выдать символ "перевода строки" или
"прогона страницы" для вывода на печать данные последней строки,
находящиеся в буфере печатающего устройства. Использование последнего
символа "прогон страницы" позволяет установить напечатанный последний лист
в положение для отрыва.
ФУНКЦИИ ПЕЧАТИ В РАСШИРЕННОЙ ВЕРСИИ DOS
________________________________________________________________
В операционной системе DOS 2.0 имеются файловые указатели, которые
были показаны в главах по управлению экраном дисплея и дисковой печати.
Для вывода на печатающее устройство используется функция DOS шест.40 и
стандартный файловый номер 04. Следующий пример демонстрирует печать 25
символов из области HEADG:
HEADG DB 'Industrial Bicycle Mfrs', 0DH, 0AH
...
MOV AH,40H ;Запрос печати
MOV BX,04 ;Файловый номер принтера
MOV CX,25 ;25 символов
LEA DX,HEADG ;Область вывода
INT 21H ;Вызов DOS
В случае ошибки операция устанавливает флаг CF и возвращает код
ошибки в регистре AX.
ПРОГРАММА: ПОСТРАНИЧНАЯ ПЕЧАТЬ С ЗАГОЛОВКАМИ
________________________________________________________________
__________________________________________________________________________
TITLE PRTNAME (COM) Ввод и печать имен
CODESG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN