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,948 of 4,255    |
|    Robert Pengelly to wolfgang kern    |
|    Re: Does a PS/2 mouse get detected if pl    |
|    18 Nov 23 10:53:32    |
      From: robertapengelly@gmail.com              On Friday, 17 November 2023 at 22:13:21 UTC, wolfgang kern wrote:       > 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       After I do:              mov al, HEX (AB)       call ps2_write_command_read_data              on real hardware, I get 0x9C in al. Any ideas what the 9C means? I've tried       googling it but I can't seem to find anything.              --- 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