Index: src/devices/oprom/x86_asm.S
===================================================================
--- src/devices/oprom/x86_asm.S	(revision 5608)
+++ src/devices/oprom/x86_asm.S	(working copy)
@@ -141,21 +141,24 @@
 	mov	%ax, %ds
 	lidt	__realmode_idt
 
+	/* initialize registers for option rom lcall */
+	movl	__registers +  0, %eax
+	movl	__registers +  4, %ebx
+	movl	__registers +  8, %ecx
+	movl	__registers + 12, %edx
+	movl	__registers + 16, %esi
+	movl	__registers + 20, %edi	
+
 	/* Set all segments to 0x0000, ds to 0x0040 */
+	push	%ax
+	xor	%ax, %ax
 	mov	%ax, %es
 	mov	%ax, %fs
 	mov	%ax, %gs
 	mov	$0x40, %ax
 	mov	%ax, %ds
+	pop	%ax
 
-	/* initialize registers for option rom lcall */
-	movl	__registers +  0, %eax
-	movl	__registers +  4, %ebx
-	movl	__registers +  8, %ecx
-	movl	__registers + 12, %edx
-	movl	__registers + 16, %esi
-	movl	__registers + 20, %edi
-
 	/* ************************************ */
 __lcall_instr = RELOCATED(.)
 	.byte 0x9a
@@ -262,12 +265,6 @@
 	mov	%ax, %ds
 	lidt	__realmode_idt
 
-	/* Set all segments to 0x0000 */
-	mov	%ax, %ds
-	mov	%ax, %es
-	mov	%ax, %fs
-	mov	%ax, %gs
-
 	/* initialize registers for intXX call */
 	movl	__registers +  0, %eax
 	movl	__registers +  4, %ebx
@@ -276,6 +273,15 @@
 	movl	__registers + 16, %esi
 	movl	__registers + 20, %edi
 
+	/* Set all segments to 0x0000 */
+	push	%ax
+	xor	%ax, %ax
+	mov	%ax, %ds
+	mov	%ax, %es
+	mov	%ax, %fs
+	mov	%ax, %gs
+	pop	%ax
+
 __intXX_instr = RELOCATED(.)
 	.byte 0xcd, 0x00 /* This becomes intXX */
 
@@ -376,7 +382,7 @@
 	mov	%ax, %ds
 	lidt	__realmode_idt
 
-	/* Set up segment registers to segment 0x0000 */
+	/* Set up segment registers to segment 0x0000 and ds to 0x040 */
 	mov	%ax, %es
 	mov	%ax, %fs
 	mov	%ax, %gs
