# Compiler Syntax

## Comments

Comments begin with a semicolon (;).  A colon (:) following a label is optional

```
    lda #$00             ;hi there
label1: jmp label2
label2  beq label1
```

## Numbers and expressions

Hexadecimal numbers begin with '$' or end with 'h'.  Binary numbers begin with '%' or end with 'b'.  Characters and strings are surrounded by single or double quotes.  The characters (' " \\) within quotes must be preceded by a backslash (\\).

```
12345
'12345'
$ABCD
0ABCDh
%01010101
01010101b
```

Supported operators (listed by precedence):

```
          ( )
 (unary)  + - ~ ! < >
          * / %
          + -
          << >>
          < > <= >=
          = == != <> 
          &
          ^
          |
          &&
          ||
```

'=' and '<>' are equivalent to C's '==' and '!=' operators. The unary '<' and '>' operators give the lower and upper byte of a 16-bit word (respectively).

All other operators function like their C equivalents.

## Labels

Labels are case sensitive.&#x20;

The special '$' label holds the current program address. Labels beginning with '@' are local labels. They have limited scope, visible only between non-local labels.  Names of local labels may be reused.

```asm6502
label1:
    @tmp1:
    @tmp2:
label2:
    @tmp1:
    @tmp2:
```

Labels beginning with one or more '+' or '-' characters are nameless labels, especially useful for forward and reverse branches.

```
--  ldx #0
 -  lda $2002 ;loop (wait for vblank)
    bne -
 -  lda $2002 ;nameless labels are easy to reuse..
    bne -

    cpx #69
    beq +     ;forward branch..
    cpx #96
    beq +here ;use more characters to make more unique

    jmp --    ;multiple --'s handy for nested loops
+  ldx #0
+here  nop
```

## Assembler directives&#x20;

(in no specific order)

All directives are case insensitive and can also be preceded by a period (.)

`EQU`

For literal string replacement, similar to #define in C.

```
one EQU 1
plus EQU +
DB one plus one ;DB 1 + 1
```

`=`\
\
Unlike EQU, statements with '=' are evaluated to a number first. Also unlike EQU, symbols created with '=' can be reused.

```
i=1
j EQU i+1
k=i+1   ;k=1+1
i=j+1   ;i=i+1+1
i=k+1   ;i=2+1
```

`INCLUDE (also INCSRC)`

Assemble another source file as if it were part of the current source.

```
INCLUDE whatever.asm
```

`INCBIN (also BIN)`

Add the contents of a file to the assembly output.

```
 moredata: INCBIN whatever.bin
```

An optional file offset and size can be specified.

```
INCBIN foo.bin, $400 ;read foo.bin from $400 to EOF
INCBIN foo.bin, $200, $2000 ;read $2000 bytes, starting from $200
```

`DB, DW (also BYTE/WORD, DCB/DCW, DC.B/DC.W)`

Emit byte(s) or word(s).  Multiple arguments are separated by commas.  Strings can be "shifted" by adding a value to them.

```
DB $01,$02,$04,$08
DB "ABCDE"+1          ;equivalent to DB "BCDEF"
DB "ABCDE"-"A"+32     ;equivalent to DB 32,33,34,35,36
```

`DL, DH`

Similar to DB, outputting only the LSB or MSB of a value.

```
DL a,b,c,d            ;equivalent to DB <a, <b, <c, <d
DH a,b,c,d            ;equivalent to DB >a, >b, >c, >d
```

`HEX`

Compact way of laying out a table of hex values.  Only raw hex values are allowed, no expressions.  Spaces can be used to separate numbers.

```
HEX 456789ABCDEF  ;equivalent to DB $45,$67,$89,$AB,$CD,$EF
HEX 0 1 23 4567   ;equivalent to DB $00,$01,$23,$45,$67
```

`DSB, DSW (also DS.B/DS.W)`

Define storage (bytes or words).  The size argument may be followed by a fill value (default filler is 0).

```
DSB 4         ;equivalent to DB 0,0,0,0
DSB 8,1       ;equivalent to DB 1,1,1,1,1,1,1,1
DSW 4,$ABCD   ;equivalent to DW $ABCD,$ABCD,$ABCD,$ABCD
```

`PAD`

Fill memory from the current address to a specified address.  A fill value may also be specified.

```
PAD $FFFA     ;equivalent to DSB $FFFA-$
PAD $FFFA,$EA ;equivalent to DSB $FFFA-$,$EA
```

`ORG`

Set the starting address if it hasn't been assigned yet, otherwise ORG functions like PAD.

```
ORG $E000     ;start assembling at $E000
.
.
.
ORG $FFFA,$80 ;equivalent to PAD $FFFA,$80
```

`ALIGN`

Fill memory from the current address to an N byte boundary.  A fill value may also be specified.

```
ALIGN 256,$EA
```

`FILLVALUE`

Change the default filler for PAD, ALIGN, etc.

```
FILLVALUE $FF
```

`BASE`

Set the program address.  This is useful for relocatable code, multiple code banks, etc.  The same can also be accomplished by assigning the '$' symbol directly (i.e. '$=9999').

```
oldaddr=$
BASE $6000
stuff:
.
.
.
BASE oldaddr+$-stuff
```

`IF / ELSEIF / ELSE / ENDIF`

Process a block of code if an expression is true (nonzero).

```
IF j>0
    DB i/j
ELSE
    DB 0
ENDIF
```

`IFDEF / IFNDEF`

Process a block of code if a symbol has been defined / not defined.

```
IFDEF _DEBUG_
.
.
.
ENDIF
```

`MACRO / ENDM`

MACRO name args...

Define a macro.  Macro arguments are comma separated. Labels defined inside macros are local (visible only to that macro)

```
MACRO setAXY x,y,z
LDA #x
LDX #y
LDY #z

ENDM

setAXY $12,$34,$56
;expands to LDA #$12
;           LDX #$34
;           LDY #$56
```

`REPT / ENDR`\
Repeat a block of code a specified number of times. Labels defined inside REPT are local.

```
i=0
REPT 256
DB i
i=i+1
ENDR
```

`ENUM / ENDE`

Reassign PC and suppress assembly output.  Useful for defining variables in RAM.

```
ENUM $200
foo:    db 0
foo2:   db 0
ENDE
```

`ERROR`

Stop assembly and display a message.

```
IF x>100
    ERROR "X is out of range :("
ENDIF
```

The information on this page is provided from the asm6f documentation by loopy.

<https://github.com/freem/asm6f/blob/master/readme-original.txt>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://aeriform.gitbook.io/minicube64/compiler-syntax.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
