Но без использования драйвера мыши: для мыши PS2 (и дополнительно для USB-мыши с USB-задержкой в биосе материнской платы) мне нравится использовать прерывание биоса 15h AX=0C20?h для использования обработчика irq, такого как Cutemouse можно, но без создания TSR с его помощью.
Но этот обработчик IRQ (в приведенном ниже примере) нуждается в небольшом изменении, поэтому мы должны добавить некоторую инструкцию для сохранения значений мыши в известном местоположении оперативной памяти, чтобы наша основная процедура могла получать движение мыши и щелчки мыши из этого место расположения.
Кроме того, наша основная процедура должна рисовать указатель мыши на самом фреймбуфере, поэтому мы должны вычислить адрес позиции в зависимости от того, какой видеорежим мы используем (с 4,8,15,16,24 или 32 бита на пиксель). длина строки сканирования и положение цветовых полей RGB или BGR).
Пример использования собственного обработчика мыши PS2 (без рисования указателя мыши):
; main routine
call CHECKPS2
jc NOMOUSE
call PS2ON
jc NOMOUSE
; -------------------
; place your code here
; -------------------
call PS2OFF
mov ax, 0C201h ; Reset PS2
int 15h
NOMOUSE:
; -------------------
; sub routines
; -------------------
checkPS2:
int 11h ; get equipment list
test al, 3
jz noPS2 ; jump if PS/2-Mouse not indicated
mov bh,3
mov ax, 0C205h
int 15h ; initialize mouse, bh=datasize
jc noPS2
mov bh,3
mov ax, 0C203h
int 15h ; set mouse resolution bh
jc noPS2
mov ax, cs
mov es, ax
mov bx, OFFSET PS2dummy
mov ax, 0C207h
int 15h ; mouse, es:bx=ptr to handler
jc noPS2
xor bx, bx
mov es, bx ; mouse, es:bx=ptr to handler
mov ax, 0C207h
int 15h
ret
noPS2:
stc
ret
PS2dummy:
retf
;---------------------------------------------------------
enablePS2:
call disablePS2
mov ax, cs
mov es, ax
mov bx, OFFSET IRQhandler
mov ax, 0C207h ; es:bx=ptr to handler
int 15h
mov bh,1 ; set mouse on
mov ax, 0C200h
int 15h
ret
;-------------------------------
disablePS2:
xor bx, bx ; set mouse off
mov ax, 0C200h
int 15h
xor bx, bx
mov es, bx
mov ax, 0C207h ; es:bx=ptr to handler
int 15h
ret
;---------------------------------------------------------------------------
IRQhandler:
assume ds:nothing,es:nothing
cld
push ds
push es
pusha
mov ax, cs
mov ds, ax
mov bp,sp
mov al,[bp+24+6] ; buttons
mov bl,al
shl al,3 ; CF=Y sign bit
sbb ch,ch ; signed extension 9->16 bit
cbw ; extend X sign bit
mov al,[bp+24+4] ; AX=X movement
mov cl,[bp+24+2] ; CX=Y movement
xchg bx,ax
neg cx ; reverse Y movement
popa
pop es
pop ds
retf
person
Dirk Wolfgang Glomp
schedule
15.04.2014