;; -------------------------------------------------------------------------- ;; ;; 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 extern 1-*.nolist %rep %0 [extern %1] %rotate 1 %endrep %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 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