home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / LEDGERS / LEDG_05.MSA / SOURCE / HIGHLAND.ER / RELOC.S < prev    next >
Text File  |  1987-04-22  |  2KB  |  59 lines

  1. *-------------------------------------------------------------------------*
  2. * CODE RELOCATION ROUTINE FOR RELOCATABLE FILES.           THE HIGHLANDER.
  3. *-------------------------------------------------------------------------*
  4. * This is a really useful routine I picked up a while back. I think it
  5. * actually came from an old ST NEWS. What it does is to relocate, any
  6. * relocatable file to the current memory location.
  7. *
  8. * You call the function "RELOCATE" with a6 pointing to the start of the
  9. * program file.This then relocates the code to the correct memory address
  10. * to allow it to be run by you. You can then call the code by just jumping
  11. * to the start address of it.
  12. *
  13. * EXAMPLE:
  14. *
  15. *    MAIN:    clr.l    -(sp)
  16. *        move.w    #$20,-(sp)
  17. *        trap    #1
  18. *        addq.l    #6,sp
  19. *
  20. *        move.l    #MUSIC_PLAY,a6
  21. *        bsr    RELOCATE
  22. *
  23. *        jmp    MUSIC_PLAY    ; run it as if the program
  24. *                    ; were just double clicked!
  25. *
  26. *     MUSIC_PLAY:
  27. *        incbin    "crap.tos"
  28. *-------------------------------------------------------------------------*
  29.  
  30. RELOCATE:
  31.         move.l    a6,a0
  32.         move.l  2(a0),d0 ;    Length of PROGRAM 
  33.         add.l   6(a0),d0      
  34.         add.l   14(a0),d0;    Length of SYMBOL TABLE
  35.  
  36. ; d0 contains relative position of RELOCATION TABLE
  37.  
  38.         add.l   #$1C,a0  ;    A0 Points to programs start adress
  39.         move.l  a0,a1         
  40.         move.l  a1,a2         
  41.         move.l    a6,d1
  42.         add.l    #$1c,d1
  43.  
  44.         add.l   d0,a1   ;    Get adress of RELOCATION TABLE
  45.         move.l  (a1)+,d0;    Get the Long Word
  46.         add.l   d0,a2         
  47.         add.l   d1,(a2) ;    Relocate it
  48.         clr.l   d0            
  49. mRELO:        move.B  (a1)+,d0;    Get next byte from table
  50.         beq     mRELEND ;    Is it the end (zero)
  51.         cmp.b   #1,d0   ;    1 is a 254 jump
  52.         beq     mJUMP   ;    If it is then do it
  53.         add.l   d0,a2   ;    If not find next absolute adress
  54.         add.l   d1,(a2) ;    and relocate it
  55.         bra     mRELO   ;    Continue until the zero is found
  56. mJUMP:        add.l   #254,a2 ;    Jump 254 bytes
  57.         bra     mRELO    ;     and continue
  58. mRELEND:    rts
  59.