;prog.asm ;делаем COM-файл ;tasm prog.asm ;tlink prog /t ;запускаем в командном интерпретаторе cmd.exe .model tiny ;модель для COM-программы (все в одном сегменте) .code ;сегмент кода .startup ;макро для настройки старта программы jmp init ;на инициализацию резидента old_09 dw 0, 0 ;здесь будет старый клавиатурный вектор 9 new_09: ;новая отработка вектора 9 push ax ;надо сохранять все используемые регистры (для начала только ax) in al, 60h ;прочитаем код из клавиатуры cmp al, 3bh ;F1 ? jne to_old_09 ;если не F1, то на старый вектор push bx push cx ;сохраним еще cx push dx push ds push es push ss push sp push bp push si push di mov ah, 5 ;функция записи в буфер клавиатуры mov cx, 'F' ;ch=0 - скан-код нам не нужен, cl=ASCII-код int 16h cmp al, 0 ;проверим на ошибку jne to_iret ;если ошибка, то больше в буфер не писать mov ah, 5 mov cx, '1' int 16h cmp al, 0 jne to_iret mov ah, 5 mov cx, '.' int 16h cmp al, 0 jne to_iret mov ah, 5 mov cx, 'B' int 16h mov ah, 5 ;функция записи в буфер клавиатуры mov cx, 'A' ;ch=0 - скан-код нам не нужен, cl=ASCII-код int 16h cmp al, 0 ;проверим на ошибку jne to_iret ;если ошибка, то больше в буфер не писать mov ah, 5 mov cx, 'T' int 16h cmp al, 0 jne to_iret mov ah, 5 ; ENTER mov cx, 0Dh int 16h to_iret: pop di pop si pop bp pop sp pop ss pop es pop ds pop dx pop cx ;восстановим cx pop bx to_old_09: pop ax ;восстановим ax jmp dword ptr cs:old_09 ;на старый вектор init: ;инициализация программы mov ax, 3509h ;прочитаем старый вектор int 21h mov old_09, bx ;сохраним в переменной смещение mov old_09+2, es ; и сегмент mov ax, 2509h ;установим новый вектор отработки прерывания 9 lea dx, new_09 ; адрес нового обработчика int 21h lea dx, init ;последний адрес программы, который оставляем в памяти int 27h ;оставляем резидент в памяти и завершаемся end |