be3 wrote:Пока не смог найти это драйвер выше, поищу более детально (но скорее всего он платный + не оч. распространен и как следствие бесплатно не скачать).
Да это понятно - время DOS давненько ушло...
И все эти утилиты скорее всего надо искать по страницам типа "Старый DOS" и спрашивать на
тематических форумах по старым компам...
Я, к сожалению, сейчас по своей работе занят, поэтому не могу активно вам помочь.
Но если решите справиться с проблемой сами, я бы порекомендовал подсматривать в «Справочник
программиста персональных компьютеров типа IBM PC, XT и AT» автора Р. Джордейна - в нем хорошо
расписаны все эти вопросы под DOS.
Я скачал ваши материалы - если случится свободная минутка - тоже посмотрю, мне чисто интересно.
P.S. Посмотрел исходник сразу - там именно это и делают, что я и предполагал:
Lavr wrote:под DOS прерывание клавиатуры надо заменить прерыванием от COM-порта,
возможно, с некоторыми доработками
Вот фрагмент кода, где вектор прерывания подменяют:
Code: Select all
; Hook vectors
;
; IN: none.
; OUT: none.
;
EVEN
vecthook proc near
pushf
cli
push ax
push bx
push es
mov ax,0000h
mov es,ax
mov bx,ki_hook_vec * 4
mov ax,es:[bx] ; original vector offset value
mov ki_org_off,ax
mov ax,es:[bx+2] ; original vector segment value
mov ki_org_seg,ax
mov ax,offset key_hook
mov es:[bx],ax
mov ax,cs
mov es:[bx+2],ax
mov bx,tt_hook_vec * 4
mov ax,es:[bx] ; original vector offset value
mov tt_org_off,ax
mov ax,es:[bx+2] ; original vector segment value
mov tt_org_seg,ax
mov ax,offset tim_hook
mov es:[bx],ax
mov ax,cs
mov es:[bx+2],ax
mov bx,(SER_IRQ+8)*4 ; make INT vector offset.
mov ax,es:[bx]
mov com_org_off,ax
mov com_reh_off,ax
mov ax,es:[bx+2]
mov com_org_seg,ax
mov com_reh_seg,ax
;;; mov ax,offset com_hook
;;; mov es:[bx],ax
;;; mov ax,cs
;;; mov es:[bx+2],ax
pop es
pop bx
pop ax
popf
ret
vecthook endp
;
; Unhook vectors
;
; IN: none.
; OUT: AX resident program segment
;
EVEN
vectunhook proc near
push es
push ds
push bx
xor ax,ax
mov es,ax ; INT9 vector segment
mov bx,ki_hook_vec * 4 ; INT9 vector offset
mov ax,es:[bx+2] ; get resident program segment.
mov ds,ax
pushf
cli
mov bx,ki_hook_vec * 4
mov ax,ki_org_off ; use resident program segment.
mov es:[bx],ax
mov ax,ki_org_seg ; use resident program segment.
mov es:[bx+2],ax
mov bx,tt_hook_vec * 4
mov ax,tt_org_off ; use resident program segment.
mov es:[bx],ax
mov ax,tt_org_seg ; use resident program segment.
mov es:[bx+2],ax
mov bx,(SER_IRQ+8)*4 ; make INT vector offset.
mov ax,com_org_off ; use resident program segment.
mov es:[bx],ax
mov ax,com_org_seg ; use resident program segment.
mov es:[bx+2],ax
popf
mov ax,ds ; save resident program segment.
pop bx
pop ds
pop es
ret
vectunhook endp
INT 9 -
это прерывание от клавиатуры: Keyboard Interrupt (Hardware Handler).
Что в этой ситуации плохо - некоторые программы сами подменяют INT 9 и работают с клавиатурой
напрямую. Они либо не будут работать, либо драйвер их должен обманывать.
Я сталкивался с такой ситуацией - так поступает QBasic. Долго мучался как его обмануть...
Но в целом исходники понятные, хорошо прокомментированные и удобочитаемые. Я правда, не знаю,
насколько в них отражены и как помешают особенности работы Newton Keyboard.