Retrocomputação

Pra você que tá completamente por fora dessa área, me permita fazer um resumo.

Estou (ou estava, pois sou muito preguiçoso) trabalhando com um microprocessador que você já deve ter visto na página inicial do meu site, o 6502. Aqui vai um resumo maior sobre ele e sobre microprocessadores e afins:

Todo processador tem unidades de memória minúsculas, mas extremamente rápidas, chamadas registradores. No 6502 eles são o X, o Y e o A (que chamamos de acumulador). Os microprocessadores trabalham com instruções, que são ordens que mandam o microprocessador fazer alguma coisa. As primeiras que quero comentar são LDX, LDY e LDA. Cada uma coloca 1 byte determinado pelo usuário no registrador correspondente (acho que se você pensa um pouco vc consegue saber qual é pra qual). O microprocessador normalmente não estará isolado, ele terá acesso aos outros componentes do computador, e um deles é a memória. Por isso, existem as instruções para tirar o byte de um registrador e mandar pra um endereço de memória, que são STX, STY e STA. Um endereço de memória é exatamente o que parece ser: é como se fosse o número de uma casa numa rua, e cada casa guardasse 1 byte. A escrita desse tipo de código (que chamamos ASSEMBLY) depende bastante de um programa chamado... ASSEMBLER, que significa literalmente "montador"; ele pega as instruções que escrevemos e transforma elas em bytes que o microprocessador consegue entender. No Commodore 64 (imagem abaixo) usando o 64TASS (um assembler pra emulador de C64) usamos a seguinte sintaxe:

*= ${endereço de memória de 2 bytes}

Exemplo:

*= $C000

para definir, na memória, onde o código começa, pois ele fica guardado na mesma memória que os dados, então precisamos dizer aonde o código começa.

Também temos as operações aritméticas, que são apenas soma e subtração. São as instruções ADC e SBC. ADC significa Add with Carry. O que é Carry? Computadores somam números binários, normalmente nesse caso eles são de 8 bits. Quando você soma 10 + 11 em números binários, fazemos assim:

10

11

--

01

Estamos levando em conta números de 2 bits para simplificar, mas em 8 bits a lógica que veremos é a mesma.

Somamos o 0 com o 1, ambos á direita, para obter 1 como resultado á direita. Somamos 1 com 1, mas como não há 2 ou outros, o resultado acaba sendo 10, mas há um problema: o resultado ficaria 101, um número de 3 bits, algo inaceitável quando só podemos guardar 2 bits. Então usamos uma flag chamada CARRY, que ativa quando o valor resulta mais do que a máquina pode suportar.

Voltando ao assunto do ADC, ele faz a soma assim:

ACUMULADOR + VALOR + CARRY

Por isso, se quisermos uma adição correta, temos que usar a instrução CLC, que define o Carry para 0, assim a soma fica correta:

ACUMULADOR + VALOR + 0

ou

ACUMULADOR + VALOR

Já na subtração, há o contrário, no sentido de que para que ela ocorra corretamente, o CARRY deve ser 1.