Mouse driver ps2 (help) (solved)
Posted: Sun Feb 25, 2007 5:25 pm
...
The Place to Start for Operating System Developers
http://f.osdev.org/
Code: Select all
ORG 100h
Jmp InstallMouse ; Load the mouse
MainCode: ; Use the mouse loaded
Mov AX,12h
Int 10h
MainLoop: ; My Main Loop, show pixel with mouse coordinates
Call get_pos
Mov AH,0Ch
Mov CX,CX
Mov DX,DX
Mov AL,15
Int 10h
Xor AX,AX
Mov AH,11h
Int 16h
Jnz Exit
Jmp MainLoop
Exit: ; Exit code
Mov AX,3h
Int 10h
Mov AX,0x4C00
Int 21h
InstallMouse: ; Load mouse in DOS, create one int
mov bl,0adh
call keyboard_cmd
call keyboard_read ; Pac 1
call keyboard_read ; Pac 2
call keyboard_read ; Pac 3
mov bl,0aeh
call keyboard_cmd
mov al,20h
out 0a0h,al
out 20h,al
mov ax,0x2574
mov dx,mouse_code
int 21h
cli
mov bl,0a8h
call keyboard_cmd
mov bl,20h
call keyboard_cmd
call keyboard_read
or al,2
mov bl,60h
push ax
call keyboard_cmd
pop ax
call keyboard_write
mov bl,0d4h
call keyboard_cmd
mov al,0f4h
call keyboard_write
Jmp MainCode ; Return to MainCode (mouse loaded, then: use mouse ;) )
mouse_code: ; Mouse codes
push ax
push bx
push cx
push dx
push di
push si
push es
push ds
push cs
pop ds
mov bl,0adh
call keyboard_cmd
call keyboard_read ; for first byte
call keyboard_read
cbw
add word [pos_x],ax
mov ax,word [x_min]
cmp word [pos_x],ax
jg .goodhor1
mov word [pos_x],ax
.goodhor1:
mov ax,word [x_max]
cmp word [pos_x],ax
jle .goodhor2
mov word [pos_x],ax
.goodhor2:
call keyboard_read
neg al
cbw
add word [pos_y],ax
mov ax,[y_min]
cmp word [pos_y],ax
jg .goodver1
mov word [pos_y],ax
.goodver1:
mov ax,word [y_max]
cmp word [pos_y],ax
jle no_show
mov word [pos_y],ax
no_show:
mov bl,0aeh
call keyboard_cmd
mov al,20h
out 0a0h,al
out 20h,al
pop ds
pop es
pop si
pop di
pop dx
pop cx
pop bx
pop ax
iret
get_pos:
mov cx,word [pos_x]
mov dx,word [pos_y]
ret
;------------------------------------------------------------------------
pos_x dw 0
pos_y dw 0
x_max dw 639
x_min dw 0
y_max dw 479
y_min dw 0
keyboard_read:
push cx
push dx
xor cx,cx
key_read_loop:
in al,64h
test al,1
jnz key_read_ready
loop key_read_loop
mov ah,1
jmp key_read_exit
key_read_ready:
push cx
mov cx,32
key_read_delay:
loop key_read_delay
pop cx
in al,60h
xor ah,ah
key_read_exit:
pop dx
pop cx
ret
keyboard_write:
push cx
push dx
mov dl,al
xor cx,cx
kbd_wrt_loop1:
in al,64h
test al,20h
jz kbd_wrt_ok1
loop kbd_wrt_loop1
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok1:
in al,60h
xor cx,cx
kbd_wrt_loop:
in al,64h
test al,2
jz kbd_wrt_ok
loop kbd_wrt_loop
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok:
mov al,dl
out 60h,al
xor cx,cx
kbd_wrt_loop3:
in al,64h
test al,2
jz kbd_wrt_ok3
loop kbd_wrt_loop3
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok3:
mov ah,8
kbd_wrt_loop4:
xor cx,cx
kbd_wrt_loop5:
in al,64h
test al,1
jnz kbd_wrt_ok4
loop kbd_wrt_loop5
dec ah
jnz kbd_wrt_loop4
kbd_wrt_ok4:
xor ah,ah
kbd_wrt_exit:
pop dx
pop cx
ret
keyboard_cmd:
xor cx,cx
cmd_wait:
in al,64h
test al,2
jz cmd_send
loop cmd_wait
jmp cmd_error
cmd_send:
mov al,bl
out 64h,al
xor cx,cx
cmd_accept:
in al,64h
test al,2
jz cmd_ok
loop cmd_accept
cmd_error:
mov ah,1
jmp cmd_exit
cmd_ok:
xor ah,ah
cmd_exit:
ret
Code: Select all
ORG 100h
Jmp InstallMouse ; Load the mouse
MainCode: ; Use the mouse loaded
Mov AX,12h
Int 10h
MainLoop: ; My Main Loop, show pixel with mouse coordinates
Call mouse_code
Call get_pos
Mov AH,0Ch
Mov CX,CX
Mov DX,DX
Mov AL,15
Int 10h
Xor AX,AX
Mov AH,11h
Int 16h
Jnz Exit
Jmp MainLoop
Exit: ; Exit code
Mov AX,3h
Int 10h
Jmp $
InstallMouse: ; Load mouse in DOS, create one int
mov bl,0adh
call keyboard_cmd
call keyboard_read ; Pac 1
call keyboard_read ; Pac 2
call keyboard_read ; Pac 3
mov bl,0aeh
call keyboard_cmd
mov al,20h
out 0a0h,al
out 20h,al
; mov ax,0x2574
; mov dx,mouse_code
; int 21h
cli
mov bl,0a8h
call keyboard_cmd
mov bl,20h
call keyboard_cmd
call keyboard_read
or al,2
mov bl,60h
push ax
call keyboard_cmd
pop ax
call keyboard_write
mov bl,0d4h
call keyboard_cmd
mov al,0f4h
call keyboard_write
Jmp MainCode ; Return to MainCode (mouse loaded, then: use mouse ;) )
mouse_code: ; Mouse codes
push ax
push bx
push cx
push dx
push di
push si
push es
push ds
push cs
pop ds
mov bl,0adh
call keyboard_cmd
call keyboard_read ; for first byte
call keyboard_read
cbw
add word [pos_x],ax
mov ax,word [x_min]
cmp word [pos_x],ax
jg .goodhor1
mov word [pos_x],ax
.goodhor1:
mov ax,word [x_max]
cmp word [pos_x],ax
jle .goodhor2
mov word [pos_x],ax
.goodhor2:
call keyboard_read
neg al
cbw
add word [pos_y],ax
mov ax,[y_min]
cmp word [pos_y],ax
jg .goodver1
mov word [pos_y],ax
.goodver1:
mov ax,word [y_max]
cmp word [pos_y],ax
jle no_show
mov word [pos_y],ax
no_show:
mov bl,0aeh
call keyboard_cmd
mov al,20h
out 0a0h,al
out 20h,al
pop ds
pop es
pop si
pop di
pop dx
pop cx
pop bx
pop ax
; iret
ret
get_pos:
mov cx,word [pos_x]
mov dx,word [pos_y]
ret
;------------------------------------------------------------------------
pos_x dw 0
pos_y dw 0
x_max dw 639
x_min dw 0
y_max dw 479
y_min dw 0
keyboard_read:
push cx
push dx
xor cx,cx
key_read_loop:
in al,64h
test al,1
jnz key_read_ready
loop key_read_loop
mov ah,1
jmp key_read_exit
key_read_ready:
push cx
mov cx,32
key_read_delay:
loop key_read_delay
pop cx
in al,60h
xor ah,ah
key_read_exit:
pop dx
pop cx
ret
keyboard_write:
push cx
push dx
mov dl,al
xor cx,cx
kbd_wrt_loop1:
in al,64h
test al,20h
jz kbd_wrt_ok1
loop kbd_wrt_loop1
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok1:
in al,60h
xor cx,cx
kbd_wrt_loop:
in al,64h
test al,2
jz kbd_wrt_ok
loop kbd_wrt_loop
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok:
mov al,dl
out 60h,al
xor cx,cx
kbd_wrt_loop3:
in al,64h
test al,2
jz kbd_wrt_ok3
loop kbd_wrt_loop3
mov ah,1
jmp kbd_wrt_exit
kbd_wrt_ok3:
mov ah,8
kbd_wrt_loop4:
xor cx,cx
kbd_wrt_loop5:
in al,64h
test al,1
jnz kbd_wrt_ok4
loop kbd_wrt_loop5
dec ah
jnz kbd_wrt_loop4
kbd_wrt_ok4:
xor ah,ah
kbd_wrt_exit:
pop dx
pop cx
ret
keyboard_cmd:
xor cx,cx
cmd_wait:
in al,64h
test al,2
jz cmd_send
loop cmd_wait
jmp cmd_error
cmd_send:
mov al,bl
out 64h,al
xor cx,cx
cmd_accept:
in al,64h
test al,2
jz cmd_ok
loop cmd_accept
cmd_error:
mov ah,1
jmp cmd_exit
cmd_ok:
xor ah,ah
cmd_exit:
ret
Code: Select all
mov dx,dx
mov cx,cx
Code: Select all
Mov DX,DX
Mov CX,CX
Code: Select all
get_pos:
mov cx,word [pos_x]
mov dx,word [pos_y]
ret
Code: Select all
mov ax,0x2574
mov dx,mouse_code
int 21h