Assembler - язык неограниченных возможностей


Мультиплексорное прерывание - часть 7


; Сюда передается управление, если программа уже активирована. ; При этом ES = B800h, DS = 0040h, DI = адрес головы буфера клавиатуры, ; АХ = символ из головы буфера already_active: mov word ptr ds:001Ch,di ; установить адреса ; головы и хвоста буфера одинаковыми, ; пометив его тем самым как пустой push cs pop ds ; DS = наш сегментный адрес mov al,ah ; команды cmp al,? короче команд cmp ah,? mov bh,byte ptr current_char ; номер выделенного в ; данный момент ASCII-символа, cmp al,48h ; если нажата стрелка вверх (скан-код 48h), jne not_up sub bh,16 ; уменьшить номер символа на 16, not_up: cmp al,50h ; если нажата стрелка вниз (скан-код 50h), jne not_down add bh,16 ; увеличить номер символа на 16, not_down: cmp al,4Bh ; если нажата стрелка влево, jne not_left dec bh ; уменьшить номер символа на 1, not_left: cmp al,4Dh ; если нажата стрелка вправо, jne not_right inc bh ; увеличить номер символа на 1, not_right: cmp al,1Ch ; если нажата Enter (скан-код 1Ch), je enter_pressed ; перейти к его обработчику dec al ; Если не нажата клавиша Esc (скан-код 1), jnz exit_with_display ; выйти из обработчика, оставив ; окно нашей программы на экране, exit_after_enter: ; иначе: call restore_screen ; убрать наше окно с экрана, mov byte ptr we_are_active,0 ; обнулить флаг активности, jmp short exit_09h_handler ; выйти из обработчика

exit_with_display: ; выход с сохранением окна (после нажатия стрелок) mov byte ptr current_char,bh ; записать новое значение ; текущего символа call display_all ; перерисовать окно

exit_09h_handler: ; выход из обработчика INT 09h pop es pop ds ; восстановить регистры рора iret ; и вернуться в прерванную программу we_are_active db 0 ; флаг активности: равен 1, если ; программа активна current_char db 37h ; номер ASCII-символа, выделенного ; в данный момент

; сюда передается управление, если в активном состоянии была нажата Enter enter_pressed: mov ah,05h ; Функция 05h mov ch,0 ; CH = 0 mov cl,byte ptr current_char ; CL = ASCII-код int 16h ; поместить символ в буфер клавиатуры jmp short exit_after_enter ; выйти из обработчика, стерев окно




Начало  Назад  Вперед