home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / PROGRAM / ASM / AS80_107 / AS80.MAN < prev    next >
Text File  |  1994-11-22  |  25KB  |  682 lines

  1. Kingswood Software Development Tools                                 AS80
  2. -------------------------------------------------------------------------
  3.  
  4. NAME
  5.    as80 - assembler for 8080, 8085 and Z80 microprocessors.
  6.  
  7.  
  8. SYNOPSIS
  9.    as80 [-gchlnopqstvwxz] file
  10.  
  11.  
  12. DESCRIPTION
  13.    This documentation is for as80 [1.07].
  14.    Copyright 1990-1994, Frank A. Vorstenbosch, Kingswood Software.
  15.  
  16.    AS80 is an assembler for the Intel 8080/8085 and Zilog Z80
  17.    microprocessors.  It reads input from an ASCII text file, assembles
  18.    this into memory, and then writes a listing and a binary or hex file.
  19.  
  20.    AS80 is case sensitive, not only does it differentiate between the
  21.    labels XYZ and xyz, but it also requires all (pseudo) instruction and
  22.    register names to be lower case.  This way, the listing is the most
  23.    readable.  Option -i can be used to make the assembler case insensitive.
  24.    Alternatively, the included TOLOWER program can be used to convert
  25.    sources to lower case.
  26.  
  27.  
  28. OPTIONS
  29.    As80 recognizes the following options:
  30.  
  31.       -c   Show number of cycles per instruction in listing.  This
  32.            decreases the number of columns available for listing by 5.
  33.            The number of cycles is printed between brackets [ and ].
  34.  
  35.       -g   Generate source-level debug information file.  This file
  36.            can then be used in in-system debugging or a software
  37.            simulator.
  38.  
  39.       -h<lines>
  40.            Specify height of page for listing.  This option determines
  41.            the number of lines per printed page.  Each page has a header
  42.            and is terminated by a form-feed character.  The special
  43.            case -h0 indicates an infinite page length.  In this case,
  44.            page breaks are only inserted between the two passes and
  45.            the symbol table (if present).
  46.  
  47.       -i   Ignore case in opcodes.  In this way, the assembler does not
  48.            differentiate between 'add' and 'ADD', for example.  Labels
  49.            are still case sensitive.
  50.  
  51.       -l   Generate pass 2 listing.
  52.  
  53.       -l<filename>
  54.             Listing file name.  The listing file is used for pass 1 and
  55.             pass 2 listing, for the symbol table (printed between the
  56.             two passes), and some statistics.  When neither -p nor -t
  57.             is specified, and -l<filename> is given, then the assembler
  58.             automatically generates a pass 2 listing.  When -p or -t is
  59.             specified, an additional -l should be given is a pass 2
  60.             listing is required.  The filename - can be used to direct
  61.             the listing to standard output.
  62.  
  63.       -l   Generate pass 2 listing.
  64.  
  65.       -n   Disable optimizations.  When this option is specified no
  66.            optimizations will be done, even when the OPT pseudo-
  67.            instruction is used in the source code.
  68.  
  69.       -o<filename>
  70.            Specify binary or s-records output file name.  The assembler
  71.            automatically adds ".bin" for binary output or ".s19" for
  72.            s-records output when no extension is given.
  73.  
  74.       -p   Generate pass 1 listing.  This may be used to examine any
  75.            optimizations/bugs generated in pass 2.
  76.  
  77.       -q   Quiet mode.  No running line counter is displayed on standard
  78.            error output.
  79.  
  80.       -s   Write s-records instead of binary file.  The s-records file
  81.            contains data for (only) the used memory; the binary file
  82.            begins at the lowest used address, and continues up to the
  83.            highest used address; filling unused memory between these
  84.            two addresses with either $ff or $00.
  85.  
  86.       -s2  Write intel-hex file instead of binary file.  The intel-hex
  87.            file contains data for (only) the used memory.
  88.  
  89.       -t   Generate symbol table.  The symbol table is listed between
  90.            passes one and two, displaying the name, hexadecimal and
  91.            decimal value of each label, using 4-digit hexadecimal
  92.            numbers where possible, otherwise 8-digit numbers.  The
  93.            decimal value is followed by an asterisk if the label is
  94.            redefinable (defined using SET instead of EQU).
  95.  
  96.       -v   Verbose mode.  More information is displayed on standard
  97.            output.
  98.  
  99.       -w<width>
  100.            Specify column width.  Normally, the listing is printed using
  101.            79 columns for output to a 80-column screen or printer.  If
  102.            the -w option is given without a number following it, then
  103.            the listing will be 131 columns wide, otherwise it will be
  104.            the number of colulmns specified (between 60 and 200).
  105.  
  106.       -x1  Use 8085 extensions.  The 8085 CPU has two additional 
  107.            instructions and different cycle counts, but is otherwise
  108.            software compatible to the 8080.  When this option is not 
  109.            specified the assembler rejects the RIM and SIM instructions.
  110.  
  111.       -x   or
  112.       -x2
  113.            Use Z80 extensions.  The Z80 has many additional instructions
  114.            and addressing modes, but is otherwise software compatible to 
  115.            the 8080.  When this option is not specified the assembler 
  116.            rejects all Z80 new instructions and addressing modes.
  117.  
  118.       -x3  Use Z80 extensions and index register byte instructions.
  119.            The IX and IY registers were originally intended to be
  120.            split in IXH/IXL and IYH/IYL register pairs.  For some
  121.            reason (bug in original mask set?) these instructions were
  122.            not included by Zilog in the programming manuals, but
  123.            they do work on all CPUs I've seen.  Your mileage may vary.
  124.            Note that these extensions do NOT work on the Z180/181 and
  125.            H64180, but they DO (and are documented) on the Z280.
  126.  
  127.       -z   Fill unused memory with zeros.  Normally when a binary file
  128.            is generated, unused bytes between the lowest and highest
  129.            used addresses are filled with $ff, the unprogrammed state
  130.            of EPROMs.  If this is not wanted, the -z option can be used
  131.            to initialize this memory to $00.  With s-records, unused
  132.            memory is not output to the file, and this option forces the
  133.            creation of an S9 (start address) record instead, even if no 
  134.            start address is specified in the file with the END pseudo-
  135.            instruction.
  136.  
  137.    Commandline options can be catenated, but no other option can follow
  138.    one that may have a parameter.  Thus:
  139.       -tlfile
  140.    is correct (specifying symbol table and pass 2 listing), but
  141.       -h5t
  142.    is not.
  143.  
  144.    It is possible to discard any of the the output files by specifying
  145.    the name 'nul'.
  146.  
  147.  
  148. EXPRESSIONS
  149.  
  150.    The assembler recognizes most C-language expressions.  The operators
  151.    are listed here in order of precedence, highest first:
  152.  
  153.        ()            braces to group subexpressions
  154.        * $           current location counter
  155.        unary + - ! ~ unary + (no-operation), negation, logical NOT,
  156.                      binary NOT
  157.        * / %         multiplication, division, modulo
  158.        + -           addition, subtraction
  159.        << >>         shift left, shift right
  160.        < > <= >=     comparison for greater/less than
  161.        = !=          comparison for equality (== can be used for =)
  162.        &             binary AND
  163.        ^             binary XOR
  164.        |             binary OR
  165.  
  166.    The logical NOT (!) evaluates to zero if the parameter is nonzero,
  167.    and vice versa.  The binary NOT (~) complements all the bits in its
  168.    parameter.
  169.  
  170.    Note: the asterisk is both used as the multiplication operator, and
  171.    as symbol for the current location.  The assembler determines from
  172.    the context which is which. Thus:
  173.  
  174.        5**
  175.  
  176.    is a valid expression, evaluating to five times the current location
  177.    counter, and:
  178.  
  179.        2+*/2
  180.  
  181.    is too, evaluating to the current location counter divided by two, to
  182.    which two is added.  In the same way, the % sign is both used as the
  183.    modulo operator and the prefix for binary numbers.
  184.  
  185.    Numbers can be specified in any number base between 2 and 36.
  186.    Decimal numbers can be used without a prefix, hexadecimal numbers
  187.    can be prefixed by $, octal numbers by @, and binary numbers by %.
  188.    Other number bases can be used by using the following format:  
  189.       <base>#<number>, 
  190.    where the base is the number base to use (must be specified in 
  191.    decimal), and number is the value.  Thus:
  192.       1000    - decimal number, value 10*10*10=1000
  193.       %1000   - binary number, value 2*2*2=8
  194.       @1000   - octal number, value 8*8*8=512
  195.       $1000   - hexadecimal number, value 16*16*16=4096
  196.       #1000   - hexadecimal number, value 16*16*16=4096
  197.       2#1000  - binary number, value 2*2*2=8
  198.       4#1000  - base-4 number, value 4*4*4=64
  199.       7#1000  - base-7 number, value 7*7*7=343
  200.       36#1000 - base-36 number, value 36*36*36=444528
  201.    For number bases greater than 10, additional digits are represented
  202.    by letters, starting from A.  Both lower and upper case letters can
  203.    be used.
  204.       11#aa = 120
  205.       16#ff = 255
  206.       25#oo = 624
  207.       36#zz = 1295
  208.  
  209.  
  210. PSEUDO-INSTRUCTIONS
  211.  
  212.    align <expression>
  213.  
  214.       Align fills zero or more bytes with zeros until the new address
  215.       modulo <expression> equals zero.  If the expression is not present,
  216.       align fills zero or one bytes with zeros until the new address
  217.       is even.
  218.  
  219.       Example 1:
  220.                       align  256             ; continue assembly on the
  221.                                              ; next 256-byte page
  222.  
  223.       Example 2:
  224.                       align                  ; make sure table begins
  225.       Table           dw     1,2,3           ; on an even address
  226.  
  227.  
  228.  
  229.    bss
  230.  
  231.       Put all following data in the bss segment.  Only data pseudo-instructions 
  232.       can be used in the bss segment, and these only increment the location 
  233.       counter.  It is up to the programmer to initialize the bss segment.  The 
  234.       bss segment is especially meaningful in a ROM based system where
  235.       variables must be placed in RAM, and RAM is not automatically initialized.
  236.  
  237.       The assembler internally maintains three separate location counters,
  238.       one for the code segment, one for the data segment and one for the
  239.       uninitialized data segment.  The user is responsible for not overlapping
  240.       the segments by setting appropriate origins.  The code, data and bss
  241.       pseudo-instructions can be used to interleave code and data in the source
  242.       listing, while separating the three in the generated program.  The
  243.       assembler starts with the code segment if none is specified.
  244.  
  245.       Example:
  246.                      code
  247.                      org    $f000           ; Assuming 4 kbyte code ROM
  248.                      data                   ; with 2 kbyte program and
  249.                      org    $f800           ; 2 kbyte initialized data
  250.                      bss
  251.                      org    0               ; bss segment is in RAM
  252.  
  253.       Buffer         ds     100
  254.  
  255.                      code
  256.       Begin          ld     hl,Table
  257.                      ld     de,Buffer
  258.                      ld     bc,3
  259.                      ldir
  260.                      .
  261.                      .
  262.                      .
  263.  
  264.                      data
  265.       Table          db     1,2,3
  266.  
  267.                      code
  268.       MyFunc         ld     ix,Table
  269.                      .
  270.                      .
  271.  
  272.    code
  273.  
  274.       Put all following assembled instructions and data in the code segment.
  275.       See BSS.
  276.  
  277.  
  278.    data
  279.  
  280.       Put all following assembled instructions and data in the data segment.
  281.       See BSS.
  282.  
  283.  
  284.    db <bytelist>
  285.  
  286.       Define bytes.  The bytes may be specified as expressions or strings,
  287.       and are placed in the current (code or data) segment.  This pseudo
  288.       instruction is similar to the Zilog-defined defb and defm pseudo-
  289.       instructions.
  290.  
  291.       Example:
  292.       Message        db     7,"Error",13,10,0
  293.  
  294.  
  295.    defb <bytelist>
  296.  
  297.       Define bytes.  The bytes may be specified only as expressions, 
  298.       and are placed in the current (code or data) segment.  This 
  299.       pseudo-instruction is similar to the db pseudo-instruction.
  300.  
  301.       Example:
  302.       Message        defb   7
  303.                      defm   "Error"
  304.                      defb   13,10,0
  305.  
  306.  
  307.    defm <string>
  308.  
  309.       Define message.  The bytes may be specified only as a string, and
  310.       are placed in the current (code or data) segment.  This pseudo-
  311.       instruction is similar to the db pseudo-instruction.
  312.  
  313.  
  314.    ds <expression>
  315.    defs <expression>
  316.  
  317.       Define zero or more bytes empty space.  The specified number of
  318.       bytes are filled with zeros.  This pseudo-instruction is identical
  319.       to the Zilog-defined pseudo-instruction defs.
  320.  
  321.       Example:
  322.                      ds     100             ; reserve 100 bytes here
  323.  
  324.  
  325.    dw <wordlist>
  326.    defw <wordlist>
  327.  
  328.       Define words.  The words are placed in the current (code or data)
  329.       segment.  This pseudo-instruction is identical to the Zilog-
  330.       defined defw pseudo-instruction.
  331.  
  332.       Example:
  333.                      ld     a,Function      ; number of function
  334.                      ld     hl,JumpTable
  335.                      add    a,a
  336.                      add    a,l
  337.                      ld     l,a
  338.                      adc    a,h
  339.                      sub    l
  340.                      ld     h,a
  341.                      jp     (hl)            ; jump to function
  342.  
  343.       JumpTable      dw     Function0
  344.                      dw     Function1
  345.                      dw     Function2
  346.  
  347.  
  348.    else
  349.  
  350.       The else pseudo-instruction can be used for if-then-else
  351.       constructions. It must be placed between an if and an endif
  352.       instruction.  For an example, see the if pseudo-instruction.
  353.  
  354.  
  355.    end <expression>
  356.  
  357.       The end pseudo-instruction is optional, and need not be used.  If
  358.       it is used, its optional operand specifies the staring address of
  359.       the program.  This address is displayed when the program is
  360.       assembled, and is also placed in the s-record output file.
  361.  
  362.       Example:
  363.                      end    Start
  364.  
  365.    endif
  366.  
  367.       The endif pseudo-instruction must be used to close an if-endif
  368.       or if-else-endif construction.  For an example, see the if
  369.       pseudo-instruction.
  370.  
  371.  
  372.    <label> equ <expression>
  373.  
  374.       The equ (equate) pseudo-instruction sets the specified label to
  375.       the value of the expression.  The label may not already exist.
  376.       Some programmers choose to use only upper-case identifiers for
  377.       labels defined in this way to differentiate them from addresses.
  378.  
  379.       Example:
  380.       ESCAPE          equ    27
  381.  
  382.  
  383.    if <expression>
  384.  
  385.       The if pseudo-instruction can be used in conjunction with the
  386.       endif and possibly the else pseudo-instructions to selectively
  387.       enable and disable pieces of code in the source.  If the expression
  388.       given evaluates to zero, then the following code up to the matching
  389.       else or endif is not included in the assembly.  If the expression
  390.       is nonzero, then the following code is included, but any code
  391.       between the matching else and endif is not.
  392.       The original Zilog assemblers called this pseudo-instruction COND.
  393.  
  394.       Example:
  395.                      if COUNT=2 | COUNT=4
  396.                      add     a,a            ; shift left for counts
  397.                      if COUNT=4             ; of 2 and 4
  398.                      add     a,a
  399.                      endif
  400.                      else
  401.                      ld      b,COUNT        ; otherwise use slow multiply
  402.                      call    Multiply
  403.                      endif
  404.  
  405.  
  406.    include <string>
  407.  
  408.       The named file is included in the assembly at this point.  After
  409.       it has been read, assembly continues with the next line of the
  410.       current file. Include files may be nested.
  411.  
  412.       Example:
  413.                      include "defines.i"
  414.  
  415.  
  416.    list
  417.  
  418.       Enable generation of the listing in the list-file.  If the listing
  419.       has been disabled twice, it must be enabled twice before it is
  420.       generated.  When no -p or -l option has been specified on the
  421.       command line, this pseudo-instruction has no effect.
  422.  
  423.  
  424.    nolist
  425.  
  426.       Disable generation of the listing in the list-file.
  427.  
  428.  
  429.    noopt
  430.  
  431.       Disable optimizations.  If the -n option has been specified on the
  432.       command line, this pseudo-instruction has no effect.
  433.  
  434.  
  435.    nop <expression>
  436.  
  437.       No operation.  When the optional expression is not present, this
  438.       is simply the nop instruction of the processor.  When the
  439.       expression is present, the specified number of nop instructions
  440.       are inserted.
  441.  
  442.       Example:
  443.                      nop    10
  444.  
  445.  
  446.    opt
  447.  
  448.       Enable optimizations.  If the -n option has been specified on the
  449.       command line, this pseudo-instruction has no effect.
  450.       When optimization is enabled, the assembler tries to use the
  451.       shortest and fastest instructions possible which have the effect
  452.       the user wants.  It may replace any extended-address instruction
  453.       by direct-address instructions (provided the direct pseudo-
  454.       instruction has been used).  It replaces long branches with jumps
  455.       or short branches, calls with branches to subroutines, and
  456.       replaces zero-offset indexed instructions by no-offset indexed
  457.       instructions.  The effects of optimizations is clearly visible if
  458.       both a pass one and a pass two listing is generated.
  459.  
  460.  
  461.    org <expression>
  462.  
  463.       The org (origin) pseudo-instruction specifies the next address to
  464.       be used for assembly.  When no origin has been specified, the
  465.       assembler uses the value 0.  The assembler maintains three separate
  466.       location counters: one for the code segment, one for the data
  467.       segment, and one for the bss segment.  See the code and pseudo-
  468.       instruction for more information.
  469.  
  470.  
  471.    page <expression>
  472.  
  473.       When the optional expression is not present, the assembly listing
  474.       is continued on the next page.  When the expression is present,
  475.       the listing is continued on the next page only if the specified
  476.       number of lines do not fit on the current page.
  477.  
  478.  
  479.    <label> set <expression>
  480.    <label> = <expression>
  481.  
  482.       The set pseudo-instruction sets the specified label to the value
  483.       of the expression.  The label may or may not already exist.
  484.       Some programmers choose to use only upper-case identifiers for
  485.       labels defined in this way to differentiate them from addresses.
  486.  
  487.       Example:
  488.       CURRENT         set    0
  489.  
  490.                       .
  491.                       .
  492.                       .
  493.  
  494.       CURRENT         set    CURRENT+1
  495.  
  496.  
  497.    struct <name>
  498.    struct <name>,<expression>
  499.  
  500.       The struct (structure) pseudo-instruction can be used to define
  501.       data structures in memory more easily.
  502.  
  503.       The name of the structure is set to the total size of the structure;
  504.       if the expression is present, the starting offset is the value of
  505.       the expression in stead of zero.
  506.  
  507.       Between the struct and end struct pseudo-instructions the following
  508.       pseudo-instructions can be used: db, dw, ds, label, align.
  509.       Within structures these pseudo-instructions take a slightly different
  510.       format than normally:
  511.  
  512.          db <name>                element is one byte
  513.  
  514.          dw <name>                element is two bytes
  515.  
  516.          ds <name>,<expression>   element is the specified number of bytes
  517.  
  518.          ds <expression>          skip the specified number of bytes
  519.  
  520.          label <name>             element is zero bytes, i.e. set the name
  521.                                   to the current structure offset
  522.  
  523.          align <expression>       skip until (offset%expression)=0
  524.  
  525.          align                    skip until offset is even
  526.  
  527.  
  528.       Example:
  529.                      struct ListNode,4
  530.                      dw     LN_Next
  531.                      dw     LN_Previous
  532.                      db     LN_Type
  533.                      align
  534.                      label  LN_Simple       ; size of structure so far
  535.                      align  8
  536.                      ds     LN_Data,10
  537.                      end struct
  538.  
  539.       This is identical to:
  540.  
  541.       LN_Next        equ     4       ;\
  542.       LN_Previous    equ     6       ; offset of structure elements
  543.       LN_Type        equ     8       ;/
  544.       LN_Simple      equ     10      ; size of structure so far
  545.       LN_Data        equ     16      ; offset of structure element
  546.       ListNode       equ     26      ; size of structure
  547.  
  548.  
  549.    title <string>
  550.  
  551.       The title pseudo-instruction sets the title to be used in the
  552.       header of each listing page.  The string should be no longer than
  553.       80 characters.
  554.  
  555.       Example:
  556.                    title  "DIS80 : A disassembler for a 8080 CPU"
  557.  
  558.  
  559. ADDRESSING MODES
  560.    The assembler allows all 8080 (and when enabled also Z80) addressing
  561.    modes.  The use of an expression between braces as an address disallows
  562.    braces at the outermost level for immediate values.  The assembler
  563.    is capable to determine that
  564.  
  565.                    ld     a,(10)+1
  566.    and
  567.                    ld     a,1+(10)
  568.  
  569.    are immediate operands.  You can also use rectangular brackets
  570.    [ and ] to include an address.
  571.  
  572.    List of available modes:
  573.       immediate
  574.       (address)
  575.       (bc) (de) (hl) (sp)
  576.  
  577.    Additional addressing modes for the Z80:
  578.       (ix+offset)  (ix-offset)
  579.       (iy+offset)  (iy-offset)
  580.       (c)
  581.  
  582.  
  583. LIST OF ACCEPTED INSTRUCTIONS
  584.    adc add align and bit bss call ccf code cp cpd cpdr cpi cpir cpl daa 
  585.    data db dd dec defb defm defs defw di disable djnz ds dw ei else enable 
  586.    end endif equ ex exx fcb fcc fcw fdb halt if im in inc include ind indr 
  587.    ini inir jp jr ld ldd lddr ldi ldir list neg nolist noopt nop opt or 
  588.    org otdr otir out outd outi page pop push res ret reti retn rim rl rla 
  589.    rlc rlca rld rmb rr rra rrc rrca rrd rst sbc scf set shl shr sim sl sla 
  590.    sr sra srl stc struct sub title tsti xor 
  591.  
  592.    Of these instructions, the following are (more or less) synonymous,
  593.    and can be used interchangably.
  594.    YOU CAN USE      WHERE YOU WOULD PREVIOUSLY USE
  595.       nop 6      -  nop nop nop ....
  596.       push bc,de -  push bc ; push de
  597.       pop bc,de  -  pop de ; pop bc  (note reversed order)
  598.       disable    -  di
  599.       enable     -  ei
  600.       sr         -  srl
  601.       shr        -  srl
  602.       sl         -  sla
  603.       shl        -  sla
  604.       stc        -  scf
  605.       ld bc,de   -  ld b,d ; ld c,e
  606.       ld ix,bc   -  ld xh,b ; ld xl,c
  607.       add R      -  add a,R
  608.       or a,R     -  or R
  609.       in (c)     -  tsti (c)
  610.       ex hl,de   -  ex de,hl
  611.       djnz LBL   -  dec b ; jp nz,LBL
  612.       jp nv,LBL  -  jp pe,LBL  (no overflow/parity even)
  613.       jp v,LBL   -  jp po,LBL  (overflow/parity odd)
  614.       jp ns,LBL  -  jp p,LBL   (no sign/positive)
  615.       jp s,LBL   -  jp m,LBL   (sign/negative)
  616.  
  617.    Operands:
  618.       xh         -  ixh
  619.       xl         -  ixl
  620.       yh         -  iyh
  621.       yl         -  iyl
  622.       [Address]  -  (Address)
  623.       [hl]       -  (hl)
  624.       (ix-6)     -  (ix+-6)
  625.  
  626.    And pseudo-instructions:
  627.       db         -  defb, defm
  628.       dw         -  defw
  629.       ds         -  defs
  630.       =          -  set
  631.       struct     -  lots of EQUs
  632.  
  633.  
  634. LIST OF OTHER KEYWORDS
  635.    ! != $ % & ( ) * + , - / < << <= = > >= >> [ ] ^ | ~
  636.    a af af' align b bc c d db de ds dw e end h hl i ix ixh ixl iy iyh
  637.    iyl l label m nc ns nv nz p pe po r s sp struct v xh xl yh yl z 
  638.  
  639.  
  640. FILES
  641.    <file>.a80 - source file.
  642.    <file>.z80 - source file -- first alternative.
  643.    <file>.asm - source file -- second alternative.
  644.    <file>.lst - List file.
  645.    <file>.s19 - Motorola S-records output file.
  646.    <file>.hex - Intel hex output file.
  647.    <file>.bin - Binary output file.
  648.  
  649.  
  650. BUGS
  651.    No provision for linking other pre-assembled modules is made.
  652.  
  653.  
  654. RETURNS
  655.    As80 returns one of the following values:
  656.  
  657.       0 - Source file assembled without errors.
  658.       1 - Incorrect parameter specified on the commandline.
  659.       2 - Unable to open input or output file.
  660.       3 - Assembly gave errors.
  661.       4 - No memory could be allocated.
  662.  
  663.  
  664. DIAGNOSTICS
  665.    Help message if only parameter is a question mark, or if an
  666.    illegal option has been specified.
  667.  
  668.  
  669. AUTHOR
  670.    This is copyrighted software, but may be distributed freely as long
  671.    as this document accompanies the assembler, and no copyright messages
  672.    are removed.  You are explicitly NOT allowed to sell this software
  673.    for anything more than a reasonable copying fee, say US$5.
  674.    To contact the author:
  675.       Frank A. Vorstenbosch
  676.       Kingswood Software
  677.       P.O. Box 85800              Phone: +31-(70)-355 5241
  678.       2508CM  The Hague           BBS:   +31-(70)-355 8674
  679.       Netherlands                 Email: prompt@xs4all.nl
  680.  
  681. -------------------------------------------------------------------------
  682.