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


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


hw_reset2D: retf ; ISP: минимальный hw_reset

; обработчик прерывания INT 2Dh ; поддерживает функции AMIS 3.6 00h, 02h, 03h, 04h и 05h int2Dh_handler proc far jmp short actual_int2Dh_handler ; ISP: пропустить блок old_int2Dh dd ? ; ISP: старый обработчик dw 424Bh ; ISP: сигнатура db 00h ; ISP: программное прерывание jmp short hw_reset2D ; ISP: ближний jmp на hw_reset db 7 dup (0) ; ISP: зарезервировано actual_int2Dh_handler: ; начало собственно обработчика INT 2Dh db 80h,0FCh ; начало команды CMP АН, число mux_id db ; идентификатор программы je its_us ; если вызывают с чужим АН - это не нас jmp dword ptr cs:old_int2Dh its_us: cmp al,06 ; функции 06h и выше jae int2D_no ; не поддерживаются cbw ; AX = номер функции mov di,ax ; DI = номер функции shl di,1 ; умножить его на 2, так как jumptable - ; таблица слов jmp word ptr cs:jumptable[di] ; косвенный переход на обработчики ; функций jumptable dw offset int2D_00,offset int2D_no dw offset int2D_02,offset int2D_03 dw offset int2D_04,offset int2D_05

int2D_00: ; проверка наличия mov al,0FFh ; этот номер занят mov сх,0100h ; номер версии 1.0 push cs pop dx ; DX:DI - адрес AMIS-сигнатуры mov di,offset amis_sign iret int2D_no: ; неподдерживаемая функция mov al,00h ; функция не поддерживается iret int2D_02: ; выгрузка программы mov byte ptr cs:disable_point,0CFh ; записать код команды IRET ; по адресу disable_point ; в обработчик INT 09h mov al,04h ; программа дезактивирована, но сама ; выгрузиться не может mov bx,cs ; BX - сегментный адрес программы iret int2D_03: ; запрос на активизацию для "всплывающих" программ cmp byte ptr we_are_active,0 ; если окно уже на экране, je already_popup call save_screen ; сохранить область экрана, push cs pop ds call display_all ; вывести окно mov byte ptr we_are_active,1 ; и поднять флаг already_popup: mov al,03h ; код 03: программа активизирована iret int2D_04: ; получить список перехваченных прерываний mov dx,cs ; список в DX:BX mov bx,offset amis_hooklist iret int2D_05: ; получить список "горячих" клавиш mov al,0FFh ; функция поддерживается mov dx,cs ; список в DX:BX mov bx,offset amis_hotkeys iret int2Dh_handler endp




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