Opcodes list
All opcodes are listed here, with time execution (number of cycles) and arguments details.
A argument is either :
- a label
- a constant (cst)
- a variable (var)
- a variable indexed by a constant (var[cst] - notes that myVar[0] is equivalent to myVar)
- a variable indexed by another variable (var[var])
- a variable indexed by another variable and a constant (var[var+cst])
- a value at a specified offset ([index])
Argument usage is described by these code :
roArgX : means a argument accessed read-only (cst, var, var[cst], var[var], [index])
rwArgX : means a argument accessed read/write (var, var[cst], var[var], [index])
Opcode | Usage | Nb cycles | Description |
push | push roArg0 | 3 | Push (put) roArg0 on the top of the stack |
pop | pop rwArg0 | 4 | Pop (remove) value on the top of the stack and store in rwArg0 |
mov | mov rwArg0, roArg1 | 1 | Copy value of roArg1 in rwArg0 |
lea | lea rwArg0, roArg1 | 2 | Copy offset of roArg1 in rwArg0 |
add | add rwArg0, roArg1 | 2 | Add roArg1 with rwArg0 and store in rwArg0 |
sub | sub rwArg0, roArg1 | 2 | Substract roArg1 to rwArg0 and store in rwArg0 |
neg | neg rwArg0 | 1 | Reverse (opposite sign) rwArg0 and store in rwArg0 |
inc | inc rwArg0 | 1 | Increment rwArg0 and store in rwArg0 |
dec | dec rwArg0 | 1 | Decrement rwArg0 and store in rwArg0 |
xchg | xchg rwArg0, rwArg1 | 3 | Exchange rwArg0 and rwArg1 values |
mul | mul rwArg0, rwArg1 | 8 | Multiply rwArg0 and roArg1 and store in rwArg0 |
div | div rwArg0, rwArg1 | 16 | Divide rwArg0 by roArg1 and store in rwArg0 |
abs | abs rwArg0 | 2 | Compute the absolute value of rwArg0 and store in rwArg0 |
round | round rwArg0 | 4 | Round rwArg0 and store in rwArg0 |
floor | floor rwArg0 | 4 | Compute the integer part of rwArg0 and store in rwArg0 |
ceil | ceil rwArg0 | 4 | Compute the integer just greater than rwArg0 and store in rwArg0 |
rand | rand rwArg0 | 3 | Store in rwArg0 a random number in range 0.0 to 1.0 |
sqrt | sqrt rwArg0 | 20 | Compute the square root of rwArg0 and store in rwArg0 |
sqr | sqr rwArg0 | 6 | Compute the square of rwArg0 and store in rwArg0 |
exp | exp rwArg0 | 64 | Compute Euler's number e raised to the power of rwArg0 and store in rwArg0 |
log | log rwArg0 | 80 | Compute the natural logarithm (base e) of rwArg0 and store in rwArg0 |
pow | pow rwArg0, roArg1 | 64 | ompute the value of rwArg0 raised to the power of roArg1 and store in rwArg0 |
cos | cos rwArg0 | 96 | Compute the trigonometric cosine of rwArg0 (measured in degree) and store in rwArg0 |
sin | sin rwArg0 | 96 | Compute the trigonometric sine of rwArg0 (measured in degree) and store in rwArg0 |
tan | tan rwArg0 | 128 | Compute the trigonometric tangent of rwArg0 (measured in degree) and store in rwArg0 |
jmp | jmp label | 1 | Jump to specified label |
je | je label | 1 | Jump to specified label if last cmp result was equal |
jne | jne label | 1 | Jump to specified label if last cmp result was not equal |
jnge | jnge label | 1 | Jump to specified label if last cmp result was not equal and not greater |
jle | jle label | 1 | Jump to specified label if last cmp result was equal or lower |
jl | jl label | 1 | Jump to specified label if last cmp result was lower |
jng | jng label | 1 | Jump to specified label if last cmp result was not greater |
jg | jg label | 1 | Jump to specified label if last cmp result was greater |
jnle | jnle label | 1 | Jump to specified label if last cmp result was not equal and not lower |
jnl | jnl label | 1 | Jump to specified label if last cmp result was not lower |
call | call label | 4 | Jump to specified label and set push the current position on the stack |
ret | ret ret roArg0 |
4 | Return to position stored on the top of the stack, and optionnaly pop roArg0 value of the stack |
cmp | cmp roArg0, roArg1 | 4 | Compare roArg0 and roArg1, and update flags equal, lower and greater |
drive | drive roArg0 | 40 | Update the wanted direction (degree) |
speed | speed roArg0 | 40 | Update the wanted speed (m/s) |
fire | fire roArg0, roArg1 | 200 | Fire a missile in roArg0 direction (degree), at range roArg1 (m) |
scan | scan rwArg0, roArg1, roArg2 | 200 | Scan in roArg1 direction (degree), with roArg2 precision (degree), and store the result (first bot found) in rwArg0 (m) |
open | open roArg0, roArg1 | 20 | Open the chan roArg0 for sending radio data, for bot roArg1. If roArg1 = 1 then all bot will receive the message. Reopening a chan previously opened which wasn't close will result in erasing all writed value |
write | write roArg0, roArg1 | 4 | Write on the chan roArg0 the value roArg1 The chan must have been open before |
close | close roArg0 | 40 | Close the chan roArg0 and send all data writed since the chan is opened to bots |
read | read roArg0, rwArg1 | 6 | Try to read a value on the chan roArg0. If a value is read, write it to rwArg1 else rwArg1 is not changed |