PseudoSam 51 Assembler Manual V1.2.02 Copyright(c) 1986,87 PseudoCode Disclaimer: PseudoSam 51 is distributed as is, with no guarantee that it will work correctly in all situations. In no event will the Author be liable for any damages, including lost profits, lost savings or other incidental or consequential damages arising out of the use of or inability to use these programs, even if the Author has been advised of the possibility of such damages, or for any claim by any other party. It is the users reponsibility to back up all important files! See copyright information in appendix B Table of Contents Chapter 1 PseudoSam 51 assembler vs. the Intel assembler. Chapter 2 Running the assembler program. Chapter 3 Assembler statement syntax. Chapter 4 Data types. Chapter 5 Expressions. Chapter 6 Assembler Directives. (also known as assembler pseudo-opcodes, or pseudo-ops) Appendix A ASCII character set. Appendix B Copyright and registration information. Appendix C Description of Files. Appendix D Bug Reporting Procedure. Appendix E Using PseudoSam 51 on "Compatible" Systems. Table of Contents Chapter 1 PseudoSam 51 assembler vs. the Intel assembler. Chapter 2 Running the assembler program. Chapter 3 Assembler statement syntax Chapter 4 Data types Chapter 5 Expressions Chapter 6 Assembler Directives (also known as assembler Pseudo-opcodes) Appendix A ASCII character set Appendix B Copyright and registration information Appendix C Description of Files Appendix D Bug Reporting Procedure. Chapter 1 PseudoSam 51 assembler vs. the Intel assembler All PseudoSam(Pseudo brand Symbolic AsseMbler) assemblers conform to a common syntax based on the UNIX system V assembler syntax. By conforming to this Pseudo standard, conflicts with the manufacturers syntax are created. Below is a brief and incomplete list of those conflicts. Intel format PseudoSam format <identifier> equ <expression> .equ <identifier> , <expression> <identifier> set <expression> .set <identifier> , <expression> Has Macro capability No Macro capability at this time * The difference in name between the Intel and the PseudoSam name of assembler directives can be circumvented by the .opdef directive. example .opdef * eject,.eject ;defines eject to be synonymous with .eject A file syn.asm is distributed with the assembler with some useful redefinitions. Unix system V is a trademark of AT & T. Chapter 2 1. Running the assembler program Command line switch setting and source file specification. Assuming the user has an assembly language source file called foo.asm type the following command: a51 foo The assembler will assemble the program foo.asm using the default assembler switch settings. the following files will be generated by the assembler: ** foo.lst ;assembled listing shown the code conversion and ; any errors that where discover by the assembler. foo.obj ;assembled object code in Motorola Hex format. for a list of switch setting see the .command assembler directive description in chapter 6. *** The assembler uses the following temporary file names. z0z0z0z0.tmp z1z1z1z1.tmp ANY files with these names will be DESTROYED by the by the assembler. Chapter 3 Assembler statement syntax 1. Assembler Statements Assembler statements contain from zero to 4 fields as shown in following. <label> <opcode> <expressions> <comment> All fields are optional, but they must be in this order. A. Labels (<label>) are symbolic names that are assigned the starting address of any code generated by the opcode and or expressions of the line containing the label declaration.(see section 2). B. Operation codes(<opcode>) tell the assembler what machine instruction to generate, or what assembler control function to perform. The operation code also tells the assembler what expressions are required to complete the machine instruction or assembler directive. (see chapter 6). C. Expression requirements are set by the opcode(see the microprocessor manufacturers reference manual or the assembler directives chapter for individual opcode requirements).(see chapter 5). D. Comments are notes written by the programmer to explain what the program is trying to accomplish. Comments generate no code. (see section 3). 2. Labels Labels can be unlimited in length, but only the first eight characters are used to distinguish between them. They must conform to the following syntax. <label> -> <identifier>':' <identifier> -> <alphabetic character> <identifier character string> <alphabetic character> -> character in the set ['A'..'Z', 'a'..'z', '.'] <identifier character string> -> any sequence of characters from the set ['A'..'Z','a'..'z', '.', '0'..'9'] example abc: a c: foo: .123: ;label ;not a ;label ;label referred to as abc valid label referred to as foo referred to as .123 * Case makes NO difference! d: D: 3. ;is the same as Comments Comments must start with a semi-colon ; and are terminated by an end of line or file( <lf>(^J) or <sub>(^Z) ). An end of line is inserted by typing the enter or return key by most text editors. Chapter 4 1. Data types Integers Integer constants can be specified in any of the following forms: A. Binary b'bb B'bb B. ;bb=string of binary digits Decimal ndd d'dd D'dd C. ;n=nozero decimal digit ;dd=string of decimal digits Octal 0qq o'qq O'qq q'qq Q'qq D. ;qq=string of octal digits Hexidecimal 0x'hh 0X'hh h'hh H'hh x'hh X'hh ;hh=string of hexidecimal digits Examples: 077 b'0101 77 h'ff ;octal number 77 = decimal 63 ;binary number 101 = decimal 5 ;decimal number 77 = octal 115 ;hexidecimal ff = decimal 255 2. Strings: Strings consist of a beginning quote " followed by any reasonable number of characters followed by an ending quote ". Control characters and double quotes " and backslash \ may not be used in strings directly. These special characters are included by using a special escape sequence which the assembler translates into the appropriate ASCII code. Note: Strings may not be used in expressions! Although character constants may(see below). Escape sequences "\"" string containing " "\\" string containing \ "\'" string containing ' "\0" string containing null "\n" string containing linefeed "\r" string containing carriage return "\f" string containing formfeed "\t" string containing horizontal tab "\nnn" string containing the ASCII character who's code is o'nnn (nnn are octal digits). * see appendix A for ASCII codes. 3. Character Constants: Character constants consist of a single quote ' followed by a character or an escape sequence(see above) followed by a single quote '. example: 'A' = ASCII character value for the letter A = 65 (decimal); '\''= ASCII character value for the character ' = 39 (decimal). Character constants are treated as integers by the assembler and are valid where ever an integer value is valid. example: 'A' + 1 = 66 * see appendix A for ASCII codes. 4. Symbolic values Symbolic values are generally labels, but may be any identifier assigned an integer value(using .set or .equ pseudo-ops). As a special case the symbol * when used as an operand in an expression denotes the value of the location counter (the value the program counter will have during operation) at the beginning of the current line. Chapter 5 Expressions All expressions evaluate to integer values modulo 65536(2^16) and are written in infix notation(the way you normally write them). Operators provided are grouped below in order of precedence. 1. (unary) ~ logical bit wise complement(not) of its operand(one's complement). arithemetic complement, or negation(two's complement). 2. (binary) * / % >> times). << times). ~ integer multiply (two's complement). integer divide (two's complement). modulus (result is always positive) logical shift right (left operand shifted right operand logical shift left (left operand shifted right operand equivalent to A or ( ~B ). 3. (binary) | logical bitwise or(inclusive-or) of two operands. ^ logical bitwise exclusive-or of two operands. & logical bitwise and of two operands. 4. (binary) + addition (two's complement). subtraction (two's complement). Since this version does not generate relocatable code there exists only one "type" of operand that can be in an expression. goes except divide by 0(1 will be substituted ). examples: -1 = h'ffff (two's complement notation). -1 >> 8 = h'00ff -1 << 8 = h'ff00 3 / 2 = 1 6 / 2 = 3 5 / 0 = 5 -2 / 1 = -2 -3 /-2 = 1 2 * -3 = -6 b'00 & b'11 = 0 So anything b'11 & b'10 = 2 2 * b'01 & b'10 = 2 b'01 ^ b'11 = 2 b'01 | b'11 = 3 Notice that spaces are ignored in expressions. Chapter 6 Assembler Directives (also known as assembler Pseudo-opcodes) The assembler recognizes the following directives: directive .command options). section description 1 ;set assembly options(similar to command line .org 2 ;set program origin. .equ 3 ;equate an identifier to an expression(permanent ; assignment). .set 4 ;equate and identifier to an expression(temporary ; assignment). .rs 5 ;reserve storage(memory) space. .db 6 ;define byte. .dw 7 ;define word(16 bit). .drw 8 ;define reversed word(16 bit). .eject 9 ;form feed in listing .page 10 ;align location counter on 256 byte memory ; page boundary. .end 11 ;end of program .opdef 12 ;equate an identifier with another identifier. .segment 13 ;define a memory segment. <segment name> 14 ;select segment <segment name> as current segment. .null ;this is a comment statement. 15 1. .command switches <optionlist> ;allows the programmer to set option ;in the same manner as on the command line. ;(the command line is the line typed to run ; this program). <optionlist> -> <option> ' ' <optionlist> <optionlist> -> <option> -> '-'<available option> <option> -> '+'<available option> <available option> -> 'a'<decimal number> ;Hex hode format. ;1 => Intel Hex. ;2 => Motorola 19 Hex. <available option> -> 'w'<decimal number> ;page width in columns(characters). ;(-,+ are ignored but one must be ; there). <available option> -> 'h'<decimal number> ;page height in lines. ;(-,+ are ignored but one must be ; there). <available option> -> 'l' ;listing on(+) or off(-) ;if set on command line it overrides ;all listing controls in program. <available option> -> 'm'<decimal number> ;Machine level. ;1 => z80,nsc800. <available option> -> 's' ). ;symbol listing on(+) or off(- <available option> -> 'o' ;selects single object module ;file only(+), or multiple object ;module files(-)(one for each ;defined segment in the program). ;ONLY active on command line! <available option> -> 't'<drive> create ;specifies which drive to ;all temporary files on(-,+ are ; ignored but one must be there). ;ONLY active on command line! <available option> -> 'p'<drive> create ;specifies which drive to ;the listing file on(-,+ are ; ignored but one must be there). ;ONLY active on command line! <drive> -> <drive name>':' <drive name> -> 'a' <drive name> -> 'b' <drive name> -> 'c' <drive name> -> 'd' ;e.g. a: b: c: d: ;MS-DOS ;drive a --usually a floppy disk ;drive b --usually a second floppy disk ;drive c --usually a hard disk, but may be a ram disk. ;drive d --usually a ram disk, but may be a hard disk. ** The default options are: -a2 -m1 -w132 -h66 +l +s +o 2. .org <integer expression> ;sets the assembler location counter ;to the value of expression. ;The expression MUST be evaluatable ;on the first pass. NO FORWARD ;REFERENCES! 3. .equ <identifier> ',' <integer expression> ;gives identifier the value of the ;integer expression. ;<identifier> canNOT be redefined! ;also forward references are allowed ;as long as they are resolved by the ;second pass. 4. .set <identifier> ',' <integer expression> ;gives identifier the value of the ;integer expression. ;<identifier> CAN be redefined later ; in the program! ;also forward references are allowed ;as long as they are resolved by the ;second pass. 5. .rs <integer expression> 6. .db <expression-string list> <expression-string <expression-string <expression-string <expression-string list> list> list> list> -> -> -> -> ;increments the location counter ;by the value of <integer expresson> ;effectively reserving that many bytes ;of memory. <expression>','<expression-string list> <string>','<expression-string list> <expression> <string> ;creates a byte in the machine code ;for each <expression> in the list ;and a byte for each ascii character ;in the a string. 7. .dw <expression list> <expression list> -> <expression>','<expression list> <expression list> -> <expression> ;creates a word(16 bit) in the machine code ;for each <expression> in the list. ;MOST significant byte is stored at LOWER ;address. 8. .drw <expression list> <expression list> -> <expression>','<expression list> <expression list> -> <expression> ;creates a word(16 bit) in the machine code ;for each <expression> in the list. ;LEAST significant byte is stored at LOWER ;address. 9. .eject ;causes a form-feed character to be ;inserted in listing.(new listing page) 10. .page ;increments location counter to next ;256 byte page boundary. 11. .end <integer expression> ;signals the end of the source program. ;the optional expression, if supplied, ;specifies the start address of the ;program, and is included in the ;Motorola Hex object module output ;of the active segment when the .end ;was encountered. 12. .opdef <identifier>,<identifier> ;assigns the current definition of ;the second <identifier> to the ;first <identifier>. ;useful for renaming opcodes and ;pseudo-ops. 13. .segment <identifier> ',' <integer expression> ;defines a memory segment name. ;used to separate memory allocation ;and optionally generate seperate ;object files.(see 'o' assembly ;directive to activate). ;(used to seperate RAM, ROM, or ; ROMS) ;the optional <integer expression> is ;added to the location counter to ;offset the load address supplied ;in the object module. (does not ;affect listings addresses!) ; ;note: .code is the predefined default ;segment and cannot be redefined. 14. <segment name> ;selects the segment <segment name> ;as the current memory segment. ;The location old segment location counter ;is saved and the previous value of the ;newly selected segments location counter ;is used(0 if not previously used). 15. .null ;directs the assembler to treat this ;statement as a comment. Useful to ;nullify opcodes when used in conjunction ;with the .opdef pseudo-op. Appendix A ASCII character set dec oct hex char 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 000 001 002 003 004 005 006 007 010 011 012 013 014 015 016 017 020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ^@ ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ null soh stx etx eot enq ack bel bs ht lf vt ff cr so si dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us dec oct hex char 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 040 041 042 043 044 045 046 047 050 051 052 053 054 055 056 057 060 061 062 063 064 065 066 067 070 071 072 073 074 075 076 077 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F sp ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? dec oct hex char 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 100 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ^ denotes control key simultaneous with character key. dec oct hex char 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 140 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160 161 162 163 164 165 166 167 170 171 172 173 174 175 176 176 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ del Appendix B Copyright Information: Disclaimer: PseudoSam 51 is distributed as is, with no guarantee that it will work correctly in all situations. In no event will the Author be liable for any damages, including lost profits, lost savings or other incidental or consequential damages arising out of the use of or inability to use these programs, even if the Author has been advised of the possibility of such damages, or for any claim by any other party. Copyright Information: The entire PseudoSam 51 distribution package, consisting of the main program, documentation files, and various data and utility files, is copyright (c) 1986, by PseudoCode. The author reserves the exclusive right to distribute this package, or any part thereof, for profit. The name "PseudoSam (tm)", applied to an assembler program, is a trade mark of the PseudoCode company. PseudoSam version 1.x.xx and various subsidiary files may be copied freely by individuals for non-commercial purposes. It is expected that those who find the package useful will purchase the update service. ONLY UNMODIFIED VERSIONS DISPLAYING THE AUTHORS COPYRIGHT MAY BE COPIED. User groups and clubs are authorized to distribute PseudoSam software under the following conditions: 1. No charge is made for the software or documentation. A nominal distribution fee may be charged, provided that it is no more than $5 total. 2. Recipients are to be informed of the user-supported software concept, and encouraged to support it with their donations. 3. The program and documentation are not modified in ANY way, and are distributed together. Interested manufacturers are invited to contact PseudoCode to discuss licensing PseudoSam 51 for bundling with MS-DOS based development systems. Distribution of PseudoSam 51 outside the United States is through licensed distributors, on a royalty basis. Interested distributors are invited to contact PseudoCode. Educational Use: Educational institutions are free to use this software in their classes and are encouraged to distribute this package to their students, however inorder to receive periodic updates and technical assistance the appropriate department must remit the license fee. Also a staff member must be assigned to clear all trouble reports before forwarding them to PseudoCode. If you use this software, please help support it. support can take three forms: Your 1. Become a registered user. The suggested payment for registration is $30($100 for complete family). 2. Suggestions, comments, and bug reports. 3. Spread the word. Make copies for friends. Write the editor of your favorite computer magazine. Astronomical advertising costs are one big reason that commercial software is so overpriced. To continue offering PseudoSam 51 this way, we need your help in letting other people know about PseudoSam 51. Those who make the $30 payment to become registered users receive the following benefits:(order form on next page) 1. One year of updates including any upgrades. This includes at least one new version release even if it takes more than one year. 2. User support by mail. Support is only available to registered users. The address for help is given below. 3. Notices announcing the release of new products. Attention:BUGS PseudoCode P.O. Box 1423 Newport News, VA 23601 ********ORDER FORM******** Please add me to the list of registered PseudoSam 51 users, and send me the most recent version. I understand that registration entitles me to one year of free updates and new releases, or one free new version release, whichever occurs last. Note that version 1.2.02 requires DOS 2 (or later) and 256K. Computer Model: ____________________________________ Diskette format: Total Memory: _______K (256K required) __ doubled sided/DOS 2 Check one: ___ I enclose a check for $30 (PseudoCode pays sales tax for VA orders) Where did you hear about PseudoSam 51? ________________________________ Name: _______________________________________________________ Address: _______________________________________________________ City, State, Zip: ______________________________________________ ================================================================ Send order form with check or money order payable to PseudoCode to: (Qualified PO's will be billed.) Attention: Registration PseudoCode P.O. Box 1423 Newport News, VA 23601 ********ORDER FORM******** Please add me to the list of registered users of the complete PseudoSam family of cross-assemblers. Send me the most recent versions. I understand that registration entitles me to one year of free updates and new releases, or one free new version release, whichever occurs last. I note that version 1.2.02 requires DOS 2 (or later) and 256K. Computer Model: ____________________________________ Diskette format: Total Memory: _______K (256K required) __ single sided/DOS 2(360k) Check one: ___ I enclose a check or money order for $100 (shipping, handling, and Virginia sales tax for VA orders is paid by PseudoCode). Where did you hear about the PseudoSam family? ________________________ Name: _______________________________________________________ Address: _______________________________________________________ City, State, Zip: ______________________________________________ ================================================================ Send order form with check or money order payable to PseudoCode to: (Qualified PO's will be billed.) Attention: Registration PseudoCode P.O. Box 1423 Newport News, VA 23601 ********Commercial Distribution Agreement******** Please add me to the list of registered PseudoSam 51 distributors, and send me the most recent version. I understand that registration entitles me to distribute this package freely on an "as is" basis to purchasers of my products. I further understand that I may not make a specific or additional charge for this package. I may however advertise the package as free software. I fully understand that the distributed software must be clearly labeled as follows: Complementary Software Distributed "AS IS" PseudoCode P.O. Box 1423 Newport News, VA 23601 I understand that this agreement entitles me to one year of distribution rights and free updates. Note that version 1.2.02 requires DOS 2 (or later) and 256K. Computer Model: ____________________________________ Diskette format: Total Memory: _______K (256K required) __ doubled sided/DOS 2 Check one: ___ I enclose a check for $30 (PseudoCode pays sales tax for VA orders) Where did you hear about PseudoSam 51? ________________________________ Name: _______________________________________________________ Address: _______________________________________________________ City, State, Zip: ______________________________________________ Signature_______________________ Date_________________ ================================================================ Send order form with check or money order payable to PseudoCode to: (Qualified PO's will be billed.) Attention: Registration PseudoCode P.O. Box 1423 Newport News, VA 23601 ********Commercial Distribution Agreement******** Please add me to the list of registered PseudoSam distributors, and send me the most recent version. I understand that registration entitles me to distribute this package freely on an "as is" basis to purchasers of my products. I further understand that I may not make a specific or additional charge for this package. I may however advertise the package as free software. I fully understand that the distributed software must be clearly labeled as follows: Complementary Software Distributed "AS IS" PseudoCode P.O. Box 1423 Newport News, VA 23601 I understand that this agreement entitles me to one year of distribution rights and free updates for the entire PseudoSam family of products. I note that version 1.2.02 requires DOS 2 (or later) and 256K. Computer Model: ____________________________________ Diskette format: Total Memory: _______K (256K required) __ single sided/DOS 2(360k) Check one: ___ I enclose a check or money order for $100 (shipping, handling, and Virginia sales tax for VA orders is paid by PseudoCode). Where did you hear about the PseudoSam family? ________________________ Name: _______________________________________________________ Address: _______________________________________________________ City, State, Zip: ______________________________________________ Signature_______________________ Date_________________ ================================================================ Send order form with check or money order payable to PseudoCode to: (Qualified PO's will be billed.) Attention: Registration PseudoCode P.O. Box 1423 Newport News, VA 23601 The PsuedoSam Family consists of the following cross-assemblers Name Designed for PseudoSam PseudoSam PsuedoSam PseudoSam 48 51 96 68 PseudoSam PsuedoSam PseudoSam PseudoSam PseudoSam PseudoSam PseudoSam PseudoSam 685 689 65 85 80z 18 32 68k Available* ;Intel 8048 family. ;Intel 8051 family. ;Intel 8096 family. ;Motorola ;6800,01,02,03,08. ;Motorola 6805. ;Motorola 6809. ;6502. ;Intel 8080,8085. ;Zilog Z80, NSC800. ;RCA 1802. ;NSC 32000 Family. ;Motorola 68000 family. V1.1.00 Now Now Now Now Now Now Now Now Now Now Apr 87 May 87 * PseudoCode reserves the right to change price and availability of any product without notice. Appendix C: Description of Files Your PseudoSam 51 distribution disk contains a number of files. This appendix will give a brief statement of the purpose of each of the files. FILE DESCRIPTION ---------------------------------------------------------------A51.COM The PseudoSam 51 program. A51.DOC This document. EXAMPLE.ASM Sample source file. MNEMTEST.ASM Mnemnonics test file. SYN.ASM Useful mnemnonics redefinitions COMRCIAL.USE Commercial distribution agreement. Occasionally, various other sample source files for PseudoSam 51 will be distributed. These files will have extension ASM, and will be accompanied by a corresponding DOC file. Appendix D: Bug Reporting Procedure. Although each version of PseudoSam 51 is tested extensively prior to release, any program is bound to contain a few bugs. It is the intention of PseudoCode to correct any genuine problem that is reported. If you think you have found a bug in PseudoSam 51, please take the time to report it for correction. Although any report is helpful, correction of the problem will be easiest if you provide the following: 1. The version of PseudoSam 51 you are using. Your problem may have been fixed already. 2. A brief description of the problem. 3. A copy of the problem source file, preferably on a floppy disk. (The cost of floppies is so small($.29), they will not be returned and become the property of PseudoCode.) * It is NOT necessary to send a large program to demonstrate problem. Please try to isolate the problem area, by writing a short sample program that demonstrates the bug. Attention:BUGS PseudoCode P.O. Box 1423 Newport News, VA 23601 Appendix E Using PseudoSam 51 on "Compatible" Systems. PseudoSam 51 was written specifically for the IBM PC, but should function normally on true "compatibles". Since PseudoSam 51 version 1.2.00 is a totally new program, little compatibility data is currently available. If you are using (or are unable to use...) PseudoSam 51 on a non-IBM computer, please write with your experiences. Does PseudoSam 51 work correctly on your system? Are there specific problem areas? Can they be worked around? The following systems are known to run PseudoSam 51 version 1.2.00 successfully: IBM PC IBM XT IBM AT Sperry PC (all models). JDR Microdevices PC Clones.