# µbe;

## Introdução e sintaxe geral

Microbe compila programas escritos na linguagem personalizada para PICs, como um programa complementar ao &ktechlab;. A sintaxe foi projetada para se adequar a um programa &flowcode;. A sintaxe para executar `microbe` a partir da linha de comando é:

    microbe [options] [input.microbe] [output.asm]

onde as opções são:

- `--show-source` - Coloca cada linha do código-fonte como um comentário na saída de montagem antes das próprias instruções de montagem para essa linha.

- `--no-optimize` - Impede a otimização das instruções geradas a partir do código-fonte. A otimização geralmente é segura, portanto, esta opção é usada principalmente para depuração.

O arquivo de entrada .microbe deve identificar o PIC alvo inserindo o nome do PIC no início do arquivo .microbe; ⪚, o nome de um PIC16F84 é "P16F84".

### Programa µbe; simples e completo

    P16F84

    a = 0
    repeat
    {
            PORTA = a
            a = a + 1
    }
    until a == 5

    end

### Convenções de nomenclatura

As seguintes regras aplicam-se aos nomes e rótulos das variáveis:

- Eles só podem conter caracteres alfanuméricos [a..z][A..Z][0..9] e o sublinhado "_".

- Eles diferenciam maiúsculas de minúsculas.

- Eles não podem começar com um número.

- Eles não devem começar com __ (sublinhado duplo), pois isso é reservado para uso pelo compilador.

### Convenções do uso de chaves

As chaves, {}, indicam o início e o fim de um bloco de código. Elas podem aparecer em qualquer lugar antes do início e depois do fim do bloco de código. Exemplos de blocos de código aceitáveis:

    statement1 {
            algum código
    }

    statement2 {
            outro código }

    statement3
    {
            outro código
    }

    statement5 {
            bloco de código
    } statement6

### Comentando

Comentar é semelhante a C. // comenta o resto da linha. /* e */ denotam um comentário de várias linhas.

    // Isto é um comentário
    x = 2
    /* E isto é um
    comentário em várias linhas */

### Estrutura do programa

O ID PIC deve ser inserido no início do programa. O fim do programa principal é indicado por end. As sub-rotinas devem ser colocadas após end.

### Sub-rotinas

Uma sub-rotina pode ser chamada de qualquer lugar no código. Sintaxe:

    sub SubNome
    {
            // Código...
    }

A sub-rotina é chamada com call `SubNome`.

## Referência da linguagem µbe;

### if

Ramificação condicional. Sintaxe:

    if [expressão] then [declaração]

ou

    if [expressão] then
    {
            [bloco de declarações]
    }

Da mesma forma para else:

    else [declaração]

ou

    else
    {
            [bloco da declaração]
    }

#### if

    if porta.0 is high then
    {
            delay 200
    }
    else
    {
            delay 300
    }

### alias

Atribui um nome alternativo (apelido ou alias) a uma string. Sintaxe:

    alias [de] [para]

### repeat

Executa o bloco de instruções repetidamente até que a expressão seja avaliada como verdadeira. A avaliação da expressão é realizada após o bloco de instruções, portanto, o bloco de instruções sempre será executado pelo menos uma vez. Sintaxe:

    repeat
    {
            [bloco de declaração]
    }
    until [expressão]

### while

Semelhante ao repeat, este comando executa o bloco de instruções repetidamente. No entanto, a expressão é avaliada antes da execução, não depois. Portanto, se a expressão for avaliada como falsa na primeira execução, o bloco de instruções não será executado. Sintaxe:

    while [expressão]
    {
            [bloco de declaração]
    }

### goto

Isso faz com que a execução do código continue na próxima instrução após o rótulo especificado. Sintaxe do goto:

    goto [nome do rótulo]

Sintaxe do rótulo:

    nome do rótulo:

É frequentemente considerada uma boa prática de programação evitar o uso do goto. O uso de instruções de controle e sub-rotinas resultará em um programa muito mais legível.

#### goto

    goto MeuRotulo

    ...

    [MeuRotulo]:
    // O código continuará neste ponto

### call

Chama uma sub-rotina. Sintaxe:

    call [SubNome]

onde `SubNome` é o nome da sub-rotina a ser chamada.

### delay

Isso faz com que a execução do código seja interrompida pelo período de tempo especificado. O intervalo é em milissegundos. Sintaxe:

    delay [intervalo]

Atualmente, o µbe; assume que o PIC está operando a uma frequência de 4MHz - &ie;, cada instrução leva 1 microssegundo para ser executada. Se este não for o caso, o intervalo deve ser ajustado proporcionalmente.

### sevenseg

Isso é usado para definir o mapeamento de pinos para um display de sete segmentos (cátodo comum) conectado ao PIC. Sintaxe:

    sevenseg [nome] [a] [b] [c] [d] [e] [f] [g]

onde [a]...[g] são os pinos do PIC aos quais os respectivos segmentos do display de sete segmentos estão conectados. Os pinos podem ser escritos como PORTX.N ou RXN.

Para exibir um número no display de sete segmentos, o mapeamento dos pinos é tratado como uma variável somente de escrita.

#### Definindo e enviando dados para um display de sete segmentos

    sevenseg seg1 RB0 RB1 RB2 RB3 RB4 RB5 RB6
    seg1 = x + 2

### keypad

Isso é usado para definir o mapeamento de pinos para um teclado conectado ao PIC. Sintaxe:

    teclado [nome] [linha 1] ... [linha 4] [coluna 1] ... [coluna n]

onde [linha 1] ... [linha 4] e [coluna 1] ... [coluna n] são os pinos do PIC aos quais as respectivas linhas e colunas do teclado estão conectadas (no momento, o número de linhas não pode ser alterado). Consulte sevenseg (acima) para obter mais informações sobre mapeamentos de pinos.

As colunas do teclado devem ser conectadas ao terra através de resistores de 100k. Os pinos das linhas devem ser configurados como saídas e os pinos das colunas como entradas. Uma vez definido, o teclado é tratado como uma variável somente leitura.

#### Definindo e lendo a partir de um teclado numérico

    keypad keypad1 RB0 RB1 RB2 RB3 RB4 RB5 RB6
    x = keypad1

Por padrão, os valores retornados para um teclado numérico são:

- O valor do número se for uma tecla numérica (1 a 3 na linha superior; hexadecimal de A a D na quarta coluna e continuando para cada coluna extra).

- 253 para a tecla na linha 4, coluna 1.

- 254 para a tecla na linha 4, coluna 3.

Esses valores podem ser redefinidos usando o comando alias, onde o nome da tecla na linha x, coluna y (linhas e colunas começando em 1), é Keypad_x_y. Por exemplo, para atribuir o valor zero à tecla asterisco em um teclado numérico 4x3, o seguinte alias seria usado:

#### Atribuir um alias de uma tecla do teclado a um valor

    alias Keypad_4_1 0

## PIC I/O

### Direção da porta

A direção da porta é definida atribuindo um valor a TRIS*, onde * é a letra da porta. Por exemplo:

#### Configurando direções da porta

    TRISB = b'01111001'

O código acima define os pinos RB1, RB2 e RB7 da PORTB como saídas e os demais pinos da PORTB como entradas. Neste exemplo, b'01111001' é uma representação binária do tipo de saída. O 1 à direita representa uma saída em RB0 e o 0 à esquerda representa uma entrada em RB7.

### Porta de E/S

A porta pode ser tratada como uma variável. Por exemplo:

#### Escrevendo para uma porta

    x = PORTA

O código acima atribui o valor de PORTA à variável x.

### Pino de E/S

Cada pino em uma porta é obtido prefixando o número do pino com o nome da porta; ⪚, o pino 2 (a partir do pino 0) na PORTA é conhecido como PORTA.0. A sintaxe para definir o estado de um pino é:

    PORTAX.N = ESTADO

onde ESTADO pode ser high ou low. A sintaxe para testar o estado de um pino é:

    if PORTAX.N is ESTADO then

Combinando esses exemplos, temos:

#### Configurando e testando o estado de um pino

    TRISA = 0
    TRISB = 255
    if PORTA.3 is high then
    {
            PORTB.5 = low
    }
    else
    {
            PORTB = PORTA + 15
    }

## Variáveis

Todas as variáveis ​​são inteiros sem sinal de 8 bits, resultando em um intervalo de 0 a 255. µbe; suporta as operações unárias típicas (atuando em uma variável) e operações binárias (atuando em duas variáveis) que são suportadas pelo PIC. Além disso, µbe; também suporta divisão e multiplicação.

### Operações unárias

- rotateleft x - Rotaciona a variável x para a esquerda por transposição.

- rotateright x - Rotaciona a variável x para a direita por transposição.

- increment x - Incrementa a variável x. Se x tiver um valor de 255, então x retorna a 0.

- decrement x - Decrementa a variável x. Se x tiver um valor de 0, então x retorna ao valor 255.

### Aritmética

Operações suportadas:

- Adição: x + y

- Subtração: x - y

- Multiplicação: x * y

- Divisão: x / y

- XOR binário: x XOR y

- E binário: x AND y

- OU binário: x OR y

### Comparação

Operações suportadas:

- Igual a: x == y

- Diferente: x != y

- É maior que: x > y

- É menor que: x < y

- É maior que ou igual a: x >= y

- É menor que ou igual a: x <= y

Por exemplo:

#### Comparação

    if PORTA
    >= 5 then
    {
            ...
    }