Please read this page from the main YASEP interface
Assembly language template text
version : 2011-09-15 (OK)

The assembly language of the YASEP

Introduction

This page describes the YASEP's JavaScript assembler (the code that translates the textual instructions into binary code) and the language conventions (syntax) used when writing software for the YASEP. For informations about specific instructions, see the opcode map.

This page covers the following points :

Architecture

The YASEP's assembler is split into two layers :

Anatomy of an instruction

An instruction is the basic unit of software, like an atom.
* For the YASEP, it is a 16-bit or 32-bit word that contains several fields that describe what to do with what.
* For the assembler, an instruction is a line containing all these informations in readable, symbolic form.

An instruction typically contains

The binary structure of the instruction is explained there.

Instruction-level assembly

The YASEP's instructions are quite simple but they are not always practical, so some opcodes introduce a few modifications, as indicated by opcode flags (internal properties of the opcodes, listed here). They are usually harmless and don't impact the architecture, but they make the instructions more handy, thus helping writing/reading programs easily.

The assembler uses these flags when transforming the source text into binary codes. They keep the source code readable and coherent, independently from any hardware tricks, exceptions or processor versions.

The assembly language's goal is to hide the architectural details from the mind of the software developper. He should only remember a few rules :

Input processing

and that's all there is to say about the subject of "input syntax".

Number formatting

The numbers are accepted in 3 formats :

Numbers are mostly used in contexts where the number of significant bits is bounded to the size of the container (usually, the immediate fields of instructions). When too many digits are given, the assembler keeps only the desired number of LSB, and discards the MSB. The following example shows how the number is truncated : db 1234h.

Note : the disassembler always uses hexadecimal as output format.

Pseudo-instructions

The ability to output arbitrary numbers is critical for many uses so the assembler has the following three pseudo-instructions :

An unbounded number of litteral numbers is accepted, the limit depends on the JavaScript engine, not on the assembler's design. The interactive assembler will not display all the digits when more than 32 bits are given but they are available through software, by defining the emit_bin() function.

results: 
(error messages)
 

The ability to include ASCII strings is still missing at this time of writing.

Core datapath width

Since 2008-08, the YASEP exists in 16-bit and 32-bit variants. The opcodes don't change but a few of them are pointless in 16-bit mode or 32-bit mode. The source code can specify that a certain width is used so a warning is issued when an invalid instruction (depending on the CPU) is assembled.

YASEP16 specifies that the targetted CPU has a 16-bit datapath. All 32-bit only instructions generate a warning.

YASEP32 specifies that the targetted CPU has a 32-bit datapath. All 16-bit only instructions generate a warning.

YASEP resets the target CPU to generic/undefined.

These pseudo-instructions don't generate any code and can be used in any order, as they simply control an internal flag. This flag is compared with each instruction's flag (see YASEP32_ONLY and YASEP16_ONLY).

Reserved symbols

The instruction-level assembler recognizes the following symbols, and rejects anything else :

Aliases

The assembler eases instruction coding (letting the programer think about what to do, while caring about how to do it) with two types of aliases : form aliases (see ALIAS_RR) and instruction aliases (they are listed under the opcode map). This section is about instruction aliases.

Internally, they can be used like normal instructions, but they provide different forms and/or different semantics. However, they use real opcodes of other instructions.

The substitution is handled at the assembly level and the disassembler probably won't infer the originally assembled alias. So don't be surprised if instructions like NOT or NEG assemble correctly, but the disassembly returns a different opcode.

Instruction Forms and flags

Despite the very simple instruction format, the assembly language instructions appear with several different forms. This is due usually to reasons like :

  • The instruction does not make sense with one form, for example HALT does not need an immediate field.
  • The assembly language must be easy to read and understand, hence some fields are written in a different order internally.
  • The various instructions forms are described in the forms page.

    The flags are listed in their own page too.

    Default values

    Normally, all uninitialized data, fields or values are cleared (zero).

    However, when certain instruction fields are not used (by FORM_ALONE or FORM_R...), these fields could be set to values chosen by the assembler, for the purpose of power reduction.

    Toggle minimization and toggle spacing could help reduce the power consumption and EMI emissions. The YASEP's assembler will be able to compute proper values rather easily. Padding Imm16s and NOPs could be enhanced this way, too. The possible reduction is quite low, but maybe could reach a few percents when fetching instructions from external SDRAM ? An equivalent gain can come from efficient instruction coding/packing and compiler/algorithm smartness.