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


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


; адрес верхнего левого угла окна (23-я позиция в третьей строке) START_POSITION equ (80*2+23)*2

.model tiny .code .186 ; для сдвигов и команд pusha/popa org 2Ch envseg dw ? ; сегментный адрес окружения DOS

org 100h ; начало СОМ-программы start: jmp initialize ; переход на инициализирующую часть hw_reset9: retf ; ISP: минимальный hw_reset

; Обработчик прерывания 09h (IRQ1) int09h_handler proc far jmp short actual_int09h_handler ; ISP: пропустить блок old_int09h dd ? ; ISP: старый обработчик dw 424Bh ; ISP: сигнатура db 00h ; ISP: вторичный обработчик jmp short hw_reset9 ; ISP: ближний jmp на hw_reset db 7 dup (0) ; ISP: зарезервировано actual_iht09h_handler: ; начало обработчика INT 09h

; Сначала вызовем предыдущий обработчик, чтобы дать BIOS возможность ; обработать прерывание и, если это было нажатие клавиши, поместить код ; в клавиатурный буфер, так как мы пока не умеем работать с портами клавиатуры ; и контроллера прерываний pushf call dword ptr cs:old_int09h

; По этому адресу обработчик INT 2Dh запишет код команды IRET ; для дезактивации программы disable_point label byte pusha ; это аппаратное прерывание - надо push ds ; сохранить все регистры push es cld ; флаг для команд строковой обработки push 0B800h pop es ; ES = сегментный адрес видеопамяти push 0040h pop ds ; DS = сегментный адрес области данных BIOS mov di,word ptr ds:001Ah ; адрес головы буфера клавиатуры cmp di,word ptr ds:001Ch ; если он равен адресу хвоста, je exit_09h_handler ; буфер пуст, и нам делать нечего ; (например, если прерывание пришло по ; отпусканию клавиши), mov ax,word ptr [di] ; иначе: считать символ из головы ; буфера cmp byte ptr cs:we_are_active,0 ; если программа уже jne already_active ; активирована - перейти ; к обработке стрелок и т.п. cmp ah,1Eh ; если прочитанная клавиша не А jne exit_09h_handler ; (скан-код 1Eh) - выйти, mov al,byte ptr ds:0017h ; иначе: считать байт ; состояния клавиатуры, test al,08h ; если не нажата любая Alt, jz exit_09h_handler ; выйти, mov word ptr ds:001Ch,di ; иначе: установить адреса ; головы и хвоста буфера одинаковыми, ; пометив его тем самым как пустой call save_screen ; сохранить область экрана, которую ; накроет всплывающее окно push cs pop ds ; DS = наш сегментный адрес call display_all ; вывести на экран окно программы mov byte ptr we_are_active,1 ; установить флаг jmp short exit_09h_handler ; и выйти из обработчика




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