home *** CD-ROM | disk | FTP | other *** search
/ Merciful 3 / Merciful_Release_3.bin / software / o / octamed / octamedv6.12.lha / programmers / loadmod.a < prev    next >
Text File  |  1995-03-24  |  6KB  |  261 lines

  1. ;    (Octa)MED module load routines, by Teijo Kinnunen
  2. ;    MED V3.00 module support added        22-Jan-1991
  3. ;    upgraded for V3.20 (OctaMED V2.00)    02-Aug-1991
  4. ;    and for OctaMED Pro V3.00        02-Apr-1992
  5. ;    (bug fix)                31-May-1992
  6. ;    OctaMED Pro V5 support (MMD2)        18-May-1993
  7. ;    OctaMED Pro V6 support (cmd pages)    16-Jan-1995
  8. ;    2 bug fixes (Thanks to Peter Kunath.)    14-Feb-1995
  9.  
  10. ;    $VER: loadmod_a 6.1 (14.02.1995)
  11.  
  12. ;    Function: d0 = _LoadModule(a0)
  13. ;    a0 = module name
  14. ;    d0 = pointer to loaded module, zero if load failed
  15.  
  16.     XDEF    _LoadModule
  17.     XDEF    _UnLoadModule
  18.     XDEF    _RelocModule
  19.  
  20. mmd_songinfo    EQU    8
  21. mmd_blockarr    EQU    16
  22. mmd_expdata    EQU    32
  23. mmd_songsleft    EQU    51
  24. msng_numblocks    EQU    504
  25. msng_pseqs    EQU    508
  26. msng_numsamples    EQU    787
  27.  
  28.     CODE
  29. _LoadModule:
  30.         movem.l a2-a4/a6/d2-d6,-(sp)
  31.         moveq    #0,d6        ;d6 = return value (zero = error)
  32.         move.l  a0,a4        ;a4 = module name
  33.         movea.l 4,a6
  34.         lea     dosname(pc),a1
  35.         moveq    #0,d0
  36.         jsr     -$228(a6)    ;OpenLibrary()
  37.         tst.l   d0
  38.         beq     xlm1
  39.         move.l  d0,a3        ;a3 = DOSBase
  40.         move.l  d0,a6
  41.         move.l  a4,d1        ;name = d1
  42.         move.l  #1005,d2    ;accessmode = MODE_OLDFILE
  43.         jsr     -$1e(a6)    ;Open()
  44.         move.l  d0,d4        ;d4 = file handle
  45.         beq     xlm2
  46.         move.l  d4,d1
  47.         moveq   #0,d2
  48.         moveq   #1,d3        ;OFFSET_END
  49.         jsr     -$42(a6)    ;Seek(fh,0,OFFSET_END)
  50.         move.l  d4,d1
  51.         moveq    #-1,d3        ;OFFSET_BEGINNING
  52.         jsr     -$42(a6)    ;Seek(fh,0,OFFSET_BEGINNING)
  53.         move.l  d0,d5        ;d5 = file size
  54.         movea.l 4,a6
  55.         moveq   #2,d1        ;get chip mem
  56.         jsr     -$c6(a6)    ;AllocMem()
  57.         tst.l   d0
  58.         beq.s   xlm3
  59.         move.l  d0,a2        ;a2 = pointer to module
  60.         move.l  d4,d1    ;file
  61.         move.l  d0,d2    ;buffer
  62.         move.l  d5,d3    ;length
  63.         move.l  a3,a6
  64.         jsr     -$2a(a6)    ;Read()
  65.         cmp.l   d5,d0
  66.         bne.s   xlm4        ;something wrong...
  67.         cmp.l    #'MMD2',(a2)    ;Pro V5 module?
  68.         beq.s    id_ok
  69.         cmp.l    #'MMD1',(a2)    ;Pro module?
  70.         beq.s    id_ok
  71.         cmp.l   #'MMD0',(a2)
  72.         bne.s   xlm4        ;this is not a module!!!
  73. id_ok        movea.l a2,a0
  74.         bsr.s   _RelocModule
  75.         move.l  a2,d6        ;no error...
  76.         bra.s   xlm3
  77. xlm4        move.l  a2,a1        ;error: free the memory
  78.         move.l  d5,d0
  79.         movea.l 4,a6
  80.         jsr     -$d2(a6)    ;FreeMem()
  81. xlm3        move.l  a3,a6        ;close the file
  82.         move.l  d4,d1
  83.         jsr     -$24(a6)    ;Close(fhandle)
  84. xlm2        move.l  a3,a1        ;close dos.library
  85.         movea.l 4,a6
  86.         jsr     -$19e(a6)
  87. xlm1        move.l  d6,d0        ;push return value
  88.         movem.l (sp)+,a2-a4/a6/d2-d6    ;restore registers
  89.         rts            ;and exit...
  90. dosname        dc.b    'dos.library',0
  91.  
  92. ;    Function: _RelocModule(a0)
  93. ;    a0 = pointer to module
  94.  
  95. ; This function is a bit strangely arranged around the small reloc-routine.
  96. reloci        move.l    24(a2),d0
  97.         beq.s    xloci
  98.         movea.l    d0,a0
  99.         moveq   #0,d0
  100.         move.b  msng_numsamples(a1),d0    ;number of samples
  101.         subq.b  #1,d0
  102. relocs        bsr.s   relocentr
  103.         move.l    -4(a0),d3    ;sample ptr
  104.         beq.s    nosyn
  105.         move.l    d3,a3
  106.         tst.w    4(a3)
  107.         bpl.s    nosyn        ;type >= 0
  108.         move.w    20(a3),d2    ;number of waveforms
  109.         lea    278(a3),a3    ;ptr to wf ptrs
  110.         subq.w    #1,d2
  111. relsyn        add.l    d3,(a3)+
  112.         dbf    d2,relsyn
  113. nosyn        dbf     d0,relocs
  114. xloci        rts
  115. norel        addq.l    #4,a0
  116.         rts
  117. relocentr    tst.l   (a0)
  118.         beq.s   norel
  119.         add.l   d1,(a0)+
  120.         rts
  121. _RelocModule:
  122.         movem.l    a2-a4/d2-d4,-(sp)
  123.         movea.l a0,a2
  124.         move.l  a2,d1        ;d1 = ptr to start of module
  125.         bsr.s    relocp
  126.         movea.l mmd_songinfo(a2),a1
  127.         bsr.s    reloci
  128.         move.b    mmd_songsleft(a2),d4
  129. rel_lp        bsr.s    relocb
  130.         cmp.b    #'2',3(a2)    ;MMD2?
  131.         bne.s    norelmmd2
  132.         bsr.w    relocmmd2sng
  133. norelmmd2    move.l    mmd_expdata(a2),d0    ;extension struct
  134.         beq.s    rel_ex
  135.         move.l    d0,a0
  136.         bsr.s    relocentr    ;ptr to next module
  137.         bsr.s    relocentr    ;InstrExt...
  138.         addq.l    #4,a0        ;skip sizes of InstrExt
  139. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  140. ; read them.
  141.         bsr.s    relocentr    ;annotxt
  142.         addq.l    #4,a0        ;annolen
  143.         bsr.s    relocentr    ;InstrInfo
  144.         addq.l    #8,a0
  145.         bsr.s    relocentr    ;rgbtable (not useful for most people)
  146.         addq.l    #4,a0        ;skip channelsplit
  147.         bsr.s    relocentr    ;NotationInfo
  148.         bsr.s    relocentr    ;songname
  149.         addq.l    #4,a0        ;skip song name length
  150.         bsr.s    relocentr    ;MIDI dumps
  151.         bsr.s    relocmdd
  152.         subq.b    #1,d4        ;songs left..?
  153.         bcs.s    rel_ex
  154.         move.l    d0,a0
  155.         move.l    (a0),d0
  156.         beq.s    rel_ex
  157.         move.l    d0,a2
  158.         bsr.s    relocp
  159.         movea.l 8(a2),a1
  160.         bra.s    rel_lp
  161. rel_ex        movem.l    (sp)+,d2-d4/a2-a4
  162.         rts
  163.  
  164. relocp        lea    mmd_songinfo(a2),a0
  165.         bsr.s    relocentr
  166.         addq.l    #4,a0
  167.         bsr.s    relocentr
  168.         addq.l    #4,a0
  169.         bsr.s    relocentr
  170.         addq.l    #4,a0
  171.         bra.s    relocentr
  172.  
  173. relocb        move.l    mmd_blockarr(a2),d0
  174.         beq.s    xlocb
  175.         movea.l    d0,a0
  176.         move.w  msng_numblocks(a1),d0
  177.         subq.b  #1,d0
  178. rebl        bsr    relocentr
  179.         dbf     d0,rebl
  180.         cmp.b    #'T',3(a2)    ;MMD0 (= MCNT)
  181.         beq.s    xlocb
  182.         cmp.b    #'1',3(a2)    ;test MMD type
  183.         bge.s    relocbi
  184. xlocb        rts
  185.  
  186. relocmdd    move.l    d0,-(sp)
  187.         tst.l    -(a0)
  188.         beq.s    xlocmdd
  189.         movea.l    (a0),a0
  190.         move.w    (a0),d0        ;# of msg dumps
  191.         addq.l    #8,a0
  192. mddloop        beq.s    xlocmdd
  193.         bsr    relocentr
  194.         bsr.s    relocdmp
  195.         subq.w    #1,d0
  196.         bra.s    mddloop
  197. xlocmdd        move.l    (sp)+,d0
  198.         rts
  199.  
  200. relocdmp    move.l    -4(a0),d3
  201.         beq.s    xlocdmp
  202.         exg.l    a0,d3        ;save
  203.         addq.l    #4,a0
  204.         bsr    relocentr    ;reloc data pointer
  205.         move.l    d3,a0        ;restore
  206. xlocdmp        rts
  207.  
  208. relocbi        move.w    msng_numblocks(a1),d0
  209.         move.l    a0,a3
  210. biloop        subq.w    #1,d0
  211.         bmi.s    xlocdmp
  212.         move.l    -(a3),a0
  213.         addq.l    #4,a0
  214.         bsr    relocentr    ;BlockInfo ptr
  215.         tst.l    -(a0)
  216.         beq.s    biloop
  217.         move.l    (a0),a0
  218.         bsr    relocentr    ;hldata
  219.         bsr    relocentr    ;block name
  220.         addq.l    #4,a0        ;skip blocknamelen
  221.         bsr    relocentr    ;pagetable
  222.         tst.l    -(a0)
  223.         bne.s    relocpgtbl
  224.         bra.s    biloop
  225. ; take care of the new features of MMD2s
  226. relocmmd2sng    move.l    mmd_songinfo(a2),a0
  227.         lea    msng_pseqs(a0),a0
  228.         bsr    relocentr    ;playseqtable
  229.         bsr    relocentr    ;sectiontable
  230.         bsr    relocentr    ;trackvols
  231.         move.w    2(a0),d0    ;numpseqs
  232.         move.l    -12(a0),a0    ;get back to playseqtable
  233.         subq.w    #1,d0
  234. psqtblloop    bsr    relocentr
  235.         dbf    d0,psqtblloop
  236.         rts
  237. relocpgtbl    movea.l    (a0),a4        ;page table list hdr
  238.         move.w    (a4),d2
  239.         subq.w    #1,d2
  240.         lea    4(a4),a0
  241. pgtblloop    bsr    relocentr
  242.         dbf    d2,pgtblloop
  243.         bra    biloop
  244.  
  245.  
  246. ;    Function: _UnLoadModule(a0)
  247. ;    a0 = pointer to module
  248. _UnLoadModule:
  249.         move.l  a6,-(sp)
  250.         move.l  a0,d0
  251.         beq.s   xunl
  252.         movea.l 4,a6
  253.         move.l  4(a0),d0
  254.         beq.s   xunl
  255.         movea.l a0,a1
  256.         jsr     -$d2(a6)    ;FreeMem()
  257. xunl        move.l    (sp)+,a6
  258.         rts
  259.  
  260.     END
  261.