Article View: comp.sys.atari.st
Article #29385Re: strange bug?
From: John Stanley
Date: Fri, 27 Nov 1987 18:31
Date: Fri, 27 Nov 1987 18:31
51 lines
2788 bytes
2788 bytes
In article <21951@ucbvax.BERKELEY.EDU> brianp@ernie.Berkeley.EDU.UUCP (Brian Peterson) writes:
>I wrote a little routine which just jumped to an exception handling routine,
>and put the address of my routine in the exception vector in place of the
>original. If the exception was the divide by zero, it worked as expected.
>When it was the midi/kboard exception, the results were strange.
>My routine was like this:
> move.l #fc281c a0
> jmp (a0)
If it's any consolation, this is a common mistake made by people who
aren't used to writing dirty-tricks code on the 68000. The method
you're using to jump to the original exception handler is the problem.
First off, do-NOT use a constant address for the jump. Save the
address originaly contained in the exception vector and jump to -that-
location. This will allow your code to work on machines where the
roms may have changed, and with any other code that may have already
"hooked the vector".
Secondly, if you've saved the original vector in a long (4 byte)
variable called olvect, use this code to jump to it:
move.l olvect,-(a7)
rts
This allows you to make an indirect jump without modifying any
registers.
Third, be sure you restore the original vector before you exit your
program. Not doing so can cause very very bad things to happen.
>The result varied depending on whether I used a0, a1, or a2.
..because altering a0, a1, or a2 had the effect of altering the
contents of those registers in-the-program-making-the-exception(!).
After your routine changed a0/1/2, the exception handler (doing it's
job by-the-rules) would then store and restore the altered values and
then RTE to the program running when the exception occured. Remember,
never alter the contents of a register from within an exception unless
you can restore that register before your code releases control of the
machine -or- you're really sure what you're doing.
> Brian Peterson, ...!ucbvax!ucbernie!brianp (brianp@ernie.berkeley.edu)
PS, just out of curiosity, what are you writing that needs to
replace an exception vector?
---
John Stanley (john@viper.UUCP)
Software Consultant - DynaSoft Systems
UUCP: ...{amdahl,ihnp4,rutgers}!meccts!viper!john
Technical Details
Message-ID:
<342@viper.Lynx.MN.Org>Path:
arc1-ca.pugleaf.net!utzoo!mnetor!uunet!husc6!rutgers!dayton!viper!johnReferences:
<21951@ucbvax.BERKELEY.EDU>Show Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: arc1-ca.pugleaf.net!utzoo!mnetor!uunet!husc6!rutgers!dayton!viper!john From: john@viper.Lynx.MN.Org (John Stanley) Newsgroups: comp.sys.atari.st Subject: Re: strange bug? Message-ID: <342@viper.Lynx.MN.Org> Date: Fri, 27-Nov-87 13:31:03 EST Article-I.D.: viper.342 Posted: Fri Nov 27 13:31:03 1987 Date-Received: Mon, 30-Nov-87 01:27:37 EST References: <21951@ucbvax.BERKELEY.EDU> Reply-To: john@viper.UUCP (John Stanley) Organization: DynaSoft Systems Lines: 51