home *** CD-ROM | disk | FTP | other *** search
/ Da Capo / da_capo_vol1.bin / programs / amiga / edit / octamedv2 / programmers / modplayer / loadmod.a next >
Text File  |  1993-03-13  |  4KB  |  167 lines

  1. ;    MED module load routines by Teijo Kinnunen 1990
  2. ;    V3.00 module support added        22-Jan-1991
  3. ;    upgraded for V3.20 (OctaMED V2.00)    02-Aug-1991
  4.  
  5. ;    Function: d0 = _LoadModule(a0)
  6. ;    a0 = module name
  7. ;    d0 = pointer to loaded module, zero if load failed
  8.  
  9.     xdef    _LoadModule
  10.     xdef    _UnLoadModule
  11.     code
  12. _LoadModule:
  13.     movem.l a2-a4/a6/d2-d6,-(sp)
  14.     moveq    #0,d6            ;d6 = return value (zero = error)
  15.     move.l  a0,a4            ;a4 = module name
  16.     movea.l 4,a6
  17.     lea     dosname(pc),a1
  18.     moveq    #0,d0
  19.     jsr     -$228(a6)        ;OpenLibrary()
  20.     tst.l   d0
  21.     beq     xlm1
  22.     move.l  d0,a3            ;a3 = DOSBase
  23.     move.l  d0,a6
  24.     move.l  a4,d1            ;name = d1
  25.     move.l  #1005,d2        ;accessmode = MODE_OLDFILE
  26.     jsr     -$1e(a6)        ;Open()
  27.     move.l  d0,d4            ;d4 = file handle
  28.     beq     xlm2
  29.     move.l  d4,d1
  30.     moveq   #0,d2
  31.     moveq   #1,d3            ;OFFSET_END
  32.     jsr     -$42(a6)        ;Seek(fh,0,OFFSET_END)
  33.     move.l  d4,d1
  34.     moveq    #0,d3
  35.     not.l   d3            ;OFFSET_BEGINNING
  36.     jsr     -$42(a6)        ;Seek(fh,0,OFFSET_BEGINNING)
  37.     move.l  d0,d5            ;d5 = file size
  38.     movea.l 4,a6
  39.     moveq   #2,d1            ;get chip mem
  40.     jsr     -$c6(a6)        ;AllocMem()
  41.     tst.l   d0
  42.     beq.s   xlm3
  43.     move.l  d0,a2            ;a2 = pointer to module
  44.     move.l  d4,d1    ;file
  45.     move.l  d0,d2    ;buffer
  46.     move.l  d5,d3    ;length
  47.     move.l  a3,a6
  48.     jsr     -$2a(a6)        ;Read()
  49.     cmp.l   d5,d0
  50.     bne.s   xlm4            ;something wrong...
  51.     cmp.l   #'MMD0',(a2)
  52.     bne.s   xlm4            ;this is not a module!!!
  53.     movea.l a2,a0
  54.     bsr.s   _RelocModule
  55.     move.l  a2,d6            ;no error...
  56.     bra.s   xlm3
  57. xlm4:    move.l  a2,a1            ;error: free the memory
  58.     move.l  d5,d0
  59.     movea.l 4,a6
  60.     jsr     -$d2(a6)        ;FreeMem()
  61. xlm3:    move.l  a3,a6            ;close the file
  62.     move.l  d4,d1
  63.     jsr     -$24(a6)        ;Close(fhandle)
  64. xlm2:    move.l  a3,a1            ;close dos.library
  65.     movea.l 4,a6
  66.     jsr     -$19e(a6)
  67. xlm1:    move.l  d6,d0            ;push return value
  68.     movem.l (sp)+,a2-a4/a6/d2-d6    ;restore registers
  69.     rts                ;and exit...
  70. dosname dc.b    'dos.library',0
  71.  
  72. ;    Function: _RelocModule(a0)
  73. ;    a0 = pointer to module
  74.  
  75. ; THIS FUNCTION IS A BIT STRANGELY ARRANGED AROUND THE SMALL RELOC-ROUTINE.
  76. reloci    move.l    24(a2),d0
  77.     beq.s    xloci
  78.     movea.l    d0,a0
  79.     moveq   #0,d0
  80.     move.b  787(a1),d0    ;number of samples
  81.     subq.b  #1,d0
  82. relocs:    bsr.s   relocentr
  83.     move.l    -4(a0),d3    ;sample ptr
  84.     beq.s    nosyn
  85.     move.l    d3,a3
  86.     tst.w    4(a3)
  87.     bpl.s    nosyn        ;type >= 0
  88.     move.w    20(a3),d2    ;number of waveforms
  89.     lea    278(a3),a3    ;ptr to wf ptrs
  90.     subq.w    #1,d2
  91. relsyn:    add.l    d3,(a3)+
  92.     dbf    d2,relsyn
  93. nosyn:    dbf     d0,relocs
  94. xloci    rts
  95. norel    addq.l    #4,a0
  96.     rts
  97. relocentr:
  98.     tst.l   (a0)
  99.     beq.s   norel
  100.     add.l   d1,(a0)+
  101.     rts
  102. _RelocModule:
  103.     movem.l    a2-a3/d2-d3,-(sp)
  104.     movea.l a0,a2
  105.     move.l  a2,d1        ;d1 = ptr to start of module
  106.     bsr.s    relocp
  107.     movea.l 8(a2),a1
  108.     bsr.s    reloci
  109. rel_lp    bsr.s    relocb
  110.     move.l    32(a2),d0    ;extension struct
  111.     beq.s    rel_ex
  112.     move.l    d0,a0
  113.     bsr.s    relocentr    ;ptr to next module
  114.     bsr.s    relocentr    ;InstrExt...
  115.     addq.l    #4,a0        ;skip sizes of InstrExt
  116. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  117. ; read them.
  118.     bsr.s    relocentr    ;annotxt
  119.     addq.l    #4,a0        ;annolen
  120.     bsr.s    relocentr    ;InstrInfo
  121.     addq.l    #8,a0
  122.     bsr.s    relocentr    ;rgbtable (not useful for most people)
  123.     addq.l    #4,a0        ;skip channelsplit
  124.     bsr.s    relocentr    ;NotationInfo
  125.     move.l    d0,a0
  126.     move.l    (a0),d0
  127.     beq.s    rel_ex
  128.     move.l    d0,a2
  129.     bsr.s    relocp
  130.     movea.l 8(a2),a1
  131.     bra.s    rel_lp
  132. rel_ex    movem.l    (sp)+,d2-d3/a2-a3
  133.     rts
  134.  
  135. relocb    move.l    16(a2),d0
  136.     beq.s    xlocb
  137.     movea.l    d0,a0
  138.     move.w  504(a1),d0
  139.     subq.b  #1,d0
  140. rebl    bsr.s   relocentr
  141.     dbf     d0,rebl
  142. xlocb    rts
  143.  
  144. relocp    lea    8(a2),a0
  145.     bsr.s    relocentr
  146.     addq.l    #4,a0
  147.     bsr.s    relocentr
  148.     addq.l    #4,a0
  149.     bsr.s    relocentr
  150.     addq.l    #4,a0
  151.     bra.s    relocentr
  152.  
  153. ;    Function: _UnLoadModule(a0)
  154. ;    a0 = pointer to module
  155. _UnLoadModule:
  156.     move.l  a6,-(sp)
  157.     move.l  a0,d0
  158.     beq.w   xunl
  159.     movea.l 4,a6
  160.     move.l  4(a0),d0
  161.     beq.s   xunl
  162.     movea.l a0,a1
  163.     jsr     -$d2(a6)    ;FreeMem()
  164. xunl:    move.l    (sp)+,a6
  165.     rts
  166.     end
  167.