home *** CD-ROM | disk | FTP | other *** search
/ The Equalizer BBS / equalizer-bbs-collection_2004.zip / equalizer-bbs-collection / DEMOSCENE-STUFF / BKISSSRC.ZIP / MODLOAD.ASM < prev    next >
Assembly Source File  |  1993-12-14  |  14KB  |  390 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. Header:
  3. MODsongname     db      20 dup (?)
  4. MODsamples      db      31*size SampleRec dup (?)
  5. MODsonglen      db      ?
  6. MODrestart      db      ?
  7. MODsequences    db      128 dup (?)
  8. MODsignature    dd      ?
  9. HeaderSize      =       $-Header
  10. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  11. SigCopy         db      'PS16■'
  12. PS16Header:
  13. Sig             db      'PS16■'
  14. SongName        db      75 dup (0)
  15. SongLen         db      0
  16. numpatterns     db      0
  17. commentofs      dd      0
  18. Sequences       db      128 dup (0)
  19. Samples         db      31*size PS16Sample dup (0)
  20. PS16Size        =       $-PS16Header
  21. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  22. PatternLoc      dw      64 dup (0)
  23. InsLoc          dd      32 dup (0)
  24. Handle          dw      0
  25. ModSegment      dw      0
  26. ModLoaded       dw      0
  27. TopOfData       dw      0
  28. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  29. ;               DS:DX ==> ASCIIZ filename to load
  30. ;returns:       CARRY on error
  31. proc            MUS_LoadModule near
  32.                 pusha
  33.                 push    ds es
  34.  
  35.                 cmp [cs:ModLoaded],0
  36.                 jnz @@Error
  37.  
  38.                 mov     ax,3D00h
  39.                 int     21h
  40.                 jc      @@Error
  41.                 mov     [cs:Handle],ax
  42.  
  43.                 ;set [TopOfData] to the segment of the largest piece
  44.                 ;of memory possible. (we'll trim it down later)
  45.                 mov ah,48h
  46.                 mov bx,0FFFFh
  47.                 int 21h
  48.                 mov ah,48h
  49.                 int 21h
  50.                 mov [cs:TopOfData],ax
  51.                 mov [cs:ModSegment],ax
  52.  
  53.                 mov     ax,cs
  54.                 mov     ds,ax
  55.                 mov     es,ax
  56.                 call    MUS_ReadMod
  57.  
  58.                 ;trim down on the amount of memory needed
  59.                 mov ah,4Ah
  60.                 mov bx,[cs:TopOfData]
  61.                 sub bx,[cs:ModSegment]
  62.                 add bx,2
  63.                 mov es,[cs:ModSegment]
  64.                 int 21h
  65.  
  66.                 mov [cs:ModLoaded],1
  67.  
  68.                 mov     ah,3Eh
  69.                 mov     bx,[cs:Handle]
  70.                 int     21h
  71. @@Exit:         pop     es ds
  72.                 popa
  73.                 clc
  74.                 ret
  75.  
  76. @@Error:        pop es ds
  77.                 popa
  78.                 stc
  79.                 ret
  80. endp            MUS_LoadModule
  81. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  82. ;returns:       CARRY set on error
  83. proc            MUS_FreeModule
  84.                 cmp [cs:ModLoaded],0
  85.                 jz @@Error
  86.  
  87.                 mov ah,49h
  88.                 mov es,[cs:ModSegment]
  89.                 int 21h
  90.                 mov [cs:ModLoaded],0
  91.  
  92.                 clc
  93.                 ret
  94. @@Error:        stc
  95.                 ret
  96. endp            MUS_FreeModule
  97. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  98. proc            MUS_ConvertHeader
  99.                 ; Clear Header
  100.                 pusha
  101.                 push    ds
  102.                 mov     ax,cs
  103.                 mov     ds,ax
  104.                 mov     es,ax
  105.                 mov     di,offset PS16Header
  106.                 mov     al,0
  107.                 mov     cx,PS16Size
  108.                 rep     stosb
  109.  
  110.                 mov     si,offset SigCopy
  111.                 mov     di,offset Sig
  112.                 mov     cx,5
  113.                 rep     movsb
  114.                 mov     si,offset MODsongname
  115.                 mov     di,offset SongName
  116.                 mov     cx,20
  117.                 rep     movsb
  118.                 mov     al,26
  119.                 stosb
  120.                 mov     al,[MODsonglen]
  121.                 mov     [SongLen],al
  122.                 mov     si,offset MODsequences
  123.                 mov     di,offset Sequences
  124.                 mov     cx,128
  125.                 rep     movsb
  126.  
  127.                 mov     bp,31
  128.                 mov     si,offset MODsamples+(offset (SampleRec).length)
  129.                 mov     di,offset Samples
  130. @@FlipLoop:     mov     ax,[si+4]
  131.                 xchg    ah,al
  132.                 mov     cx,ax
  133.                 mov     bx,[si+6]
  134.                 xchg    bh,bl
  135.                 add     ax,bx
  136.                 mov     dx,[si]
  137.                 xchg    dh,dl
  138.                 cmp     ax,dx
  139.                 jbe     @@OKRepeat
  140.                 shr     cx,1
  141. @@OKRepeat:     shl     dx,1
  142.                 mov     [di+PS16Sample.length],dx
  143.                 mov     ax,[si+2]
  144.                 mov     [di+PS16Sample.volume],ax
  145.                 shl     bx,1
  146.                 mov     [di+PS16Sample.replen],bx
  147.                 shl     cx,1
  148.                 mov     [di+PS16Sample.repeat],cx
  149. @@OKSample:     add     si,size SampleRec
  150.                 add     di,size PS16Sample
  151.                 dec     bp
  152.                 jne     @@FlipLoop
  153.                 pop     ds
  154.                 popa
  155.                 ret
  156. endp            MUS_ConvertHeader
  157. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  158. LocInList       dw      ?
  159. proc            MUS_ReadMod near
  160.                 push    ds
  161.                 mov     ax,3F00h                ; Read the header
  162.                 mov     bx,[cs:Handle]
  163.                 mov     dx,offset Header
  164.                 mov     cx,HeaderSize
  165.                 int     21h
  166.  
  167.                 cmp     [Word cs:MODsignature],'.M'
  168.                 jnz     @@CheckFLT4
  169.                 cmp     [Word cs:MODsignature+2],'.K'
  170.                 jz      @@31Ins
  171. @@CheckFLT4:    cmp     [Word cs:MODsignature],'LF'
  172.                 jnz     @@15Ins
  173.                 cmp     [Word cs:MODsignature+2],'4T'
  174.                 jz      @@31Ins
  175. @@15Ins:        mov     si,offset Header+20+15*30
  176.                 mov     di,offset MODsonglen
  177.                 mov     cx,134
  178.                 rep     movsb
  179.                 mov     di,offset Header+20+15*30
  180.                 mov     cx,16*30
  181.                 mov     al,0
  182.                 rep     stosb
  183.                 mov     ax,4200h
  184.                 mov     bx,[cs:Handle]
  185.                 mov     cx,0
  186.                 mov     dx,258h
  187.                 int     21h
  188.  
  189. @@31Ins:        call    MUS_ConvertHeader
  190.                 call    MUS_LoadPatterns
  191.                 mov     cx,31
  192.                 mov     bx,offset MODsamples+(offset (SampleRec).length)
  193. @@FlipLoop:
  194.                 mov     dx,[cs:bx]      ; Flip length
  195.                 xchg    dh,dl
  196.                 shl     dx,1
  197.                 mov     [cs:bx],dx
  198.                 mov     ax,[cs:bx+6]    ; Flip repeat length
  199.                 xchg    ah,al
  200.                 shl     ax,1
  201.                 mov     [cs:bx+6],ax
  202.                 mov     ax,[cs:bx+4]    ; Flip repeat
  203.                 xchg    ah,al
  204.                 shl     ax,1
  205.                 mov     [cs:bx+4],ax
  206. @@OKSample:     add     bx,size SampleRec
  207.                 loop    @@FlipLoop
  208.  
  209.                 mov     cx,31
  210.                 mov     bx,offset MODsamples+(offset (SampleRec).length)
  211.                 mov     [Word cs:LocInList],0
  212.                 mov     si,0            ; Location in DRAM to begin
  213.                 mov     di,0
  214. @@DoSamples:    push    cx
  215.                 mov     ax,[cs:bx]
  216.                 or      ax,ax
  217.                 jz      @@ZeroByteSample
  218.                 mov     cx,ax           ; Save for read from disk.
  219.                 push    bx
  220.                 mov     bx,[cs:LocInList]
  221.                 mov     [Word cs:bx+InsLoc],di
  222.                 mov     [Word cs:bx+InsLoc+2],si
  223.                 add     [Word cs:LocInList],4
  224.                 mov     ax,[cs:Handle]
  225.                 mov     dx,[cs:TopOfData]
  226.                 mov     bx,0Dh
  227.                 call    [dword ptr cs:Music]
  228.                 pop     bx
  229.                 jmp     @@Bottom
  230. @@ZeroByteSample:
  231.                 push    bx
  232.                 mov     bx,[cs:LocInList]
  233.                 mov     [Word cs:bx+InsLoc],0
  234.                 mov     [Word cs:bx+InsLoc+2],0f000h
  235.                 add     [Word cs:LocInList],4
  236.                 pop     bx
  237. @@Bottom:       add     bx,size SampleRec
  238.                 pop     cx
  239.                 loop    @@DoSamples
  240. @@Skip:         
  241.                 pop     ds
  242.                 ret
  243. endp            MUS_ReadMod
  244. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  245. proc            MUS_GetHighestBlock near
  246.                 mov     si,offset MODsequences
  247.                 mov     cx,128
  248.                 xor     ax,ax
  249. @@SetBlock:     mov     ah,al
  250.                 jmp     @@BotLoop
  251. @@SearchLoop:   lodsb
  252.                 cmp     al,ah
  253.                 jg      @@SetBlock
  254. @@BotLoop:      loop    @@SearchLoop
  255.                 mov     al,ah
  256.                 inc     al
  257.                 xor     ah,ah                   ; Clear ah.
  258.                 ret
  259. endp            MUS_GetHighestBlock
  260. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  261. MUS_Match       dw      1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,912
  262.                 dw      856,808,762,720,678,640,604,570,538,508,480,453
  263.                 dw      428,404,381,360,339,320,302,285,269,254,240,226
  264.                 dw      214,202,190,180,170,160,151,143,135,127,120,113
  265.                 dw      107,101,95,90,85,80,75,71,67,63,60,56,0
  266. proc            MUS_LoadMatcher
  267.                 mov     ax,[si]
  268.                 xchg    ah,al
  269.                 and     ax,0FFFh
  270.                 or      ax,ax
  271.                 jz      @@Done
  272.                 mov     bx,offset MUS_Match
  273.                 mov     cx,0
  274. @@NoteMatcher:  cmp     ax,[cs:bx]
  275.                 jae     @@Found
  276.                 add     bx,2
  277.                 inc     cx
  278.                 cmp     cx,61
  279.                 jnz     @@NoteMatcher
  280.                 mov     ax,0
  281.                 ret
  282. @@Found:        mov     ax,cx
  283.                 inc     ax
  284. @@Done:         ret
  285. endp            MUS_LoadMatcher
  286. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  287. PatSeg          dw      0
  288. Buf4            dw      0
  289. proc            MUS_LoadPatterns near
  290.                 mov     cx,64
  291.                 mov     di,offset PatternLoc
  292.                 xor     ax,ax
  293.                 rep     stosw
  294.  
  295.                 call    MUS_GetHighestBlock
  296.                 mov     [cs:numpatterns],al
  297.                 mov     ax,[cs:TopOfData]
  298.                 sub     ax,4096/16
  299.                 mov     [cs:PatSeg],ax
  300.                 add     ax,1024/16
  301.                 mov     [cs:Buf4],ax
  302.                 mov     es,ax
  303.  
  304.                 mov     si,offset PatternLoc
  305.                 mov     cx,0
  306. @@BlockReadLoop:
  307.                 push    cx si
  308.                 mov     cx,1024
  309.                 mov     bx,[cs:Handle]
  310.                 mov     ax,[cs:PatSeg]
  311.                 mov     ds,ax
  312.                 xor     dx,dx
  313.                 mov     ax,3F00h                ; Load in the block.
  314.                 int     21h
  315.                 mov     cx,0                    ; Channels
  316.                 mov     di,0
  317.                 mov     ax,[cs:Buf4]
  318.                 mov     es,ax
  319.                 mov     ax,0
  320.                 stosw
  321.                 mov     al,64
  322.                 stosb
  323. @@ChannelLoop:  push    cx
  324.                 mov     si,0
  325.                 shl     cx,2
  326.                 add     si,cx
  327.                 mov     cx,0
  328. @@LineLoop:     push    cx
  329.                 cmp     [Word si],0
  330.                 jnz     @@ItsThere
  331.                 cmp     [Word si+2],0
  332.                 jz      @@NothingSkip
  333. @@ItsThere:     mov     al,cl
  334.                 stosb
  335.                 call    MUS_LoadMatcher
  336.                 mov     bl,[si]
  337.                 and     bl,0F0h
  338.                 shl     bl,2
  339.                 or      al,bl
  340.                 stosb
  341.                 mov     ax,[si+2]
  342.                 stosw
  343. @@NothingSkip:  pop     cx
  344.                 add     si,16
  345.                 inc     cx
  346.                 cmp     cx,64
  347.                 jnz     @@LineLoop
  348.                 mov     al,-1
  349.                 stosb
  350.                 pop     cx
  351.                 inc     cx
  352.                 cmp     cx,4
  353.                 jnz     @@ChannelLoop
  354.                 mov     cx,4
  355. @@CLoop:        mov     al,-1
  356.                 stosb
  357.                 inc     cx
  358.                 cmp     cx,16
  359.                 jnz     @@CLoop
  360.                 mov     bx,di
  361.                 mov     di,0
  362.                 mov     cx,bx
  363.                 mov     ax,bx
  364.                 stosw
  365.                 shr     bx,4
  366.                 inc     bx
  367.                 pop     si
  368.                 push    si
  369.                 mov     ax,[cs:TopOfData]
  370.                 mov     [cs:si],ax
  371.                 add     [Word cs:TopOfData],bx
  372.                 push    ds
  373.                 mov     ax,es
  374.                 mov     ds,ax
  375.                 mov     ax,[cs:si]
  376.                 mov     es,ax
  377.                 mov     di,0
  378.                 mov     si,0
  379.                 rep     movsb
  380.                 pop     ds
  381.                 pop     si cx
  382.                 add     si,2
  383.                 inc     cx
  384.                 cmp     cl,[cs:numpatterns]
  385.                 jnz     @@BlockReadLoop
  386.                 clc
  387.                 ret
  388. endp            MUS_LoadPatterns
  389. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  390.