/* * FreeLoader * Copyright (C) 1998-2002 Brian Palmer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include .code32 EXTERN SwitchToReal:PROC EXTERN ContinueAddress:DWORD Int386_regsin: .long 0 Int386_regsout: .long 0 /* * int Int386(int ivec, REGS* in, REGS* out); */ PUBLIC _Int386 _Int386: /* Get the function parameters */ mov eax, dword ptr [esp + 4] mov dword ptr ds:[BSS_IntVector], eax mov eax, dword ptr [esp + 8] mov dword ptr [Int386_regsin], eax mov eax, dword ptr [esp + 12] mov dword ptr [Int386_regsout], eax /* Save all registers + segment registers */ push ds push es push fs push gs pusha /* Copy input registers */ mov esi, dword ptr [Int386_regsin] mov edi, BSS_RegisterSet mov ecx, REGS_SIZE / 4 rep movsd /* Set the function ID */ mov bx, FNID_Int386 /* Set continue address and switch to real mode */ mov dword ptr [ContinueAddress], offset Int386_return jmp SwitchToReal Int386_return: /* Copy output registers */ mov esi, BSS_RegisterSet mov edi, dword ptr [Int386_regsout] mov ecx, REGS_SIZE / 4 rep movsd popa pop gs pop fs pop es pop ds ret END