home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / audio / utils / med_424 / programmers / modplayer / loadmod.a < prev    next >
Text File  |  1990-12-30  |  4KB  |  171 lines

  1. ;    MED module load routines by Teijo Kinnunen 1990
  2.  
  3. ;    Function: d0 = _LoadModule(a0)
  4. ;    a0 = module name
  5. ;    d0 = pointer to loaded module, zero if load failed
  6.  
  7.     xdef    _LoadModule
  8.     xdef    _UnLoadModule
  9.     code
  10. _LoadModule:
  11.     movem.l a2-a4/a6/d2-d6,-(sp)
  12.     clr.l   d6            ;d6 = return value (zero = error)
  13.     move.l  a0,a4            ;a4 = module name
  14.     movea.l 4,a6
  15.     lea     dosname(pc),a1
  16.     jsr     -$198(a6)    ;OldOpenLibrary()
  17.     tst.l   d0
  18.     beq     xlm1
  19.     move.l  d0,a3            ;a3 = DOSBase
  20.     move.l  d0,a6
  21.     move.l  a4,d1            ;name = d1
  22.     move.l  #1005,d2        ;accessmode = MODE_OLDFILE
  23.     jsr     -$1e(a6)        ;Open()
  24.     move.l  d0,d4            ;d4 = file handle
  25.     beq     xlm2
  26.     move.l  d4,d1
  27.     moveq   #0,d2
  28.     moveq   #1,d3            ;OFFSET_END
  29.     jsr     -$42(a6)        ;Seek(fh,0,OFFSET_END)
  30.     move.l  d4,d1
  31.     clr.l   d3
  32.     not.l   d3            ;OFFSET_BEGINNING
  33.     jsr     -$42(a6)        ;Seek(fh,0,OFFSET_BEGINNING)
  34.     move.l  d0,d5            ;d5 = file size
  35.     movea.l 4,a6
  36.     moveq   #2,d1            ;get chip mem
  37.     jsr     -$c6(a6)        ;AllocMem()
  38.     tst.l   d0
  39.     beq.s   xlm3
  40.     move.l  d0,a2            ;a2 = pointer to module
  41.     move.l  d4,d1    ;file
  42.     move.l  d0,d2    ;buffer
  43.     move.l  d5,d3    ;length
  44.     move.l  a3,a6
  45.     jsr     -$2a(a6)        ;Read()
  46.     cmp.l   d5,d0
  47.     bne.s   xlm4            ;something wrong...
  48.     cmp.l   #'MMD0',(a2)
  49.     bne.s   xlm4            ;this is not a module!!!
  50.     movea.l a2,a0
  51.     bsr.s   _RelocModule
  52.     move.l  a2,d6        ;no error...
  53.     bra.s   xlm3
  54. xlm4:    move.l  a2,a1        ;error: free the memory
  55.     move.l  d5,d0
  56.     movea.l 4,a6
  57.     jsr     -$d2(a6)    ;FreeMem()
  58. xlm3:    move.l  a3,a6        ;close the file
  59.     move.l  d4,d1
  60.     jsr     -$24(a6)        ;Close(fhandle)
  61. xlm2:    move.l  a3,a1        ;close dos.library
  62.     movea.l 4,a6
  63.     jsr     -$19e(a6)
  64. xlm1:    move.l  d6,d0            ;push return value
  65.     movem.l (sp)+,a2-a4/a6/d2-d6    ;restore registers
  66.     rts                ;and exit...
  67. dosname:    dc.b    'dos.library',0
  68.  
  69. ;    Function: _RelocModule(a0)
  70. ;    a0 = pointer to module
  71. relocentr:
  72.     tst.l   (a0)
  73.     beq.s   norel
  74.     add.l   d1,(a0)
  75. norel:    addq.l  #4,a0
  76.     rts
  77. _RelocModule:
  78.     move.l  a2,-(sp)
  79.     movea.l a0,a2
  80.     move.l  a2,d1        ;d1 = ptr to start of module
  81.     lea     8(a2),a0
  82.     bsr.s   relocentr    ;reloc song ptr
  83.     addq.l  #4,a0
  84.     bsr.s   relocentr    ;reloc blockarr ptr
  85.     addq.l  #4,a0
  86.     bsr.s   relocentr    ;reloc smplarr ptr
  87.     addq.l  #4,a0
  88.     bsr.s   relocentr    ;reloc expdata ptr
  89.     movea.l 24(a2),a0
  90.     movea.l 8(a2),a1
  91.     moveq   #0,d0
  92.     move.b  787(a1),d0    ;number of samples
  93.     subq.b  #1,d0
  94. relocs:    bsr.s   relocentr
  95.     dbf     d0,relocs
  96.     movea.l 16(a2),a0
  97.     move.w  504(a1),d0
  98.     subq.b  #1,d0
  99. relocb:    bsr.s   relocentr
  100.     dbf     d0,relocb
  101.     move.l  (sp)+,a2
  102.     rts
  103.  
  104.  
  105. ;    Function: _UnLoadModule(a0)
  106. ;    a0 = pointer to module
  107. _UnLoadModule:
  108.     movem.l  d2-d3/a2-a3/a6,-(sp)
  109.     move.l  a0,d0
  110.     beq.w   xunl
  111.     movea.l 4,a6
  112.     move.l  4(a0),d0
  113.     beq.s   freencont
  114.     movea.l a0,a1
  115.     jsr     -$d2(a6)    ;FreeMem()
  116.     bra.w   xunl
  117. freencont:
  118.     movea.l a0,a2
  119.     movea.l 8(a2),a1
  120.     moveq.l #0,d2
  121.     moveq.l #0,d3
  122.     move.w  504(a1),d2    ;remember numblocks
  123.     move.b  787(a1),d3    ;& # of samples
  124.     move.l  12(a2),d0
  125.     beq.s   ne1
  126.     jsr     -$d2(a6)    ;free song
  127. ne1:    tst.l   20(a2)
  128.     beq.s   ne2
  129.     movea.l 16(a2),a3
  130.     subq.w  #1,d2
  131. fblkl:    movea.l (a3)+,a1    ;get block ptr
  132.     moveq.l #0,d0
  133.     move.b  (a1),d0    ;numtracks
  134.     moveq.l #0,d1
  135.     move.b  1(a1),d1    ;lines
  136.     addq.w  #1,d1
  137.     mulu    d1,d0
  138.     mulu    #3,d0        ;calculated length of the block
  139.     addq.l  #2,d0        ;header
  140.     jsr     -$d2(a6)    ;FreeMem()
  141.     dbf     d2,fblkl
  142.     movea.l 16(a2),a1
  143.     move.l  20(a2),d0
  144.     beq.s   ne2
  145.     jsr     -$d2(a6)    ;free block array
  146. ne2:    tst.l   28(a2)
  147.     beq.s   ne3
  148.     movea.l 24(a2),a3
  149.     subq.b  #1,d3
  150. fsmpl:    movea.l (a3)+,a1
  151.     move.l  a1,d0
  152.     beq.s   nos2fr        ;no sample to free!!
  153.     move.l  (a1),d0    ;get length
  154.     addq.l  #6,d0        ;add header
  155.     jsr     -$d2(a6)    ;free..
  156. nos2fr    dbf     d3,fsmpl
  157.     movea.l 24(a2),a1
  158.     move.l  28(a2),d0
  159.     beq.s   ne3
  160.     jsr     -$d2(a6)    ;free sample array
  161. ne3:    movea.l 32(a2),a1
  162.     move.l  36(a2),d0
  163.     beq.s   ne4
  164.     jsr     -$d2(a6)    ;free exp. data
  165. ne4:    movea.l a2,a1
  166.     moveq   #52,d0
  167.     jsr     -$d2(a6)    ;and finally, free the module structure
  168. xunl:    movem.l  (sp)+,d2-d3/a2-a3/a6
  169.     rts
  170.     end
  171.