c65gm/commands.md

9 KiB

Compiler Commands Reference

ADD

Adds two values and stores result in destination.

Syntax:

<dest> = <param1> + <param2>

Examples:

result = 10 + 5
total = count + offset
sum = var1 + 100

AND

Bitwise AND operation between two values.

Syntax:

<dest> = <param1> & <param2>

Examples:

mask = value & $FF
result = byte1 & byte2
flags = status & $80

BREAK

Exits current loop immediately.

Syntax:

BREAK

Examples:

FOR i = 0 TO 100
    IF i = 50
        BREAK
    ENDIF
NEXT

WHILE counter < 1000
    counter++
    IF error
        BREAK
    ENDIF
WEND

BYTE

Declares an 8-bit variable or constant.

Syntax:

BYTE <varname>
BYTE <varname> = <value>
BYTE <varname> @ <address>
BYTE CONST <varname> = <value>

Examples:

BYTE counter
BYTE speed = 5
BYTE screen @ $D020
BYTE CONST MAX_SPEED = 10

CALL

Calls a function with optional arguments.

Syntax:

<funcname>
<funcname>()
<funcname>(<param1>[,<param2>,...])

Examples:

initialize
initialize()
setColor(1,14)
drawSprite(xpos,ypos,@spriteData)
process("hello",42,myvar)

CASE

Defines a case branch within SWITCH statement.

Syntax:

See SWITCH

DEC

Decrements a variable or memory location by 1.

Syntax:

<var>--
DEC <target>
DECREMENT <target>

Examples:

counter--
lives--
index--
DEC $D020
DECREMENT screenColor

DEFAULT

Defines the default branch in SWITCH statement.

Syntax:

See SWITCH

ELSE

Alternative branch in IF statement.

Syntax:

See IF

ENDIF

Terminates IF block.

Syntax:

See IF

ENDSWITCH

Terminates SWITCH block.

Syntax:

See SWITCH

FEND

Ends a function definition.

Syntax:

See FUNC

FOR

Loop with automatic counter increment.

Syntax:

FOR <iterator> = <start_value> TO <end_value> [STEP <increment>]

Examples:

FOR i = 0 TO 10
    screen = i
NEXT

FOR x = 0 TO 255 STEP 2
    result = result + x
NEXT

FOR counter = start TO finish
    process(counter)
NEXT

FUNC

Defines a function with optional parameters.

Parameter passing modes: in: (default, read-only), out: (write-only), io: (read-write)

Syntax:

FUNC <n>
FUNC <n>(<param1>[,<param2>,...])

Examples:

FUNC initialize
    BYTE temp = 0
    screen = temp
FEND

FUNC add(in:a,in:b,out:result)
    result = a + b
FEND

FUNC process(value,{BYTE temp})
    temp = value + 1
FEND

FUNC swap(io:x,io:y)
    BYTE temp = x
    x = y
    y = temp
FEND

GOSUB

Calls subroutine with optional register passing.

Syntax:

GOSUB <target>
GOSUB <target> PASSING <var> AS ACC|XREG|YREG [<var> AS XREG|YREG [<var> AS YREG]]

Examples:

GOSUB myRoutine
GOSUB clearScreen
GOSUB processData PASSING value AS ACC
GOSUB multiply PASSING a AS ACC b AS XREG result AS ACC

GOTO

Unconditional jump to label or address.

Syntax:

GOTO <target>

Examples:

GOTO mainLoop
GOTO error
GOTO endProgram
GOTO $9000
GOTO (startAddress+$100)

IF

Conditional execution based on comparison.

When single parameter: 0 = false, non-zero = true

Syntax:

IF <param1> [<operator> <param2>]

Operators: = == <> != > < >= <=

Examples:

IF count == 10
    result = 1
ENDIF

IF value > threshold
    process(value)
ELSE
    skip(value)
ENDIF

IF x < 100
    x++
ELSE
    x = 0
ENDIF

INC

Increments a variable or memory location by 1.

Syntax:

<var>++
INC <target>
INCREMENT <target>

Examples:

counter++
index++
frameCount++
INC $D020
INCREMENT screenColor

LABEL

Creates a named assembly label.

Syntax:

LABEL <n>

Examples:

LABEL mainLoop
LABEL skipSection
LABEL errorHandler

LET

Assigns value to variable.

Note: expressions not allowed (except constant expressions without spaces)

Syntax:

<dest> = <source>

Examples:

counter = 0
speed = maxSpeed
result = temp
value = 100+50

NEXT

Loop terminator for FOR.

Syntax:

See FOR

OR

Bitwise OR operation between two values.

Syntax:

<dest> = <param1> | <param2>

Examples:

flags = flags | $01
result = byte1 | byte2
status = status | errorBit

ORIGIN

Sets assembly origin address.

Syntax:

ORIGIN <address>

Examples:

ORIGIN $0801
ORIGIN $C000
ORIGIN startAddress

PEEK

Reads byte from memory location.

For operating with offsets the address parameter must be an absolute WORD variable in the zero page.

Syntax:

<dest> = PEEK <address>[<offset>]

Examples:

value = PEEK $D020
char = PEEK screenPtr[index]
data = PEEK buffer[5]
byte = PEEK pointer

PEEKW

Reads word (16-bit) from memory location at address.

For operating with offsets the address parameter must be an absolute WORD variable in the zero page.

Syntax:

<dest> = PEEKW <address>[<offset>]

Examples:

reset_addr = PEEKW $FFFE

WORD buffer @ $fd
offset_val = PEEKW buff_ptr[10]

WORD pointer
val = PEEKW pointer

POINT

Sets pointer variable to address of target.

Syntax:

POINTER <ptrvar> TO <target>

Examples:

POINTER screenPtr TO $0400
POINTER buff_ptr TO buffer // buffer might be a label to some data
POINTER funcPtr TO myFunction

POKE

Writes byte to memory location.

For operating with offsets the address parameter must be an absolute WORD variable in the zero page.

Syntax:

POKE <address>[<offset>] WITH <value>

Examples:

POKE $D020 WITH 0
POKE screenPtr[index] WITH char
POKE buffer[5] WITH data
POKE pointer WITH value

POKEW

Writes word (16-bit) to memory location.

For operating with offsets the address parameter must be an absolute WORD variable in the zero page.

Syntax:

POKEW <address>[<offset>] WITH <value>

Examples:

POKEW $0314 WITH handler
POKEW dataPtr[0] WITH value
POKEW buffer[10] WITH address

SUBEND

Returns from subroutine.

Syntax:

SUBEND

or

EXIT

Examples:

LABEL subroutine
    counter = counter + 1
    SUBEND

LABEL checkValue
    IF value = 0
        EXIT
    ENDIF
    process(value)
    SUBEND

SUBTR

Subtracts second value from first.

Syntax:

<dest> = <param1> - <param2>

Examples:

result = 100 - 5
difference = end - start
remaining = total - used

SWITCH

Multi-way branching based on variable value comparison.

Features implicit breaks (automatic jump to ENDSWITCH after each case), supports nesting, and works with BYTE and WORD types.

Syntax:

SWITCH <variable>
  CASE <value>
    [statements]
  [CASE <value>
    [statements]]
  [DEFAULT
    [statements]]
ENDSWITCH

Notes:

  • Each CASE automatically breaks (jumps to ENDSWITCH) after execution
  • CASE values can be literals, constants, or variables
  • DEFAULT branch is optional and executes when no CASE matches
  • DEFAULT must come after all CASE statements
  • Only one DEFAULT per SWITCH
  • BYTE variables can only be compared with values 0-255
  • Can use #PRAGMA _P_USE_LONG_JUMP 1 for large switch statements
  • Nested SWITCH statements are supported

Examples:

// Basic switch with default
SWITCH status
  CASE 1
    result = 10
  CASE 2
    result = 20
  DEFAULT
    result = 0
ENDSWITCH

// Switch with constants
BYTE CONST MAX = 100
SWITCH value
  CASE MAX
    overflow = 1
  CASE 50
    halfway = 1
ENDSWITCH

// WORD switch
WORD big_val
SWITCH big_val
  CASE 1000
    mode = 1
  CASE 5000
    mode = 2
  DEFAULT
    mode = 0
ENDSWITCH

// Nested switch
SWITCH outer
  CASE 1
    result = 1
  CASE 2
    SWITCH inner
      CASE 10
        result = 20
      CASE 20
        result = 40
    ENDSWITCH
  DEFAULT
    result = 0
ENDSWITCH

// Using variables in CASE
BYTE threshold1
BYTE threshold2
LET threshold1 = 50
LET threshold2 = 100
SWITCH temperature
  CASE threshold1
    fan_speed = 1
  CASE threshold2
    fan_speed = 2
  DEFAULT
    fan_speed = 0
ENDSWITCH

WEND

Terminates WHILE loop.

Syntax:

See WHILE

WHILE

Loop that continues while condition is true.

When single parameter: 0 = false, non-zero = true

Syntax:

WHILE <param1> [<operator> <param2>]

Operators: = == <> != > < >= <=

Examples:

WHILE counter < 100
    counter++
    result = result + counter
WEND

WHILE running
    processFrame
    checkInput
WEND

WHILE x != y
    x++
WEND

WORD

Declares a 16-bit variable or constant.

Syntax:

WORD <varname>
WORD <varname> = <value>
WORD <varname> = "<string>"
WORD <varname> @ <address>
WORD CONST <varname> = <value>

Examples:

WORD counter
WORD address = $C000
WORD message = "Hello"
WORD irqVector @ $0314
WORD CONST SCREEN = $0400

XOR

Bitwise XOR operation between two values.

Syntax:

<dest> = <param1> ^ <param2>

Examples:

result = value ^ $FF
output = byte1 ^ byte2
toggleBits = flags ^ mask