В общем сегодня на основе старой платформы неудавшегося SD-контроллера провел ряд экспериментов. Припаял выкушенный из материнки PS/2 разъем:
Контроллер вместо бывшего PIC18F452 (уехавшего в часы на газоразрядных индикаторах) поставил PIC18F4620. Я его для эмулятора дисковода покупал, но не отважился, с тех пор так и лежит. Конечно контроллер - из пушки по воробьям, можно было бы каким-нибудь PIC16F877A обойтись, но что было под рукой 40-ко ногое. Прокинул дополнительно кабель от какой-то ноги до IRQ7, чтоб дергать его по мере накопления символов. Внутре контроллера идет преобразование AT - XT, имеется кольцевой буфер. Как только сканкод готов на отправку - дергается IRQ7, обработчик которого читает из порта 0x3b0 сканкод, записывает его в порт 60h и вызывает родной int 9. Вот и вся история.
Работает как и задумано:
Аппаратное сканирование родной клавиатуры прекрасно выключилось через Interrupt Mask Register контроллера прерываний 8259 вышеупомянутой конструкцией:
Код:
in al,21h
or al,64 ; установить шестой бит в единицу (IRQ6 = disable)
out 21h,al
Если его не выключать - работает и родная клавиатура и PS/2 совместно. Набросал быстренько свой дополнительный BIOS, который устанавливает новый обработчик на прерывание 0x0f (IRQ7). Все прерывание:
Код:
KB_INT PROC NEAR
PUSH AX
PUSH DX
mov dx,03b0h ; PIC18F data port
in al,dx
out 60h,al ; port 60h, keybd data write
int 9 ; Keyboard
MOV AL,20H ; контроллер прерываний
OUT 20H,AL
POP DX
POP AX
IRET
KB_INT ENDP
В контроллере осталось только сделать общение в сторону клавиатуры, чтоб светодиоды зажигать Num Lock, Scroll Lock, Caps Lock в зависимости от. И в дополнительном BIOS сделать переключение на русские символы. Но это мелочи. В целом - полет нормальный.