---
name: "crasm"
section: "1"
platform: "linux"
package: "crasm"
version: "1.8-3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/crasm"
---

# crasm(1)

Cross assembler for 6800/6801/6803/6502/65C02/Z80

## NAME

crasm - Cross assembler for 6800/6801/6803/6502/65C02/Z80

## SYNOPSIS

**crasm \[-o** *codefile***\] \[-slx\]** *asmfile*

Assemble the microprocessor program  *asmfile* and produce output file  *codefile* in Intel HEX or Motorola S Code format. A program listing and a symbol table are also produced on the standard output. The current version of **crasm** can assemble programs for the  **6800,** **6801,** **6803,** **6502,** **65C02,** and **Z80** processors. The full list is printed when you invoke **crasm** without arguments.

## OPTIONS

- **-o** *codefile*

  Specify the name of the output file. No output file is produced without this option.

- **-s**

  Disable warnings.

- **-l**

  Disable program listing output.

- **-x**

  Disable symbol table output.

## SYNTAX

Each line of the assembly program should follow one of the following templates, where the brackets delimit optional parts.

-

  **\[;***comment***\]**\
  *label* **=** *expression* **\[;***comment***\]**\
   **\[***label***\]** *mnemonic* *operand* **\[;***comment***\]**

Comments are introduced by a semicolon (**;**) and extend to the end of the line. Labels are identifiers containing up to 36 alphanumeric  characters (including period and underscore). Labels cannot start with a digit. The format of the mnemonics and operands  field depends on the selected micro-processor. A few mnemonics are valid for all processors and are used to give directives to the assembled. These are known as "pseudo-mnemonics".

## Labels

Labels are identifiers representing\
 — an absolute address,\
 — a relative address (position independent code),\
 — a register,\
 — a list of registers,\
 — a specific bit at a specific address,\
 — or a mnemonic.

Most labels are composed of at most 36 alphanumeric characters, periods(**.**) or underscores(**\_**). Labels cannot start with a digit.   They are case insensitive.

Labels starting with a period(**.**) are local labels whose scope is either limited to the macro in which they are defined, or to the code segment delimited by the pseudo-mnemonics **CODE** or **DUMMY**.

The predefined "star" label (**\***) represents the current program counter, that is to say, the address where the next assembly code instruction will be encoded. Other predefined labels include all pseudo-mnemonics,  micro-processor specific mnemonics and  register names.

## Constants

The assembled recognizes numerical constants expressed in decimal, hexadecimal, octal, binary, or ascii.

| | | |
| --- | --- | --- |
| **Type** | **Format** | **Examples** |
| decimal | *dddd* | **1234**, **675**, **12**, **1**, but not **0.12**. |
| hexadecimal | **$***dddd* | **$fd12**, **$2AC**, **$0**. |
|  | *dddd***H** | **03H**, **2da7H**, **0FC84H**, but not **FC84H**. |
|  | **0X***dddd* | **0x03**, **0x2AC**, **0Xfc84**. |
| octal | *dddd***Q** | **377Q**, **012412Q**. |
| binary | **%***dddd* | **%01110110**, **%1100**. |
|  | *dddd***B** | **01110110B**, **1100B**. |
|  | **0B***dddd* | **0b1100** |
| ascii | **'***cccc***'** | **'a'**, **'AB'**, **'"'**, **'\\n'**, **'\\''**. |
|  | **"***cccc***"** | **"\\t"**, **"\\""**, **"a'b"**. |

## Expressions

Like labels, expressions can represent an absolute address (*abs*), a relative address for position independent code (*rel*), a register (*reg*), or a list of registers (*reglist*), or a reference to a specific bit at a specific address (*bspec*).

The following operators are recognized on expressions.

| | | |
| --- | --- | --- |
| **Syntax** | **Result** | **Description** |
| *abs***{***abs***}** | *bspec* | bit reference, e.g. **pia{3}** |
| **ADDR(***abs***)** | *abs* | address from a bit reference |
| **BIT(***abs***)** | *abs* | bit number from a bit reference |
| **-** *abs* | *abs* | two's complement |
| **~** *abs* | *abs* | one's complement |
| *abs* **\<\<** *abs* | *abs* | left shift |
| *abs* **\>\>** *abs* | *abs* | right shift |
| *abs* **\|** *abs* | *abs* | bitwise or |
| *abs* **&** *abs* | *abs* | bitwise and |
| *abs* **^** *abs* | *abs* | bitwise xor |
| *abs* **\*** *abs* | *abs* | multiplication |
| *abs* **\*** *abs* | *abs* | division |
| *abs* **+** *abs* | *abs* | addition |
| *rel* **+** *abs* | *rel* | addition |
| *abs* **-** *abs* | *abs* | subtraction |
| *rel* **-** *abs* | *rel* | subtraction |
| *rel* **-** *rel* | *abs* | subtraction |
| *reg* **-** *reg* | *reglist* | register range |
| *reglist* **\\** *reg* | *reglist* | register list |

The table lists operators in order of decreasing precedence. Parenthesis can be used to avoid ambiguities. A warning is generated when an entire expression is surrounded with parenthesis and can be confused with a micro-processor addressing mode.

Examples:

-

   **(base+$12) \>\> 8 & 0xff00** \
    **'A'-80H** \
    **(base+0x12)**

The last example causes a warning because the parenthesis were not necessary and might suggest a micro-processor  addressing mode.

All arithmetic expressions are evaluated on 32 bits. Arithmetic operations overflow silently. The arithmetic values are then truncated to the size implied by the micro-processor mnemonic. This truncation might cause a warning message.

Examples: all the following instructions

-

  (6502)	**lda #$1234**\
   (6800)	**ldaa $1234,x**\
   (Z80)	**ld (ix+0C2H),b**

cause a warning

-

  **\>\>\> WARNING: Operand overflow**

However expression

-

  **$1123454 \* 1298992**

overflows silently.

## Pseudo-mnemonics

The following pseudo-mnemonics are always recognized.

**CPU** *cpuname* Indicates the selected micro-processor type. This must appear before anu micro-processor specific instruction. The possible values of  *cpuname* are listed when you invoke **crasm** without arguments. The current list includes **6800,** **6801,** **6803,** **6502,** **65C02,** and **Z80**

**OUTPUT** *binformat* Indicates the format of the output file. Argument  *binformat* can take values **SCODE** for producing an output file using Motorola's S code, or **HEX** for Intel's Hex format. The default depends on the selected micro-processor.

**CODE** Delimit the scope of local labels and introduce a program section.

- **DUMMY**

  Delimit the scope of local labels and introduce a fake program section whose sole effect is to define labels without generating code.

*label* **EQU** *expression*\
*label* **=** *expression* Define the value of label *label*. Labels defined using these directives can be redefined later in the program.

**\[***label***\] DB** *expression***\[,...,***expression***\]** Insert the specified data bytes (8 bits).

**\[***label***\] DW** *expression***\[,...,***expression***\]** Insert the specified data words (16 bits). The byte ordering depends on the selected micro-processor.

**\[***label***\] DL** *expression***\[,...,***expression***\]** Insert the specified data longs (32 bits). The byte ordering depends on the selected micro-processor.

**\[***label***\] DDB** *expression***\[,...,***expression***\]** Insert the specified double bytes (16 bits). The byte ordering is the opposite of the usual byte ordering for the selected micro-processor.

**\[***label***\] ASC** *stringconstant* Insert the ascii representation of the string *stringconstant .* The string must be delimited by double quotes. The C escape sequences **\\r**, **\\n**, **\\t**,  **\\0**, **\\'**, **\\"**,  and **\\\\** are recognized.

**\[***label***\] DS** *countexpr***,\[***valexpr***\]** Insere *countexpr* bytes with value *valexpr*. The default value is zero.

**\[***label***\] ALIGN EVEN**\
 **\[***label***\] ALIGN ODD** Insert a null byte in order to make the program counter even or odd.

**IF** *condexpr*\
\
  ...\
 **ELSE**\
\
  ...\
 **ENDC** Conditional assembly: If expression *condexpr* is non zero,  process the lines located between the **IF** and the **ELSE** pseudo-mnemonics. Otherwise process the lines located between the **ELSE** and the **ENDC** pseudo-mnemonics. Conditional assembly instructions can be nested. The  **ELSE** part can be omitted.

*label* **MACRO**\
\
         ...\
       **ENDM**\
 Define a new mnemonic  *label* equivalent to all the instructions located between the  **MACRO** and **ENDM** pseudo-mnemonics. Invocations of the macro can specify a list of comma  separated operands.  The character sequences  **\\1**, **\\2**, ... **\\***N* in the macro definition are replaced by the supplied operands. The character sequence **\\0** is replaced by the number of supplied operands.

**EXITM** This pseudo mnemonic can be used inside a macro definition to exit the macro.  This is useful in conjunction with the conditional assembly pseudo-mnemonics.

**INCLUDE** *filename* Force the assembler to process file named *filename* at the current point.

**LIST ON**\
 **LIST OFF** Enable or disable the production of a listing (default is on.)

**CLIST ON**\
 **CLIST OFF** Enable or disable the production of a listing for the non active branches of a conditional assembly construct (default is on.)

**ILIST ON**\
 **ILIST OFF** Enable or disable the production of a listing for included files (default is off.)

**MLIST ON**\
 **MLIST OFF** Enable or disable the production of a listing for the macro expansions (default is off.)

**NAM** title Provide name *title* for the header of the listing pages.

**PAGE** Start a new listing page.

**PAGE** columns**,**rows Specify the size of a listing page.

**SKIP** number Skip *number* lines.

**FAIL** message Generate an error message *message*.

## EXAMPLE

Here is a small 6502 program:

-

       **cpu 6502**\
  \
    **cout = $fded ; display a character**\
  \
       **\* = $300  ; assemble at $300**\
  \
         **code**\
  \
    **pstring  ldy #0**\
  \
    **.1       lda message,y**\
  \
             **beq .2**\
  \
             **jsr cout**\
  \
             **iny**          \
  \
    **.2       bne .1**\
  \
             **rts**\
  \
    **message  asc "This is the message "**\
  \
         **code**

## CREDITS

Leon Bottou, September 1987.
