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# $FreeBSD$ 17 18# 19# BTX V86 interface. 20# 21 22# 23# Globals. 24# 25 .global __v86int 26# 27# Fields in V86 interface structure. 28# 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 43# 44# Other constants. 45# 46 .set INT_V86,0x31 # Interrupt number 47 .set SIZ_V86,0x38 # Size of V86 structure 48# 49# V86 interface function. 50# 51__v86int: popl __v86ret # Save return address 52 pushl $__v86 # Push pointer 53 call __v86_swap # Load V86 registers 54 int $INT_V86 # To BTX 55 call __v86_swap # Load user registers 56 addl $0x4,%esp # Discard pointer 57 pushl __v86ret # Restore return address 58 ret # To user 59# 60# Swap V86 and user registers. 61# 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 67 pushl %eax # Save 68 pushf # Put eflags 69 popl %eax # in EAX 70 xchgl %eax,V86_EFL(%ebp) # Swap 71 pushl %eax # Put EAX 72 popf # in eflags 73 movl 0x8(%esp,1),%eax # Load EBP 74 xchgl %eax,V86_EBP(%ebp) # Swap 75 movl %eax,0x8(%esp,1) # Save EBP 76 popl %eax # Restore 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 80 ret # To caller 81# 82# V86 interface structure. 83# 84 .comm __v86,SIZ_V86 85 .comm __v86ret,4 86