diff --git a/src/drivers/sb16.c b/src/drivers/sb16.c index 57368da..e2d9c4b 100644 --- a/src/drivers/sb16.c +++ b/src/drivers/sb16.c @@ -49,11 +49,13 @@ int sb16_get_irq() return irq; } +void* buffer; + void* sb16_allocate_buf() { const size_t size = 64*1024;//64 KB - void* buffer = malloc(size); + buffer = malloc(size); return get_physaddr(buffer); } @@ -66,6 +68,42 @@ void sb16_get_version(int* major, int* minor) *minor = inb(DSP_READ); } +void sb16_program_dma() +{ + const int transfer_mode = 0x48; + const int channel = 1; + const int page_number = 0;//page that contains sound data + + int buffer_pos = (uint32_t)buffer & 0xffff; + int count = 0; + + outb(0x0A, 0x4 + channel);//0x4 + channel number (1 in this case) + outb(0x0C, 1);//flip flop + outb(0x0B, transfer_mode + channel); + outb(0x83, page_number); + + //set the position + outb(0x02, (buffer_pos) & 0xFF); + outb(0x02, (buffer_pos >> 8) & 0xFF); + + //set the count + outb(0x03, (count - 1) & 0xFF); + outb(0x03, ((count - 1) >> 8) & 0xFF); + + outb(0x0A, 1); +} + +void sb16_program() +{ + const int samples_count = 0; + outb(DSP_WRITE, 0x40);//time constant + outb(DSP_WRITE, 165);//10989 Hz + outb(DSP_WRITE, 0xC0);//8-bit sound + outb(DSP_WRITE, 0x00);//mono unsigned + outb(DSP_WRITE, (samples_count - 1) & 0xFF); + outb(DSP_WRITE, ((samples_count - 1) >> 8) & 0xFF); +} + void sb16_init() { int status = sb16_dsp_reset(); @@ -80,4 +118,7 @@ void sb16_init() printf("sb16 version: %X.%X\n", major, minor); outb(DSP_WRITE, 0xD1);//enable speaker + + sb16_program_dma(); + sb16_program(); } \ No newline at end of file