| Title: | Atari ST, TT, & Falcon | 
| Notice: | Please read note 1.0 and its replies before posting! | 
| Moderator: | FUNYET::ANDERSON | 
| Created: | Mon Apr 04 1988 | 
| Last Modified: | Tue May 06 1997 | 
| Last Successful Update: | Fri Jun 06 1997 | 
| Number of topics: | 1433 | 
| Total number of notes: | 10312 | 
    Hello friends,
    I'm trying to rpogram interrupts but get 2 bombs when I press a
    key. Here's what I'm doing:
    MOVE.L KBVECT,-(SP)		;Interrupt routine address
    MOVE.W #6,-(SP)             ;Keyboard
    MOVE.W #13,-(SP)            ;XBIOS MFPINT
    TRAP #14                    ;XBIOS call
    ADDQ.L #8,SP                ;Cleanup
    
    MOVE.W #6,-(SP)		;Enable keyboard interrupts
    MOVE.W #13,-(SP)		;XBIOS JENABINT
    TRAP #14			;XBIOS Call
    ADDQ.L #4,SP		;Cleanup
    
    
    KBVECT:   	Some routine
    		RTS                          
    
    I'm probably doing something very basically wrong but not being
    a programmer I don't see why I'm getting the bombs. Any help, in
    simple language please, would be greatly appreciated.
    Thanks.
    ...Howard
| T.R | Title | User | Personal Name | Date | Lines | 
|---|---|---|---|---|---|
| 680.1 | Address rather than contents ? | 1075::FORSTER | Thu Nov 23 1989 06:03 | 13 | |
|     It may be a typo on your part, but shouldn't
    
    MOVE.L KBVECT,-(SP)
    
    be
    
    MOVE.L #KBVECT,-(SP)
    
    or
    
    PEA KBVECT
    
    
 | |||||
| 680.2 | ex | SUBURB::JAMESH | Nit Picking is my Business | Thu Nov 23 1989 08:03 | 5 | 
|     Thanks for your reply. I took the instruction from the Abacus ST
    Internals page 178 which actually shows: move.l vector,-(sp). I'll
    try again tonight with #KBVECT.
    Thanks again.
    ...Howard
 | |||||
| 680.3 | Not so easy | HAM::LITSCH | Fri Nov 24 1989 06:23 | 31 | |
|     Hello Howard!
    
    Creating an own interrupt service routine is especially difficult for
    the ST. Besides the problem mentioned in the previous reply, there are
    more of them:
    - The BIOS already uses interrupt-driven keyboard-input. If you change
    that vector, you essentially disable all standard keyboard input.
    - Not only keystrokes, but also mouse, joystick, and keyboard-clock
    send data through the very same line, so you have to handle them as
    well.
    - The 6850s for keyboard and MIDI share the same interrupt line, you
    have to handle them both.
    - It may happen that another input arrives while you are handling the
    current one. This will NOT create another interrupt because of the
    edge-triggered nature of them. You have to do a loop until there is no
    more data in any of the 6850s.
    
    Another bug in your code:
    Interrupt routines have to end using RTE, not RTS.
    
    Watch out for this:
    ALL registers (except SR, the 68k handles this for you) MUST be
    restored to their old values before leaving the routine, so use
    >   KBVECT:   	movem.l	d0-d7/a0-a6,-(a7)
    >			Some routine
    >			movem.l (a7)+,d0-d7/a0-a6
    >    		RTS
    Depending of your use of registers you may leave out the unaltered ones
    in the movem instructions.
    
    Jens
 | |||||