Assembler - язык неограниченных возможностей


Символьные устройства - часть 2


+01h: байт — не используется

+02h: байт — 00h (код команды)

+03h: байт — слово состояния драйвера (заполняется драйвером)

+05h: 8 байт — не используется

+0Dh: байт — число обслуживаемых устройств (заполняется блочным драйвером)

+0Eh: 4 байта

    на входе — конец доступной для драйвера памяти;

    на выходе — адрес первого байта из той части драйвера, которая не будет резидентной (чтобы выйти без инсталляции — здесь надо записать адрес первого байта)

+12h: 4 байта

    на входе — адрес строки в CONFIG.SYS, загрузившей драйвер;

    на выходе — адрес массива ВРВ (для блочных драйверов)

+16h: байт — номер первого диска

+17h: 2 байта — сообщение об ошибке (0000h, если ошибки не было) — заполняется драйвером

Процедура инициализации может пользоваться функциями DOS 01h – 0Ch, 25h, 30h и 35h.

; kbdext.asm ; драйвер символьного устройства, увеличивающий буфер клавиатуры до BUF_SIZE ; (256 по умолчанию) символов ; BUF_SIZE equ 256 ; новый размер буфера

.model tiny .186 ; для сдвигов и push 0040h .code org 0 ; драйвер начинается с CS:0000 start: ; заголовок драйвера dd -1 ; адрес следующего драйвера - ; FFFFh:FFFFh для последнего dw 8000h ; атрибуты: символьное устройство, ; ничего не поддерживает dw offset strategy ; адрес процедуры стратегии dw offset interrupt ; адрес процедуры прерывания db "$$KBDEXT" ; имя устройства (не должно совпадать ; с каким-нибудь именем файла) request dd ? ; здесь процедура стратегии сохраняет адрес ; буфера запроса buffer db BUF_SIZE*2 dup (?) ; а это - наш новый буфер ; клавиатуры размером BUF_SIZE символов ; (два байта на символ) ; процедура стратегии ; на входе ES:BX = адрес буфера запроса strategy рroc far mov cs:word ptr request,bx ; сохранить этот адрес для mov cs:word ptr request+2,es ; процедуры прерывания ret strategy endp

; процедура прерывания interrupt proc far push ds ; сохранить регистры push bx push ax lds bx,dword ptr cs:request ; DS:BX - адрес запроса mov ah,byte ptr [bx+2] ; прочитать номер команды, or ah,ah ; если команда 00h (инициализация), jnz exit call init ; обслужить ее, ; иначе: exit: mov ax,100h ; установить бит 8 (команда обслужена) mov word ptr [bx+3],ax ; в слове состояния драйвера pop ах ; и восстановить регистры pop bx pop ds ret interrupt endp




Начало  Назад  Вперед