Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 427069d5d6c4fd5558ae420c26dd5881e03e89f0)
+++ uspace/drv/audio/sb16/dsp.c	(revision 413225d07050928987e7c33a775126703e9d8cca)
@@ -194,15 +194,6 @@
 {
 	assert(dsp);
-	/* We don't really care about the mode of transport, so ack both */
-	// TODO: Move irq ACK to irq_code
-	if (dsp->version.major >= 4) {
-		/* ACK dma16 transfer interrupt */
-		pio_read_8(&dsp->regs->dma16_ack);
-	}
-	/* ACK dma8 transfer interrupt */
-	pio_read_8(&dsp->regs->dsp_read_status);
-
-	const size_t remain_size = dsp->playing.size -
-	    (dsp->playing.position - dsp->playing.data);
+	const size_t remain_size =
+	    dsp->playing.size - (dsp->playing.position - dsp->playing.data);
 
 	if (remain_size == 0) {
Index: uspace/drv/audio/sb16/main.c
===================================================================
--- uspace/drv/audio/sb16/main.c	(revision 427069d5d6c4fd5558ae420c26dd5881e03e89f0)
+++ uspace/drv/audio/sb16/main.c	(revision 413225d07050928987e7c33a775126703e9d8cca)
@@ -114,6 +114,10 @@
 	    "Failed to get resources: %s.\n", str_error(ret));
 
-	irq_code_t *irq_code = sb16_irq_code();
-	ret = register_interrupt_handler(device, irq, irq_handler, irq_code);
+	const size_t irq_cmd_count = sb16_irq_code_size();
+	irq_cmd_t irq_cmds[irq_cmd_count];
+	sb16_irq_code((void*)sb_regs, dma8, dma16, irq_cmds);
+	irq_code_t irq_code = { .cmdcount = irq_cmd_count, .cmds = irq_cmds };
+
+	ret = register_interrupt_handler(device, irq, irq_handler, &irq_code);
 	CHECK_RET_RETURN(ret,
 	    "Failed to register irq handler: %s.\n", str_error(ret));
Index: uspace/drv/audio/sb16/sb16.c
===================================================================
--- uspace/drv/audio/sb16/sb16.c	(revision 427069d5d6c4fd5558ae420c26dd5881e03e89f0)
+++ uspace/drv/audio/sb16/sb16.c	(revision 413225d07050928987e7c33a775126703e9d8cca)
@@ -44,8 +44,10 @@
 
 /* ISA interrupts should be edge-triggered so there should be no need for
- * irq code magic */
-static const irq_cmd_t irq_cmds[] = {{ .cmd = CMD_ACCEPT }};
-static const irq_code_t irq_code =
-    { .cmdcount = 1, .cmds = (irq_cmd_t*)irq_cmds }; // FIXME: Remove cast
+ * irq code magic, but we still need to ack those interrupts ASAP. */
+static const irq_cmd_t irq_cmds[] = {
+	{ .cmd = CMD_PIO_READ_8, .dstarg = 1 }, /* Address patched at runtime */
+	{ .cmd = CMD_PIO_READ_8, .dstarg = 1 }, /* Address patched at runtime */
+	{ .cmd = CMD_ACCEPT },
+};
 
 static inline sb_mixer_type_t sb_mixer_type_by_dsp_version(
@@ -62,8 +64,22 @@
 }
 /*----------------------------------------------------------------------------*/
-irq_code_t * sb16_irq_code(void)
+size_t sb16_irq_code_size(void)
 {
-	// FIXME: Remove this cast
-	return (irq_code_t*)&irq_code;
+	return sizeof(irq_cmds) / sizeof(irq_cmds[0]);
+}
+/*----------------------------------------------------------------------------*/
+void sb16_irq_code(void *regs, int dma8, int dma16, irq_cmd_t cmds[])
+{
+	assert(regs);
+	assert(dma8 > 0 && dma8 < 4);
+	sb16_regs_t *registers = regs;
+	memcpy(cmds, irq_cmds, sizeof(irq_cmds));
+	cmds[0].addr = (void*)&registers->dsp_read_status;
+	if (dma16 > 4 && dma16 < 8) {
+		/* Valid dma16 */
+		cmds[1].addr = (void*)&registers->dma16_ack;
+	} else {
+		cmds[1].cmd = CMD_ACCEPT;
+	}
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/audio/sb16/sb16.h
===================================================================
--- uspace/drv/audio/sb16/sb16.h	(revision 427069d5d6c4fd5558ae420c26dd5881e03e89f0)
+++ uspace/drv/audio/sb16/sb16.h	(revision 413225d07050928987e7c33a775126703e9d8cca)
@@ -50,5 +50,6 @@
 } sb16_t;
 
-irq_code_t * sb16_irq_code(void);
+size_t sb16_irq_code_size(void);
+void sb16_irq_code(void *regs, int dma8, int dma16, irq_cmd_t cmds[]);
 int sb16_init_sb16(sb16_t *sb, void *regs, size_t size,
     ddf_dev_t *dev, int dma8, int dma16);
