Интерфейсы переферийных устройств
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение
высшего профессионального образования
«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ПРИБОРОСТРЕНИЯ И ИНФОРМАТИКИ»
Кафедра ИТ-4 «Информационные технологии»
РЕФЕРАТ
ПО ДИСЦИПЛИНЕ
Тема: ИНТЕРФЕЙСЫ ПЕРЕФЕРИЙНЫХ УСТРОЙСТВ.
Москва, 2012
ВВЕДЕНИЕ
Периферийные устройства связывают компьютер с внешним миром, осуществляя ввод и вывод информации. Эффективность использования вычислительной системы в целом в значительной степени зависит от эффективности функционирования “периферии”.
Ассемблер является одним из самых старых из существующих на сегодня языков. Когда-то это был основной язык, но со временем появились более удобные средства общения с компьютером. Тем не менее язык не стал «мертвым» языком. Ассемблер, по словам В.Ю. Пирогова, – “это язык процессора и, следовательно, он будет нужен до тех пор, пока будут существовать процессоры” [11]. Являясь, по сути, символическим представлением машинного языка, Ассемблер позволяет в случае необходимости разрабатывать высокоэффективные программы, решая проблемы, связанные, в частности, с аппаратурой компьютера. Особенно ценен он в особых случаях, когда существуют жесткие ограничения на использование памяти или программа “критична” по времени.
Общепризнано, что в базовой подготовке программистов в качестве фундамента выступают знания принципов работы компьютера, его архитектуры и языка Ассемблер [15].
Целью данной работы является ознакомление с основными приемами программирования на Ассемблере периферийных устройств компьютера. Данная работа содержит теоретические сведения и подробно прокомментированные примеры использования языка Ассемблер при программировании работы клавиатуры, мыши, аудио- и видеосистем, дисков, а также для работы с файлами. При необходимости получения более подробной информации по каждому из затронутых вопросов можно обратиться к литературным источникам, ссылки на которые приводятся по мере изложения материала.
Теоретические сведения
Скан-код клавиши или комбинации клавиш - это номер, идентифицирующий их положение на клавиатуре (таблицы 1.1 и 1.2). Размер скан-кода - 1 байт.
Система представления символов в персональных компьютерах базируется на Американском стандартном коде для обмена информацией ASCII (American Standard Code for Information Interchange), включающем управляющие символы, используемые в коммуникационных протоколах для передачи команд периферийным устройствам (таблица 1.3), символы пишущей машинки – цифры, буквы и специальные знаки - и символы псевдографики (таблица 1.4). Размер ASCII-кода - 1 байт.
ASCII-код не связан напрямую со скан-кодом, так как одной и той же клавише могут соответствовать несколько символов - значений кода ASCII.
Расширенный код вырабатывается при нажатии функциональных клавиш и комбинаций управляющих и символьных клавиш, которые не имеют представляющего их символа ASCII [4, 5]. Он имеет размер 2 байта, при этом первый байт всегда ASCII-0 (null), а второй байт содержит соответствующий скан-код (см. таблицу 1.2).
Клавиатура - основное устройство ввода. Это совокупность механических датчиков, воспринимающих давление на клавиши и замыкающих электрическую цепь. Клавиатура имеет программируемый контроллер i8042. Его функции состоят в приеме скан-кодов от клавиатуры и управлении ее состоянием. Интерпретацией скан-кода занимается основной процессор.
Таблица 1.1 – Скан-коды для клавиш алфавитно-цифровой группы [8]
Скан-код клавиши |
Символ в режиме |
Скан-код клавиши |
Символ в режиме | ||
латинском |
русском |
латинском |
русском | ||
01h |
Esc |
1Eh |
A a |
Ф ф | |
02h |
1 ! |
1 ! |
1Fh |
S s |
Ы ы |
03h |
2 @ |
2 « |
20h |
D d |
В в |
04h |
3 # |
3 № |
21h |
F f |
А а |
05h |
4 $ |
4 ; |
22h |
G g |
П п |
06h |
5 % |
5 % |
23h |
H h |
Р р |
07h |
6 ^ |
6 : |
24h |
J j |
О о |
08h |
7 & |
7 ? |
25h |
K k |
Л л |
09h |
8 * |
8 * |
26h |
L l |
Д д |
0Ah |
9 ( |
9 ( |
27h |
: ; |
Ж ж |
0Bh |
0 ) |
0 ) |
28h |
“ ‘ |
Э э |
0Ch |
- _ |
29h |
` ~ |
Ë ё | |
0Dh |
= + |
2Ah |
Shift Left | ||
0Eh |
BackSpace |
2Bh |
| \ |
/ \ | |
0Fh |
Tab |
2Ch |
Z z |
Я я | |
10h |
Q q |
Й й |
2Dh |
X x |
Ч ч |
11h |
W w |
Ц ц |
2Eh |
C c |
С с |
12h |
E e |
У у |
2Fh |
V v |
М м |
13h |
R r |
К к |
30h |
B b |
И и |
14h |
T t |
Е е |
31h |
N n |
Т т |
15h |
Y y |
Н н |
32h |
M m |
Ь ь |
16h |
U u |
Г г |
33h |
< , |
Б б |
17h |
I i |
Ш ш |
34h |
> . |
Ю ю |
18h |
O o |
Щ щ |
35h |
? / |
, . |
19h |
P p |
З з |
36h |
Shift Right | |
1Ah |
{ [ |
Х х |
38h |
Alt | |
1Bh |
} ] |
Ъ ъ |
39h |
Пробел | |
1Ch |
Enter |
3Ah |
CapsLock | ||
1Dh |
Ctrl |
||||
Таблица 1.2 – Скан-коды для клавиш функциональной, дополнительной и цифровой групп, а также для комбинаций клавиш [8]
Скан-код |
Клавиша или комбинация клавиш |
Скан-код |
Клавиша или комбинация клавиш |
Скан-код |
Клавиша или комбинация клавиш |
3Bh |
F1 |
54h |
Shift+F1 |
72h |
PrintScreen |
3Ch |
F2 |
55h |
Shift+F2 |
46h |
Scroll Lock |
3Dh |
F3 |
56h |
Shift+F3 |
45h |
Num Lock |
3Eh |
F4 |
57h |
Shift+F4 |
37h |
[*] |
3Fh |
F5 |
58h |
Shift+F5 |
4Ah |
[-] |
40h |
F6 |
59h |
Shift+F6 |
4Eh |
[+] |
41h |
F7 |
5Ah |
Shift+F7 |
52h |
Insert [Ins, 0] |
42h |
F8 |
5Bh |
Shift+F8 |
53h |
Delete [Del, .] |
43h |
F9 |
5Ch |
Shift+F9 |
47h |
Home [7] |
44h |
F10 |
5Dh |
Shift+F10 |
4Fh |
End [1] |
85h |
F11 |
87h |
Shift+F11 |
49h |
PgUp [9] |
86h |
F12 |
88h |
Shift+F12 |
51h |
PgDn [3] |
68h |
Alt+F1 |
5Eh |
Ctrl+F1 |
48h |
↑ [8] |
69h |
Alt+F2 |
5Fh |
Ctrl+F2 |
4Bh |
← [4] |
6Ah |
Alt+F3 |
60h |
Ctrl+F3 |
50h |
↓ [2] |
6Bh |
Alt+F4 |
61h |
Ctrl+F4 |
4Dh |
→ [6] |
6Ch |
Alt+F5 |
62h |
Ctrl+F5 |
4Ch |
[5] |
6Dh |
Alt+F6 |
63h |
Ctrl+F6 |
73h |
Ctrl+← |
6Eh |
Alt+F7 |
64h |
Ctrl+F7 |
74h |
Ctrl+→ |
6Fh |
Alt+F8 |
65h |
Ctrl+F8 |
75h |
Ctrl+End |
70h |
Alt+F9 |
66h |
Ctrl+F9 |
77h |
Ctrl+Home |
71h |
Alt+F10 |
67h |
Ctrl+F10 |
1Ch |
Ctrl+PgUp |
8Bh |
Alt+F11 |
89h |
Ctrl+F11 |
5Fh |
Ctrl+PgDn |
8Ch |
Alt+F12 |
8Ah |
Ctrl+F12 |
||
78h |
Alt+1 |
7Ch |
Alt+5 |
80h |
Alt+9 |
79h |
Alt+2 |
7Dh |
Alt+6 |
81h |
Alt+0 |
7Ah |
Alt+3 |
7Eh |
Alt+7 |
||
7Bh |
Alt+4 |
7Fh |
Alt+8 |
Примечание – Символ в квадратных скобках соответствует клавишам на цифровой клавиатуре.
Таблица 1.3 - Управляющие символы ASCII [8]
DEC |
HEX |
Имя |
Назначение |
DEC |
HEX |
Имя |
Назначение |
0 |
00 |
NUL |
Нулевой ( пустой ) символ |
16 |
10 |
DLE |
Завершение сеанса связи |
1 |
01 |
SOH |
Начало заголовка |
17 |
11 |
DC1 |
Управление устройством 1 |
2 |
02 |
STX |
Начало текста |
18 |
12 |
DC2 |
Управление устройством 2 |
3 |
03 |
ETX |
Конец текста |
19 |
13 |
DC3 |
Управление устройством 3 |
4 |
04 |
EOT |
Конец передачи |
20 |
14 |
DC4 |
Управление устройством 4 |
5 |
05 |
ENQ |
Запрос подтверждения |
21 |
15 |
NAK |
Ошибка передачи |
6 |
06 |
ACK |
Подтверждение (квитирование ) |
22 |
16 |
SYN |
Холостой ход передатчика |
7 |
07 |
BEL |
Звонок |
23 |
17 |
ETB |
Конец передачи блока |
8 |
08 |
BS |
Шаг назад ( возврат на одну позицию) |
24 |
18 |
CAN |
Отмена |
9 |
09 |
HT |
Горизонтальная табуляция (TAB ) |
25 |
19 |
EM |
Конец носителя данных |
10 |
0A |
LF |
Перевод строки |
26 |
1A |
SUB |
Подстановка (замена символа) |
11 |
0B |
VT |
Вертикальная табуляция |
27 |
1B |
ESC |
Переход ( посылка сложной команды) |
12 |
0C |
FF |
Перевод страницы |
28 |
1C |
FS |
Разделитель файлов |
13 |
0D |
CR |
Возврат каретки (ENTER) |
29 |
1D |
GS |
Разделитель групп |
14 |
0E |
SO |
Переход на нижний регистр |
30 |
1E |
RS |
Разделитель записей |
15 |
0F |
SI |
Переход на верхний регистр |
31 |
1F |
US |
Разделитель полей |
127 |
7F |
DEL |
Удаление символа |
Таблица 1.4 - Символы ASCII
dec |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | |
hex |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F | |
0 |
0 |
nul |
☺ |
☻ |
♥ |
♦ |
♣ |
♠ |
● |
◘ |
○ |
◙ |
♂ |
♀ |
♪ |
♫ |
☼ |
16 |
1 |
► |
◄ |
↕ |
‼ |
¶ |
§ |
▬ |
↨ |
↑ |
↓ |
→ |
← |
∟ |
↔ |
▲ |
▼ |
32 |
2 |
пробел |
! |
" |
# |
$ |
% |
& |
' |
( |
) |
* |
+ |
, |
- |
. |
/ |
48 |
3 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
: |
; |
< |
= |
> |
? |
64 |
4 |
@ |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
80 |
5 |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
[ |
\ |
] |
^ |
_ |
96 |
6 |
` |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
112 |
7 |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
{ |
¦ |
} |
~ |
⌂ |
128 |
8 |
А |
Б |
В |
Г |
Д |
Е |
Ж |
З |
И |
Й |
К |
Л |
М |
Н |
О |
П |
144 |
9 |
Р |
С |
Т |
У |
Ф |
Х |
Ц |
Ч |
Ш |
Щ |
Ъ |
Ы |
Ь |
Э |
Ю |
Я |
160 |
A |
а |
б |
в |
г |
д |
е |
ж |
з |
и |
й |
к |
л |
м |
н |
о |
п |
176 |
B |
░ |
▒ |
▓ |
│ |
┤ |
╡ |
╢ |
╖ |
╕ |
╣ |
║ |
╗ |
╝ |
╜ |
╛ |
┐ |
192 |
C |
└ |
┴ |
┬ |
├ |
─ |
┼ |
╞ |
╟ |
╚ |
╔ |
╩ |
╦ |
╠ |
═ |
╬ |
╧ |
206 |
D |
╨ |
╤ |
╥ |
╙ |
╘ |
╒ |
╓ |
╫ |
╪ |
┘ |
┌ |
█ |
▄ |
▌ |
▐ |
▀ |
224 |
E |
р |
с |
т |
у |
ф |
х |
ц |
ч |
ш |
щ |
ъ |
ы |
ь |
э |
ю |
я |
240 |
F |
Ё |
ё |
Є |
є |
Ϊ |
ї |
Ў |
ў |
° |
• |
∙ |
√ |
№ |
¤ |
■ |
Примечания
1 В 16-ричной системе счисления номера строк (столбец hex) соответствуют первой цифре в коде символа, столбцов (строка hex) – второй. Например, код большой латинской буквы А – 41h.
2 Для получения кода в 10-тичной системе счисления следует к соответствующей величине из столбца dec прибавить число из строки dec. Таким образом, код большой латинской буквы А: 64+1=65.
Контроллер связан с процессором 8-битной шиной данных и двумя 8-битными портами: ввода и вывода (таблица 1.5).
Таблица 1.5 - Регистры контроллера клавиатуры [8]
Порт |
Режим работы |
Назначение |
60h |
Чтение / Запись |
Регистр данных / команд |
64h |
Чтение |
Регистр состояния Бит 7 – ошибка четности Бит 6 – тайм-аут приемника/общий тайм-аут Бит 5 – тайм-аут передатчика Бит 4 – состояние «замка» клавиатуры Бит 3 – признак записи команды / данных Бит 2 – признак типа последнего общесистемного сброса Бит 1 – признак наличия данных во входном буфере: 0 - входной буфер свободен (готовность к приему команды / данных) 1 - входной буфер полон Бит 0 – признак наличия данных в выходном буфере: 0 - выходной буфер свободен 1 - выходной буфер полон |
Схема программирования контроллера клавиатуры
а) Запрет прерывания
CLI
б) Ожидание готовности контроллера к приему команды / данных
xor CX, CX ; CX - счетчик количества повторений цикла
выход по счетчику более чем через 65 тысяч повторов
wait1: in AL, 64h ; чтение регистра состояния
test AL, 00000010b ; анализ бита №1 - входной буфер свободен?
loopnz wait1 ; если бит №1 не нуль (буфер не освободился ) и CX≠0,
; переход на метку wait1
jnz err ; анализ причины выхода из цикла:
; если бит №1 не нуль (буфер так и не освободился),
;переход на метку err
………
err: …… ; действия при ошибке
в) Отправка команды
mov AL, <команда>
out 60h, AL
г) Если в команде больше одного байта или нужно дополнительно передать параметры, то необходимо:
дождаться готовности контроллера к приему (повторить п. б), так как входной буфер может быть занят отправленной командой;
отправить следующий байт (аналогично п. в).
д) Разрешение прерываний
STI
Некоторые команды контроллера клавиатуры
Команда EDh. Управление светодиодами (индикаторами состояния) клавиатуры
Позволяет включать и отключать светодиоды CapsLock, NumLock и ScrollLock. Команда двухбайтная – следующий за кодом команды байт имеет формат:
Бит |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Содержимое |
0 |
0 |
0 |
0 |
0 |
CapsLock |
NumLock |
ScrollLock |
=1 - включить
=0 - выключить
компьютер периферийный программирование ассемблер
Команда EEh. Эхо-диагностика.
В ответ микропроцессор выдает код EEh. Используется при возникновении ошибок в работе клавиатуры.
Прочие команды подробно описаны в литературе [8, 11].
Два байта состояния клавиатуры записываются в область данных BIOS по адресам 0000h:0417h (0040h:0017h) и 0000h:0418h (0040h:0018h) [6]. В таблице 1.6 представлены форматы указанных байтов.
Таблица 1.6 - Форматы байтов состояния клавиатуры
Бит № |
Формат байта | |
0000h:0417h |
0000h:0418h | |
Если бит=1, нажата клавиша (включен режим): | ||
0 |
Shift правая |
Ctrl левая |
1 |
Shift левая |
Alt левая |
2 |
Ctrl любая |
Ctrl правая |
3 |
Alt любая |
Alt правая |
4 |
ScrollLock |
ScrollLock |
5 |
NumLock |
NumLock |
6 |
CapsLock |
CapsLock |
7 |
Insert |
SysReq |
ПРИМЕР Протестировать состояние индикатора NumLock.
Comment * Чтобы прочитать байт состояния, необходимо в команде указать его полный адрес 0000h:0417h, так как по умолчанию данные сегментируются по регистру DS, что по условию задачи неприемлемо. В связи с ограничениями, налагаемыми командой mov на типы операндов, пересылка нуля в сегментный регистр ES выполняется за несколько шагов*
xor AX, AX ; 0 à AX
mov ES, AX; ; AX à ES , т.е. 0 à ES
mov AL, ES:[417h] ; в AL – байт состояния
test AL, 100000b ; анализ бита № 5
jz net ; если бит = 0 (NumLock выключен), переход на метку net
; иначе (NumLock включен) – переход на следующую команду
………… ; действия, если NumLock включен
net:…………. ; действия, если NumLock выключен
Основное назначение прерывания BIOS INT 16h – работа с буфером и байтами состояния клавиатуры. Буфер клавиатуры – это кольцевой буфер, используемый для хранения кодов пятнадцати введенных символов. Ряд функций INT 16h представлен в таблице 1.7.
Таблица 1.7 – Функции BIOS - прерывание INT 16h
Вход |
Назначение |
Выход |
Примечание |
AH = 0h1) |
1. Ждать нажатия клавиши (если буфер клавиатуры пуст) 2. Прочитать код введенного |
AL - ASCII-код введен- ного символа AH - скан-код или AL = 0 AH - скан-код |
Введенный символ не отображается |
ПРИМЕР При нажатии клавиши СТРЕЛКА-ВЛЕВО (расширенный код 0:4Bh) перейти на метку strela, иначе - на метку nestrela. mov ah, 0 int 16h : вызов функции 0 прерывания 16h cmp al, 0 ; al=0? (это расширенный код?) jne nestrela ; если AL ¹ 0 à на nestrela ; если AL = 0 (код расширенный) – переход на следующую команду cmp ah, 4Bh ; второй байт кода = 4Bh? (это СТРЕЛКА-ВЛЕВО?) jne nestrela ; если AH ¹ 4Bh à на nestrela, ; иначе à на следующую команду strela: ……….….
nestrela: …………. | |||
AH = 1h2) |
Проверка наличия символа в буфере клавиатуры (символ не удаляется из буфера) |
Если символ есть: ZF = 0 AL и AH – как у функции 0h Если символа нет: ZF = 1 |
|
AH = 2h3) |
Получить состояние |
AL - байт состояния переключающих клавиш (совпадает с байтом 0000h:0417h) |
|
ПРИМЕР Протестировать состояние индикатора NumLock mov ah,2 int 16h ; в AL - байт состояния test al, 100000b ; анализ бита № 5 jz net ; если бит =0 (NumLock выключен), переход на метку net ; иначе (NumLock включен) – переход на следующую команду …………; действия, если NumLock включен net:………. ; действия, если NumLock выключен | |||
Примечания - Обрабатывает только комбинации, использующие клавиши 84-клавишной клавиатуры. Для 101/105-клавишных и 122-клавишных клавиатур применяются соответственно функции:
1) 10h, 20h
2) 11h, 21h
3) 12h, 22h
Подробнее о специальных функциях, обслуживающих расширенные клавиатуры, - в [8].
Клавиатурные функции MS DOS работают со стандартными устройствами ввода-вывода (таблица 1.8).
Таблица 1.8 – Некоторые функции прерывания INT 21h
Вход |
Назначение |
Выход |
Примечание | ||||||||||||||
Функции ввода | |||||||||||||||||
АН = 1h |
1. Ждать нажатия клавиши. 2. Прочитать код введенного символа |
AL - ASCII-код символа Если AL=0 (признак символа с расширенным кодом), вызвать вторично для получения скан-кода |
Функции отличаются по признаку «Эхо» и реакции на нажатие Ctrl-Break:
| ||||||||||||||
АН = 7h | |||||||||||||||||
АН = 8h | |||||||||||||||||
ПРИМЕР При нажатии клавиши СТРЕЛКА-ВЛЕВО (расширенный код 0:4Bh) перейти на метку strela, иначе на метку nestrela. mov ah, 1 int 21h : вызов функции 1 прерывания 21h cmp al, 0 ; al=0? (это расширенный код?) jne nestrela ; если AL ¹ 0 à на nestrela ; если AL = 0 (код расширенный) – переход на следующую команду Int 21h ; вторичный вызов, в AL второй байт cmp al, 4Bh ; второй байт кода = 4Bh? (это СТРЕЛКА-ВЛЕВО?) jne nestrela ; если AH ¹ 4Bh à на nestrela, ; иначе (это СТРЕЛКА-ВЛЕВО!!!)à на следующую команду strela: ………. ……….. nestrela: ………….. | |||||||||||||||||
АН =Аh DX – начальный адрес буфера памяти, куда будет записана строка |
Чтение строки в память |
Структура буфера памяти: 1-й байт – максимальная длина строки, включая ENTER, - указывает программист 2-й байт – фактическая длина (без ENTER) – заполняет система после ввода строки с 3-го байта – сама строка | |||||||||||||||
АН =Bh |
Чтение состояния клавиатуры |
AL = FFh – буфер пуст AL = 0 – буфер не пуст | |||||||||||||||
Функции вывода | |||||||||||||||||
АН =2h DL – код символа |
Вывод символа |
AL - код последнего записанного символа (исключение: если DL=9 - табуляция, то AL=20h) [6] |
Функции отличаются по реакции на нажатие Ctrl-Break:
| ||||||||||||||
АН =6h DL – код символа | |||||||||||||||||
АН =9h DX – начальный адрес строки (в конце строки - $) |
Вывод строки |
AL-код последнего символа - $ (AL=24h) [6]
|
|||||||||||||||
Примечание – Многие функции модифицируют содержимое регистра AL, что необходимо учитывать при использовании в программе прерывания INT 21h
Пример
Формулировка задачи.
Разработать программу, которая предлагает пользователю нажать клавишу либо сочетание клавиш, после чего анализирует сложившуюся ситуацию и выполняет следующие действия:
- если введен символ w, включается индикатор CapsLock, индикаторы NumLock и ScrollLock отключаются, после чего программа завершается;
- при вводе сочетания CTRL+F1 пользователю предлагается дополнительно ввести любой символ отдельно либо в сочетании с левой клавишей SHIFT, после чего выводится сообщение «Левая клавиша SHIFT была (не была) нажата» и программа завершает работу;
- если введен любой не указанный выше символ, программа выводит слово «КОНЕЦ» и завершает работу.
Постановка задачи
Программа должна состоять из блоков, выполняющих функции:
- вывод приглашения к нажатию любой клавиши;
- ввод символа с помощью прерывания INT 21h и его идентификация;
- выполнение действий в зависимости от того, какой символ введен:
если w - работа с индикаторами клавиатуры (блок 1);
если Ctrl+F1 - предлагается ввести любой символ отдельно либо в сочетании с левой клавишей SHIFT; после анализа ситуации выводится сообщение «Левая клавиша SHIFT была (не была) нажата» (блок 2);
если любой другой символ, выводится сообщение «Конец»;
- задержка до нажатия любой клавиши (используется прерывание INT 16h) перед выходом из программы для того, чтобы пользователь имел возможность прочитать сообщение, и завершение работы программы.
Конкретизация работы блоков
Блок 1 - реализация алгоритма программирования контроллера клавиатуры.
Блок 2:
- вывод приглашения к нажатию клавиши Shift отдельно либо в сочетании с любой другой;
- получение байта состояния клавиатуры с адресом 0000h:0417h (обращением к памяти);
- тестирование бита № 1, который отслеживает текущее состояние левой клавиши SHIFT, и вывод соответствующего сообщения.
Листинг программы
model small
.stack 100h
.data
Press db 10, 13, 'Нажмите любую клавишу $'
PressShift db 10, 13, 'Нажмите клавишу отдельно либо с левым Shift$'
ShiftDa db 10, 13, 'Левый Shift был нажат$'
ShiftNet db 10, 13, 'Левый Shift не был нажат$'
konec db 10, 13, 'Конец','$'

- Интерфейсы периферийных устройств
- Интерфейсы периферийных устройств
- Интерфейсы ЭВМ, систем и сетей
- Интерференция в тонких пленках
- Интерференция света
- Интерференция света
- Интерференция света
- Интерфейс SATA и PATA
- Интерфейс USB
- Интерфейс и объекты табличного процессора Excel
- Интерфейс операционной системы
- Интерфейс пользователя
- Интерфейс пользователя
- Интерфейсы и их реализация