fixed soundblaster output (DMA bug)
authorJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 23 Jan 2019 01:53:46 +0000 (03:53 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 23 Jan 2019 01:53:46 +0000 (03:53 +0200)
Makefile
src/au_sb.c
src/dma.c
src/intr.c
src/pci.c
src/test/vbetest.c

index 9622719..fcbe869 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -28,6 +28,13 @@ floppy.img: boot.img
        dd if=/dev/zero of=$@ bs=512 count=2880
        dd if=$< of=$@ conv=notrunc
 
+pcboot.iso: floppy.img
+       rm -rf cdrom
+       git archive --format=tar --prefix=cdrom/ HEAD | tar xf -
+       cp $< cdrom
+       mkisofs -o $@ -V pcboot -b $< cdrom
+
+
 boot.img: bootldr.bin $(bin)
        cat bootldr.bin $(bin) >$@
 
index 1adcfc1..fc9761d 100644 (file)
@@ -194,9 +194,9 @@ void sb_start(int rate, int nchan)
 
        interrupt(IRQ_TO_INTR(irq), intr_handler);
 
+       write_dsp(CMD_ENABLE_OUTPUT);
        sb_set_output_rate(rate);
        start_dma_transfer(addr, size);
-       write_dsp(CMD_ENABLE_OUTPUT);
 }
 
 void sb_pause(void)
@@ -241,7 +241,7 @@ static void start_dma_transfer(uint32_t addr, int size)
        dma_out(dma_chan, addr, size, DMA_SINGLE);
 
        /* program the DSP to accept the DMA transfer */
-       write_dsp(CMD_START_DMA8 | CMD_FIFO);
+       write_dsp(CMD_START_DMA8);
        write_dsp(xfer_mode);
        size--;
        write_dsp(size & 0xff);
index b6c4605..8d36edf 100644 (file)
--- a/src/dma.c
+++ b/src/dma.c
@@ -117,8 +117,8 @@ static void dma_io(int chan, uint32_t phyaddr, int size, unsigned int flags, uns
        mask(chan);
        outb(0, DMA_CLR_FLIPFLOP(chan));
 
-       /* single / block / cascade */
-       mode = ((flags & 3) << 6) | MODE_CHAN(chan);
+       /* first 2 bits of flags correspond to the mode bits 6,7 */
+       mode = ((flags & 3) << 6) | dir | MODE_CHAN(chan);
        if(flags & DMA_DECR) mode |= MODE_DECR;
        if(flags & DMA_AUTO) mode |= MODE_AUTO;
        outb(mode, DMA_MODE(chan));
index a9bd5f1..e04a177 100644 (file)
@@ -116,7 +116,10 @@ struct intr_frame *get_intr_frame(void)
 /* set an interrupt handler function for a particular interrupt */
 void interrupt(int intr_num, intr_func_t func)
 {
+       int iflag = get_intr_flag();
+       disable_intr();
        intr_func[intr_num] = func;
+       set_intr_flag(iflag);
 }
 
 /* this function is called from all interrupt entry points
index 0813ba7..93ea560 100644 (file)
--- a/src/pci.c
+++ b/src/pci.c
@@ -129,7 +129,7 @@ static int enum_dev(int busid, int dev)
        if(read_dev_info(&info, busid, dev, 0) == -1) {
                return 0;
        }
-       print_dev_info(&info, busid, dev, 0);
+       /*print_dev_info(&info, busid, dev, 0);*/
 
        count = 1;
 
@@ -138,7 +138,7 @@ static int enum_dev(int busid, int dev)
                        if(read_dev_info(&info, busid, dev, i) == -1) {
                                continue;
                        }
-                       print_dev_info(&info, busid, dev, i);
+                       /*print_dev_info(&info, busid, dev, i);*/
                        count++;
                }
        }
index 8625631..8a61516 100644 (file)
@@ -176,24 +176,7 @@ static void draw_cursor(int x, int y, uint16_t col)
 static int click_sound_callback(void *buffer, int size, void *cls)
 {
        if(click) {
-               int i;
-               signed char *ptr = buffer;
-               signed char *src = snd_click;
-               /*
-               for(i=0; i<size; i++) {
-                       if((i / 32) & 1) {
-                               *ptr++ = -64;
-                       } else {
-                               *ptr++ = 64;
-                       }
-               }
-               */
-               /*memcpy(buffer, snd_click, snd_click_size);*/
-
-               for(i=0; i<snd_click_size; i++) {
-                       *ptr++ = *src++;
-               }
-
+               memcpy(buffer, snd_click, snd_click_size);
                click = 0;
                return snd_click_size;
        }