home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   alt.os.development      Operating system development chatter      4,255 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 3,947 of 4,255   
   wolfgang kern to Robert Pengelly   
   Re: Does a PS/2 mouse get detected if pl   
   17 Nov 23 23:13:16   
   
   From: nowhere@never.at   
      
   On 17/11/2023 18:06, Robert Pengelly wrote:   
   > On Friday, 17 November 2023 at 15:56:54 UTC, wolfgang kern wrote:   
   >> On 17/11/2023 16:28, Robert Pengelly wrote:   
   >>>>> ...   
   >>>>> "I store the X/Y limits to be used as bottom/right mouse limits"   
   >>>>   
   >>>>> Yeah that is the plan eventually, I'm just testing things at the moment.   
   Am I right by checking bit 4? If I am then how do I know that it's not byte 2   
   or 3 that has bit 4 set?   
   >>>> on PS/2 you check bit3 with TEST AL,8   
   >>>> but b3 would only show up set in byte2&3 when a motion is reported,   
   >>>> so there is a good chance to see only 1st byte have b3 set.   
   >>>>   
   >>>> But it is a crap design anyway, if you move your mouse fast it may jump   
   >>>> because of false indication of the sync bit.   
   >>> That's what I'm doing. Is there not anything I can do to stop false   
   detections?   
   >> I once checked and the only halfway working solution was to have all   
   >> IRQ-routines (especially IRQ_0 PIT) as short and fast as possible with   
   >> all event handlers apart (not within IRQ handlers) in an idle queue.   
   >> So the mouse packets will rare to never be split to fall out of sync.   
   >>   
   >> I used this method for all interrupts and it sped up my whole OS by   
   >> magnitudes.   
   >> __   
   >> wolfgang   
   > I changed to:   
   >   
   > ps2_handler:   
   >   
   >      push    ds   
   >      push    ax   
   >      push    bx   
   >      push    cx   
   >      push    dx   
   >   
   >      mov     ax,     cs   
   >      mov     ds,     ax   
   >   
   >      in      al,     HEX (60)   
   >   
   >      test    al,     HEX (08)   
   >      jz      ps2_handler.skip_init   
   >   
   >      mov     byte ptr [ps2_updated],     0   
   >   
   >      xor     bx,     bx   
   >      mov     cx,     3   
   >   
   >      mov     [count],    cl   
   >      mov     [index],    bx   
   >   
   > ps2_handler.skip_init:   
   >   
   >      mov     bx,     offset ps2_buffer   
   >      add     bx,     [index]   
   >   
   >      mov     [bx],   al   
   >   
   >      inc     word ptr [index]   
   >      dec     byte ptr [count]   
   >   
   >      mov     al,     HEX (20)   
   >      out     HEX (A0),   al   
   >   
   >      mov     al,     HEX (20)   
   >      out     HEX (20),   al   
   >   
   >      jnz     ps2_handler.done   
   >   
   > ps2_handler.got_all:   
   >   
   >      mov     byte ptr [ps2_updated],     1   
   >   
   > ps2_handler.done:   
   >   
   >      pop     dx   
   >      pop     cx   
   >      pop     bx   
   >      pop     ax   
   >      pop     ds   
   >      iret   
   >   
   > and   
   >   
   > update_mouse:   
   >   
   *>      push    ax   
   *>      push    bx   
   *>      push    cx   
   *>      push    dx   
   *>      push    ds   
   *>   
   *>      mov     ax,     cs   
   *>      mov     ds,     ax   
   *>   
   *>      cmp     byte ptr [ps2_updated],     1   
   *>      jne     update_mouse.serial   
      
   I'd use instead of the above:   
   update_ mouse:   
      cmp byte ptr [cs:ps2_updated],1   
      jne update   
      ret   
   update:   
      push ...   
      
   >      xor     ax,     ax   
   >      xor     dx,     dx   
   >      xor     cx,     cx   
   >   
   >      mov     bx,     offset ps2_buffer   
   >      mov     al,     [bx]   
   >   
   >      test    al,     HEX (08)   
   >      jz      update_mouse.done   
   >   
   >      mov     cl,     3   
   >      shl     al,     cl   
   >   
   >      sbb     dh,     dh   
   >      cbw   
   >   
   >      mov     dl,     [bx + 2]   
   >      neg     dx   
   >      add     [mouse_y],  dx   
   >   
   >      mov     al,     [bx + 1]   
   >      add     [mouse_x],  ax   
   >   
   > update_mouse.serial:   
   >   
   >      mov     bx,     [mouse_x]   
   >      shr     bx   
   >      shr     bx   
   >      shr     bx   
   >   
   >      mov     cx,     [mouse_y]   
   >      shr     cx   
   >      shr     cx   
   >      shr     cx   
   >      shr     cx   
   >   
   > update_mouse.move:   
   >   
   >      mov     ah,     HEX (02)   
   >      xor     bh,     bh   
   >      mov     dh,     cl   
   >      mov     dl,     bl   
   >      int     HEX (10)   
   >   
   > update_mouse.done:   
   >   
   >      pop     ds   
   >      pop     dx   
   >      pop     cx   
   >      pop     bx   
   >      pop     ax   
   >      ret   
   >   
   > Just for testing and the mouse detection is even worse.   
      
   save time by using less registers (DS AX CX) in IRQ12 and   
   perhaps replace 'updated' by [count]==0 as packet complete indicator   
   (save on one memory access).   
      
   > The update mouse is called from my INT 1Ch handler.   
      
   this is the main problem, INT 1C is called by the IRQ_0 handler which   
   slows all IRQ-response that way.   
      
   my main idle code contains almost nothing:   
      
   MAIN_IDLE:   
   STI   
   TEST,dword [SS:global_flags],-1   ;I have all variables on stack bottom   
                                      ;and can check 32 event flags at once   
   JE MAIN_IDLE                      ;loop as long no event reported   
   ...      here I check for keys, mouse moves, buttons pressed/released   
   ...      act on it (fast and short) reset parameters if required   
   JMP MAIN_IDLE   
   __   
   wolfgang   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca