Inline: lea si, Linbuf si = адрес буфера строки
; Ввод очередного символа и управление курсором
Gs: cli запрещаем прерывания
mov CurStat, 03 CurStat = 3
mov Ntick, 09 Ntick =9 (0,5 сек)
sti разрешаем прерывание
call TglCrsr рисуем изображение курсора
mov ah, 00 код запроса ввода символа
int 16h ожидание ввода символа
cli запрещаем прерывания
test CurStat, 02 курсор нарисован ?
mov CurStat, 00 CurStat = О
sti разрешаем прерывания
je Prevanl -> нет, курсор погашен
call TglCrsr гашение курсора ; Предварительный анализ введенного кода
В текст примера 5.28 вставлены строки комментария, поясняющего назначение основных групп команд. В каждой из этих групп, кроме подпрограммы Prevpos, выполняются действия, смысл которых описан выше, поэтому здесь мы уточним некоторые особенности реализации.
Прерывания от таймера надо запрещать на время работы с переменными Ntick и CurStat. Напомним, что команда cli запрещает, a sti разрешает маскируемые прерывания. В примере 5.28 они используются дважды при разрешении и запрещении изменения состояния рисунка курсора. Во втором случае между test Curstat, 02 и je Prevani расположены две команды, выполнение которых не изменяет состояние регистра флагов (признаков). Это просто трюк, упрощающий проверку состояния и очистку байта
CurStat.
Коды введенного с клавиатуры символа находятся в регистрах ah (scan) и al (ASCII). Если код ASCII существует и его значение больше, чем iFh, то изображение символа выводится на экран и продолжается ввод.
Если обнаружен код служебного символа, то производится его детальный анализ. В примере 5.28 обрабатываются коды только двух символов — <Enter> и <возврат на шаг>. В других случаях подпрограмма просто игнорирует введенный код и ждет ввода с клавиатуры очередного символа. Если вы захотите дополнить подпрограмму, то вместо команды jmp short GS, имеющей метку Cont_2, вставьте команды, выполняющие анализ и обработку нужных вам кодов.
При обнаружении кода символа <Enter> в буфер строки записывается пустой байт и происходит возврат из подпрограммы.
Символ <позврат на шаг> обрабатывается так. Устанавливается адрес предыдущего знакоместа, в него выводится символ <пробел>, последний введенный символ удаляется из буфера строки и повторно устанавливается адрес предыдущего знакоместа. Установку адреса предыдущего знакоместа выполняет подпрограмма Prevpos, которая понадобится, если вы добавите обработку клавиши <левая стрелка> для перемещения влево по строке.