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,888 of 4,255   
   Robert Pengelly to wolfgang kern   
   Re: COM1 interrupt for 16-bit OS   
   11 Nov 23 16:15:06   
   
   From: robertapengelly@gmail.com   
      
   On Saturday, 11 November 2023 at 23:56:50 UTC, wolfgang kern wrote:   
   > On 11/11/2023 18:44, Robert Pengelly wrote:    
   > ,,,   
   > > Awesome it works thanks. As for:    
   > >    
   > > and before you touch any part of the interrupt chain you should disable    
   > > IRQs with this single byte reserved for that, re-enable after done.    
   > >    
   > > Do you mean some like if I want to do something like:   
   > CLI   
   > mov [0x33 * 4], offset handler    
   > mov [0x33 * 4 + 2], segment   
   > ;also during write to any PIT-I/O 0x20/A0 0x21/A1    
   > STI   
   > > then I should disable the IRQ first then re-enable it after I setup the   
   interrupt.   
   > yes, this prevents IRQs in the middle of a change which would make it    
   > crash for sure.   
   > > As for the timer I'm using a handler for int 1Ch, is that bad practice or   
   something?   
   > INT 1C is a software INT called by PIC-handler, so it's fine for tests.    
   > But if you use it permanent your mouse is polled rather then interrupt    
   > driven.    
   >    
   > almost all my 16 bit IRQ-routines start with:    
   >    
   > push ax    
   > push ds    
   > in al,port ;03F8 in case of COM_1 this read releases the IRQ-pin    
   > mov buffer,al    
   > inc buffer    
   > cmp buffer,limit    
   > ja ... ;to reset count and tell received packet is complete    
   > cmp al,..    
   > jz ...    
   > __    
   > wolfgang   
   The INT 1Ch was just temporary until I got the interrupt working, I've now   
   moved the mouse stuff into INT 0Ch and it all works. Again thanks for the help   
   to enable interrupts.  I'm not exactly sure what I want to do in INT 1C at the   
   moment so using it    
   for tests is fine for now.  As for the INT 0C handler I have:   
      
   mouse_handler:   
      
       push    ax   
       push    dx   
          
       mov     dx,     HEX (03FD)   
       xor     ax,     ax   
       in      al,     dx   
       nop   
          
       test    al,     0b01000000   
       jz      mouse_handler.done   
          
       test    al,     0b00000001   
       jz      mouse_handler.done   
          
       mov     dx,     HEX (03F8)   
       xor     ax,     ax   
       in      al,     dx   
       nop   
          
       mov     dx,     HEX (03F8)   
       xor     ax,     ax   
       in      al,     dx   
       nop   
          
       mov     al,     'M'   
       call    writechr   
      
   mouse_handler.done:   
      
       mov     dx,     HEX (20)   
       mov     al,     HEX (20)   
       out     dx,     al   
          
       pop     dx   
       pop     ax   
       iret   
      
   Also, still regarding mice I also have PS/2 support using INT 15h to set   
   everything up and then I have:   
      
   mouse_callback:   
      
       push    bp   
       mov     bp,     sp   
          
       push    ax   
       push    bx   
       push    cx   
       push    dx   
          
       mov     al,     [bp + 12]   
       mov     bl,     al   
       mov     cl,     3   
       shl     al,     cl   
          
       sbb     dh,     dh   
       cbw   
          
       mov     dl,     [bp + 8]   
       mov     al,     [bp + 10]   
          
       neg     dx   
          
       mov     cx,     cs:[mouse_y]   
       add     dx,     cx   
          
       mov     cx,     cs:[mouse_x]   
       add     ax,     cx   
          
       mov     cs:[mouse_x],       ax   
       mov     cs:[mouse_y],       dx   
          
       call    writedec   
       mov     al,     ' '   
       call    writechr   
       mov     ax,     dx   
       call    writedec   
       call    crlf   
      
   mouse_callback.done:   
      
       pop     dx   
       pop     cx   
       pop     bx   
       pop     ax   
       pop     bp   
       retf   
      
   which works but I get values 0000 - FFFF from it when the screen is 80x25   
   initially so should I be capping the X and Y coordinates?   
      
   --- 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