!************************************************************************** !* !* Boot-ROM-Code to load an operating system across a TCP/IP network. !* !* Module: general.inc !* Purpose: General assembler definitions. This has to be the first !* file to be included into any assembler file. !* Entries: None !* !************************************************************************** !* !* Copyright (C) 1998-2003 Gero Kuhlmann !* !* 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 !* 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., 675 Mass Ave, Cambridge, MA 02139, USA. !* !* $Id: general.inc,v 1.4 2003/01/25 23:29:40 gkminix Exp $ !* #ifndef _GENERAL_INC #define _GENERAL_INC ! !************************************************************************** ! ! With the following definition all further include files switch to ! assembler definitions. Therefore, this file has to come before any ! other assembler include file. ! #define _USE_ASSEMBLER 1 ! !************************************************************************** ! ! Define the processor type to use. We define the assembler use ! instruction as a preprocessor macro so that we can easily change ! to 386 instructions when required. ! #define USE386 use16 386 ! use 386 instructions #ifdef P86 # define USETYPE use16 86 ! use only 8086 instructions #else # ifdef P186 # define USETYPE use16 186 ! may also use 80186 special instructions # define IS186 # else # ifdef P286 # define USETYPE use16 286 ! may also use 80286 special instructions # define IS186 # define IS286 # else # define USETYPE use16 386 ! this is the default # define IS186 # define IS286 # define IS386 # endif # endif #endif ! ! Check if are using the optimizer. This check is required because the ! optimizer uses a different register layout for procedure returns then ! the compiler would normally use. ! #if defined(IS386) && defined(OPTIMIZE) # define OPT386 #endif ! ! Now set the processor type for the assembler ! USETYPE ! !************************************************************************** ! ! Macros to make things easier with different processors ! ! Standard shift and rotate instructions ! macro shift #ifdef IS186 ?1 ?2,#?3 #else if ?3 > 1 push cx mov cl,#?3 ?1 ?2,cl pop cx else ?1 ?2,#1 endif #endif mend ! ! Push all registers onto stack (except segment registers) ! macro pushall #ifdef IS386 pushad PUSHA_AX set $001C PUSHA_CX set $0018 PUSHA_DX set $0014 PUSHA_BX set $0010 PUSHA_SP set $000C PUSHA_BP set $0008 PUSHA_SI set $0004 PUSHA_DI set $0000 PUSHA_SIZE set $0020 #else # ifdef IS186 pusha # else push ax push cx push dx push bx push sp push bp push si push di # endif PUSHA_AX set $000E PUSHA_CX set $000C PUSHA_DX set $000A PUSHA_BX set $0008 PUSHA_SP set $0006 PUSHA_BP set $0004 PUSHA_SI set $0002 PUSHA_DI set $0000 PUSHA_SIZE set $0010 #endif mend ! ! Pop all registers from stack (except segment registers) ! macro popall #ifdef IS386 popad #else # ifdef IS186 popa # else pop di pop si pop bp pop ax ! SP is discarded pop bx pop dx pop cx pop ax # endif #endif mend ! ! Setup standard stackframe ! __last_args set 0 macro penter #ifdef IS286 if ?1 > 0 enter ?1,0 else push bp mov bp,sp endif #else push bp mov bp,sp if ?1 > 0 sub sp,#?1 endif #endif __last_args set ?1 mend ! ! Terminate standard stackframe ! macro pleave #ifdef IS286 leave #else if __last_args > 0 mov sp,bp endif pop bp #endif mend ! ! Get an argument from the stack using a constant argument number ! macro getcarg mov ?1,[bp + (?2 * 2) + 4] mend #ifdef IS386 ! ! Get an argument into a 386 32-bit register ! macro getlarg ifc (?3,dword) mov ?1,?3 ptr [bp + (?2 * 2) + 4] else movzx ?1,?3 ptr [bp + (?2 * 2) + 4] endif mend #endif ! ! Get an argument from the stack using an argument number in a register ! macro getrarg ifc (?1,si) mov si,?2 shl si,#1 mov si,[bp + si + 4] else push si mov si,?2 shl si,#1 mov ?1,[bp + si + 4] pop si endif mend ! !************************************************************************** ! ! Include the corresponding C header file. Due to the _USE_ASSEMBLER ! definition, this will automatically include only those definitions ! which are necessary for assembler modules. ! #include ! !************************************************************************** ! ! BIOS interrupt vectors: ! INT_VIDEO equ $10 ! BIOS screen vector INT_EQUIP equ $11 ! BIOS equipment flags INT_MEMORY equ $12 ! BIOS determine amount of base memory INT_DISK equ $13 ! BIOS disk vector INT_AUX equ $14 ! BIOS aux I/O vector INT_MISC equ $15 ! BIOS misc function vector INT_KBD equ $16 ! BIOS keyboard vector INT_PRINT equ $17 ! BIOS printer output vector INT_BOOTROM equ $18 ! ROM entry interrupt INT_BOOTFAIL equ $18 ! PnP BIOS boot fail interrupt INT_BOOTSTRAP equ $19 ! Bootstrap interrupt INT_PXE equ $1A ! PXE interface interrupt INT_TIME equ $1A ! BIOS time/date vector INT_PCI equ $1A ! PCI BIOS vector ! !************************************************************************** ! ! Size of processor interrupt descriptor table ! IDT_NUM equ 256 ! number of interrupt vectors in IDT IDT_SIZE equ (IDT_NUM * 4) ! size of IDT ! !************************************************************************** ! #endif