works in dosbox
[dos_sbtest] / src / au_sb.c
index 8ff4ea1..2046f91 100644 (file)
@@ -3,6 +3,7 @@
 #include <pc.h>
 #include <go32.h>
 #include <dpmi.h>
+#include <sys/nearptr.h>
 #include "audio.h"
 #include "au_sb.h"
 #include "dma.h"
@@ -175,14 +176,19 @@ void sb_start(int rate, int nchan)
        _go32_dpmi_seginfo intr;
 
        if(!buffer) {
+               __djgpp_nearptr_enable();
+
                /* allocate a 64k-aligned 64k buffer in low memory */
                if((seg = __dpmi_allocate_dos_memory(65536 * 2 / 16, &pmsel)) <= 0) {
                        fprintf(stderr, "sb_start: failed to allocate DMA buffer\n");
                        return;
                }
 
+               printf("allocated seg: %d, addr: %lx\n", seg, (unsigned long)seg << 4);
+
                addr = ((uint32_t)(seg << 4) + 0xffff) & 0xffff0000;
-               buffer = (void*)addr;
+               printf("aligned: %lx\n", (unsigned long)addr);
+               buffer = (void*)(addr - __djgpp_base_address);
        } else {
                addr = (uint32_t)buffer;
        }