summaryrefslogtreecommitdiff
path: root/newlib/libc/sys/go32/int86x.s
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/go32/int86x.s')
-rw-r--r--newlib/libc/sys/go32/int86x.s103
1 files changed, 103 insertions, 0 deletions
diff --git a/newlib/libc/sys/go32/int86x.s b/newlib/libc/sys/go32/int86x.s
new file mode 100644
index 00000000000..7b49bcd121f
--- /dev/null
+++ b/newlib/libc/sys/go32/int86x.s
@@ -0,0 +1,103 @@
+ .data
+ds:
+ .word 0
+es:
+ .word 0
+fs:
+ .word 0
+gs:
+ .word 0
+
+ .globl int86
+int86:
+ .byte 0x2e
+ push ds
+ pop %ds
+ .byte 0x2e
+ push es
+ pop %es
+ .byte 0x2e
+ push fs
+ pop %fs
+ .byte 0x2e
+ push gs
+ pop %gs
+
+ .byte 0xcd
+int86_vec:
+ .byte 0x03
+ ret
+
+ .text
+ .globl _int86x
+_int86x:
+ movl 16(%esp), %eax
+
+ movw 2(%eax), %cx
+ movw %cx, ds
+ movw 4(%eax), %cx
+ movw %cx, es
+ movw 6(%eax), %cx
+ movw %cx, fs
+ movw 8(%eax), %cx
+ movw %cx, gs
+
+ jmp int86_common
+
+ .globl _int86
+_int86:
+ movw %ds, %ax
+ movw %ax, ds
+ movw %ax, es
+ movw %ax, fs
+ movw %ax, gs
+ jmp int86_common
+
+int86_common:
+ pushl %ebp
+ movl %esp,%ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushf
+
+ movl 8(%ebp),%eax
+ movb %al,int86_vec
+
+ movl 12(%ebp),%eax
+ movl 4(%eax),%ebx
+ movl 8(%eax),%ecx
+ movl 12(%eax),%edx
+ movl 16(%eax),%esi
+ movl 20(%eax),%edi
+ movl (%eax),%eax
+
+ push %ds
+ push %es
+ call int86
+ pop %es
+ pop %ds
+
+ pushf
+ pushl %eax
+ movl %esp,%ebp
+ addl $24,%ebp
+ movl 16(%ebp),%eax
+ popl (%eax)
+ movl %ebx,4(%eax)
+ movl %ecx,8(%eax)
+ movl %edx,12(%eax)
+ movl %esi,16(%eax)
+ movl %edi,20(%eax)
+ popl %ebx /* flags */
+ movl %ebx,28(%eax)
+ andl $1,%ebx
+ movl %ebx,24(%eax)
+ movl (%eax),%eax
+
+ popf
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+ ret