diff options
Diffstat (limited to 'newlib/libc/sys/go32/int86x.s')
-rw-r--r-- | newlib/libc/sys/go32/int86x.s | 103 |
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 0000000..7b49bcd --- /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 |