Вызов программы из int 09h (intel, нечто вроде i80286)

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

MiReQ
Сообщения: 28
Зарегистрирован: 13 май 2009, 13:06
Откуда: Россия, Пермь
Контактная информация:

Проблема такова:
надо как-то вызвать из прерывания 09h (IRQ 1) процедуру (или запустить программу), использующую функцию 08h (чтение символа без эха) прерывания 21h (DOS).
Вроде, из-за этого у меня прога и виснет...

тело моего обработчика 09h:

Код: Выделить всё

S_CODE equ 1Fh

int09h proc
	push ax

	in al,60h
	cmp al,S_CODE
	je s

oldhandler_jmp:
	pop ax
	jmp cs :o ldhandler

s:
	push es
	push ax
	xor ax,ax
	mov es,ax
	pop ax
	mov ah,es:[417h]
	pop es
	test ah,04h
	jz oldhandler_jmp
	call test

	in al,61h
	mov ah,al
	or al,80h
	out 61h,al
	xchg ah,al
	out 61h,al
	mov al,20h
	out 20h,al
	pop ax
	iret
oldhandler dd 00h
int09h endp
перехватчик прерывания:

Код: Выделить всё

setint proc
	push ax
	push bx
	push dx
	push si
	push es

	mov si,offset oldhandler

	mov ax,3509h
	int 21h
	mov [si],bx
	mov [si+2],es

	mov ax,2509h
	mov dx,offset int09h
	int 21h

	pop es
	pop si
	pop dx
	pop bx
	pop ax
	ret
setint endp
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

а где, собственно, сама процедура test? Как всегда самое главное забываем выложить
It's a long way to the top if you wanna rock'n'roll
MiReQ
Сообщения: 28
Зарегистрирован: 13 май 2009, 13:06
Откуда: Россия, Пермь
Контактная информация:

Код: Выделить всё

test proc
	push ax
	push si
	push es

	mov ax,0B800h
	mov es,ax
	mov si,cs:shift
	mov ax,0FF2Dh
	mov es:[si],ax
	add si,02h
	mov cs:shift,si

	mov ah,08h
	int 21h

	mov ax,0B800h
	mov es,ax
	mov si,cs:shift
	mov ax,0FF2Dh
	mov es:[si],ax
	add si,02h
	mov cs:shift,si

	pop es
	pop si
	pop ax
	ret
shift dw 0000h
test endp
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

нет ничего интереснее читать символы с помощью прерывания перехватывая работу клавиатуры, в такой ситуации как у Вас буфер клавиатуры будет пуст, скорее всего.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
лучше сформулируйте задачу что нужно конкретно сделать
icq:3(один)7748666
mail:airyashov( а)inbox.ru
MiReQ
Сообщения: 28
Зарегистрирован: 13 май 2009, 13:06
Откуда: Россия, Пермь
Контактная информация:

airyashov писал(а):нет ничего интереснее читать символы с помощью прерывания перехватывая работу клавиатуры, в такой ситуации как у Вас буфер клавиатуры будет пуст, скорее всего.
почему? ведь если клавиша не моя, я возвращаю управление старому обработчику...

Код: Выделить всё

	in al,60h
	cmp al,S_CODE
	je s

oldhandler_jmp:
	pop ax
	jmp cs :o ldhandler
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а): mov ah,08h
int 21h
Нельзя читать данные с клавиатуры во время обработки прерывания нажатия клавиши. Почему? Потому что прерывание еще не завершено и пока мы не сделаем
&quot писал(а): mov al,20h
out 20h,al
оно и не придет и внутри процедуры чтения MS-DOS образуется бесконечный цикл. Так же учтите, что любой INT разрешает прерывания, а этого делать нельзя ни в коем случае при обработке самого прерывания. Вообщем что хотите делайте, но меняйте логику программы.
It's a long way to the top if you wanna rock'n'roll
MiReQ
Сообщения: 28
Зарегистрирован: 13 май 2009, 13:06
Откуда: Россия, Пермь
Контактная информация:

airyashov писал(а): лучше сформулируйте задачу что нужно конкретно сделать
Изначальная задача такая:
Написать резидентный словарик.
при нажатии Ctrl+S выскакивает окошко словаря.

В словаре вводится слово (сделал через int 08h), рисуется его перевод из файла.
Выход - Alt+X (сделал так же через int 08h)

Так вот. Написал сам словарик, только без резидента и без перехвата прерываний (т.е. запускаешь, и уже появляется само окошко).
Собственно, теперь пытаюсь приклеить к нему резидент и прерывание.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Тогда надо делать по другому.
1) В обработчике прерывания запомнить адрес возврата из стека (RETADDR)
2) Если нажато Ctrl+S то выставить флаг.
3) По нажатию Alt-X сбросить флаг
4) Передать управление процедуре-обработчику MS-DOS
5) Если выставлен флаг, то заменить на стеке адрес возврата на адрес нужной вам функции test

В конце функции тест выполнить переход по RETADDR. Функция TEST должна читать только один символ.
It's a long way to the top if you wanna rock'n'roll
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

Я нечто похожее писал, но всегда через флаги запуска/сброса, использую прерывания таймер+клавиатура. Принцип работы программы как хранитель экрана.
icq:3(один)7748666
mail:airyashov( а)inbox.ru
MiReQ
Сообщения: 28
Зарегистрирован: 13 май 2009, 13:06
Откуда: Россия, Пермь
Контактная информация:

somewhere писал(а):Тогда надо делать по другому.
1) В обработчике прерывания запомнить адрес возврата из стека (RETADDR)
2) Если нажато Ctrl+S то выставить флаг.
3) По нажатию Alt-X сбросить флаг
4) Передать управление процедуре-обработчику MS-DOS
5) Если выставлен флаг, то заменить на стеке адрес возврата на адрес нужной вам функции test

В конце функции тест выполнить переход по RETADDR. Функция TEST должна читать только один символ.
Спасибо большое! Работает :)

P.S. Сейчас доделаю, и выложу весь код, может кому-нибудь понадобится...
Ответить