==Code==
<source lang="C">
//Digital Sound Processor ports
#define DSP_RESET 0x226
#define DSP_READ 0x22A
#define DSP_WRITE 0x22C
#define DSP_BUFFER 0x22A
#define DSP_STATUS 0x22E
#define DSP_INTERRUPT 0x22F
//Digital Sound Processor commands
#define DSP_CMD_OUTPUT_RATE 0x41
#define DSP_CMD_TRANSFER_MODE 0xB6
#define DSP_CMD_STOP 0xD5
#define DSP_CMD_VERSION 0xE1
//DMA ports
#define DMA_ADDRES 0xC4
#define DMA_COUNT 0xC6
#define DMA_PAGE 0x8B
#define DMA_SINGLE_MASK 0xD4
#define DMA_TRANSFER_MODE 0xD6
#define DMA_CLEAR_POINTER 0xD8
void reset_DSP(void) {
outb(DSP_RESET, 1);
sleep(3); //wait 3 microseconds
outb(DSP_RESET, 0);
if(read_DSP()==0xAA) {
sound_blaster=TRUE;
}
}
void sb16_init(void) {
reset_DSP();
//if DSP doesnt exist
if(sound_blaster==FALSE) {
return;
}
//get DSP version
write_DSP(DSP_CMD_VERSION);
sb16_version_major=read_DSP();
sb16_version_minor=read_DSP();
}
</source>
<source lang="asm">
%macro OUTB 2
OUTB 0x0C, 1 ;flip flop
OUTB 0x0B, 0x49 ;transfer mode
OUTB 0x83, 00x01 ;PAGE TRANSFER (EXAMPLE POSITION IN MEMORY 0x[01]0F04) - SET THIS VALUE FOR YOU
OUTB 0x02, 0x000x0F ;POSITION LOW BIT (EXAMPLE POSITION IN MEMORY 0x01[0F]04) - SET THIS VALUE FOR YOU
OUTB 0x02, 0x000x04 ;POSITON HIGH BIT (EXAMPLE POSITION IN MEMORY 0x010F[04]) - SET THIS VALUE FOR YOU
OUTB 0x03, 0xFF ;COUNT LOW BIT (EXAMPLE 0x0FFF) - SET THIS VALUE FOR YOU
OUTB 0x03, 0x0F ;COUNT HIGH BIT (EXAMPLE 0x0FFF) - SET THIS VALUE FOR YOU
|