Il 09/04/2021 19:56, Guillermo via fpc-pascal ha scritto:
Hi pascaloids,

I'm doing DOS development for fun and, after installing the compiler
(was quite hard), I'm having problems handling interrupts.

I have this handler from SWAG, hope it would be helpful.
Marco
{
Unit for reading multiple keys... works brilliantly, 
although I (Scott Tunstall) didn't write it, I think it was
Lou Duchez. Thanks Lou!
}

Unit NWKBDINT ;         

Interface
Procedure HookKeyBoardInt;              { Take over keyboard handler }
Procedure UnHookKeyBoardInt;            { Return control back to system }

Var
   KeyDown : Array[0..127] of Boolean ;

Implementation
Uses DOS;

Var
   OldInt09 : Pointer ;


{$F+}
procedure NewInt09; assembler;        { new keyboard handler }
  asm
    push ax                           { push registers }
    push bx
    push ds
    mov ax, SEG @Data
    mov ds, ax
    in  al, 60h
    mov bx, ax
    and bx, 007fh                     { switch high bit of BX to zero }
    and al, 80h                       { check high bit of port value }
    jz @press
    @release:                         { high bit = 1: "release" code }
    mov byte ptr keydown[bx], 00h     { write 00 to "down" array element }
    jmp @done
    @press:                           { high bit = 0: "press" code }
    mov byte ptr keydown[bx], 01h     { write 01 to "down" array element }
    @done:
    in al, 61h                        { read port 61h, system ctrl port }
    mov ah, al                        { save value to AH }
    or al, 80h                        { set top bit to "1" - reset kbd }
    out 61h, al                       { write out value to port }
    xchg ah, al                       { put original value back into AL }
    out 61h, al                       { rewrite original value in AL }
    mov al, 20h                       { generate End of Interrupt }
    out 20h, al
    pop ds                            { pop registers }
    pop bx
    pop ax
    iret                              { return }
    end;
{$F-}


Procedure HookKeyBoardInt;            { Take over keyboard }
Var KeyCount: byte;
Begin
     For KeyCount:=0 to 127 do
         KeyDown[KeyCount]:=False;
     GetIntVec(9,OldInt09);
     SetIntVec(9,@NewInt09);
End;


Procedure UnHookKeyBoardInt;          { Let system do hard work now }
Begin
     SetIntVec(9,OldInt09);
     Mem[$40:$1c]:=Mem[$40:$1a];      { Flush key buffer so
                                        there's no phantom keys }
End;


Begin
     Writeln('Installing NEWKBDINT multiple key handler..');
End.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to