289 lines
9.2 KiB
Plaintext
289 lines
9.2 KiB
Plaintext
|
||
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
|
||
|
||
|