1# 2# Copyright (c) 1998 Robert Nordier 3# All rights reserved. 4# 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 8# such forms. 9# 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 13# purpose. 14# 15 16# 17# BTX V86 interface. 18# 19 20# 21# Globals. 22# 23 .global __v86int 24# 25# Fields in V86 interface structure. 26# 27 .set V86_CTL,0x0 # Control flags 28 .set V86_ADDR,0x4 # Int number/address 29 .set V86_ES,0x8 # V86 ES 30 .set V86_DS,0xc # V86 DS 31 .set V86_FS,0x10 # V86 FS 32 .set V86_GS,0x14 # V86 GS 33 .set V86_EAX,0x18 # V86 EAX 34 .set V86_ECX,0x1c # V86 ECX 35 .set V86_EDX,0x20 # V86 EDX 36 .set V86_EBX,0x24 # V86 EBX 37 .set V86_EFL,0x28 # V86 eflags 38 .set V86_EBP,0x2c # V86 EBP 39 .set V86_ESI,0x30 # V86 ESI 40 .set V86_EDI,0x34 # V86 EDI 41# 42# Other constants. 43# 44 .set INT_V86,0x31 # Interrupt number 45 .set SIZ_V86,0x38 # Size of V86 structure 46# 47# V86 interface function. 48# 49__v86int: popl __v86ret # Save return address 50 pushl $__v86 # Push pointer 51 call __v86_swap # Load V86 registers 52 int $INT_V86 # To BTX 53 call __v86_swap # Load user registers 54 addl $0x4,%esp # Discard pointer 55 pushl __v86ret # Restore return address 56 ret # To user 57# 58# Swap V86 and user registers. 59# 60__v86_swap: xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP 61 xchgl %eax,V86_EAX(%ebp) # Swap EAX 62 xchgl %ecx,V86_ECX(%ebp) # Swap ECX 63 xchgl %edx,V86_EDX(%ebp) # Swap EDX 64 xchgl %ebx,V86_EBX(%ebp) # Swap EBX 65 pushl %eax # Save 66 pushf # Put eflags 67 popl %eax # in EAX 68 xchgl %eax,V86_EFL(%ebp) # Swap 69 pushl %eax # Put EAX 70 popf # in eflags 71 movl 0x8(%esp,1),%eax # Load EBP 72 xchgl %eax,V86_EBP(%ebp) # Swap 73 movl %eax,0x8(%esp,1) # Save EBP 74 popl %eax # Restore 75 xchgl %esi,V86_ESI(%ebp) # Swap ESI 76 xchgl %edi,V86_EDI(%ebp) # Swap EDI 77 xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP 78 ret # To caller 79# 80# V86 interface structure. 81# 82 .comm __v86,SIZ_V86 83 .comm __v86ret,4 84