Mauszeiger malen



  • Hi,
    weiß jemand, wie ich einen Mauszeiger male? Meinen eigenen? Hat da jemand beispiel ciode? Arbeite in Vesa bei 16-Bit Farbtiefe und 1280x124 Bildpunkten. Danke! 😃



  • Hi.

    Wo ist dein Problem? Ich nehme mal an, du weisst inzwischen, wie das mit dem
    Eventhandler des DOS-Maustreibers funktioniert.
    Dann machst du dir halt ein 16Bit-Bitmap deines Mauszeigers, definierst eine
    Farbe als durchsichtig und pinselst dieses Bild immer an die aktuelle x/y-
    Position der Maus. Je nach Struktur deines Programms, musst du dann
    natuerlich vorher den Bildschirmteil, den du mit dem Mauszeiger uebermalst,
    in einen Puffer speichern, um beim Weiterbewegen der Maus die letzte Position
    des Cursors zu loeschen (so machen es die DOS-Treiber im VGA-Modus), oder
    du koenntest den ganzen Bildschirm neu aufbauen, bevor du den Mauszeiger
    zeichnen tust.

    Beispielcode habe ich nicht, und vor den naechsten Ferien werde ich ganz bestimmt auch keinen mehr fabrizieren, oder raussuchen -> Google ist dein Freund. 🕶

    BTW:
    Magst du den "[Morpheus]" nicht, oder weshalb musstest du fuer diese
    Frage einen neuen Thread starten? 😃
    Schau dir doch mal seinen Thread an: Mauszeiger im SVGA Modus (und >640x480)
    Augenscheinlich hat der IMHO das gleiche Thema. 😉



  • hast recht, was das thema angeht, allerdings ist da ein kleiner unterschied, ich nutze nicht den dos maustreiber, da ich ein eigenes OS code. das unterscheided die themen ein wenig.



  • Tja, das haette man zB. erwaehnen koennen. 😉
    Ich gehe aber davon aus, dass du dann schon einen Treiber fuer die Mouse-Hardware hast - dann faellt deine Frage doch wieder so ziemlich in das selbe Themengebiet. :p



  • Da es dein OS wird dir hier keiner helfen könne. Wir wissen nicht wie du dein framebuffer device aufgebaut hast.



  • Hi,
    hab mir den Treiber Code beio Programmers Haeven geklaut. Hier der Code, wenn er euch weiterbringt:

    [ORG 0x0100] 		;* YEP its a .COM file!
    
    JMP MAINP
    
    ;***********************************************************************
    ;Activate mouse port (PS/2)
    ;***********************************************************************
    PS2SET:
      mov  al, 0xa8		; enable mouse port
      out  0x64, al		; write to keyboardcontroller
      call CHKPRT		; check if command is progressed (demand!)
    ret
    
    ;***********************************************************************
    ;Check if command is accepted. (not got stuck in inputbuffer)
    ;***********************************************************************
    CHKPRT:
      xor  cx, cx		
     .again:
      in   al, 0x64		; read from keyboardcontroller
      test al, 2		; Check if input buffer is empty
      jz  .go
      jmp .again		; (demand!) This may couse hanging, use only when sure.
     .go
    ret
    
    ;***********************************************************************
    ;Write to mouse
    ;***********************************************************************
    WMOUS:
      mov  al, 0xd4		; write to mouse device instead of to keyboard
      out  0x64, al		; write to keyboardcontroller
      call CHKPRT		; check if command is progressed (demand!)
    ret
    
    ;***********************************************************************
    ;mouse output buffer full
    ;***********************************************************************
    MBUFFUL:
      xor  cx, cx
     .mn:
      in   al, 0x64		; read from keyboardcontroller
      test al, 0x20		; check if mouse output buffer is full
      jz  .mnn
      loop .mn
     .mnn:
    ret
    
    ;***********************************************************************
    ;Write activate Mouse HardWare
    ;***********************************************************************
    ACTMOUS:
      call WMOUS
      mov  al, 0xf4 	; Command to activate mouse itselve (Stream mode)
      out  0x60, al		; write ps/2 controller output port (activate mouse)
      call CHKPRT		; check if command is progressed (demand!)
      call CHKMOUS		; check if a byte is available
    ret
    
    ;***********************************************************************
    ;Check if mouse has info for us
    ;***********************************************************************
    CHKMOUS:
      mov  bl, 0
      xor  cx, cx
     .vrd:
      in   al, 0x64		; read from keyboardcontroller
      test al, 1		; check if controller buffer (60h) has data
      jnz .yy
      loop .vrd
      mov  bl, 1
     .yy:
    ret
    
    ;***********************************************************************
    ;Disable Keyboard
    ;***********************************************************************
    DKEYB:
      mov  al, 0xad		; Disable Keyboard
      out  0x64, al		; write to keyboardcontroller
      call CHKPRT		; check if command is progressed (demand!)
    ret
    
    ;***********************************************************************
    ;Enable Keyboard
    ;***********************************************************************
    EKEYB:
      mov  al, 0xae		; Enable Keyboard
      out  0x64, al		; write to keyboardcontroller
      call CHKPRT		; check if command is progressed (demand!)
    ret
    
    ;***********************************************************************
    ;Get Mouse Byte
    ;***********************************************************************
    GETB:
     .cagain
      call CHKMOUS		; check if a byte is available
      or   bl, bl
      jnz .cagain
      call DKEYB		; disable keyboard to read mouse byte
      xor  ax, ax
      in   al, 0x60		; read ps/2 controller output port (mousebyte)
      mov  dl, al
      call EKEYB		; enable keyboard
      mov  al, dl
    ret
    
    ;***********************************************************************
    ;Get 1ST Mouse Byte
    ;***********************************************************************
    GETFIRST:
      call GETB 		;Get byte1 of packet
      xor  ah, ah
      mov  bl, al
      and  bl, 1
      mov  BYTE [LBUTTON], bl
      mov  bl, al
      and  bl, 2
      shr  bl, 1
      mov  BYTE [RBUTTON], bl
      mov  bl, al
      and  bl, 4
      shr  bl, 2
      mov  BYTE [MBUTTON], bl
      mov  bl, al
      and  bl, 16
      shr  bl, 4
      mov  BYTE [XCOORDN], bl
      mov  bl, al
      and  bl, 32
      shr  bl, 5
      mov  BYTE [YCOORDN], bl
      mov  bl, al
      and  bl, 64
      shr  bl, 6
      mov  BYTE [XFLOW], bl
      mov  bl, al
      and  bl, 128
      shr  bl, 7
      mov  BYTE [YFLOW], bl
    ret
    
    ;***********************************************************************
    ;Get 2ND Mouse Byte
    ;***********************************************************************
    GETSECOND:
      call GETB 		;Get byte2 of packet
      xor  ah, ah
      mov  BYTE [XCOORD], al
    ret
    
    ;***********************************************************************
    ;Get 3RD Mouse Byte
    ;***********************************************************************
    GETTHIRD:
      call GETB 		;Get byte3 of packet
      xor  ah, ah
      mov  BYTE [YCOORD], al
    ret
    
    ;-----------------------------------------------------------------------
    ;***********************************************************************
    ;* MAIN PROGRAM
    ;***********************************************************************
    ;-----------------------------------------------------------------------
    
    MAINP:
      call PS2SET
      call ACTMOUS
      call GETB 	;Get the responce byte of the mouse (like: Hey i am active)  If the bytes are mixed up, remove this line or add another of this line.
    
    .main
      call GETFIRST
      call GETSECOND
      call GETTHIRD
    
    ;*NOW WE HAVE XCOORD & YCOORD* + the button status of L-butten and R-button and M-button allsow overflow + sign bits
    
    ;!!!
    ;! The Sign bit of X tells if the XCOORD is Negative or positive. (if 1 this means -256)
    ;! The XCOORD is allways positive
    ;!!!
    
    ;???
    ;? Like if:    X-Signbit = 1		Signbit
    ;? 					|
    ;?             XCOORD = 11111110 ---> -256 + 254 = -2  (the mouse cursor goes left)
    ;?                      \      /
    ;?                       \    /
    ;?                        \Positive
    ;???
    
    ;?? FOR MORE INFORMATION ON THE PS/2 PROTOCOL SEE BELOW!!!!
    
    ;!!!!!!!!!!!!!
    ;the rest of the source... (like move cursor) (i leave this up to you m8!)
    ;!!!!!!!!!!!!!
    
    ;*************************************************************
    ;Allright, Allright i'll give an example!  |EXAMPLE CODE|
    ;*************************************************************
    ;=============================
    ;**Mark a position on scr**
    ;=============================
     mov BYTE [row], 15
     mov BYTE [col], 0
    
    ;=============================
    ;**go to start position**
    ;=============================
     call GOTOXY
    
    ;=============================
    ;**Lets display the X coord**
    ;=============================
     mov  si, strcdx	; display the text for Xcoord
     call disp
     mov  al, BYTE [XCOORDN]
     or   al, al
     jz  .negative
     mov  si, strneg	; if the sign bit is 1 then display - sign
     call disp
     jmp .positive
    .negative
     mov  si, strsp		; else display a space
     call disp
    .positive
     xor  ah, ah
     mov  al, BYTE [XCOORD]
     call DISPDEC
     mov  si, stretr	; goto nextline on scr
     call disp
    
    ;=============================
    ;**Lets display the Y coord**
    ;=============================
     mov  si, strcdy	; display the text for Ycoord
     call disp
     mov  al, BYTE [YCOORDN]
     or   al, al
     jz  .negativex
     mov  si, strneg	; if the sign bit is 1 then display - sign
     call disp
     jmp .positivex
    .negativex
     mov  si, strsp		; else display a space
     call disp
    .positivex
     xor  ah, ah
     mov  al, BYTE [YCOORD]
     call DISPDEC
     mov  si, stretr	; goto nextline on scr
     call disp
    
    ;=============================
    ;**Lets display the L button**
    ;=============================
     mov  si, strlbt	; display the text for Lbutton
     call disp
     mov  al, BYTE [LBUTTON]
     xor  ah, ah
     call DISPDEC
     mov  si, stretr	; goto nextline on scr
     call disp
    
    ;=============================
    ;**Lets display the R button**
    ;=============================
     mov  si, strrbt	; display the text for Rbutton
     call disp
     mov  al, BYTE [RBUTTON]
     xor  ah, ah
     call DISPDEC
     mov  si, stretr	; goto nextline on scr
     call disp
    
    ;=============================
    ;**Lets display the M button**
    ;=============================
     mov  si, strmbt	; display the text for Mbutton
     call disp
     mov  al, BYTE [MBUTTON]
     xor  ah, ah
     call DISPDEC
     mov  si, stretr	; goto nextline on scr
     call disp
    
    ;=============================
    ;**stop program on keypress**	|Note: sometimes it takes a while for the program stops, or keyboard stalls|
    ;=============================  |due to more time is spend looking at the PS/2 mouse port (keyb disabled)  |
        xor  ax, ax
        mov  ah, 0x11
        int  0x16
        jnz quitprog
    ;*************************************************************
    
    jmp .main
    
    quitprog:
     MOV     AH, 0x4C  	;Return to OS
     INT     0x21		
    ;-----------------------------------------------------------------------
    ;***********************************************************************
    ;* END OF MAIN PROGRAM
    ;***********************************************************************
    ;-----------------------------------------------------------------------
    
    ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ;X Dont Worry about this displaypart, its yust ripped of my os.
    ;X (I know it could be done nicer but this works :P)
    ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ;XXX
    ;************************************************
    ;* Displays AX in a decimal way 
    ;************************************************
    DISPDEC:
        mov  BYTE [zerow], 0x00
        mov  WORD [varbuff], ax
        xor  ax, ax
        xor  cx, cx
        xor  dx, dx
        mov  bx, 10000
        mov  WORD [deel], bx
       .mainl    
        mov  bx, WORD [deel]
        mov  ax, WORD [varbuff]
        xor  dx, dx
        xor  cx, cx
        div  bx
        mov  WORD [varbuff], dx
        jmp .ydisp
    
       .vdisp
        cmp  BYTE [zerow], 0x00
        je .nodisp
    
       .ydisp
        mov  ah, 0x0E                            ; BIOS teletype
        add  al, 48                              ; lets make it a 0123456789 :D
        mov  bx, 1 
        int  0x10                                ; invoke BIOS
        mov  BYTE [zerow], 0x01
       jmp .yydis
    
       .nodisp
    
       .yydis
        xor  dx, dx
        xor  cx, cx
        xor  bx, bx
        mov  ax, WORD [deel]
        cmp  ax, 1
        je .bver
        cmp  ax, 0
        je .bver
        mov  bx, 10
        div  bx
        mov  WORD [deel], ax
       jmp .mainl
    
       .bver
       ret
    ;***************END of PROCEDURE*********************************
    ;****************************************************************
    ;* PROCEDURE disp      
    ;* display a string at ds:si via BIOS
    ;****************************************************************
    disp:
     .HEAD
        lodsb                                    ; load next character
        or   al, al                              ; test for NUL character
        jz   .DONE                               ; if NUL char found then goto done
        mov  ah, 0x0E                            ; BIOS teletype
        mov  bx, 1 				     ; make it a nice fluffy blue (mostly it will be grey but ok..)
        int  0x10                                ; invoke BIOS
        jmp  .HEAD
    
     .DONE: 
       ret
    ;*******************End Procedure ***********************
    ;*****************************
    ;*GOTOXY  go back to startpos
    ;*****************************
    GOTOXY:
        mov ah, 2
        mov bh, 0                  ;0:graphic mode 0-3: in modes 2&3 0-7: in modes 0&1
        mov dl, BYTE [col]
        mov dh, BYTE [row]
        int 0x10
    ret
    ;*******END********
    ;
    ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ;XXX
    ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    
    ;***********************************************************************
    ;variables
    ;***********************************************************************
    LBUTTON db 0x00	;	Left   button status 1=PRESSED 0=RELEASED
    RBUTTON db 0x00	;	Right  button status 1=PRESSED 0=RELEASED
    MBUTTON db 0x00	;	Middle button status 1=PRESSED 0=RELEASED
    XCOORD  db 0x00	;	the moved distance  (horizontal)
    YCOORD  db 0x00	;	the moved distance  (vertical)
    XCOORDN db 0x00 ;       Sign bit (positive/negative) of X Coord
    YCOORDN db 0x00 ;       Sign bit (positive/negative) of Y Coord
    XFLOW   db 0x00 ;       Overflow bit (Movement too fast) of X Coord
    YFLOW   db 0x00 ;       Overflow bit (Movement too fast) of Y Coord
    
    ;************************************
    ;* Some var's of my display function
    ;************************************
    deel    dw 0x0000
    varbuff dw 0x0000
    zerow   db 0x00
    strlbt  db "Left button:   ", 0x00
    strrbt  db "Right button:  ", 0x00
    strmbt  db "Middle button: ", 0x00
    strcdx  db "Mouse moved (X): ", 0x00
    strcdy  db "Mouse moved (Y): ", 0x00
    stretr  db 0x0D, 0x0A, 0x00
    strneg  db "-", 0x00
    strsp   db " ", 0x00
    row     db 0x00
    col     db 0x00
    

    so...vielleicht hilft euch das weiter...oder mir.



  • Ok, also so wie der Code jetzt ist, kannst du den natuerlich nicht verwenden. Mal abgesehen davon, dass der nur PS/2-Maeuse unterstuetzt, taugt der wirklich nur als Anschauungsmaterial. Aber das war dir hoffentlich sowieso schon klar. 😃
    Da muesste zB. noch ein IRQ-Handler installiert werden etc.

    Aber das war deinem ersten Post zufolge IMHO eh nicht das Thema, sondern das Zeichnen des Mousecursors in einem VESA-GrafikModus im RM - und wie du hier BitMaps/Pixelreihen auf den Bildschirm bringst, solltest du irgendwie inzwischen begriffen haben... 😕
    Ansonsten bezieht sich "[Morpheus]"s Thread momentan genau auf dieses Thema.

    Whatever: Wenn du nur auf der Suche nach fertigem Code fuer ein MouseTreiberSystem mit verschiedenen Grafikcursors fuer hochaufloesende Grafikmodi etc. bist, muss ich dich leider enttaeuschen: Wirst du hier hoechstwahrscheinlich nicht finden... ...Solange du nicht bereit bist, was dafuer springen zu lassen. 🤡


Log in to reply