home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / s / scrd_asm.zip / SOUNDBL.TXT < prev   
Text File  |  1992-06-01  |  25KB  |  557 lines

  1.  
  2. ────────────────────────────────────────────────────────────────────────────────
  3. Area : Machine Language Heads
  4. From : Coridon Henshaw                     31-May-92 13:08:42
  5. To   : Les Kirk                            01-Jun-92 08:12:00
  6. Subj.: Sound Blaster                                                            
  7.  
  8. In a msg on <May 28 06:49>, Les Kirk of 1:3639/11 writes:
  9.  
  10.  LK> > LK> If you find out anything,  let me know....PLEASE!!
  11.  LK> > See my last string of posts, they tell you how to access the
  12.  LK> > FM chips.
  13.  LK> Didnt get it.  Can you repost?
  14. Yup!  Coming up in the next few messages.....
  15.  
  16. --- msgedsq 2.0.5
  17.  * Origin: -=- Point Blank -=- Support Fidonet Reform -=- (1:250/804.200)
  18.  
  19.  
  20. ────────────────────────────────────────────────────────────────────────────────
  21. Area : Machine Language Heads
  22. From : Coridon Henshaw                     31-May-92 13:23:54
  23. To   : Les Kirk                            01-Jun-92 08:12:00
  24. Subj.: Sound Blaster programing                                                 
  25.  
  26.  
  27. ───────────────────────────────────────────────────────────────────────────────
  28.  
  29.                       Programming the AdLib/Sound Blaster
  30.                                 FM Music Chips
  31.                            Version 2.0 (24 Feb 1992)
  32.  
  33.                   Copyright (c) 1991, 1992 by Jeffrey S. Lee
  34.  
  35.                                jlee@smylex.uucp
  36.  
  37.  
  38.  
  39.                         Warranty and Copyright Policy
  40.  
  41.      This document is provided on an "as-is" basis, and its author makes
  42.      no warranty or representation, express or implied, with respect to
  43.      its quality performance or fitness for a particular purpose.  In no
  44.      event will the author of this document be liable for direct, indirect,
  45.      special, incidental, or consequential damages arising out of the use
  46.      or inability to use the information contained within.  Use of this
  47.      document is at your own risk.
  48.  
  49.      This file may be used and copied freely so long as the applicable
  50.      copyright notices are retained, and no modifications are made to the
  51.      text of the document.  No money shall be charged for its distribution
  52.      beyond reasonable shipping, handling and duplication costs, nor shall
  53.      proprietary changes be made to this document so that it cannot be
  54.      distributed freely.  This document may not be included in published
  55.      material or commercial packages without the written consent of its
  56.      author.
  57.  
  58.  
  59.  
  60.                                    Overview
  61.  
  62.      Two of the most popular sound cards for the IBM-PC, the AdLib and the
  63.      Sound Blaster, suffer from a real dearth of clear documentation for
  64.      programmers.  AdLib Inc. and Creative Labs, Inc. both sell developers'
  65.      kits for their sound cards, but these are expensive, and (in the case
  66.      of the Sound Blaster developers' kit) can be extremely cryptic.
  67.  
  68.      This document is intended to provide programmers with a FREE source
  69.      of information about the programming of these sound cards.
  70.  
  71.      The information contained in this document is a combination of
  72.      information found in the Sound Blaster Software Developer's Kit, and
  73.      that learned by painful experience.  Some of the information may not
  74.      be valid for AdLib cards; if this is so, I apologize in advance.
  75.  
  76.      Please note that numbers will be given in hexadecimal, unless otherwise
  77.      indicated.  If a number is written out longhand (sixteen instead of 16)
  78.      it is in decimal.
  79.  
  80.  │   Changes from Version 1 of the file will be indicated by the use of change
  81.  │   bars in the left-hand margin.
  82.  
  83.  
  84.  
  85.                          Chapter One - Sound Card I/O
  86.  
  87.      The sound card is programmed by sending data to its internal registers
  88.      via its two I/O ports:
  89.  
  90.              0388 (hex) - Address/Status port  (R/W)
  91.              0389 (hex) - Data port            (W/O)
  92.  
  93.  │   The Sound Blaster Pro is capable of stereo FM music, which is accessed
  94.  │   in exactly the same manner.  Ports 0220 and 0221 (hex) are the address/
  95.  │   data ports for the left speaker, and ports 0222 and 0223 (hex) are the
  96.  │   ports for the right speaker.  Ports 0388 and 0389 (hex) will cause both
  97.  │   speakers to output sound.
  98.  
  99.      The sound card possesses an array of two hundred forty-four registers;
  100.      to write to a particular register, send the register number (01-F5) to
  101.      the address port, and the desired value to the data port.
  102.  
  103.      After writing to the register port, you must wait twelve cycles before
  104.      sending the data; after writing the data, eighty-four cycles must elapse
  105.      before any other sound card operation may be performed.
  106.  
  107.  │   The AdLib manual gives the wait times in microseconds: three point three
  108.  │   (3.3) microseconds for the address, and twenty-three (23) microseconds
  109.  │   for the data.
  110.  │
  111.  │   The most accurate method of producing the delay is to read the register
  112.  │   port six times after writing to the register port, and read the register
  113.  │   port thirty-five times after writing to the data port.
  114.  
  115.      The sound card registers are write-only.
  116.  
  117.      The address port also functions as a sound card status byte.  To
  118.      retrieve the sound card's status, simply read port 388.  The status
  119.      byte has the following structure:
  120.  
  121.               7      6      5      4      3      2      1      0
  122.           ┌──────┬──────┬──────┬──────────────────────────────────┐
  123.           │ both │ tmr  │ tmr  │              unused              │
  124.           │ tmrs │  1   │  2   │                                  │
  125.           └──────┴──────┴──────┴──────────────────────────────────┘
  126.  
  127. --- msgedsq 2.0.5
  128.  * Origin: -=- Point Blank -=- Support Fidonet Reform -=- (1:250/804.200)
  129.  
  130.  
  131. ────────────────────────────────────────────────────────────────────────────────
  132. Area : Machine Language Heads
  133. From : Coridon Henshaw                     31-May-92 13:24:24
  134. To   : Les Kirk                            01-Jun-92 08:12:00
  135. Subj.: Sound Blaster programing                                                 
  136.  
  137.           Bit 7 - set if either timer has expired.
  138.               6 - set if timer 1 has expired.
  139.               5 - set if timer 2 has expired.
  140.  
  141.  
  142.  
  143.                        Chapter Two - The Registers
  144.  
  145. The following table shows the function of each register in the sound
  146. card.  Registers will be explained in detail after the table.  Registers
  147. not listed are unused.
  148.  
  149.    Address      Function
  150.    ───────      ────────────────────────────────────────────────────
  151.      01         Test LSI / Enable waveform control
  152.      02         Timer 1 data
  153.      03         Timer 2 data
  154.      04         Timer control flags
  155.      08         Speech synthesis mode / Keyboard split note select
  156.    20..35       Amp Mod / Vibrato / EG type / Key Scaling / Multiple
  157.    40..55       Key scaling level / Operator output level
  158.    60..75       Attack Rate / Decay Rate
  159.    80..95       Sustain Level / Release Rate
  160.    A0..A8       Frequency (low 8 bits)
  161.    B0..B8       Key On / Octave / Frequency (high 2 bits)
  162.      BD         AM depth / Vibrato depth / Rhythm control
  163.    C0..C8       Feedback strength / Connection type
  164.    E0..F5       Wave Select
  165.  
  166. The groupings of twenty-two registers (20-35, 40-55, etc.) have an odd
  167. order due to the use of two operators for each FM voice.  The following
  168. table shows the offsets within each group of registers for each operator.
  169.  
  170.  
  171.    Channel        1   2   3   4   5   6   7   8   9
  172.    Operator 1    00  01  02  08  09  0A  10  11  12
  173.    Operator 2    03  04  05  0B  0C  0D  13  14  15
  174.  
  175. Thus, the addresses of the attack/decay bytes for channel 3 are 62 for
  176. the first operator, and 65 for the second.  (The address of the second
  177. operator is always the address of the first operator plus three).
  178.  
  179. To further illustrate the relationship, the addresses needed to control
  180. channel 5 are:
  181.  
  182.     29 - Operator 1  AM/VIB/EG/KSR/Multiplier
  183.     2C - Operator 2  AM/VIB/EG/KSR/Multiplier
  184.     49 - Operator 1  KSL/Output Level
  185.     4C - Operator 2  KSL/Output Level
  186.     69 - Operator 1  Attack/Decay
  187.     6C - Operator 2  Attack/Decay
  188.     89 - Operator 1  Sustain/Release
  189.     8C - Operator 2  Sustain/Release
  190.     A4 -             Frequency (low 8 bits)
  191.     B4 -             Key On/Octave/Frequency (high 2 bits)
  192.     C4 -             Feedback/Connection Type
  193.     E9 - Operator 1  Waveform
  194.     EC - Operator 2  Waveform
  195.  
  196.  
  197.  
  198.                        Explanations of Registers
  199.  
  200. Byte 01 - This byte is normally used to test the LSI device.  All bits
  201.           should normally be zero.  Bit 5, if enabled, allows the FM
  202.           chips to control the waveform of each operator.
  203.  
  204.              7     6     5     4     3     2     1     0
  205.           ┌───────────┬─────┬─────────────────────────────┐
  206.           │   unused  │ WS  │            unused           │
  207.           └───────────┴─────┴─────────────────────────────┘
  208.  
  209.  
  210. Byte 02 - Timer 1 Data.  If Timer 1 is enabled, the value in this
  211.           register will be incremented until it overflows.  Upon
  212.           overflow, the sound card will signal a TIMER interrupt
  213.           (INT 08) and set bits 7 and 6 in its status byte.  The
  214.           value for this timer is incremented every eighty (80)
  215.           microseconds.
  216.  
  217.  
  218. Byte 03 - Timer 2 Data.  If Timer 2 is enabled, the value in this
  219.           register will be incremented until it overflows.  Upon
  220.           overflow, the sound card will signal a TIMER interrupt
  221.           (INT 08) and set bits 7 and 5 in its status byte.  The
  222.           value for this timer is incremented every three hundred
  223.           twenty (320) microseconds.
  224.  
  225.  
  226. Byte 04 - Timer Control Byte
  227.  
  228.         7     6     5     4     3     2     1     0
  229.      ┌─────┬─────┬─────┬─────────────────┬─────┬─────┐
  230.      │ IRQ │ T1  │ T2  │     unused      │ T2  │ T1  │
  231.      │ RST │ MSK │ MSK │                 │ CTL │ CTL │
  232.      └─────┴─────┴─────┴─────────────────┴─────┴─────┘
  233.  
  234.           bit 7 - Resets the flags for timers 1 & 2.  If set,
  235.                   all other bits are ignored.
  236.  
  237. --- msgedsq 2.0.5
  238.  * Origin: -=- Point Blank -=- Support Fidonet Reform -=- (1:250/804.200)
  239.  
  240.  
  241. ────────────────────────────────────────────────────────────────────────────────
  242. Area : Machine Language Heads
  243. From : Coridon Henshaw                     31-May-92 13:24:42
  244. To   : Les Kirk                            01-Jun-92 08:12:00
  245. Subj.: Sound Blaster programing                                                 
  246.  
  247.           bit 6 - Masks Timer 1.  If set, bit 0 is ignored.
  248.           bit 5 - Masks Timer 2.  If set, bit 1 is ignored.
  249.           bit 1 - When clear, Timer 2 does not operate.
  250.                   When set, the value from byte 03 is loaded into
  251.                   Timer 2, and incrementation begins.
  252.           bit 0 - When clear, Timer 1 does not operate.
  253.                   When set, the value from byte 02 is loaded into
  254.                   Timer 1, and incrementation begins.
  255.  
  256.  
  257. Byte 08 - CSM Mode / Keyboard Split.
  258.  
  259.         7     6     5     4     3     2     1     0
  260.      ┌─────┬─────┬───────────────────────────────────┐
  261.      │ CSM │ Key │              unused               │
  262.      │ sel │ Spl │                                   │
  263.      └─────┴─────┴───────────────────────────────────┘
  264.  
  265.           bit 7 - When set, selects composite sine-wave speech synthesis
  266.                   mode (all KEY-ON bits must be clear).  When clear,
  267.                   selects FM music mode.
  268.  
  269.           bit 6 - Selects the keyboard split point (in conjunction with
  270.                   the F-Number data).  The documentation in the Sound
  271.                   Blaster manual is utterly incomprehensible on this;
  272.                   I can't reproduce it without violating their copyright.
  273.  
  274.  
  275. Bytes 20-35 - Amplitude Modulation / Vibrato / Envelope Generator Type /
  276.               Keyboard Scaling Rate / Modulator Frequency Multiple
  277.  
  278.         7     6     5     4     3     2     1     0
  279.      ┌─────┬─────┬─────┬─────┬───────────────────────┐
  280.      │ Amp │ Vib │ EG  │ KSR │  Modulator Frequency  │
  281.      │ Mod │     │ Typ │     │       Multiple        │
  282.      └─────┴─────┴─────┴─────┴───────────────────────┘
  283.  
  284.           bit 7 - Apply amplitude modulation when set; AM depth is
  285.                   controlled by the AM-Depth flag in address BD.
  286.           bit 6 - Apply vibrato when set;  vibrato depth is controlled
  287.                   by the Vib-Depth flag in address BD.
  288.           bit 5 - When set, the sustain level of the voice is maintained
  289.                   until released; when clear, the sound begins to decay
  290.                   immediately after hitting the SUSTAIN phase.
  291.           bit 4 - Keyboard scaling rate.  This is another incomprehensible
  292.                   bit in the Sound Blaster manual.  From experience, if
  293.                   this bit is set, the sound's envelope is foreshortened as
  294.                   it rises in pitch.
  295.           bits 3-0 - These bits indicate which harmonic the operator will
  296.                   produce sound (or modulation) in relation to the voice's
  297.                   specified frequency:
  298.  
  299.                       0 - one octave below
  300.                       1 - at the voice's specified frequency
  301.                       2 - one octave above
  302.                       3 - an octave and a fifth above
  303.                       4 - two octaves above
  304.                       5 - two octaves and a major third above
  305.                       6 - two octaves and a fifth above
  306.                       7 - two octaves and a minor seventh above
  307.                       8 - three octaves above
  308.                       9 - three octaves and a major second above
  309.                       A - three octaves and a major third above
  310.                       B -  "       "     "  "   "     "     "
  311.                       C - three octaves and a fifth above
  312.                       D -   "      "     "  "   "     "
  313.                       E - three octaves and a major seventh above
  314.                       F -   "      "     "  "   "      "      "
  315.  
  316.  
  317. Bytes 40-55 - Level Key Scaling / Total Level
  318.  
  319.         7     6     5     4     3     2     1     0
  320.      ┌───────────┬───────────────────────────────────┐
  321.      │  Scaling  │             Total Level           │
  322.      │   Level   │ 24    12     6     3    1.5   .75 │ <-- dB
  323.      └───────────┴───────────────────────────────────┘
  324.  
  325.           bits 7-6 - causes output levels to decrease as the frequency
  326.                      rises:
  327.  
  328.                           00   -  no change
  329.                           10   -  1.5 dB/8ve
  330.                           01   -  3 dB/8ve
  331.                           11   -  6 dB/8ve
  332.  
  333.           bits 5-0 - controls the total output level of the operator.
  334.                      all bits CLEAR is loudest; all bits SET is the
  335.                      softest.  Don't ask me why.
  336.  
  337.  
  338. Bytes 60-75 - Attack Rate / Decay Rate
  339.  
  340.         7     6     5     4     3     2     1     0
  341.      ┌───────────────────────┬───────────────────────┐
  342.      │         Attack        │          Decay        │
  343.      │          Rate         │          Rate         │
  344.      └───────────────────────┴───────────────────────┘
  345.  
  346.           bits 7-4 - Attack rate.  0 is the slowest, F is the fastest.
  347.  
  348. --- msgedsq 2.0.5
  349.  * Origin: -=- Point Blank -=- Support Fidonet Reform -=- (1:250/804.200)
  350.  
  351.  
  352. ────────────────────────────────────────────────────────────────────────────────
  353. Area : Machine Language Heads
  354. From : Coridon Henshaw                     31-May-92 13:25:02
  355. To   : Les Kirk                            01-Jun-92 08:12:00
  356. Subj.: Sound Blaster programing                                                 
  357.  
  358.           bits 3-0 - Decay rate.  0 is the slowest, F is the fastest.
  359.  
  360.  
  361. Bytes 80-95 - Sustain Level / Release Rate
  362.  
  363.         7     6     5     4     3     2     1     0
  364.      ┌───────────────────────┬───────────────────────┐
  365.      │     Sustain Level     │         Release       │
  366.      │ 24    12     6     3  │          Rate         │
  367.      └───────────────────────┴───────────────────────┘
  368.  
  369.           bits 7-4 - Sustain Level.  0 is the loudest, F is the softest.
  370.           bits 3-0 - Release Rate.  0 is the slowest, F is the fastest.
  371.  
  372.  
  373. Bytes A0-B8 - Octave / F-Number / Key-On
  374.  
  375.         7     6     5     4     3     2     1     0
  376.      ┌───────────────────────────────────────────────┐
  377.      │        F-Number (least significant byte)      │  (A0-A8)
  378.      │                                               │
  379.      └───────────────────────────────────────────────┘
  380.  
  381.         7     6     5     4     3     2     1     0
  382.      ┌───────────┬─────┬─────────────────┬───────────┐
  383.      │  Unused   │ Key │    Octave       │ F-Number  │  (B0-B8)
  384.      │           │ On  │                 │ most sig. │
  385.      └───────────┴─────┴─────────────────┴───────────┘
  386.  
  387.           bit   5  - Channel is voiced when set, silent when clear.
  388.           bits 4-2 - Octave (0-7).  0 is lowest, 7 is highest.
  389.           bits 1-0 - Most significant bits of F-number.
  390.  
  391.      In octave 4, the F-number values for the chromatic scale and their
  392.      corresponding frequencies would be:
  393.  
  394.         F Number     Frequency     Note
  395.         ────────     ─────────     ────
  396.            16B          277.2       C#
  397.            181          293.7       D
  398.            198          311.1       D#
  399.            1B0          329.6       E
  400.            1CA          349.2       F
  401.            1E5          370.0       F#
  402.            202          392.0       G
  403.            220          415.3       G#
  404.            241          440.0       A
  405.            263          466.2       A#
  406.            287          493.9       B
  407.            2AE          523.3       C
  408.  
  409.  
  410. Bytes C0-C8 - Feedback / Algorithm
  411.  
  412.         7     6     5     4     3     2     1     0
  413.      ┌───────────────────────┬─────────────────┬─────┐
  414.      │         unused        │    Feedback     │ Alg │
  415.      │                       │                 │     │
  416.      └───────────────────────┴─────────────────┴─────┘
  417.  
  418.           bits 3-1 - Feedback strength.  If all three bits are set to
  419.                      zero, no feedback is present.  With values 1-7,
  420.                      operator 1 will send a portion of its output back
  421.                      into itself.  1 is the least amount of feedback,
  422.                      7 is the most.
  423.           bit 0    - If set to 0, operator 1 modulates operator 2.  In this
  424.                      case, operator 2 is the only one producing sound.
  425.                      If set to 1, both operators produce sound directly.
  426.                      Complex sounds are more easily created if the algorithm
  427.                      is set to 0.
  428.  
  429.  
  430. Byte BD - Amplitude Modulation Depth / Vibrato Depth / Rhythm
  431.  
  432.         7     6     5     4     3     2     1     0
  433.      ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
  434.      │ AM  │ Vib │ Rhy │ BD  │ SD  │ TOM │ Top │ HH  │
  435.      │ Dep │ Dep │ Ena │     │     │     │ Cym │     │
  436.      └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
  437.  
  438.           bit 7 - Set:    AM depth is 4.8dB
  439.                   Clear:  AM depth is 1 dB
  440.           bit 6 - Set:    Vibrato depth is 14 cent
  441.                   Clear:  Vibrato depth is 7 cent
  442.           bit 5 - Set:    Rhythm enabled  (6 melodic voices)
  443.                   Clear:  Rhythm disabled (9 melodic voices)
  444.           bit 4 - Bass drum on/off
  445.           bit 3 - Snare drum on/off
  446.           bit 2 - Tom tom on/off
  447.           bit 1 - Cymbal on/off
  448.           bit 0 - Hi Hat on/off
  449.  
  450.           Note:  KEY-ON registers for channels 06, 07, and 08 must be OFF
  451.                  in order to use the rhythm section.  Other parameters
  452.                  such as attack/decay/sustain/release must also be set
  453.                  appropriately.
  454.  
  455.  
  456. Bytes E0-F5 - Waveform Select
  457.  
  458. --- msgedsq 2.0.5
  459.  * Origin: -=- Point Blank -=- Support Fidonet Reform -=- (1:250/804.200)
  460.  
  461.  
  462. ────────────────────────────────────────────────────────────────────────────────
  463. Area : Machine Language Heads
  464. From : Coridon Henshaw                     31-May-92 13:25:20
  465. To   : Les Kirk                            01-Jun-92 08:12:00
  466. Subj.: Sound Blaster programing                                                 
  467.  
  468.         7     6     5     4     3     2     1     0
  469.      ┌───────────────────────────────────┬───────────┐
  470.      │               unused              │  Waveform │
  471.      │                                   │  Select   │
  472.      └───────────────────────────────────┴───────────┘
  473.  
  474.           bits 1-0 - When bit 5 of address 01 is set, the output waveform
  475.                      will be distorted according to the waveform indicated
  476.                      by these two bits.  I'll try to diagram them here,
  477.                      but this medium is fairly restrictive.
  478.  
  479.          ___              ___            ___    ___       _      _
  480.         /   \            /   \          /   \  /   \     / |    / |
  481.        /_____\_______   /_____\_____   /_____\/_____\   /__|___/__|___
  482.               \     /
  483.                \___/
  484.  
  485.             00              01               10               11
  486.  
  487.  
  488.  
  489.  │                          Detecting a Sound Card
  490.  │
  491.  │   According to the AdLib manual, the 'official' method of checking for a
  492.  │   sound card is as follows:
  493.  │
  494.  │      1)  Reset both timers by writing 60h to register 4.
  495.  │      2)  Enable the interrupts by writing 80h to register 4.  NOTE: this
  496.  │          must be a separate step from number 1.
  497.  │      3)  Read the status register (port 388h).  Store the result.
  498.  │      4)  Write FFh to register 2 (Timer 1).
  499.  │      5)  Start timer 1 by writing 21h to register 4.
  500.  │      6)  Delay for at least 80 microseconds.
  501.  │      7)  Read the status register (port 388h).  Store the result.
  502.  │      8)  Reset both timers and interrupts (see steps 1 and 2).
  503.  │      9)  Test the stored results of steps 3 and 7 by ANDing them
  504.  │          with E0h.  The result of step 3 should be 00h, and the
  505.  │          result of step 7 should be C0h.  If both are correct, an
  506.  │          AdLib-compatible board is installed in the computer.
  507.  │
  508.  │
  509.  │                              Making a Sound
  510.  │
  511.  │   Many people have asked me, upon reading this document, what the proper
  512.  │   register values should be to make a simple sound.  Well, here they are.
  513.  │
  514.  │   First, clear out all of the registers by setting all of them to zero.
  515.  │   This is the quick-and-dirty method of resetting the sound card, but it
  516.  │   works.  Note that if you wish to use different waveforms, you must then
  517.  │   turn on bit 5 of register 1.  (This reset need be done only once, at the
  518.  │   start of the program, and optionally when the program exits, just to
  519.  │   make sure that your program doesn't leave any notes on when it exits.)
  520.  │
  521.  │   Now, set the following registers to the indicated value:
  522.  │
  523.  │     REGISTER     VALUE     DESCRIPTION
  524.  │     ────────     ─────     ───────────
  525.  │        20          01      Set the modulator's multiple to 1
  526.  │        40          10      Set the modulator's level to about 40 dB
  527.  │        60          F0      Modulator attack:  quick;   decay:   long
  528.  │        80          77      Modulator sustain: medium;  release: medium
  529.  │        A0          98      Set voice frequency's LSB (it'll be a D#)
  530.  │        23          01      Set the carrier's multiple to 1
  531.  │        43          00      Set the carrier to maximum volume (about 47 dB)
  532.  │        63          F0      Carrier attack:  quick;   decay:   long
  533.  │        83          77      Carrier sustain: medium;  release: medium
  534.  │        B0          31      Turn the voice on; set the octave and freq MSB
  535.  │
  536.  │   To turn the voice off, set register B0h to 11h (or, in fact, any value
  537.  │   which leaves bit 5 clear).  It's generally preferable, of course, to
  538.  │   induce a delay before doing so.
  539.  │
  540.  │
  541.  │                             Acknowledgements
  542.  │
  543.  │   Thanks are due to the following people:
  544.  │
  545.  │   Ezra M. Dreisbach (ed10+@andrew.cmu.edu), for providing the information
  546.  │     about the recommended port write delay from the AdLib manual, and the
  547.  │     'official' method of detecting an AdLib-compatible sound card.
  548.  │
  549.  │   Nathan Isaac Laredo (gt7080a@prism.gatech.edu), for providing the
  550.  │     port numbers for stereo sound on the Sound Blaster Pro.
  551.  
  552. ───────────────────────────────────────────────────────────────────────────────
  553.  
  554. --- msgedsq 2.0.5
  555.  * Origin: -=- Point Blank -=- Support Fidonet Reform -=- (1:250/804.200)
  556.  
  557.