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,894 of 4,255   
   wolfgang kern to Robert Pengelly   
   Re: COM1 interrupt for 16-bit OS   
   12 Nov 23 04:04:28   
   
   From: nowhere@never.at   
      
   On 12/11/2023 02:26, Robert Pengelly wrote:   
   > On Sunday, 12 November 2023 at 01:14:22 UTC, wolfgang kern wrote:   
   >> On 12/11/2023 01:15, Robert Pengelly wrote:   
   >>> 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 ;this isn't required   
   >>> in al, dx   
   >>> nop ;NOPs wont delay   
   >>>   
   >>> mov dx, HEX (03F8) ;DX didn't change   
   >>> 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   
   >> how about a shorter variant: MOV AL,0x20 OUT AL,[0x20]   
   >>> pop dx   
   >>> pop ax   
   >>> iret   
   >> you could imply button recognition here.   
   >>> 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?   
   >> yes the mouse send only delta X/Y coordinates w/o knowing screen limits,   
   >> so it's on you to scale and clip to the current screen mode.   
      
   >> btw: I don't like your awful slow detouring HLL-styled mouse callback.   
   > What do you mean by "HLL-styled"?   
      
   it looks like C-compiled bloatware crap copied from a C-library.   
   __   
   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