home *** CD-ROM | disk | FTP | other *** search
/ BBS 1 / BBS#1.iso / for-dos / exe2drv.arj / DISNEY.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-03-11  |  15.6 KB  |  498 lines

  1. ;░▒▓█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▓▒░
  2. ;░▒▓█  ASIO package                        Driver for Disney Sound Source  █▓▒░
  3. ;░▒▓█  (C)opyright 1992 by FRIENDS software          All rights reserved  █▓▒░
  4. ;░▒▓█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█▓▒░
  5.  
  6.         .186
  7.  
  8. Driver          Segment Byte
  9.                 Assume  cs:Driver, ds:Driver
  10.                 ORG     0
  11.                 dw      offset DriverDescr      ; Some info for EXE2DRV
  12.  
  13.                 ORG     65*256-20-20-2-2-2-2-16*2
  14.  
  15. ; Driver header. Note that it isn't loaded into memory and must be ignored
  16. ; by driver itself.
  17. DriverDescr     db      'Disney Sound Source',0
  18. Programmer    db    'Andrew Zabolotny',0,0,0,0
  19. DeviceFlags     dw      1100000000000001b
  20. MemoryNeed    dw    offset DriverEnd
  21. StartOffset    dw    65*256            ; Preserve 16k of memory for
  22.                                                 ; volume table.
  23. FuncSupported   dw      16                      ; How many functions driver
  24.                                                 ; support
  25. OffsetTable     dw      offset Init             ;  1
  26.                 dw      offset SetPorts         ;  2
  27.                 dw      offset SetTempo         ;  3
  28.                 dw      offset StartPlay        ;  4
  29.                 dw      offset SetFreq          ;  5
  30.                 dw      offset SetVolume        ;  6
  31.                 dw      offset SetSample        ;  7
  32.                 dw      offset SetGlobalVolume  ;  8
  33.                 dw      offset GetSamples       ;  9
  34.                 dw      offset StopPlay         ; 10
  35.                 dw      offset SetOneSample     ; 11
  36.                 dw      offset GetOneSample     ; 12
  37.                 dw      offset StartOnePlay     ; 13
  38.                 dw      offset SetADCport       ; 14
  39.                 dw      offset StartDigitize    ; 15
  40.                 dw      offset GetDigiByte      ; 16
  41. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  42. ; ░░░░░▒▒▒▒▓▓▓██ Really driver starts here ██▓▓▓▒▒▒▒░░░░░
  43. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  44. VolTable        equ     0                       ; Offset of volume table
  45.  
  46. TimerFreq       dw      04Bh                    ; Frequence of IRQ0
  47. Samples     dw    0,0            ; Four pointers
  48.         dw    0,0            ; to samples for
  49.         dw    0,0            ; each voice.
  50.         dw    0,0
  51. CFreq        dw    0,0,0,0
  52. InsFB        dw    0,0,0,0         ; Offset of first byte
  53.                         ; in loop for each sample
  54. InsLB        dw    0,0,0,0         ; 0FFFFh if no loop or offset
  55.                         ; of last byte in loop.
  56. ShutDown        dw      0,0                     ; Pointer to a array of flags
  57.                                                 ; that mean that sample are
  58.                                                 ; finished.
  59. GVolume         db      64                      ; Global volume
  60. Temp        dw    0
  61. DecTemp     dw    0
  62. ;█ Offsets of variables in self-modifying code █
  63. ;█     Segment of this variables is CS:        █
  64. FreqOfs     dw    offset Freq1,offset Freq2
  65.         dw    offset Freq3,offset Freq4
  66. InsEOfs     dw    offset InsE1,offset InsE2
  67.         dw    offset InsE3,offset InsE4
  68. HWordOfs    dw    offset HiWord1,offset HiWord2
  69.         dw    offset HiWord3,offset HiWord4
  70. VolumeOfs    dw    offset Volume1,offset Volume2
  71.         dw    offset Volume3,offset Volume4
  72.  
  73. OneSample       dw      0,0                     ; Pointer to sample for
  74.                                                 ; one-voice play.
  75. OneCFreq        dw      0
  76. OneInsS         dw      0
  77.  
  78. Init            proc    far
  79.                 pusha
  80.                 push    es
  81.                 mov     word ptr cs:ShutDown,bx ; Save pointer to array of
  82.                 mov     word ptr cs:ShutDown+2,es; flags...
  83.                 call    InitTable
  84.                 clc                             ; I don't know how to detect
  85.                 pop     es                      ; DSS, so, assume that it's 
  86.                 popa                            ; all right.
  87.                 ret
  88. Init        endp
  89.  
  90. SetPorts        proc    far
  91.                 mov     cs:DACport,bx
  92.                 retf
  93. SetPorts    endp
  94.  
  95. SetTempo        proc    far
  96.                 push    cx
  97.                 mov     byte ptr cs:TimerFreq,al
  98.                 mov     cs:Temp,cx
  99.                 sub     cx,cs:DecTemp
  100.                 add     cs:DecTemp,cx
  101.                 jg      @@T1
  102.                 mov     cs:DecTemp,1
  103. @@T1:           pop     cx
  104.                 retf
  105. SetTempo    endp
  106.  
  107. StartPlay       proc    far
  108.                 mov     cs:DecTemp,1
  109.                 mov     word ptr cs:Handler,dx
  110.                 mov     word ptr cs:Handler+2,es
  111.                 push    bx
  112.                 mov     bx,offset IntProc
  113.         call    TimerInit
  114.                 pop     bx
  115.                 retf
  116. StartPlay    endp
  117.  
  118. SetFreq         proc    far
  119.                 push    bx
  120.                 push    di
  121.                 xor     bh,bh
  122.         shl    bx,1
  123.                 mov     di,cs:FreqOfs[bx]
  124.                 mov     cs:[di],cx
  125.                 mov     di,cs:HWordOfs[bx]
  126.                 mov     cs:[di],dx
  127.                 pop     di
  128.                 pop     bx
  129.                 retf
  130. SetFreq     endp
  131.  
  132. SetVolume       proc    far
  133.                 push    ax
  134.                 push    bx
  135.                 xor     bh,bh
  136.         shl    bx,1
  137.                 mov     al,cs:GVolume
  138.         mul    dl
  139.         shr    ax,6
  140.                 cmp     al,40h
  141.                 jbe     @SV1
  142.                 mov     al,040h
  143. @SV1:           mov     bx,cs:VolumeOfs[bx]
  144.                 mov     cs:[bx],al
  145. @SVret:         pop     bx
  146.                 pop     ax
  147.                 retf
  148. SetVolume    endp
  149.  
  150. SetSample       proc    far
  151.                 push    ax
  152.                 push    bx
  153.                 push    si
  154.                 push    ds
  155.                 mov     ax,cs
  156.                 mov     ds,ax
  157.                 xor     bh,bh
  158.         shl    bx,1
  159.                 mov     si,HWordOfs[bx]        ; Don't change this sequence
  160.                 mov     word ptr [si],0        ; becaule on low-speed
  161.                 mov     si,FreqOfs[bx]        ; machines can appear some
  162.                 mov     word ptr [si],0        ; troubles
  163.                 shl     bx,1
  164.                 mov     Samples[bx],di
  165.                 mov     Samples[bx+2],es
  166.                 shr     bx,1
  167.                 mov     InsLB[bx],cx
  168.         mov    InsFB[bx],dx
  169.                 cmp     dx,0FFFFh
  170.                 jne     @@O1
  171.                 mov     InsLB[bx],dx
  172. @@O1:           mov     si,InsEOfs[bx]
  173.                 mov     [si],cx
  174.                 pop     ds
  175.                 pop     si
  176.                 pop     bx
  177.                 pop     ax
  178.                 retf
  179. SetSample    endp
  180.  
  181. SetGlobalVolume proc    far
  182.                 mov     cs:GVolume,al
  183.                 mov     cs:OVolume,al
  184.                 retf
  185. SetGlobalVolume endp
  186.  
  187. GetSamples      proc    far
  188.                 push    cx
  189.                 push    di
  190.                 push    si
  191.                 push    ds
  192.                 push    cs
  193.                 pop     ds
  194.                 cld
  195.                 mov     si,offset Samples
  196.                 mov     cx,4*4
  197.                 rep     movsb
  198.                 pop     ds
  199.                 pop     si
  200.                 pop     di
  201.                 pop     cx
  202.                 retf
  203. GetSamples      endp
  204.  
  205. StopPlay        proc    far
  206.                 retf                            ; Seem that DSS don't need
  207. StopPlay        endp                            ; nothing to shut up.
  208.  
  209. SetOneSample    proc    far
  210.                 push    ds
  211.                 push    cs
  212.                 pop     ds
  213.                 jc      @NoSet
  214.                 mov     word ptr OneSample,di
  215.                 mov     word ptr OneSample+2,es
  216.                 mov     OneInsS,cx
  217.                 mov     OneInsE,bx
  218. @NoSet:         mov     OFreq,ax
  219.                 mov     OHiWord,dx
  220.                 pop     ds
  221.                 retf
  222. SetOneSample    endp
  223.  
  224. GetOneSample    proc    far
  225.                 mov     di,word ptr cs:OneSample
  226.                 mov     es,word ptr cs:OneSample+2
  227.                 retf
  228. GetOneSample    endp
  229.  
  230. StartOnePlay    proc    far
  231.                 push    bx
  232.                 mov     word ptr cs:StopOneVoice,dx
  233.                 mov     word ptr cs:StopOneVoice+2,es
  234.                 mov     bx,offset OnePlayEntry
  235.                 call    TimerInit
  236.                 pop     bx
  237.                 retf
  238. StartOnePlay    endp
  239.  
  240. SetADCport      proc    far
  241.                 retf
  242. SetADCport      endp
  243.  
  244. StartDigitize   proc    far
  245.                 retf
  246. StartDigitize   endp
  247.  
  248. GetDigiByte     proc    far
  249.                 retf
  250. GetDigiByte     endp
  251.  
  252. ;************** Initialize timer and set Int8 *************
  253. ; In : BX = Interrupt procedure offset
  254. TimerInit       proc    near
  255.                 push    es
  256.                 cli
  257.                 mov     al,036h
  258.                 out     43h,al
  259.                 mov     al,byte ptr cs:TimerFreq
  260.                 out     40h,al
  261.                 mov     al,0
  262.                 out     40h,al
  263.                 xor     ax,ax
  264.                 mov     es,ax
  265.                 mov     word ptr es:[8*4],bx
  266.                 mov     word ptr es:[8*4+2],cs
  267.                 pop     es
  268.                 sti
  269.                 retn
  270. TimerInit       endp
  271.  
  272. ;************** Initialize volume table **************
  273. InitTable       proc    near
  274.                 mov     di,VolTable
  275.                 cld
  276.                 push    cs
  277.                 pop     es
  278.                 mov     ch,0
  279. @M1:            mov     cl,0
  280. @M2:            mov     al,cl
  281.                 cmp     al,0
  282.                 jge     @M3
  283.                 cmp     al,-125
  284.                 jl      @M3
  285.                 sub     al,3
  286. @M3:            imul    ch
  287.                 mov     al,ah
  288.                 stosb
  289.                 inc     cl
  290.                 jne     @M2
  291.                 inc     ch
  292.                 cmp     ch,65
  293.                 jb      @M1
  294.                 retn
  295. InitTable       endp
  296.  
  297. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  298. ; ░░░░░▒▒▒▒▓▓▓██ Driver's "heart" -> interrupt procedures ██▓▓▓▒▒▒▒░░░░░
  299. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  300. Int08Entry    proc    far
  301. @ResetV1:    cmp    word ptr InsLB[0],0FFFFh
  302.                 je      @C1
  303.                 mov     bx,word ptr InsFB[0]
  304.                 mov     word ptr Samples[0],bx
  305.                 jmp     @L1
  306. @C1:            xor     bx,bx
  307.                 mov     byte ptr Volume1,bl
  308.                 mov     word ptr Samples[0],bx
  309.                 les     bx,dword ptr ShutDown
  310.                 mov     byte ptr es:[bx],0
  311.                 jmp     @L1
  312.  
  313. @ResetV2:    cmp    word ptr InsLB[2],0FFFFh
  314.                 je      @C2
  315.                 mov     bx,word ptr InsFB[2]
  316.                 mov     word ptr Samples[4],bx
  317.                 jmp     @L2
  318. @C2:            xor     bx,bx
  319.                 mov     byte ptr Volume2,bl
  320.                 mov     word ptr Samples[4],bx
  321.                 les     bx,dword ptr ShutDown
  322.                 mov     byte ptr es:[bx+1],0
  323.                 jmp     @L2
  324.  
  325. IntProc:    push    ax
  326.                 push    bx
  327.                 push    dx
  328.         push    ds
  329.         push    es
  330.                 mov     ax,cs
  331.         mov    ds,ax
  332. ;          █ Voice 1 █
  333.         add    word ptr CFreq[0],0DEADh
  334. Freq1        equ    word ptr $-2
  335.         adc    word ptr Samples[0],0DEADh
  336. HiWord1     equ    word ptr $-2
  337.                 les     bx,dword ptr Samples[0]
  338.                 cmp     bx,0DEADh
  339. InsE1        equ    word ptr $-2
  340.         jae    @ResetV1
  341. @L1:            mov     bl,byte ptr es:[bx]
  342.                 mov     bh,00h
  343. Volume1     equ    byte ptr $-1
  344.                 mov     al,[bx]
  345.  
  346. ;          █ Voice 2 █
  347.         add    word ptr CFreq[2],0DEADh
  348. Freq2        equ    word ptr $-2
  349.         adc    word ptr Samples[4],0DEADh
  350. HiWord2     equ    word ptr $-2
  351.                 les     bx,dword ptr Samples[4]
  352.                 cmp     bx,0DEADh
  353. InsE2        equ    word ptr $-2
  354.         jae    @ResetV2
  355. @L2:            mov     bl,byte ptr es:[bx]
  356.                 mov     bh,00h
  357. Volume2     equ    byte ptr $-1
  358.                 add     al,[bx]
  359.  
  360. ;          █ Voice 3 █
  361.         add    word ptr CFreq[4],0DEADh
  362. Freq3        equ    word ptr $-2
  363.         adc    word ptr Samples[8],0DEADh
  364. HiWord3     equ    word ptr $-2
  365.                 les     bx,dword ptr Samples[8]
  366.                 cmp     bx,0DEADh
  367. InsE3        equ    word ptr $-2
  368.         jae    @ResetV3
  369. @L3:            mov     bl,byte ptr es:[bx]
  370.                 mov     bh,00h
  371. Volume3     equ    byte ptr $-1
  372.                 add     al,[bx]
  373.  
  374. ;          █ Voice 4 █
  375.         add    word ptr CFreq[6],0DEADh
  376. Freq4        equ    word ptr $-2
  377.         adc    word ptr Samples[12],0DEADh
  378. HiWord4     equ    word ptr $-2
  379.                 les     bx,dword ptr Samples[12]
  380.                 cmp     bx,0DEADh
  381. InsE4        equ    word ptr $-2
  382.         jae    @ResetV4
  383. @L4:            mov     bl,byte ptr es:[bx]
  384.                 mov     bh,00h
  385. Volume4     equ    byte ptr $-1
  386.                 add     al,[bx]
  387.  
  388.                 xor     al,80h
  389.                 mov     dx,0378h
  390. DACport         equ     word ptr $-2
  391.                 out     dx,al
  392.  
  393. ;░▒▓█  ??? Unchecked subroutine   █▓▒░
  394.         inc    dx
  395.         inc    dx
  396.         mov    al,12
  397.         out    dx,al
  398.         mov    al,4
  399.         out    dx,al
  400.  
  401.         dec    word ptr DecTemp
  402.                 jz      @DoHandler
  403. @Play:        pop    es
  404.         pop    ds
  405.                 pop     dx
  406.                 pop     bx
  407.                 mov     al,020h
  408.                 out     020h,al
  409.                 pop     ax
  410.                 iret
  411.  
  412. @ResetV3:    cmp    word ptr InsLB[4],0FFFFh
  413.                 je      @C3
  414.                 mov     bx,word ptr InsFB[4]
  415.                 mov     word ptr Samples[8],bx
  416.                 jmp     @L3
  417. @C3:            xor     bx,bx
  418.                 mov     byte ptr Volume3,bl
  419.                 mov     word ptr Samples[8],bx
  420.                 les     bx,dword ptr ShutDown
  421.                 mov     byte ptr es:[bx+2],0
  422.                 jmp     @L3
  423.  
  424. @ResetV4:       cmp     word ptr InsLB[6],0FFFFh
  425.                 je      @C4
  426.                 mov     bx,word ptr InsFB[6]
  427.                 mov     word ptr Samples[12],bx
  428.                 jmp     @L4
  429. @C4:            xor     bx,bx
  430.                 mov     byte ptr Volume4,bl
  431.                 mov     word ptr Samples[12],bx
  432.                 les     bx,dword ptr ShutDown
  433.                 mov     byte ptr es:[bx+3],0
  434.                 jmp     @L4
  435.  
  436. @DoHandler:    mov    ax,Temp
  437.                 mov     DecTemp,ax
  438.                 db      09Ah
  439. Handler         dw      0,0
  440.                 jmp     @Play
  441. Int08Entry    endp
  442.  
  443. OnePlayEntry    proc    far
  444.                 push    ax
  445.                 push    bx
  446.                 push    dx
  447.                 push    ds
  448.                 push    es
  449.                 mov     ax,cs
  450.                 mov     ds,ax
  451.  
  452.                 add     word ptr OneCFreq,0DEADh
  453. OFreq           equ     word ptr $-2
  454.                 adc     word ptr OneSample,0DEADh
  455. OHiWord         equ     word ptr $-2
  456.                 les     bx,dword ptr OneSample
  457.                 cmp     bx,0DEADh
  458. OneInsE         equ     word ptr $-2
  459.                 jae     @OResetV
  460. @OL:            mov     bl,byte ptr es:[bx]
  461.                 mov     bh,64
  462. OVolume         equ     byte ptr $-1
  463.                 mov     al,[bx]
  464.                 xor     al,080h
  465.                 mov     dx,DACport
  466.                 out     dx,al
  467.  
  468. ;░▒▓█  ??? Unchecked subroutine   █▓▒░
  469.         inc    dx
  470.         inc    dx
  471.         mov    al,12
  472.         out    dx,al
  473.         mov    al,4
  474.                 out     dx,al
  475.  
  476. @OneEnd:        mov     al,20h
  477.                 out     20h,al
  478.                 pop     es
  479.                 pop     ds
  480.                 pop     dx
  481.                 pop     bx
  482.                 pop     ax
  483.                 iret
  484.  
  485. @OResetV:       cmp     word ptr OneInsS,0FFFFh
  486.                 je      @OL1
  487.                 mov     bx,word ptr OneInsS
  488.                 mov     word ptr OneSample,bx
  489.                 jmp     @OL
  490. @OL1:           db      09Ah
  491. StopOneVoice:   dw      0,0
  492.                 jmp     @OneEnd
  493. OnePlayEntry    endp
  494.  
  495. DriverEnd       label   near
  496. Driver          ends
  497.         end
  498.