# Máquina de uma instrução

OISC do inglês "One instruction set computer", é uma máquina que possui apenas uma instrução, o que elimina a possibilidade de ter uma linguagem de máquina, ou seja,opcode. OISC pode ser comparada tanto um computador universal quanto uma máquina tradicional que trabalha com mais de uma instrução, então sendo assim pode realizar as mesmas tarefas do que uma máquina padrão. Existe uma classe de computadores universais com uma instrução baseada na manipulacão de bits. O modelo de memória OISC possui a mesma estrutura de memória usada em computadores tradicionais. Máquinas e aparelhos de manipulacão de bits são equivalentes aos computadores tradicionais.
O objetivo da implementação de OISC foi inicialmente para ajudar na arquitetura de um computador de ensino e também utilizada como modelo computacional na pesquisa de computação estrutural.

## Arquitetura de Máquina

Atualmente OISCs são conhecidas por serem basicamente divididas em três grandes categorias:
* Transport Triggered Architecture Machines.
* Bit Manipulating Machines.
* Arithmetic Based Turing-Complete Machines.
Transport Triggered Architecture Machines (TTA) tem como consequência a computação para transporte de dados. Normalmente alguns registros de memória com espaço de endereçamento em comum, executam uma operação quando a instrução faz referência a eles. Por exemplo, utilizando uma cópia de instruções de memória para memória em uma OISC, isto é feito pelas portas de troca de estado, que executam o cálculo e o ponteiro da instrução desvia para onde será escrito.
Bit Manipulating Machines é a parte mais simples, a cópia é chamada de BitBitJump, copia de um bit da memória e passa a execução incondicional para o endereço especificado por um dos operandos da instrução. Este processo pode ser considerado com computação universal(sendo capaz de executar qualquer algoritmo e de interpretar qualquer outra máquina universal). A cópia condicional de bits pode modificar o código que será posteriormente executado. Uma outra máquina, chamada de computador Toga, inverte o bit e passa a execução condicionalmente, dependendo do resultado da inversão.Ainda uma outra máquina que opera bits, semelhante ao BitBitJump, copia vários bits ao mesmo tempo. Neste caso o problema da universalidade computacional é resolvido, mantendo tabelas de pulos predefinidos na memória.
Arithmetic Based Turing-Complete Machines, esta usa uma operação aritmética e um pulo condicional, diferente das duas categorias anteriores, que são classificadas como comuputadores universais, esta é universal e também de Turing-Compete, cujo tem o mesmo poder de processamento de uma Máquina de Turing em sua representação abstrata. A instrução opera sobre número inteiros, que também podem ser endereços na memória. Atualmente existem várias OISCs conhecidas nesta categoria, com base em diferentes operações aritméticas como, adição (Addleq), decremento (DJN), incremento (Pleq) e subtração (Subleq). Esta é a mais antiga, mais popular e sem dúvida a mais eficiente.

## Tipos de Instruções

Opções mais utilizadas para uma única instrução:
* Subtrai e desvia se for menor ou igual a zero.
* Subtrai e desvia se for negativo.
* Subtrai e inverte, pula se pegar emprestado.
* Mover(Usado na arquitetura de transporte disparado).
* Subtrai e desvia se não for zero(SBNZ, a,b,c, destino).
Apenas uma destas instruções é utilizada em uma determinada implementação, sendo assim não há a necessidade de se ter um opcode para identificar qual instrução irá executar. A escolha da instrução não tem nenhuma influência com relação ao projeto da máquina, uma OISC é normalmente chamada após usar uma instrução, por exemplo(na OISC SBN, SUBLEQ, etc...) Cada uma das instruções acima pode ser utilizada para construir uma Máquina de Turing OISC.
Este artigo apresenta apenas instruções baseadas em subtração, as que não são de transporte disparado não fazem parte. No entanto é possível construir uma Máquina de Turing utilizando uma instrução com base em outras operações aritméticas, como a adição. Por exemplo, uma variação conhecida como DLN (Diminuir e pular se não for igual a zero) tem apenas dois operandos e usa decremento como operação de base.

## Subtrai e desvia se não for igual a zero

A instrução SBNZ a, b, c, d, subtrai o conteúdo de um endereço a partir do conteúdo que está no endereço b e armazena o resultado no endereço c, em seguida de o resultado não for igual a zero, o controle transfere para resolver d e se o resultado for igual a zero a execução prossegue para a próxima instrução que está na sequência.

## Subtrai e desvia se for menor ou igual a zero

Subleq, subtrai o conteúdo que está no endereço a, do conteúdo que está no endereço b e armazena o resultado no endereço b e em seguida se o resultado não for positivo, o controle transfere para o endereço c, se for positivo a execução prossegue para próxima instrução que está na sequência.
Pseudocódigo:
O desvio condicional, usa apenas dois operandos por instrução, mas para efetuar algumas outras operações lógicas, são necessárias mais instruções.

## Instruções Sintetizadas

É possível sintetizar muitas instruções de ordem superior usando apenas a instrução subleq. $^{:9-10}$
Desvio Incondicional:
A adição pode ser realizada, com uma ou mais subtrações, sem o uso do desvio condicional. As seguintes instruções informadas abaixo resultam no conteúdo que está no endereço a que é adicionado ao conteúdo que está no endereço b.
A primeira instrução subtrai o conteúdo do endereço a do conteúdo que está no endereço Z (que é zero) e armazena o resultado no endereço Z. A segunda instrução subtrai este resultado de b e armazena em b, este resultado agora é a soma dos conteúdos originais de a e b. A terceira instrução repõe o valor zero em Z.
Uma instrução que faz a cópia pode ser implementada de forma semelhante, as próximas instruções informadas abaixo, resultam no conteúdo do endereço b que será substituído pelo que está no endereço a, novamente assumindo que o conteúdo do endereço Z é zero.
Intrução com condição de desvio se for zero.
Subleq2, pode ser usado para sintetizar instruções mais complexas, mesmo que precise de mais operações para uma dada tarefa. No máximo dez instruções subleq2 para que se possa inverter todos os bits em um byte.

## Emulação

O programa a seguir escrito em Pseudocódigo emula a execução de subleq em OISC:
Este programa, assume que a memória é indexada por números inteiros e positivos. Consequentemente para uma instrução subleq (a, b, c) o programa interpreta a< 0, b< 0, ou executa um desvio para c< 0 como uma condição de parada. Intérpretes similares escritos em uma linguagem baseada em subleq, ou seja, auto-intérpretes, que podem utilizar códigos auto-modificados conforme o permitido pela natureza da instrução.

## Compilação

Há um compilador chamado Higher Subleq escrito por Oleg Mazonka que compila um programa simplificado em C em um código Subleq.

## Subtrai e desvia se for negativo

A intrução subneg também chamada de SBN é definida de forma semelhante a subleq: $^{:41,51-52}$
O desvio condicional pode ser suprimido ou configurado como o terceiro operando igual ao endereço da próxima instrução. Se o terceiro operando não está escrito, a supressão está implícita.

## Intruções Sintetizadas

É possível sintetizar vários tipos de instruções de ordem superior, usando apenas a instrução subneg. Para simplificar, uma situação é mostrada abaixo para ilustrar a diferença entre subleq e subneg.
Desvio Incondicional: $^{:88-89}$
c: subneg Z, Z
Onde, Z e POS são posições previamente definidas para conter zero e um número inteiro positivo, respectivamente:
O desvio condicional só é garantido se o Z contém inicialmente o número zero, ou um valor menor e inteiro armazenado em POS. Uma instrução de acompanhamento é necessária para limpar Z depois do desvio, assumindo que o conteúdo de Z deve ser mantido como zero.

## Subtrai e inverte, pula se pegar emprestado

O acumulador é subtraído da posição de memória, e a próxima instrução é ignorada se a posição de memória for menor do que o acumulador, o resultado é armazenado em ambos, no acumulador e no endereço de memória. O Program Counter é mapeado para endereço de memória 0. O acumulador é mapeado para endereço de memmória 1.

### Exemplo

Para definir o valor de x, y menos z:
* Em primeiro lugar, move Z para endereço de destino x
* Em segundo lugar executa a operação

## Transport Triggered Architecture Machines

Transport Triggered Architecture Machines, utiliza apenas mover instrução, foi originalmente chamado de "movimento de máquina". Esta instrução move o conteúdo de um endereço de memória para outro endereço de memória. $^{:42}$
A aritmética é realizada através de uma Unidade lógica e aritmética que possui memória mapeada e pulos são realizados com "Program Counter"

## Processador capaz de executar instruções subleq

-Bibliotecas para programas escritos em Assembly, SUBLEQ e um programa para demontração destes. -Intérprete subleq escrito em C. -Intérprete Jsubleq escrito em javascript.

## CPU

A versão atual do Logisim é necessária para simular a CPU. Instruções de simulação são apresentadas abaixo:
Há três "bus" principais na CPU:
A CPU tem seis sinais de controle:
Estes sinais são controlados por um programa com cinco micro-instruções que funciona num ciclo contínuo. Os sinais habilitados por cada uma destas micro-instruções são:
Input/Output é realizada através de memória mapeada I/O como o driver de I/O mapeado para o endereço 0xffffffff (-1). Se o sinal de A está ativado então lê a partir do endereço e retorna a negação do próximo carácter de entrada. Se o sinal de A não for habilitado então o valor de 0xffffffff é retornado. Escreve neste endereço e imprime o carácter obtido realizando um NOT bit a bit no valor do B bus. Este comportamento permite que as seguintes intruções de I/O sejam realizadas:
* (-1) X: adiciona o carácter de entrada para X(X -= - input)
* X (-1): saída do carácter em X (subtrai o X de 0xffffffff e em seguida realiza um NOT X, e resulta o valor original de X).
Pula para o endereço 0xffffffff (-1) desativa o sinal de clock e trava a cpu.
Simulação
Simulando a CPU:

## Bibliotecas/DEMO

Bibliotecas escritas em assembly SUBLEQ, como sqasm estão disponíveis.
Oferecem várias funções comuns:
* getint (lê um número inteiro de entrada).
* gets (lê uma string de entrada).
* putint (escreve um inteiro de saída).
* puts (escreve uma sequência de caracteres de saída).
Vários procedimentos também estão disponíveis:
* bubblesort(ordena uma sequência de carácteres).
* calc(realiza uma determinada operação em dois inteiros).
* factorial(calcula o fatorial de um número inteiro positivo).
* primes(gera e imprime uma lista de números primos).