Page 1 of 1

interrupt example

Posted: Fri Dec 24, 2004 2:54 am
by Poseidon
Could somebody give me an example of a keyboard interrupt?

Thanx in advance

Re:interrupt example

Posted: Fri Dec 24, 2004 5:50 am
by pini
It depends on what you want to store. Do you want scancodes only or do you want ASCII chars ?
I'm using the following scheme (the buffer is ring-buffer):

Code: Select all

Check if buffer is not full
Read scancode (port 0x60)
Check if scancode is extended value (0xE0 or 0xE1)
1) If so, store it and exit
2) else, use the scancode and a previously stored extended scancode to find an ascii equivalent in the keymap.
If the equivalent is zero, store the scancode
If the equivalent is non-zero, store the scancode and the ascii char
I also check for special keys, like 'shift', 'ctrl' or 'alt gr' to produce special ASCII chars

Re:interrupt example

Posted: Fri Dec 24, 2004 6:50 am
by Mr, L
I'm also stuck on this subject, but instead of using ports, I want to use the PIC and IDTR.

Does anybody have any examples of interrupts using the PIC and IDTR?

Thanks

Re:interrupt example

Posted: Fri Dec 24, 2004 9:41 am
by IRBMe
Mr, L, "the PIC and IDTR" and ports are completely different things and are usually used in conjunction with each other. You reprogram the PIC and then it'll handle interrupt requests for you. You add interrupts to your interrupt table, and then write handlers for them. Then in the handlers, you'll often do port io. This applies to the keyboard too. The keyboard interrupt just tells you that the keyboard has *some* information. In order to see what, you need to read the ports once a keyboard interrupt occurs. Setting up the interrupt handlers, reprogramming the PIC, creating an IDT etc are all seperate topics. What pini gave was a good example of what you would write in a keyboard interrupt handler, as asked for. There are seperate tutorials showing you how to set up interrupts.

Re:interrupt example

Posted: Fri Dec 24, 2004 10:40 am
by ASHLEY4
The simplest possable, to get you started:

Code: Select all

key_board:
                                                     ; Push register
        pushad
        cli
        cld
        in    AL,60h
write_text:
        cmp   al,128                  ; if below 128, then there is a key
   jae   nokey
   mov   edi,eax
        mov   al,[edi+normal_keymap]
next3:
        mov   [keybuffer],al
nokey:
        mov   AL,20h                                ; generate End of Interrupt
        out   20h,AL
        sti
        popad
        ret
normal_keymap

Code: Select all

normal_keymap:

     db   '6',27
     db   '!@#$%^&*()_+',8,9
     db   'QWERTYUIOP{}',13
     db   '~ASDFGHJKL:"~',0,'|ZXCVBNM<>?',0,'45 '
     db   '@234567890123',180,178,184,'6',176,'7'
     db   179,'8',181,177,183,185,182
     db   'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ'
     db   'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
     db   'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
     db   'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
This is from a simple GameOS, i made so was just for top score etc.
so upper case only and no ctrl ,alt etc.

\\\\||////
(@@)
ASHLEY4.

Batteries not included, Some assembly required.

Re:interrupt example

Posted: Fri Dec 24, 2004 10:55 am
by Mr. L
Mr, L, "the PIC and IDTR" and ports are completely different things and are usually used in conjunction with each other. You reprogram the PIC and then it'll handle interrupt requests for you. You add interrupts to your interrupt table, and then write handlers for them. Then in the handlers, you'll often do port io. This applies to the keyboard too. The keyboard interrupt just tells you that the keyboard has *some* information. In order to see what, you need to read the ports once a keyboard interrupt occurs. Setting up the interrupt handlers, reprogramming the PIC, creating an IDT etc are all seperate topics. What pini gave was a good example of what you would write in a keyboard interrupt handler, as asked for. There are seperate tutorials showing you how to set up interrupts.
Thanks for the reply IRBME, but I thought the question was asking how to get a keyboard interrupt :-[

I have tried getting keyboard interrupts to work for days and I've still had no luck. I have an ISR just waiting to be called upon, but with no interrupt redirection this function is useless.

Does anybody have an example interrupt code that shows you how to get a keyboard interrupt to point to an ISR?

Thanks again.

Re:interrupt example

Posted: Fri Dec 24, 2004 12:35 pm
by ASHLEY4
Maybe if you do a little search in old post you may find what you are looking for.
http://www.mega-tokyo.com/forum/index.p ... 53;start=0
asm code for what you want, by me "ASHLEY4"

\\\\||////
(@@)
ASHLEY4.

Batteries not included, Some assembly required.

Re:interrupt example

Posted: Fri Dec 24, 2004 3:00 pm
by Mr. L
Thanks ASHLEY, I got interrupts working ;D Great Post!!!

Re:interrupt example

Posted: Sat Dec 25, 2004 6:31 pm
by Chris Giese
ASHLEY4 wrote:

Code: Select all

key_board:
        pushad
        cli
...
        mov   AL,20h  ; generate End of Interrupt
        out   20h,AL
        sti
        popad
        ret
If this is a hardware interrupt handler, you should not
use CLI and STI. What happens if another interrupt
arrives between STI and POPAD? Will the other interrupt
do something that conflicts with the keyboard? Will it
cause a race condition? Will it do something non-reentrant?
Will the kernel stack overflow because of too many PUSHADs?

The interrupt itself will push EFLAGS then clear EFLAGS.IF,
which is the equivalent of CLI. IRET will do the equivalent
of STI by popping the old EFLAGS value. In fact, IRET is
often safer than STI, because it re-enables interrupts
only if they were enabled.

PS - here is a keyboard driver in C that runs under DOS:
[url]http://my.execpc.com/~geezer/osd/kbd/index.htm#snippets/[url]

Re:interrupt example

Posted: Sun Dec 26, 2004 9:48 am
by ASHLEY4
Chris, thanks for the info, but this was from a old GameOS, made year a go when i was just starting, my OS that i am working on now keyboard int, is nothing like this, but would be not be so easy to under stand, i should have checked it for errors first.

And may i point out that although you should not do this with a hardware int, you can and some time must use this in a software int.

\\\\||////
(@@)
ASHLEY4.

Batteries not included, Some assembly required.

Re:interrupt example

Posted: Wed Dec 29, 2004 7:08 am
by Poseidon
Thanx guys, but there is one thing i don't get :-[ :
How do i assign the function for the keyboard interrupt to the keyboard interrupt itself?

Re:interrupt example

Posted: Wed Dec 29, 2004 7:27 am
by Mr. L
You have to reprogram the PIC first and make sure you keep note of what value you have given the keyboard interrupt (i.e. this is usually 0x21). Then you have to populate the IDT table and make sure that the entry that relates to the keyboard interrupt (0x21 or 33rd entry) points to your keyboard ISR.

Re:interrupt example

Posted: Wed Dec 29, 2004 10:10 am
by ASHLEY4
Here are the the stager's, you can follow the link to see them in context.
http://www.mega-tokyo.com/forum/index.p ... 53;start=0
This is after remapping pic

Code: Select all

;33 interrupt 21h <- IRQ 1
   dw keyboard_irq      ; keyboard
   dw sys_code
   db 0
   db sys_interrupt
   dw 0
Which points to this:

Code: Select all

keyboard_irq:
        pushad
          call key_board
        popad
   iret
Which points to this:

Code: Select all

key_board:
        pushad
        cld
        in    AL,60h
write_text:
        cmp   al,128    ; if below 128, then there is a key
   jae   nokey

   mov   edi,eax
        mov   al,[edi+normal_keymap]
next3:
        mov   [keybuffer],al
nokey:
        mov   AL,20h      ; generate End of Interrupt
        out   20h,AL
        popad
        ret
\\\\||////
(@@)
ASHLEY4.

Batteries not included, Some assembly required.