yellowair
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору rain87 спасиб, за ответ, прогу написал.... посмотри если не трудно что тут еще и как можно улучшить Код: ;air cseg segment para assume cs:cseg org 100h start: jmp initialize old9_hndlr label dword ; Старый int 9h handler old9_off dw ? old9_seg dw ? ax_ dw ? scancode db ? ;------------------------------------------------------------------------ ; Новый обработчик ;------------------------------------------------------------------------ new9_hndlr proc mov ax_,ax ; Сохраняем ax регистр. xor ax,ax ; Обнуляем ax регистр. in al,60h ; Получаем скэнкод. mov scancode,al ; Сохраняем скэнкод. mov ax,ax_ pushf ; Сохраняем флаги. call old9_hndlr ; Вызываем старое прерывание. xor ax,ax continue: mov al,scancode cmp al,58h ja nosound ; Гасит звук при отпускании кнопки. cmp al, 53 ; диапазон верх ja exit_9 ; Если > cmp al, 15 ; диапазон низ jb exit_9 ; Если < mov bh,15 jmp sound sound: mov al, 0B6h ; Инициализация 2го канала out 43h, al ; микросхемы таймера mov bl, scancode ; Подготовка частоты sub bl, bh mov ax, 200 mul bl add ax, 348 out 42h, al ; Младший байт в таймер mov al, ah out 42h, al ; Старший байт в таймер in al, 61h ; Читаем данные из 61h порта or al, 3 ; Установка первых двух битов в 1 out 61h, al ; Включить динамик! jmp exit_9 nosound: ; Выключить динамик. in al,61h and al,252 out 61h,al exit_9: mov ax,ax_ ; восстановление ax. iret new9_hndlr endp last_byte db "$" ; метка конца резидентного кода ;******************************************************************* initialize proc near assume ds:cseg ;переменные в этом сегменте mov ax,cs mov ds,ax mov ax,3509h ;получаем вектор 9го прерывания int 21h mov old9_off,bx ; сохраняем старое смещение mov old9_seg,es ; сохраняем старый сегмент mov ax,2509h mov dx,offset new9_hndlr int 21h ;Вычисляем необходимую память mov dx,(offset last_byte - offset cseg + 15) mov cl,4 shr dx,cl ;конвертируем в параграфы mov ax,3100h ;TSR int 21h initialize endp cseg ends end start ;конец! | |