Доступ к мышке через сборку x86

Я использую сборку x86 на эмуляторе DOS (dosbox). Я хочу использовать графическую мышь в режиме видео, но я не могу найти способ получить к ней доступ, чтобы найти ее положение и реагировать на щелчки.

Я нашел несколько примеров использования int 33h, но у них не было правильного объяснения кода.

Какое прерывание или порт я могу использовать для доступа к нему и где я могу найти документацию по всем его функциям?


person user1691388    schedule 13.04.2014    source источник
comment
Есть несколько документов о int 33h: stanislavs.org/helppc/int_33.html и computing.dcu.ie/~ray/teaching/CA296/ notes/ca296-mouse.pdf Какой видеорежим вы используете?   -  person osgx    schedule 13.04.2014
comment
Соответствующие функции прерывания должны быть описаны на ctyme.com/intr/int-33.htm.   -  person Michael    schedule 13.04.2014
comment
Вы должны знать, что сама MS-DOS не знает о прерывании 33h. Вам нужно было установить драйвер мыши в системах MS-DOS, чтобы иметь возможность использовать это прерывание. Имейте в виду, что ваш эмулятор DOS может не поддерживать это прерывание. Документацию см. по ссылке в комментарии Майкла.   -  person Martin Rosenau    schedule 13.04.2014
comment
Помимо приведенного выше списка прерываний Ральфа Брауна, полезную информацию может содержать энциклопедия программиста компьютерных игр.   -  person ninjalj    schedule 15.04.2014


Ответы (1)


Но без использования драйвера мыши: для мыши 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