Added initial documentation
This commit is contained in:
parent
1617297067
commit
fe3d122258
2 changed files with 1112 additions and 0 deletions
631
commands.md
Normal file
631
commands.md
Normal file
|
|
@ -0,0 +1,631 @@
|
|||
# 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>([<param1>,[<param2>,...]])
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
initialize
|
||||
setColor(1,14)
|
||||
drawSprite(xpos,ypos,@spriteData)
|
||||
process("hello",42,myvar)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## DEC
|
||||
|
||||
Decrements a variable or memory location by 1.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
<var>--
|
||||
DEC <target>
|
||||
DECREMENT <target>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
counter--
|
||||
lives--
|
||||
index--
|
||||
DEC $D020
|
||||
DECREMENT screenColor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ELSE
|
||||
|
||||
Alternative branch in IF statement.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
See IF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ENDIF
|
||||
|
||||
Terminates IF block.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
See IF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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 status & $80
|
||||
errorFlag = 1
|
||||
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.
|
||||
|
||||
**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.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
<dest> = PEEKW <address>[<offset>]
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
addr = PEEKW $FFFE
|
||||
value = PEEKW dataPtr[0]
|
||||
word = PEEKW buffer[10]
|
||||
address = PEEKW pointer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## POINT
|
||||
|
||||
Sets pointer variable to address of target.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
POINTER <ptrvar> TO <target>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
POINTER screenPtr TO $0400
|
||||
POINTER dataPtr TO buffer
|
||||
POINTER funcPtr TO myFunction
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## POKE
|
||||
|
||||
Writes byte to memory location.
|
||||
|
||||
**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.
|
||||
|
||||
**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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
```
|
||||
481
syntax.md
Normal file
481
syntax.md
Normal file
|
|
@ -0,0 +1,481 @@
|
|||
# Syntax Reference
|
||||
|
||||
## Comments
|
||||
|
||||
C65GM uses C-style line comments.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
// <comment text>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
BYTE counter = 0 // Initialize counter
|
||||
// This is a full line comment
|
||||
FOR i = 0 TO 10 // Loop through values
|
||||
counter++ // Increment
|
||||
NEXT
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Comments start with `//` and continue to end of line
|
||||
- Comments in ASM blocks use assembly syntax: `;`
|
||||
- Comments in SCRIPT blocks use Starlark syntax: `#`
|
||||
|
||||
---
|
||||
|
||||
## Preprocessor Directives
|
||||
|
||||
### #DEFINE
|
||||
|
||||
Defines a text substitution macro.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#DEFINE <n> [= <value>]
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#DEFINE MAX_SPEED = 10
|
||||
#DEFINE SCREEN = $0400
|
||||
#DEFINE OFFSET = 255
|
||||
#DEFINE BASE+DELTA = $D000+32
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Optional `=` separator
|
||||
- Value can contain previously defined macros
|
||||
- Macros are expanded in source lines
|
||||
- Case sensitive
|
||||
|
||||
---
|
||||
|
||||
### #UNDEF
|
||||
|
||||
Undefines a previously defined macro.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#UNDEF <n>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#DEFINE DEBUG = 1
|
||||
#UNDEF DEBUG
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### #IFDEF
|
||||
|
||||
Conditional compilation if macro is defined.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#IFDEF <n>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#IFDEF DEBUG
|
||||
BYTE debugFlag = 1
|
||||
#IFEND
|
||||
|
||||
#IFDEF PAL
|
||||
BYTE scanlines = 312
|
||||
#IFEND
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### #IFNDEF
|
||||
|
||||
Conditional compilation if macro is not defined.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#IFNDEF <n>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#IFNDEF __INCLUDED_SPRITE_LIB
|
||||
#DEFINE __INCLUDED_SPRITE_LIB = 1
|
||||
FUNC drawSprite
|
||||
; sprite code
|
||||
FEND
|
||||
#IFEND
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Common pattern for include guards
|
||||
- Prevents multiple inclusion
|
||||
|
||||
---
|
||||
|
||||
### #IFEND
|
||||
|
||||
Ends conditional compilation block.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#IFEND
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
See #IFDEF and #IFNDEF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### #INCLUDE
|
||||
|
||||
Includes another source file.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#INCLUDE <filename>
|
||||
#INCLUDE <libfile>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#INCLUDE sprites.c65
|
||||
#INCLUDE lib/math.c65
|
||||
#INCLUDE "constants.c65"
|
||||
#INCLUDE <stdlib.c65>
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Relative path: resolves relative to current file
|
||||
- Angle brackets `<file>`: searches in library path defined by C65LIBPATH environment variable
|
||||
- Supports nested includes
|
||||
- Use with #IFNDEF for include guards
|
||||
|
||||
---
|
||||
|
||||
### #PRINT
|
||||
|
||||
Prints message during compilation.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#PRINT <message>
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#PRINT Compiling main module
|
||||
#PRINT MAX_VALUE
|
||||
#PRINT Debug build enabled
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Useful for debugging preprocessor
|
||||
- Macros expanded before printing
|
||||
|
||||
---
|
||||
|
||||
### #HALT
|
||||
|
||||
Stops compilation immediately.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#HALT
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#IFDEF INCOMPLETE
|
||||
#PRINT Feature not implemented
|
||||
#HALT
|
||||
#IFEND
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Halts entire compilation process, not just preprocessing
|
||||
- Returns exit code 2
|
||||
|
||||
---
|
||||
|
||||
### #PRAGMA
|
||||
|
||||
Sets compiler pragmas (options).
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
#PRAGMA <n> [<value>]
|
||||
```
|
||||
|
||||
**Available Pragmas:**
|
||||
|
||||
**_P_USE_LONG_JUMP**
|
||||
- Uses JMP instead of branch instructions for IF/WHILE/FOR
|
||||
- Needed when branch targets exceed 127 byte range
|
||||
- Value: any non-zero value enables
|
||||
|
||||
**_P_USE_IMMUTABLE_CODE**
|
||||
- Prevents self-modifying code generation
|
||||
- Required for ROM-based code
|
||||
- Errors on PEEK/POKE/GOSUB with variable addresses
|
||||
|
||||
**_P_USE_CBM_STRINGS**
|
||||
- Encodes strings in CBM PETSCII format
|
||||
- Default: ASCII encoding
|
||||
- Value: any non-empty value enables
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
#PRAGMA _P_USE_LONG_JUMP 1
|
||||
#PRAGMA _P_USE_IMMUTABLE_CODE 1
|
||||
#PRAGMA _P_USE_CBM_STRINGS 1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Code Blocks
|
||||
|
||||
### ASM...ENDASM
|
||||
|
||||
Inline assembly code block.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
ASM
|
||||
<assembly code>
|
||||
ENDASM
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
ASM
|
||||
lda #$00
|
||||
sta $d020
|
||||
jsr $ffd2
|
||||
ENDASM
|
||||
|
||||
BYTE temp = 5
|
||||
ASM
|
||||
lda temp
|
||||
clc
|
||||
adc #10
|
||||
sta temp
|
||||
ENDASM
|
||||
|
||||
FUNC calculate(value)
|
||||
BYTE local = 10
|
||||
ASM
|
||||
lda |local| ; Reference local variable
|
||||
clc
|
||||
adc value
|
||||
sta |local|
|
||||
ENDASM
|
||||
FEND
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Assembly code passed through to ACME assembler unchanged
|
||||
- Can reference global variables by name
|
||||
- Local variables inside FUNC must use `|varname|` syntax
|
||||
- Comments in ASM blocks use `;` (assembly syntax)
|
||||
- No macro expansion inside ASM blocks
|
||||
|
||||
---
|
||||
|
||||
### SCRIPT...ENDSCRIPT
|
||||
|
||||
Starlark script code block for generating assembly code.
|
||||
|
||||
Scripts are written in Starlark (Python-like language) and executed at compile time. Output from `print()` statements is fed directly into the assembler.
|
||||
|
||||
**Syntax:**
|
||||
```
|
||||
SCRIPT
|
||||
<starlark code>
|
||||
ENDSCRIPT
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
|
||||
**Simple data generation:**
|
||||
```
|
||||
SCRIPT
|
||||
for i in range(256):
|
||||
print(" !byte %d" % i)
|
||||
ENDSCRIPT
|
||||
```
|
||||
|
||||
**Sine table generation:**
|
||||
```
|
||||
SCRIPT
|
||||
import math
|
||||
print("sintable:")
|
||||
for i in range(256):
|
||||
angle = (i * 2.0 * math.pi) / 256.0
|
||||
sine = math.sin(angle)
|
||||
value = int((sine + 1.0) * 127.5)
|
||||
print(" !byte %d" % value)
|
||||
ENDSCRIPT
|
||||
```
|
||||
|
||||
**Using compiler variables:**
|
||||
```
|
||||
BYTE tableSize = 64
|
||||
|
||||
SCRIPT
|
||||
# Reference variables in generated assembly
|
||||
print("lookup:")
|
||||
for i in range(64):
|
||||
print(" !byte %d" % (i * 2))
|
||||
print(" ; Table size is stored in |tableSize|")
|
||||
ENDSCRIPT
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Scripts use Starlark language (Python-like subset)
|
||||
- Comments in SCRIPT blocks use `#` (Python syntax)
|
||||
- Output from `print()` goes directly to assembler
|
||||
- Can reference compiler variables using `|varname|` syntax
|
||||
- Math module available: `import math`
|
||||
- Maximum 1 million execution steps (prevents infinite loops)
|
||||
- Executed at compile time, not runtime
|
||||
|
||||
---
|
||||
|
||||
## Expression Syntax
|
||||
|
||||
Expressions evaluate left to right with no operator precedence.
|
||||
|
||||
### Number Formats
|
||||
|
||||
**Decimal:**
|
||||
```
|
||||
123
|
||||
0
|
||||
255
|
||||
65535
|
||||
```
|
||||
|
||||
**Hexadecimal ($-prefix):**
|
||||
```
|
||||
$FF
|
||||
$D020
|
||||
$C000
|
||||
$00
|
||||
```
|
||||
|
||||
**Binary (%-prefix):**
|
||||
```
|
||||
%11111111
|
||||
%10000000
|
||||
%00000001
|
||||
%11110000
|
||||
```
|
||||
|
||||
### Operators
|
||||
|
||||
Evaluated strictly left to right:
|
||||
|
||||
- `+` Addition
|
||||
- `-` Subtraction
|
||||
- `*` Multiplication
|
||||
- `/` Division
|
||||
- `|` Bitwise OR
|
||||
- `&` Bitwise AND
|
||||
|
||||
### Constants
|
||||
|
||||
Named constants defined with BYTE CONST or WORD CONST:
|
||||
|
||||
```
|
||||
BYTE CONST MAX_SPEED = 10
|
||||
WORD CONST SCREEN = $0400
|
||||
|
||||
speed = MAX_SPEED
|
||||
pointer = SCREEN
|
||||
```
|
||||
|
||||
### Expression Examples
|
||||
|
||||
```
|
||||
value = 100+50
|
||||
result = $FF-10
|
||||
address = $D000+32
|
||||
mask = %11110000&$0F
|
||||
combined = base|offset
|
||||
calculated = start+length*2
|
||||
```
|
||||
|
||||
**Critical:** No operator precedence. Evaluation is strictly left to right:
|
||||
```
|
||||
result = 2+3*4 ; evaluates as (2+3)*4 = 20, not 2+(3*4) = 14
|
||||
value = $10|$20&$0F ; evaluates as ($10|$20)&$0F, not $10|($20&$0F)
|
||||
```
|
||||
|
||||
### Usage Contexts
|
||||
|
||||
Expressions accepted anywhere a numeric literal is expected:
|
||||
|
||||
**Variable initialization:**
|
||||
```
|
||||
BYTE count = 10+5
|
||||
WORD addr = $C000+$100
|
||||
```
|
||||
|
||||
**Absolute addresses:**
|
||||
```
|
||||
BYTE screen @ $0400+40*10
|
||||
INC $D000+20
|
||||
```
|
||||
|
||||
**Command parameters:**
|
||||
```
|
||||
FOR i = 0 TO MAX_VALUE-1
|
||||
IF x > THRESHOLD+10
|
||||
POKE $D020+offset WITH value
|
||||
result = PEEK $0400+index
|
||||
```
|
||||
|
||||
**Arithmetic operations:**
|
||||
```
|
||||
sum = value1+value2
|
||||
product = base*factor
|
||||
adjusted = original+OFFSET
|
||||
```
|
||||
|
||||
### Limitations
|
||||
|
||||
**No parentheses for grouping:**
|
||||
```
|
||||
; NOT SUPPORTED:
|
||||
result = (a+b)*c
|
||||
value = base+(offset*2)
|
||||
```
|
||||
|
||||
**No nested expressions in assignments:**
|
||||
```
|
||||
; NOT SUPPORTED:
|
||||
x = y + z ; only single value or constant expression
|
||||
x = a+b ; constant expression (no spaces) OK if a,b are constants
|
||||
```
|
||||
|
||||
**Workaround for complex expressions:**
|
||||
Use temporary variables:
|
||||
```
|
||||
temp = a + b
|
||||
result = temp * c
|
||||
```
|
||||
|
||||
### Constant Expressions
|
||||
|
||||
Expressions without spaces are treated as constant expressions:
|
||||
```
|
||||
value = 100+50 ; OK - constant expression
|
||||
value = 100 + 50 ; ERROR - not a simple assignment
|
||||
value = MAX+10 ; OK if MAX is constant
|
||||
```
|
||||
Loading…
Reference in a new issue