2 # Copyright (c) 1998 Robert Nordier
5 # Redistribution and use in source and binary forms are freely
6 # permitted provided that the above copyright notice and this
7 # paragraph and the following disclaimer are duplicated in all
10 # This software is provided "AS IS" and without any express or
11 # implied warranties, including, without limitation, the implied
12 # warranties of merchantability and fitness for a particular
27 # Fields in V86 interface structure.
29 .set V86_CTL,0x0 # Control flags
30 .set V86_ADDR,0x4 # Int number/address
31 .set V86_ES,0x8 # V86 ES
32 .set V86_DS,0xc # V86 DS
33 .set V86_FS,0x10 # V86 FS
34 .set V86_GS,0x14 # V86 GS
35 .set V86_EAX,0x18 # V86 EAX
36 .set V86_ECX,0x1c # V86 ECX
37 .set V86_EDX,0x20 # V86 EDX
38 .set V86_EBX,0x24 # V86 EBX
39 .set V86_EFL,0x28 # V86 eflags
40 .set V86_EBP,0x2c # V86 EBP
41 .set V86_ESI,0x30 # V86 ESI
42 .set V86_EDI,0x34 # V86 EDI
46 .set INT_V86,0x31 # Interrupt number
47 .set SIZ_V86,0x38 # Size of V86 structure
49 # V86 interface function.
51 __v86int: popl __v86ret # Save return address
52 pushl $__v86 # Push pointer
53 call __v86_swap # Load V86 registers
55 call __v86_swap # Load user registers
56 addl $0x4,%esp # Discard pointer
57 pushl __v86ret # Restore return address
60 # Swap V86 and user registers.
62 __v86_swap: xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP
63 xchgl %eax,V86_EAX(%ebp) # Swap EAX
64 xchgl %ecx,V86_ECX(%ebp) # Swap ECX
65 xchgl %edx,V86_EDX(%ebp) # Swap EDX
66 xchgl %ebx,V86_EBX(%ebp) # Swap EBX
70 xchgl %eax,V86_EFL(%ebp) # Swap
73 movl 0x8(%esp,1),%eax # Load EBP
74 xchgl %eax,V86_EBP(%ebp) # Swap
75 movl %eax,0x8(%esp,1) # Save EBP
77 xchgl %esi,V86_ESI(%ebp) # Swap ESI
78 xchgl %edi,V86_EDI(%ebp) # Swap EDI
79 xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP
82 # V86 interface structure.