home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / pbug1_21 / reset next >
Text File  |  1993-12-07  |  2KB  |  50 lines

  1. How to handle resvector:
  2. ------------------------
  3.  
  4. XBRA is a structure, which should be used by any program installing themselves
  5. into vectors. It allows a program to test whether it's already installed or not.
  6. And it also allows to untrap a routine from that vector. Unfortunately there is
  7. one vector you can't untrap properly: resvector.
  8. If you try to untrap, you can't be absolutely sure, that resvalid has its magic
  9. value, at least the first program that installs itself into resvector will have
  10. resvalid=0. So for this program it's impossible to untrap because it can't tell
  11. the next program that resvalid was 0. When this program is called by the OS du-
  12. ring the reset, it writes a wrong value to resvalid --> the routine is called
  13. once again and the computer probably crashes.
  14. My solution is quite easy: the reset routine checks whether there is another
  15. program installed in resvector (after the own routine) or not (so it will be the
  16. last one that is called by the OS). In the first case it writes $31415926 to
  17. resvalid (the magic), otherwise it clears resvalid.
  18. This guarantees that TOS calls all routines installed in resvector till the last
  19. one stops this procedure (by clearing resvalid):
  20.  
  21.                         DC.L 'XBRA'
  22.                         DC.L _ID
  23. OLD_RESET:              DC.L 0
  24. RESET:          MOVE.W      SR,-(SP)
  25.                 ORI.W       #$700,SR
  26.                 MOVE.L      A0,-(SP)
  27.                 MOVE.L      SP,SAVE_SP_RESET
  28.                 MOVE.L      $08.w,SAVE_BUS_RESET
  29.                 MOVE.L      $0C.w,SAVE_ADDRESS_RESET
  30.                 MOVE.L      #_RESET,$08.w
  31.                 MOVE.L      #_RESET,$0C.w
  32.                 MOVE.L      #$31415926,RESVALID.w
  33.                 MOVEA.L     OLD_RESET(PC),A0
  34.                 MOVE.L      A0,RESVECTOR.w
  35.                 CMPI.L      #'XBRA',-12(A0)
  36.                 BEQ.S       ANOTHER_ONE
  37. _RESET:         CLR.L       RESVALID.w
  38. ANOTHER_ONE:    *well here you go*
  39.                 MOVE.L      SAVE_ADDRESS_RESET(PC),$0C.w
  40.                 MOVE.L      SAVE_BUS_RESET(PC),$08.w
  41.                 MOVEA.L     SAVE_SP_RESET(PC),SP
  42.                 MOVEA.L     (SP)+,A0
  43.                 MOVE.W      (SP)+,SR
  44.                 JMP         (A6)
  45.  
  46. SAVE_BUS_RESET:         DS.L 1
  47. SAVE_ADDRESS_RESET:     DS.L 1
  48. SAVE_SP_RESET:          DS.L 1
  49.  
  50.