mirror of
https://github.com/ksherlock/x65.git
synced 2024-12-28 19:32:25 +00:00
165 lines
4.6 KiB
Markdown
165 lines
4.6 KiB
Markdown
# x65macro.i
|
|
|
|
This is a file under macros and is intended as an example to look at for understanding macro features, it is not super tested for correctness. This information is included in the header file itself but to ease reading copied here. The macros folder also has [more detailed documentation](../macros/README.MD).
|
|
|
|
## Suffix definition
|
|
|
|
The letters after the period has the following meanings:
|
|
- b: byte
|
|
- w: word (2 bytes)
|
|
- t: triple (3 bytes)
|
|
- l: long (4 bytes)
|
|
- n: number of bytes in value
|
|
- c: copy result to target
|
|
- i: immediate, for example add a value to the contents of an address
|
|
- x: use the x register for operation as a counter or an offset
|
|
- y: use the y register for operation
|
|
- r: relative; ry=(zp),y
|
|
- a: use the contents of an address for operation (16 bits)
|
|
- s: custom step size (instead of +1 or -1) for loops
|
|
- p: positive
|
|
- m: negative
|
|
- o: use label pool for counter
|
|
|
|
## operations
|
|
|
|
The base operations provided by these macros are:
|
|
|
|
- set: Assign a value to the contents of an address
|
|
- move: Move the contents of an address to another address
|
|
- add: addition
|
|
- sub: subtraction
|
|
- asrm: arithmetic shift right
|
|
- aslm: arithmetic shift left
|
|
- neg: negate a number
|
|
- abs: make a number positive
|
|
- copy: copy memory from one location to another
|
|
- for: iterate between two numbers with optional step size
|
|
- mnop: insert multiple nop at this point
|
|
|
|
set.b / .w / .t / .l Value, Target
|
|
- set the contents of an 1-4 byte location to a value
|
|
- uses accumulator
|
|
|
|
move.b / .w / .t / .l / .n Src,Trg
|
|
- copy 1-4 (or n) bytes from Src location to Trg location
|
|
- uses accumulator
|
|
|
|
asrm.n Target, Size
|
|
- shift a signed multi byte number right
|
|
- uses accumulator
|
|
|
|
asrm.nx Target, Size
|
|
- shift a signed multi byte number right offset by the x register
|
|
- no registers touched
|
|
|
|
aslm.n Target, Size
|
|
- shift a multi byte number left
|
|
- no registers touched
|
|
|
|
aslm.nx Target, Size
|
|
- shift a multi byte number left offset by the x register
|
|
- no registers changed
|
|
|
|
neg.cn Source, Target, Size
|
|
- negate and copy a multi byte number
|
|
- uses accumulator
|
|
|
|
neg.n Target, Size
|
|
- negate a number in place
|
|
- uses accumulator
|
|
|
|
abs.n Trg, Size
|
|
- make a number absolute
|
|
- uses accumulator
|
|
|
|
neg.nx Trg, Size
|
|
- negate a number in place offset by the x register
|
|
- uses accumulator
|
|
|
|
add.n Address1, Address2, Target, Bytes
|
|
- add contents of two memory locations into a target lcoation
|
|
- uses accumulator
|
|
|
|
sub.n Address1, Address2, Target, Bytes
|
|
- Target = Address1 - Address2
|
|
- uses accumulator
|
|
|
|
add.ni Address, Value, Target, Bytes
|
|
- add a fixed value to a memory location into a target
|
|
- uses accumulator
|
|
|
|
sub.ni Address, Value, Target, Bytes
|
|
- Target = Address - Value
|
|
- uses accumulator
|
|
|
|
add.wi Address, Value, Target
|
|
- Subtract 16 bit Value from contents of Address and store at Target
|
|
- uses accumulator
|
|
|
|
sub.wi Address1, Address2, Target
|
|
- add contents of two 16 bit addresses into a target 16 bit location
|
|
- uses accumulator
|
|
|
|
mnop Count
|
|
- add Count nops
|
|
|
|
copy.x Source, Target, Size
|
|
- copy up to 256 bytes using the x register as a counter
|
|
- uses accumulator and x register
|
|
|
|
copy.y Source, Target, Size
|
|
- copy up to 256 bytes using the y register as a counter
|
|
- uses accumulator and y register
|
|
|
|
copy.ry zpSrcPtr,zpTrgPtr,Size
|
|
- copy a fixed length buffer using relative zp y indexing
|
|
- size is up to a page, changing Y and A
|
|
|
|
copy.ry128 zpSrcPtr,zpTrgPtr,Size
|
|
- copy up to 128 bytes using the y register
|
|
|
|
copy.o Src,Trg,Size,PoolZP
|
|
- copy more than 256 bytes using zero page label pool addresses
|
|
- uses accumulator, x and y register
|
|
|
|
copy.a Src,Trg,Size
|
|
- copy more than 256 bytes using absolute indexed in a loop
|
|
- uses accumulator, x and y register
|
|
|
|
copy.zp Src,Trg,Size,zpTmp1,zpTmp2
|
|
- copy more than 256 bytes using two pairs of zero page values
|
|
- uses accumulator, x and y register
|
|
|
|
for.x Start, End
|
|
- iterate using the x register from Start to End, End is not inclusive
|
|
so to iterate from 31 to 0 use for.x 31, -1
|
|
- uses x register
|
|
- end for loop with forend macro
|
|
|
|
for.y Start, End
|
|
- same as for.x but with the y register
|
|
- uses y register
|
|
- end for loop with forend macro
|
|
|
|
for.w Start, End, Counter
|
|
- for loop for 16 bit counter
|
|
- uses accumulator
|
|
- end for loop with forend macro
|
|
|
|
for.ws Start, End, Counter, Step
|
|
- for loop for 16 bit counter with a step value
|
|
- uses accumulator
|
|
- end for loop with forend macro
|
|
|
|
for.wsp Start, End, Counter, Step {
|
|
- for (word Counter=start; Counter<end; Counter += Step), Step>0
|
|
- uses accumulator
|
|
|
|
for.wsm Start, End, Counter, Step {
|
|
- for (word Counter=start; Counter<end; Counter += Step), Step<0
|
|
- uses accumulator
|
|
|
|
forend
|
|
- terminates for loops
|