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