home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / pvoc / PVOC.EXE
Text File  |  1991-05-19  |  12KB  |  365 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;
  3. ;                                   PVOC.EXE
  4. ;                         Public Domain VOC file player
  5. ;
  6. ;               Please feel free to distribute or use this code
  7. ;               according to the following restrictions:
  8. ;
  9. ;        1)This code must be distributed AS-IS.  Do not remove or change
  10. ;    any part/parts of it.  If you find a way to do something better, send
  11. ;    me a copy of what you've done and I'll release the update and you'll
  12. ;    get the credit.  Otherwise there will be 180000 versions and no way
  13. ;    to support them.
  14. ;
  15. ;       2)You may modify this code or use any piece of it for your own
  16. ;    purposes, but you must inform the end user that this code is Public
  17. ;    Domain, who wrote it, and where to get it.
  18. ;
  19. ;       3)If you need a piece of this for a commercial or shareware something
  20. ;    that you are working on, drop me a message and we'll discuss it.  There
  21. ;    wont be a charge, but I'd appreciate a mention and perhaps a copy of what
  22. ;    you write.
  23. ;
  24. ;       4)Go crazy.
  25. ;
  26. ;               CopyRight (C) 1991, All Rights Reserved
  27. ;               David Hoelzer
  28. ;
  29. ;       I can be reached at:
  30. ;               dhoelzer@gnu.ai.mit.edu
  31. ;       SnailMail:
  32. ;               Everest Systems
  33. ;               Suite 180, 16 Campus Plaza
  34. ;               Box 2000
  35. ;               Vestal, NY  13850
  36. ;               ATTN: D. Hoelzer
  37. ;
  38. ;
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40.  
  41. ;As it is now:
  42. ;       Compile normally, but link with /CP:5000 (Works good for me) to allow
  43. ;    the program to allocate more memory.
  44. ;       Simply stick pvoc.exe in the path and ct-voice.drv in c:\
  45. ;    Now just type PVOC SOUNDFILE.VOC.  Pathnames should work as well.
  46. ;
  47. ;       The program now uses two 30k(~) buffers to output the file
  48. ;    continuously.  I have had a few minor problems and unexplained crashes,
  49. ;    but I feel that they are caused by my unusual setup.
  50. ;
  51. ;       NOTE:  If your interrupt settings are not the factory defaults,
  52. ;    you must change them in ct-voice yourself with inst-drv(I think..)
  53.  
  54.  
  55. ;Future Stuffs:
  56. ;
  57.  
  58.  
  59.  
  60. STACKSEG        SEGMENT PARA STACK
  61.         DB      256 DUP (?)
  62. STACKSEG        ENDS
  63.  
  64. DATA            SEGMENT PUBLIC WORD 'Data'
  65.  
  66. PARAMLENGTH     EQU     80H
  67. PARAMSTART      EQU     81H
  68.  
  69. SOUNDDRIVER     DW      0
  70. DRIVERSEGMENT   DW      ?
  71. VOICEFILESEG    DW      ?
  72. VOICEFILESEG2   DW      ?
  73. VOICEOFFSET     DW      0
  74. MEMERROR        DB      'Memory Allocation Error.',13,10,'$'
  75. F_MESSAGE       DB      'Error opening file: '
  76. FILENAME        DB      '                                       ',0,13,10
  77.                 DB      'Format: PVOC SOUNDFILE.VOC',13,10,'$'
  78. DRIVERFILE      DB      'c:\CT-VOICE.DRV',0
  79. FILEHANDLE      DW      ?
  80. DRIVERFILEERR   DB      'Voice Driver not found!',13,10,'$'
  81. D_MESSAGE       DB      'Sound Card Initialization Error.',10,13,'$'
  82. CARDSTATUS      DW      0FFFFh
  83. MORE            DW      1
  84. STARTUPMESSAGE  DB      'Play Voc - Public Domain',13,10
  85.                 DB      'Version 1.1 -'
  86.                 DB      ' Copyright (C) 1991, All Rights Reserved',13,10
  87.                 DB      ' David Hoelzer',13,10,'$'
  88. DATA            ENDS
  89.  
  90. CODE            SEGMENT PUBLIC BYTE 'Code'
  91.         ASSUME CS:CODE, SS:STACKSEG, DS:DATA
  92.  
  93. MAIN            PROC    FAR
  94.         PUSH    DS                              ;Set up for return
  95.         XOR     AX,AX
  96.         PUSH    AX
  97.         MOV     AX,DATA
  98.         MOV     DS,AX
  99.         LEA     DX,STARTUPMESSAGE
  100.         MOV     AH,9
  101.         INT     21H
  102.         MOV     AH,81
  103.         INT     21H
  104.         MOV     ES,BX
  105.         XOR     CX,CX
  106.         MOV     CL,ES:[PARAMLENGTH]
  107.         JCXZ    A1
  108.         CALL    GET_PARAMS
  109. A1:     CALL    ALLOCATEBUFFERS
  110.         JC      EXIT
  111.         CALL    LOADDRIVER
  112.         JC      EXIT
  113.         CALL    INITIALIZEDRIVER
  114.         JC      EXIT
  115.         CALL    OPENSOUNDFILE
  116.         JC      EXIT
  117.         CALL    PLAYSOUND
  118.         CALL    SHUTDOWNCARD
  119. EXIT:   RETF
  120. MAIN            ENDP
  121.  
  122. SHUTDOWNCARD    PROC    NEAR
  123. WAITLOOP:
  124.         MOV     BX,CARDSTATUS
  125.         CMP     BX,0
  126.         JNZ     WAITLOOP
  127.         MOV     BX,8
  128.         CALL    DWORD PTR SOUNDDRIVER
  129.         MOV     BX,9
  130.         CALL    DWORD PTR SOUNDDRIVER
  131.         RET
  132. SHUTDOWNCARD    ENDP
  133.  
  134. GET_PARAMS      PROC    NEAR
  135.         MOV     BX,PARAMSTART
  136.         LEA     DI,FILENAME
  137. L_1:    MOV     AH,ES:[BX]
  138.         CMP     AH,32
  139.         JZ      CONTINUELOOP
  140.         MOV     [DI],AH
  141.         INC     DI
  142. CONTINUELOOP:
  143.         INC     BX
  144.         LOOP    L_1
  145.         RET
  146. GET_PARAMS      ENDP
  147.  
  148. ALLOCATEBUFFERS PROC    NEAR
  149.         MOV     AX,4800H
  150.         MOV     BX,0100H                        ;100h paragraphs
  151.         INT     21H
  152.         JC      ERROR
  153.         MOV     DRIVERSEGMENT,AX
  154.         MOV     AH,48H
  155.         MOV     BX,0800H                        ;FAA pararaphs
  156.         INT     21H
  157.         JC      ERROR
  158.         MOV     VOICEFILESEG,AX
  159.         MOV     AH,48H
  160.         MOV     BX,0800H                        ;FAA pararaphs
  161.         INT     21H
  162.         JC      ERROR
  163.         MOV     VOICEFILESEG2,AX
  164.         CLC
  165.         RET
  166. ERROR:  LEA     DX,MEMERROR
  167.         MOV     AH,9
  168.         INT     21H
  169.         STC
  170.         RET
  171. ALLOCATEBUFFERS ENDP
  172.  
  173. INITIALIZEDRIVER PROC   NEAR
  174.         MOV     BX,3
  175.         CALL    DWORD PTR SOUNDDRIVER           ;Init Driver call
  176.         CMP     AX,0
  177.         JNZ     DRIVER_ERROR
  178.         MOV     BX,4                            ;Turn on speaker
  179.         MOV     AL,1
  180.         CALL    DWORD PTR SOUNDDRIVER
  181.         MOV     AX,DS                           ;Set status word
  182.         MOV     ES,AX
  183.         MOV     DI, OFFSET CARDSTATUS
  184.         MOV     BX,5
  185.         CALL    DWORD PTR SOUNDDRIVER
  186.         CLC
  187.         RET
  188. DRIVER_ERROR:
  189.         LEA     DX,D_MESSAGE
  190.         MOV     AH,9
  191.         INT     21H
  192.         STC
  193.         RET
  194. INITIALIZEDRIVER ENDP
  195.  
  196. OPENSOUNDFILE   PROC    NEAR
  197.         MOV     AH,3DH                          ;Open File
  198.         MOV     AL,0
  199.         LEA     DX,FILENAME
  200.         INT     21H
  201.         JC      FOPEN_ERROR
  202.         MOV     FILEHANDLE,AX
  203.         MOV     AH,3FH                          ;Read File
  204.         MOV     BX,FILEHANDLE
  205.         MOV     CX,1AH                          ;1A Bytes
  206.         PUSH    DS
  207.         MOV     DX,VOICEFILESEG
  208.         MOV     DS,DX
  209.         MOV     DX,0                            ;To offset 0
  210.         INT     21H                             ;Read them
  211.         POP     DS
  212.         CLC
  213.         RET
  214. FOPEN_ERROR:
  215.         LEA     DX,F_MESSAGE
  216.         MOV     AH,9
  217.         INT     21H
  218.         STC
  219.         RET
  220. OPENSOUNDFILE   ENDP
  221.  
  222. LOADDRIVER      PROC    NEAR
  223.         MOV     AH,3DH                          ;Open File
  224.         MOV     AL,0
  225.         LEA     DX,DRIVERFILE
  226.         INT     21H
  227.         JC      ERROR_D
  228.         MOV     FILEHANDLE,AX           ;NOW ACTUALLY READ THE DRIVER
  229.         MOV     BX,FILEHANDLE
  230.         MOV     AX,DRIVERSEGMENT
  231.         MOV     CX,5000                         ;5000 Bytes - This is larger
  232.         MOV     DX,0                            ;than the file.
  233.         PUSH    DS
  234.         MOV     DS,AX
  235.         MOV     AH,3FH                          ;Read File Function
  236.         INT     21H
  237.         POP     DS
  238.         MOV     AH,3EH                          ;Close File
  239.         MOV     BX,FILEHANDLE
  240.         INT     21H
  241.         CLC
  242.         RET
  243. ERROR_D:
  244.         LEA     DX,DRIVERFILEERR
  245.         MOV     AH,9
  246.         INT     21H
  247.         MOV     AH,3EH
  248.         MOV     BX,FILEHANDLE
  249.         INT     21H
  250.         STC
  251.         RET
  252. LOADDRIVER      ENDP
  253.  
  254. PLAYSOUND       PROC    NEAR
  255.         MOV     AX,VOICEFILESEG
  256.         MOV     ES,AX
  257.         MOV     AX,VOICEFILESEG2
  258.         PUSH    DS
  259.         MOV     DS,AX
  260.         MOV     CX,100                          ;Clear 100 locations just
  261.         XOR     AX,AX                           ;to be safe
  262.         MOV     BX,30000                        ;Offset after Voice data
  263. FILLBYTES:
  264.         MOV     ES:[BX],AX
  265.         MOV     DS:[BX],AX
  266.         INC     BX
  267.         LOOP    FILLBYTES
  268.         POP     DS
  269.         MOV     AH,3FH                          ;Read File
  270.         MOV     BX,FILEHANDLE
  271.         MOV     CX,6                            ;6 bytes
  272.         PUSH    DS                              ;These are the block number,
  273.         MOV     DX,VOICEFILESEG                 ;file size, sampling rate and
  274.         MOV     DS,DX                           ;encoding method.
  275.         MOV     DX,0                            ;Load to DS:0
  276.         INT     21H
  277.         POP     DS
  278.         MOV     AX,VOICEFILESEG
  279.         MOV     BX,VOICEFILESEG2
  280.         PUSH    DS
  281.         MOV     DS,AX
  282.         MOV     ES,BX
  283.         MOV     CX,6
  284.         MOV     SI,0
  285.         MOV     DI,SI
  286.         CLD
  287.         REP     MOVSB
  288.         POP     DS
  289.  
  290. LOOP1:  MOV     CX,30000                        ;30000 Bytes
  291.         MOV     BX,FILEHANDLE
  292.         MOV     AX,3F00H                        ;Read File
  293.         MOV     DX,VOICEFILESEG
  294.         PUSH    DS
  295.         MOV     DS,DX
  296.         MOV     DX,6                            ;Load to DS:6
  297.         INT     21H
  298.         POP     DS
  299.         CMP     AX,CX                           ;Check number of Bytes Read
  300.         JZ      CONT
  301.         MOV     DX,0                            ;Set more to 0 at EOF
  302.         MOV     MORE,DX
  303. CONT:   MOV     BX,1                            ;File Size location
  304.         MOV     CX,VOICEFILESEG
  305.         MOV     ES,CX
  306.         MOV     ES:[BX],AL                      ;File Size High byte
  307.         INC     BX
  308.         MOV     ES:[BX],AH                      ;File Size Low byte
  309.         INC     BX
  310.         MOV     CX,0
  311.         MOV     ES:[BX],CL                      ;File Size Last byte
  312.         MOV     DI,0                            ;Offset of voice block
  313. ALOOP2: MOV     BX,CARDSTATUS                   ;Wait for voice to finish
  314.         CMP     BX,0                            ;playing.
  315.         JNZ     ALOOP2
  316.         MOV     BX,6                            ;Play Voice
  317.         CALL    DWORD PTR SOUNDDRIVER
  318.         MOV     AX,MORE
  319.         CMP     AX,1                            ;Should we continue?
  320.         JNZ     FINISH
  321.         JMP     BLOOP1
  322.  
  323. GOBACK: JMP     LOOP1                           ;A little kludge to jump back
  324.  
  325. BLOOP1: MOV     CX,30000                        ;30000 Bytes
  326.         MOV     BX,FILEHANDLE
  327.         MOV     AX,3F00H                        ;Read File
  328.         MOV     DX,VOICEFILESEG2
  329.         PUSH    DS
  330.         MOV     DS,DX
  331.         MOV     DX,6                            ;Load to DS:6
  332.         INT     21H
  333.         POP     DS
  334.         CMP     AX,CX                           ;Check number of Bytes Read
  335.         JZ      BCONT
  336.         MOV     DX,0                            ;Set more to 0 at EOF
  337.         MOV     MORE,DX
  338. BCONT:  MOV     BX,1                            ;File Size location
  339.         MOV     CX,VOICEFILESEG2
  340.         MOV     ES,CX
  341.         MOV     ES:[BX],AL                      ;File Size High byte
  342.         INC     BX
  343.         MOV     ES:[BX],AH                      ;File Size Low byte
  344.         INC     BX
  345.         MOV     CX,0
  346.         MOV     ES:[BX],CL                      ;File Size Last byte
  347.         MOV     DI,0                            ;Offset of voice block
  348. BLOOP2: MOV     BX,CARDSTATUS                   ;Wait for voice to finish
  349.         CMP     BX,0                            ;playing.
  350.         JNZ     BLOOP2
  351.         MOV     BX,6                            ;Play Voice
  352.         CALL    DWORD PTR SOUNDDRIVER
  353.         MOV     AX,MORE
  354.         CMP     AX,1                            ;Should we continue?
  355.         JZ      GOBACK
  356. FINISH: MOV     AH,3EH                          ;Close File
  357.         MOV     BX,FILEHANDLE
  358.         INT     21H
  359.         RET
  360. PLAYSOUND       ENDP
  361. CODE            ENDS
  362.         END     MAIN
  363.  
  364.  
  365.