improved the soundblaster code, but still doesn't work on the real
[dos_sbtest] / src / intr.h
diff --git a/src/intr.h b/src/intr.h
new file mode 100644 (file)
index 0000000..3345324
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef INTR_H_\r
+#define INTR_H_\r
+\r
+#define INTERRUPT      __interrupt __far\r
+\r
+#define IRQ_TO_INTR(x) ((x) + 8)\r
+\r
+/* PIC command and data ports */\r
+#define PIC1_CMD       0x20\r
+#define PIC1_DATA      0x21\r
+#define PIC2_CMD       0xa0\r
+#define PIC2_DATA      0xa1\r
+/* PIC operation command word 2 bits */\r
+#define OCW2_EOI       (1 << 5)\r
+\r
+unsigned char get_irq_mask(int pic);\r
+#pragma aux get_irq_mask = \\r
+               "cmp bx, 0" \\r
+               "jnz getpic2" \\r
+               "in al, 0x21" \\r
+               "jmp getend" \\r
+               "getpic2:" \\r
+               "in al, 0xa1" \\r
+               "getend:" \\r
+               value[al] parm[ebx];\r
+\r
+void mask_irq(int irq);\r
+#pragma aux mask_irq = \\r
+               "mov dx, 0x21" \\r
+               "cmp ax, 8" \\r
+               "jb skip_mask_pic2" \\r
+               "mov dx, 0xa1" \\r
+               "sub ax, 8" \\r
+               "skip_mask_pic2:" \\r
+               "mov cl, al" \\r
+               "mov ah, 1" \\r
+               "shl ah, cl" \\r
+               "in al, dx" \\r
+               "or al, ah" \\r
+               "out dx, al" \\r
+               parm[eax] modify[cl dx];\r
+\r
+void unmask_irq(int irq);\r
+#pragma aux unmask_irq = \\r
+               "mov dx, 0x21" \\r
+               "cmp ax, 8" \\r
+               "jb skip_unmask_pic2" \\r
+               "mov dx, 0xa1" \\r
+               "sub ax, 8" \\r
+               "skip_unmask_pic2:" \\r
+               "mov cl, al" \\r
+               "mov ah, 1" \\r
+               "shl ah, cl" \\r
+               "not ah" \\r
+               "in al, dx" \\r
+               "and al, ah" \\r
+               "out dx, al" \\r
+               parm[eax] modify[cl dx];\r
+\r
+#endif /* INTR_H_ */\r