Re: A92: Periodic events


[Prev][Next][Index][Thread]

Re: A92: Periodic events




Thank you, your example has clarified a lot of things.  However, I still have a
couple of questions:

Bryan Christopher Turner wrote:

> >
> > Can someone write a sample program illustrating how to use an interrupt
> > to make something happen at a preset interval.
> >
>
> Ok, there's been quite a few requests of this nature, so here goes:
> WARNING: This has not been tested, if it does not work let me know and I'll
>     fix it.
>
> main:
>         move.w  $0700,d0                ; Desired interrupt mask (disable all)
>         trap    #1                      ; Set interrupt mask do desired mask
>         move.w  d0,d7                   ; Save old mask (changed during trap)
>
>         bclr    #2,$600001              ; Turn off memory protect

    Don't you have to reenable memory protection somwhere?  If so, where?

>         lea     my_Task(pc),a0          ; Load address of task
>         lea     old_Int(pc),a1          ; Load address of jump to old interrupt
>

    didn't you store the old interrupt in d7?  What do you need old_Int for? (you
haven't declared it anywhere.  It's supposed to be a word, right?)

>         move.l  ($Auto_Int5),2(a1)      ; Store address of old interrupt in
>                                         ;   self-modifying code (optimization)

    what do you mean by self-modifying code (optimization)?

>         move.l  a0,($Auto_Int5)         ; Store address of new interrupt vector
>
>         move.w  d7,d0                   ; Load old mask
>         trap    #1                      ; Restore interrupts
>
>         ...                             ; Do main program
>         ; While in this section, periodic task will be running...
>         ...
>
>         move.w  $0700,d0                ; Disable interrupts (again)
>         trap    #1
>
>         lea     old_Int(pc),a1          ; Load address of jump to old interrupt
>         move.l  2(a1),($Auto_Int5)      ; Restore interrupt vector
>
>         move.w  d7,d0                   ; Load old mask
>         trap    #1                      ; Restore interrupts (again)
>         rts
>
> my_Task:
>         ; This task will be run aproximately 20 times per second.
>         ; You MUST save and restore all registers used in this interrupt!
>
>         movem.l d0-d7/a0-a6,-(a7)       ; Save all registers
>                                         ; This interrupt does not use any
>                                         ;   registers so this isn't needed,
>                                         ;   but shown for completeness..
>         not.b   (tios::main_LCD)        ; Blink some pixels in upper left of
> LCD
>
>         movem.l (a7)+,d0-d7/a0-a6       ; Restore registers (must match
>                                         ;   previous register list!!!)
>         rte                             ; Return from exception
>
>   Well, that should get you closer to the goal at least.  Let me know if it
> needs tweaking.  $Auto_Int5 should be (I think) $74.  Also, I don't know if
> tios::main_LCD is the actual name of the macro, look it up in TIOS.h...
>   This program will blink the upper left line of pixels 20 times a second while
> something is going on in the main program.  Just insert a flib::pause or
> flig:getkey in there to see it in action.
>
> --Bryan
> bcturner@eos.ncsu.edu




References: