summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2002-04-30 21:08:42 +0000
committerH. Peter Anvin <hpa@zytor.com>2002-04-30 21:08:42 +0000
commit005b39c856917f060973f8d07c98d111b67d0a7f (patch)
tree47f03e86ef15c8deebf35096f358adca27892850
parent9a633fa3b9b5c772daf4cbca89093bfcd387359b (diff)
downloadnasm-005b39c856917f060973f8d07c98d111b67d0a7f.tar.gz
nasm-005b39c856917f060973f8d07c98d111b67d0a7f.tar.bz2
nasm-005b39c856917f060973f8d07c98d111b67d0a7f.zip
NASM 0.98.26
-rw-r--r--AUTHORS6
-rw-r--r--ChangeLog6
-rw-r--r--Doxyfile752
-rw-r--r--Mkfiles/README4
-rw-r--r--README27
-rw-r--r--README.1st100
-rw-r--r--README03.txt49
-rw-r--r--README09b.txt82
-rw-r--r--TODO8
-rw-r--r--c16.mac82
-rw-r--r--c32.mac52
-rw-r--r--changed.asm383
-rw-r--r--doc/Changes542
-rw-r--r--doc/License (renamed from Licence)0
-rw-r--r--doc/Readme49
-rw-r--r--doc/Wishlist276
-rw-r--r--exebin.mac114
-rw-r--r--internal.doc291
-rw-r--r--lcc/README52
-rw-r--r--misc/README2
-rw-r--r--nasm.h2
-rw-r--r--ndisasm.doc199
-rw-r--r--proc32.ash441
-rw-r--r--rdoff/Changes63
-rw-r--r--rdoff/Mkfiles/Makefile.dj75
-rw-r--r--rdoff/Mkfiles/Makefile.emx76
-rw-r--r--rdoff/Mkfiles/Makefile.sc56
-rw-r--r--rdoff/Mkfiles/Makefile.unx75
-rw-r--r--rdoff/Mkfiles/README4
-rw-r--r--rdoff/ldrdf1.c728
-rw-r--r--rdoff/test/makelib14
-rw-r--r--rdoff/v1/README5
-rw-r--r--rdoff/v1/collectn.c40
-rw-r--r--rdoff/v1/collectn.h22
-rw-r--r--rdoff/v1/ldrdf.c728
-rw-r--r--rdoff/v1/rdf.doc99
-rw-r--r--rdoff/v1/rdf2bin.c125
-rw-r--r--rdoff/v1/rdfdump.c167
-rw-r--r--rdoff/v1/rdflib.c235
-rw-r--r--rdoff/v1/rdfload.c173
-rw-r--r--rdoff/v1/rdfload.h29
-rw-r--r--rdoff/v1/rdlib.c88
-rw-r--r--rdoff/v1/rdlib.h18
-rw-r--r--rdoff/v1/rdoff.c397
-rw-r--r--rdoff/v1/rdoff.h118
-rw-r--r--rdoff/v1/rdoff.txt114
-rw-r--r--rdoff/v1/rdx.c61
-rw-r--r--rdoff/v1/symtab.c80
-rw-r--r--rdoff/v1/symtab.h22
-rw-r--r--scitech.txt213
50 files changed, 1259 insertions, 6085 deletions
diff --git a/AUTHORS b/AUTHORS
index fb10957..0d06b78 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -27,6 +27,7 @@ N: Frank Kotler
E: fbkotler@nettaxi.com
D: Bug smashing.
D: Documentation - "KATMAI" and "3DNow!" instructions supported by 0.98
+D: General coordination and moral support.
N: Stephen Silver
E: nasm@argentum.freeserve.co.uk
@@ -88,3 +89,8 @@ N: Edward J. Beroset
E: beroset@mindspring.com
D: added %substr and %strlen
+N: Stanislav Karchebny, aka berkus, madfire, daemonhunter
+E: madfire@users.sourceforge.net
+D: multiple sections support for -fbin format
+D: cvs maintenance
+D: webpage at http://nasm.2y.net maintenance
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..13f7c28
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,6 @@
+
+2002-04-11 Stanislav Karchebny <berk@madfire.net>
+
+ * Started ChangeLog instead of Changes. ChangeLog is better because all recent changes
+ are on top of the file, easy for inspection.
+ Old entries from doc/Changes will eventually be added here.
diff --git a/Doxyfile b/Doxyfile
deleted file mode 100644
index 1bb1cc3..0000000
--- a/Doxyfile
+++ /dev/null
@@ -1,752 +0,0 @@
-# Doxyfile 1.2.5
-
-# This file describes the settings to be used by doxygen for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# General configuration options
-#---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = "NASM - the Netwide Assembler"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER = 0.98
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = doxy
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,
-# Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian,
-# Polish, Portuguese and Slovene.
-
-OUTPUT_LANGUAGE = English
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = YES
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these class will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. It is allowed to use relative paths in the argument list.
-
-STRIP_FROM_PATH =
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = NO
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a class diagram (in Html and LaTeX) for classes with base or
-# super classes. Setting the tag to NO turns the diagrams off.
-
-CLASS_DIAGRAMS = YES
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-
-SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower case letters. If set to YES upper case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# users are adviced to set this option to NO.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explict @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# reimplements.
-
-INHERIT_DOCS = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 4
-
-# The ENABLE_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consist of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C.
-# For instance some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = .
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-FILE_PATTERNS = *.c *.h
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE =
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-
-EXCLUDE_PATTERNS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS =
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-
-INPUT_FILTER =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse.
-
-FILTER_SOURCE_FILES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet
-
-HTML_STYLESHEET =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript and frames is required (for instance Netscape 4.0+
-# or Internet explorer 4.0+).
-
-GENERATE_TREEVIEW = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimised for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = YES
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using a WORD or other.
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assigments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = YES
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed.
-
-PREDEFINED =
-
-# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED =
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tagfiles.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = NO
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to
-# YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other
-# documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to
-# YES then doxygen will generate a graph for each documented header file showing
-# the documented files that directly or indirectly include this file
-
-INCLUDED_BY_GRAPH = YES
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT = 1024
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
-
-# The CGI_NAME tag should be the name of the CGI script that
-# starts the search engine (doxysearch) with the correct parameters.
-# A script with this name will be generated by doxygen.
-
-CGI_NAME = search.cgi
-
-# The CGI_URL tag should be the absolute URL to the directory where the
-# cgi binaries are located. See the documentation of your http daemon for
-# details.
-
-CGI_URL =
-
-# The DOC_URL tag should be the absolute URL to the directory where the
-# documentation is located. If left blank the absolute path to the
-# documentation, with file:// prepended to it, will be used.
-
-DOC_URL =
-
-# The DOC_ABSPATH tag should be the absolute path to the directory where the
-# documentation is located. If left blank the directory on the local machine
-# will be used.
-
-DOC_ABSPATH =
-
-# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
-# is installed.
-
-BIN_ABSPATH = /usr/local/bin/
-
-# The EXT_DOC_PATHS tag can be used to specify one or more paths to
-# documentation generated for other projects. This allows doxysearch to search
-# the documentation for these projects as well.
-
-EXT_DOC_PATHS =
diff --git a/Mkfiles/README b/Mkfiles/README
new file mode 100644
index 0000000..7e68499
--- /dev/null
+++ b/Mkfiles/README
@@ -0,0 +1,4 @@
+These are pre-created Makefiles for various platforms, use them if
+GNU autoconf/automake packages are not supported on your system.
+
+Copy appropriate Makefile to ../Makefile and run make.
diff --git a/README b/README
new file mode 100644
index 0000000..755a465
--- /dev/null
+++ b/README
@@ -0,0 +1,27 @@
+ NASM, the Netwide Assembler.
+ Version 0.98.26.
+
+Many many developers all over the net respect NASM for what it is
+- a widespread (thus netwide), portable (thus netwide!), very
+flexible and mature assembler tool with support for many output
+formats (thus netwide!!).
+
+Now we have good news for you: NASM is licensed under LGPL.
+This means its development is open to even wider society of
+programmers wishing to improve their lovely assembler.
+
+The NASM project is now situated at SourceForge.net, the most
+famous Open Source development center on The Net.
+
+Visit our development page at http://nasm.2y.net and our
+SF project at http://sf.net/projects/nasm
+
+The NASM documentation is in process of severe re-arrangement
+(especially the License issues with sourcecode, the old
+license can be found in doc/License), all files from previous
+releases that didn't go thru the process yet are placed in doc/
+subdirectory. Look there if you don't find a file you need here.
+
+
+ With best regards,
+ NASM crew.
diff --git a/README.1st b/README.1st
deleted file mode 100644
index aa9557b..0000000
--- a/README.1st
+++ /dev/null
@@ -1,100 +0,0 @@
-PROLOGUE
-
-One day someone wrote that nasm needs:
-
-> - A good ALIGN mechanism, similar to GAS's. GAS pads out space by
-> means of the following (32-bit) instructions:
-> 8DB42600000000 lea esi,[esi+0x0]
-> 8DB600000000 lea esi,[esi+0x0]
-> 8D742600 lea esi,[esi+0x0]
-> 8D7600 lea esi,[esi+0x0]
-> 8D36 lea esi,[esi]
-> 90 nop
-> It uses up to two of these instructions to do up to 14-byte pads;
-> when more than 14 bytes are needed, it issues a (short) jump to
-> the end of the padded section and then NOPs the rest. Come up with
-> a similar scheme for 16 bit mode, and also come up with a way to
-> use it - internal to the assembler, so that programs using ALIGN
-> don't knock over preprocess-only mode.
-> Also re-work the macro form so that when given one argument in a
-> code section it calls this feature.
-
-Well palign is your friend.
-
-
- This is a modified version of nasm-0.98.24 that can accept
-two new directives.The two new directives that control
-the align mechanism are 'palign' and 'p2align'.They are nasm directives
-that don't depend on preprocessor but rather align the code while assembling
-in a gas-like style.
- The syntax of these directives is
-
-[palign n] where '0 <= n <= 6' and
-[p2align n] where '0 <= n <=6'
-
- The use of these directives is
-
-[palign n]
-
- Pad the location counter to a particular storage boundary.
-The n is a number between 0 and 6 of low-order zero bits the location counter
-must have after advancement.
-For example `palign 3' advances the location counter until
-it a multiple of 8.If the location counter is already a multiple of 8,
-no change is needed.
-If n=0 then nothing is done
-if n => 6 then palign advances the location counter until it a multiple
-of 64.For now the maximum is 64 bytes,if you want more use the ALIGN macro.
-
-[p2align n]
-
- This directive do almost the same thing with a little exception.
-It will continue aligning until a directive [p2align 0] meet or until
-the current section changes.So this piece of code
-
- BITS 32
- SECTION .text
- [p2align 5]
-
- ;some code here
-
-
- SECTION .data
-
- ;some data here
-
-guarantee that all the instructions in the code segment will be aligned
-in a 32 byte boundary so than no instruction break the cache line on a
-pentium processor.
-
-BUGS
-
-Well my english are very very bad.
-This optimization will not work
-for now for 16-bit code.
-Also there may be a problem with the prefixes like ds,es,rep,lock etc
-
-so this code will work
-
- 'rep movsd'
-
-but this may not work
-
- 'rep'
- 'movsd'
-
-if you want to be sure put the prefix in the same line
-with the instruction.
-
-Also don't try this in a data or a bss segment.Use the ALIGN macro better
-
-FEEDBACK
-
-If you have any suggestion, comment or found a bug please email me
-and i will try to reply immediately.
-From your feedback it depends this project to get better as i intend
-to implement more things and improve the code in the next version of nasm.
-
-AUTHOR
-Panos Minos 03-04-2002
-email: <panosminos@mycosmos.gr> , <panosminos1@mycosmos.gr>
diff --git a/README03.txt b/README03.txt
deleted file mode 100644
index 8d35390..0000000
--- a/README03.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-
- README
- NASM, the Netwide Assembler
-
-
- Changes from 0.98 release to 98.03 as of 27-Jul-2000
- ====================================================
-
-1. Added signed byte optimizations for the 0x81/0x83 class
-of instructions: ADC, ADD, AND, CMP, OR, SBB, SUB, XOR:
-when used as 'ADD reg16,imm' or 'ADD reg32,imm.' Also
-optimization of signed byte form of 'PUSH imm' and 'IMUL
-reg,imm'/'IMUL reg,reg,imm.' No size specification is needed.
-
-2. Added multi-pass JMP and Jcc offset optimization. Offsets
-on forward references will preferentially use the short form,
-without the need to code a specific size (short or near) for
-the branch. Added instructions for 'Jcc label' to use the
-form 'Jnotcc $+3/JMP label', in cases where a short offset
-is out of bounds. If compiling for a 386 or higher CPU, then
-the 386 form of Jcc will be used instead.
-
-This feature is controlled by a new command-line switch: "O",
-(upper case letter O). "-O0" reverts the assembler to no
-extra optimization passes, "-O1" allows up to 5 extra passes,
-and "-O2"(default), allows up to 10 extra optimization passes.
-
-3. Added a new directive: 'cpu XXX', where XXX is any of:
-8086, 186, 286, 386, 486, 586, pentium, 686, PPro, P2, P3 or
-Katmai. All are case insensitive. All instructions will
-be selected only if they apply to the selected cpu or lower.
-Corrected a couple of bugs in cpu-dependence in 'insns.dat'.
-
-4. Added to 'standard.mac', the "use16" and "use32" forms of
-the "bits 16/32" directive. This is nothing new, just conforms
-to a lot of other assemblers. (minor)
-
-5. Changed label allocation from 320/32 (10000 labels @ 200K+)
-to 32/37 (1000 labels); makes running under DOS much easier.
-Since additional label space is allocated dynamically, this
-should have no effect on large programs with lots of labels.
-The 37 is a prime, believed to be better for hashing. (minor)
-
-6. Integrated patchfile 0.98-0.98.01. I call this version
-0.98.03, for historical reasons: 0.98.02 was trashed.
-
---John Coffman <johninsd@san.rr.com> 27-Jul-2000
-
-(end) \ No newline at end of file
diff --git a/README09b.txt b/README09b.txt
deleted file mode 100644
index affb91a..0000000
--- a/README09b.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-
- README
- NASM, the Netwide Assembler
-
-
- Changes from 0.98.07 release to 98.09b as of 28-Oct-2001
- ========================================================
-
-1. More closely compatible with 0.98 when -O0 is implied
-or specified. Not strictly identical, since backward
-branches in range of short offsets are recognized, and signed
-byte values with no explicit size specification will be
-assembled as a single byte.
-
-2. More forgiving with the PUSH instruction. 0.98 requires
-a size to be specified always. 0.98.09b will imply the size
-from the current BITS setting (16 or 32).
-
-3. Changed definition of the optimization flag:
-
- -O0 strict two-pass assembly, JMP and Jcc are
- handled more like 0.98, except that back-
- ward JMPs are short, if possible.
-
- -O1 strict two-pass assembly, but forward
- branches are assembled with code guaranteed
- to reach; may produce larger code than
- -O0, but will produce successful assembly
- more often if branch offset sizes are not
- specified.
-
- -O2 multi-pass optimization, minimize branch
- offsets; also will minimize signed immed-
- iate bytes, overriding size specification.
-
- -O3 like -O2, but more passes taken, if needed
-
-
- Changes from 0.98 release to 98.03 as of 27-Jul-2000
- ====================================================
-
-1. Added signed byte optimizations for the 0x81/0x83 class
-of instructions: ADC, ADD, AND, CMP, OR, SBB, SUB, XOR:
-when used as 'ADD reg16,imm' or 'ADD reg32,imm.' Also
-optimization of signed byte form of 'PUSH imm' and 'IMUL
-reg,imm'/'IMUL reg,reg,imm.' No size specification is needed.
-
-2. Added multi-pass JMP and Jcc offset optimization. Offsets
-on forward references will preferentially use the short form,
-without the need to code a specific size (short or near) for
-the branch. Added instructions for 'Jcc label' to use the
-form 'Jnotcc $+3/JMP label', in cases where a short offset
-is out of bounds. If compiling for a 386 or higher CPU, then
-the 386 form of Jcc will be used instead.
-
-This feature is controlled by a new command-line switch: "O",
-(upper case letter O). "-O0" reverts the assembler to no
-extra optimization passes, "-O1" allows up to 5 extra passes,
-and "-O2"(default), allows up to 10 extra optimization passes.
-
-3. Added a new directive: 'cpu XXX', where XXX is any of:
-8086, 186, 286, 386, 486, 586, pentium, 686, PPro, P2, P3 or
-Katmai. All are case insensitive. All instructions will
-be selected only if they apply to the selected cpu or lower.
-Corrected a couple of bugs in cpu-dependence in 'insns.dat'.
-
-4. Added to 'standard.mac', the "use16" and "use32" forms of
-the "bits 16/32" directive. This is nothing new, just conforms
-to a lot of other assemblers. (minor)
-
-5. Changed label allocation from 320/32 (10000 labels @ 200K+)
-to 32/37 (1000 labels); makes running under DOS much easier.
-Since additional label space is allocated dynamically, this
-should have no effect on large programs with lots of labels.
-The 37 is a prime, believed to be better for hashing. (minor)
-
-6. Integrated patchfile 0.98-0.98.01. I call this version
-0.98.03, for historical reasons: 0.98.02 was trashed.
-
---John Coffman <johninsd@san.rr.com> 27-Jul-2000
-
-(end) \ No newline at end of file
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..ab8bbdb
--- /dev/null
+++ b/TODO
@@ -0,0 +1,8 @@
+Things to do (incorporate with doc/Wishlist):
+
+1. i18n via gettext
+2. Convert shallow code model to deep code model. Tired of messing between
+lots of unrelated files (especially .c/.h stuff).
+3. Automated dependency generation for Makefile. Current looks awful and will break
+if anything changes.
+4. (as result of 2) Move output modules out*.c to output/ subdir. (?)
diff --git a/c16.mac b/c16.mac
deleted file mode 100644
index 50b5d5e..0000000
--- a/c16.mac
+++ /dev/null
@@ -1,82 +0,0 @@
-; NASM macro set to make interfacing to 16-bit programs easier -*- nasm -*-
-
-
-
-%imacro proc 1 ; begin a procedure definition
-
-%push proc
-
- global %1
-
-%1: push bp
-
- mov bp,sp
-
-%ifdef FARCODE PASCAL ; arguments may start at bp+4 or bp+6
-
-%assign %$arg 6
-
-%define %$firstarg 6
-
-%else
-
-%assign %$arg 4
-
-%define %$firstarg 4
-
-%endif
-
-%define %$procname %1
-
-%endmacro
-
-
-
-%imacro arg 0-1 2 ; used with the argument name as a label
-
-%00 equ %$arg
-
- ; we could possibly be adding some
-
- ; debug information at this point...?
-
-%assign %$arg %1+%$arg
-
-%endmacro
-
-
-
-%imacro endproc 0
-
-%ifnctx proc
-
-%error Mismatched `endproc'/`proc'
-
-%else
-
- mov sp,bp
-
- pop bp
-
-%ifdef PASCAL
-
- retf %$arg - %$firstarg
-
-%elifdef FARCODE
-
- retf
-
-%else
-
- retn
-
-%endif
-
-__end_%$procname: ; useful for calculating function size
-
-%pop
-
-%endif
-
-%endmacro
-
diff --git a/c32.mac b/c32.mac
deleted file mode 100644
index f0c116b..0000000
--- a/c32.mac
+++ /dev/null
@@ -1,52 +0,0 @@
-; NASM macro set to make interfacing to 32-bit programs easier -*- nasm -*-
-
-
-
-%imacro proc 1 ; begin a procedure definition
-
-%push proc
-
- global %1
-
-%1: push ebp
-
- mov ebp,esp
-
-%assign %$arg 8
-
-%define %$procname %1
-
-%endmacro
-
-
-
-%imacro arg 0-1 4 ; used with the argument name as a label
-
-%00 equ %$arg
-
-%assign %$arg %1+%$arg
-
-%endmacro
-
-
-
-%imacro endproc 0
-
-%ifnctx proc
-
-%error Mismatched `endproc'/`proc'
-
-%else
-
- leave
-
- ret
-
-__end_%$procname: ; useful for calculating function size
-
-%pop
-
-%endif
-
-%endmacro
-
diff --git a/changed.asm b/changed.asm
deleted file mode 100644
index 29818d1..0000000
--- a/changed.asm
+++ /dev/null
@@ -1,383 +0,0 @@
-;This file demonstrates many of the differences between NASM version X and NASM
-;version 0.97
-;
-; changed.asm is copyright (C) 1998 John S. Fine
-;
-; It may be redistributed under the same conditions as NASM as described in
-; Licence file in the NASM archive
-;_________________________________
-;
-; nasm changed.asm -l changed.lst
-;
-; When assembled without any -d switches, it includes examples which:
-; Work correctly in version X
-; and Work incorrectly and/or display warnings in version 0.97
-; and Do not prevent the generation of output in version 0.97
-;
-; Not all the differences can be seen in the .lst file. I suggest that you use
-; "ndisasm changes" to examine the code actually generated.
-;_________________________________
-;
-; nasm changed.asm -l changed.lst -doldmsg
-;
-; When assembled with -doldmsg, it adds examples which:
-; Work correctly in version X
-; and Generate error messages in version 0.97 and do not generate output
-;_________________________________
-;
-; nasm changed.asm -l changed.lst -doldcrash
-;
-; When assembled with -doldcrash, it adds examples which:
-; Work correctly in version X
-; and Cause NASM to crash in version 0.97
-;_________________________________
-;
-; nasm changed.asm -l changed.lst -dnewmsg
-;
-; When assembled with -dnewmsg, it adds examples which:
-; Generate error messages in version X
-; and Generate wrong output without warning or error message in version 0.97
-;-----------------------------------------------------------------------------
-
-; Please note that I have reported the name of the person who made the
-; correction based on very limited information. In several cases, I am sure I
-; will identify the wrong author. Please send me any corrections; I don't
-; intend to insult or exclude anyone.
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in assemble()
-;
-; The following generated "call next" / "call next-1" instead of
-; two copies of "call next"
-;
- times 2 a16 call next
-next:
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in parse_line() (and other routines)
-;
-; This used to jmp to prior.1, when it should be here.1
-;
-prior:
-.1:
-here: jmp .1
-.1:
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in assemble()
-;
-; Strings used in dq and dt were not zero filled correctly
-;
- dq 'b'
-
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in isn_names[]
-;
-; Was not recognised as an instruction
-;
- int01 ; Instead of INT1
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Jim Hague in ???
-;
-; Forward references were instruction level rather than per operand
-;
- shr word [forwardref],1
-forwardref:
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in preproc.c
-;
-; It used to silently discard id characters appended to a multi-line
-; macro parameter (such as the x in %1x below).
-;
-%macro xxx 1
-%1: nop
-%{1}x: jmp %1x
-%endmacro
-xxx yyy
-
-;-----------------------------------------------------------------------------
-; Bug added by John in preproc.c 0.98-J4, removed by John in 0.98-J5
-;
-; Tested here to make sure it stays removed
-;
-%macro TestElse 1
-%if %1=0
-%elif %1=1
-nop
-%endif
-%endmacro
-TestElse 1
-
-%ifdef oldmsg
-;***************************************************************
-;
-; The following examples will generate error messages in 0.97 and will generate
-; correct output in the new version.
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in isns.dat
-;
-; The optional "near" was not permitted on JMP and CALL
-;
- jmp near here
-
-;-----------------------------------------------------------------------------
-; Feature added by Simon in stdscan()
-;
-; You can now use the numeric value of strings in %assign
-;
-%assign xxx 'ABCD'
- dd xxx
-
-;-----------------------------------------------------------------------------
-; Feature added by John in add_vectors()
-;
-; Stranger address expressions are now supported as long as they resolve to
-; something valid.
-;
- mov ax, [eax + ebx + ecx - eax]
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in ???
-;
-; The EQU directive affected local labels in a way that was inconsistent
-; between passes
-;
-.local:
-neither equ $
- jmp .local
-
-;-----------------------------------------------------------------------------
-; Feature added by Jules in parse_line
-;
-; You can override a size specifier
-;
-%define arg1 dword [bp+4]
- cmp word arg1, 2
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in preproc.c
-;
-; You could not use a label on the same line with a macro invocation, if the
-; macro definition began with a preprocessor directive.
-;
- struc mytype
-.long resd 1
- endstruc
-
-lbl istruc mytype
- at mytype.long, dd 'ABCD'
- iend
-
-;-----------------------------------------------------------------------------
-; Warning removed by John in preproc.c
-;
-; In order to allow macros that extend the definition of instructions, I
-; disabled the warning on a multi-line macro referencing itself.
-;
-%endif ;NASM 0.97 doesn't handle %0 etc. inside false %if
-%macro push 1-* ;
-%rep %0 ;
-push %1 ;
-%rotate 1 ;
-%endrep ;
-%endmacro ;
-%ifdef oldmsg ;
-
- push ax,bx
-
-;-----------------------------------------------------------------------------
-; Warning removed by John in preproc.c
-;
-; To support other types of macros that extend the definition of instructions,
-; I disabled the warning on a multi-line macro called with the wrong number of
-; parameters. PUSH and POP can be extended equally well by either method, but
-; other intruction extensions may need one method or the other, so I made both
-; work.
-;
-; Note that neither of these warnings was really needed, because a later stage
-; of NASM would almost always give an adequate error message if the macro use
-; really was wrong.
-;
-%endif
-%macro pop 2-*
-%rep %0
-pop %1
-%rotate 1
-%endrep
-%endmacro
-%ifdef oldmsg
-
- pop ax,bx
-%endif
-
-
-%ifdef newmsg ;***************************************************************
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in parse_line() (and other routines)
-;
-; This invalid code used to assemble without errors
-;
-myself equ myself+1
- jmp myself
-
-;-----------------------------------------------------------------------------
-; Change made by John in preproc.c
-;
-; In 0.97, an id that appears as a label on a macro invocation was always
-; prepended to the first line of the macro expansion. That caused several
-; bugs, but also could be used in tricks like the arg macro in c16.mac and
-; c32.mac.
-;
-; In version X, an id that appears as a label on a macro invocation will
-; normally be defined as a label for the address at which the macro is
-; invoked, regardless of whether the first line of the macro expansion is
-; something that can take a label. The new token %00 may be used for any
-; of the situations in which the old prepend behavior was doing something
-; tricky but useful. %00 can also be used more than once and in places
-; other than the start of the expansion.
-;
-%endif
-%assign arg_off 0
-
-%imacro arg 0-1 2 ;arg defined the old way
- equ arg_off
-%assign arg_off %1+arg_off
-%endmacro
-
-%ifdef newmsg
-arg_example arg
-%endif
-
-%imacro arg2 0-1 2 ;arg defined the new way
-%00 equ arg_off
-%assign arg_off %1+arg_off
-%endmacro
-
-%ifdef oldmsg
-arg_example2 arg2
-
-;-----------------------------------------------------------------------------
-; Change made by Jules and John in INSNS.DAT
-;
-; Various instruction in which the size of an immediate is built-in to the
-; instruction set, now allow you to redundantly specify that size as long
-; as you specify it correctly
-;
- AAD byte 5
- AAM byte 5
- BT bx, byte 3
- BTC cx, byte 4
- BTR dx, byte 5
- BTS si, byte 6
- IN eax, byte 0x40
- INT byte 21h
- OUT byte 70h, ax
- RET word 2
- RETN word 2
- RETF word 4
-
-; note "ENTER" has not been changed yet.
-
-;-----------------------------------------------------------------------------
-; Enhancement by hpa in insns.dat et al
-;
-; Simplified adding new instructions, and added some missing instructions
-;
- int03 ; Instead of INT3
- ud1 ; No documented mnemonic for this one
- ud2
- sysenter
- sysexit
- syscall
- sysret
- fxsave [ebx]
- fxrstor [es:ebx+esi*4+0x3000]
-
-;-----------------------------------------------------------------------------
-; Enhancement by hpa in insns.dat et al
-;
-; Actually make SSE work, and use the -p option to ndisasm to select
-; one of several aliased opcodes
-;
- sqrtps xmm0,[ebx+10] ; SSE opcode
- paddsiw mm0,[ebx+10] ; Cyrix opcode with the same byte seq.
-
-;-----------------------------------------------------------------------------
-; Enhancement by hpa in preproc.c
-;
-; Support %undef to remoce a single-line macro
-;
-%define TEST_ME 42
-%ifndef TEST_ME
-%error "TEST_ME not defined after %define"
-%endif
-
-%undef TEST_ME
-%ifdef TEST_ME
-%error "TEST_ME defined after %undef"
-%endif
-
-;-----------------------------------------------------------------------------
-; Bug fix by hpa in insns.dat
-;
-; PSHUFW and PINSRW weren't handling the implicit sizes correctly; all of
-; the entries below are (or should be) legal
-;
- pshufw mm2, mm1, 3
- pshufw mm3,[ebx],2
- pshufw mm7,[0+edi*8],1
-
- pshufw mm2, mm1, byte 3
- pshufw mm3,[ebx],byte 2
- pshufw mm7,[0+edi*8],byte 1
-
- pshufw mm2, mm1, 3
- pshufw mm3, qword [ebx], 2
- pshufw mm7, qword [0+edi*8], 1
-
- pshufw mm2, mm1, byte 3
- pshufw mm3, qword [ebx], byte 2
- pshufw mm7, qword [0+edi*8], byte 1
-
- pinsrw mm1, [esi], 1
- pinsrw mm1, word [esi], 1
- pinsrw mm1, [esi], byte 1
- pinsrw mm1, word [esi], byte 1
-
-
-%endif ; oldmsg
-
-%ifdef oldcrash ;*************************************************************
-
-This_label_is_256_characters_long__There_used_to_be_a_bug_in_stdscan_which_made_it_crash_when_it_did_a_keyword_search_on_any_label_longer_than_255_characters__Now_anything_longer_than_MAX_KEYWORD_is_always_a_symbol__It_will_not_even_try_a_keyword_search___
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in preproc.c
-;
-; Builds of NASM that prohibit dereferencing a NULL pointer used to crash if a
-; macro that started with a blank line was invoked with a label
-;
-%macro empty_macro 0
-
-%endm
-
-emlabel empty_macro
- jmp emlabel
-
-;-----------------------------------------------------------------------------
-; Enhancement by Conan Brink in preproc.c
-;
-; Allow %rep to be nested
-;
-%rep 4
-%rep 5
- nop
-%endrep
-%endrep
-
-%endif
diff --git a/doc/Changes b/doc/Changes
new file mode 100644
index 0000000..f383182
--- /dev/null
+++ b/doc/Changes
@@ -0,0 +1,542 @@
+Change log for NASM
+===================
+
+This is the Changelog for the official releases; this is a modified
+version. For the changes from the official release, see the MODIFIED file.
+
+0.90 released October 1996
+--------------------------
+
+First release version. First support for object file output. Other
+changes from previous version (0.3x) too numerous to document.
+
+0.91 released November 1996
+---------------------------
+
+Loads of bug fixes.
+Support for RDF added.
+Support for DBG debugging format added.
+Support for 32-bit extensions to Microsoft OBJ format added.
+Revised for Borland C: some variable names changed, makefile added.
+LCC support revised to actually work.
+JMP/CALL NEAR/FAR notation added.
+`a16', `o16', `a32' and `o32' prefixes added.
+Range checking on short jumps implemented.
+MMX instruction support added.
+Negative floating point constant support added.
+Memory handling improved to bypass 64K barrier under DOS.
+$ prefix to force treatment of reserved words as identifiers added.
+Default-size mechanism for object formats added.
+Compile-time configurability added.
+`#', `@', `~' and `?' are now valid characters in labels.
+`-e' and `-k' options in NDISASM added.
+
+0.92 released January 1997
+--------------------------
+
+The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this was
+fixed. This also affected the LCC driver.
+
+Fixed a bug regarding 32-bit effective addresses of the form
+[other_register+ESP].
+
+Documentary changes, notably documentation of the fact that Borland
+Win32 compilers use `obj' rather than `win32' object format.
+
+Fixed the COMENT record in OBJ files, which was formatted
+incorrectly.
+
+Fixed a bug causing segfaults in large RDF files.
+
+OBJ format now strips initial periods from segment and group
+definitions, in order to avoid complications with the local label
+syntax.
+
+Fixed a bug in disassembling far calls and jumps in NDISASM.
+
+Added support for user-defined sections in COFF and ELF files.
+
+Compiled the DOS binaries with a sensible amount of stack, to
+prevent stack overflows on any arithmetic expression containing
+parentheses.
+
+Fixed a bug in handling of files that do not terminate in a newline.
+
+0.93 released January 1997
+--------------------------
+
+This release went out in a great hurry after semi-crippling bugs
+were found in 0.92.
+
+Really _did_ fix the stack overflows this time. *blush*
+
+Had problems with EA instruction sizes changing between passes, when
+an offset contained a forward reference and so 4 bytes were
+allocated for the offset in pass one; by pass two the symbol had
+been defined and happened to be a small absolute value, so only 1
+byte got allocated, causing instruction size mismatch between passes
+and hence incorrect address calculations. Fixed.
+
+Stupid bug in the revised ELF section generation fixed (associated
+string-table section for .symtab was hard-coded as 7, even when this
+didn't fit with the real section table). Was causing `ld' to
+seg-fault under Linux.
+
+Included a new Borland C makefile, Makefile.bc2, donated by Fox
+Cutter <lmb@comtch.iea.com>.
+
+0.94 released April 1997
+------------------------
+
+Major item: added the macro processor.
+
+Added undocumented instructions SMI, IBTS, XBTS and LOADALL286. Also
+reorganised CMPXCHG instruction into early-486 and Pentium forms.
+Thanks to Thobias Jones for the information.
+
+Fixed two more stupid bugs in ELF, which were causing `ld' to
+continue to seg-fault in a lot of non-trivial cases.
+
+Fixed a seg-fault in the label manager.
+
+Stopped FBLD and FBSTP from _requiring_ the TWORD keyword, which is
+the only option for BCD loads/stores in any case.
+
+Ensured FLDCW, FSTCW and FSTSW can cope with the WORD keyword, if
+anyone bothers to provide it. Previously they complained unless no
+keyword at all was present.
+
+Some forms of FDIV/FDIVR and FSUB/FSUBR were still inverted: a
+vestige of a bug that I thought had been fixed in 0.92. This was
+fixed, hopefully for good this time...
+
+Another minor phase error (insofar as a phase error can _ever_ be
+minor) fixed, this one occurring in code of the form
+ rol ax,forward_reference
+ forward_reference equ 1
+
+The number supplied to TIMES is now sanity-checked for positivity,
+and also may be greater than 64K (which previously didn't work on
+16-bit systems).
+
+Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik Behr.
+
+Added the INCBIN pseudo-opcode.
+
+Due to the advent of the preprocessor, the [INCLUDE] and [INC]
+directives have become obsolete. They are still supported in this
+version, with a warning, but won't be in the next.
+
+Fixed a bug in OBJ format, which caused incorrect object records to
+be output when absolute labels were made global.
+
+Updates to RDOFF subdirectory, and changes to outrdf.c.
+
+0.95 released July 1997
+-----------------------
+
+Fixed yet another ELF bug. This one manifested if the user relied on
+the default segment, and attempted to define global symbols without
+first explicitly declaring the target segment.
+
+Added makefiles (for NASM and the RDF tools) to build Win32 console
+apps under Symantec C++. Donated by Mark Junker.
+
+Added `macros.bas' and `insns.bas', QBasic versions of the Perl
+scripts that convert `standard.mac' to `macros.c' and convert
+`insns.dat' to `insnsa.c' and `insnsd.c'. Also thanks to Mark
+Junker.
+
+Changed the diassembled forms of the conditional instructions so
+that JB is now emitted as JC, and other similar changes. Suggested
+list by Ulrich Doewich.
+
+Added `@' to the list of valid characters to begin an identifier
+with.
+
+Documentary changes, notably the addition of the `Common Problems'
+section in nasm.doc.
+
+Fixed a bug relating to 32-bit PC-relative fixups in OBJ.
+
+Fixed a bug in perm_copy() in labels.c which was causing exceptions
+in cleanup_labels() on some systems.
+
+Positivity sanity check in TIMES argument changed from a warning to
+an error following a further complaint.
+
+Changed the acceptable limits on byte and word operands to allow
+things like `~10111001b' to work.
+
+Fixed a major problem in the preprocessor which caused seg-faults if
+macro definitions contained blank lines or comment-only lines.
+
+Fixed inadequate error checking on the commas separating the
+arguments to `db', `dw' etc.
+
+Fixed a crippling bug in the handling of macros with operand counts
+defined with a `+' modifier.
+
+Fixed a bug whereby object file formats which stored the input file
+name in the output file (such as OBJ and COFF) weren't doing so
+correctly when the output file name was specified on the command
+line.
+
+Removed [INC] and [INCLUDE] support for good, since they were
+obsolete anyway.
+
+Fixed a bug in OBJ which caused all fixups to be output in 16-bit
+(old-format) FIXUPP records, rather than putting the 32-bit ones in
+FIXUPP32 (new-format) records.
+
+Added, tentatively, OS/2 object file support (as a minor variant on
+OBJ).
+
+Updates to Fox Cutter's Borland C makefile, Makefile.bc2.
+
+Removed a spurious second fclose() on the output file.
+
+Added the `-s' command line option to redirect all messages which
+would go to stderr (errors, help text) to stdout instead.
+
+Added the `-w' command line option to selectively suppress some
+classes of assembly warning messages.
+
+Added the `-p' pre-include and `-d' pre-define command-line options.
+
+Added an include file search path: the `-i' command line option.
+
+Fixed a silly little preprocessor bug whereby starting a line with a
+`%!' environment-variable reference caused an `unknown directive'
+error.
+
+Added the long-awaited listing file support: the `-l' command line
+option.
+
+Fixed a problem with OBJ format whereby, in the absence of any
+explicit segment definition, non-global symbols declared in the
+implicit default segment generated spurious EXTDEF records in the
+output.
+
+Added the NASM environment variable.
+
+From this version forward, Win32 console-mode binaries will be
+included in the DOS distribution in addition to the 16-bit binaries.
+Added Makefile.vc for this purpose.
+
+Added `return 0;' to test/objlink.c to prevent compiler warnings.
+
+Added the __NASM_MAJOR__ and __NASM_MINOR__ standard defines.
+
+Added an alternative memory-reference syntax in which prefixing an
+operand with `&' is equivalent to enclosing it in square brackets,
+at the request of Fox Cutter.
+
+Errors in pass two now cause the program to return a non-zero error
+code, which they didn't before.
+
+Fixed the single-line macro cycle detection, which didn't work at
+all on macros with no parameters (caused an infinite loop). Also
+changed the behaviour of single-line macro cycle detection to work
+like cpp, so that macros like `extrn' as given in the documentation
+can be implemented.
+
+Fixed the implementation of WRT, which was too restrictive in that
+you couldn't do `mov ax,[di+abc wrt dgroup]' because (di+abc) wasn't
+a relocatable reference.
+
+0.96 released November 1997
+---------------------------
+
+Fixed a bug whereby, if `nasm sourcefile' would cause a filename
+collision warning and put output into `nasm.out', then `nasm
+sourcefile -o outputfile' still gave the warning even though the
+`-o' was honoured.
+
+Fixed name pollution under Digital UNIX: one of its header files
+defined R_SP, which broke the enum in nasm.h.
+
+Fixed minor instruction table problems: FUCOM and FUCOMP didn't have
+two-operand forms; NDISASM didn't recognise the longer register
+forms of PUSH and POP (eg FF F3 for PUSH BX); TEST mem,imm32 was
+flagged as undocumented; the 32-bit forms of CMOV had 16-bit operand
+size prefixes; `AAD imm' and `AAM imm' are no longer flagged as
+undocumented because the Intel Architecture reference documents
+them.
+
+Fixed a problem with the local-label mechanism, whereby strange
+types of symbol (EQUs, auto-defined OBJ segment base symbols)
+interfered with the `previous global label' value and screwed up
+local labels.
+
+Fixed a bug whereby the stub preprocessor didn't communicate with
+the listing file generator, so that the -a and -l options in
+conjunction would produce a useless listing file.
+
+Merged `os2' object file format back into `obj', after discovering
+that `obj' _also_ shouldn't have a link pass separator in a module
+containing a non-trivial MODEND. Flat segments are now declared
+using the FLAT attribute. `os2' is no longer a valid object format
+name: use `obj'.
+
+Removed the fixed-size temporary storage in the evaluator. Very very
+long expressions (like `mov ax,1+1+1+1+...' for two hundred 1s or
+so) should now no longer crash NASM.
+
+Fixed a bug involving segfaults on disassembly of MMX instructions,
+by changing the meaning of one of the operand-type flags in nasm.h.
+This may cause other apparently unrelated MMX problems; it needs to
+be tested thoroughly.
+
+Fixed some buffer overrun problems with large OBJ output files.
+Thanks to DJ Delorie for the bug report and fix.
+
+Made preprocess-only mode actually listen to the %line markers as it
+prints them, so that it can report errors more sanely.
+
+Re-designed the evaluator to keep more sensible track of expressions
+involving forward references: can now cope with previously-nightmare
+situations such as
+ mov ax,foo | bar
+ foo equ 1
+ bar equ 2
+
+Added the ALIGN and ALIGNB standard macros.
+
+Added PIC support in ELF: use of WRT to obtain the four extra
+relocation types needed.
+
+Added the ability for output file formats to define their own
+extensions to the GLOBAL, COMMON and EXTERN directives.
+
+Implemented common-variable alignment, and global-symbol type and
+size declarations, in ELF.
+
+Implemented NEAR and FAR keywords for common variables, plus
+far-common element size specification, in OBJ.
+
+Added a feature whereby EXTERNs and COMMONs in OBJ can be given a
+default WRT specification (either a segment or a group).
+
+Transformed the Unix NASM archive into an auto-configuring package.
+
+Added a sanity-check for people applying SEG to things which are
+already segment bases: this previously went unnoticed by the SEG
+processing and caused OBJ-driver panics later.
+
+Added the ability, in OBJ format, to deal with `MOV EAX,<segment>'
+type references: OBJ doesn't directly support dword-size segment
+base fixups, but as long as the low two bytes of the constant term
+are zero, a word-size fixup can be generated instead and it will
+work.
+
+Added the ability to specify sections' alignment requirements in
+Win32 object files and pure binary files.
+
+Added preprocess-time expression evaluation: the %assign (and
+%iassign) directive and the bare %if (and %elif) conditional. Added
+relational operators to the evaluator, for use only in %if
+constructs: the standard relationals = < > <= >= <> (and C-like
+synonyms == and !=) plus low-precedence logical operators &&, ^^ and
+||.
+
+Added a preprocessor repeat construct: %rep / %exitrep / %endrep.
+
+Added the __FILE__ and __LINE__ standard macros.
+
+Added a sanity check for number constants being greater than
+0xFFFFFFFF. The warning can be disabled.
+
+Added the %0 token whereby a variadic multi-line macro can tell how
+many parameters it's been given in a specific invocation.
+
+Added %rotate, allowing multi-line macro parameters to be cycled.
+
+Added the `*' option for the maximum parameter count on multi-line
+macros, allowing them to take arbitrarily many parameters.
+
+Added the ability for the user-level forms of EXTERN, GLOBAL and
+COMMON to take more than one argument.
+
+Added the IMPORT and EXPORT directives in OBJ format, to deal with
+Windows DLLs.
+
+Added some more preprocessor %if constructs: %ifidn / %ifidni (exact
+textual identity), and %ifid / %ifnum / %ifstr (token type testing).
+
+Added the ability to distinguish SHL AX,1 (the 8086 version) from
+SHL AX,BYTE 1 (the 286-and-upwards version whose constant happens to
+be 1).
+
+Added NetBSD/FreeBSD/OpenBSD's variant of a.out format, complete
+with PIC shared library features.
+
+Changed NASM's idiosyncratic handling of FCLEX, FDISI, FENI, FINIT,
+FSAVE, FSTCW, FSTENV, and FSTSW to bring it into line with the
+otherwise accepted standard. The previous behaviour, though it was a
+deliberate feature, was a deliberate feature based on a
+misunderstanding. Apologies for the inconvenience.
+
+Improved the flexibility of ABSOLUTE: you can now give it an
+expression rather than being restricted to a constant, and it can
+take relocatable arguments as well.
+
+Added the ability for a variable to be declared as EXTERN multiple
+times, and the subsequent definitions are just ignored.
+
+We now allow instruction prefixes (CS, DS, LOCK, REPZ etc) to be
+alone on a line (without a following instruction).
+
+Improved sanity checks on whether the arguments to EXTERN, GLOBAL
+and COMMON are valid identifiers.
+
+Added misc/exebin.mac to allow direct generation of .EXE files by
+hacking up an EXE header using DB and DW; also added test/binexe.asm
+to demonstrate the use of this. Thanks to Yann Guidon for
+contributing the EXE header code.
+
+ndisasm forgot to check whether the input file had been successfully
+opened. Now it does. Doh!
+
+Added the Cyrix extensions to the MMX instruction set.
+
+Added a hinting mechanism to allow [EAX+EBX] and [EBX+EAX] to be
+assembled differently. This is important since [ESI+EBP] and
+[EBP+ESI] have different default base segment registers.
+
+Added support for the PharLap OMF extension for 4096-byte segment
+alignment.
+
+0.97 released December 1997
+---------------------------
+
+This was entirely a bug-fix release to 0.96, which seems to have got
+cursed. Silly me.
+
+Fixed stupid mistake in OBJ which caused `MOV EAX,<constant>' to
+fail. Caused by an error in the `MOV EAX,<segment>' support.
+
+ndisasm hung at EOF when compiled with lcc on Linux because lcc on
+Linux somehow breaks feof(). ndisasm now does not rely on feof().
+
+A heading in the documentation was missing due to a markup error in
+the indexing. Fixed.
+
+Fixed failure to update all pointers on realloc() within extended-
+operand code in parser.c. Was causing wrong behaviour and seg faults
+on lines such as `dd 0.0,0.0,0.0,0.0,...'
+
+Fixed a subtle preprocessor bug whereby invoking one multi-line
+macro on the first line of the expansion of another, when the second
+had been invoked with a label defined before it, didn't expand the
+inner macro.
+
+Added internal.doc back in to the distribution archives - it was
+missing in 0.96 *blush*
+
+Fixed bug causing 0.96 to be unable to assemble its own test files,
+specifically objtest.asm. *blush again*
+
+Fixed seg-faults and bogus error messages caused by mismatching
+%rep and %endrep within multi-line macro definitions.
+
+Fixed a problem with buffer overrun in OBJ, which was causing
+corruption at ends of long PUBDEF records.
+
+Separated DOS archives into main-program and documentation to reduce
+download size.
+
+0.98 released May 1999
+----------------------
+
+Fixed a bug whereby STRUC didn't work at all in RDF.
+
+Fixed a problem with group specification in PUBDEFs in OBJ.
+
+Improved ease of adding new output formats. Contribution due to
+Fox Cutter.
+
+Fixed a bug in relocations in the `bin' format: was showing up when
+a relocatable reference crossed an 8192-byte boundary in any output
+section.
+
+Fixed a bug in local labels: local-label lookups were inconsistent
+between passes one and two if an EQU occurred between the definition
+of a global label and the subsequent use of a local label local to
+that global.
+
+Fixed a seg-fault in the preprocessor (again) which happened when
+you use a blank line as the first line of a multi-line macro
+definition and then defined a label on the same line as a call to
+that macro.
+
+Fixed a stale-pointer bug in the handling of the NASM environment
+variable. Thanks to Thomas McWilliams.
+
+ELF had a hard limit on the number of sections which caused
+segfaults when transgressed. Fixed.
+
+Added ability for ndisasm to read from stdin by using `-' as the
+filename.
+
+ndisasm wasn't outputting the TO keyword. Fixed.
+
+Fixed error cascade on bogus expression in %if - an error in
+evaluation was causing the entire %if to be discarded, thus creating
+trouble later when the %else or %endif was encountered.
+
+Forward reference tracking was instruction-granular not operand-
+granular, which was causing 286-specific code to be generated
+needlessly on code of the form `shr word [forwardref],1'. Thanks to
+Jim Hague for sending a patch.
+
+All messages now appear on stdout, as sending them to stderr serves
+no useful purpose other than to make redirection difficult.
+
+Fixed the problem with EQUs pointing to an external symbol - this
+now generates an error message.
+
+Allowed multiple size prefixes to an operand, of which only the first
+is taken into account.
+
+Incorporated John Fine's changes, including fixes of a large number
+of preprocessor bugs, some small problems in OBJ, and a reworking of
+label handling to define labels before their line is assembled, rather
+than after.
+
+Reformatted a lot of the source code to be more readable. Included
+'coding.txt' as a guideline for how to format code for contributors.
+
+Stopped nested %reps causing a panic - they now cause a slightly more
+friendly error message instead.
+
+Fixed floating point constant problems (patch by Pedro Gimeno)
+
+Fixed the return value of insn_size() not being checked for -1, indicating
+an error.
+
+Incorporated 3D now instructions.
+
+Fixed the 'mov eax, eax + ebx' bug.
+
+Fixed the GLOBAL EQU bug in ELF. Released developers release 3.
+
+Incorporated John Fine's command line parsing changes
+
+Incorporated David Lindauer's OMF debug support
+
+Made changes for LCC 4.0 support (__NASM_CDecl__, removed register size
+specification warning when sizes agree).
+
+Released NASM 0.98 Pre-release 1
+
+fixed bug in outcoff.c to do with truncating section names longer
+than 8 characters, referencing beyond end of string; 0.98 pre-release 2
+
+added response file support, improved command line handling, new layout
+help screen
+
+fixed limit checking bug, 'OUT byte nn, reg' bug, and a couple of rdoff
+related bugs, updated Wishlist; 0.98 Prerelease 3.
+
+See the file "MODIFIED" for changes after 0.98p3.
diff --git a/Licence b/doc/License
index c85c212..c85c212 100644
--- a/Licence
+++ b/doc/License
diff --git a/doc/Readme b/doc/Readme
new file mode 100644
index 0000000..dbbd18d
--- /dev/null
+++ b/doc/Readme
@@ -0,0 +1,49 @@
+
+ NetWide Assembler for the SciTech MGL
+ -------------------------------------
+
+This is a modified distribution of NASM, the Netwide Assembler. NASM
+is a prototype general-purpose x86 assembler. It will currently output
+flat-form binary files, a.out, COFF and ELF Unix object files,
+Microsoft Win32 and 16-bit DOS object files, OS/2 object files, the
+as86 object format, and a home-grown format called RDF.
+
+This version of NASM has been modified by SciTech Software such that it
+can be used to assemble source code in the SciTech MGL graphics library,
+and understands enough of TASM assembler syntax such that both NASM
+and TASM can be used to generate assembler modules for the MGL graphics
+library. A complete macro package is provided as part of the SciTech
+MGL that provides macros to help in building modules that will work with
+either assembler.
+
+A pre-compiled binary of NASM is provided as part of the SciTech MGL
+graphics library, however you may re-build the assembler from the sources
+provided. To do so make sure you have the SciTech Makefile Utilties
+correctly configured for your compiler, and then simly type:
+
+ unset DBG
+ dmake OPT=1
+
+to build an optimised, non-debug version of the assembler. If you wish
+to rebuild for a different OS other than DOS or Win32, you will need to
+first compile the DMAKE make program for your OS. See the DMAKE source
+code for more information.
+
+Licensing issues:
+-----------------
+
+For information about how you can distribute and use NASM, see the
+file Licence.
+
+The NASM web page is at http://www.cryogen.com/Nasm/
+
+Bug reports specific to the SciTech MGL should be posted to SciTech
+Software MGL newsgroups:
+
+ news://news.scitechsoft.com/scitech.mgl.developer
+
+Bug reports (and patches if you can) for NASM itself that are not SciTech
+MGL related should be sent to the authors at:
+
+ Julian Hall <jules@earthcorp.com>
+ Simon Tatham <anakin@pobox.com>
diff --git a/doc/Wishlist b/doc/Wishlist
new file mode 100644
index 0000000..ccf7760
--- /dev/null
+++ b/doc/Wishlist
@@ -0,0 +1,276 @@
+NASM Wishlist
+=============
+
+Numbers on right hand side are version numbers that it would be nice to
+have this done by. ? means I haven't looked at it yet.
+
+- Check misc/ide.cfg into RCS as Watcom IDE enhancement thingy. 0.98
+ (nop@dlc.fi)
+
+- Package the Linux Assembler HOWTO. 0.98
+
+- 3DNow!, SSE and other extensions need documenting. 0.98
+ hpa: Does it really make sense to have a whole instruction set
+ reference packaged with the assembler?
+
+- prototypes of lrotate don't match in test/*. Fix. 0.98
+
+- Build djgpp binaries for 0.98 onwards. Look into PMODE/W as a stub 0.98
+ - it might be a lot better than CWSDPMI. It's in PMW133.ZIP.
+
+- %undef operator that goes along with %define DONE
+
+- Fix `%error' giving error messages twice. 0.99
+ Not especially important, as changes planned for 1.1x below will make
+ the preprocessor be only called once.
+
+- Sort out problems with OBJ: 0.99
+ * TLINK32 doesn't seem to like SEGDEF32 et al. So for that, we
+ should avoid xxx32 records wherever we can.
+ * However, didn't we change _to_ using xxx32 at some stage? Try
+ to remember why and when.
+ * Apparently Delphi's linker has trouble with two or more
+ globals being defined inside a PUBDEF32. Don't even know if it
+ _can_ cope with a PUBDEF16.
+ * Might need extra flags. *sigh*
+
+- Symbol table output may possibly be useful. 0.99
+ Ken Martwick (kenm@efn.org) wants the following format:
+ labelname type offset(hex) repetition count
+ Possibly include xref addresses after repetition count?
+
+- There are various other bugs in outelf.c that make certain kinds 0.99
+ of relocation not work. See zbrown.asm. Looks like we may have to do
+ a major rewrite of parts of it. Compare some NASM code output with
+ equivalent GAS code output. Look at the ELF spec. Generally fix things.
+
+- NASM is currently using a kludge in ELF that involves defining 0.99
+ a symbol at a zero absolute offset. This isn't needed, as the
+ documented solution to the problem that this solves is to use
+ SHN_UNDEF.
+
+- Debug information, in all formats it can be usefully done in. 0.99
+ * including line-number record support.
+ * "George C. Lindauer" <gclind01@starbase.spd.louisville.edu>
+ wants to have some say in how this goes through.
+ * Andrew Crabtree <andrewc@rosemail.rose.hp.com> wants to help out.
+
+- Think about a line-continuation character. 0.99
+
+- Consider allowing declaration of two labels on the same line,
+ syntax 'label1[:] label2[:] ... instruction'. Need to investigate
+ feasibility. 0.99
+
+- Quoting of quotes by doubling them, in string and char constants. 0.99
+
+- Two-operand syntax for SEGMENT/SECTION macro to avoid warnings 0.99
+ of ignored section parameters on reissue of __SECT__.
+ Or maybe skip the warning if the given parameters are identical to
+ what was actually stored. Investigate.
+
+- Apparently we are not missing a PSRAQ instruction, because it
+ doesn't exist. Check that it doesn't exist as an undocumented
+ instruction, or something stupid like that. 0.99
+
+- Any assembled form starting 0x80 can also start 0x82. ndisasm 1.00
+ should know this. New special code in instruction encodings,
+ probably.
+
+- Pointing an EQU at an external symbol now generates an error. There 1.05
+ may be a better way of handling this; we should look into it.
+ Ideally, the label mechanism should be changed to cope with one
+ label being declared relative to another - that may work, but could be
+ a pain to implement (or is it? it may be easy enough that you just
+ need to declare a new offset in the same segment...) This should be done
+ before v1.0 is released. There is a comment regarding this in labels.c,
+ towards the end of the file, which discusses ways of fixing this.
+
+- nested %rep used to cause a panic. Now a more informative error 1.10
+ message is produced. This problem whould be fixed before v1.0.
+ See comment in switch() statement block for PP_REP in do_directive()
+ in preproc.c (line 1585, or thereabouts)
+
+- Contribution: zgraeme.tar contains improved hash table routines ?
+ contributed by Graeme Defty <graeme@HK.Super.NET> for use in the
+ label manager.
+
+- Contribution: zsyntax.zip contains a syntax-highlighting mode for ?
+ NASM, for use with the Aurora text editor (??).
+
+- Contribution: zvim.zip contains a syntax-highlighting mode for ?
+ NASM, for use with vim.
+
+- Contribution: zkendal1.zip and zkendal2.zip contain Kendall ?
+ Bennett's (<KendallB@scitechsoft.com>) alternative syntax stuff,
+ providing an alternative syntax mode for NASM which allows a macro
+ set to be written that allows the same source files to be
+ assembled with NASM and TASM.
+
+- Add the UD2 instruction. DONE
+
+- Add the four instructions documented in 24368901.pdf (Intel's own DONE
+ document).
+
+- Some means of avoiding MOV memoffs,EAX which apparently the 1.10?
+ Pentium pairing detector thinks modifies EAX. Similar means of
+ choosing instruction encodings where necessary.
+
+- The example of ..@ makes it clear that a ..@ label isn't just ?
+ local, but doesn't make it clear that it isn't just global either.
+
+- hpa wants an evaluator operator for ceil(log2(x)). ?
+
+- Extra reloc types in ELF: R_386_16 type 20, PC16 is 21, 8 is 22, PC8 is 23.
+ Add support for the 16s at least. ?
+
+
+- Lazy section creation or selective section output, in COFF/win32 ?
+ at least and probably other formats: don't bother to emit a section
+ if it contains no data. Particularly the default auto-created
+ section. We believe zero-length sections crash at least WLINK (in
+ win32).
+
+- Make the flags field in `struct itemplate' in insns.h a long ?
+ instead of an int.
+
+- Implement %ifref to check whether a single-line macro has ever been ?
+ expanded since (last re) definition. Or maybe not. We'll see.
+
+- add pointer to \k{insLEAVE} and \k{insENTER} in chapters about ?
+ mixed-language programming.
+
+- Some equivalent to TASM's GLOBAL directive, ie something which ?
+ defines a symbol as external if it doesn't end up being defined
+ but defines it as public if it does end up being defined.
+
+- Documentation doesn't explain about C++ name mangling. ?
+
+- see if BITS can be made to do anything sensible in obj (eg set the ?
+ default new-segment property to Use32).
+
+- OBJ: coalesce consecutive offset and segment fixups for the same ?
+ location into full-32bit-pointer fixups. This is apparently
+ necessary because some twazzock in the PowerBASIC development
+ team didn't deign to support the OMF spec the way the rest of the
+ world sees it.
+
+- Allow % to be separated from the rest of a preproc directive, for ?
+ alternative directive indentation styles.
+
+- __DATE__, __TIME__, and text variants of __NASM_MAJOR__ and ?
+ __NASM_MINOR__.
+
+- Warn on TIMES combined with multi-line macros. TIMES gets applied 1.00
+ to first line only - should bring to users' attention.
+
+- Re-work the evaluator, again, with a per-object-format fixup 1.10
+ routine, so as to be able to cope with section offsets "really"
+ being pure numbers; should be able to allow at _least_ the two
+ common idioms
+ TIMES 510-$ DB 0 ; bootsector
+ MOV AX,(PROG_END-100H)/16 ; .COM TSR
+ Would need to call the fixup throughout the evaluator, and the
+ fixup would have to be allowed to return UNKNOWN on pass one if it
+ had to. (_Always_ returning UNKNOWN on pass one, though a lovely
+ clean design, breaks the first of the above examples.)
+
+- Preprocessor identifier concatenation? 1.10
+
+- Arbitrary section names in `bin'. ?
+ Is this necessary? Is it even desirable?
+ hpa: Desirable, yes. Necessary? Probably not, but there are
+ definitely cases where it becomes quite useful.
+
+- Ability to read from a pipe. Obviously not useful under dos, so 1.10
+ memory problems with storing entire input file aren't a problem
+ either.
+
+ Related topic: file caching under DOS/32 bit... 1.10?
+ maybe even implement discardable buffers that get thrown away
+ when we get a NULL returned from malloc(). Only really useful under
+ DOS. Think about it.
+
+ Another related topic: possibly spool out the pre-processed 1.10?
+ stuff to a file, to avoid having to re-process it. Possible problems
+ with preprocessor values not known on pass 1? Have a look...
+
+ Or maybe we can spool out a pre-parsed version...? 1.10
+ Need to investigate feasibility. Does the results from the parser
+ change from pass 1 to pass 2? Would it be feasible to alter it so that
+ the parser returns an invariant result, and this is then processed
+ afterwards to resolve label references, etc?
+
+- Subsection support? ?
+
+- A good ALIGN mechanism, similar to GAS's. GAS pads out space by 1.10?
+ means of the following (32-bit) instructions:
+ 8DB42600000000 lea esi,[esi+0x0]
+ 8DB600000000 lea esi,[esi+0x0]
+ 8D742600 lea esi,[esi+0x0]
+ 8D7600 lea esi,[esi+0x0]
+ 8D36 lea esi,[esi]
+ 90 nop
+ It uses up to two of these instructions to do up to 14-byte pads;
+ when more than 14 bytes are needed, it issues a (short) jump to
+ the end of the padded section and then NOPs the rest. Come up with
+ a similar scheme for 16 bit mode, and also come up with a way to
+ use it - internal to the assembler, so that programs using ALIGN
+ don't knock over preprocess-only mode.
+ Also re-work the macro form so that when given one argument in a
+ code section it calls this feature.
+
+- Possibly a means whereby FP constants can be specified as ?
+ immediate operands to non-FP instructions.
+ * Possible syntax: MOV EAX,FLOAT 1.2 to get a single-precision FP
+ constant. Then maybe MOV EAX,HI_FLOAT 1.2 and MOV EAX,LO_FLOAT
+ 1.2 to get the two halves of a double-precision one. Best to
+ ignore extended-precision in case it bites.
+ * Alternatively, maybe MOV EAX,FLOAT(4,0-4,1.2) to get bytes 0-4
+ (ie 0-3) of a 4-byte constant. Then HI_FLOAT is FLOAT(8,4-8,x)
+ and LO_FLOAT is FLOAT(8,0-4,x). But this version allows two-byte
+ chunks, one-byte chunks, even stranger chunks, and pieces of
+ ten-byte reals to be bandied around as well.
+
+- A UNION macro might be quite cool, now that ABSOLUTE is sane ?
+ enough to be able to handle it.
+
+- An equivalent to gcc's ## stringify operator, plus string ?
+ concatenation, somehow implemented without undue ugliness, so as
+ to be able to do `%include "/my/path/%1"' in a macro, or something
+ similar...
+
+- Actually _do_ something with the processor, privileged and 1.10
+ undocumented flags in the instruction table. When this happens,
+ consider allowing PMULHRW to map to either of the Cyrix or AMD
+ versions?
+ hpa: The -p option to ndisasm now uses this to some extent.
+
+- Maybe NEC V20/V30 instructions? ?
+ hpa: What are they? Should be trivial to implement.
+
+- Yet more object formats.
+ * Possibly direct support for .EXE files? 1.10
+
+- Symbol map in binary format. Format-specific options... 1.10?
+
+- REDESIGN: Think about EQU dependency, and about start-point 1.20?
+ specification in OBJ. Possibly re-think directive support.
+
+- Think about a wrapper program like gcc? Possibly invent a _patch_ 2.00?
+ for gcc so that it can take .asm files on the command line?
+
+- If a wrapper happens, think about adding an option to cause the ?
+ resulting executable file to be executed immediately, thus
+ allowing NASM source files to have #!... (probably silly)
+
+- Multi-platform support? If so: definitely Alpha; possibly Java ?
+ byte code; probably ARM/StrongARM; maybe Sparc; maybe Mips; maybe
+ Vax. Perhaps Z80 and 6502, just for a laugh?
+
+- Consider a 'verbose' option that prints information about the ?
+ resulting object file onto stdout.
+
+- Line numbers in the .lst file don't match the line numbers in the ?
+ input. They probably should, rather than the current matching
+ of the post-preprocessor line numbers.
+
diff --git a/exebin.mac b/exebin.mac
deleted file mode 100644
index 89c6889..0000000
--- a/exebin.mac
+++ /dev/null
@@ -1,114 +0,0 @@
-; -*- nasm -*-
-
-; NASM macro file to allow the `bin' output format to generate
-
-; simple .EXE files by constructing the EXE header by hand.
-
-; Adapted from a contribution by Yann Guidon <whygee_corp@hol.fr>
-
-
-
-%define EXE_stack_size EXE_realstacksize
-
-
-
-%macro EXE_begin 0
-
- ORG 0E0h
-
- section .text
-
-
-
-header_start:
-
- db 4Dh,5Ah ; EXE file signature
-
- dw EXE_allocsize % 512
-
- dw (EXE_allocsize + 511) / 512
-
- dw 0 ; relocation information: none
-
- dw (header_end-header_start)/16 ; header size in paragraphs
-
- dw (EXE_absssize + EXE_realstacksize) / 16 ; min extra mem
-
- dw (EXE_absssize + EXE_realstacksize) / 16 ; max extra mem
-
- dw -10h ; Initial SS (before fixup)
-
- dw EXE_endbss + EXE_realstacksize ; Initial SP (1K DPMI+1K STACK)
-
- dw 0 ; (no) Checksum
-
- dw 100h ; Initial IP - start just after the header
-
- dw -10h ; Initial CS (before fixup)
-
- dw 0 ; file offset to relocation table: none
-
- dw 0 ; (no overlay)
-
- align 16,db 0
-
-header_end:
-
-
-
-EXE_startcode:
-
- section .data
-
-EXE_startdata:
-
- section .bss
-
-EXE_startbss:
-
-%endmacro
-
-
-
-%macro EXE_stack 1
-
-EXE_realstacksize equ %1
-
-%define EXE_stack_size EXE_bogusstacksize ; defeat EQU in EXE_end
-
-%endmacro
-
-
-
-%macro EXE_end 0
-
- section .text
-
-EXE_endcode:
-
- section .data
-
-EXE_enddata:
-
- section .bss
-
- alignb 4
-
-EXE_endbss:
-
-
-
-EXE_acodesize equ (EXE_endcode-EXE_startcode+3) & (~3)
-
-EXE_datasize equ EXE_enddata-EXE_startdata
-
-EXE_absssize equ (EXE_endbss-EXE_startbss+3) & (~3)
-
-EXE_allocsize equ EXE_acodesize + EXE_datasize
-
-
-
-EXE_stack_size equ 0x800 ; default if nothing else was used
-
-%endmacro
-
diff --git a/internal.doc b/internal.doc
deleted file mode 100644
index 8a73aa1..0000000
--- a/internal.doc
+++ /dev/null
@@ -1,291 +0,0 @@
-Internals of the Netwide Assembler
-==================================
-
-The Netwide Assembler is intended to be a modular, re-usable x86
-assembler, which can be embedded in other programs, for example as
-the back end to a compiler.
-
-The assembler is composed of modules. The interfaces between them
-look like:
-
- +--- preproc.c ----+
- | |
- +---- parser.c ----+
- | | |
- | float.c |
- | |
- +--- assemble.c ---+
- | | |
- nasm.c ---+ insnsa.c +--- nasmlib.c
- | |
- +--- listing.c ----+
- | |
- +---- labels.c ----+
- | |
- +--- outform.c ----+
- | |
- +----- *out.c -----+
-
-In other words, each of `preproc.c', `parser.c', `assemble.c',
-`labels.c', `listing.c', `outform.c' and each of the output format
-modules `*out.c' are independent modules, which do not directly
-inter-communicate except through the main program.
-
-The Netwide *Disassembler* is not intended to be particularly
-portable or reusable or anything, however. So I won't bother
-documenting it here. :-)
-
-nasmlib.c
----------
-
-This is a library module; it contains simple library routines which
-may be referenced by all other modules. Among these are a set of
-wrappers around the standard `malloc' routines, which will report a
-fatal error if they run out of memory, rather than returning NULL.
-
-preproc.c
----------
-
-This contains a macro preprocessor, which takes a file name as input
-and returns a sequence of preprocessed source lines. The only symbol
-exported from the module is `nasmpp', which is a data structure of
-type `Preproc', declared in nasm.h. This structure contains pointers
-to all the functions designed to be callable from outside the
-module.
-
-parser.c
---------
-
-This contains a source-line parser. It parses `canonical' assembly
-source lines, containing some combination of the `label', `opcode',
-`operand' and `comment' fields: it does not process directives or
-macros. It exports two functions: `parse_line' and `cleanup_insn'.
-
-`parse_line' is the main parser function: you pass it a source line
-in ASCII text form, and it returns you an `insn' structure
-containing all the details of the instruction on that line. The
-parameters it requires are:
-
-- The location (segment, offset) where the instruction on this line
- will eventually be placed. This is necessary in order to evaluate
- expressions containing the Here token, `$'.
-
-- A function which can be called to retrieve the value of any
- symbols the source line references.
-
-- Which pass the assembler is on: an undefined symbol only causes an
- error condition on pass two.
-
-- The source line to be parsed.
-
-- A structure to fill with the results of the parse.
-
-- A function which can be called to report errors.
-
-Some instructions (DB, DW, DD for example) can require an arbitrary
-amount of storage, and so some of the members of the resulting
-`insn' structure will be dynamically allocated. The other function
-exported by `parser.c' is `cleanup_insn', which can be called to
-deallocate any dynamic storage associated with the results of a
-parse.
-
-names.c
--------
-
-This doesn't count as a module - it defines a few arrays which are
-shared between NASM and NDISASM, so it's a separate file which is
-#included by both parser.c and disasm.c.
-
-float.c
--------
-
-This is essentially a library module: it exports one function,
-`float_const', which converts an ASCII representation of a
-floating-point number into an x86-compatible binary representation,
-without using any built-in floating-point arithmetic (so it will run
-on any platform, portably). It calls nothing, and is called only by
-`parser.c'. Note that the function `float_const' must be passed an
-error reporting routine.
-
-assemble.c
-----------
-
-This module contains the code generator: it translates `insn'
-structures as returned from the parser module into actual generated
-code which can be placed in an output file. It exports two
-functions, `assemble' and `insn_size'.
-
-`insn_size' is designed to be called on pass one of assembly: it
-takes an `insn' structure as input, and returns the amount of space
-that would be taken up if the instruction described in the structure
-were to be converted to real machine code. `insn_size' also requires
-to be told the location (as a segment/offset pair) where the
-instruction would be assembled, the mode of assembly (16/32 bit
-default), and a function it can call to report errors.
-
-`assemble' is designed to be called on pass two: it takes all the
-parameters that `insn_size' does, but has an extra parameter which
-is an output driver. `assemble' actually converts the input
-instruction into machine code, and outputs the machine code by means
-of calling the `output' function of the driver.
-
-insnsa.c
---------
-
-This is another library module: it exports one very big array of
-instruction translations. It has to be a separate module so that DOS
-compilers, with less memory to spare than typical Unix ones, can
-cope with it.
-
-labels.c
---------
-
-This module contains a label manager. It exports six functions:
-
-`init_labels' should be called before any other function in the
-module. `cleanup_labels' may be called after all other use of the
-module has finished, to deallocate storage.
-
-`define_label' is called to define new labels: you pass it the name
-of the label to be defined, and the (segment,offset) pair giving the
-value of the label. It is also passed an error-reporting function,
-and an output driver structure (so that it can call the output
-driver's label-definition function). `define_label' mentally
-prepends the name of the most recently defined non-local label to
-any label beginning with a period.
-
-`define_label_stub' is designed to be called in pass two, once all
-the labels have already been defined: it does nothing except to
-update the "most-recently-defined-non-local-label" status, so that
-references to local labels in pass two will work correctly.
-
-`declare_as_global' is used to declare that a label should be
-global. It must be called _before_ the label in question is defined.
-
-Finally, `lookup_label' attempts to translate a label name into a
-(segment,offset) pair. It returns non-zero on success.
-
-The label manager module is (theoretically :) restartable: after
-calling `cleanup_labels', you can call `init_labels' again, and
-start a new assembly with a new set of symbols.
-
-listing.c
----------
-
-This file contains the listing file generator. The interface to the
-module is through the one symbol it exports, `nasmlist', which is a
-structure containing six function pointers. The calling semantics of
-these functions isn't terribly well thought out, as yet, but it
-works (just about) so it's going to get left alone for now...
-
-outform.c
----------
-
-This small module contains a set of routines to manage a list of
-output formats, and select one given a keyword. It contains three
-small routines: `ofmt_register' which registers an output driver as
-part of the managed list, `ofmt_list' which lists the available
-drivers on stdout, and `ofmt_find' which tries to find the driver
-corresponding to a given name.
-
-The output modules
-------------------
-
-Each of the output modules, `outbin.o', `outelf.o' and so on,
-exports only one symbol, which is an output driver data structure
-containing pointers to all the functions needed to produce output
-files of the appropriate type.
-
-The exception to this is `outcoff.o', which exports _two_ output
-driver structures, since COFF and Win32 object file formats are very
-similar and most of the code is shared between them.
-
-nasm.c
-------
-
-This is the main program: it calls all the functions in the above
-modules, and puts them together to form a working assembler. We
-hope. :-)
-
-Segment Mechanism
------------------
-
-In NASM, the term `segment' is used to separate the different
-sections/segments/groups of which an object file is composed.
-Essentially, every address NASM is capable of understanding is
-expressed as an offset from the beginning of some segment.
-
-The defining property of a segment is that if two symbols are
-declared in the same segment, then the distance between them is
-fixed at assembly time. Hence every externally-declared variable
-must be declared in its own segment, since none of the locations of
-these are known, and so no distances may be computed at assembly
-time.
-
-The special segment value NO_SEG (-1) is used to denote an absolute
-value, e.g. a constant whose value does not depend on relocation,
-such as the _size_ of a data object.
-
-Apart from NO_SEG, segment indices all have their least significant
-bit clear, if they refer to actual in-memory segments. For each
-segment of this type, there is an auxiliary segment value, defined
-to be the same number but with the LSB set, which denotes the
-segment-base value of that segment, for object formats which support
-it (Microsoft .OBJ, for example).
-
-Hence, if `textsym' is declared in a code segment with index 2, then
-referencing `SEG textsym' would return zero offset from
-segment-index 3. Or, in object formats which don't understand such
-references, it would return an error instead.
-
-The next twist is SEG_ABS. Some symbols may be declared with a
-segment value of SEG_ABS plus a 16-bit constant: this indicates that
-they are far-absolute symbols, such as the BIOS keyboard buffer
-under MS-DOS, which always resides at 0040h:001Eh. Far-absolutes are
-handled with care in the parser, since they are supposed to evaluate
-simply to their offset part within expressions, but applying SEG to
-one should yield its segment part. A far-absolute should never find
-its way _out_ of the parser, unless it is enclosed in a WRT clause,
-in which case Microsoft 16-bit object formats will want to know
-about it.
-
-Porting Issues
---------------
-
-We have tried to write NASM in portable ANSI C: we do not assume
-little-endianness or any hardware characteristics (in order that
-NASM should work as a cross-assembler for x86 platforms, even when
-run on other, stranger machines).
-
-Assumptions we _have_ made are:
-
-- We assume that `short' is at least 16 bits, and `long' at least
- 32. This really _shouldn't_ be a problem, since Kernighan and
- Ritchie tell us we are entitled to do so.
-
-- We rely on having more than 6 characters of significance on
- externally linked symbols in the NASM sources. This may get fixed
- at some point. We haven't yet come across a linker brain-dead
- enough to get it wrong anyway.
-
-- We assume that `fopen' using the mode "wb" can be used to write
- binary data files. This may be wrong on systems like VMS, with a
- strange file system. Though why you'd want to run NASM on VMS is
- beyond me anyway.
-
-That's it. Subject to those caveats, NASM should be completely
-portable. If not, we _really_ want to know about it.
-
-Porting Non-Issues
-------------------
-
-The following is _not_ a portability problem, although it looks like
-one.
-
-- When compiling with some versions of DJGPP, you may get errors
- such as `warning: ANSI C forbids braced-groups within
- expressions'. This isn't NASM's fault - the problem seems to be
- that DJGPP's definitions of the <ctype.h> macros include a
- GNU-specific C extension. So when compiling using -ansi and
- -pedantic, DJGPP complains about its own header files. It isn't a
- problem anyway, since it still generates correct code.
diff --git a/lcc/README b/lcc/README
new file mode 100644
index 0000000..569b9be
--- /dev/null
+++ b/lcc/README
@@ -0,0 +1,52 @@
+This directory contains the necessary files to port the C compiler
+``LCC'' (available by FTP from sunsite.doc.ic.ac.uk in the directory
+/computing/programming/languages/c/lcc) to compile for Linux (a.out
+or ELF) by using NASM as a back-end code generator.
+
+This patch has been tested on lcc version 3.6.
+
+To install:
+
+- Copy `x86nasm.md' into the `src' directory of the lcc tree.
+
+- Copy either `lin-elf.c' or `lin-aout.c' into the `etc' directory.
+
+- If you're installing for a.out, edit `x86nasm.md' and change the
+ conditional after the comment reading "CHANGE THIS FOR a.out" in
+ the `defsymbol' function from `#if 0' to `#if 1'.
+
+- Make the following changes to `bind.c' in the `src' directory:
+
+ - Near the top of the file, add a line that reads
+ extern Interface x86nasmIR;
+
+ - In the `bindings' array, add the lines
+ "x86-nasm", &x86nasmIR,
+ "x86/nasm", &x86nasmIR,
+ (in sensible looking places...)
+
+ A sample `bind.c' has been provided to show what the result of
+ this might look like. You might be able to get away with using it
+ directly...
+
+- Modify the lcc makefile to include rules for x86nasm.o: this will
+ have to be done in about three places. Just copy any line with
+ `x86' on it and modify it to read `x86nasm' everywhere. (Except
+ that in the list of object files that rcc is made up from, do
+ remember to ensure that every line but the last has a trailing
+ backslash...)
+
+- You may have to modify the contents of `lin-elf.c' or `lin-aout.c'
+ to reflect the true locations of files such as crt0.o, crt1.o,
+ ld-linux.so and so forth. If you don't know where to find these,
+ compile a short C program with `gcc -v' and see what command line
+ gcc feeds to `ld'.
+
+- You should now be able to build lcc, using `lin-elf.c' or
+ `lin-aout.c' as the system-dependent part of the `lcc' wrapper
+ program.
+
+- Symlink x86nasm.c into the `src' directory before attempting the
+ triple test, or the compile will fail.
+
+- Now it should pass the triple test, on either ELF or a.out. Voila!
diff --git a/misc/README b/misc/README
new file mode 100644
index 0000000..f39ba4d
--- /dev/null
+++ b/misc/README
@@ -0,0 +1,2 @@
+There are various helpful bits and pieces for NASM,
+including but not limited to Simon photograph =)
diff --git a/nasm.h b/nasm.h
index 94f2bad..63400b2 100644
--- a/nasm.h
+++ b/nasm.h
@@ -13,7 +13,7 @@
#define NASM_MAJOR_VER 0
#define NASM_MINOR_VER 98
-#define NASM_VER "0.98.25alt"
+#define NASM_VER "0.98.26"
#ifndef NULL
#define NULL 0
diff --git a/ndisasm.doc b/ndisasm.doc
deleted file mode 100644
index 5b5374a..0000000
--- a/ndisasm.doc
+++ /dev/null
@@ -1,199 +0,0 @@
- The Netwide Disassembler, NDISASM
- =================================
-
-Introduction
-============
-
-The Netwide Disassembler is a small companion program to the Netwide
-Assembler, NASM. It seemed a shame to have an x86 assembler,
-complete with a full instruction table, and not make as much use of
-it as possible, so here's a disassembler which shares the
-instruction table (and some other bits of code) with NASM.
-
-The Netwide Disassembler does nothing except to produce
-disassemblies of _binary_ source files. NDISASM does not have any
-understanding of object file formats, like `objdump', and it will
-not understand DOS .EXE files like `debug' will. It just
-disassembles.
-
-Getting Started: Installation
-=============================
-
-See `nasm.doc' for installation instructions. NDISASM, like NASM,
-has a man page which you may want to put somewhere useful, if you
-are on a Unix system.
-
-Running NDISASM
-===============
-
-To disassemble a file, you will typically use a command of the form
-
- ndisasm [-b16 | -b32] filename
-
-NDISASM can disassemble 16 bit code or 32 bit code equally easily,
-provided of course that you remember to specify which it is to work
-with. If no `-b' switch is present, NDISASM works in 16-bit mode by
-default. The `-u' switch (for USE32) also invokes 32-bit mode.
-
-Two more command line options are `-r' which reports the version
-number of NDISASM you are running, and `-h' which gives a short
-summary of command line options.
-
-COM Files: Specifying an Origin
-===============================
-
-To disassemble a DOS .COM file correctly, a disassembler must assume
-that the first instruction in the file is loaded at address 0x100,
-rather than at zero. NDISASM, which assumes by default that any file
-you give it is loaded at zero, will therefore need to be informed of
-this.
-
-The `-o' option allows you to declare a different origin for the
-file you are disassembling. Its argument may be expressed in any of
-the NASM numeric formats: decimal by default, if it begins with `$'
-or `0x' or ends in `H' it's hex, if it ends in `Q' it's octal, and
-if it ends in `B' it's binary.
-
-Hence, to disassemble a .COM file:
-
- ndisasm -o100h filename.com
-
-will do the trick.
-
-Code Following Data: Synchronisation
-====================================
-
-Suppose you are disassembling a file which contains some data which
-isn't machine code, and _then_ contains some machine code. NDISASM
-will faithfully plough through the data section, producing machine
-instructions wherever it can (although most of them will look
-bizarre, and some may have unusual prefixes, e.g. `fs or
-ax,0x240a'), and generating `db' instructions every so often if it's
-totally stumped. Then it will reach the code section.
-
-Supposing NDISASM has just finished generating a strange machine
-instruction from part of the data section, and its file position is
-now one byte _before_ the beginning of the code section. It's
-entirely possible that another spurious instruction will get
-generated, starting with the final byte of the data section, and
-then the correct first instruction in the code section will not be
-seen because the starting point skipped over it. This isn't really
-ideal.
-
-To avoid this, you can specify a `synchronisation' point, or indeed
-as many synchronisation points as you like (although NDISASM can
-only handle 8192 sync points internally). The definition of a sync
-point is this: NDISASM guarantees to hit sync points exactly during
-disassembly. If it is thinking about generating an instruction which
-would cause it to jump over a sync point, it will discard that
-instruction and output a `db' instead. So it _will_ start
-disassembly exactly from the sync point, and so you _will_ see all
-the instructions in your code section.
-
-Sync points are specified using the `-s' option: they are measured
-in terms of the program origin, not the file position. So if you
-want to synchronise after 32 bytes of a .COM file, you would have to
-do
-
- ndisasm -o100h -s120h file.com
-
-rather than
-
- ndisasm -o100h -s20h file.com
-
-As stated above, you can specify multiple sync markers if you need
-to, just by repeating the `-s' option.
-
-Mixed Code and Data: Automatic (Intelligent) Synchronisation
-============================================================
-
-Suppose you are disassembling the boot sector of a DOS floppy (maybe
-it has a virus, and you need to understand the virus so that you
-know what kinds of damage it might have done you). Typically, this
-will contain a JMP instruction, then some data, then the rest of the
-code. So there is a very good chance of NDISASM being misaligned
-when the data ends and the code begins. Hence a sync point is
-needed.
-
-On the other hand, why should you have to specify the sync point
-manually? What you'd do in order to find where the sync point would
-be, surely, would be to read the JMP instruction, and then to use
-its target address as a sync point. So can NDISASM do that for you?
-
-The answer, of course, is yes: using either of the synonymous
-switches `-a' (for automatic sync) or `-i' (for intelligent sync)
-will enable auto-sync mode. Auto-sync mode automatically generates a
-sync point for any forward-referring PC-relative jump or call
-instruction that NDISASM encounters. (Since NDISASM is one-pass, if
-it encounters a PC-relative jump whose target has already been
-processed, there isn't much it can do about it...)
-
-Only PC-relative jumps are processed, since an absolute jump is
-either through a register (in which case NDISASM doesn't know what
-the register contains) or involves a segment address (in which case
-the target code isn't in the same segment that NDISASM is working
-in, and so the sync point can't be placed anywhere useful).
-
-For some kinds of file, this mechanism will automatically put sync
-points in all the right places, and save you from having to place
-any sync points manually. However, it should be stressed that
-auto-sync mode is _not_ guaranteed to catch all the sync points, and
-you may still have to place some manually.
-
-Auto-sync mode doesn't prevent you from declaring manual sync
-points: it just adds automatically generated ones to the ones you
-provide. It's perfectly feasible to specify `-i' _and_ some `-s'
-options.
-
-Another caveat with auto-sync mode is that if, by some unpleasant
-fluke, something in your data section should disassemble to a
-PC-relative call or jump instruction, NDISASM may obediently place a
-sync point in a totally random place, for example in the middle of
-one of the instructions in your code section. So you may end up with
-a wrong disassembly even if you use auto-sync. Again, there isn't
-much I can do about this. If you have problems, you'll have to use
-manual sync points, or use the `-k' option (documented below) to
-suppress disassembly of the data area.
-
-Other Options
-=============
-
-The `-e' option skips a header on the file, by ignoring the first N
-bytes. This means that the header is _not_ counted towards the
-disassembly offset: if you give `-e10 -o10', disassembly will start
-at byte 10 in the file, and this will be given offset 10, not 20.
-
-The `-k' option is provided with two comma-separated numeric
-arguments, the first of which is an assembly offset and the second
-is a number of bytes to skip. This _will_ count the skipped bytes
-towards the assembly offset: its use is to suppress disassembly of a
-data section which wouldn't contain anything you wanted to see
-anyway.
-
-Bugs and Improvements
-=====================
-
-There are no known bugs. However, any you find, with patches if
-possible, should be sent to <jules@dcs.warwick.ac.uk> or
-<anakin@pobox.com>, and we'll try to fix them. Feel free to send
-contributions and new features as well.
-
-Future plans include awareness of which processors certain
-instructions will run on, and marking of instructions that are too
-advanced for some processor (or are FPU instructions, or are
-undocumented opcodes, or are privileged protected-mode instructions,
-or whatever).
-
-That's All Folks!
-=================
-
-I hope NDISASM is of some use to somebody. Including me. :-)
-
-I don't recommend taking NDISASM apart to see how an efficient
-disassembler works, because as far as I know, it isn't an efficient
-one anyway. You have been warned.
-
-Please feel free to send comments, suggestions, or chat to
-<anakin@pobox.com>. As with NASM, no flames please.
-
-- Simon Tatham <anakin@pobox.com>, 21-Nov-96
diff --git a/proc32.ash b/proc32.ash
deleted file mode 100644
index f513b73..0000000
--- a/proc32.ash
+++ /dev/null
@@ -1,441 +0,0 @@
-;--------=========xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=========--------
-;
-; Copyright (C) 1999 by Andrew Zabolotny
-; Miscelaneous NASM macros that makes use of new preprocessor features
-;
-; This library is free software; you can redistribute it and/or
-; modify it under the terms of the GNU Library General Public
-; License as published by the Free Software Foundation; either
-; version 2 of the License, or (at your option) any later version.
-;
-; This library 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
-; Library General Public License for more details.
-;
-; You should have received a copy of the GNU Library General Public
-; License along with this library; if not, write to the Free
-; Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-;
-;--------=========xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=========--------
-
-; The macros in this file provides support for writing 32-bit C-callable
-; NASM routines. For a short description of every macros see the
-; corresponding comment before every one. Simple usage example:
-;
-; proc sin,1
-; targ %$angle
-; fld %$angle
-; fsin
-; endproc sin
-
-%ifndef __PROC32_ASH__
-%define __PROC32_ASH__
-
-[WARNING -macro-selfref]
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Mangle a name to be compatible with the C compiler
-; Arguments:
-; The name
-; Example:
-; cname (my_func)
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%ifdef EXTERNC_UNDERSCORE
- %define cname(x) _ %+ x
-%else
- %define cname(x) x
-%endif
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Import an external C procedure definition
-; Arguments:
-; The name of external C procedure
-; Example:
-; cextern printf
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro cextern 1
- %xdefine %1 cname(%1)
- %ifidni __OUTPUT_FORMAT__,obj
- extern %1:wrt FLAT
- %else
- extern %1
- %endif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Export an C procedure definition
-; Arguments:
-; The name of C procedure
-; Example:
-; cglobal my_printf
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro cglobal 1
- %xdefine %1 cname(%1)
- global %1
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Misc macros to deal with PIC shared libraries
-; Comment:
-; Note that we have a different syntax for working with and without
-; PIC shared libraries. In a PIC environment we should load first
-; the address of the variable into a register and then work through
-; that address, i.e: mov eax,myvar; mov [eax],1
-; In a non-PIC environment we should directly write: mov myvar,1
-; Example:
-; extvar myvar
-; GetGOT
-; %ifdef PIC
-; mov ebx,myvar ; get offset of myvar into ebx
-; %else
-; lea ebx,myvar
-; %endif
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%ifdef PIC
- cextern _GLOBAL_OFFSET_TABLE_
- %macro GetGOT 0
- %ifdef .$proc.stkofs
- %assign .$proc.stkofs .$proc.stkofs+4
- %endif
- call %$Get_GOT
- %$Get_GOT:
- pop ebx
- add ebx,_GLOBAL_OFFSET_TABLE_ + $$ - %$Get_GOT wrt ..gotpc
- %endmacro
- %macro extvar 1
- cextern %1
- %xdefine %1 [ebx+%1 wrt ..got]
- %endmacro
-%else
- %define GetGOT
- %macro extvar 1
- cextern %1
- %endmacro
-%endif
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Begin a procedure definition
-; For performance reasons we don't use stack frame pointer EBP,
-; instead we're using the [esp+xx] addressing. Because of this
-; you should be careful when you work with stack pointer.
-; The push/pop instructions are macros that are defined to
-; deal correctly with these issues.
-; Arguments:
-; First argument - the procedure name
-; Second optional argument - the number of bytes for local variables
-; The following arguments could specify the registers that should be
-; pushed at beginning of procedure and popped before exiting
-; Example:
-; proc MyTestProc
-; proc MyTestProc,4,ebx,esi,edi
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro proc 1-3+ 0
- cglobal %1
- %push %1
- align 16
-%1:
- %xdefine %$proc.name %1
- ; total size of local arguments
- %assign %$proc.locsize (%2+3) & 0xFFFC
- ; offset from esp to argument
- %assign %$proc.argofs 4+%$proc.locsize
- ; additional offset to args (tracks push/pops)
- %assign .$proc.stkofs 0
- ; offset from esp to local arguments
- %assign %$proc.locofs 0
- ; Now push the registers that we should save
- %define %$proc.save %3
- %if %$proc.locsize != 0
- sub esp,%$proc.locsize
- %endif
- push %$proc.save
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Declare an argument passed on stack
-; This macro defines two additional macros:
-; first (with the name given by first argument) - [esp+xx]
-; second (with a underscore appended to first argument) - esp+xx
-; Arguments:
-; First argument defines the procedure argument name
-; Second optional parameter defines the size of the argument
-; Default value is 4 (a double word)
-; Example:
-; arg .my_float
-; arg .my_double,8
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro arg 1-2 4
- %ifndef %$proc.argofs
- %error "`arg' not in a proc context"
- %else
- ; Trick: temporary undefine .$proc.stkofs so that it won't be expanded
- %assign %%. .$proc.stkofs
- %undef .$proc.stkofs
- %xdefine %{1}_ esp+%$proc.argofs+.$proc.stkofs
- %xdefine %1 [esp+%$proc.argofs+.$proc.stkofs]
- %assign .$proc.stkofs %%.
- %assign %$proc.argofs %2+%$proc.argofs
- %endif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Declare an local variable
-; first (with the name given by first argument) - [esp+xx]
-; second (with a slash prefixing the first argument) - esp+xx
-; Arguments:
-; First argument defines the procedure argument name
-; Second optional parameter defines the size of the argument
-; Default value is 4 (a double word)
-; Example:
-; loc .int_value
-; loc .double_value,8
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro loc 1-2 4
- %ifndef %$proc.locofs
- %error "`loc' not in a proc context"
- %elif %$proc.locofs + %2 > %$proc.locsize
- %error "local stack space exceeded"
- %else
- %assign %%. .$proc.stkofs
- %undef .$proc.stkofs
- %xdefine %{1}_ esp+%$proc.locofs+.$proc.stkofs
- %xdefine %1 [esp+%$proc.locofs+.$proc.stkofs]
- %assign .$proc.stkofs %%.
- %assign %$proc.locofs %$proc.locofs+%2
- %endif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Get the type of given size into context-local variable %$type
-; Arguments:
-; Size of type we want (1,2,4,8 or 10)
-; Example:
-; type 4 ; gives "dword"
-; type 10 ; gives "tword"
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro type 1
- %if %1 = 1
- %define %$type byte
- %elif %1 = 2
- %define %$type word
- %elif %1 = 4
- %define %$type dword
- %elif %1 = 8
- %define %$type qword
- %elif %1 = 10
- %define %$type tword
- %else
- %define %$. %1
- %error "unknown type for argument size %$."
- %endif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Same as `arg' but prepends "word", "dword" etc (typed arg)
-; first (with the name given by first argument) - dword [esp+xx]
-; second (with a slash prefixing the first argument) - esp+xx
-; Arguments:
-; Same as for `arg'
-; Example:
-; targ .my_float ; .my_float is now "dword [esp+xxx]"
-; targ .my_double,8 ; .my_double is now "qword [esp+xxx]"
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro targ 1-2 4
- %ifndef %$proc.argofs
- %error "`targ' not in a proc context"
- %else
- arg %1,%2
- type %2
- %assign %%. .$proc.stkofs
- %undef .$proc.stkofs
- %xdefine %1 %$type %1
- %assign .$proc.stkofs %%.
- %endif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Same as `loc' but prepends "word", "dword" etc (typed loc)
-; first (with the name given by first argument) - dword [esp+xx]
-; second (with a slash prefixing the first argument) - esp+xx
-; Arguments:
-; Same as for `loc'
-; Example:
-; tloc int_value
-; tloc double_value,8
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro tloc 1-2 4
- %ifndef %$proc.locofs
- %error "`tloc' not in a proc context"
- %else
- loc %1,%2
- type %2
- %assign %%. .$proc.stkofs
- %undef .$proc.stkofs
- %xdefine %1 %$type %1
- %assign .$proc.stkofs %%.
- %endif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Finish a procedure
-; Gives an error if proc/endproc pairs mismatch
-; Defines an label called __end_(procedure name)
-; which is useful for calculating function size
-; Arguments:
-; (optional) The name of procedure
-; Example:
-; endproc MyTestProc
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%push tmp ; trick: define a dummy context to avoid error in next line
-%macro endproc 0-1 %$proc.name
- %ifndef %$proc.argofs
- %error "`endproc' not in a proc context"
- %elifnidn %$proc.name,%1
- %define %$. %1
- %error "endproc names mismatch: expected `%$proc.name'"
- %error "but got `%$.' instead"
- %elif %$proc.locofs < %$proc.locsize
- %error "unused local space declared (used %$proc.locofs, requested %$proc.locsize)"
- %else
-%$exit:
- ; Now pop the registers that we should restore on exit
- pop %$proc.save
- %if %$proc.locsize != 0
- add esp,%$proc.locsize
- %endif
- ret
-__end_%1:
- %pop
- %endif
-%endmacro
-%pop
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; A replacement for "push" for use within procedures
-; Arguments:
-; any number of registers which will be push'ed successively
-; Example:
-; push eax,ebx,ecx,edx
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro push 0-*
-; dummy comment to avoid problems with "push" on the same line with a label
- %rep %0
- push %1
- %rotate 1
- %assign .$proc.stkofs .$proc.stkofs+4
- %endrep
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; A replacement for "pop" for use within procedures
-; Arguments:
-; any number of registers which will be pop'ed in reverse order
-; Example:
-; pop eax,ebx,ecx,edx
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro pop 0-*
-; dummy comment to avoid problems with "pop" on the same line with a label
- %rep %0
- %rotate -1
- pop %1
- %assign .$proc.stkofs .$proc.stkofs-4
- %endrep
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Replacements for "pushfd" and "popfd" that takes care of esp
-; Example:
-; pushfd
-; popfd
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro pushfd 0
- pushfd
- %assign .$proc.stkofs .$proc.stkofs+4
-%endmacro
-%macro popfd 0
- popfd
- %assign .$proc.stkofs .$proc.stkofs-4
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Exit from current procedure (optionally on given condition)
-; Arguments:
-; Either none or a condition code
-; Example:
-; exit
-; exit nz
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro exit 0-1 mp
- j%1 near %$exit
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; start an conditional branch
-; Arguments:
-; A condition code
-; second (optional) argument - "short" (by default - "near")
-; Example:
-; if nz
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro if 1-2 near
-; dummy comment to avoid problems with "if" on the same line with a label
- %push if
- j%-1 %2 %$elseif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; define the "else" branch of a conditional statement
-; Arguments:
-; optionaly: "short" if jmp to endif is less than 128 bytes away
-; Example:
-; else
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro else 0-1
- %ifnctx if
- %error "`else' without matching `if'"
- %else
- jmp %1 %$endif
-%$elseif:
- %define %$elseif_defined
- %endif
-%endmacro
-
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-; Summary:
-; Finish am conditional statement
-; Arguments:
-; none
-; Example:
-; endif
-;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
-%macro endif 0
- %ifnctx if
- %error "`endif' without matching `if'"
- %else
- %ifndef %$elseif_defined
-%$elseif:
- %endif
-%$endif:
- %pop
- %endif
-%endmacro
-
-%endif ; __PROC32_ASH__
diff --git a/rdoff/Changes b/rdoff/Changes
deleted file mode 100644
index 34163a9..0000000
--- a/rdoff/Changes
+++ /dev/null
@@ -1,63 +0,0 @@
-Differences between RDOFF versions 1 & 2
-========================================
-
-This document is designed primarily for people maintaining code which
-uses RDOFF version 1, and would like to upgrade that code to work
-with version 2.
-
-The main changes are summarised here:
-
-Overall format
-==============
-
-The overall format has changed somewhat since version 1, in order
-to make RDOFF more flexible. After the file type identifier (which
-has been changed to 'RDOFF2', obviously), there is now a 4 byte
-integer describing the length of the object module. This allows
-multiple objects to be concatenated, while the loader can easily
-build an index of the locations of each object. This isn't as
-pointless as it sounds; I'm using RDOFF in a microkernel operating
-system, and this is the ideal way of loading multiple driver modules
-at boot time.
-
-There are also no longer a fixed number of segments; instead there
-is a list of segments, immediately following the header.
-Each segment is preceded by a 10 byte header giving information about
-that segment. This header has the following format:
-
-Length Description
-2 Type
-2 Number
-2 Reserved
-4 Length
-
-'Type' is a number describing what sort of segment it is (eg text, data,
-comment, debug info). See 'rdoff2.txt' for a list of the segment types.
-'Number' is the number used to refer to the segment in the header records.
-Not all segments will be loaded; it is only intended that one code
-and one data segment will be loaded into memory. It is possible, however,
-for a loaded segment to contain a reference to an unloaded segment.
-This is an error, and should be flagged at load time. Or maybe you should
-load the segment... its up to you, really.
-
-The segment's data immediately follows the end of the segment header.
-
-HEADER RECORDS
-==============
-
-All of the header records have changed in this version, but not
-substantially. Each record type has had a content-length code added,
-a single byte immediately following the type byte. This contains the
-length of the rest of the record (excluding the type and length bytes,
-but including the terminating nulls on any strings in the record).
-
-There are two new record types, Segment Relocation (6), and FAR import (7).
-The record formats are identical to Relocation (1) and import (2). They are
-only of real use on systems using segmented architectures. Systems using
-a flat model should treat FAR import (7) exactly the same as an import (2),
-and should either flag segment relocation as an error, or attempt to figure
-out whether it is a reference to a code or data symbol, and set the value
-referenced to the according selector value. I am opting for the former
-approach, and would recommend that others working on 32 bit flat systems
-do the same.
-
diff --git a/rdoff/Mkfiles/Makefile.dj b/rdoff/Mkfiles/Makefile.dj
new file mode 100644
index 0000000..2099739
--- /dev/null
+++ b/rdoff/Mkfiles/Makefile.dj
@@ -0,0 +1,75 @@
+# Generated automatically from Makefile.in by configure.
+#
+# Auto-configuring Makefile for RDOFF object file utils; part of the
+# Netwide Assembler
+#
+# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+# Julian Hall. All rights reserved. The software is
+# redistributable under the licence given in the file "Licence"
+# distributed in the NASM archive.
+
+# You may need to adjust these values.
+
+prefix = /djgpp
+CC = gcc -s
+CFLAGS = -O2 -I..
+
+# You _shouldn't_ need to adjust anything below this line.
+
+exec_prefix = ${prefix}
+bindir = ${exec_prefix}/bin
+mandir = ${prefix}/man
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+LN_S = ln -s
+
+LDRDFLIBS = rdoff.o ../nasmlib.o symtab.o hash.o collectn.o rdlib.o segtab.o
+RDXLIBS = rdoff.o rdfload.o symtab.o hash.o collectn.o
+
+.c.o:
+ $(CC) -c $(CFLAGS) $*.c
+
+all: rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+
+rdfdump: rdfdump.o
+ $(CC) -o rdfdump rdfdump.o
+
+ldrdf: ldrdf.o $(LDRDFLIBS)
+ $(CC) -o ldrdf ldrdf.o $(LDRDFLIBS)
+rdx: rdx.o $(RDXLIBS)
+ $(CC) -o rdx rdx.o $(RDXLIBS)
+rdflib: rdflib.o
+ $(CC) -o rdflib rdflib.o
+rdf2bin: rdf2bin.o $(RDXLIBS) nasmlib.o
+ $(CC) -o rdf2bin rdf2bin.o $(RDXLIBS) nasmlib.o
+rdf2com:
+ $(LN_S) rdf2bin rdf2com
+
+rdf2bin.o: rdf2bin.c
+rdfdump.o: rdfdump.c
+rdoff.o: rdoff.c rdoff.h
+ldrdf.o: ldrdf.c rdoff.h ../nasmlib.h symtab.h collectn.h rdlib.h
+symtab.o: symtab.c symtab.h hash.h
+collectn.o: collectn.c collectn.h
+rdx.o: rdx.c rdoff.h rdfload.h symtab.h
+rdfload.o: rdfload.c rdfload.h rdoff.h collectn.h symtab.h
+rdlib.o: rdlib.c rdlib.h
+rdflib.o: rdflib.c
+hash.o: hash.c hash.h
+segtab.o: segtab.c segtab.h
+
+nasmlib.o: ../nasmlib.c ../nasmlib.h ../names.c ../nasm.h
+ $(CC) -c $(CFLAGS) ../nasmlib.c
+
+clean:
+ rm -f *.o rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+
+install: rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+ $(INSTALL_PROGRAM) rdfdump $(bindir)/rdfdump
+ $(INSTALL_PROGRAM) ldrdf $(bindir)/ldrdf
+ $(INSTALL_PROGRAM) rdx $(bindir)/rdx
+ $(INSTALL_PROGRAM) rdflib $(bindir)/rdflib
+ $(INSTALL_PROGRAM) rdf2bin $(bindir)/rdf2bin
+ cd $(bindir); $(LN_S) rdf2bin rdf2com
diff --git a/rdoff/Mkfiles/Makefile.emx b/rdoff/Mkfiles/Makefile.emx
new file mode 100644
index 0000000..fbaa934
--- /dev/null
+++ b/rdoff/Mkfiles/Makefile.emx
@@ -0,0 +1,76 @@
+# Generated automatically from Makefile.in by configure.
+# $Id$
+#
+# Auto-configuring Makefile for RDOFF object file utils; part of the
+# Netwide Assembler
+#
+# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+# Julian Hall. All rights reserved. The software is
+# redistributable under the licence given in the file "Licence"
+# distributed in the NASM archive.
+
+top_srcdir = ..
+srcdir = .
+prefix = /usr/local
+exec_prefix = ${prefix}
+bindir = ${exec_prefix}/bin
+mandir = ${prefix}/man
+
+CC = gcc
+CFLAGS = -s -Zomf -O2 -fomit-frame-pointer -Wall -ansi -pedantic -I$(srcdir) -I$(top_srcdir)
+LDFLAGS = -s -Zomf -Zexe -Zcrtdll
+LIBS = -lgcc
+
+INSTALL = .././install-sh -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+
+LDRDFLIBS = rdoff.o nasmlib.o symtab.o collectn.o rdlib.o segtab.o hash.o
+RDXLIBS = rdoff.o rdfload.o symtab.o collectn.o hash.o
+
+.c.o:
+ $(CC) -c $(CFLAGS) -o $@ $<
+
+all: rdfdump ldrdf rdx rdflib rdf2bin
+
+rdfdump: rdfdump.o
+ $(CC) $(LDFLAGS) -o rdfdump rdfdump.o $(LIBS)
+ldrdf: ldrdf.o $(LDRDFLIBS)
+ $(CC) $(LDFLAGS) -o ldrdf ldrdf.o $(LDRDFLIBS) $(LIBS)
+rdx: rdx.o $(RDXLIBS)
+ $(CC) $(LDFLAGS) -o rdx rdx.o $(RDXLIBS) $(LIBS)
+rdflib: rdflib.o
+ $(CC) $(LDFLAGS) -o rdflib rdflib.o $(LIBS)
+rdf2bin: rdf2bin.o $(RDXLIBS) nasmlib.o
+ $(CC) $(LDFLAGS) -o rdf2bin rdf2bin.o $(RDXLIBS) nasmlib.o $(LIBS)
+
+rdf2bin.o: rdf2bin.c
+rdfdump.o: rdfdump.c
+rdoff.o: rdoff.c rdoff.h
+ldrdf.o: ldrdf.c rdoff.h $(top_srcdir)/nasmlib.h symtab.h collectn.h rdlib.h
+symtab.o: symtab.c symtab.h
+collectn.o: collectn.c collectn.h
+rdx.o: rdx.c rdoff.h rdfload.h symtab.h
+rdfload.o: rdfload.c rdfload.h rdoff.h collectn.h symtab.h
+rdlib.o: rdlib.c rdlib.h
+rdflib.o: rdflib.c
+segtab.o: segtab.c
+
+nasmlib.o: $(top_srcdir)/nasmlib.c
+ $(CC) -c $(CFLAGS) -o $@ $(top_srcdir)/nasmlib.c
+
+clean:
+ rm -f *.o rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+
+spotless: clean
+ rm -f Makefile
+
+distclean: spotless
+
+install: rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+ $(INSTALL_PROGRAM) rdfdump $(INSTALLROOT)$(bindir)/rdfdump
+ $(INSTALL_PROGRAM) ldrdf $(INSTALLROOT)$(bindir)/ldrdf
+ $(INSTALL_PROGRAM) rdx $(INSTALLROOT)$(bindir)/rdx
+ $(INSTALL_PROGRAM) rdflib $(INSTALLROOT)$(bindir)/rdflib
+ $(INSTALL_PROGRAM) rdf2bin $(INSTALLROOT)$(bindir)/rdf2bin
+ cd $(INSTALLROOT)$(bindir) && rm -f rdf2com && $(LN_S) rdf2bin rdf2com
diff --git a/rdoff/Mkfiles/Makefile.sc b/rdoff/Mkfiles/Makefile.sc
new file mode 100644
index 0000000..7b45fe7
--- /dev/null
+++ b/rdoff/Mkfiles/Makefile.sc
@@ -0,0 +1,56 @@
+# Makefile for RDOFF object file utils; part of the Netwide Assembler
+#
+# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+# Julian Hall. All rights reserved. The software is
+# redistributable under the licence given in the file "Licence"
+# distributed in the NASM archive.
+#
+# This Makefile is designed for use under Unix (probably fairly
+# portably).
+
+CC = sc
+CCFLAGS = -I..\ -c -a1 -mn -Nc -w2 -w7 -o+time -5
+LINK = link
+LINKFLAGS = /noi /exet:NT /su:console
+
+OBJ=obj
+EXE=.exe
+
+NASMLIB = ..\nasmlib.$(OBJ)
+NASMLIB_H = ..\nasmlib.h
+LDRDFLIBS = rdoff.$(OBJ) $(NASMLIB) symtab.$(OBJ) collectn.$(OBJ) rdlib.$(OBJ)
+RDXLIBS = rdoff.$(OBJ) rdfload.$(OBJ) symtab.$(OBJ) collectn.$(OBJ)
+
+.c.$(OBJ):
+ $(CC) $(CCFLAGS) $*.c
+
+all : rdfdump$(EXE) ldrdf$(EXE) rdx$(EXE) rdflib$(EXE) rdf2bin$(EXE) rdf2com$(EXE)
+
+rdfdump$(EXE) : rdfdump.$(OBJ)
+ $(LINK) $(LINKFLAGS) rdfdump.$(OBJ), rdfdump$(EXE);
+ldrdf$(EXE) : ldrdf.$(OBJ) $(LDRDFLIBS)
+ $(LINK) $(LINKFLAGS) ldrdf.$(OBJ) $(LDRDFLIBS), ldrdf$(EXE);
+rdx$(EXE) : rdx.$(OBJ) $(RDXLIBS)
+ $(LINK) $(LINKFLAGS) rdx.$(OBJ) $(RDXLIBS), rdx$(EXE);
+rdflib$(EXE) : rdflib.$(OBJ)
+ $(LINK) $(LINKFLAGS) rdflib.$(OBJ), rdflib$(EXE);
+rdf2bin$(EXE) : rdf2bin.$(OBJ) $(RDXLIBS) $(NASMLIB)
+ $(LINK) $(LINKFLAGS) rdf2bin.$(OBJ) $(RDXLIBS) $(NASMLIB), rdf2bin$(EXE);
+rdf2com$(EXE) : rdf2bin$(EXE)
+ copy rdf2bin$(EXE) rdf2com$(EXE)
+
+rdf2bin.$(OBJ) : rdf2bin.c
+rdfdump.$(OBJ) : rdfdump.c
+rdoff.$(OBJ) : rdoff.c rdoff.h
+ldrdf.$(OBJ) : ldrdf.c rdoff.h $(NASMLIB_H) symtab.h collectn.h rdlib.h
+symtab.$(OBJ) : symtab.c symtab.h
+collectn.$(OBJ) : collectn.c collectn.h
+rdx.$(OBJ) : rdx.c rdoff.h rdfload.h symtab.h
+rdfload.$(OBJ) : rdfload.c rdfload.h rdoff.h collectn.h symtab.h
+rdlib.$(OBJ) : rdlib.c rdlib.h
+rdflib.$(OBJ) : rdflib.c
+
+clean :
+ del *.$(OBJ) rdfdump$(EXE) ldrdf$(EXE) rdx$(EXE) rdflib$(EXE) rdf2bin$(EXE)
+
+
diff --git a/rdoff/Mkfiles/Makefile.unx b/rdoff/Mkfiles/Makefile.unx
new file mode 100644
index 0000000..89d439f
--- /dev/null
+++ b/rdoff/Mkfiles/Makefile.unx
@@ -0,0 +1,75 @@
+# Generated automatically from Makefile.in by configure.
+#
+# Auto-configuring Makefile for RDOFF object file utils; part of the
+# Netwide Assembler
+#
+# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+# Julian Hall. All rights reserved. The software is
+# redistributable under the licence given in the file "Licence"
+# distributed in the NASM archive.
+
+# You may need to adjust these values.
+
+prefix = /usr/local
+CC = cc
+CFLAGS = -O -I..
+
+# You _shouldn't_ need to adjust anything below this line.
+
+exec_prefix = ${prefix}
+bindir = ${exec_prefix}/bin
+mandir = ${prefix}/man
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+LN_S = ln -s
+
+LDRDFLIBS = rdoff.o ../nasmlib.o symtab.o hash.o collectn.o rdlib.o segtab.o
+RDXLIBS = rdoff.o rdfload.o symtab.o hash.o collectn.o
+
+.c.o:
+ $(CC) -c $(CFLAGS) $*.c
+
+all: rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+
+rdfdump: rdfdump.o
+ $(CC) -o rdfdump rdfdump.o
+
+ldrdf: ldrdf.o $(LDRDFLIBS)
+ $(CC) -o ldrdf ldrdf.o $(LDRDFLIBS)
+rdx: rdx.o $(RDXLIBS)
+ $(CC) -o rdx rdx.o $(RDXLIBS)
+rdflib: rdflib.o
+ $(CC) -o rdflib rdflib.o
+rdf2bin: rdf2bin.o $(RDXLIBS) nasmlib.o
+ $(CC) -o rdf2bin rdf2bin.o $(RDXLIBS) nasmlib.o
+rdf2com:
+ $(LN_S) rdf2bin rdf2com
+
+rdf2bin.o: rdf2bin.c
+rdfdump.o: rdfdump.c
+rdoff.o: rdoff.c rdoff.h
+ldrdf.o: ldrdf.c rdoff.h ../nasmlib.h symtab.h collectn.h rdlib.h
+symtab.o: symtab.c symtab.h hash.h
+collectn.o: collectn.c collectn.h
+rdx.o: rdx.c rdoff.h rdfload.h symtab.h
+rdfload.o: rdfload.c rdfload.h rdoff.h collectn.h symtab.h
+rdlib.o: rdlib.c rdlib.h
+rdflib.o: rdflib.c
+hash.o: hash.c hash.h
+segtab.o: segtab.c segtab.h
+
+nasmlib.o: ../nasmlib.c ../nasmlib.h ../names.c ../nasm.h
+ $(CC) -c $(CFLAGS) ../nasmlib.c
+
+clean:
+ rm -f *.o rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+
+install: rdfdump ldrdf rdx rdflib rdf2bin rdf2com
+ $(INSTALL_PROGRAM) rdfdump $(bindir)/rdfdump
+ $(INSTALL_PROGRAM) ldrdf $(bindir)/ldrdf
+ $(INSTALL_PROGRAM) rdx $(bindir)/rdx
+ $(INSTALL_PROGRAM) rdflib $(bindir)/rdflib
+ $(INSTALL_PROGRAM) rdf2bin $(bindir)/rdf2bin
+ cd $(bindir); $(LN_S) rdf2bin rdf2com
diff --git a/rdoff/Mkfiles/README b/rdoff/Mkfiles/README
new file mode 100644
index 0000000..7e68499
--- /dev/null
+++ b/rdoff/Mkfiles/README
@@ -0,0 +1,4 @@
+These are pre-created Makefiles for various platforms, use them if
+GNU autoconf/automake packages are not supported on your system.
+
+Copy appropriate Makefile to ../Makefile and run make.
diff --git a/rdoff/ldrdf1.c b/rdoff/ldrdf1.c
deleted file mode 100644
index 9e4a215..0000000
--- a/rdoff/ldrdf1.c
+++ /dev/null
@@ -1,728 +0,0 @@
-/* ldrdf.c RDOFF Object File linker/loader main program
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- */
-
-/* TODO: Make the system skip a module (other than the first) if none
- * of the other specified modules contain a reference to it.
- * May require the system to make an extra pass of the modules to be
- * loaded eliminating those that aren't required.
- *
- * Support all the existing documented options...
- *
- * Support libaries (.a files - requires a 'ranlib' type utility)
- * (I think I've got this working, so I've upped the version)
- *
- * -s option to strip resolved symbols from exports. (Could make this an
- * external utility)
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "rdoff.h"
-#include "nasmlib.h"
-#include "symtab.h"
-#include "collectn.h"
-#include "rdlib.h"
-
-#define LDRDF_VERSION "0.30"
-
-/* global variables - those to set options: */
-
-int verbose = 0; /* reflects setting of command line switch */
-int align = 16;
-int errors = 0; /* set by functions to cause halt after current
- stage of processing */
-
-/* the linked list of modules that must be loaded & linked */
-
-struct modulenode {
- rdffile f; /* the file */
- long coderel; /* module's code relocation factor */
- long datarel; /* module's data relocation factor */
- long bssrel; /* module's bss data reloc. factor */
- void * header; /* header location, if loaded */
- char * name; /* filename */
- struct modulenode *next;
-};
-
-#define newstr(str) strcpy(malloc(strlen(str) + 1),str)
-#define newstrcat(s1,s2) strcat(strcpy(malloc(strlen(s1)+strlen(s2)+1),s1),s2)
-
-
-struct modulenode *modules = NULL,*lastmodule = NULL;
-
-/* the linked list of libraries to be searched for missing imported
- symbols */
-
-struct librarynode * libraries = NULL, * lastlib = NULL;
-
-void *symtab; /* The symbol table */
-
-rdf_headerbuf * newheader ; /* New header to be written to output */
-
-/* loadmodule - find the characteristics of a module and add it to the
- * list of those being linked together */
-
-void loadmodule(char *filename)
-{
- struct modulenode *prev;
- if (! modules) {
- modules = malloc(sizeof(struct modulenode));
- lastmodule = modules;
- prev = NULL;
- }
- else {
- lastmodule->next = malloc(sizeof(struct modulenode));
- prev = lastmodule;
- lastmodule = lastmodule->next;
- }
-
- if (! lastmodule) {
- fputs("ldrdf: not enough memory\n",stderr);
- exit(1);
- }
-
- if (rdfopen(&lastmodule->f,filename)) {
- rdfperror("ldrdf",filename);
- exit(1);
- }
-
- lastmodule->header = NULL; /* header hasn't been loaded */
- lastmodule->name = filename;
- lastmodule->next = NULL;
-
- if (prev) {
- lastmodule->coderel = prev->coderel + prev->f.code_len;
- if (lastmodule->coderel % align != 0)
- lastmodule->coderel += align - (lastmodule->coderel % align);
- lastmodule->datarel = prev->datarel + prev->f.data_len;
- if (lastmodule->datarel % align != 0)
- lastmodule->datarel += align - (lastmodule->datarel % align);
- }
- else {
- lastmodule->coderel = 0;
- lastmodule->datarel = 0;
- }
-
- if (verbose)
- printf("%s code = %08lx (+%04lx), data = %08lx (+%04lx)\n",filename,
- lastmodule->coderel,lastmodule->f.code_len,
- lastmodule->datarel,lastmodule->f.data_len);
-
- lastmodule->header = malloc(lastmodule->f.header_len);
- if (!lastmodule->header) {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- if (rdfloadseg(&lastmodule->f,RDOFF_HEADER,lastmodule->header))
- {
- rdfperror("ldrdf",filename);
- exit(1);
- }
-}
-
-/* load_library add a library to list of libraries to search
- * for undefined symbols
- */
-
-void load_library(char * name)
-{
- if (verbose)
- printf("adding library %s to search path\n",name);
-
- if (! lastlib) {
- lastlib = libraries = malloc(sizeof(struct librarynode));
- }
- else
- {
- lastlib->next = malloc(sizeof(struct librarynode));
- lastlib = lastlib->next;
- }
-
- if (! lastlib) {
- fprintf(stderr, "ldrdf: out of memory\n");
- exit(1);
- }
- strcpy (lastlib->name = malloc (1+strlen(name)), name);
- lastlib->fp = NULL;
- lastlib->referenced = 0;
- lastlib->next = NULL;
-}
-
-
-/* build_symbols() step through each module's header, and locate
- * exported symbols, placing them in a global table
- */
-
-long bsslength;
-
-void mod_addsymbols(struct modulenode * mod)
-{
- rdfheaderrec *r;
- symtabEnt e;
- long cbBss;
-
- mod->bssrel = bsslength;
- cbBss = 0;
- rdfheaderrewind(&mod->f);
- while ((r = rdfgetheaderrec(&mod->f)))
- {
-
- if (r->type == 5) /* Allocate BSS */
- cbBss += r->b.amount;
-
- if (r->type != 3) continue; /* ignore all but export recs */
-
- e.segment = r->e.segment;
- e.offset = r->e.offset +
- (e.segment == 0 ? mod->coderel : /* 0 -> code */
- e.segment == 1 ? mod->datarel : /* 1 -> data */
- mod->bssrel) ; /* 2 -> bss */
-
- e.flags = 0;
- e.name = malloc(strlen(r->e.label) + 1);
- if (! e.name)
- {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
- strcpy(e.name,r->e.label);
- symtabInsert(symtab,&e);
- }
- bsslength += cbBss;
-}
-
-void build_symbols()
-{
- struct modulenode *mod;
-
- if (verbose) printf("building global symbol table:\n");
- newheader = rdfnewheader();
-
- symtab = symtabNew();
- bsslength = 0; /* keep track of location of BSS symbols */
-
- for (mod = modules; mod; mod = mod->next)
- {
- mod_addsymbols( mod );
- }
- if (verbose)
- {
- symtabDump(symtab,stdout);
- printf("BSS length = %ld bytes\n\n",bsslength);
- }
-}
-
-
-/* scan_libraries() search through headers of modules for undefined
- * symbols, and scan libraries for those symbols,
- * adding library modules found to list of modules
- * to load. */
-
-void scan_libraries(void)
-{
- struct modulenode * mod, * nm;
- struct librarynode * lib;
- rdfheaderrec * r;
- int found;
- char * tmp;
-
- if (verbose) printf("Scanning libraries for unresolved symbols...\n");
-
- mod = modules;
-
- while (mod)
- {
- rdfheaderrewind(&mod->f);
-
- while ((r = rdfgetheaderrec(&mod->f)))
- {
- if (r->type != 2) continue; /* not an import record */
- if ( symtabFind (symtab,r->i.label) )
- continue; /* symbol already defined */
-
- /* okay, we have an undefined symbol... step through
- the libraries now */
- if (verbose >= 2) {
- printf("undefined symbol '%s'...",r->i.label);
- fflush(stdout);
- }
-
- lib = libraries;
- found = 0;
-
- tmp = newstr(r->i.label);
- while (! found && lib)
- {
- /* move this to an outer loop...! */
- nm = malloc(sizeof(struct modulenode));
-
- if (rdl_searchlib(lib,tmp,&nm->f))
- { /* found a module in the library */
-
- /* create a modulenode for it */
-
- if (! nm) {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- nm->name = newstrcat(lib->name,nm->f.name);
- if (verbose >= 2) printf("found in '%s'\n",nm->name);
-
- nm->coderel = lastmodule->coderel + lastmodule->f.code_len;
- if (nm->coderel % align != 0)
- nm->coderel += align - (nm->coderel % align);
-
- nm->datarel = lastmodule->datarel + lastmodule->f.data_len;
- if (nm->datarel % align != 0)
- nm->datarel += align - (nm->datarel % align);
-
- nm->header = malloc(nm->f.header_len);
- if (! nm->header)
- {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- if (rdfloadseg(&nm->f,RDOFF_HEADER,nm->header))
- {
- rdfperror("ldrdf",nm->name);
- exit(1);
- }
-
- nm->next = NULL;
- found = 1;
- lastmodule->next = nm;
- lastmodule = nm;
-
- if (verbose)
- printf("%s code = %08lx (+%04lx), data = %08lx "
- "(+%04lx)\n",lastmodule->name,
- lastmodule->coderel,lastmodule->f.code_len,
- lastmodule->datarel,lastmodule->f.data_len);
-
- /* add the module's info to the symbol table */
- mod_addsymbols(nm);
- }
- else
- {
- if (rdl_error) {
- rdl_perror("ldrdf",lib->name);
- exit(1);
- }
- free(nm);
- }
- lib = lib->next;
- }
- free(tmp);
- if (!found && verbose >= 2) printf("not found\n");
- }
- mod = mod->next;
- }
-}
-
-/* load_segments() allocates memory for & loads the code & data segs
- * from the RDF modules
- */
-
-char *text,*data;
-long textlength,datalength;
-
-void load_segments(void)
-{
- struct modulenode *mod;
-
- if (!modules) {
- fprintf(stderr,"ldrdf: nothing to do\n");
- exit(0);
- }
- if (!lastmodule) {
- fprintf(stderr,"ldrdf: panic: module list exists, but lastmodule=NULL\n");
- exit(3);
- }
-
- if (verbose)
- printf("loading modules into memory\n");
-
- /* The following stops 16 bit DOS from crashing whilst attempting to
- work using segments > 64K */
- if (sizeof(int) == 2) { /* expect a 'code has no effect' warning on 32 bit
- platforms... */
- if (lastmodule->coderel + lastmodule->f.code_len > 65535 ||
- lastmodule->datarel + lastmodule->f.data_len > 65535) {
- fprintf(stderr,"ldrdf: segment length has exceeded 64K; use a 32 bit "
- "version.\nldrdf: code size = %05lx, data size = %05lx\n",
- lastmodule->coderel + lastmodule->f.code_len,
- lastmodule->datarel + lastmodule->f.data_len);
- exit(1);
- }
- }
-
- text = malloc(textlength = lastmodule->coderel + lastmodule->f.code_len);
- data = malloc(datalength = lastmodule->datarel + lastmodule->f.data_len);
-
- if (!text || !data) {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- mod = modules;
- while (mod) { /* load the segments for each module */
- if (verbose >= 2) printf(" loading %s\n",mod->name);
- if (rdfloadseg(&mod->f,RDOFF_CODE,&text[mod->coderel]) ||
- rdfloadseg(&mod->f,RDOFF_DATA,&data[mod->datarel])) {
- rdfperror("ldrdf",mod->name);
- exit(1);
- }
- rdfclose(&mod->f); /* close file; segments remain */
- mod = mod->next;
- }
-}
-
-/* link_segments() step through relocation records in each module's
- * header, fixing up references.
- */
-
-void link_segments(void)
-{
- struct modulenode *mod;
- Collection imports;
- symtabEnt *s;
- long rel,relto;
- char *seg;
- rdfheaderrec *r;
- int bRelative;
-
- if (verbose) printf("linking segments\n");
-
- collection_init(&imports);
-
- for (mod = modules; mod; mod = mod->next) {
- if (verbose >= 2) printf("* processing %s\n",mod->name);
- rdfheaderrewind(&mod->f);
- while((r = rdfgetheaderrec(&mod->f))) {
- if (verbose >= 3) printf("record type: %d\n",r->type);
- switch(r->type) {
- case 1: /* relocation record */
- if (r->r.segment >= 64) { /* Relative relocation; */
- bRelative = 1; /* need to find location relative */
- r->r.segment -= 64; /* to start of this segment */
- relto = r->r.segment == 0 ? mod->coderel : mod->datarel;
- }
- else
- {
- bRelative = 0; /* non-relative - need to relocate
- * at load time */
- relto = 0; /* placate optimiser warnings */
- }
-
- /* calculate absolute offset of reference, not rel to beginning of
- segment */
- r->r.offset += r->r.segment == 0 ? mod->coderel : mod->datarel;
-
- /* calculate the relocation factor to apply to the operand -
- the base address of one of this modules segments if referred
- segment is 0 - 2, or the address of an imported symbol
- otherwise. */
-
- if (r->r.refseg == 0) rel = mod->coderel;
- else if (r->r.refseg == 1) rel = mod->datarel;
- else if (r->r.refseg == 2) rel = mod->bssrel;
- else { /* cross module link - find reference */
- s = *colln(&imports,r->r.refseg - 2);
- if (!s) {
- fprintf(stderr,"ldrdf: link to undefined segment %04x in"
- " %s:%d\n", r->r.refseg,mod->name,r->r.segment);
- errors = 1;
- break;
- }
- rel = s->offset;
-
- r->r.refseg = s->segment; /* change referred segment,
- so that new header is
- correct */
- }
-
- if (bRelative) /* Relative - subtract current segment start */
- rel -= relto;
- else
- { /* Add new relocation header */
- rdfaddheader(newheader,r);
- }
-
- /* Work out which segment we're making changes to ... */
- if (r->r.segment == 0) seg = text;
- else if (r->r.segment == 1) seg = data;
- else {
- fprintf(stderr,"ldrdf: relocation in unknown segment %d in "
- "%s\n", r->r.segment,mod->name);
- errors = 1;
- break;
- }
-
- /* Add the relocation factor to the datum specified: */
-
- if (verbose >= 3)
- printf(" - relocating %d:%08lx by %08lx\n",r->r.segment,
- r->r.offset,rel);
-
- /**** The following code is non-portable. Rewrite it... ****/
- switch(r->r.length) {
- case 1:
- seg[r->r.offset] += (char) rel;
- break;
- case 2:
- *(int16 *)(seg + r->r.offset) += (int16) rel;
- break;
- case 4:
- *(long *)(seg + r->r.offset) += rel;
- break;
- }
- break;
-
- case 2: /* import record */
- s = symtabFind(symtab, r->i.label);
- if (s == NULL) {
- /* Need to add support for dynamic linkage */
- fprintf(stderr,"ldrdf: undefined symbol %s in module %s\n",
- r->i.label,mod->name);
- errors = 1;
- }
- else
- {
- *colln(&imports,r->i.segment - 2) = s;
- if (verbose >= 2)
- printf("imported %s as %04x\n", r->i.label, r->i.segment);
- }
- break;
-
- case 3: /* export; dump to output new version */
- s = symtabFind(symtab, r->e.label);
- if (! s) {
- fprintf(stderr,"ldrdf: internal error - undefined symbol %s "
- "exported in header of '%s'\n",r->e.label,mod->name);
- continue;
- }
- r->e.offset = s->offset;
- rdfaddheader(newheader,r);
- break;
-
- case 4: /* DLL record */
- rdfaddheader(newheader,r); /* copy straight to output */
- break;
- }
- }
- if (rdf_errno != 0) {
- rdfperror("ldrdf",mod->name);
- exit(1);
- }
- collection_reset(&imports);
- }
-}
-
-/* write_output() write linked program out to a file */
-
-void write_output(char *filename)
-{
- FILE * fp;
- rdfheaderrec r;
-
- if (verbose) printf("writing output to '%s'\n",filename);
-
- fp = fopen(filename,"wb");
- if (! fp)
- {
- fprintf(stderr,"ldrdf: could not open '%s' for writing\n",filename);
- exit(1);
- }
-
-
- /* add BSS length count to header... */
- if (bsslength)
- {
- r.type = 5;
- r.b.amount = bsslength;
- rdfaddheader(newheader,&r);
- }
-
- /* Write header */
- rdfwriteheader(fp,newheader);
- rdfdoneheader(newheader);
- newheader = NULL;
-
- /* Write text */
- if (fwrite(&textlength,1,4,fp) != 4
- || fwrite(text,1,textlength,fp) !=textlength)
- {
- fprintf(stderr,"ldrdf: error writing %s\n",filename);
- exit(1);
- }
-
- /* Write data */
- if (fwrite(&datalength,1,4,fp) != 4 ||
- fwrite(data,1,datalength,fp) != datalength)
- {
- fprintf (stderr,"ldrdf: error writing %s\n", filename);
- exit(1);
- }
- fclose(fp);
-}
-
-
-/* main program: interpret command line, and pass parameters on to
- * individual module loaders & the linker
- *
- * Command line format:
- * ldrdf [-o outfile | -x] [-r xxxx] [-v] [--] infile [infile ...]
- *
- * Default action is to output a file named 'aout.rdx'. -x specifies
- * that the linked object program should be executed, rather than
- * written to a file. -r specifies that the object program should
- * be prelocated at address 'xxxx'. This option cannot be used
- * in conjunction with -x.
- */
-
-const char *usagemsg = "usage:\n"
-" ldrdf [-o outfile | -x] [-a x] [-v] [-p x] [--] infile [infile ...]\n"
-" [-l<libname> ...]\n\n"
-" ldrdf -h displays this message\n"
-" ldrdf -r displays version information\n\n"
-" -o selects output filename (default is aout.rdx)\n"
-" -x causes ldrdx to link & execute rather than write to file\n"
-" -a x causes object program to be statically relocated to address 'x'\n"
-" -v turns on verbose mode\n"
-" -p x causes segments to be aligned (padded) to x byte boundaries\n"
-" (default is 16 bytes)\n"
-" -l<name> causes 'name' to be linked in as a library. Note no search is\n"
-" performed - the entire pathname MUST be specified.\n";
-
-void usage(void)
-{
- fputs(usagemsg,stderr);
-}
-
-int main(int argc,char **argv)
-{
- char *ofilename = "aout.rdx";
- long relocateaddr = -1; /* -1 if no relocation is to occur */
- int execute = 0; /* 1 to execute after linking, 0 otherwise */
- int procsw = 1; /* set to 0 by '--' */
- int tmp;
-
- if (argc == 1) {
- usage();
- exit(1);
- }
-
- /* process command line switches, and add modules specified to linked list
- of modules, keeping track of total memory required to load them */
-
- while(argv++,--argc) {
- if (procsw && !strcmp(*argv,"-h")) { /* Help command */
- usage(); exit(1);
- }
- else if (procsw && !strcmp(*argv,"-r")) {
- printf("ldrdf version %s (%s) (%s)\n",LDRDF_VERSION,_RDOFF_H,
- sizeof(int) == 2 ? "16 bit" : "32 bit");
- exit(1);
- }
- else if (procsw && !strcmp(*argv,"-o")) {
- ofilename = *++argv;
- --argc;
- if (execute) {
- fprintf(stderr,"ldrdf: -o and -x switches incompatible\n");
- exit(1);
- }
- if (verbose > 1) printf("output filename set to '%s'\n",ofilename);
- }
- else if (procsw && !strcmp(*argv,"-x")) {
- execute++;
- if (verbose > 1) printf("will execute linked object\n");
- }
- else if (procsw && !strcmp(*argv,"-a")) {
- relocateaddr = readnum(*++argv,&tmp);
- --argc;
- if (tmp) {
- fprintf(stderr,"ldrdf: error in parameter to '-a' switch: '%s'\n",
- *argv);
- exit(1);
- }
- if (execute) {
- fprintf(stderr,"ldrdf: -a and -x switches incompatible\n");
- exit(1);
- }
- if (verbose) printf("will relocate to %08lx\n",relocateaddr);
- }
- else if (procsw && !strcmp(*argv,"-v")) {
- verbose++;
- if (verbose == 1) printf("verbose mode selected\n");
- }
- else if (procsw && !strcmp(*argv,"-p")) {
- align = readnum(*++argv,&tmp);
- --argc;
- if (tmp) {
- fprintf(stderr,"ldrdf: error in parameter to '-p' switch: '%s'\n",
- *argv);
- exit(1);
- }
- if (align != 1 && align != 2 && align != 4 && align != 8 && align != 16
- && align != 32 && align != 256) {
- fprintf(stderr,"ldrdf: %d is an invalid alignment factor - must be"
- "1,2,4,8,16 or 256\n",align);
- exit(1);
- }
- if (verbose > 1) printf("alignment %d selected\n",align);
- }
- else if (procsw && !strncmp(*argv,"-l",2)) {
- load_library(*argv + 2);
- }
- else if (procsw && !strcmp(*argv,"--")) {
- procsw = 0;
- }
- else { /* is a filename */
- if (verbose > 1) printf("processing module %s\n",*argv);
- loadmodule(*argv);
- }
- }
-
- /* we should be scanning for unresolved references, and removing
- unreferenced modules from the list of modules here, so that
- we know about the final size once libraries have been linked in */
-
- build_symbols(); /* build a global symbol table... */
-
- scan_libraries(); /* check for imported symbols not in table,
- and ensure the relevant library modules
- are loaded */
-
- load_segments(); /* having calculated size of reqd segments, load
- each rdoff module's segments into memory */
-
- link_segments(); /* step through each module's header, and resolve
- references to the global symbol table.
- This also does local address fixups. */
-
- if (errors) {
- fprintf(stderr,"ldrdf: there were errors - aborted\n");
- exit(errors);
- }
- if (execute) {
- fprintf(stderr,"ldrdf: module execution not yet supported\n");
- exit(1);
- }
- if (relocateaddr != -1) {
- fprintf(stderr,"ldrdf: static relocation not yet supported\n");
- exit(1);
- }
-
- write_output(ofilename);
- return 0;
-}
diff --git a/rdoff/test/makelib b/rdoff/test/makelib
deleted file mode 100644
index baa4676..0000000
--- a/rdoff/test/makelib
+++ /dev/null
@@ -1,14 +0,0 @@
-
-LIBNAME=$1;
-shift;
-
-if [ "$LIBNAME" = "" ]; then
- echo 'Usage: makelib <library name> <module> [...]'
-fi
-
-rdflib c $LIBNAME
-
-for FILE in $*; do
- rdflib a $LIBNAME $FILE $FILE
-done
-
diff --git a/rdoff/v1/README b/rdoff/v1/README
deleted file mode 100644
index 56ad81b..0000000
--- a/rdoff/v1/README
+++ /dev/null
@@ -1,5 +0,0 @@
-This directory contains programs for working with RDOFF version 1 object
-files. RDOFF version 1 is no longer supported - you should now be using
-RDOFF2. If you are working with your own code, the changes you will need
-to make are very simple, and are outlined in the document Changes in the
-nasm/rdoff directory.
diff --git a/rdoff/v1/collectn.c b/rdoff/v1/collectn.c
deleted file mode 100644
index c265c95..0000000
--- a/rdoff/v1/collectn.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* collectn.c Implements variable length pointer arrays [collections]
- *
- * This file is public domain.
- */
-
-#include "collectn.h"
-#include <stdlib.h>
-
-void collection_init(Collection * c)
-{
- int i;
-
- for (i = 0; i < 32; i++) c->p[i] = NULL;
- c->next = NULL;
-}
-
-void ** colln(Collection * c, int index)
-{
- while (index >= 32) {
- index -= 32;
- if (c->next == NULL) {
- c->next = malloc(sizeof(Collection));
- collection_init(c->next);
- }
- c = c->next;
- }
- return &(c->p[index]);
-}
-
-void collection_reset(Collection *c)
-{
- int i;
- if (c->next) {
- collection_reset(c->next);
- free(c->next);
- }
-
- c->next = NULL;
- for (i = 0; i < 32; i++) c->p[i] = NULL;
-}
diff --git a/rdoff/v1/collectn.h b/rdoff/v1/collectn.h
deleted file mode 100644
index 2dc786e..0000000
--- a/rdoff/v1/collectn.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* collectn.h Header file for 'collection' abstract data type
- *
- * This file is public domain, and does not come under the NASM license.
- * It, along with 'collectn.c' implements what is basically a variable
- * length array (of pointers)
- */
-
-#ifndef _COLLECTN_H
-#define _COLLECTN_H
-
-typedef struct tagCollection {
- void *p[32]; /* array of pointers to objects */
-
- struct tagCollection *next;
-} Collection;
-
-void collection_init(Collection * c);
-void ** colln(Collection * c, int index);
-void collection_reset(Collection * c);
-
-#endif
-
diff --git a/rdoff/v1/ldrdf.c b/rdoff/v1/ldrdf.c
deleted file mode 100644
index 9e4a215..0000000
--- a/rdoff/v1/ldrdf.c
+++ /dev/null
@@ -1,728 +0,0 @@
-/* ldrdf.c RDOFF Object File linker/loader main program
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- */
-
-/* TODO: Make the system skip a module (other than the first) if none
- * of the other specified modules contain a reference to it.
- * May require the system to make an extra pass of the modules to be
- * loaded eliminating those that aren't required.
- *
- * Support all the existing documented options...
- *
- * Support libaries (.a files - requires a 'ranlib' type utility)
- * (I think I've got this working, so I've upped the version)
- *
- * -s option to strip resolved symbols from exports. (Could make this an
- * external utility)
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "rdoff.h"
-#include "nasmlib.h"
-#include "symtab.h"
-#include "collectn.h"
-#include "rdlib.h"
-
-#define LDRDF_VERSION "0.30"
-
-/* global variables - those to set options: */
-
-int verbose = 0; /* reflects setting of command line switch */
-int align = 16;
-int errors = 0; /* set by functions to cause halt after current
- stage of processing */
-
-/* the linked list of modules that must be loaded & linked */
-
-struct modulenode {
- rdffile f; /* the file */
- long coderel; /* module's code relocation factor */
- long datarel; /* module's data relocation factor */
- long bssrel; /* module's bss data reloc. factor */
- void * header; /* header location, if loaded */
- char * name; /* filename */
- struct modulenode *next;
-};
-
-#define newstr(str) strcpy(malloc(strlen(str) + 1),str)
-#define newstrcat(s1,s2) strcat(strcpy(malloc(strlen(s1)+strlen(s2)+1),s1),s2)
-
-
-struct modulenode *modules = NULL,*lastmodule = NULL;
-
-/* the linked list of libraries to be searched for missing imported
- symbols */
-
-struct librarynode * libraries = NULL, * lastlib = NULL;
-
-void *symtab; /* The symbol table */
-
-rdf_headerbuf * newheader ; /* New header to be written to output */
-
-/* loadmodule - find the characteristics of a module and add it to the
- * list of those being linked together */
-
-void loadmodule(char *filename)
-{
- struct modulenode *prev;
- if (! modules) {
- modules = malloc(sizeof(struct modulenode));
- lastmodule = modules;
- prev = NULL;
- }
- else {
- lastmodule->next = malloc(sizeof(struct modulenode));
- prev = lastmodule;
- lastmodule = lastmodule->next;
- }
-
- if (! lastmodule) {
- fputs("ldrdf: not enough memory\n",stderr);
- exit(1);
- }
-
- if (rdfopen(&lastmodule->f,filename)) {
- rdfperror("ldrdf",filename);
- exit(1);
- }
-
- lastmodule->header = NULL; /* header hasn't been loaded */
- lastmodule->name = filename;
- lastmodule->next = NULL;
-
- if (prev) {
- lastmodule->coderel = prev->coderel + prev->f.code_len;
- if (lastmodule->coderel % align != 0)
- lastmodule->coderel += align - (lastmodule->coderel % align);
- lastmodule->datarel = prev->datarel + prev->f.data_len;
- if (lastmodule->datarel % align != 0)
- lastmodule->datarel += align - (lastmodule->datarel % align);
- }
- else {
- lastmodule->coderel = 0;
- lastmodule->datarel = 0;
- }
-
- if (verbose)
- printf("%s code = %08lx (+%04lx), data = %08lx (+%04lx)\n",filename,
- lastmodule->coderel,lastmodule->f.code_len,
- lastmodule->datarel,lastmodule->f.data_len);
-
- lastmodule->header = malloc(lastmodule->f.header_len);
- if (!lastmodule->header) {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- if (rdfloadseg(&lastmodule->f,RDOFF_HEADER,lastmodule->header))
- {
- rdfperror("ldrdf",filename);
- exit(1);
- }
-}
-
-/* load_library add a library to list of libraries to search
- * for undefined symbols
- */
-
-void load_library(char * name)
-{
- if (verbose)
- printf("adding library %s to search path\n",name);
-
- if (! lastlib) {
- lastlib = libraries = malloc(sizeof(struct librarynode));
- }
- else
- {
- lastlib->next = malloc(sizeof(struct librarynode));
- lastlib = lastlib->next;
- }
-
- if (! lastlib) {
- fprintf(stderr, "ldrdf: out of memory\n");
- exit(1);
- }
- strcpy (lastlib->name = malloc (1+strlen(name)), name);
- lastlib->fp = NULL;
- lastlib->referenced = 0;
- lastlib->next = NULL;
-}
-
-
-/* build_symbols() step through each module's header, and locate
- * exported symbols, placing them in a global table
- */
-
-long bsslength;
-
-void mod_addsymbols(struct modulenode * mod)
-{
- rdfheaderrec *r;
- symtabEnt e;
- long cbBss;
-
- mod->bssrel = bsslength;
- cbBss = 0;
- rdfheaderrewind(&mod->f);
- while ((r = rdfgetheaderrec(&mod->f)))
- {
-
- if (r->type == 5) /* Allocate BSS */
- cbBss += r->b.amount;
-
- if (r->type != 3) continue; /* ignore all but export recs */
-
- e.segment = r->e.segment;
- e.offset = r->e.offset +
- (e.segment == 0 ? mod->coderel : /* 0 -> code */
- e.segment == 1 ? mod->datarel : /* 1 -> data */
- mod->bssrel) ; /* 2 -> bss */
-
- e.flags = 0;
- e.name = malloc(strlen(r->e.label) + 1);
- if (! e.name)
- {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
- strcpy(e.name,r->e.label);
- symtabInsert(symtab,&e);
- }
- bsslength += cbBss;
-}
-
-void build_symbols()
-{
- struct modulenode *mod;
-
- if (verbose) printf("building global symbol table:\n");
- newheader = rdfnewheader();
-
- symtab = symtabNew();
- bsslength = 0; /* keep track of location of BSS symbols */
-
- for (mod = modules; mod; mod = mod->next)
- {
- mod_addsymbols( mod );
- }
- if (verbose)
- {
- symtabDump(symtab,stdout);
- printf("BSS length = %ld bytes\n\n",bsslength);
- }
-}
-
-
-/* scan_libraries() search through headers of modules for undefined
- * symbols, and scan libraries for those symbols,
- * adding library modules found to list of modules
- * to load. */
-
-void scan_libraries(void)
-{
- struct modulenode * mod, * nm;
- struct librarynode * lib;
- rdfheaderrec * r;
- int found;
- char * tmp;
-
- if (verbose) printf("Scanning libraries for unresolved symbols...\n");
-
- mod = modules;
-
- while (mod)
- {
- rdfheaderrewind(&mod->f);
-
- while ((r = rdfgetheaderrec(&mod->f)))
- {
- if (r->type != 2) continue; /* not an import record */
- if ( symtabFind (symtab,r->i.label) )
- continue; /* symbol already defined */
-
- /* okay, we have an undefined symbol... step through
- the libraries now */
- if (verbose >= 2) {
- printf("undefined symbol '%s'...",r->i.label);
- fflush(stdout);
- }
-
- lib = libraries;
- found = 0;
-
- tmp = newstr(r->i.label);
- while (! found && lib)
- {
- /* move this to an outer loop...! */
- nm = malloc(sizeof(struct modulenode));
-
- if (rdl_searchlib(lib,tmp,&nm->f))
- { /* found a module in the library */
-
- /* create a modulenode for it */
-
- if (! nm) {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- nm->name = newstrcat(lib->name,nm->f.name);
- if (verbose >= 2) printf("found in '%s'\n",nm->name);
-
- nm->coderel = lastmodule->coderel + lastmodule->f.code_len;
- if (nm->coderel % align != 0)
- nm->coderel += align - (nm->coderel % align);
-
- nm->datarel = lastmodule->datarel + lastmodule->f.data_len;
- if (nm->datarel % align != 0)
- nm->datarel += align - (nm->datarel % align);
-
- nm->header = malloc(nm->f.header_len);
- if (! nm->header)
- {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- if (rdfloadseg(&nm->f,RDOFF_HEADER,nm->header))
- {
- rdfperror("ldrdf",nm->name);
- exit(1);
- }
-
- nm->next = NULL;
- found = 1;
- lastmodule->next = nm;
- lastmodule = nm;
-
- if (verbose)
- printf("%s code = %08lx (+%04lx), data = %08lx "
- "(+%04lx)\n",lastmodule->name,
- lastmodule->coderel,lastmodule->f.code_len,
- lastmodule->datarel,lastmodule->f.data_len);
-
- /* add the module's info to the symbol table */
- mod_addsymbols(nm);
- }
- else
- {
- if (rdl_error) {
- rdl_perror("ldrdf",lib->name);
- exit(1);
- }
- free(nm);
- }
- lib = lib->next;
- }
- free(tmp);
- if (!found && verbose >= 2) printf("not found\n");
- }
- mod = mod->next;
- }
-}
-
-/* load_segments() allocates memory for & loads the code & data segs
- * from the RDF modules
- */
-
-char *text,*data;
-long textlength,datalength;
-
-void load_segments(void)
-{
- struct modulenode *mod;
-
- if (!modules) {
- fprintf(stderr,"ldrdf: nothing to do\n");
- exit(0);
- }
- if (!lastmodule) {
- fprintf(stderr,"ldrdf: panic: module list exists, but lastmodule=NULL\n");
- exit(3);
- }
-
- if (verbose)
- printf("loading modules into memory\n");
-
- /* The following stops 16 bit DOS from crashing whilst attempting to
- work using segments > 64K */
- if (sizeof(int) == 2) { /* expect a 'code has no effect' warning on 32 bit
- platforms... */
- if (lastmodule->coderel + lastmodule->f.code_len > 65535 ||
- lastmodule->datarel + lastmodule->f.data_len > 65535) {
- fprintf(stderr,"ldrdf: segment length has exceeded 64K; use a 32 bit "
- "version.\nldrdf: code size = %05lx, data size = %05lx\n",
- lastmodule->coderel + lastmodule->f.code_len,
- lastmodule->datarel + lastmodule->f.data_len);
- exit(1);
- }
- }
-
- text = malloc(textlength = lastmodule->coderel + lastmodule->f.code_len);
- data = malloc(datalength = lastmodule->datarel + lastmodule->f.data_len);
-
- if (!text || !data) {
- fprintf(stderr,"ldrdf: out of memory\n");
- exit(1);
- }
-
- mod = modules;
- while (mod) { /* load the segments for each module */
- if (verbose >= 2) printf(" loading %s\n",mod->name);
- if (rdfloadseg(&mod->f,RDOFF_CODE,&text[mod->coderel]) ||
- rdfloadseg(&mod->f,RDOFF_DATA,&data[mod->datarel])) {
- rdfperror("ldrdf",mod->name);
- exit(1);
- }
- rdfclose(&mod->f); /* close file; segments remain */
- mod = mod->next;
- }
-}
-
-/* link_segments() step through relocation records in each module's
- * header, fixing up references.
- */
-
-void link_segments(void)
-{
- struct modulenode *mod;
- Collection imports;
- symtabEnt *s;
- long rel,relto;
- char *seg;
- rdfheaderrec *r;
- int bRelative;
-
- if (verbose) printf("linking segments\n");
-
- collection_init(&imports);
-
- for (mod = modules; mod; mod = mod->next) {
- if (verbose >= 2) printf("* processing %s\n",mod->name);
- rdfheaderrewind(&mod->f);
- while((r = rdfgetheaderrec(&mod->f))) {
- if (verbose >= 3) printf("record type: %d\n",r->type);
- switch(r->type) {
- case 1: /* relocation record */
- if (r->r.segment >= 64) { /* Relative relocation; */
- bRelative = 1; /* need to find location relative */
- r->r.segment -= 64; /* to start of this segment */
- relto = r->r.segment == 0 ? mod->coderel : mod->datarel;
- }
- else
- {
- bRelative = 0; /* non-relative - need to relocate
- * at load time */
- relto = 0; /* placate optimiser warnings */
- }
-
- /* calculate absolute offset of reference, not rel to beginning of
- segment */
- r->r.offset += r->r.segment == 0 ? mod->coderel : mod->datarel;
-
- /* calculate the relocation factor to apply to the operand -
- the base address of one of this modules segments if referred
- segment is 0 - 2, or the address of an imported symbol
- otherwise. */
-
- if (r->r.refseg == 0) rel = mod->coderel;
- else if (r->r.refseg == 1) rel = mod->datarel;
- else if (r->r.refseg == 2) rel = mod->bssrel;
- else { /* cross module link - find reference */
- s = *colln(&imports,r->r.refseg - 2);
- if (!s) {
- fprintf(stderr,"ldrdf: link to undefined segment %04x in"
- " %s:%d\n", r->r.refseg,mod->name,r->r.segment);
- errors = 1;
- break;
- }
- rel = s->offset;
-
- r->r.refseg = s->segment; /* change referred segment,
- so that new header is
- correct */
- }
-
- if (bRelative) /* Relative - subtract current segment start */
- rel -= relto;
- else
- { /* Add new relocation header */
- rdfaddheader(newheader,r);
- }
-
- /* Work out which segment we're making changes to ... */
- if (r->r.segment == 0) seg = text;
- else if (r->r.segment == 1) seg = data;
- else {
- fprintf(stderr,"ldrdf: relocation in unknown segment %d in "
- "%s\n", r->r.segment,mod->name);
- errors = 1;
- break;
- }
-
- /* Add the relocation factor to the datum specified: */
-
- if (verbose >= 3)
- printf(" - relocating %d:%08lx by %08lx\n",r->r.segment,
- r->r.offset,rel);
-
- /**** The following code is non-portable. Rewrite it... ****/
- switch(r->r.length) {
- case 1:
- seg[r->r.offset] += (char) rel;
- break;
- case 2:
- *(int16 *)(seg + r->r.offset) += (int16) rel;
- break;
- case 4:
- *(long *)(seg + r->r.offset) += rel;
- break;
- }
- break;
-
- case 2: /* import record */
- s = symtabFind(symtab, r->i.label);
- if (s == NULL) {
- /* Need to add support for dynamic linkage */
- fprintf(stderr,"ldrdf: undefined symbol %s in module %s\n",
- r->i.label,mod->name);
- errors = 1;
- }
- else
- {
- *colln(&imports,r->i.segment - 2) = s;
- if (verbose >= 2)
- printf("imported %s as %04x\n", r->i.label, r->i.segment);
- }
- break;
-
- case 3: /* export; dump to output new version */
- s = symtabFind(symtab, r->e.label);
- if (! s) {
- fprintf(stderr,"ldrdf: internal error - undefined symbol %s "
- "exported in header of '%s'\n",r->e.label,mod->name);
- continue;
- }
- r->e.offset = s->offset;
- rdfaddheader(newheader,r);
- break;
-
- case 4: /* DLL record */
- rdfaddheader(newheader,r); /* copy straight to output */
- break;
- }
- }
- if (rdf_errno != 0) {
- rdfperror("ldrdf",mod->name);
- exit(1);
- }
- collection_reset(&imports);
- }
-}
-
-/* write_output() write linked program out to a file */
-
-void write_output(char *filename)
-{
- FILE * fp;
- rdfheaderrec r;
-
- if (verbose) printf("writing output to '%s'\n",filename);
-
- fp = fopen(filename,"wb");
- if (! fp)
- {
- fprintf(stderr,"ldrdf: could not open '%s' for writing\n",filename);
- exit(1);
- }
-
-
- /* add BSS length count to header... */
- if (bsslength)
- {
- r.type = 5;
- r.b.amount = bsslength;
- rdfaddheader(newheader,&r);
- }
-
- /* Write header */
- rdfwriteheader(fp,newheader);
- rdfdoneheader(newheader);
- newheader = NULL;
-
- /* Write text */
- if (fwrite(&textlength,1,4,fp) != 4
- || fwrite(text,1,textlength,fp) !=textlength)
- {
- fprintf(stderr,"ldrdf: error writing %s\n",filename);
- exit(1);
- }
-
- /* Write data */
- if (fwrite(&datalength,1,4,fp) != 4 ||
- fwrite(data,1,datalength,fp) != datalength)
- {
- fprintf (stderr,"ldrdf: error writing %s\n", filename);
- exit(1);
- }
- fclose(fp);
-}
-
-
-/* main program: interpret command line, and pass parameters on to
- * individual module loaders & the linker
- *
- * Command line format:
- * ldrdf [-o outfile | -x] [-r xxxx] [-v] [--] infile [infile ...]
- *
- * Default action is to output a file named 'aout.rdx'. -x specifies
- * that the linked object program should be executed, rather than
- * written to a file. -r specifies that the object program should
- * be prelocated at address 'xxxx'. This option cannot be used
- * in conjunction with -x.
- */
-
-const char *usagemsg = "usage:\n"
-" ldrdf [-o outfile | -x] [-a x] [-v] [-p x] [--] infile [infile ...]\n"
-" [-l<libname> ...]\n\n"
-" ldrdf -h displays this message\n"
-" ldrdf -r displays version information\n\n"
-" -o selects output filename (default is aout.rdx)\n"
-" -x causes ldrdx to link & execute rather than write to file\n"
-" -a x causes object program to be statically relocated to address 'x'\n"
-" -v turns on verbose mode\n"
-" -p x causes segments to be aligned (padded) to x byte boundaries\n"
-" (default is 16 bytes)\n"
-" -l<name> causes 'name' to be linked in as a library. Note no search is\n"
-" performed - the entire pathname MUST be specified.\n";
-
-void usage(void)
-{
- fputs(usagemsg,stderr);
-}
-
-int main(int argc,char **argv)
-{
- char *ofilename = "aout.rdx";
- long relocateaddr = -1; /* -1 if no relocation is to occur */
- int execute = 0; /* 1 to execute after linking, 0 otherwise */
- int procsw = 1; /* set to 0 by '--' */
- int tmp;
-
- if (argc == 1) {
- usage();
- exit(1);
- }
-
- /* process command line switches, and add modules specified to linked list
- of modules, keeping track of total memory required to load them */
-
- while(argv++,--argc) {
- if (procsw && !strcmp(*argv,"-h")) { /* Help command */
- usage(); exit(1);
- }
- else if (procsw && !strcmp(*argv,"-r")) {
- printf("ldrdf version %s (%s) (%s)\n",LDRDF_VERSION,_RDOFF_H,
- sizeof(int) == 2 ? "16 bit" : "32 bit");
- exit(1);
- }
- else if (procsw && !strcmp(*argv,"-o")) {
- ofilename = *++argv;
- --argc;
- if (execute) {
- fprintf(stderr,"ldrdf: -o and -x switches incompatible\n");
- exit(1);
- }
- if (verbose > 1) printf("output filename set to '%s'\n",ofilename);
- }
- else if (procsw && !strcmp(*argv,"-x")) {
- execute++;
- if (verbose > 1) printf("will execute linked object\n");
- }
- else if (procsw && !strcmp(*argv,"-a")) {
- relocateaddr = readnum(*++argv,&tmp);
- --argc;
- if (tmp) {
- fprintf(stderr,"ldrdf: error in parameter to '-a' switch: '%s'\n",
- *argv);
- exit(1);
- }
- if (execute) {
- fprintf(stderr,"ldrdf: -a and -x switches incompatible\n");
- exit(1);
- }
- if (verbose) printf("will relocate to %08lx\n",relocateaddr);
- }
- else if (procsw && !strcmp(*argv,"-v")) {
- verbose++;
- if (verbose == 1) printf("verbose mode selected\n");
- }
- else if (procsw && !strcmp(*argv,"-p")) {
- align = readnum(*++argv,&tmp);
- --argc;
- if (tmp) {
- fprintf(stderr,"ldrdf: error in parameter to '-p' switch: '%s'\n",
- *argv);
- exit(1);
- }
- if (align != 1 && align != 2 && align != 4 && align != 8 && align != 16
- && align != 32 && align != 256) {
- fprintf(stderr,"ldrdf: %d is an invalid alignment factor - must be"
- "1,2,4,8,16 or 256\n",align);
- exit(1);
- }
- if (verbose > 1) printf("alignment %d selected\n",align);
- }
- else if (procsw && !strncmp(*argv,"-l",2)) {
- load_library(*argv + 2);
- }
- else if (procsw && !strcmp(*argv,"--")) {
- procsw = 0;
- }
- else { /* is a filename */
- if (verbose > 1) printf("processing module %s\n",*argv);
- loadmodule(*argv);
- }
- }
-
- /* we should be scanning for unresolved references, and removing
- unreferenced modules from the list of modules here, so that
- we know about the final size once libraries have been linked in */
-
- build_symbols(); /* build a global symbol table... */
-
- scan_libraries(); /* check for imported symbols not in table,
- and ensure the relevant library modules
- are loaded */
-
- load_segments(); /* having calculated size of reqd segments, load
- each rdoff module's segments into memory */
-
- link_segments(); /* step through each module's header, and resolve
- references to the global symbol table.
- This also does local address fixups. */
-
- if (errors) {
- fprintf(stderr,"ldrdf: there were errors - aborted\n");
- exit(errors);
- }
- if (execute) {
- fprintf(stderr,"ldrdf: module execution not yet supported\n");
- exit(1);
- }
- if (relocateaddr != -1) {
- fprintf(stderr,"ldrdf: static relocation not yet supported\n");
- exit(1);
- }
-
- write_output(ofilename);
- return 0;
-}
diff --git a/rdoff/v1/rdf.doc b/rdoff/v1/rdf.doc
deleted file mode 100644
index 300c2bc..0000000
--- a/rdoff/v1/rdf.doc
+++ /dev/null
@@ -1,99 +0,0 @@
-RDOFF: Relocatable Dynamically-linked Object File Format
-========================================================
-
-RDOFF was designed initially to test the object-file production
-interface to NASM. It soon became apparent that it could be enhanced
-for use in serious applications due to its simplicity; code to load
-and execute an RDOFF object module is very simple. It also contains
-enhancements to allow it to be linked with a dynamic link library at
-either run- or load- time, depending on how complex you wish to make
-your loader.
-
-The RDOFF format (version 1.1, as produced by NASM v0.91) is defined
-as follows:
-
-The first six bytes of the file contain the string 'RDOFF1'. Other
-versions of the format may contain other last characters other than
-'1' - all little endian versions of the file will always contain an
-ASCII character with value greater than 32. If RDOFF is used on a
-big-endian machine at some point in the future, the version will be
-encoded in decimal rather than ASCII, so will be below 32.
-
-All multi-byte fields follwing this are encoded in either little- or
-big-endian format depending on the system described by this version
-information. Object files should be encoded in the endianness of
-their target machine; files of incorrect endianness will be rejected
-by the loader - this means that loaders do not need to convert
-endianness, as RDOFF has been designed with simplicity of loading at
-the forefront of the design requirements.
-
-The next 4 byte field is the length of the header in bytes. The
-header consists of a sequence of variable length records. Each
-record's type is identified by the first byte of the record. Record
-types 1-4 are currently supported. Record type 5 will be added in
-the near future, when I implement BSS segments. Record type 6 may be
-to do with debugging, when I get debugging implemented.
-
-Type 1: Relocation
-==================
-
-Offset Length Description
-0 1 Type (contains 1)
-1 1 Segment that contains reference (0 = text, 1 = data)
- Add 64 to this number to indicate a relative linkage
- to an external symbol (see notes)
-2 4 Offset of reference
-6 1 Length of reference (1,2 or 4 bytes)
-7 2 Segment to which reference is made (0 = text, 1 =
- data, 2 = BSS [when implemented]) others are external
- symbols.
-
-Total length = 9 bytes
-
-Type 2: Symbol Import
-=====================
-
-0 1 Type (2)
-1 2 Segment number that will be used in references to this
- symbol.
-3 ? Null terminated string containing label (up to 32
- chars) to match against exports in linkage.
-
-Type 3: Symbol Export
-=====================
-
-0 1 Type (3)
-1 1 Segment containing object to be exported (0/1/2)
-2 4 Offset within segment
-6 ? Null terminate string containing label to export (32
- char maximum length)
-
-Type 4: Dynamic Link Library
-============================
-
-0 1 Type (4)
-1 ? Library name (up to 128 chars)
-
-Type 5: Reserve BSS
-===================
-
-0 1 Type (5)
-1 4 Amount of BSS space to reserve in bytes
-
-Total length: 5 bytes
-
------------------------------------------------------------------------------
-
-Following the header is the text (code) segment. This is preceded by
-a 4-byte integer, which is its length in bytes. This is followed by
-the length of the data segment (also 4 bytes), and finally the data
-segment.
-
-Notes
-=====
-
-Relative linking: The number stored at the address is offset
-required from the imported symbol, with the address of the end of
-the instruction subtracted from it. This means that the linker can
-simply add the address of the label relative to the beginning of the
-current segment to it.
diff --git a/rdoff/v1/rdf2bin.c b/rdoff/v1/rdf2bin.c
deleted file mode 100644
index 97b45b4..0000000
--- a/rdoff/v1/rdf2bin.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* rdf2bin: convert an RDOFF object file to flat binary */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "rdfload.h"
-#include "rdoff.h"
-#include "nasmlib.h"
-
-long origin = 0;
-int align = 16;
-
-char *getfilename(char * pathname)
-{
- char * lastslash = pathname - 1;
- char * i = pathname;
-
- while ( *i ) {
- if (*i == '/') lastslash = i;
- i++;
- }
- return lastslash + 1;
-}
-
-int main(int argc, char **argv)
-{
- rdfmodule * m;
- int tmp;
- FILE *of;
- char * padding;
- int codepad, datapad;
-
- if (argc < 2) {
- puts("Usage: rdf2bin [-o relocation-origin] [-p segment-alignment] "
- "input-file output-file");
- puts(" rdf2com [-p segment-alignment] input-file output-file");
- return 1;
- }
-
- if (! nasm_stricmp(getfilename(*argv),"rdf2com")) {
- origin = 0x100;
- }
- argv++, argc--;
-
- while (argc > 2) {
- if (! strcmp(*argv,"-o")) {
- argv++, argc--;
- origin = readnum(*argv, &tmp);
- if (tmp) {
- fprintf(stderr,"rdf2bin: invalid parameter: %s\n",*argv);
- return 1;
- }
- } else if (! strcmp(*argv,"-p")) {
- argv++, argc--;
- align = readnum(*argv, &tmp);
- if (tmp) {
- fprintf(stderr,"rdf2bin: invalid parameter: %s\n",*argv);
- return 1;
- }
- } else
- break;
-
- argv++, argc--;
- }
- if (argc < 2) {
- puts("rdf2bin: required parameter missing");
- return -1;
- }
- m = rdfload(*argv);
-
- if (! m)
- {
- rdfperror("rdf2bin",*argv);
- return 1;
- }
- printf("relocating %s: origin=%lx, align=%d\n",*argv,origin,align);
-
- m->textrel = origin;
- m->datarel = origin + m->f.code_len;
- if (m->datarel % align != 0) {
- codepad = align - (m->datarel % align);
- m->datarel += codepad;
- }
- else
- codepad = 0;
-
- m->bssrel = m->datarel + m->f.data_len;
- if (m->bssrel % align != 0) {
- datapad = align - (m->bssrel % align);
- m->bssrel += datapad;
- }
- else
- datapad = 0;
-
- printf("code: %08lx\ndata: %08lx\nbss: %08lx\n",
- m->textrel, m->datarel, m->bssrel);
-
- rdf_relocate(m);
-
- argv++;
-
- of = fopen(*argv,"wb");
- if (!of) {
- fprintf(stderr,"rdf2bin: could not open output file %s\n",*argv);
- return 1;
- }
-
- padding = malloc(align);
- if (!padding) {
- fprintf(stderr,"rdf2bin: out of memory\n");
- return 1;
- }
-
- if (fwrite(m->t,1,m->f.code_len,of) != m->f.code_len ||
- fwrite(padding,1,codepad,of) != codepad ||
- fwrite(m->d,1,m->f.data_len,of) != m->f.data_len)
- {
- fprintf(stderr,"rdf2bin: error writing to %s\n", *argv);
- return 1;
- }
-
- fclose(of);
- return 0;
-}
diff --git a/rdoff/v1/rdfdump.c b/rdoff/v1/rdfdump.c
deleted file mode 100644
index 080c2e7..0000000
--- a/rdoff/v1/rdfdump.c
+++ /dev/null
@@ -1,167 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-FILE *infile;
-
-long translatelong(long in) { /* translate from little endian to
- local representation */
- long r;
- unsigned char *i;
-
- i = (unsigned char *)&in;
- r = i[3];
- r = (r << 8) + i[2];
- r = (r << 8) + i[1];
- r = (r << 8) + *i;
-
- return r;
-}
-
-int translateshort(short in) {
- int r;
- unsigned char *i;
-
- i = (unsigned char *)&in;
- r = (i[1] << 8) + *i;
-
- return r;
-}
-void print_header(long length) {
- char buf[129],t,s,l;
- long o,ll;
- short rs;
-
- while (length > 0) {
- fread(&t,1,1,infile);
- switch(t) {
- case 1: /* relocation record */
- fread(&s,1,1,infile);
- fread(&o,4,1,infile);
- fread(&l,1,1,infile);
- fread(&rs,2,1,infile);
- printf(" relocation: location (%04x:%08lx), length %d, "
- "referred seg %04x\n",(int)s,translatelong(o),(int)l,
- translateshort(rs));
- length -= 9;
- break;
- case 2: /* import record */
- fread(&rs,2,1,infile);
- ll = 0;
- do {
- fread(&buf[ll],1,1,infile);
- } while (buf[ll++]);
- printf(" import: segment %04x = %s\n",translateshort(rs),buf);
- length -= ll + 3;
- break;
- case 3: /* export record */
- fread(&s,1,1,infile);
- fread(&o,4,1,infile);
- ll = 0;
- do {
- fread(&buf[ll],1,1,infile);
- } while (buf[ll++]);
- printf(" export: (%04x:%08lx) = %s\n",(int)s,translatelong(o),buf);
- length -= ll + 6;
- break;
- case 4: /* DLL record */
- ll = 0;
- do {
- fread(&buf[ll],1,1,infile);
- } while (buf[ll++]);
- printf(" dll: %s\n",buf);
- length -= ll + 1;
- break;
- case 5: /* BSS reservation */
- fread(&ll,4,1,infile);
- printf(" bss reservation: %08lx bytes\n",translatelong(ll));
- length -= 5;
- break;
- default:
- printf(" unrecognised record (type %d)\n",(int)t);
- length --;
- }
- }
-}
-
-int main(int argc,char **argv) {
- char id[7];
- long l;
- int verbose = 0;
- long offset;
-
- puts("RDOFF Dump utility v1.1 (C) Copyright 1996 Julian R Hall");
-
- if (argc < 2) {
- fputs("Usage: rdfdump [-v] <filename>\n",stderr);
- exit(1);
- }
-
- if (! strcmp (argv[1], "-v") )
- {
- verbose = 1;
- if (argc < 3)
- {
- fputs("required parameter missing\n",stderr);
- exit(1);
- }
- argv++;
- }
-
- infile = fopen(argv[1],"rb");
- if (! infile) {
- fprintf(stderr,"rdfdump: Could not open %s",argv[1]);
- exit(1);
- }
-
- fread(id,6,1,infile);
- if (strncmp(id,"RDOFF",5)) {
- fputs("rdfdump: File does not contain valid RDOFF header\n",stderr);
- exit(1);
- }
-
- printf("File %s: RDOFF version %c\n\n",argv[1],id[5]);
- if (id[5] < '1' || id[5] > '1') {
- fprintf(stderr,"rdfdump: unknown RDOFF version '%c'\n",id[5]);
- exit(1);
- }
-
- fread(&l,4,1,infile);
- l = translatelong(l);
- printf("Header (%ld bytes):\n",l);
- print_header(l);
-
- fread(&l,4,1,infile);
- l = translatelong(l);
- printf("\nText segment length = %ld bytes\n",l);
- offset = 0;
- while(l--) {
- fread(id,1,1,infile);
- if (verbose) {
- if (offset % 16 == 0)
- printf("\n%08lx ", offset);
- printf(" %02x",(int) (unsigned char)id[0]);
- offset++;
- }
- }
- if (verbose) printf("\n\n");
-
- fread(&l,4,1,infile);
- l = translatelong(l);
- printf("Data segment length = %ld bytes\n",l);
-
- if (verbose)
- {
- offset = 0;
- while (l--) {
- fread(id,1,1,infile);
- if (offset % 16 == 0)
- printf("\n%08lx ", offset);
- printf(" %02x",(int) (unsigned char) id[0]);
- offset++;
- }
- printf("\n");
- }
- fclose(infile);
- return 0;
-}
diff --git a/rdoff/v1/rdflib.c b/rdoff/v1/rdflib.c
deleted file mode 100644
index 5846562..0000000
--- a/rdoff/v1/rdflib.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/* rdflib - manipulate RDOFF library files (.rdl) */
-
-/* an rdoff library is simply a sequence of RDOFF object files, each
- preceded by the name of the module, an ASCII string of up to 255
- characters, terminated by a zero. There may be an optional
- directory placed on the end of the file. The format of the
- directory will be 'RDL' followed by a version number, followed by
- the length of the directory, and then the directory, the format of
- which has not yet been designed. */
-
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-
-/* functions supported:
- create a library (no extra operands required)
- add a module from a library (requires filename and name to give mod.)
- remove a module from a library (requires given name)
- extract a module from the library (requires given name and filename)
- list modules */
-
-const char *usage =
- "usage:\n"
- " rdflib x libname [extra operands]\n\n"
- " where x is one of:\n"
- " c - create library\n"
- " a - add module (operands = filename module-name)\n"
- " r - remove (module-name)\n"
- " x - extract (module-name filename)\n"
- " t - list\n";
-
-char **_argv;
-
-#define _ENDIANNESS 0 /* 0 for little, 1 for big */
-
-static void longtolocal(long * l)
-{
-#if _ENDIANNESS
- unsigned char t;
- unsigned char * p = (unsigned char *) l;
-
- t = p[0];
- p[0] = p[3];
- p[3] = t;
- t = p[1];
- p[1] = p[2];
- p[2] = p[1];
-#endif
-}
-
-void copybytes(FILE *fp, FILE *fp2, int n)
-{
- int i,t;
-
- for (i = 0 ; i < n; i++ )
- {
- t = fgetc(fp);
- if (t == EOF)
- {
- fprintf(stderr,"ldrdf: premature end of file in '%s'\n",
- _argv[2]);
- exit(1);
- }
- if (fp2)
- if (fputc(t, fp2) == EOF)
- {
- fprintf(stderr,"ldrdf: write error\n");
- exit(1);
- }
- }
-}
-
-long copylong(FILE *fp, FILE *fp2)
-{
- long l;
- int i,t;
- unsigned char * p = (unsigned char *) &l;
-
-
- for (i = 0 ; i < 4; i++ ) /* skip magic no */
- {
- t = fgetc(fp);
- if (t == EOF)
- {
- fprintf(stderr,"ldrdf: premature end of file in '%s'\n",
- _argv[2]);
- exit(1);
- }
- if (fp2)
- if (fputc(t, fp2) == EOF)
- {
- fprintf(stderr,"ldrdf: write error\n");
- exit(1);
- }
- *p++ = t;
- }
- longtolocal (&l);
- return l;
-}
-
-int main(int argc, char **argv)
-{
- FILE *fp, *fp2;
- char *p, buf[256];
- int i;
-
- _argv = argv;
-
- if (argc < 3 || !strncmp(argv[1],"-h",2) || !strncmp(argv[1],"--h",3))
- {
- printf(usage);
- exit(1);
- }
-
- switch(argv[1][0])
- {
- case 'c': /* create library */
- fp = fopen(argv[2],"wb");
- if (! fp) {
- fprintf(stderr,"ldrdf: could not open '%s'\n",argv[2]);
- perror("ldrdf");
- exit(1);
- }
- fclose(fp);
- break;
-
- case 'a': /* add module */
- if (argc < 5) {
- fprintf(stderr,"ldrdf: required parameter missing\n");
- exit(1);
- }
- fp = fopen(argv[2],"ab");
- if (! fp)
- {
- fprintf(stderr,"ldrdf: could not open '%s'\n",argv[2]);
- perror("ldrdf");
- exit(1);
- }
-
- fp2 = fopen(argv[3],"rb");
- if (! fp)
- {
- fprintf(stderr,"ldrdf: could not open '%s'\n",argv[3]);
- perror("ldrdf");
- exit(1);
- }
-
- p = argv[4];
- do {
- if ( fputc(*p,fp) == EOF ) {
- fprintf(stderr,"ldrdf: write error\n");
- exit(1);
- }
- } while (*p++);
-
- while (! feof (fp2) ) {
- i = fgetc (fp2);
- if (i == EOF) {
- break;
- }
-
- if ( fputc(i, fp) == EOF ) {
- fprintf(stderr,"ldrdf: write error\n");
- exit(1);
- }
- }
- fclose(fp2);
- fclose(fp);
- break;
-
- case 'x':
- if (argc < 5) {
- fprintf(stderr,"ldrdf: required parameter missing\n");
- exit(1);
- }
-
- fp = fopen(argv[2],"rb");
- if (! fp)
- {
- fprintf(stderr,"ldrdf: could not open '%s'\n",argv[2]);
- perror("ldrdf");
- exit(1);
- }
-
- fp2 = NULL;
- while (! feof(fp) ) {
- /* read name */
- p = buf;
- while( ( *(p++) = (char) fgetc(fp) ) )
- if (feof(fp)) break;
-
- if (feof(fp)) break;
-
- /* check against desired name */
- if (! strcmp(buf,argv[3]) )
- {
- fp2 = fopen(argv[4],"wb");
- if (! fp2)
- {
- fprintf(stderr,"ldrdf: could not open '%s'\n", argv[4]);
- perror("ldrdf");
- exit(1);
- }
- }
- else
- fp2 = NULL;
-
- /* step over the RDOFF file, copying it if fp2 != NULL */
- copybytes(fp,fp2,6); /* magic number */
- copybytes(fp,fp2, copylong(fp,fp2)); /* header */
- copybytes(fp,fp2, copylong(fp,fp2)); /* text */
- copybytes(fp,fp2, copylong(fp,fp2)); /* data */
-
- if (fp2)
- break;
- }
- fclose(fp);
- if (fp2)
- fclose(fp2);
- else
- {
- fprintf(stderr,"ldrdf: module '%s' not found in '%s'\n",
- argv[3],argv[2]);
- exit(1);
- }
- break;
-
- default:
- fprintf(stderr,"ldrdf: command '%c' not recognised\n",
- argv[1][0]);
- exit(1);
- }
- return 0;
-}
-
diff --git a/rdoff/v1/rdfload.c b/rdoff/v1/rdfload.c
deleted file mode 100644
index b848344..0000000
--- a/rdoff/v1/rdfload.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/* rdfload.c RDOFF Object File loader library
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- *
- * Permission to use this file in your own projects is granted, as long
- * as acknowledgement is given in an appropriate manner to its authors,
- * with instructions of how to obtain a copy via ftp.
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "rdfload.h"
-#include "symtab.h"
-#include "rdoff.h"
-#include "collectn.h"
-
-extern int rdf_errno;
-
-rdfmodule * rdfload(const char *filename)
-{
- rdfmodule * f = malloc(sizeof(rdfmodule));
- long bsslength = 0;
- char * hdr;
- rdfheaderrec *r;
-
- if (f == NULL)
- {
- rdf_errno = 6; /* out of memory */
- return NULL;
- }
-
- f->symtab = symtabNew();
- if (!f->symtab)
- {
- free(f);
- rdf_errno = 6;
- return NULL;
- }
-
- /* open the file */
- if ( rdfopen( &(f->f), filename ) ) {
- free(f);
- return NULL;
- }
-
- /* read in text and data segments, and header */
-
- f->t = malloc (f->f.code_len);
- f->d = malloc (f->f.data_len); /* BSS seg allocated later */
- hdr = malloc (f->f.header_len);
-
- if (! f->t || ! f->d || !hdr) {
- rdf_errno = 6;
- rdfclose(&f->f);
- if (f->t) free(f->t);
- if (f->d) free(f->d);
- free(f);
- return NULL;
- }
-
- if ( rdfloadseg (&f->f,RDOFF_HEADER,hdr) ||
- rdfloadseg (&f->f,RDOFF_CODE,f->t) ||
- rdfloadseg (&f->f,RDOFF_DATA,f->d) )
- {
- rdfclose(&f->f);
- free(f->t);
- free(f->d);
- free(f);
- free(hdr);
- return NULL;
- }
-
- rdfclose(&f->f);
-
- /* Allocate BSS segment; step through header and count BSS records */
-
- while ( ( r = rdfgetheaderrec (&f->f) ) )
- {
- if (r->type == 5)
- bsslength += r->b.amount;
- }
-
- f->b = malloc ( bsslength );
- if (! f->b )
- {
- free(f->t);
- free(f->d);
- free(f);
- free(hdr);
- rdf_errno = 6;
- return NULL;
- }
-
- rdfheaderrewind (&f->f);
-
- f->textrel = (long)f->t;
- f->datarel = (long)f->d;
- f->bssrel = (long)f->b;
-
- return f;
-}
-
-int rdf_relocate(rdfmodule * m)
-{
- rdfheaderrec * r;
- Collection imports;
- symtabEnt e;
- long rel;
- unsigned char * seg;
-
- rdfheaderrewind ( & m->f );
- collection_init(&imports);
-
- while ( (r = rdfgetheaderrec ( & m->f ) ) )
- {
- switch (r->type)
- {
- case 1: /* Relocation record */
-
- /* calculate relocation factor */
-
- if (r->r.refseg == 0) rel = m->textrel;
- else if (r->r.refseg == 1) rel = m->datarel;
- else if (r->r.refseg == 2) rel = m->bssrel;
- else
- /* We currently do not support load-time linkage.
- This should be added some time soon... */
-
- return 1; /* return error code */
-
- if ((r->r.segment & 63) == 0) seg = m->t;
- else if ((r->r.segment & 63) == 1) seg = m->d;
- else
- return 1;
-
- /* it doesn't matter in this case that the code is non-portable,
- as the entire concept of executing a module like this is
- non-portable */
- switch(r->r.length) {
- case 1:
- seg[r->r.offset] += (char) rel;
- break;
- case 2:
- *(int16 *)(seg + r->r.offset) += (int16) rel;
- break;
- case 4:
- *(long *)(seg + r->r.offset) += rel;
- break;
- }
- break;
-
- case 3: /* export record - add to symtab */
- e.segment = r->e.segment;
- e.offset = r->e.offset +
- (e.segment == 0 ? m->textrel : /* 0 -> code */
- e.segment == 1 ? m->datarel : /* 1 -> data */
- m->bssrel) ; /* 2 -> bss */
- e.flags = 0;
- e.name = malloc(strlen(r->e.label) + 1);
- if (! e.name)
- return 1;
-
- strcpy(e.name,r->e.label);
- symtabInsert(m->symtab,&e);
- break;
- }
- }
- return 0;
-}
diff --git a/rdoff/v1/rdfload.h b/rdoff/v1/rdfload.h
deleted file mode 100644
index 5e264b9..0000000
--- a/rdoff/v1/rdfload.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* rdfload.h RDOFF Object File loader library header file
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- *
- * See the file 'rdfload.c' for special license information for this
- * file.
- */
-
-#ifndef _RDFLOAD_H
-#define _RDFLOAD_H
-
-#include "rdoff.h"
-
-typedef struct RDFModuleStruct {
- rdffile f; /* file structure */
- unsigned char * t, * d, * b; /* text, data, and bss segments */
- long textrel;
- long datarel;
- long bssrel;
- void * symtab;
-} rdfmodule;
-
-rdfmodule * rdfload(const char * filename);
-int rdf_relocate(rdfmodule * m);
-
-#endif
diff --git a/rdoff/v1/rdlib.c b/rdoff/v1/rdlib.c
deleted file mode 100644
index bc8d1e3..0000000
--- a/rdoff/v1/rdlib.c
+++ /dev/null
@@ -1,88 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "rdoff.h"
-#include "rdlib.h"
-
-int rdl_error = 0;
-
-char *rdl_errors[3] = {
- "no error","could not open file", "invalid file structure",
-};
-
-int rdl_searchlib (struct librarynode * lib,
- const char * label, rdffile * f)
-{
- char buf[257];
- int i;
- void * hdr;
- rdfheaderrec * r;
-
- rdl_error = 0;
- lib->referenced ++;
-
- if (! lib->fp)
- {
- lib->fp = fopen(lib->name,"rb");
-
- if (! lib->fp) {
- rdl_error = 1;
- return 0;
- }
- }
- else
- rewind(lib->fp);
-
- while (! feof(lib->fp) )
- {
- i = 1;
- while (fread(buf + i,1,1,lib->fp) == 1 && buf[i] && i < 257)
- i++;
- buf[0] = ':';
-
- if (feof(lib->fp)) break;
-
- if ( rdfopenhere(f,lib->fp,&lib->referenced,buf) ) {
- rdl_error = 2;
- return 0;
- }
-
- hdr = malloc(f->header_len);
- rdfloadseg(f,RDOFF_HEADER,hdr);
-
- while ((r = rdfgetheaderrec(f)))
- {
- if (r->type != 3) /* not an export */
- continue;
-
- if (! strcmp(r->e.label, label) ) /* match! */
- {
- free(hdr); /* reset to 'just open' */
- f->header_loc = NULL; /* state... */
- f->header_fp = 0;
- return 1;
- }
- }
-
- /* find start of next module... */
- i = f->data_ofs + f->data_len;
- rdfclose(f);
- fseek(lib->fp,i,SEEK_SET);
- }
-
- lib->referenced --;
- if (! lib->referenced)
- {
- fclose(lib->fp);
- lib->fp = NULL;
- }
- return 0;
-}
-
-void rdl_perror(const char *apname, const char *filename)
-{
- fprintf(stderr,"%s:%s:%s\n",apname,filename,rdl_errors[rdl_error]);
-}
-
-
-
diff --git a/rdoff/v1/rdlib.h b/rdoff/v1/rdlib.h
deleted file mode 100644
index 94592ce..0000000
--- a/rdoff/v1/rdlib.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* rdlib.h Functions for manipulating librarys of RDOFF object files */
-
-
-struct librarynode {
- char * name;
- FILE * fp; /* initialised to NULL - always check*/
- int referenced; /* & open if required. Close afterwards */
- struct librarynode * next; /* if ! referenced. */
-};
-
-
-extern int rdl_error;
-
-int rdl_searchlib (struct librarynode * lib,
- const char * label, rdffile * f);
-void rdl_perror(const char *apname, const char *filename);
-
-
diff --git a/rdoff/v1/rdoff.c b/rdoff/v1/rdoff.c
deleted file mode 100644
index 96620ec..0000000
--- a/rdoff/v1/rdoff.c
+++ /dev/null
@@ -1,397 +0,0 @@
-/* rdoff.c library of routines for manipulating rdoff files
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- */
-
-/* TODO: The functions in this module assume they are running
- * on a little-endian machine. This should be fixed to
- * make it portable.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "rdoff.h"
-
-#define newstr(str) strcpy(malloc(strlen(str) + 1),str)
-#define newstrcat(s1,s2) strcat(strcpy(malloc(strlen(s1) + strlen(s2) + 1), \
- s1),s2)
-
-/* ========================================================================
- * Code for memory buffers (for delayed writing of header until we know
- * how long it is).
- * ======================================================================== */
-
-
-memorybuffer * newmembuf(){
- memorybuffer * t;
-
- t = malloc(sizeof(memorybuffer));
-
- t->length = 0;
- t->next = NULL;
- return t;
-}
-
-void membufwrite(memorybuffer *b, void *data, int bytes) {
- int16 w;
- long l;
-
- if (b->next) { /* memory buffer full - use next buffer */
- membufwrite(b->next,data,bytes);
- return;
- }
- if ((bytes < 0 && b->length - bytes > BUF_BLOCK_LEN)
- || (bytes > 0 && b->length + bytes > BUF_BLOCK_LEN)) {
-
- /* buffer full and no next allocated... allocate and initialise next
- * buffer */
-
- b->next = newmembuf();
- membufwrite(b->next,data,bytes);
- }
-
- switch(bytes) {
- case -4: /* convert to little-endian */
- l = * (long *) data ;
- b->buffer[b->length++] = l & 0xFF;
- l >>= 8 ;
- b->buffer[b->length++] = l & 0xFF;
- l >>= 8 ;
- b->buffer[b->length++] = l & 0xFF;
- l >>= 8 ;
- b->buffer[b->length++] = l & 0xFF;
- break;
-
- case -2:
- w = * (int16 *) data ;
- b->buffer[b->length++] = w & 0xFF;
- w >>= 8 ;
- b->buffer[b->length++] = w & 0xFF;
- break;
-
- default:
- while(bytes--) {
- b->buffer[b->length++] = *(* (unsigned char **) &data);
-
- (* (unsigned char **) &data)++ ;
- }
- break;
- }
-}
-
-void membufdump(memorybuffer *b,FILE *fp)
-{
- if (!b) return;
-
- fwrite (b->buffer, 1, b->length, fp);
-
- membufdump(b->next,fp);
-}
-
-int membuflength(memorybuffer *b)
-{
- if (!b) return 0;
- return b->length + membuflength(b->next);
-}
-
-void freemembuf(memorybuffer *b)
-{
- if (!b) return;
- freemembuf(b->next);
- free(b);
-}
-
-/* =========================================================================
- General purpose routines and variables used by the library functions
- ========================================================================= */
-
-long translatelong(long in) { /* translate from little endian to
- local representation */
- long r;
- unsigned char *i;
-
- i = (unsigned char *)&in;
- r = i[3];
- r = (r << 8) + i[2];
- r = (r << 8) + i[1];
- r = (r << 8) + *i;
-
- return r;
-}
-
-const char *RDOFFId = "RDOFF1"; /* written to the start of RDOFF files */
-
-const char *rdf_errors[7] = {
- "no error occurred","could not open file","invalid file format",
- "error reading file","unknown error","header not read",
- "out of memory"};
-
-int rdf_errno = 0;
-
-/* ========================================================================
- The library functions
- ======================================================================== */
-
-int rdfopen(rdffile *f, const char *name)
-{
- FILE * fp;
-
- fp = fopen(name,"rb");
- if (!fp) return rdf_errno = 1; /* error 1: file open error */
-
- return rdfopenhere(f,fp,NULL,"");
-}
-
-int rdfopenhere(rdffile *f, FILE *fp, int *refcount, char *name)
-{
- char buf[8];
- long initpos;
-
- if (translatelong(0x01020304) != 0x01020304)
- { /* fix this to be portable! */
- fputs("*** this program requires a little endian machine\n",stderr);
- fprintf(stderr,"01020304h = %08lxh\n",translatelong(0x01020304));
- exit(3);
- }
-
- f->fp = fp;
- initpos = ftell(fp);
-
- fread(buf,6,1,f->fp); /* read header */
- buf[6] = 0;
-
- if (strcmp(buf,RDOFFId)) {
- fclose(f->fp);
- return rdf_errno = 2; /* error 2: invalid file format */
- }
-
- if (fread(&f->header_len,1,4,f->fp) != 4) {
- fclose(f->fp);
- return rdf_errno = 3; /* error 3: file read error */
- }
-
- f->header_ofs = ftell(f->fp);
-
- if (fseek(f->fp,f->header_len,SEEK_CUR)) {
- fclose(f->fp);
- return rdf_errno = 2; /* seek past end of file...? */
- }
-
- if (fread(&f->code_len,1,4,f->fp) != 4) {
- fclose(f->fp);
- return rdf_errno = 3;
- }
-
- f->code_ofs = ftell(f->fp);
- if (fseek(f->fp,f->code_len,SEEK_CUR)) {
- fclose(f->fp);
- return rdf_errno = 2;
- }
-
- if (fread(&f->data_len,1,4,f->fp) != 4) {
- fclose(f->fp);
- return rdf_errno = 3;
- }
-
- f->data_ofs = ftell(f->fp);
- fseek(f->fp,initpos,SEEK_SET);
- f->header_loc = NULL;
-
- f->name = newstr(name);
- f->refcount = refcount;
- if (refcount) (*refcount)++;
- return 0;
-}
-
-int rdfclose(rdffile *f)
-{
- if (! f->refcount || ! *--f->refcount)
- fclose(f->fp);
- free(f->name);
-
- return 0;
-}
-
-void rdfperror(const char *app,const char *name)
-{
- fprintf(stderr,"%s:%s: %s\n",app,name,rdf_errors[rdf_errno]);
- if (rdf_errno == 1 || rdf_errno == 3)
- {
- perror(app);
- }
-
-}
-
-int rdfloadseg(rdffile *f,int segment,void *buffer)
-{
- long fpos;
- long slen;
-
- switch(segment) {
- case RDOFF_HEADER:
- fpos = f->header_ofs;
- slen = f->header_len;
- f->header_loc = (char *)buffer;
- f->header_fp = 0;
- break;
- case RDOFF_CODE:
- fpos = f->code_ofs;
- slen = f->code_len;
- break;
- case RDOFF_DATA:
- fpos = f->data_ofs;
- slen = f->data_len;
- break;
- default:
- fpos = 0;
- slen = 0;
- }
-
- if (fseek(f->fp,fpos,SEEK_SET))
- return rdf_errno = 4;
-
- if (fread(buffer,1,slen,f->fp) != slen)
- return rdf_errno = 3;
-
- return 0;
-}
-
-/* Macros for reading integers from header in memory */
-
-#define RI8(v) v = f->header_loc[f->header_fp++]
-#define RI16(v) { v = (f->header_loc[f->header_fp] + \
- (f->header_loc[f->header_fp+1] << 8)); \
- f->header_fp += 2; }
-
-#define RI32(v) { v = (f->header_loc[f->header_fp] + \
- (f->header_loc[f->header_fp+1] << 8) + \
- (f->header_loc[f->header_fp+2] << 16) + \
- (f->header_loc[f->header_fp+3] << 24)); \
- f->header_fp += 4; }
-
-#define RS(str,max) { for(i=0;i<max;i++){\
- RI8(str[i]); if (!str[i]) break;} str[i]=0; }
-
-rdfheaderrec *rdfgetheaderrec(rdffile *f)
-{
- static rdfheaderrec r;
- int i;
-
- if (!f->header_loc) {
- rdf_errno = 5;
- return NULL;
- }
-
- if (f->header_fp >= f->header_len) return 0;
-
- RI8(r.type);
- switch(r.type) {
- case 1: /* Relocation record */
- RI8(r.r.segment);
- RI32(r.r.offset);
- RI8(r.r.length);
- RI16(r.r.refseg);
- break;
-
- case 2: /* Imported symbol record */
- RI16(r.i.segment);
- RS(r.i.label,32);
- break;
-
- case 3: /* Exported symbol record */
- RI8(r.e.segment);
- RI32(r.e.offset);
- RS(r.e.label,32);
- break;
-
- case 4: /* DLL record */
- RS(r.d.libname,127);
- break;
-
- case 5: /* BSS reservation record */
- RI32(r.b.amount);
- break;
-
- default:
- rdf_errno = 2; /* invalid file */
- return NULL;
- }
- return &r;
-}
-
-void rdfheaderrewind(rdffile *f)
-{
- f->header_fp = 0;
-}
-
-
-rdf_headerbuf * rdfnewheader(void)
-{
- return newmembuf();
-}
-
-int rdfaddheader(rdf_headerbuf * h, rdfheaderrec * r)
-{
- switch (r->type)
- {
- case 1:
- membufwrite(h,&r->type,1);
- membufwrite(h,&r->r.segment,1);
- membufwrite(h,&r->r.offset,-4);
- membufwrite(h,&r->r.length,1);
- membufwrite(h,&r->r.refseg,-2); /* 9 bytes written */
- break;
-
- case 2: /* import */
- membufwrite(h,&r->type,1);
- membufwrite(h,&r->i.segment,-2);
- membufwrite(h,&r->i.label,strlen(r->i.label) + 1);
- break ;
-
- case 3: /* export */
- membufwrite(h,&r->type,1);
- membufwrite(h,&r->e.segment,1);
- membufwrite(h,&r->e.offset,-4);
- membufwrite(h,&r->e.label,strlen(r->e.label) + 1);
- break ;
-
- case 4: /* DLL */
- membufwrite(h,&r->type,1);
- membufwrite(h,&r->d.libname,strlen(r->d.libname) + 1);
- break ;
-
- case 5: /* BSS */
- membufwrite(h,&r->type,1);
- membufwrite(h,&r->b.amount,-4);
- break ;
-
- default:
- return (rdf_errno = 2);
- }
- return 0;
-}
-
-int rdfwriteheader(FILE * fp, rdf_headerbuf * h)
-{
- long l;
-
- fwrite (RDOFFId, 1, strlen(RDOFFId), fp) ;
-
- l = translatelong ( membuflength (h) );
- fwrite (&l, 4, 1, fp);
-
- membufdump(h, fp);
-
- return 0; /* no error handling in here... CHANGE THIS! */
-}
-
-void rdfdoneheader(rdf_headerbuf * h)
-{
- freemembuf(h);
-}
diff --git a/rdoff/v1/rdoff.h b/rdoff/v1/rdoff.h
deleted file mode 100644
index 0f74b80..0000000
--- a/rdoff/v1/rdoff.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* rdoff.h RDOFF Object File manipulation routines header file
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- */
-
-#ifndef _RDOFF_H
-#define _RDOFF_H "RDOFF1 support routines v0.1"
-
-typedef short int16; /* not sure if this will be required to be altered
- at all... best to typedef it just in case */
-
-/* the records that can be found in the RDOFF header */
-
-struct RelocRec {
- char type; /* must be 1 */
- char segment; /* only 0 for code, or 1 for data supported,
- but add 64 for relative refs (ie do not require
- reloc @ loadtime, only linkage) */
- long offset; /* from start of segment in which reference is loc'd */
- char length; /* 1 2 or 4 bytes */
- int16 refseg; /* segment to which reference refers to */
-};
-
-struct ImportRec {
- char type; /* must be 2 */
- int16 segment; /* segment number allocated to the label for reloc
- records - label is assumed to be at offset zero
- in this segment, so linker must fix up with offset
- of segment and of offset within segment */
- char label[33]; /* zero terminated... should be written to file until
- the zero, but not after it - max len = 32 chars */
-};
-
-struct ExportRec {
- char type; /* must be 3 */
- char segment; /* segment referred to (0/1) */
- long offset; /* offset within segment */
- char label[33]; /* zero terminated as above. max len = 32 chars */
-};
-
-struct DLLRec {
- char type; /* must be 4 */
- char libname[128]; /* name of library to link with at load time */
-};
-
-struct BSSRec {
- char type; /* must be 5 */
- long amount; /* number of bytes BSS to reserve */
-};
-
-typedef union RDFHeaderRec {
- char type; /* invariant throughout all below */
- struct RelocRec r; /* type == 1 */
- struct ImportRec i; /* type == 2 */
- struct ExportRec e; /* type == 3 */
- struct DLLRec d; /* type == 4 */
- struct BSSRec b; /* type == 5 */
-} rdfheaderrec;
-
-typedef struct RDFFileInfo {
- FILE *fp; /* file descriptor; must be open to use this struct */
- int rdoff_ver; /* should be 1; any higher => not guaranteed to work */
- long header_len;
- long code_len;
- long data_len;
- long header_ofs;
- long code_ofs;
- long data_ofs;
- char *header_loc; /* keep location of header */
- long header_fp; /* current location within header for reading */
- char *name; /* name of module in libraries */
- int *refcount; /* pointer to reference count on file, or NULL */
-} rdffile;
-
-#define BUF_BLOCK_LEN 4088 /* selected to match page size (4096)
- * on 80x86 machines for efficiency */
-typedef struct memorybuffer {
- int length;
- char buffer[BUF_BLOCK_LEN];
- struct memorybuffer *next;
-} memorybuffer;
-
-typedef memorybuffer rdf_headerbuf;
-
-/* segments used by RDOFF, understood by rdoffloadseg */
-#define RDOFF_CODE 0
-#define RDOFF_DATA 1
-#define RDOFF_HEADER -1
-/* mask for 'segment' in relocation records to find if relative relocation */
-#define RDOFF_RELATIVEMASK 64
-/* mask to find actual segment value in relocation records */
-#define RDOFF_SEGMENTMASK 63
-
-extern int rdf_errno;
-
-/* RDOFF file manipulation functions */
-int rdfopen(rdffile *f,const char *name);
-int rdfopenhere(rdffile *f, FILE *fp, int *refcount, char *name);
-int rdfclose(rdffile *f);
-int rdfloadseg(rdffile *f,int segment,void *buffer);
-rdfheaderrec *rdfgetheaderrec(rdffile *f); /* returns static storage */
-void rdfheaderrewind(rdffile *f); /* back to start of header */
-void rdfperror(const char *app,const char *name);
-
-/* functions to write a new RDOFF header to a file -
- use rdfnewheader to allocate a header, rdfaddheader to add records to it,
- rdfwriteheader to write 'RDOFF1', length of header, and the header itself
- to a file, and then rdfdoneheader to dispose of the header */
-
-rdf_headerbuf *rdfnewheader(void);
-int rdfaddheader(rdf_headerbuf *h,rdfheaderrec *r);
-int rdfwriteheader(FILE *fp,rdf_headerbuf *h);
-void rdfdoneheader(rdf_headerbuf *h);
-
-#endif /* _RDOFF_H */
diff --git a/rdoff/v1/rdoff.txt b/rdoff/v1/rdoff.txt
deleted file mode 100644
index 7ee86d6..0000000
--- a/rdoff/v1/rdoff.txt
+++ /dev/null
@@ -1,114 +0,0 @@
-The RDOFF version 1.1 Object File Format
-========================================
-
-I seem to keep writing this document... I don't know what keeps
-happening to it. Anyway, this one will hopefully stay around for a
-while.
-
-RDOFF is a relocatable object file format whose design goals were
-mainly to keep it simple, so that an RDOFF object can be loaded and
-executed by a very small piece of code (primarily so that it can be
-used by the microkernel of an operating system to store system
-modules, which can then go on to load and execute more complex object
-files, eg ELF, if so desired), yet still be able to be cope with
-everything required by the operating system; linkage of multiple
-modules together (possibly with automatic loading of new libraries
-that are referred to by the object) at load time, allowing static or
-dynamic linking as required by the application.
-
-The overall format of the file is summarised in this table:
-
-Length (bytes) Description
- 6 Contains the string 'RDOFF1' (little-endian targets),
- or 'RDOFF' followed by the single byte 0x01
- (big-endian targets).
- 4 Length of the header section
- ? Header section (see above for length)
- 4 Length of code section (.text)
- ? Code section
- 4 Length of data section (.data)
- ? Data section
-
-Segments are referred to as numbers. Imported labels are implicitly
-at offset zero from a segment; each is assigned a segment number when
-it is imported. Segments in the object file itself are numbered:
- 0 - text segemnt
- 1 - data segment
- 2 - bss segment
-
-The header consists of a sequence of records, each of which is
-preceded by a byte to represent its type.
-
-These records are one of the following types:
-
-1: Relocation Record
---------------------
-
- This record points to an address that will need either
- relocation or linkage to an external segment when the object
- is loaded or linked.
-
- Length Description
- 1 Type identifier (must be 1)
- 1 Segment number (0 or 1) plus 64 if the reference is
- relative (and thus does not require relocation with
- the base of the code, only by the difference between
- the start of this segment, and the segment referred to
- (see below)
- 4 Offset from start of segment of item requiring reloc.
- 1 Length of item (1, 2, or 4 bytes...)
- 2 Segment number to which reference is made.
-
-2: Import Symbol Record
------------------------
-
- This record defines a segment to start at the location of a
- named symbol; this symbol may need to be fetched from an
- external library.
-
- Length Description
- 1 Type identifier (must be 2)
- 2 Segment number to allocate
- ? String containing label (null terminated, max length =
- 32 chars)
-
-3: Export Symbol Record
------------------------
-
- This record defines a symbol, to which external modules can
- link using the above record type.
-
- Length Description
- 1 Type identifier (must be 3)
- 1 Segment containing symbol (0,1 or 2)
- 4 Offset of symbol within segment
- ? String containing label (null terminated, max length =
- 32 chars)
-
-4: Import Library Record
-------------------------
-
- This record tells the loader that an extra library should be
- loaded and linked to the module at either load- or run-time
- (load time is easier, run-time is good, though...)
-
- Length Description
- 1 Type identifier (must be 4)
- ? Name of library (null terminated string, max len = 128)
-
-5: Reserve BSS Bytes
---------------------
-
- This record tells the loader how much memory to reserve after
- the executable code loaded from the object file for the BSS
- segment (referred to as segment number 2).
- A loader can safely assume that there will only be one of
- these records per module, but the linker probably cannot...
- NASM will only output one, but other utilities may be written
- that do, and future versions of NASM may output more than one.
-
- Length Description
- 1 Type identifier (must be 5)
- 4 Number of bytes to reserve
-
-
diff --git a/rdoff/v1/rdx.c b/rdoff/v1/rdx.c
deleted file mode 100644
index 28ffc42..0000000
--- a/rdoff/v1/rdx.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* rdx.c RDOFF Object File loader program
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- */
-
-/* note: most of the actual work of this program is done by the modules
- "rdfload.c", which loads and relocates the object file, and by "rdoff.c",
- which contains general purpose routines to manipulate RDOFF object
- files. You can use these files in your own program to load RDOFF objects
- and execute the code in them in a similar way to what is shown here. */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "rdfload.h"
-#include "rdoff.h"
-#include "symtab.h"
-
-typedef int (*main_fn) (int,char**); /* Main function prototype */
-
-int main(int argc, char **argv)
-{
- rdfmodule * m;
- main_fn code;
- symtabEnt * s;
-
- if (argc < 2)
- {
- puts("usage: rdf <rdoff-executable> [params]\n");
- exit(255);
- }
-
- m = rdfload(argv[1]);
-
- if (! m)
- {
- rdfperror("rdf",argv[1]);
- exit(255);
- }
-
- rdf_relocate(m); /* in this instance, the default relocation
- values will work fine, but they may need changing
- in other cases... */
-
- s = symtabFind(m->symtab, "_main");
- if (! s)
- {
- fprintf(stderr,"rdx: could not find symbol '_main' in '%s'\n",argv[1]);
- exit(255);
- }
-
- code = (main_fn) s->offset;
-
- argv++, argc--; /* remove 'rdx' from command line */
-
- return code(argc,argv); /* execute */
-}
-
diff --git a/rdoff/v1/symtab.c b/rdoff/v1/symtab.c
deleted file mode 100644
index 3fc363e..0000000
--- a/rdoff/v1/symtab.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* symtab.c Routines to maintain and manipulate a symbol table
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- */
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "symtab.h"
-
-/* TODO: Implement a hash table, not this stupid implementation which
- is too slow to be of practical use */
-
-/* Private data types */
-
-typedef struct tagSymtab {
- symtabEnt ent;
- struct tagSymtab * next;
-} symtabList;
-
-typedef symtabList * _symtab;
-
-void *symtabNew(void)
-{
- void *p = malloc(sizeof(_symtab));
- if (p == NULL) {
- fprintf(stderr,"symtab: out of memory\n");
- exit(3);
- }
- *(_symtab *)p = NULL;
-
- return p;
-}
-
-void symtabDone(void *symtab)
-{
- /* DO SOMETHING HERE! */
-}
-
-void symtabInsert(void *symtab,symtabEnt *ent)
-{
- symtabList *l = malloc(sizeof(symtabList));
-
- if (l == NULL) {
- fprintf(stderr,"symtab: out of memory\n");
- exit(3);
- }
-
- l->ent = *ent;
- l->next = *(_symtab *)symtab;
- *(_symtab *)symtab = l;
-}
-
-symtabEnt *symtabFind(void *symtab,char *name)
-{
- symtabList *l = *(_symtab *)symtab;
-
- while (l) {
- if (!strcmp(l->ent.name,name)) {
- return &(l->ent);
- }
- l = l->next;
- }
- return NULL;
-}
-
-void symtabDump(void *symtab,FILE *of)
-{
- symtabList *l = *(_symtab *)symtab;
-
- while(l) {
- fprintf(of,"%32s %s:%08lx (%ld)\n",l->ent.name,
- l->ent.segment ? "data" : "code" ,
- l->ent.offset, l->ent.flags);
- l = l->next;
- }
-}
-
diff --git a/rdoff/v1/symtab.h b/rdoff/v1/symtab.h
deleted file mode 100644
index 5780d44..0000000
--- a/rdoff/v1/symtab.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* symtab.h Header file for symbol table manipulation routines
- *
- * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
- * Julian Hall. All rights reserved. The software is
- * redistributable under the licence given in the file "Licence"
- * distributed in the NASM archive.
- */
-
-typedef struct {
- char *name;
- long segment;
- long offset;
- long flags;
-} symtabEnt;
-
-void *symtabNew(void);
-void symtabDone(void *symtab);
-void symtabInsert(void *symtab,symtabEnt *ent);
-symtabEnt *symtabFind(void *symtab,char *name);
-void symtabDump(void *symtab,FILE *of);
-
-
diff --git a/scitech.txt b/scitech.txt
deleted file mode 100644
index 049694f..0000000
--- a/scitech.txt
+++ /dev/null
@@ -1,213 +0,0 @@
-
- The Netwide Assembler: NASM
- ===========================
-
---------------------------------------------------------------------------------
- SciTech MGL Modifications
---------------------------------------------------------------------------------
-
-All changes can be compiled in and out using the TASM_COMPAT macros,
-and when compiled without TASM_COMPAT defined we get the exact same
-binary as the unmodified 0.98 sources.
-
-standard.mac:
-macros.c:
- . Added macros to ignore TASM directives before first include
-
-nasm.h:
- . Added extern declaration for tasm_compatible_mode
-
-nasm.c:
- . Added global variable tasm_compatible_mode
- . Added command line switch for TASM compatible mode (-t)
- . Changed version command line to reflect when compiled with TASM additions
- . Added response file processing to allow all arguments on a single
- line (response file is @resp rather than -@resp for NASM format).
-
-labels.c:
- . Changes islocal() macro to support TASM style @@local labels.
- . Added islocalchar() macro to support TASM style @@local labels.
-
-parser.c:
- . Added support for TASM style memory references (ie: mov [DWORD eax],10
- rather than the NASM style mov DWORD [eax],10).
-
-preproc.c:
- . Added new directives, %arg, %local, %stacksize to directives table
- . Added support for TASM style directives without a leading % symbol.
-
---------------------------------------------------------------------------------
- Integrated a block of changes from Andrew Zabolotny <bit@eltech.ru>:
---------------------------------------------------------------------------------
-
--*- A new keyword %xdefine and its case-insensitive counterpart %ixdefine.
- They work almost the same way as %define and %idefine but expand
- the definition immediately, not on the invocation. Something like a cross
- between %define and %assign. The "x" suffix stands for "eXpand", so
- "xdefine" can be deciphered as "expand-and-define". Thus you can do
- things like this:
-
- %assign ofs 0
-
- %macro arg 1
- %xdefine %1 dword [esp+ofs]
- %assign ofs ofs+4
- %endmacro
-
--*- Changed the place where the expansion of %$name macros are expanded.
- Now they are converted into ..@ctxnum.name form when detokenizing, so
- there are no quirks as before when using %$name arguments to macros,
- in macros etc. For example:
-
- %macro abc 1
- %define %1 hello
- %endm
-
- abc %$here
- %$here
-
- Now last line will be expanded into "hello" as expected. This also allows
- for lots of goodies, a good example are extended "proc" macros included
- in this archive.
-
--*- Added a check for "cstk" in smacro_defined() before calling get_ctx() -
- this allows for things like:
-
- %ifdef %$abc
- %endif
-
- to work without warnings even in no context.
-
--*- Added a check for "cstk" in %if*ctx and %elif*ctx directives -
- this allows to use %ifctx without excessive warnings. If there is
- no active context, %ifctx goes through "false" branch.
-
--*- Removed "user error: " prefix with %error directive: it just clobbers the
- output and has absolutely no functionality. Besides, this allows to write
- macros that does not differ from built-in functions in any way.
-
--*- Added expansion of string that is output by %error directive. Now you
- can do things like:
-
- %define hello(x) Hello, x!
-
- %define %$name andy
- %error "hello(%$name)"
-
- Same happened with %include directive.
-
--*- Now all directives that expect an identifier will try to expand and
- concatenate everything without whitespaces in between before usage.
- For example, with "unfixed" nasm the commands
-
- %define %$abc hello
- %define __%$abc goodbye
- __%$abc
-
- would produce "incorrect" output: last line will expand to
-
- hello goodbyehello
-
- Not quite what you expected, eh? :-) The answer is that preprocessor
- treats the %define construct as if it would be
-
- %define __ %$abc goodbye
-
- (note the white space between __ and %$abc). After my "fix" it
- will "correctly" expand into
-
- goodbye
-
- as expected. Note that I use quotes around words "correct", "incorrect"
- etc because this is rather a feature not a bug; however current behaviour
- is more logical (and allows more advanced macro usage :-).
-
- Same change was applied to:
- %push,%macro,%imacro,%define,%idefine,%xdefine,%ixdefine,
- %assign,%iassign,%undef
-
--*- A new directive [WARNING {+|-}warning-id] have been added. It works only
- if the assembly phase is enabled (i.e. it doesn't work with nasm -e).
-
--*- A new warning type: macro-selfref. By default this warning is disabled;
- when enabled NASM warns when a macro self-references itself; for example
- the following source:
-
- [WARNING macro-selfref]
-
- %macro push 1-*
- %rep %0
- push %1
- %rotate 1
- %endrep
- %endmacro
-
- push eax,ebx,ecx
-
- will produce a warning, but if we remove the first line we won't see it
- anymore (which is The Right Thing To Do {tm} IMHO since C preprocessor
- eats such constructs without warnings at all).
-
--*- Added a "error" routine to preprocessor which always will set ERR_PASS1
- bit in severity_code. This removes annoying repeated errors on first
- and second passes from preprocessor.
-
--*- Added the %+ operator in single-line macros for concatenating two
- identifiers. Usage example:
-
- %define _myfunc _otherfunc
- %define cextern(x) _ %+ x
- cextern (myfunc)
-
- After first expansion, third line will become "_myfunc". After this
- expansion is performed again so it becomes "_otherunc".
-
--*- Now if preprocessor is in a non-emmitting state, no warning or error
- will be emmitted. Example:
-
- %if 1
- mov eax,ebx
- %else
- put anything you want between these two brackets,
- even macro-parameter references %1 or local labels %$zz
- or macro-local labels %%zz - no warning will be emmitted.
- %endif
-
--*- Context-local variables on expansion as a last resort are looked up
- in outer contexts. For example, the following piece:
-
- %push outer
- %define %$a [esp]
-
- %push inner
- %$a
- %pop
- %pop
-
- will expand correctly the fourth line to [esp]; if we'll define another
- %$a inside the "inner" context, it will take precedence over outer
- definition. However, this modification has been applied only to
- expand_smacro and not to smacro_define: as a consequence expansion
- looks in outer contexts, but %ifdef won't look in outer contexts.
-
- This behaviour is needed because we don't want nested contexts to
- act on already defined local macros. Example:
-
- %define %$arg1 [esp+4]
- test eax,eax
- if nz
- mov eax,%$arg1
- endif
-
- In this example the "if" mmacro enters into the "if" context, so %$arg1
- is not valid anymore inside "if". Of course it could be worked around
- by using explicitely %$$arg1 but this is ugly IMHO.
-
--*- Fixed memory leak in %undef. The origline wasn't freed before
- exiting on success.
-
--*- Fixed trap in preprocessor when line expanded to empty set of tokens.
- This happens, for example, in the following case:
-
- #define SOMETHING
- SOMETHING