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
|
|||
|
|
|||
|
|