;; --------------------------------------------------------------------------
;;   
;;   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
