Programming the Sound Blaster ADC/DAC: 2x6h DSP Reset Port Write Only 2xAh DSP Read Data Port Read Only 2xCh DSP Write Data or Command Write 2xCh DSP Write Buffer Status (bit 7) Read 2xEh DSP Data Available Status Bit 7) Read Only x = 1,2,3,4,5,6 for the Sound Blaster <= 1.5 x = 1,2,3,4,5,6 for the Sound Blaster Micro Channel Version x = 2,4 for the Sound Blaster 2.0 x = 2,4 for the Sound Blaster Pro The DSP: ----------------------------------------------------------------------- Due to the different mode and the hardware performance of different audio cards, the maximum sampling rate is different. Input (ADC): Sound Blaster (<=1.5) Mono/Normal mode: 8-bit only 4KHz to 13KHz Sound Blaster (2.0) Mono/Normal mode: 8-bit only 4KHz to 13KHz Mono/High Speed mode: 8-bit only 13KHz to 15KHz Sound Blaster Pro Mono/Normal mode: 8-bit only 4KHz to 23KHz Mono/High Speed mode: 8-bit only 23KHz to 44.1KHz Output (DAC): Sound Blaster (<=1.5) Mono/Normal mode: 8-bit only 4KHz to 23KHz Sound Blaster (2.0) Mono/Normal mode: 8-bit only 4KHz to 23KHz Mono/High Speed mode: 8-bit only 23KHz to 44.1KHz Sound Blaster Pro Mono/Normal mode: 8-bit only 4KHz to 23KHz Mono/High Speed mode: 8-bit only 23KHz to 44.1KHz Some DSP Commands: 10h Direct mode 8-bit DAC (single byte data transfer) 14h DMA mode 8-bit DAC 20h Direct mode 8-bit ADC (single byte data transfer) 24h DMA mode 8-bit ADC 40h Set Time Constant 48h Set Block Size 91h High Speed DMA mode 8-bit DAC 99h High Speed DMA mode 8-bit ADC D1h Turn on Speaker D3h Turn off Speaker D0h Halt DMA in progress D4h Continue DMA E1h Get DSP version (read major ver then minor) To reset the DSP: 1. Write a 01h to port 2x6h 2. Wait for 3 microseconds 3. Write a 00h to port 2x6h 4. Read port 2xAh until a 0AAh is read (see below for how to read from 2xAh) If there is no 0AAh after about 100 reads, abort and declare that there is no Sound Blaster present (or error) To write to the DSP (all writes to 2xCh MUST follow this procedure) 1. Read 2xCh until bit 7 is clear 2. Write to 2xCh To read from the DSP (all reads from 2xAh MUST follow this procedure) 1. Read 2xEh until bit 7 is set 2. Read from 2xAh Interrupts: In DMA DAC and DMA ADC modes, a single interrupt will occur after the block of data has been read/written. To clear the interrupt, read 2xEh once (as well as clearing the PIC). Ignoring Interrupts: The interrupt can be ignored if you poll the DMAC (DMA Controller). Once the DMAC reports a count of 0FFFFh the transfer is finished, read 2xEh once and you are finished. You can also poll the DMA status register and wait for the Terminal Count reached bit to be set (I found that the first read after starting the transfer had the bit set, but not the second). Note to VESA/Local Bus Video users: These video cards use DMA channel 1 which is the DMA channel used by the Sound Blaster. Any video accesses will screw up the output of the Sound Blaster. Calculating the Time Constant: Normal Speed: Time Constant = 256 - (1,000,000 / sampling rate) = 256 - (1,000,000 / 8,000 ) = 131 High Speed: Time Constant = (MSByte of) 65536 - (256,000,000 / sampling rate) = (MSByte of) 65536 - (256,000,000 / 44,100) = (MSByte of) 59731 = (MSByte of) 0E953h = 0E9h Direct mode DAC: 1. Write a D1h to 2xCh 2. Write a 10h to 2xCh 3. Write the 8-bit data sample to 2xCh 4. Wait for the correct timing (must do your own timing) Repeat steps 2-4 until end of data 5. Write a D3h to 2xCh Normal speed DMA mode DAC: 1. Write a D1h to 2xCh 2. Setup Interrupt service routine 3. Write a 40h to 2xCh 4. Write Time Constant to 2xCh 5. Program the DMAC (DMA Controller) 6. Write 14h to 2xCh 7. Write the LSByte of Data Length - 1 8. Write the MSByte of Data Length - 1 9. Service Interrupt (may need to repeat steps 5-7 in the ISR) 10. Restore original Interrupt Service Routine 11. Write a D3h to 2xCh Commands can be written to the DSP while waiting for the interrupt High speed DMA mode DAC: 1. Write a D1h to 2xCh 2. Setup Interrupt service routine 3. Write a 40h to 2xCh 4. Write Time Constant to 2xCh 5. Program the DMAC (DMA Controller) 6. Write 48h to 2xCh 7. Write the LSByte of Data Length - 1 8. Write the MSByte of Data Length - 1 9. Write 91h to 2xCh 10. Service Interrupt (may need to repeat steps 5-7 in the ISR) 11. Restore original Interrupt Service Routine 12. Write a D3h to 2xCh Commands CANNOT be written to the DSP while waiting for the interrupt Resetting the DSP is the procedure used to halt DMA in progress Direct mode ADC: 1. Write a 20h to 2xCh 2. Read the 8-bit data sample from 2xAh 3. Wait for the correct timing (must do your own timing) Repeat steps 1-3 until finished Normal speed DMA mode ADC: 1. Setup Interrupt service routine 2. Write a 40h to 2xCh 3. Write Time Constant to 2xCh 4. Program the DMAC (DMA Controller) 5. Write 24h to 2xCh 6. Write the LSByte of Data Length - 1 7. Write the MSByte of Data Length - 1 8. Service Interrupt (may need to repeat steps 5-7 in the ISR) 9. Restore original Interrupt Service Routine Commands can be written to the DSP while waiting for the interrupt High speed DMA mode ADC: 1. Setup Interrupt service routine 2. Write a 40h to 2xCh 3. Write Time Constant to 2xCh 4. Program the DMAC (DMA Controller) 5. Write 48h to 2xCh 6. Write the LSByte of Data Length - 1 7. Write the MSByte of Data Length - 1 8. Write 99h to 2xCh 9. Service Interrupt (may need to repeat steps 5-7 in the ISR) 10. Restore original Interrupt Service Routine Commands CANNOT be written to the DSP while waiting for the interrupt Resetting the DSP is the procedure used to halt DMA in progress The Mixer: -------------------------------------------------------------------- The mixer can only be found on the Sound Blaster Pro. It mixes the following audio sources: -digitized voice -FM synthesized music -CD-audio -line-in -microphone input -PC speaker output It allows software to control volume on: -digitized voice -FM synthesized music -CD-audio -line-in -microphone mixing -overall master volume The mixer setting can be done with 2 I/O ports, 2x4h and 2x5h. x=2,4 for the Sound Blaster Pro 2x4h is the address port (write only), 2x5h is the data port (read/write) The programming sequence is as follows: 1. Write the address of the mixers register to 2x4h 2. Read/Write the mixers register value from/to 2x5h Mixer registers: Register| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | --------+----+----+----+----+----+----+----+----+ 00h | Data Reset | 02h | Reserved | 04h | Voice Volume L | Voice Volume R | 06h | Reserved | 08h | Reserved | 0Ah | x | x | x | x | x | MIC Mixing | 0Ch | x | x | In Filter | ADC | x | 0Eh | x | x |DNFI| x | x | x |VSTC| x | 20h | Reserved | 22h | Master Volume L | Master Volume R | 24h | Reserved | 26h | FM Volume L | FM Volume R | 28h | CD Volume L | CD Volume R | 2Ah | Reserved | 2Ch | Reserved | 2Eh | Line Volume L | Line Volume R | x=don't care Reserved=preserve original value Register Descriptions: Reset Register (00h): You can write any 8-bit value to this register to reset the mixer Voice Volume Register (04h): d[7..4] voice volume left d[3..0] voice volume right The default level is 9. Microphone Mixing Register (0Ah): The default level is 0. Input Setting Register (0Ch): ADC - input source: d[2] d[1] 0 0 Microphone (default) 0 1 CD audio 1 0 Microphone 1 1 Line-in In Filter - filter select: d[5] d[4] d[3] 0 x 0 Low Filter (default) 0 x 1 High Filter 1 x x No Filter Output Setting Register (0Eh): This register specifies the voice output features. DNFI 0 output filter is ON (default) 1 output filter is bypassed VSTC 0 Mono voice mode (default) 1 stereo voice mode Master Volume Register (22h): d[7..4] master volume left d[3..0] master volume right The default level is 9. FM Volume Register (26h): d[7..4] fm volume left d[3..0] fm volume right The default level is 9. CD Volume Register (28h): d[7..4] cd volume left d[3..0] cd volume right The default level is 0 Line-In Volume Register (2Eh): d[7..4] line-in volume left d[3..0] line-in volume right The default level is 0