| 
 | 1 | +This chapter documents the language features accepted by the `adafruit_pioasm`  | 
 | 2 | +assembler. The dialect is intended to be a compatible subset of the one in the  | 
 | 3 | +pico-sdk's ``pioasm`` program (which does not produce CircuitPython-compatible  | 
 | 4 | +output).  | 
 | 5 | + | 
 | 6 | +For full details, refer to the relevant chapter in the RP2040 or RP2350 datasheet.  | 
 | 7 | + | 
 | 8 | +In this informal grammar, ``<angle brackets>`` represent some text, usually a single  | 
 | 9 | +word or number. ``{curly brackets}`` represent an element that is optional.  | 
 | 10 | +``|`` represents alternatives. ``...`` indicates further arguments that are  | 
 | 11 | +explained in the official datasheet.  | 
 | 12 | + | 
 | 13 | +Lines  | 
 | 14 | +~~~~~  | 
 | 15 | + | 
 | 16 | +First, any portion of the line starting with the comment character ``;`` is removed.  | 
 | 17 | +Then, extra whitespace is removed and the line is parsed.  | 
 | 18 | + | 
 | 19 | +Each line may be:  | 
 | 20 | + * blank  | 
 | 21 | + * a directive  | 
 | 22 | + * a label  | 
 | 23 | + * an instruction, possibly with side-set and delay information  | 
 | 24 | + | 
 | 25 | +Directives  | 
 | 26 | +----------  | 
 | 27 | + | 
 | 28 | + * ``.program <identifier>``: Accepts a program name, which should be a valid Python identifier  | 
 | 29 | + * ``.pio_version <number>``: The numeric version of the PIO peripheral to target. Version 0, the default, is in the RP2040. Version 1 is in RP2350  | 
 | 30 | + * ``.origin <number>``: The required load address of the program. If specified and not ``-1``, this will be stored in ``pio_kwargs["offset"]``  | 
 | 31 | + * ``.wrap``, ``.wrap_target``: This pair of directives set the range of instructions for implicit looping, by placing values in ``pio_kwargs``  | 
 | 32 | + * ``.side_set <number> {opt}``: Controls the side-set behavior and sets ``pio_kwargs["sideset_enable"]`` and ``pio_kwargs["sideset_pin_count"]``  | 
 | 33 | + * ``.fifo <identifier>``: Sets the FIFO mode. As a CircuitPython extension, ``auto`` (the default) automatically chooses among ``txrx``, ``tx``, and ``rx`` modes  | 
 | 34 | + * ``.mov_status ...``: Controls what information the ``mov status`` instruction accesses, by placing values in ``pio_kwargs``  | 
 | 35 | + * ``.out <count> {{left|right}} {{auto}}``: Settings that control how the ``out`` instruction works, including shift direction and whether auto pull is enabled, by placing values in ``pio_kwargs``  | 
 | 36 | + * ``.in <count> {{left|right}} {{auto}}``: Settings that control how the ``in`` instruction works, including shift direction and whether auto push is enabled, by placing values in ``pio_kwargs``  | 
 | 37 | + * ``.set <count>``: Settings that control how the ``set`` instruction works, including shift direction and whether auto push is enabled, by placing values in ``pio_kwargs``  | 
 | 38 | + | 
 | 39 | +Labels  | 
 | 40 | +------  | 
 | 41 | + | 
 | 42 | + * ``<identifier>:`` creates a label which may be referred to by a ``jmp`` instruction.  | 
 | 43 | + | 
 | 44 | +Instructions  | 
 | 45 | +------------  | 
 | 46 | + | 
 | 47 | + * ``nop``  | 
 | 48 | + * ``jmp <number|name>``  | 
 | 49 | + * ``wait ...``  | 
 | 50 | + * ``in ...``  | 
 | 51 | + * ``out ...``  | 
 | 52 | + * ``push ...``  | 
 | 53 | + * ``pull ...``  | 
 | 54 | + * ``mov ...``  | 
 | 55 | + * ``mov rxfifo[y|number], isr`` (requires PIO version 1 and compatible ``.fifo`` setting)  | 
 | 56 | + * ``mov osr, rxfifo[y|number]`` (requires PIO version 1 and compatible ``.fifo`` setting)  | 
 | 57 | + * ``irq <number> {rel}``  | 
 | 58 | + * ``irq next|prev <number>``. (requires PIO version 1) adafruit_pioasm follows sdk pioasm in placing ``next`` and ``prev`` before the IRQ number. The datasheet (version 05c4754) implies a different syntax.  | 
 | 59 | + * ``set ...``  | 
 | 60 | + | 
 | 61 | +Side-set and delay  | 
 | 62 | +------------------  | 
 | 63 | +The next part of each line can contain "side-set" and "delay" information, in order.  | 
 | 64 | + | 
 | 65 | + * ``side <number>``: Set the side-set pins to ``number``  | 
 | 66 | + * ``[<number>]``: Add ``number`` extra delay cycles to this instruction  | 
 | 67 | + | 
 | 68 | +The range of these numbers depends on the count of side-set pins and whether side-set is  | 
 | 69 | +optional. If side-set is not optional, a missing ``side <number>`` is treated the same as  | 
 | 70 | +``side 0``.  | 
 | 71 | + | 
 | 72 | +Unsupported Features  | 
 | 73 | +--------------------  | 
 | 74 | + | 
 | 75 | +In places where a numeric value is needed, only a valid Python numeric literal  | 
 | 76 | +is accepted. Arithmetic is not supported.  | 
 | 77 | + | 
 | 78 | +Whitespace is not accepted in certain places, for instance within an instruction delay.  | 
 | 79 | +It must be written ``[7]`` not ``[ 7 ]``.  | 
 | 80 | + | 
 | 81 | +Extra commas that would not be acceptable to sdk pioasm are not always diagnosed.  | 
 | 82 | + | 
 | 83 | +Extra words in some locations that would not be acceptable to sdk pioasm are not always diagnosed.  | 
 | 84 | + | 
 | 85 | +CircuitPython extensions  | 
 | 86 | +------------------------  | 
 | 87 | + | 
 | 88 | +* ``.fifo auto``: By default, CircuitPython joins the TX and RX fifos if a PIO program only receives or transmits. The ``.fifo auto`` directive makes this explicit.  | 
0 commit comments