Назад | Начало урока | Вперед
Содержание

Глава 2

Далее в процедуре main идет предложение нажать системную клавишу,
и идет проверка - какая клавиша нажата?

;цикл обработки сообщений с клавиатуры **********************
;перехват скан-кода нажатой клавиши и его анализ ************

non_sys_key: call press_key

;нажата не системная клавиша
cmp ascii_code,00
jne non_sys_key

;обработка системных клавиш
cmp scan_code,51h
je PgDn

cmp scan_code,49h
je PgUp

cmp scan_code,44h
je exit_dos

cmp scan_code,3Ch
je save_cmos

cmp scan_code,3Dh
je load_cmos

cmp scan_code,3Eh
je edit_cmos

jmp non_sys_key

;************************************************************
;действия выполняемые в ответ на нажатую клавишу


PgDn: cmp svalue,40h
je non_sys_key
inc page_index
mov si,page_index
call scr_page
jmp non_sys_key

PgUp: cmp svalue,0Dh

je non_sys_key
dec page_index
mov si,page_index
mov ah,mas_svalue[si]
mov svalue,ah
call scr_page
jmp non_sys_key

save_cmos: mov ax,offset file_name
call save_file

jmp non_sys_key
;**************************************************************

load_cmos: ;загрузка CMOS из файла ***************************************


call load_file
jmp non_sys_key

edit_cmos: ;редактирование CMOS ******************************************


Проанализируем теперь этот фрагмент главной процедуры main программы.

Программа ждет нажатия клавиши:

non_sys_key: call press_key

После нажатия, анализирует нажата ли одна из шести запланированных системных клавиш.
А запланировано отреагировать на нажатие клавиш, скан-код которых 51h,49h,44h,3ch,3Dh,3Eh.
Вот например реакция на нажатие клавиши PgUp(51h):


PgDn: cmp svalue,40h
je non_sys_key
inc page_index
mov si,page_index
call scr_page
jmp non_sys_key

Сначала идет сравнение svalue со значением 40h. Если svalue равна этому значению, значит
надо сделать прыжок на non_sys_key. Так как уже все данные выведены на экран, это была последняя 4-я страница. Последнее значение массива mas_evalue равно 3Fh:

mas_evalue DB 0Ch, 10h, 20h, 3Fh

Если значение svalue не равно 40h, то инекремент page_index, присвоение регистру si
этого же значения. И вызов процедуры scr_page, которая выведет на экран новую страницу
(одну из четырех). Мы помним начало процедуры scr_page, в котором присваиваются значения начальному и конечному значению адреса для чтения и инициируется (настраивается) указатель bp на адрес сообщения:

mov si,page_index
mov al,mas_evalue[si]
mov evalue,al ;конечный адрес в памяти

mov al,mas_svalue[si]
mov svalue,al ;начальный адрес в памяти

mov bx,si
add bx,bx
mov bp,mes_adr[bx] ;адрес сообщения (пояснения)
mov cx,mes_dl[bx] ;длина сообщения (пояснения)

В результате того, что page_index была инкременирована (допустим она получила значение 1), соответственно переменные используемые в процедуре scr_page получат следующие значения:

evalue получит значение 10h
svalue получит значение 0Dh

bp будет указывать на адрес mes0D
cx получит значение dl0D = $-mes0D

Короче говоря будет выведена очередная (в данном конкретном случае вторая) страница.

Те же рассуждения верны и в отношении нажатия клавиши PgUp:

PgUp: cmp svalue,0Dh

je non_sys_key
dec page_index
mov si,page_index
mov ah,mas_svalue[si]
mov svalue,ah
call scr_page
jmp non_sys_key

Прыжок на остальные метки будет рассмотрен нами далее.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz