
- •Оглавление
- •1.Таймер. Установка и чтение таймера.
- •2.Установка/чтение времени и даты. Установка/чтение часов реального времени. Задержка программных операций.
- •5:10 Вы должны вырезать строку символов, соответствующую часам,
- •12, А затем представить результат опять в виде строки:
- •Int 21h ;устанавливаем время
- •Int 21h ;получаем время
- •2.1.4 Установка/чтение часов реального времени.
- •Ibm pc имеют часы реального времени, но, к сожалению, нет стан-
- •6 Устанавливает флаг переноса.
- •2.1.5 Задержка программных операций.
- •100 Sound 32767,91 'останавливает программу на 5 секунд
- •1Ah возвращает два младших байта в dx (большинство задержек укла-
- •Int 1ah ;получаем значение счетчика
- •3.Генерация тона по второму каналу таймера.
- •4.Клавиатура. Типы клавиш и управление ими.
- •10.1. Основные принципы функционирования клавиатуры
- •100 Rem Программа на Бейсике, пытающаяся считывать
- •150 Print "Код сканирования клавиатуры"; xmod128;'сооб-
- •10.2. Определение смысла нажатых клавиш
- •10.3.Символьные клавиши
- •256. Например, если ввести Alt-1000, то будет сгенерирован
- •Ibm/pc указывают, что нулевой код генерируется нажатием
- •10.4. Процедура обслуживания клавиатуры в системе bios
- •5000 Rem Подпрограмма ожидания завершения работы
- •5035 Return 'Нажата клавиша Ins
- •9999 Rem Конец программы 10-1
- •5.Буфер клавиатуры. Очистка буфера клавиатуры. Проверка символов в буфере.
- •Раздел 1. Управление клавиатурой.
- •3.1.1 Очистка буфера клавиатуры.
- •110 Poke &h1c, peek(&h1a) 'выравниваем указатели
- •Int 21h ;чистим буфер, ждем ввода
- •3.1.2 Проверка символов в буфере.
- •0040:001C. (Нельзя просто проверить символ, находящийся в голове
- •Int 21h ;вызываем прерывание 21h
- •Int 16h ;проверка наличия символа
- •3.1.3 Ожидать ввод символа и не выводить его на экран.
- •If...Then проверяет получившееся число на соответствующие Alt-a,
- •0, То получен расширенный код. Повторите прерывание и в al поя-
- •Int 21h ;ожидаем ввод символа
- •Int 16h ;получаем введенный код
- •6.Прием символов с клавиатуры. Проверка/установка статуса клавиш-переключателей.
- •3.1.5 Прием символа без ожидания.
- •120 ... 'Иначе нет символа в буфере
- •Int 21h ;получение символа
- •3.1.6 Получение строки символов.
- •Input может выдавать на экран строку, запрашивающую пользователя
- •120 Input "Enter your age: ",age% 'принимает возраст как число
- •254 Символов, выдавая эхо на терминал. Эта процедура продолжает
- •Int 21h ;получаем строку
- •130 Poke(&h17,newbyte) 'посылаем новое значение статуса
- •130 Poke(&h17,newbyte) 'посылаем новое значение статуса
- •Int 16h ;получаем байт статуса
- •7.Установка атрибутов/цветов символов. Вывод символов на экран.
- •7.1.Установка атрибутов/цветов символов.
- •40 Символами - число 8. Чтобы вернуть мигание надо добавить к
- •3C0h 10h, чтобы указать соответствующий регистр. Наконец, надо
- •1 Они белые. Процедуры вывода символов bios (прерывание 10h),
- •8 К любому из кодов основного цвета, получим яркое изображение.
- •10H. Надо поместить номер регистра палетты (от 0 до 15) в bl, а
- •Inc bx ;увеличиваем указатель на атрибуты
- •7.2.Вывод символов на экран.
- •4.3.1 Вывод на экран одного символа.
- •6 Вывод символа без атрибутов
- •9 Вывод строки символов
- •Int 10h ;вывод строки
- •Inc bx ;переходим к следующему символу
- •Int 21h ;выполняем прерывание
- •Int 21h ;и выводим его на экран
- •Inc di ;увеличиваем указатель на 2
- •Inc bx ;переходим к обработке следу-
- •Inc bx ;увеличиваем указатель строки
- •Inc di ;увеличиваем указатель буфера
- •4.3.2 Вывод строки символов на экран.
- •Int 21h ;печатаем строку с позиции курсора
- •Int 21h ;печатаем строку с начала новой строки
- •8.Управление распределением диска Чтение таблицы размещения файлов fat.
- •40 Дорожек и в системе ms dos 2.0 каждая дорожка разбита на 9
- •360K. Все типы дисков используют размер сектора 512 байт в ms
- •Ibmdos.Com, которые считываются при старте и обеспечивают компью-
- •5.1.1 Чтение таблицы размещения файлов.
- •3 Занимают вторую тройку байт таблицы.
- •10M, которые имеют больше, чем 4086 кластеров. На рис. 5-1 пока-
- •100 '''Чтение секторов fat
- •190 Read q: poke n,q 'переносим их в память
- •270 '''Определяем номер следующего кластера файла
- •380 '''Проверяем кластер на четность
- •Int 25h ;читаем сектора
- •9.Прерывания. Bios прерывания. Dos прерывания. Hаписание собственного прерывания
- •9.1.Написание собственного прерывания.
- •Int 21h ;меняем прерывание
- •Int 21h ;теперь сегмент в es, смещение в bx
- •Int 21h ;восстанавливаем вектор
- •10.Общая структура программы на языке assembler. Различия между exe- и com-файлами
- •10.1.Различия между exe- и com-файлами
- •11.Регистры, флаги, распределение памяти.
- •12.Директивы процессора. Метки. Данные.
- •12.1.Метка
- •13.Адресация. Группа команд пересылки данных
- •1. Неявная адресация
- •2. Непосредственная адресация
- •3. Абсолютная прямая адресация
- •4. Относительная прямая адресация
- •14.Арифметические операции - add, sub, mul, div.
- •Xor (не или) устанавливает бит результата в 1, если бит источника отличается от бита приемника.
- •15.Биты, сдвиг логический, арифметический и циклический
254 Символов, выдавая эхо на терминал. Эта процедура продолжает
ввод поступающих символов до тех пор, пока не нажата клавиша
возврат каретки. DS:DX указывает на адрес памяти, куда должна
быть помещена строка. При входе первый байт в этой позиции должен
содержать число байтов, отводимых для этой строки. После того как
строка введена, второй байт даст число реально введенных симво-
лов. Сама строка начинается с третьего байта.
Надо отвести достаточно памяти для строки нужной длины плюс
два байта для дескриптора строки и один добавочный байт для возв-
рата каретки. Когда Вы устанавливаете максимальную длину строки в
первом байте, то не забудьте добавить 1 для возврата каретки. Код
возврата каретки - ASCII 13 - вводится как последний символ стро-
ки, но он не учитывается в результате, который функция помещает
во второй байт дескриптора строки. Таким образом, для получения
50-символьной строки надо отвести 53 байта памяти и поместить в
первый байт ASCII 51. После ввода 50 символов второй байт будет
содержать ASCII 50, а 53-й байт отведенной памяти - ASCII 13.
;---в сегменте данных
STRING DB 53 DUP(?) ;область для строки 50 символов
;---получение строки с клавиатуры
LEA DX,STRING ;DS:DX указывают на адрес строки
MOV BX,DX ;пусть BX тоже указывает на строку
MOV AL,51 ;установка длины строки (+1 для CR)
MOV [BX],AL ;посылаем в 1-й байт дескриптора
MOV AH,0AH ;номер функции
Int 21h ;получаем строку
;---проверка длины строки
MOV AH,[BX]+1 ;теперь длина в AH
В этой процедуре можно использовать возможности редактирования
строки MS DOS. Нажатие клавиши забой или "стрелка-влево" удаляет
символ с экрана, а также не помещает его в память. Работает кла-
виша табуляции, расширенные коды игнорируются, пустые строки
допускаются (имеется ввиду возврат каретки, которому не предшест-
вует другого символа). На терминале при достижении правого края
строка переносится на следующую строку, а при достижении правого
нижнего угла экран сдвигается на строку вверх. Когда вводится
больше символов, чем отведено места для строки, то лишние символы
игнорируются и включается гудок динамика.
MS DOS обеспечивает и другой способ получения строки, при
котором не выводится эхо на терминал. Функция 3FH прерывания 21H
- это функция ввода общего назначения, которая чаще всего исполь-
зуется при дисковых операциях. Она требует предопределенного
дескриптора файла (file handle), который является кодовым числом,
используемым операционной системой для обозначения устройства
ввода/вывода. Для клавитуры используется дескриптор 0 и он должен
быть помещен в BX. Поместите в DS:DX адрес, по которому должна
находиться строка, а в CX - максимальную длину строки и вызовите
функцию:
;---чтение строки без эха
MOV AH,3FH ;номер функции
MOV BX,0 ;номер дескриптора файла
LEA DX,STRING_BUFFER ;указатель на буфер ввода строки
MOV CX,100 ;максимальная длина строки
INT 21H ;ждем ввода
Ввод строки завершается нажатием клавиши возврат каретки и DOS
добавляет в конец строки два символа: возврат каретки и перевод
строки (ASCII 13 и ASCII 10). Из-за этих добавочных символов, при
указании длины строки 100 символов она может занимать до 102 байт
памяти. Длина введенной строки возвращается в AX и это значение
включает два символа-ограничителя.
3.1.7 Проверка/установка статуса клавиш-переключателей.
Два байта, расположенные в ячейках памяти 0040:0017 и
0040:0018 содержат биты, отражающие статус клавиши сдвига и дру-
гих клавиш-переключателей следующим образом:
Бит Клавиша Значение, когда бит = 1
0040:0017 7 Insert режим вставки включен
6 CapsLock режим CapsLock включен
5 NumLock режим NumLock включен
4 ScrollLock режим ScrollLock включен
3 Alt клавиша нажата
2 Ctrl клавиша нажата
1 левый Shift клавиша нажата
0 правый Shift клавиша нажата
0040:0018 7 Insert клавиша нажата
6 CapsLock клавиша нажата
5 NumLock клавиша нажата
4 ScrollLock клавиша нажата
3 Ctrl-NumLock режим Ctrl-NumLock включен
остальные биты не используются
Прерывание клавиатуры немедленно обновляет эти биты статуса,
как только будет нажата одна из клавиш-переключателей, даже если
не было считано ни одного символа из буфера клавиатуры. Это верно
и для клавиши Ins, которая единственная из этих 8 клавиш помещает
код в буфер (установка статуса Ins меняется даже если в буфере
нет места для символа). Отметим, что бит 3 по адресу 0040:0018
устанавливается в 1, когда действует режим задержки Ctrl-NumLock;
поскольку в этом состоянии программа приостановлена, то этот бит
несущественен.
Прерывание клавиатуры проверяет состояние статусных битов
перед тем, как интерпретировать нажатые клавиши, поэтому когда
программа меняет один из этих битов, то эффект такой же, как при
физическом нажатии соответствующей клавиши. Вы можете захотеть
установить состояние клавиш NumLock и CapsLock, чтобы быть уве-
ренным, что ввод будет требуемого вида. Наоборот, Ваша программа
может нуждаться в чтении статуса этих клавиш, например для того,
чтобы вывести текущий статус на экран. Отметим, что клавиатура AT
правильно устанавливает световые индикаторы состояния клавиш,
даже если переключены программно.
Высокий уровень.
В данном примере клавиша NumLock переводится в режим, когда
клавиши дополнительной клавиатуры используются для перемещения
курсора, за счет сбрасывания бита 5 по адресу 0040:0017 в 0. Это
достигается за счет операции логического "И" значения, располо-
женного по этому адресу с числом 223 (цепочка битов 11011111B -
описание логики битовых операций см. в Приложении Б). Результат
помещается в байт статуса. В примере затем восстанавливается
значение этого бита в 1, за счет логического "ИЛИ" с 32
(00100000B).
100 DEF SEG = &H40 'устанавливаем сегмент на область
110 STATUSBYTE=PEEK(&H17) 'BIOS и берем байт статуса
120 NEWBYTE=STATUSBYTE AND 223 'обнуляем бит 5