home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 338_01 / as68.doc < prev    next >
Text File  |  1990-09-25  |  24KB  |  595 lines

  1. as68 - 68000 Assembler, version 1.02
  2.  
  3.  
  4. (c) copyright 1982 Steve Passe  all rights reserved
  5. Modified to support CC68K C Compiler by Brian Brown, Nov 1989
  6.  
  7.  
  8. TABLE OF CONTENTS
  9. Chapter 1 Introduction           1
  10. Chapter 2 Usage                  6
  11. Chapter 3 Pseudo-ops             8
  12. Chapter 4 Mnemonics             11
  13. Chapter 5 Expressions           13
  14. Chapter 6 S File Format         15
  15. Chapter 7 Error Messages        16
  16. Chapter 8 Differences           18
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. CHAPTER 1
  26. INTRODUCTION
  27. The as68 assembler is a disk to disk assembler for the Motorola 68000
  28. microprocessor chip. Written in the c programming language, it may be used as
  29. a cross assembler on  any machine supporting c, or as a native assembler if
  30. compiled with a c that produces 68000 output. It's directives and mnemonic set
  31. closely follow that of the Motorola Resident Structured Assembler. It has been
  32. altered to accept assembler output from the 68000 C Compiler. This
  33. modification was performed by B Brown at the Central Institute of Technology,
  34. Heretaunga, New Zealand in 1989.
  35.  
  36.  
  37.  
  38. SOURCE PROGRAM
  39. The input to the assembler is an ascii text file, consisting of a series of
  40. statements written in the assembly language. Each statement consists of one or
  41. more fields within a line.
  42.  
  43.  
  44. The assembler is free format within each line, i.e. there is no need to start
  45. a specific field of a statement in a particular column. Fields are separated
  46. from one another with whitespace (tabs or spaces).
  47.  
  48.  
  49.  
  50. STATEMENTS
  51. There are 3 basic statement types. The most common is an assembly language
  52. instruction or mnemonic. It is a command to the assembler to produce a machine
  53. operation code to carry out a specific action.
  54.  
  55.  
  56. The second type of statement is called an assembly directive or pseudo-op.
  57. Pseudo-ops tell the assembler how to assemble the program.
  58.  
  59.  
  60. The third statement type is called a comment. It is ignored by the assembler,
  61. it's purpose being to allow the programmer to insert descriptions of what the
  62. code is doing within the text of the source program. Comments may exist as the
  63. final field of the other two statement types.
  64.  
  65.  
  66. INSTRUCTION STATEMENTS
  67. An instruction statement consists of from one to four fields:
  68.  
  69.   [label] <mnemonic> [operand] [comment]
  70.  
  71.  
  72.  
  73. LABEL FIELD
  74. The first field, the label field, is optional. It is used to create a symbolic
  75. name for the address of the code generated by the following assembler
  76. mnemonic. This label is stored in the symbol table and any references to it
  77. evaluate to the associated address.
  78.  
  79.  
  80. The label field may be the only field of a statement and multiple, label only
  81. fields may follow one another. In all cases the label(s) will evaluate to the
  82. address of the first mnemonic to be assembled after the label(s) is specified.
  83.  
  84.  
  85. Labels are composed of alphanumeric characters and may be up to 30 characters
  86. long. All characters of a label are significant, as is the case of alphabetic
  87. characters (i.e. "Foo" is different than "foo").
  88.  
  89.  
  90. The first character of a label must be either alphabetic or the character '.'
  91. (period). Following characters may also include the underscore (_), dollarsign
  92. ($), and the digits '0' thru '9'.
  93.  
  94.  
  95. Labels starting in any other than the first column must be terminated with a
  96. colon (:). Certain symbols are reserved for the use of the assembler and thus
  97. may not be used as labels. These include "SP", "USP", "SR", "CCR", "A0"
  98. through "A7" and "D0"
  99. through "D7".
  100.  
  101.  
  102. MNEMONIC FIELD
  103. The second field is the mnemonic or assembly instruction field. It will always
  104. be present in a statement except in the case of a label only statement (label
  105. only statements might more properly be described as assembler directives). If
  106. the line is unlabeled the mnemonic field must be preceeded by whitespace.
  107.  
  108.  
  109. A mnemonic will consist of from 3 to 5 ascii characters, the case of which is
  110. not significant. This assembler recognizes the standard Motorola instruction
  111. set. The complete mnemonic instruction set is described in chapter 4,
  112. "Mnemonics". Many 68000 instructions may work on different data sizes.
  113.  
  114.  
  115. The desired data size is specified by appending a length modifier or data size
  116. code to the mnemonic. A '.b' extension specifies a data size of byte (8 bits)
  117. while '.l' will cause the data size to be a long word (32 bits). No extension
  118. will cause the data size to be a word (16 bits).  A '.w' extension may be used
  119. for data sizes of word, although this size is the default and as such the '.w'
  120. modifier is unnecessary.
  121.  
  122.  
  123.  
  124. OPERAND FIELD
  125. The operand field is necessary only for those statements whose mnemonic
  126. requires an operand(s). It will contain one or two operands. When two operands
  127. are present they must be separated with a comma (no whitespace allowed between
  128. operands).
  129.  
  130. The first of two operands is refered to as the source operand while the second
  131. is the destination operand.
  132.  
  133.  
  134.  
  135. COMMENT FIELD
  136. The comment field is optional and consists of all text following the above
  137. fields.
  138.  
  139.  
  140. DIRECTIVES
  141. Label Field - Labels used with directive statements follow the general rules
  142.               of those used in assembly statements with one important
  143.               exception: they may only be used with the following directives:
  144.  
  145.                  1. EQU
  146.                  2. SET
  147.                  3. DC
  148.                  4. DS
  149.  
  150. Directive Field - The directive field contains an instruction to the assembler
  151.               as to how the program should be assembled. This includes such
  152.               things as the base address of the program, setting of symbol
  153.               values, allocation of program memory storage, conditional
  154.               assembly, etc. The complete list of available assembly
  155.               directions is given in chapter 3, "Pseudo-ops".
  156.  
  157. Operand Field - The operand field of a directive statement will consist of
  158.               zero or more operands, as needed by the pseudo-op in question.
  159.               Multiple operands are separated with a comma (,). No whitespace
  160.               may exist between operands.
  161.  
  162. Comment Field - The comment field is identical to that used in instruction
  163.               statements and is optional.
  164.  
  165. Comments - Comments may exist alone as separate statements. In such cases
  166.               an asterisk, (*), must be the first character on the line.
  167.  
  168.  
  169. CHAPTER 2
  170. USAGE
  171.  
  172. Command Line Format - The command line format is:
  173.  
  174.         as68 <sourcefile>[.ext] [option[ option]]
  175.  
  176. where:
  177.  
  178.  sourcefile     is the source file name.
  179.  ext            is an optional file extension identifier. By default the
  180.                 assembler expects source files to have an ext of ".asm".
  181.  option         is one of several possible options in assembly. Whitespace
  182.                 must separate multiple options when they occur. Individual
  183.                 options are described below.
  184.  
  185.  
  186. OPTIONS
  187. The following options are available:
  188.  
  189.  e,       destination of error messages. If absent all error messages will go
  190.           to the console by default. If present, one or more of the following
  191.           destinations may be specified:
  192.                 c       error messages to the console.
  193.                 e       error messages to a file named "sourcefile.err".
  194.                 f       errors reported in listing.
  195.  
  196.  l       destination of assembly listing. If absent no listing is made. One or
  197.          more of the following option extensions are available:
  198.                 c       listing to console.
  199.                 f       listing to a file named "sourcefile.ls"
  200.  
  201.  o       type and destination of object file. If not present the object file
  202.          will be in Motorola 'S' FILE format.
  203.                 s       object to a file named "sourcefile.s19"
  204.                 x       no object file to be made.
  205.  
  206.  s       set the symbol table size. The symbol table requires 8 bytes plus
  207.          the length of the symbol for each entry. The argument should be in
  208.          decimal bytes. The symbol table defaults to 2000 bytes (decimal). To
  209.          reserve 3500 bytes the option would be: 's3500'.
  210.  
  211.  t       truncate source code lines in listing. This option will cause the
  212.          source code lines sent to any open list channel to be truncated at
  213.          the normal wrap position (see option 'w' below). It defaults to
  214.          being off, a 't' in the command line will turn it on.
  215.  
  216.  w       set the value of wrap. Source code lines in the listing(s) will
  217.          normally be 'wrapped' to the next line if they extend beyond the
  218.          column number specified by this option. If the 't' option is active
  219.          this option specifies the column beyond which source lines are
  220.          truncated. The default value of 'w' is 80, but can be set between 60
  221.          and any reasonable number of columns. Note that this number
  222.          should be set to the width of your list device, it is not the number
  223.          of columns of source code to a line (i.e. a value of 80 allows 40
  224.          characters of source per line after accounting for the 40 columns
  225.          used by the line/loc/code fields).
  226.  
  227.  
  228.  
  229. OTHER SYSTEMS
  230. The code presently supports the MSDOS operating system. Some work would have
  231. to be done in the command line parser to bring it up on other operating
  232. systems.
  233.  
  234.  
  235.  
  236.  
  237. CHAPTER 3
  238. PSEUDO-OPS
  239.  
  240. Assembly Control
  241. The following assembler directives are used to control the assembly:
  242.  
  243.  ORG    is used to specify the absolute memory origin of the code to be
  244.         assembled. The operand is an expression that evaluates to an
  245.         address within the first 64 kilobytes of memory space (0 thru
  246.         $FFFF). Any memory references outside this range will cause an
  247.         assembly error. Be aware that the 68000 chip sign extends
  248.         absolute short addresses. Thus address references above 32k
  249.         ($8000) will access hardware memory in the range of $FF8000
  250.         thru $FFFFFF. This pseudo-op will cause the assembler to
  251.         generate code using absolute short addressing.
  252.  
  253.  ORG.L  is also used to specify the absolute memory origin. However, in
  254.         this case the entire address range of the 68000 is usable (0 thru
  255.         $FFFFFF). The assembler will generate code using absolute long
  256.         addressing.
  257.  
  258.  RORG   causes the assembler to generate program counter relative code.
  259.         The memory range restrictions of the "ORG" directive apply.
  260.  
  261.  RORG.L causes the assembler to generate program counter relative code as
  262.         above, however the expression in the operand field may evaluate
  263.         to any value within the 68000's address range.
  264.  
  265.  END    signals the end of the assembly language program.
  266.  
  267.  
  268.  
  269. SYMBOL DEFINITION
  270. The following directives control the definition of symbols:
  271.  
  272.  EQU    defines a symbol and sets it's value to that of the operand. This
  273.         symbol value is permanent, i.e. it cannot be changed later in a
  274.         program. The operand may be a complex expression but cannot
  275.         make forward references.
  276.  
  277.  SET    defines or redefines a symbol and sets it's value to that of the
  278.         operand. The value is temporary and may be reset with another
  279.         'SET' directive. Again, forward references are not allowed.
  280.  
  281.  
  282. MEMORY ALLOCATION
  283.  These directives are used to reserve and/or initialize memory:
  284.  
  285.  DC     fills memory locations with constant value(s). An extension of '.B'
  286.         causes individual bytes to be filled with the value of the operand(s).
  287.         An extension of '.L' will cause the operands to be evaluated as 32
  288.         bit values, which are placed in 4 byte blocks, one for each operand.
  289.  
  290.         No extension or '.W' signifies that the operand(s) are to be
  291.         evaluated as 16 bit values, each being stored in consecutive 2 byte
  292.         locations. Word and long word values are aligned on even address
  293.         boundries.
  294.  
  295.         DC.B directives causing the location counter to end on an odd
  296.         address will pad 1 byte with a zero value unless the next source
  297.         statement is another DC.B.
  298.  
  299.  
  300.  DS     reserves memory locations. Again, a data size extension may be
  301.         appended to 'DS' to specify either byte or long word allocation.
  302.  
  303.         The operand specifies the number of data cells to reserve, i.e. if
  304.         the extension was '.L' and the operand evaluated to 5, forty (5 * 4
  305.         bytes for a long word) bytes would be reserved. Word alignment is
  306.         not automatic as in the dc directive. To force alignment after a
  307.         DS.B statement use a "ds 0" statement.
  308.  
  309.  
  310. LIST CONTROLS
  311. These directives are used to control the listing output:
  312.  
  313.  LIST   causes listing output (if enabled from the command line) to be
  314.         sent to each of the open list channels. LIST is active by default
  315.         and remains so until a NOLIST pseudo is encountered.
  316.  
  317.  NOLIST causes listing output to be turned off until a LIST pseudo is
  318.         encountered.
  319.  
  320.  
  321.  
  322. CHAPTER 4
  323. MNEMONICS
  324. The mnemonics used by this assembler follow the standard mnemonic instruction
  325. set as defined by Motorola. Mnemonics may exist in either upper or lower case
  326. in the source file, the assembler makes no distinctions.
  327.  
  328.  ABCD   add binary coded decimal
  329.  ADD    add binary
  330.  ADDQ   add quick binary, operand in range of 1 thru 8
  331.  ADDX   add binary with extend
  332.  AND    logical and
  333.  ASL    arithmetic shift left
  334.  ASR    arithmetic shift right
  335.  Bcc    branch conditionally
  336.  BCHG   bit test and change
  337.  BCLR   bit test and clear
  338.  BRA    branch unconditional
  339.  BSET   bit test and set
  340.  BSR    branch to subroutine
  341.  BTST   bit test
  342.  CHK    check register against boundaries
  343.  CLR    clear operand
  344.  CMP    compare
  345.  CMPM   compare memory
  346.  DBcc   test condition, decrement and branch
  347.  DIVS   signed divide
  348.  DIVU   unsigned divide
  349.  EOR    exclusive or
  350.  EXG    exchange registers
  351.  EXT    sign extend
  352.  JMP    jump to address
  353.  JSR    jump to subroutine
  354.  LEA    load effective address
  355.  LINK   link and allocate
  356.  LSL    logical shift left
  357.  LSR    logical shift right
  358.  MOVE   move
  359.  MOVEM  move multiple registers
  360.  MOVEP  move peripheral data
  361.  MOVEQ  move quick, operand in range og -128 thru 127
  362.  MULS   signed multiply
  363.  MULU   unsigned multiply
  364.  NBCD   negate binary coded decimal
  365.  NEG    negate
  366.  NEGX   negate with extend
  367.  NOP    no operation
  368.  NOT    bitwise compliment
  369.  OR     logical or
  370.  PEA    push effective address
  371.  RESET  reset external devices
  372.  ROL    rotate left
  373.  ROR    rotate right
  374.  ROXL   rotate left with extend
  375.  ROXR   rotate right with extend
  376.  RTE    return from exception
  377.  RTR    return and restore condition codes
  378.  
  379.  RTS    return from subroutine
  380.  SBCD   subtract binary coded decimal
  381.  Scc    set conditional
  382.  STOP   stop
  383.  SUB    subtract binary
  384.  SUBQ   subtract quick binary, operand in range of 1 thru 8
  385.  SUBX   subtract binary with extend
  386.  SWAP   swap register halves
  387.  TAS    test and set operand
  388.  TRAP   trap
  389.  TRAPV  trap on overflow
  390.  TST    test an operand
  391.  UNLK   unlink
  392.  
  393.  
  394. CHAPTER 5
  395. EXPRESSIONS
  396. Expressions consist of one or more symbols combined by binary and/or unary
  397. (algebraic) operators. Possible symbols include:
  398.  
  399.  - Symbols defined with the EQU and SET directives.
  400.  - Program labels.
  401.  - Numeric values.
  402.  - The asterisk, ('*'), equates to the present value of the program location
  403.    counter.
  404.  
  405.  
  406. ALGEBRAIC OPERATORS INCLUDE:
  407.  - arithmetic operators:
  408.  * multiplication: '*'
  409.  * division: '/'
  410.  * addition: '+'
  411.  * subtraction: '-'
  412.  
  413.  
  414. LOGICAL OPERATORS:
  415.  * logical (bitwise) AND: '&'
  416.  * logical (bitwise) OR: '!'
  417.  * left shift: '<<'
  418.  * right shift: '>>'
  419.  
  420.  
  421. UNARY OPERATORS:
  422.  * unary minus: '-'
  423.  * location counter value: '*'
  424.  
  425.  
  426. SYMBOLS
  427. Symbols are composed of alphanumeric characters and may be up to 30 characters
  428. long. All characters of a label are significant, as is the case of alphabetic
  429. characters (i.e. "Foo" is different than "foo"). The first character of a
  430. label must be either alphabetic or the character '.' (period). Following
  431. characters may also include the underscore (_), dollarsign ($), and the digits
  432. '0' thru '9'.
  433.  
  434.  
  435. Numbers may be represented as either decimal, hexadecimal, or binary:
  436.  - decimal numbers are represented by the normal ascii digits '0' thru '9'.
  437.  - hexadecimal numbers start with a dollar sign ('$') followed by the ascii
  438.    digits '0' thru '9' and the ascii characters 'A' thru 'F'.
  439.  - binary numbers start with a percent sign ('%') followed by the ascii digits
  440.    '0' and '1'.
  441.  
  442.  
  443.  
  444. CHAPTER 6
  445. S FILE FORMAT
  446. A Motorola "S file" is similar in structure to an Intel hex file. It consists
  447. of a series of ascii records, each in the following format:
  448.  
  449.  - The record start character, an uppercase ascii 'S', followed by an ascii
  450.    numeral, '0' thru '9':
  451.          * a '0' for the file header record.
  452.          * a '1' for records with short (16 bit) addresses.
  453.          * a '2' for records with medium (24 bit) addresses.
  454.          * a '3' for records with long (32 bit) addresses.
  455.          * ......
  456.          * a '9' for the tail record.
  457.  - The third and forth bytes forming an ascii hex representation of the number
  458.    of bytes in the body of the record:
  459.         * an address field consisting of 4, 6, or 8 ascii bytes representing
  460.           the load address of the record (record types S1, S2, S3,
  461.           respectively).
  462.  - The body of the record consists of up to 16 bytes of data, each byte
  463.    represented as 2 ascii hex bytes.
  464.  - A checksum byte, again represented by two ascii characters:
  465.          * The checksum for each record (except the last, S9) is the least
  466.            significant byte of the 1's compliment of the sum of the byte
  467.            values of the count, address, and data fields. (ie, everything in
  468.            the record except 'Sx').
  469.          * The checksum on the 'S9' record is undefined/non-existant.
  470.  
  471.  
  472.  
  473. CHAPTER 7
  474. ERROR MESSAGES
  475.  
  476.  - 1: statement parsing error. The occurrance of this error indicates that the
  477.       line totally confuses the parser and no further diagnostic comments
  478.       (legitimate comments anyway) can be made.
  479.  - 2: bad character in mnemonic-psdo field. An illegal character exists in the
  480.       word present in the mnenonic field, see chapter 1, introduction,
  481.       instruction statements.
  482.  - 3: instruction or pseudo not found in tables. Unless error 2 is also
  483.       generated the instr/pseudo word is properly formed (i.e. no illegal
  484.       characters are in it) but not a recognized instruction.
  485.  - 4: bad character in macro field. Version 1.xx does not recognize macros!
  486.  - 5: macro not found in macro table(s). Again, macros are not yet recognized.
  487.  - 6: improper use of label. Most often this error flags the use of a label on
  488.       a pseudo op line that does not allow the use of labels. See chapter 1,
  489.       introduction, directives:label field.
  490.  - 7: can't evaluate operand. The assembler cannot evaluate the value of an
  491.       operand. This may be caused by a variety of reasons such as imbedded
  492.       spaces, unrecognized operators, unbalanced parenthesis, etc. Additional
  493.       errors will usually be reported that will help clarify the problem.
  494.  - 8: can't evaluate equ operand. As above, generated in the case of an EQU
  495.       statement.
  496.  - 9: can't evaluate set operand. As above, generated in the case of an SET
  497.       statement.
  498.  - 10: attempt to redefine a permanent symbol. The symbol was previously
  499.        defined via an EQU statement and thus cannot be changed.
  500.  - 11: symbol table full. This is a fatal error and will cause the assembly to
  501.        abort. You may try again setting an optional symbol table size from the
  502.        command line. See chapter 2, usage, options:s.
  503.  - 12: unrecognized operand. A legal operand cannot be formed from the data in
  504.        the operand field.
  505.  - 13: symbol not defined in symbol table. The symbol was not encountered in
  506.        the program up to this point. Remember that forward references are not
  507.        allowed in EQU and SET pseudo statements.
  508.  - 14: label out of range for current addressing mode. The value of the label
  509.        is outside the limits of the current statement. This usually is an
  510.        attempt to reference an address beyond the 32k bytes range imposed in
  511.        the short addressing mode. See chapter 3, pseudo-ops, assembly control.
  512.  - 15: operand 1 is not valid for instruction type. The first operand
  513.        encountered is not a valid operand for this particular
  514.        instruction/addressing mode.
  515.  - 16: operand 2 is not valid for instruction type. The second operand
  516.        encountered is not a valid operand for this particular
  517.        instruction/addressing mode.
  518.  - 17: operand 1 is not correctly formed. This may be caused by illegal use of
  519.        operators, undefined labels, etc. The assembler may or may not attempt
  520.        to evaluate the second operand. If it does you are not assured that it
  521.        will do so correctly. For more on this see error #18.
  522.  - 18: operand 2 is not correctly formed. This may be for any of the reasons
  523.        stated above for error 17. Remember that it could be incorrectly
  524.        evaluated if error 17 was also generated and that the second operand
  525.        may be incorrectly formed but not reported as such after error 17
  526.        occurs. This is dependant on the assembler correctly determining where
  527.        the poorly formed operand 1 ends and operand 2 starts.
  528.  
  529.  - 19: code building function failed. The binary code building function has
  530.        failed to properly construct a sequence of code for the statement. This
  531.        error will usually be followed with additional error #s pinpointing the
  532.        problem.
  533.  - 20: A 3 bit immediate data value out of bounds, i.e. it is greater than 7
  534.        or less than 0.
  535.  - 21: 8 bit bit field specifier out of range.
  536.  - 22: 32 bit bit field specifier out of range.
  537.  - 23: attempt to generate a bit field specifier failed.
  538.  - 24: count operand out of range (1-8).
  539.  - 25: destination register specifier illegal or out of range.
  540.  - 26: source or destination register specifier illegal or out of range.
  541.  - 27: attempt to generat register mask list from operand failed.
  542.  - 28: operand failed to evaluate to a proper source or destination effective
  543.        address.
  544.  - 29: illegal destination effective address, probably label or label with
  545.        index reference.
  546.  - 30: illegal destination effective address.
  547.  - 31: illegal multiple destination effective address, either label, label
  548.        with index, or address register indirect with predecrement or
  549.        postincrement.
  550.  - 32: illegal jump effective address, usually address register indirect with
  551.        predecrement or postincrement.
  552.  - 33: 4 bit vector out of range.
  553.  - 34: expected address displacement failed to evaluate correctly.
  554.  - 35: 8 bit displacement out of range (-128 thru 127)
  555.  - 36: 16 bit displacement out of range (-32768 thru 32766)
  556.  - 37: extent word of operand failed to evaluate correctly.
  557.  - 38: 8 bit operand out of range (-128 thru 255, sign is responsibility of
  558.        programmer).
  559.  - 39: 8 bit extension word value out of range (-128 thru 255).
  560.  - 40: 16 bit extension word out of range (-32768 thru 65535).
  561.  - 41: 32 bit extension word value out of range (overflow).
  562.  - 42: attempt to generate a 16 bit displacement failed, probably out of
  563.        range.
  564.  - 43: attempt to generate an 8 bit displacemnt failed, check range.
  565.  
  566.  
  567. CHAPTER 8
  568. DIFFERENCES
  569. This list must be considered incomplete and will be added to as the facts are
  570. brought to my attention.
  571.  
  572.  
  573. In General
  574.  - As68 allows addresses assembled under an rorg.l or org.l condition to be
  575.    coerced into a short address by enclosing the entire expression in a set of
  576.    parenthesis followed by '.s'. This allows references to the first/last 32k
  577.    with a code sequence that is 2 bytes shorter than the long address mode. As
  578.    an example:
  579.  
  580.  
  581.  org.l $8000
  582.  outport equ $ffa000   * port mapped into last  * page of address space
  583.  move.b d0,outport     * will generate 6 bytes of code while
  584.  move.b d0,(outport).s * will only generate 4 bytes of code
  585.  
  586.  
  587.  
  588. MODIFIED
  589.         format of movem instruction.
  590.  
  591.                 movem /d4/d5/, (a7)+
  592.  
  593.                 NOTE the trailing /
  594.  
  595.