home *** CD-ROM | disk | FTP | other *** search
/ Merciful 3 / Merciful_Release_3.bin / software / o / octamed / octamedv6.12.lha / programmers / reloc.a < prev   
Text File  |  1995-03-26  |  4KB  |  169 lines

  1. ; A small reloc routine for those who include the module directly in
  2. ; the program code.
  3.  
  4. ; NOTE: The module pointer is passed in register A0. Use stubs with
  5. ;    C.
  6.  
  7.         SECTION    "text",code
  8.  
  9.         XDEF    _RelocModule
  10.  
  11. mmd_songinfo    EQU    8
  12. mmd_blockarr    EQU    16
  13. mmd_expdata    EQU    32
  14. mmd_songsleft    EQU    51
  15. msng_numblocks    EQU    504
  16. msng_pseqs    EQU    508
  17. msng_numsamples    EQU    787
  18.  
  19. reloci        move.l    24(a2),d0
  20.         beq.s    xloci
  21.         movea.l    d0,a0
  22.         moveq   #0,d0
  23.         move.b  msng_numsamples(a1),d0    ;number of samples
  24.         subq.b  #1,d0
  25. relocs        bsr.s   relocentr
  26.         move.l    -4(a0),d3    ;sample ptr
  27.         beq.s    nosyn
  28.         move.l    d3,a3
  29.         tst.w    4(a3)
  30.         bpl.s    nosyn        ;type >= 0
  31.         move.w    20(a3),d2    ;number of waveforms
  32.         lea    278(a3),a3    ;ptr to wf ptrs
  33.         subq.w    #1,d2
  34. relsyn        add.l    d3,(a3)+
  35.         dbf    d2,relsyn
  36. nosyn        dbf     d0,relocs
  37. xloci        rts
  38. norel        addq.l    #4,a0
  39.         rts
  40. relocentr    tst.l   (a0)
  41.         beq.s   norel
  42.         add.l   d1,(a0)+
  43.         rts
  44. _RelocModule:
  45.         movem.l    a2-a4/d2-d4,-(sp)
  46.         movea.l a0,a2
  47.         move.l  a2,d1        ;d1 = ptr to start of module
  48.         bsr.s    relocp
  49.         movea.l mmd_songinfo(a2),a1
  50.         bsr.s    reloci
  51.         move.b    mmd_songsleft(a2),d4
  52. rel_lp        bsr.s    relocb
  53.         cmp.b    #'2',3(a2)    ;MMD2?
  54.         bne.s    norelmmd2
  55.         bsr.w    relocmmd2sng
  56. norelmmd2    move.l    mmd_expdata(a2),d0    ;extension struct
  57.         beq.s    rel_ex
  58.         move.l    d0,a0
  59.         bsr.s    relocentr    ;ptr to next module
  60.         bsr.s    relocentr    ;InstrExt...
  61.         addq.l    #4,a0        ;skip sizes of InstrExt
  62. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  63. ; read them.
  64.         bsr.s    relocentr    ;annotxt
  65.         addq.l    #4,a0        ;annolen
  66.         bsr.s    relocentr    ;InstrInfo
  67.         addq.l    #8,a0
  68.         bsr.s    relocentr    ;rgbtable (not useful for most people)
  69.         addq.l    #4,a0        ;skip channelsplit
  70.         bsr.s    relocentr    ;NotationInfo
  71.         bsr.s    relocentr    ;songname
  72.         addq.l    #4,a0        ;skip song name length
  73.         bsr.s    relocentr    ;MIDI dumps
  74.         bsr.s    relocmdd
  75.         subq.b    #1,d4        ;songs left..?
  76.         bcs.s    rel_ex
  77.         move.l    d0,a0
  78.         move.l    (a0),d0
  79.         beq.s    rel_ex
  80.         move.l    d0,a2
  81.         bsr.s    relocp
  82.         movea.l 8(a2),a1
  83.         bra.s    rel_lp
  84. rel_ex        movem.l    (sp)+,d2-d4/a2-a4
  85.         rts
  86.  
  87. relocp        lea    mmd_songinfo(a2),a0
  88.         bsr.s    relocentr
  89.         addq.l    #4,a0
  90.         bsr.s    relocentr
  91.         addq.l    #4,a0
  92.         bsr.s    relocentr
  93.         addq.l    #4,a0
  94.         bra.s    relocentr
  95.  
  96. relocb        move.l    mmd_blockarr(a2),d0
  97.         beq.s    xlocb
  98.         movea.l    d0,a0
  99.         move.w  msng_numblocks(a1),d0
  100.         subq.b  #1,d0
  101. rebl        bsr    relocentr
  102.         dbf     d0,rebl
  103.         cmp.b    #'T',3(a2)    ;MMD0 (= MCNT)
  104.         beq.s    xlocb
  105.         cmp.b    #'1',3(a2)    ;test MMD type
  106.         bge.s    relocbi
  107. xlocb        rts
  108.  
  109. relocmdd    move.l    d0,-(sp)
  110.         tst.l    -(a0)
  111.         beq.s    xlocmdd
  112.         movea.l    (a0),a0
  113.         move.w    (a0),d0        ;# of msg dumps
  114.         addq.l    #8,a0
  115. mddloop        beq.s    xlocmdd
  116.         bsr    relocentr
  117.         bsr.s    relocdmp
  118.         subq.w    #1,d0
  119.         bra.s    mddloop
  120. xlocmdd        move.l    (sp)+,d0
  121.         rts
  122.  
  123. relocdmp    move.l    -4(a0),d3
  124.         beq.s    xlocdmp
  125.         exg.l    a0,d3        ;save
  126.         addq.l    #4,a0
  127.         bsr    relocentr    ;reloc data pointer
  128.         move.l    d3,a0        ;restore
  129. xlocdmp        rts
  130.  
  131. relocbi        move.w    msng_numblocks(a1),d0
  132.         move.l    a0,a3
  133. biloop        subq.w    #1,d0
  134.         bmi.s    xlocdmp
  135.         move.l    -(a3),a0
  136.         addq.l    #4,a0
  137.         bsr    relocentr    ;BlockInfo ptr
  138.         tst.l    -(a0)
  139.         beq.s    biloop
  140.         move.l    (a0),a0
  141.         bsr    relocentr    ;hldata
  142.         bsr    relocentr    ;block name
  143.         addq.l    #4,a0        ;skip blocknamelen
  144.         bsr    relocentr    ;pagetable
  145.         tst.l    -(a0)
  146.         bne.s    relocpgtbl
  147.         bra.s    biloop
  148. ; take care of the new features of MMD2s
  149. relocmmd2sng    move.l    mmd_songinfo(a2),a0
  150.         lea    msng_pseqs(a0),a0
  151.         bsr    relocentr    ;playseqtable
  152.         bsr    relocentr    ;sectiontable
  153.         bsr    relocentr    ;trackvols
  154.         move.w    2(a0),d0    ;numpseqs
  155.         move.l    -12(a0),a0    ;get back to playseqtable
  156.         subq.w    #1,d0
  157. psqtblloop    bsr    relocentr
  158.         dbf    d0,psqtblloop
  159.         rts
  160. relocpgtbl    movea.l    (a0),a4        ;page table list hdr
  161.         move.w    (a4),d2
  162.         subq.w    #1,d2
  163.         lea    4(a4),a0
  164. pgtblloop    bsr    relocentr
  165.         dbf    d2,pgtblloop
  166.         bra    biloop
  167.  
  168.         END
  169.