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

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