home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
pbug1_21
/
reset
next >
Wrap
Text File
|
1993-12-07
|
2KB
|
50 lines
How to handle resvector:
------------------------
XBRA is a structure, which should be used by any program installing themselves
into vectors. It allows a program to test whether it's already installed or not.
And it also allows to untrap a routine from that vector. Unfortunately there is
one vector you can't untrap properly: resvector.
If you try to untrap, you can't be absolutely sure, that resvalid has its magic
value, at least the first program that installs itself into resvector will have
resvalid=0. So for this program it's impossible to untrap because it can't tell
the next program that resvalid was 0. When this program is called by the OS du-
ring the reset, it writes a wrong value to resvalid --> the routine is called
once again and the computer probably crashes.
My solution is quite easy: the reset routine checks whether there is another
program installed in resvector (after the own routine) or not (so it will be the
last one that is called by the OS). In the first case it writes $31415926 to
resvalid (the magic), otherwise it clears resvalid.
This guarantees that TOS calls all routines installed in resvector till the last
one stops this procedure (by clearing resvalid):
DC.L 'XBRA'
DC.L _ID
OLD_RESET: DC.L 0
RESET: MOVE.W SR,-(SP)
ORI.W #$700,SR
MOVE.L A0,-(SP)
MOVE.L SP,SAVE_SP_RESET
MOVE.L $08.w,SAVE_BUS_RESET
MOVE.L $0C.w,SAVE_ADDRESS_RESET
MOVE.L #_RESET,$08.w
MOVE.L #_RESET,$0C.w
MOVE.L #$31415926,RESVALID.w
MOVEA.L OLD_RESET(PC),A0
MOVE.L A0,RESVECTOR.w
CMPI.L #'XBRA',-12(A0)
BEQ.S ANOTHER_ONE
_RESET: CLR.L RESVALID.w
ANOTHER_ONE: *well here you go*
MOVE.L SAVE_ADDRESS_RESET(PC),$0C.w
MOVE.L SAVE_BUS_RESET(PC),$08.w
MOVEA.L SAVE_SP_RESET(PC),SP
MOVEA.L (SP)+,A0
MOVE.W (SP)+,SR
JMP (A6)
SAVE_BUS_RESET: DS.L 1
SAVE_ADDRESS_RESET: DS.L 1
SAVE_SP_RESET: DS.L 1