Index: uspace/srv/kbd/port/z8530.c
===================================================================
--- uspace/srv/kbd/port/z8530.c	(revision 0c33687a0010b5f04f4745b1349e77b466511af0)
+++ uspace/srv/kbd/port/z8530.c	(revision f9f9a132b6bbf6fb3fbfbc90aa2f576c0bf1b017)
@@ -42,17 +42,38 @@
 #include <sys/types.h>
 
-/** Top-half pseudocode for z8530. */
-irq_cmd_t z8530_cmds[] = {
+#define CHAN_A_STATUS	4
+#define CHAN_A_DATA	6
+
+#define RR0_RCA	1
+
+static irq_cmd_t z8530_cmds[] = {
 	{
-		CMD_MEM_READ_1,
-		0,		/**< Address. Will be patched in run-time. */
-		0,		/**< Value. Not used. */
-		1		/**< Arg 1 will contain the result. */
+		.cmd = CMD_PIO_READ_8,
+		.addr = (void *) 0,	/* will be patched in run-time */
+		.dstarg = 1
+	},
+	{
+		.cmd = CMD_BTEST,
+		.value = RR0_RCA,
+		.srcarg = 1,
+		.dstarg = 3
+	},
+	{
+		.cmd = CMD_PREDICATE,
+		.value = 2,
+		.srcarg = 3
+	},
+	{
+		.cmd = CMD_PIO_READ_8,
+		.addr = (void *) 0,	/* will be patched in run-time */
+		.dstarg = 2
+	},
+	{
+		.cmd = CMD_ACCEPT
 	}
 };
-
 	
 irq_code_t z8530_kbd = {
-	1,
+	sizeof(z8530_cmds) / sizeof(irq_cmd_t),
 	z8530_cmds
 };
@@ -63,5 +84,8 @@
 {
 	async_set_interrupt_received(z8530_irq_handler);
-	z8530_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual") + 6;
+	z8530_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual") +
+	    CHAN_A_STATUS;
+	z8530_cmds[3].addr = (void *) sysinfo_value("kbd.address.virtual") +
+	    CHAN_A_DATA;
 	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"),
 	    0, &z8530_kbd);
@@ -71,5 +95,5 @@
 static void z8530_irq_handler(ipc_callid_t iid, ipc_call_t *call)
 {
-	int scan_code = IPC_GET_ARG1(*call);
+	int scan_code = IPC_GET_ARG2(*call);
 	kbd_push_scancode(scan_code);
 }
