home *** CD-ROM | disk | FTP | other *** search
/ Sound Sensations! / sound_sensations.iso / voice / digitol1 / play.asm < prev    next >
Assembly Source File  |  1987-03-28  |  4KB  |  326 lines

  1. COUNTR    EQU    72 ;16572 HZ
  2.  
  3. TCADRC    EQU    43H
  4. TCADRD    EQU    40H
  5.  
  6. TCMODE    EQU    34H
  7. TC2MODE    EQU    0B8H
  8.  
  9. PPIADR    EQU    61H
  10. NORMPPI    EQU    48H
  11.  
  12. ;-------------------------------------------
  13.  
  14. STK    SEGMENT    STACK
  15.     DW    128 DUP (0)
  16. STK    ENDS
  17.  
  18. ;-------------------------------------------
  19.  
  20. CODE    SEGMENT    PARA
  21.     ASSUME    CS:CODE,DS:CODE,SS:STK
  22.     ASSUME    ES:NOTHING
  23.  
  24. ;-------------------------------------------
  25.  
  26. FILELEN    DW    0
  27. HANDLE    DW    0
  28. MSG2    DB    'Disk error',0DH,0AH,24H
  29.  
  30. ;-------------------------------------------
  31.  
  32. START:
  33.  
  34.     CALL    PARSESGL
  35.  
  36. ;set DS and ES
  37.  
  38.     PUSH    CS
  39.     POP    DS
  40.     PUSH    CS
  41.     POP    ES
  42.  
  43. ;open the file
  44.  
  45.     MOV    DX,OFFSET PARM
  46.     MOV    AX,3D00H
  47.     INT    21H
  48.     JNC    L1
  49.     JMP    DSKERR
  50. L1:    MOV    HANDLE,AX
  51.  
  52. ;read the file
  53.  
  54.     PUSH    DS
  55.     MOV    BX,HANDLE
  56.     MOV    AX,HIMEM
  57.     MOV    DS,AX
  58.     ASSUME    DS:NOTHING
  59.     MOV    DX,0
  60.     MOV    CX,0FFFFH
  61.     MOV    AH,3FH
  62.     INT    21H
  63.     POP    DS
  64.     ASSUME    DS:CODE
  65.     JNC    L2
  66.     JMP    DSKERR
  67. L2:    MOV    FILELEN,AX
  68.  
  69. ;close the file
  70.  
  71.     MOV    BX,HANDLE
  72.     MOV    AH,3EH
  73.     INT    21H
  74.  
  75. ;get vector of timer current timer interrupt
  76.  
  77.     MOV    AX,3508H
  78.     INT    21H
  79.     MOV    WORD PTR OLDTMRINT,BX
  80.     MOV    WORD PTR OLDTMRINT+2,ES
  81.  
  82. ;mask timer interrupt
  83.  
  84.     IN    AL,21H
  85.     OR    AL,01H
  86.     OUT    21H,AL
  87.  
  88. ;plug in the local timer interrupt routine
  89.  
  90.     MOV    DX,OFFSET TIMERINT
  91.     MOV    AX,2508H
  92.     INT    21H
  93.  
  94. ;rev up timer
  95.  
  96.     MOV    AL,TCMODE
  97.     OUT    TCADRC,AL
  98.     MOV    AX,COUNTR
  99.     OUT    TCADRD,AL
  100.     MOV    AL,AH
  101.     OUT    TCADRD,AL
  102.  
  103. ;set DS
  104.  
  105.     ASSUME    DS:NOTHING
  106.     MOV    AX,HIMEM
  107.     MOV    DS,AX
  108.  
  109. ;initialize registers
  110.  
  111.     MOV    BP,0
  112.     MOV    BX,0
  113.     MOV    CH,[BX]
  114.     MOV    AH,0
  115.     MOV    DX,PPIADR
  116.  
  117. ;unmask timer interrupt
  118.  
  119.     IN    AL,21H
  120.     AND    AL,0FEH
  121.     OUT    21H,AL
  122.     STI
  123.  
  124. ;test for done
  125.  
  126. TFD:
  127.     OR    BP,BP
  128.     JE    TFD
  129.  
  130. ;mask timer interrupt
  131.  
  132.     CLI
  133.     IN    AL,21H
  134.     OR    AL,01H
  135.     OUT    21H,AL
  136.     STI
  137.  
  138. ;fix DS
  139.  
  140.     MOV    AX,CS
  141.     MOV    DS,AX
  142.     ASSUME    DS:CODE
  143.  
  144. ;fix timer
  145.  
  146.     MOV    AL,TCMODE
  147.     OUT    TCADRC,AL
  148.     MOV    AL,0
  149.     OUT    TCADRD,AL
  150.     OUT    TCADRD,AL
  151.  
  152. ;restore original timer interrupt vector
  153.  
  154.     PUSH    DS
  155.     LDS    DX,CS:OLDTMRINT
  156.     MOV    AX,2508H
  157.     INT    21H
  158.     POP    DS
  159.  
  160. ;unmask timer interrupt
  161.  
  162.     IN    AL,21H
  163.     AND    AL,0FEH
  164.     OUT    21H,AL
  165.  
  166. ;figure out how long the system 18.2 Hz
  167. ; timer has been off
  168.  
  169.     MOV    AX,COUNTR
  170.     SHL    AX,1
  171.     SHL    AX,1
  172.     SHL    AX,1
  173.     MOV    CX,FILELEN
  174.     MUL    CX
  175.  
  176. ;adjust the BIOS time of day to catch up
  177.  
  178.     PUSH    ES
  179.     MOV    AX,40H
  180.     MOV    ES,AX
  181.     MOV    BX,6CH
  182.     CLI
  183.     ADD    ES:[BX],DX
  184.     ADC    WORD PTR ES:[BX+2],0
  185.     CMP    WORD PTR ES:[BX+2],18H
  186.     JB    BIOSFIXED
  187.     JA    WRAP
  188.     CMP    WORD PTR ES:[BX],0B0H
  189.     JB    BIOSFIXED
  190. WRAP:    SUB    WORD PTR ES:[BX],0B0H
  191.     SBB    WORD PTR ES:[BX+2],18H
  192. BIOSFIXED: STI
  193.     POP    ES
  194.  
  195. ;exit
  196.  
  197.     MOV    AX,4C00H
  198.     INT    21H
  199.  
  200. ;disk error message
  201.  
  202. DSKERR:
  203.     MOV    AX,CS
  204.     MOV    DS,AX
  205.     MOV    DX,OFFSET MSG2
  206.     MOV    AH,9
  207.     INT    21H
  208.     MOV    AX,4C01H
  209.     INT    21H
  210.  
  211. ;-------------------------------------------
  212.  
  213. ;timer interrupt routine
  214.  
  215.     ASSUME    DS:NOTHING,ES:NOTHING
  216.     ASSUME    SS:NOTHING
  217.  
  218.     EVEN
  219.  
  220. OLDTMRINT DD    0
  221.  
  222. TIMERINT PROC    FAR
  223.  
  224.     OR    BP,BP
  225.     JNZ    TMRINT1
  226.  
  227.     SUB    AL,AL
  228.     RCL    CH,1
  229.     RCL    AL,1
  230.     RCL    AL,1
  231.     OR    AL,NORMPPI
  232.     OUT    DX,AL
  233.  
  234.     INC    AH
  235.     CMP    AH,8
  236.     JNE    TMRINT1
  237.     SUB    AH,AH
  238.  
  239.     INC    BX
  240.     MOV    CH,[BX]
  241.     CMP    BX,FILELEN
  242.     JNZ    TMRINT1
  243.     INC    BP
  244.  
  245. TMRINT1:
  246.     MOV    AL,20H
  247.     OUT    20H,AL
  248.     IRET
  249.  
  250. TIMERINT ENDP
  251.  
  252. ;-------------------------------------------
  253.  
  254. PARM    DB    128 DUP (0)
  255.  
  256. SPECERRMSG    DB    'File specification'
  257.     DB    ' error',0DH,0AH,24H
  258.  
  259. ;it is assumed that DS and ES both point
  260. ; to the PSP.
  261.  
  262. PARSESGL    PROC
  263.  
  264.     CLD
  265.     MOV    DI,80H
  266.     MOV    CL,[DI]
  267.     SUB    CH,CH
  268.     INC    DI
  269.  
  270.     CMP    CX,1
  271.     JBE    PARSS4
  272.  
  273. ;find first non-blank character
  274.  
  275.     MOV    AL,20H
  276.     REPE    SCASB
  277.     JNE    PARSS2
  278. PARSS4:    PUSH    CS
  279.     POP    DS
  280.     MOV    DX,OFFSET SPECERRMSG
  281.     MOV    AH,9
  282.     INT    21H
  283.     MOV    AX,4C01H
  284.     INT    21H
  285.  
  286. ;find next blank character or end
  287.  
  288. PARSS2:
  289.     DEC    DI
  290.     INC    CX
  291.     MOV    BX,DI
  292.     REPNE    SCASB
  293.  
  294. ;save parameter
  295.  
  296.     JCXZ    PARSS3
  297.     DEC    DI
  298. PARSS3:    PUSH    CX
  299.     PUSH    DI
  300.     PUSH    ES
  301.     PUSH    CS
  302.     POP    ES
  303.     MOV    CX,DI
  304.     SUB    CX,BX
  305.     MOV    SI,BX
  306.     MOV    DI,OFFSET PARM
  307.     REP    MOVSB
  308.     POP    ES
  309.     POP    DI
  310.     POP    CX
  311.  
  312.     RET
  313.  
  314. PARSESGL    ENDP
  315.  
  316. ;-------------------------------------------
  317.  
  318. CODE    ENDS
  319.  
  320. ;-------------------------------------------
  321.  
  322. HIMEM    SEGMENT    PARA
  323. HIMEM    ENDS
  324.  
  325.     END    START
  326.