blob: a6c50b687028c0699f3b3efe81718af0d327810c [file] [log] [blame]
;; --------------------------------------------------------------------------
;;
;; Copyright 1996-2016 The NASM Authors - All Rights Reserved
;; See the file AUTHORS included with the NASM distribution for
;; the specific copyright holders.
;;
;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following
;; conditions are met:
;;
;; * Redistributions of source code must retain the above copyright
;; notice, this list of conditions and the following disclaimer.
;; * Redistributions in binary form must reproduce the above
;; copyright notice, this list of conditions and the following
;; disclaimer in the documentation and/or other materials provided
;; with the distribution.
;;
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
;; CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
;; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
;; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
;; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
;; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
;; EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;;
;; --------------------------------------------------------------------------
; Standard macro set for NASM -*- nasm -*-
; Macros to make NASM ignore some TASM directives
STD: tasm
%idefine IDEAL
%idefine JUMPS
%idefine P386
%idefine P486
%idefine P586
%idefine END
; The normal standard macros
STD: nasm
; Note that although some user-level forms of directives are defined
; here, not all of them are: the user-level form of a format-specific
; directive should be defined in the module for that directive.
; These three need to be defined, though the actual definitions will
; be constantly updated during preprocessing.
%define __FILE__
%define __LINE__
%define __BITS__
%define __SECT__ ; it ought to be defined, even if as nothing
%imacro section 1+.nolist
%define __SECT__ [section %1]
__SECT__
%endmacro
%imacro segment 1+.nolist
%define __SECT__ [segment %1]
__SECT__
%endmacro
%define __SECTALIGN_ALIGN_UPDATES_SECTION__ 1
%imacro sectalign 1.nolist
%ifnum %1
%if __SECTALIGN_ALIGN_UPDATES_SECTION__ = 1
[sectalign %1]
%endif
%else
%ifidni %1,off
%define __SECTALIGN_ALIGN_UPDATES_SECTION__ 0
%elifidni %1,on
%define __SECTALIGN_ALIGN_UPDATES_SECTION__ 1
%endif
%endif
%endmacro
%imacro absolute 1+.nolist
%define __SECT__ [absolute %1]
__SECT__
%endmacro
%imacro struc 1-2.nolist 0
%push
%define %$strucname %1
[absolute %2]
%$strucname: ; allow definition of `.member' to work sanely
%endmacro
%imacro endstruc 0.nolist
%{$strucname}_size equ ($-%$strucname)
%pop
__SECT__
%endmacro
%imacro istruc 1.nolist
%push
%define %$strucname %1
%$strucstart:
%endmacro
%imacro at 1-2+.nolist
times (%1-%$strucname)-($-%$strucstart) db 0
%2
%endmacro
%imacro iend 0.nolist
times %{$strucname}_size-($-%$strucstart) db 0
%pop
%endmacro
%imacro align 1-2+.nolist nop
sectalign %1
times (((%1) - (($-$$) % (%1))) % (%1)) %2
%endmacro
%imacro alignb 1-2+.nolist
sectalign %1
%ifempty %2
resb (((%1) - (($-$$) % (%1))) % (%1))
%else
times (((%1) - (($-$$) % (%1))) % (%1)) %2
%endif
%endmacro
%imacro bits 1+.nolist
[bits %1]
%endmacro
%imacro use16 0.nolist
[bits 16]
%endmacro
%imacro use32 0.nolist
[bits 32]
%endmacro
%imacro use64 0.nolist
[bits 64]
%endmacro
%imacro extern 1-*.nolist
%rep %0
[extern %1]
%rotate 1
%endrep
%endmacro
%imacro static 1-*.nolist
%rep %0
[static %1]
%rotate 1
%endrep
%endmacro
%imacro global 1-*.nolist
%rep %0
[global %1]
%rotate 1
%endrep
%endmacro
%imacro common 1-*.nolist
%rep %0
[common %1]
%rotate 1
%endrep
%endmacro
%imacro cpu 1+.nolist
[cpu %1]
%endmacro
%define __FLOAT_DAZ__ nodaz
%define __FLOAT_ROUND__ near
; __FLOAT__ contains the whole floating-point configuration so it can
; be saved and restored
%define __FLOAT__ __FLOAT_DAZ__,__FLOAT_ROUND__
%imacro float 1-*.nolist
%rep %0
[float %1]
%ifidni %1,daz
%define __FLOAT_DAZ__ daz
%elifidni %1,nodaz
%define __FLOAT_DAZ__ nodaz
%elifidni %1,near
%define __FLOAT_ROUND__ near
%elifidni %1,up
%define __FLOAT_ROUND__ up
%elifidni %1,down
%define __FLOAT_ROUND__ down
%elifidni %1,zero
%define __FLOAT_ROUND__ zero
%elifidni %1,default
%define __FLOAT_DAZ__ nodaz
%define __FLOAT_ROUND__ near
%endif
%rotate 1
%endrep
%endmacro
%imacro default 1+.nolist
[default %1]
%endmacro
%imacro userel 0.nolist
[default rel]
%endmacro
%imacro useabs 0.nolist
[default abs]
%endmacro
%imacro usebnd 0.nolist
[default bnd]
%endmacro
%imacro usenobnd 0.nolist
[default nobnd]
%endmacro
%imacro incbin 1-2+.nolist 0
%push
%pathsearch %$dep %1
%depend %$dep
%? %$dep,%2
%pop
%endmacro