2014-04-13 4 views
1

DOS 에뮬레이터 (dosbox)에서 assembly-x86을 사용하고 있습니다. 비디오 모드에서 그래픽 마우스를 사용하고 싶지만 위치를 찾고 클릭에 반응하기 위해 비디오 마우스를 액세스 할 수있는 방법을 찾을 수 없습니다.어셈블리를 통해 마우스 액세스 x86

나는 int 33h를 사용하는 몇 가지 예제를 발견하지만 그들은 코드와 적절한 설명을하지 않았다. 중단 또는 포트 나는 그것을 액세스하는 데 사용할 수 있고, 어디 모든 기능의 문서를 찾을 수 있습니다 무엇

?

+0

가 INT의 33H에 대한 몇 가지 문서가 있습니다 http://stanislavs.org/helppc/int_33.html 및 http://www.computing.dcu.ie/~ray/teaching/CA296/notes/ca296-mouse.pdf 사용하는 비디오 모드는 무엇입니까? – osgx

+1

관련 인터럽트 기능은 http://www.ctyme.com/intr/int-33.htm에서 설명해야합니다. – Michael

+1

MS-DOS 자체는 인터럽트 33h에 대해 알지 못합니다. 인터럽트를 사용하려면 MS-DOS 시스템에 마우스 드라이버를 설치해야합니다. DOS 에뮬레이터가 인터럽트를 지원하지 않을 수도 있습니다. 문서는 Michael의 코멘트 링크를 참조하십시오. –

답변

1

마우스 드라이버를 사용하지 않고 : PS2 마우스 (메인 보드 BIOS에서 USB lagacy를 사용할 수있는 USB 마우스에 추가)를 사용하려면 BIOS 인터럽트 15h AX = 0C20? h를 사용하고 싶습니다. Cutemouse처럼 irq 처리기가 있지만 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