Index: /trunk/src/VBox/Devices/PC/BIOS-new/biosint.h
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS-new/biosint.h	(revision 40720)
+++ /trunk/src/VBox/Devices/PC/BIOS-new/biosint.h	(revision 40721)
@@ -111,6 +111,6 @@
         } r16;
         struct {
-            uint16_t    flagsl;
-            uint16_t    flagsh;
+            uint8_t     flagsl;
+            uint8_t     flagsh;
         } r8;
     } u;
@@ -132,5 +132,7 @@
 typedef struct {
     pusha_regs_t    gr;
-    flags_t         fl;
+    uint16_t        es;
+    uint16_t        ds;
+    iret_addr_t     ra;
 } kbd_regs_t;
 
@@ -189,4 +191,6 @@
 #define CLEAR_ZF()   FLAGS &= 0xffbf
 #define GET_ZF()     (FLAGS & 0x0040)
+
+#define SET_IF()     FLAGS |= 0x0200
 
 typedef unsigned short  bx_bool;
Index: /trunk/src/VBox/Devices/PC/BIOS-new/keyboard.c
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS-new/keyboard.c	(revision 40720)
+++ /trunk/src/VBox/Devices/PC/BIOS-new/keyboard.c	(revision 40721)
@@ -573,5 +573,5 @@
 #define BP      r.gr.u.r16.bp
 #define SP      r.gr.u.r16.sp
-#define FLAGS   r.fl.u.r16.flags
+#define FLAGS   r.ra.flags.u.r16.flags
 
 /* Interrupt 16h service implementation. */
@@ -615,4 +615,5 @@
     
     case 0x01: /* check keyboard status */
+        SET_IF();   /* Enable interrupts. Some callers depend on that! */
         if ( !dequeue_key(&scan_code, &ascii_code, 0) ) {
             SET_ZF();
@@ -691,4 +692,5 @@
     
     case 0x11: /* check MF-II keyboard status */
+        SET_IF();
         if ( !dequeue_key(&scan_code, &ascii_code, 0) ) {
             SET_ZF();
Index: /trunk/src/VBox/Devices/PC/BIOS-new/notes.txt
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS-new/notes.txt	(revision 40720)
+++ /trunk/src/VBox/Devices/PC/BIOS-new/notes.txt	(revision 40721)
@@ -8,4 +8,7 @@
 - OS/2 (WSeB/MCP/ACP) and Windows 98 SE are some of the very few operating
   systems which use the El Torito floppy emulation.
+
+- Keystroke check (INT 16h, fn 01h/10h) always enables interrupts on return.
+  DOS POWER.EXE depends on that in some situations.
 
 - MS-DOS 6.2/V is a rare user of the INT 15h keyboard intercept routines.
Index: /trunk/src/VBox/Devices/PC/BIOS-new/orgs.asm
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS-new/orgs.asm	(revision 40720)
+++ /trunk/src/VBox/Devices/PC/BIOS-new/orgs.asm	(revision 40721)
@@ -767,6 +767,4 @@
 		push	es
 		push	ds
-		;; TODO: the caller already pushed flags (INT instruction)??
-		pushf
 		pusha
 
@@ -780,22 +778,6 @@
 		call	_int16_function
 		popa
-		popf
 		pop	ds
 		pop	es
-		jz	int16_zero_set
-
-		;; TODO: Could use SP directly here (386+)
-int16_zero_clear:
-		push	bp
-		mov	bp, sp
-		and	byte ptr [bp+6], 0BFh
-		pop	bp
-		iret
-
-int16_zero_set:
-		push	bp
-		mov	bp, sp
-		or	byte ptr [bp+6], 040h
-		pop	bp
 		iret
 
@@ -823,8 +805,7 @@
 		call	_int16_function
 		popa
-		popf
 		pop	ds
 		pop	es
-; TODO: review/enable?
+; TODO: review/enable? If so, flags should be restored here?
 if 0
 		push	ax
