home *** CD-ROM | disk | FTP | other *** search
/ C++ Games Programming / CPPGAMES.ISO / digmid / real / digplay.asm next >
Assembly Source File  |  1993-08-30  |  9KB  |  469 lines

  1. ;; DIGPLAY.ASM            August 15, 1991, John W. Ratciff
  2. ;;
  3. ;; This piece of source provides C procedure call hooks down into
  4. ;; the resident TSR sound driver.  Use the call CheckIn to find out
  5. ;; if the sound driver is in memory.  See the C header file DIGPLAY.H
  6. ;; for prototype information.
  7. ;;
  8. ;; This file is in the format for Turbo Assembler's IDEAL mode.  The
  9. ;; IDEAL mode syntax makes a lot more sense for 8086 than the old
  10. ;; MASM format.  MASM has recently been updated to provide some of the
  11. ;; functions that Turbo Assembler has had for a number of years.  I prefer
  12. ;; to consider Turbo Assembler the standard for 8086 assemblers.
  13. ;; IDEAL mode functionality includes true local labels, real data structures,
  14. ;; typecasting, automatic argument passing and local memory.
  15. ;; Converting any of this code into MASM format is an excercise left for
  16. ;; the student.
  17.  
  18.  
  19.     LOCALS            ;; Enable local labels
  20.  
  21.         IDEAL                   ;; Use Turbo Assembler's IDEAL mode
  22.     JUMPS
  23.  
  24. IFNDEF    LOADABLE_DRIVERS        ; If not already defined.
  25. LOADABLE_DRIVERS    equ    1    ; Set true to enable
  26. ENDIF
  27.     ; Driver load and unload calls.  Requires that the application provide
  28.     ; memory allocation functions and access to DOSCALLS.OBJ.
  29.  
  30. SMALL_MODEL    equ    0   ;: True if declaring C procedures as near.
  31.             ; It is false here because all procedures are
  32.             ; far, so that you can link any memory model
  33.             ; to theme. (They are prototyped as well.)
  34.  
  35.  
  36.         INCLUDE "PROLOGUE.MAC"          ;; common prologue
  37.  
  38.  
  39. SEGMENT  _TEXT BYTE PUBLIC 'CODE'               ;; Set up _TEXT segment
  40.         ENDS
  41.  
  42.     ASSUME    CS: _TEXT, DS: _TEXT, SS: NOTHING, ES: NOTHING
  43.  
  44. SEGMENT _TEXT
  45.  
  46. Macro    CPROC    name        ; Macro to establish a C callable procedure.
  47.     public    _&name
  48. IF    SMALL_MODEL
  49. Proc    _&name    near
  50. ELSE
  51. Proc    _&name    far
  52. ENDIF
  53.     endm
  54.  
  55. ;;    int  DigPlay(SNDSTRUC far *sndplay);         // 688h -> Play 8 bit digitized sound.
  56. CPROC    DigPlay
  57.     ARG    DATA:DWORD
  58.     PENTER    0
  59.     push    ds
  60.     push    si
  61.  
  62.     call    CheckIn        ; Is sound driver in memory?
  63.     or    ax,ax        ; no-> don't invoke interupt...
  64.     jz    @@EXT        ;
  65.     mov    ax,0688h    ; Function #1, DigPlay
  66.     lds    si,[DATA]    ; Data structure.
  67.     int    66h        ; Do sound interupt.
  68.     mov    ax,1        ; Return sound played.
  69. @@EXT:
  70.     pop    si
  71.     pop    ds
  72.     PLEAVE
  73.     ret
  74.     endp
  75.  
  76. ;;    int  SoundStatus(void);                      // 689h -> Report sound driver status.
  77. CPROC    SoundStatus
  78.     mov    ax,0689h    ; Check sound status.
  79.     int    66h        ; Sound driver interrupt.
  80.     ret
  81.     endp
  82.  
  83. ;;    void MassageAudio(SNDSTRUC far *sndplay);// 68Ah -> Preformat 8 bit digitized sound.
  84. CPROC    MassageAudio
  85.     ARG    DATA:DWORD
  86.     PENTER    0
  87.     push    ds
  88.     push    si
  89.  
  90.     mov    ax,068Ah    ; Identity
  91.     lds    si,[DATA]    ; Data structure.
  92.     int    66h        ; Do sound interupt.
  93.  
  94.     pop    si
  95.     pop    ds
  96.     PLEAVE
  97.     ret
  98.     endp
  99.  
  100. ;;    int  DigPlay2(SNDSTRUC far *sndplay);  // 68Bh -> Play preformatted data.
  101. CPROC    DigPlay2
  102.     ARG    DATA:DWORD
  103.     PENTER    0
  104.     push    ds
  105.     push    si
  106.  
  107.     mov    ax,068Bh    ; Identity
  108.     lds    si,[DATA]    ; Data structure.
  109.     int    66h        ; Do sound interupt.
  110.  
  111.     pop    si
  112.     pop    ds
  113.     PLEAVE
  114.     ret
  115.     endp
  116.  
  117. ;;    int  DigPlayLoop(SNDSTRUC far *sndplay);  // 6894 -> Play preformatted data.
  118. CPROC    DigPlayLoop
  119.     ARG    DATA:DWORD
  120.     PENTER    0
  121.     push    ds
  122.     push    si
  123.  
  124.     mov    ax,0694h    ; Identity
  125.     lds    si,[DATA]    ; Data structure.
  126.     int    66h        ; Do sound interupt.
  127.  
  128.     pop    si
  129.     pop    ds
  130.     PLEAVE
  131.     ret
  132.     endp
  133.  
  134. ;;    int  AudioCapabilities(void);         // 68Ch -> Report audio driver capabilities.
  135. CPROC    AudioCapabilities
  136.     mov    ax,068Ch    ; Check sound status.
  137.     int    66h
  138.     ret
  139.     endp
  140.  
  141. ;;int  far DigPakIdentityString(char far *str);
  142. ;; 68Ch -> reports ID string of resident driver.
  143. ;; returns length of string.
  144. CPROC    DigPakIdentityString
  145.     ARG    string:DWORD
  146.     PENTER    0
  147.     PushCREGS
  148.  
  149.     mov    ax,68Ch
  150.     int    66h
  151.     les    di,[string]
  152.     mov    ds,bx
  153.     mov    si,cx
  154.     mov    cx,-1
  155. @@MV:    lodsb
  156.     stosb
  157.     inc    cx
  158.     or    al,al
  159.     jnz    @@MV
  160.     mov    ax,cx        ; Return string length.
  161.  
  162.     PopCREGS
  163.     PLEAVE
  164.     ret
  165.     endp
  166.  
  167. ;;    int  ReportSample(void);                     // 68Dh -> Report current sample address.
  168. CPROC    ReportSample
  169.     mov    ax,068Dh    ; Report audio sample.
  170.     int    66h
  171.     ret
  172.     endp
  173.  
  174. ;; void SetCallBackAddress(void far *proc); // 68Eh -> Set procedure callback address.
  175. CPROC    SetCallBackAddress
  176.     ARG    COFF:WORD,CSEG:WORD
  177.     PENTER    0
  178.  
  179.     mov    bx,[COFF]
  180.     mov    dx,[CSEG]
  181.     mov    ax,68Eh
  182.     int    66h
  183.  
  184.     PLEAVE
  185.     ret
  186.     endp
  187.  
  188. ;; void StopSound(void);    // 68Fh -> Stop current sound from playing.
  189. CPROC    StopSound
  190.     mov    ax,68Fh
  191.     int    66h
  192.     ret
  193.     endp
  194.  
  195. CPROC    SetAudioHardware
  196.     ARG    IRQ:WORD,BASEADR:WORD,OTHER:WORD
  197.     PENTER    0
  198.     mov    ax,690h
  199.     mov    bx,[IRQ]
  200.     mov    cx,[BASEADR]
  201.     mov    dx,[OTHER]
  202.     int    66h
  203.     PLEAVE
  204.     ret
  205.     endp
  206.  
  207. CPROC    ReportCallbackAddress
  208.     mov    ax,691h
  209.     int    66h
  210.     ret
  211.     endp
  212.  
  213. CPROC    WaitSound
  214. @@WS:    mov    ax,689h
  215.     int    66h
  216.     or    ax,ax
  217.     jnz    @@WS
  218.     ret
  219.     endp
  220.  
  221. CPROC    PostAudioPending
  222.     ARG    SOUND:DWORD
  223.     PENTER    0
  224.     push    ds
  225.     push    si
  226.     lds    si,[SOUND]
  227.     mov    ax,0695h
  228.     int    66h
  229.     pop    si
  230.     pop    ds
  231.     PLEAVE
  232.     ret
  233.     endp
  234.  
  235. CPROC    AudioPendingStatus
  236.     mov    ax,696h
  237.     int    66h
  238.     ret
  239.     endp
  240.  
  241. CPROC    SetStereoPan
  242.     ARG    PAN:WORD
  243.     PENTER    0
  244.  
  245.     mov    dx,[PAN]
  246.     mov    ax,697h
  247.     int    66h
  248.  
  249.     PLEAVE
  250.     ret
  251.     endp
  252.  
  253. CPROC    SetPlayMode
  254.     ARG    MODE:WORD
  255.     PENTER    0
  256.  
  257.     mov    dx,[MODE]
  258.     mov    ax,698h
  259.     int    66h
  260.  
  261.     PLEAVE
  262.     ret
  263.     endp
  264.  
  265. CPROC    PendingAddress
  266.     mov    ax,699h
  267.     int    66h
  268.     ret
  269.     endp
  270.  
  271. CPROC    ReportSemaphoreAddress
  272.     mov    ax,699h
  273.     int    66h
  274.     mov    ax,bx        ; Move semaphore address into AX
  275.     ret
  276.     endp
  277.  
  278. CPROC    ReportVersionNumber
  279.     xor    bx,bx        ; Default version number.
  280.     mov    ax,0689h    ; Get version number/status call.
  281.     int    66h
  282.     mov    ax,bx        ; Return version number.
  283.     ret
  284.     endp
  285.  
  286. CPROC    StopNextLoop
  287.     mov    ax,69Bh
  288.     int    66h
  289.     ret
  290.     endp
  291.  
  292. CPROC    SetTimerDivisorRate
  293.     ARG    RATE:WORD
  294.     PENTER    0
  295.  
  296.     mov    ax,693h
  297.     mov    dx,[RATE]
  298.     int    66h
  299.  
  300.     PLEAVE
  301.     ret
  302.     endp
  303.  
  304. CPROC    SetRecordMode
  305.     ARG    MODE:WORD
  306.     PENTER    0
  307.  
  308.     mov    dx,[MODE]
  309.     mov    ax,69Ah
  310.     int    66h
  311.  
  312.     PLEAVE
  313.     ret
  314.     endp
  315.  
  316.  
  317. CPROC    SetBackFillMode
  318.     ARG    MODE:WORD
  319.     PENTER    0
  320.  
  321.     mov    dx,[MODE]
  322.     mov    ax,69Ch
  323.     int    66h
  324.  
  325.     PLEAVE
  326.     ret
  327.     endp
  328.  
  329. CPROC    ReportDMAC
  330.     mov    ax,69Dh
  331.     int    66h
  332.     ret
  333.     endp
  334.  
  335.  
  336. CPROC    NullSound
  337.     ARG    SOUND:DWORD,SNDLEN:WORD,VALUE:WORD
  338.     PENTER    0
  339.     PushCREGS
  340.  
  341.     les    di,[SOUND]
  342.     mov    ax,[VALUE]
  343.     mov    cx,[SNDLEN]
  344.     rep    stosb
  345.  
  346.     PopCREGS
  347.     PLEAVE
  348.     ret
  349.     endp
  350.  
  351. CPROC    VerifyDMA
  352.     ARG    SDATA:DWORD,SLEN:WORD
  353.     PENTER    0
  354.     push    es
  355.  
  356.     les    bx,[SDATA]
  357.     mov    cx,[SLEN]
  358.     mov    ax,69Eh
  359.     int    66h
  360.  
  361.     pop    es
  362.     PLEAVE
  363.     ret
  364.     endp
  365.  
  366. ;;    int  CheckIn(void);                             // Is sound driver available?
  367. CPROC    CheckIn
  368.     call    CheckIn
  369.     ret
  370.     endp
  371.  
  372. Proc    CheckIn near
  373.     push    ds        ; Save ds register.
  374.     push    si
  375.  
  376.     mov    si,66h*4h    ; get vector number
  377.         xor     ax,ax           ; zero
  378.         mov     ds,ax           ; point it there
  379.     lds    si,[ds:si]    ; get address of interupt vector
  380.         or      si,si           ; zero?
  381.         jz      @@CIOUT         ; exit if zero
  382.         sub     si,6            ; point back to identifier
  383.  
  384.     cmp    [word si],'IM'  ; Midi driver?
  385.     jne    @@NEX
  386.     cmp    [word si+2],'ID'  ; full midi driver identity string?
  387.     jne    @@NEX
  388. ;; Ok, a MIDI driver is loaded at this address.
  389.     mov    ax,701h     ; Digitized Sound capabilities request.
  390.     int    66h        ; Request.
  391.     or    ax,ax        ; digitized sound driver available?
  392.     jnz    @@OK        ; yes, report that to the caller.
  393.     jz    @@CIOUT     ; exit, sound driver not available.
  394. @@NEX:
  395.     cmp    [word si],454Bh ; equal?
  396.         jne     @@CIOUT         ; exit if not equal
  397.     cmp    [word si+2],4E52h    ; equal?
  398.         jne     @@CIOUT
  399. @@OK:    mov    ax,1
  400. @@EXT:
  401.     pop    si
  402.     pop    ds
  403.     ret
  404. @@CIOUT: xor    ax,ax        ; Zero return code.
  405.     jmp short @@EXT
  406.     endp
  407.  
  408. IF    LOADABLE_DRIVERS
  409. ;; Local data area for calling into a loadable sound driver.
  410. LABEL    InstallDriver    DWORD
  411. InstOff dw    0200h    ; Offset of first jump.
  412. InstSeg dw    ?    ; Segment of audio driver.
  413. LABEL    DeInstallDriver DWORD
  414. DeInstOff dw    0203h    ; Offset of deinstall jump
  415. DeInstSeg dw    ?    ; Segment of audio driver.
  416.  
  417. CPROC    InitDP
  418.     ARG    LOADADR:WORD
  419.     PENTER    0
  420.     PushCREGS
  421.  
  422.     mov    ax,[LOADADR] ; Save segment loaded at.
  423.     mov    es,ax        ; Into ES
  424.     sub    ax,10h        ; Less 10 paragraphs for the org 100h
  425. ;; Check Identity string 'DIGPAK' if not located starting 3 bytes into
  426. ;; the file loaded, then this is not a compatible digitized sound driver.
  427.     cmp    [byte es:3],'D' ; D in DIGPAK?
  428.     jne    @@FREE
  429.     cmp    [byte es:4],'I' ; I in DIGPAK?
  430.     jne    @@FREE
  431.     cmp    [byte es:5],'G' ; G in DIGPAK?
  432.     jne    @@FREE
  433.     cmp    [byte es:6],'P' ; P in DIGPAK?
  434.     jne    @@FREE
  435.     cmp    [byte es:7],'A' ; A in DIGPAK?
  436.     jne    @@FREE
  437.     cmp    [byte es:8],'K' ; K in DIGPAK?
  438.     jne    @@FREE
  439.     mov    [cs:InstSeg],ax
  440.     call    [cs:InstallDriver]    ; Install the driver.
  441.     or    ax,ax        ; Installed ok?
  442.     jz    @@OK1
  443. @@FREE:
  444.     xor    ax,ax
  445.     jmp    short @@EXT    ; Exit with error.
  446. @@OK1:    mov    ax,1        ; Success!
  447. @@EXT:
  448.     PopCREGS
  449.     PLEAVE
  450.     ret
  451.     endp
  452.  
  453. CPROC    DeInitDP
  454.     ARG    ADDRESS:WORD
  455.     PENTER    0
  456.  
  457.     mov    ax,[ADDRESS]
  458.     sub    ax,10h
  459.     mov    [cs:DeInstSeg],ax    ; Set segment.
  460.     call    [cs:DeInstallDriver]       ; Do indirect call to deinstall the driver.
  461.  
  462.     PLEAVE
  463.     ret
  464.     endp
  465. ENDIF
  466.  
  467.     ends
  468.     end
  469.