#
# Copyright (c) 1998 Robert Nordier
# All rights reserved.
#
# Redistribution and use in source and binary forms are freely
# permitted provided that the above copyright notice and this
# paragraph and the following disclaimer are duplicated in all
# such forms.
#
# This software is provided "AS IS" and without any express or
# implied warranties, including, without limitation, the implied
# warranties of merchantability and fitness for a particular
# purpose.
#

# $FreeBSD: src/sys/boot/i386/btx/lib/btxv86.s,v 1.3 1999/08/28 00:40:08 peter Exp $

#
# BTX V86 interface.
#

#
# Globals.
#
		.global __v86int
#
# Fields in V86 interface structure.
#
		.set V86_CTL,0x0		# Control flags
		.set V86_ADDR,0x4		# Int number/address
		.set V86_ES,0x8			# V86 ES
		.set V86_DS,0xc			# V86 DS
		.set V86_FS,0x10		# V86 FS
		.set V86_GS,0x14		# V86 GS
		.set V86_EAX,0x18		# V86 EAX
		.set V86_ECX,0x1c		# V86 ECX
		.set V86_EDX,0x20		# V86 EDX
		.set V86_EBX,0x24		# V86 EBX
		.set V86_EFL,0x28		# V86 eflags
		.set V86_EBP,0x2c		# V86 EBP
		.set V86_ESI,0x30		# V86 ESI
		.set V86_EDI,0x34		# V86 EDI
#
# Other constants.
#
		.set INT_V86,0x31		# Interrupt number
		.set SIZ_V86,0x38		# Size of V86 structure
#
# V86 interface function.
#
__v86int:	popl __v86ret			# Save return address
		pushl $__v86			# Push pointer
		call __v86_swap			# Load V86 registers
		int $INT_V86			# To BTX
		call __v86_swap			# Load user registers
		addl $0x4,%esp			# Discard pointer
		pushl __v86ret			# Restore return address
		ret 				# To user
#
# Swap V86 and user registers.
#
__v86_swap:	xchgl %ebp,0x4(%esp,1)		# Swap pointer, EBP
		xchgl %eax,V86_EAX(%ebp)	# Swap EAX
		xchgl %ecx,V86_ECX(%ebp)	# Swap ECX
		xchgl %edx,V86_EDX(%ebp)	# Swap EDX
		xchgl %ebx,V86_EBX(%ebp)	# Swap EBX
		pushl %eax			# Save
		pushf 				# Put eflags
		popl %eax			#  in EAX
		xchgl %eax,V86_EFL(%ebp)	# Swap
		pushl %eax			# Put EAX
		popf 				#  in eflags
		movl 0x8(%esp,1),%eax		# Load EBP
		xchgl %eax,V86_EBP(%ebp)	# Swap
		movl %eax,0x8(%esp,1)		# Save EBP
		popl %eax			# Restore
		xchgl %esi,V86_ESI(%ebp)	# Swap ESI
		xchgl %edi,V86_EDI(%ebp)	# Swap EDI
		xchgl %ebp,0x4(%esp,1)		# Swap pointer, EBP
		ret				# To caller
#
# V86 interface structure.
#
		.comm __v86,SIZ_V86
		.comm __v86ret,4
