Escolar Documentos
Profissional Documentos
Cultura Documentos
https://wrkits.com.br
WR Kits
Atualizado em Agosto de 2021
1
Sumário
Lista de Figuras .............................................................................................................................. 3
Lista de Tabelas ............................................................................................................................. 5
Lista de Códigos............................................................................................................................. 6
Introdução ..................................................................................................................................... 7
Arquitetura do WRP1 .................................................................................................................... 8
Program Counter ....................................................................................................................... 8
Memory Address Register ......................................................................................................... 8
Stack 10 Levels .......................................................................................................................... 9
User Register x10 ...................................................................................................................... 9
Argument Register .................................................................................................................... 9
Instruction Register ................................................................................................................... 9
Control Unity ............................................................................................................................. 9
Flags Register ............................................................................................................................ 9
Accumulator .............................................................................................................................. 9
Arithmetic Logic Unity ............................................................................................................... 9
B Register ................................................................................................................................ 10
OUTPUT Register ..................................................................................................................... 10
INPUT/INT Register ................................................................................................................. 10
UART 9600 bps ........................................................................................................................ 10
Registradores Especiais ............................................................................................................... 11
Descrição dos Pinos ..................................................................................................................... 13
Ciclo de Busca e Execução ........................................................................................................... 16
Set de Instruções ......................................................................................................................... 17
nop – No Operation................................................................................................................. 18
lda – Load Accumulator........................................................................................................... 19
add – Adição ............................................................................................................................ 20
sub – Subtração ....................................................................................................................... 21
ldi – Load Immediate ............................................................................................................... 22
and – Lógica E .......................................................................................................................... 23
orl – Lógica OU ........................................................................................................................ 24
xor – Lógica OU Exclusivo ........................................................................................................ 25
not – Complemento de ACC .................................................................................................... 26
hlt – Halt .................................................................................................................................. 27
gta – Go To Address ................................................................................................................ 28
ifz – Desvia se Z estiver setada ................................................................................................ 29
2
Lista de Figuras
Figura 1 - Arquitetura do processador WRP1. .............................................................................. 8
Figura 2 - Registradores especiais do WRP1. .............................................................................. 11
Figura 3 – Acumulador ................................................................................................................ 11
Figura 4 - Registrador B. .............................................................................................................. 11
Figura 5 - Registrador de Instruções. .......................................................................................... 12
Figura 6 - Registrador de Argumentos. ....................................................................................... 12
Figura 7 - Registrador de Saída. .................................................................................................. 12
Figura 8 - Registrador de Entrada. .............................................................................................. 12
Figura 9 - Registrador de FLAGS. ................................................................................................. 12
Figura 10 - Pinos do processador WRP1. .................................................................................... 13
Figura 11 - Circuito mínimo para o processador WRP1. ............................................................. 15
Figura 12 - Ciclo de Busca e Execução. ........................................................................................ 16
Figura 13 - Ciclos da instrução nop. ............................................................................................ 18
Figura 14 - Ciclos da instrução lda. .............................................................................................. 19
Figura 15 - Ciclos da instrução add.............................................................................................. 20
Figura 16 - Ciclos da instrução sub. ............................................................................................. 21
Figura 17 - Ciclos da instrução ldi. ............................................................................................... 22
Figura 18 - Ciclos da instrução and.............................................................................................. 23
Figura 19 - Ciclos da instrução orl. .............................................................................................. 24
Figura 20 - Ciclos da instrução xor. ............................................................................................. 25
Figura 21 - Ciclos de instrução not. ............................................................................................. 26
Figura 22 - Ciclos da instrução hlt. .............................................................................................. 27
Figura 23 - Ciclos da instrução gta. ............................................................................................. 28
Figura 24 - Ciclos da instrução ifz. ............................................................................................... 29
Figura 25 - Ciclos da instrução ifc. ............................................................................................... 30
Figura 26 - Ciclos da instrução sta. .............................................................................................. 31
Figura 27 - Ciclos da instrução iti. ............................................................................................... 32
Figura 28 - Ciclos da instrução oti. .............................................................................................. 33
Figura 29 - Ciclos da instrução da csr. ......................................................................................... 34
Figura 30 - Ciclos da instrução ret. .............................................................................................. 35
Figura 31 - Ciclos da instrução shl. .............................................................................................. 36
Figura 32 - Ciclos da instrução shr............................................................................................... 37
Figura 33 - Ciclos da instrução puh. ............................................................................................ 38
Figura 34 - Ciclos da instrução pop. ............................................................................................ 39
4
Lista de Tabelas
Tabela 1 - Descrição dos pinos do WRP1. ................................................................................... 15
Tabela 2 - Set Completo de Instruções do WRP1........................................................................ 17
Tabela 3 - Fontes de interrupção do WRP1. ............................................................................... 52
6
Lista de Códigos
Box 1 - Exemplo de código Assembly para nop.......................................................................... 18
Box 2 - Exemplo de código Assembly para lda. ........................................................................... 19
Box 3 - Exemplo de código Assembly para add........................................................................... 20
Box 4 - Exemplo de código Assembly para sub. .......................................................................... 21
Box 5 - Exemplo de código Assembly para ldi. ............................................................................ 22
Box 6 - Exemplo de código Assembly para and........................................................................... 23
Box 7 - Exemplo de código Assembly para orl. ........................................................................... 24
Box 8 - Exemplo de código Assembly para xor............................................................................ 25
Box 9 - Exemplo de código Assembly para not. .......................................................................... 26
Box 10 - Exemplo de código Assembly para hlt. ......................................................................... 27
Box 11 - Exemplo de código Assembly para gta.......................................................................... 28
Box 12 - Exemplo de código Assembly para ifz. .......................................................................... 29
Box 13 - Exemplo de código Assembly para ifc. .......................................................................... 30
Box 14 - Exemplo de código Assembly para sta. ......................................................................... 31
Box 15 - Exemplo de código Assembly para iti............................................................................ 32
Box 16 - Exemplo de código Assembly para oti. ......................................................................... 33
Box 17 - Exemplo de código Assembly para csr. ......................................................................... 34
Box 18 - Exemplo de código Assembly para ret. ......................................................................... 35
Box 19 - Exemplo de código Assembly para shl. ......................................................................... 36
Box 20 - Exemplo de código Assembly para shr.......................................................................... 37
Box 21 - Exemplo de código Assembly para puh. ....................................................................... 38
Box 22 - Exemplo de código Assembly para pop. ....................................................................... 39
Box 23 - Exemplo de código Assembly para ite. ......................................................................... 40
Box 24 - Exemplo de codigo Assembly para itd. ......................................................................... 41
Box 25 - Exemplo de código Assembly para cpa. ........................................................................ 42
Box 26 - Exemplo de código Assembly para ife........................................................................... 43
Box 27 - Exemplo de código Assembly para swa. ....................................................................... 44
Box 28 - Exemplo de código Assembly para ada. ........................................................................ 45
Box 29 - Exemplo de código Assembly para sba. ........................................................................ 46
Box 30 - Exemplo de código Assembly para ana. ........................................................................ 47
Box 31 - Exemplo de código Assembly para ora. ........................................................................ 48
Box 32 - Exemplo de código em Assembly para xra.................................................................... 49
Box 33 – Exemplo de código em Assembly para rip................................................................... 50
Box 34 - Exemplo de tratamento de interrupção com sub-rotina. ............................................. 52
7
Introdução
Apresenta um PORT de entrada (ITR – input register) que contém 8 bits, porém só os 5
menos significativos (4..0) estão implementados. No mesmo PORT existem 5 entradas para
interrupção externa sensíveis à borda de subida e devidamente mapeadas (cada uma apresenta
seu próprio vetor de interrupção na memória). Existe disponível também um PORT de saída de
8 bits (OTR – output register) que pode ser utilizado para o acionamento das mais diversas
cargas, se utilizadas etapas de potência apropriadas. Todas as operações do processador, em
especial as que envolvem sua unidade lógica e aritmética, passam pelo ACC (acumulador), outro
registrador de 8 bits. O registrador de FLAGS indica o status atual do acumulador e existem 3
bits implementados no WRP1. O bit 0 é a flag Z (que é verdadeira quando ACC resultar em 0), o
bit 1 é o C (que é verdadeira quando ocorre um carry em operações de soma ou subtração) e o
bit 2 é o E (que é verdadeira se ACC for igual ao valor de comparação da instrução cpa).
Estão disponíveis 10 registradores de uso geral (UR0 a UR9) localizados nos endereços
50h a 59h respectivamente. Estes registradores são de 8 bits cada e deverão ser escritos através
da instrução sta e lidos através da instrução lda, sempre através do acumulador. Também
podem ser utilizados quando as instruções lógicas e aritméticas de endereçamento estendido
forem necessárias.
O WRP1 apresenta uma pilha de 10 níveis, utilizada para guardar endereços de retorno
de sub-rotinas e chamadas de interrupção. Além disso, a pilha pode ser utilizada para salvar o
conteúdo atual do acumulador através da instrução puh e recuperá-lo através de pop, para
eventuais salvamentos de contexto.
Arquitetura do WRP1
Program Counter (PC: contador de programa): consiste em um circuito contador de 8 bits que
fará a contagem fornecendo os endereços para o registrador de endereços de memória. Regido
pelo CLOCK principal, é o PC que determina em qual região de memória será realizada a busca
e execução das instruções. Neste tipo de operação o conteúdo do contador de programa é
enviado para o registrador de endereços de memória (MAR). Também é possível escrever um
valor neste contador, isso ocorre quando o processador executa instruções de desvio ou
chamada/retorno de sub-rotinas.
Stack 10 Levels (SP: pilha de memória de 10 níveis): armazena pontos de entrada e saída de sub-
rotina para continuar a execução natural do programa e também, se necessário, dados para a
recuperação de contexto. Como toda a pilha, funciona com o método LIFO (last in, first out), ou
seja, o último dado a entrar, é o primeiro dado a sair. Também é utilizada para armazenar o
endereço de retorno de interrupções, bem como o registrador de FLAGS para preservação de
contexto.
User Register x10 (UR: registradores do usuário): são 10 registradores de 8 bits disponíveis para
o usuário para armazenamento de dados (uma pequena RAM auxiliar). Considerando também
a pilha, o WRP1 dispõe de 20 bytes de RAM disponíveis, sem considerar os demais registradores
especiais. Os registradores UR0 a UR9, estão mapeados dos endereços 50h a 59h.
Argument Register (AR: registrador de argumentos): utilizado para armazenar o argumento das
instruções executadas (quando houver). Quando uma instrução conter um argumento, ocorrerá
um novo ciclo de busca por este argumento. Ao final do processo, a opcode da instrução estará
no registrador de instruções e o argumento estará no registrador de argumentos (ambos de 8
bits).
Instruction Register (IR: registrador de instruções): armazena o opcode da instrução atual a ser
processada pela unidade de controle. Se a instrução não tiver argumento, ocorrerá o ciclo de
execução e no próximo ciclo de busca a instrução seguinte será armazenada em IR.
Control Unity (UC: unidade de controle): é a unidade de controle principal, que receberá o sinal
de CLOCK, RESET e enviará um sinal de HALT para o circuito de clock quando uma instrução hlt
for executada, provocando a parada imediata do processamento. A unidade recebe o opcode
para executar a instrução específica, pois contém todo o decodificador de instruções. Atua no
controle de todos os blocos do processador para o tráfego de dados e instruções pelo
barramento (isso é indicado pela seta ALL na Figura 1). Além disso, lê o status das flags contidas
no registrador FLAGS, para efetuar algoritmos de tomada de decisão. As entradas XT1 e XT2 são
para o clock da própria unidade de controle, sendo permitido até 20MHz. Este clock (XT1 e XT2)
é assíncrono em relação ao CLOCK principal, pois serve apenas para o funcionamento da
unidade. Todos os blocos do processador são sincronizados com o CLOCK principal.
Flags Register (registrador de flags): utilizado para informar status sobre o acumulador e o
transbordo de bits (carry). Apresenta 8 bits, mas atualmente só os bits 2, 1 e 0 estão
implementados, que são E, C e Z respectivamente, usados nas instruções ife, ifc e ifz.
Accumulator (ACC: acumulador): registrador de 8 bits por onde passam todas as operações do
processador, incluindo os resultados de soma, subtração e operações lógicas. Usado também
para armazenar dados de forma imediata com a instrução ldi e endereçamento estendido com
a instrução lda.
Arithmetic Logic Unity (ALU: unidade lógica e aritmética): responsável pelas operações de soma,
subtração, lógica E, lógica OU, lógica XOR e NOT. Também realiza operação de shift right e shift
left (deslocamento para direita e para a esquerda). Recebe o valor de 8 bits do acumulador e do
registrador auxiliar B (operandos) e armazena o resultado da operação no próprio acumulador.
10
B Register (registrador auxiliar B): um registrador de 8 bits para auxiliar nas operações lógicas e
aritméticas, recebendo sempre um dos operandos. Geralmente recebe o argumento das
instruções de soma, subtração e instruções lógicas.
OUTPUT Register (OTR: registrador de saída): um PORT para saída paralela de 8 bits, utilizado
para controle de dispositivos como LEDs, motores, relés, módulos e outros. Este PORT de saída
está mapeado internamento no processador WRP1 e para escrever o conteúdo do acumulador
no registrador de saída, só precisamos utilizar a instrução oti. Também pode ser utilizado para
comunicação paralela e serial, esta última deverá ser implementada por software.
INPUT/INT Register (ITR: registrador de entrada e interrupção externa): um PORT para entrada
paralela de 8 bits, sendo apenas os 5 menos significativos implementados, que poderá ser
utilizado para leitura de botões, teclados, sensores digitais e outros. Poderá receber dados de
forma paralela e serial, esta última devendo ser implementada por software. Estes pinos de
entrada também poderão ser utilizados para gerar interrupções no processador, por borda de
subida, quando devidamente configuradas.
UART 9600 bps (transmissão/recepção assíncrona universal em 9600 bits por segundo): esta
UART consiste em um hardware interno dedicado, configurado de forma fixa em 9600 bps, para
enviar por TX o status de todos os registradores do processador, permitindo o acompanhamento
de cada pulso de CLOCK aplicado e debug dos softwares na própria bancada do laboratório.
Embora ainda não implementada, também está disponível uma entrada RX para recepção de
dados externos via serial.
11
Registradores Especiais
O acumulador pode ser visto na Figura 3. Poderá conter valores de 00h a FFh, pois é um
registrador de 8 bits. Pode ser lido e escrito pelo usuário.
Figura 3 – Acumulador
Figura 4 - Registrador B.
12
O Registrador de Saída é um PORT de saída convencional, que pode ser escrito pelo
usuário através do acumulador. Em outras palavras, quando executada a instrução oti, o
conteúdo de ACC é enviado para OTR. Confira na Figura 7 o aspecto do registrador de saída.
O processador WRP1 contém um registrador de entrada, que poderá ser utilizado para
entrada de dados e interrupção externa vetorada e não mascarada. Apesar de conter 8 bits,
apenas os 5 menos significativos estão implementados, sendo os demais sempre lidos como
zero. Configura o ITR na Figura 8.
- - - - - E C Z
O bit E (equal) é setado após uma instrução cpa, que compara o conteúdo do
acumulador com o seu argumento. Se o conteúdo de ACC for igual ao argumento de cpa o bit E
é setado e o usuário poderá usar a instrução ife para desviar para algum endereço relativo.
Quando ocorre o overflow do acumulador, o bit de carry (C) é setado e essa condição pode ser
verificada pela instrução ifc. Quando o resultado de alguma operação resultar em 0, significa
que o acumulador conterá este valor e o bit Z é setado. Esta condição é verificada através da
instrução ifz.
13
Para utilizar o WRP1, será necessário um circuito de clock para a unidade de controle,
um circuito de reset, um circuito de CLOCK principal (responsável pelo sincronismo de todo o
processador) e uma memória externa. A memória poderá ser uma EPROM ou EEPROM, que
conterá o código objeto a ser executado pelo WRP1. Uma memória RAM externa também
poderá ser adicionada para expansão, porém não é totalmente necessário visto que o
processador já tem a pilha implementada internamente e mais 10 registradores do usuário.
Como pode ser observado, temos uma memória externa, sugerimos a EEPROM 28C16,
que deve ser ligada no barramento de endereços e de dados do WRP1. Como não há
necessidade de mapearmos uma RAM externa, os pinos de habilitação e chip enable da memória
encontram-se ligados diretamente em GND. É na EEPROM que o arquivo binário estará, para ser
lido e executado pelo processador.
O pino de RESET deve ser mantido constantemente com nível lógico alto, para isso
utilizamos um resistor de pull-up. Um simples botão normalmente aberto poderá ser ligado
entre o pino de RESET e o GND, para provocar um reset no processador quando pressionado
pelo usuário. Também temos um cristal de 16MHz com capacitores de compensação para o
clock da unidade de controle. C3 é um capacitor de desacoplamento e deve situar-se próximo
aos terminais de alimentação do WRP1. O sinal de CLOCK principal pode ser qualquer sinal
retangular a níveis TTL (0 a 5V).
16
Os ciclos de execução de cada uma das instruções serão abordados no tópico a seguir
deste manual. O período necessário para a busca e a execução completa de uma instrução
consiste no ciclo de máquina (machine cycle) do processador WRP1 e como podemos perceber,
varia de instrução para instrução pois apesar do ciclo de busca ser o mesmo, o ciclo de execução
é diferente.
17
Set de Instruções
A seguir iremos descrever em maiores detalhes cada uma das instruções disponíveis no
processador WRP1. A Tabela 2 poderá ser utilizada como fonte de consulta rápida quando o
usuário estiver desenvolvendo softwares para o processador. Como pode ser observado, o set
é composto por um total de 33 instruções, que podem ser memorizadas com certa facilidade.
18
nop – No Operation
A instrução nop não faz nenhuma operação. Sua utilidade é justamente essa, gastar
tempo. Bastante útil quando precisamos estabilizar alguma função, gastar alguns ciclos do
processador e implementar rotinas de delay com maior precisão. Na Figura 13 apresentamos os
ciclos para executar a instrução nop e o seu OpCode. E no Box 13 um exemplo de código
Assembly usando nop.
Na primeira linha do Box 2, carregamos ACC com o conteúdo do endereço 50h (que
consiste no registrador UR0). Se isso ocorrer no reset ou antes de qualquer instrução sta, o
conteúdo será 00h. Após exemplificamos ldi, que carrega ACC imediatamente com o valor AAh.
A instrução lda poderá afetar a flag Z, que será setada caso ACC receba o valor 00h.
20
add – Adição
sub – Subtração
sub também é uma instrução de endereçamento imediato que subtrai o seu argumento
de ACC e salva o resultado no próprio ACC. Na Figura 16 estão os ciclos de operação de uma
instrução sub e no Box 4 um exemplo em código Assembly.
A instrução sub poderá afetar as flags C e Z. Se o resultado da subtração for menor que
zero, a flag C é setada. Se ACC obtiver 00h como resultado da operação, a flag Z será setada.
22
Já vimos anteriormente alguns exemplos com ldi, no Box 5 carregamos ACC com 0Fh (ou
15d) e com auxílio de sta armazenamos este valor em UR4. Após carregamos 123d em ACC e
salvamos em UR2. Ao final da quarta instrução do Box 5, UR4 conterá 54d e tanto ACC quanto
UR2 conterão 123d.
A instrução ldi setará a flag Z caso ACC seja carregado com 00h.
23
and – Lógica E
Esta instrução realiza a operação lógica E bit a bit com endereçamento imediato. ACC
recebe o resultado da operação lógica E entre o próprio ACC e o argumento da instrução. Na
Figura 18 podemos verificar os ciclos de operação da instrução and e no Box 6 um exemplo de
utilização. Este tipo de instrução é muito útil para fazer máscara de bits, limpando os bits onde
for inserido 0.
ACC recebe BCh de forma imediata (que é igual a 10111100b). Depois é realizada a
operação lógica bit a bit entre ACC e o argumento de and (no caso F0h ou 11110000b). Ao final
da operação, ACC conterá B0h pois o nibble menos significativo foi limpo (diz-se que o nibble
mais significativo recebeu uma máscara de bits).
orl – Lógica OU
Operação lógico OU bit a bit entre ACC e o próprio argumento da instrução, consistindo
portanto em instrução de endereçamento imediato. O resultado da operação é salvo no próprio
acumulador. Veja os ciclos de operação da instrução orl na Figura 19 e um exemplo de Assembly
no Box 7. Esta instrução é uma ótima alternativa para concatenar dois bytes.
Iniciamos o código carregando ACC com 07h. Após, realizamos a operação lógico OU bit
bit entre ACC e 50h. Ao final da operação, ACC conterá 57h.
A instrução orl afeta a flag Z. Caso ACC receba o valor 0 ao final de uma operação, a flag
Z será setada.
25
Operação lógica OU Exclusivo bit a bit entre o seu próprio argumento e ACC, logo é uma
instrução de endereçamento imediato. O resultado é depositado em ACC. Quando desejarmos
alterar o estado de um único bit, esta é a instrução indicada. Os bits verdadeiros do argumento
serão os responsáveis por complementar os respectivos bits do acumulador. Os ciclos de
operação da instrução xor podem ser conferidos na Figura 20 e um exemplo de software em
Assembly no Box 8.
ACC inicia com 00h. Fazendo xor bit a bit com 80h, o bit mais significativo de ACC ficará
com valor 1, portanto ACC conterá 80h. Repetindo a operação, ACC volta a conter 00h, pois
inverteremos novamente o bit mais significativo.
A instrução xor irá setar a flag Z se ACC contiver o valor 00h após uma operação.
26
Após a execução de uma instrução not, o conteúdo de ACC é invertido bit a bit conforme
mencionado. No exemplo, ACC inicia com AAh (10101010b) e após a not estará com 55h
(01010101b).
hlt – Halt
gta – Go To Address
Ao executar a instrução gta, ocorre um desvio incondicional para a label loop. Em outras
palavras, program counter é carregado com o endereço onde se encontra a instrução not, que
invertá ACC novamente para 10011001b. O conteúdo é mostrado na saída e voltamos a executar
gta. E isso se repetirá enquanto o processador estiver energizado. As labels de argumento
devem estar entre parênteses para indicar que se trata de um endereço de memória.
ifz é uma das instruções de desvio condicional disponíveis para o WRP1. Ela requer um
endereço como argumento (também pode ser marcado através de label). Pode ser utilizada para
testes após operações de soma, subtração ou qualquer outra em que a flag Z é afetada (consulte
a Tabela 2). Se a flag Z estiver setada, significa que o conteúdo de ACC é zero. Uma instrução ifz
provocará o desvio para o endereço de seu argumento nesta situação. Os ciclos de ifz estão
explícitos na Figura 24 e também um código em Assembly no Box 12 pode ser conferido.
Veja que na primeira iteração, ACC terá 24, que obviamente é diferente de zero, então
o desvio não ocorre. Em seguida processamos um desvio incondicional com gta, voltando para
o endereço relativo marcado pela label loop. Como continuaremos decrementando ACC, após
25 decrementos chegaremos em zero. Nesse momento, o programa desvia para a label final,
executa uma instrução nop e por fim o processador é parado com hlt.
A flag C será setada sempre que um resultado de soma ultrapassar o valor de 8 bits (255
decimal) ou quando um subtração resultar em valor negativo (BR conter um valor maior que
ACC). Podemos testar esta flag com a instrução de desvio condicional ifc, que requer um
argumento para o endereço de desvio. Se C estiver setada, o programa desvia para o endereço
(ou label) de argumento de ifc. Confira os ciclos de operação de ifc na Figura 25 e também um
código exemplo em Assembly no Box 13.
Com a instrução ldi salvamos a literal 31d no acumulador. Este valor é então armazenado
no registrador UR4 com a instrução sta. Os registradores disponíveis para o usuário no WRP1
são UR0 a UR9 localizados nos endereços 50h a 59h respectivamente. Em seguida somamos 10
ao acumulador (que conterá 41d). Este valor atual será armazenado em UR5. Por fim, com lda,
devolvemos o valor 31 ao acumulador, que havia sido armazenado previamente em UR4.
A instrução iti é utilizada para a leitura do registrador ITR, que consiste no PORT de
entrada do processador WRP1. ITR tem os 5 bits menos significativos implementados (0 a 4), os
bits 5, 6 e 7 sempre serão sempre lidos como 0. Ao processar uma instrução iti o conteúdo
presente em ITR será transferido para o acumulador. Confira na Figura 27 os ciclos de operação
de uma instrução iti bem como um código exemplo no Box 15.
rdin:
iti ;armazena o conteúdo de ITR em ACC
xor H’01’ ;ACC = ACC xor 01h
ifz (press) ;desvia para press se bit 0 de ITR for HIGH
gta (rdin) ;senão, continua lendo
press:
ldi H’80’ ;carrega ACC com 80h
oti ;aciona bit 7 de OTR
hlt ;interrompe o processamento
loop:
ldi H’AA’ ;carrega ACC com 10101010b
oti ;aciona saídas de OTR
ldi H’55’ ;carrega ACC com 01010101b
oti ;aciona saída de OTR
gta (loop) ;loop infinito
loop:
ldi H’01’ ;carrega ACC com 01h
csr (adder) ;chama sub-rotina de soma
oti ;envia resultado para OTR
gta (loop) ;loop infinito
adder:
add H’02’ ;soma 2
add H’05’ ;soma 5
ret ;retorna
No Box 17 apresentamos o exemplo de uma sub-rotina bem simples que soma 2 e depois
5 ao conteúdo do acumulador e então retorna para o código principal. No loop, temos a carga
inicial do acumulador, seguida da chamada da sub-rotina com csr. Nesse momento, o conteúdo
de PC é salvo na pilha e então ocorre o desvio para o endereço de adder. Ao executar uma
instrução ret (retorno), devolvemos o endereço para o program counter para executar a próxima
instrução, no caso oti, que mostrará o conteúdo de ACC no registrador de saída. Por fim,
desviamos de volta para loop com a instrução gta e mantemos em loop infinito.
ret – Return
Sempre que uma sub-rotina termina, precisamos inserir a instrução ret, para que o
processador restaure o conteúdo de PC da pilha de memória. Após e execução de ret, o program
counter recebe o conteúdo que tinha antes da chamada da sub-rotina, para executar a instrução
ligeiramente após a chamada. Na Figura 30 apresentamos os ciclos de operação da instrução ret
e no Box 18 o código Assembly exemplo.
setout:
ldi H’08’ ;carrega ACC com 00001000b
oti ;envia para a sáida
ldi H’10’ ;carrega ACC com 00010000b
oti ;envia para a saída
ret ;retorna
Deslocamento de ACC bit a bit para a esquerda. Utiliza uma literal como argumento, que
indica quantas vezes os bits serão deslocados para a esquerda. Na Figura 31 apresentamos os
ciclos de operação de shl e no Box 19 um código exemplo.
Iniciamos ACC com 31h e depois deslocamos todos os bits uma vez para a esquerda com
shl. Com uma nova shl deslocamos ACC para a esquerda mais 4 vezes. Observe que os bits são
perdidos quando ultrapassam o limite de 8 bits. Esta instrução pode ser utilizada para
multiplicação por 2, 4, 8, 16, etc.
Deslocamento para a direita de ACC bit a bit. O argumento necessário para shr é uma
literal que indica o número de deslocamentos. Os ciclos de operação de shr estão expostos na
Figura 32 e no Box 20 temos um exemplo de código Assembly.
Utilizamos um exemplo bem semelhante ao do Box 19, pois shr é a instrução oposta a
shl. Como podemos ver, os bits do acumulador são deslocados para a direita e são perdidos se
ultrapassarem a faixa de 8 bits. Esta instrução poderá ser utilizada para divisão por 2, 4, 8, 16,
etc.
A instrução puh empurra para o topo da pilha o conteúdo de ACC (push to the top). É
uma instrução de endereçamento implícito e não requer argumentos. Após sua execução, o
conteúdo atual de ACC é armazenado no topo da pilha de memória. Função bastante útil para
salvar algum contexto em nossos códigos. Os ciclos de operação da puh podem ser conferidos
na Figura 33, bem como um exemplo Assembly no Box 21.
É a dual da puh. Para recuperar o topo da pilha de volta para o acumulador (puxa do
topo), utilizamos pop, que também não requer argumentos e é de endereçamento implícito. Na
Figura 34 estão presentes os ciclos de operação de pop e um exemplo é dado Box 22.
Este exemplo é semelhante ao do Box 21, pois salvamos previamente ACC no topo da
pilha de memória com puh, efetuamos outros cálculos, salvando o resultado em UR6 e então
recuperamos o dado 5Eh do topo da pilha com pop.
O processador WRP1 apresenta interrupções externas em seu PORT de entrada, que são
sensíveis a borda de subida. Para habilitá-las, só precisamos da instrução ite. Após esta
instrução, o WRP1 irá desviar para os vetores de interrupção referentes a cada pino de
interrupção externa, quando estes receberem um sinal em borda de subida. Confira os ciclos de
operação de ite na Figura 35 e um exemplo no Box 23.
isr0:
csr (count) ;chama sub-rotina count
rip ;retorna da interrupção
begin:
ldi H’64’ ;carrega ACC com 64h
ite ;habilita interrupções
loop:
oti ;envia conteúdo de ACC para a saída
gta (loop) ;aguarda interrupção
count:
sub D’001’ ;subtrai 1 de ACC
ifz (final) ;se chegou em zero, desvia para final
ret ;senão, retorna
final:
itd ;desabilita interrupções
ret ;retorna
Um contador de pulsos foi implementado no Box 24. Iniciamos carregando o valor 64h
em ACC e habilitando as interrupções. No loop, mostramos o conteúdo atual de ACC no
registrador de saída e aguardamos a interrupção. Com uma borda de subida em int0, o programa
desvia para isr0 que é a chamada para a sub-rotina count. Lá, decrementamos ACC em 1 e
verificamos se chegou em zero com ifz. Caso não, retornamos e continuamos o processo. Caso
tenha chegado em 0, desviamos para final, desabilitamos as interrupções e retornamos.
loop:
ldi H’00’ ;carrega ACC com 00h
add H’01’ ;incrementa ACC
cpa H’0A’ ;se chegou em 10, seta flag E
ife (final) ;se E setada, desvia para final
gta (loop) ;senão, desvia para loop
final:
sta H’50’ ;salva ACC em UR0
oti ;mostra na saída
hlt ;interrompe o processamento
A instrução cpa coloca a flag E em HIGH se o conteúdo de ACC for igual ao seu
argumento.
43
Para testar a flag E do WRP1, utilizamos a instrução ife. A flag E será setada pela
instrução cpa caso o conteúdo do acumulador seja igual ao do argumento de cpa. ife realiza o
desvio para o endereço do seu argumento, se a flag E estiver setada. Na Figura 38 podem ser
verificados os ciclos de operação da ife bem como um código exemplo no Box 26.
loop:
ldi D’100’ ;carrega ACC com 100d
sub H’02’ ;decrementa de 2 em 2 ACC
cpa D’026’ ;se chegou em 26, seta flag E
ife (final) ;se E setada, desvia para final
gta (loop) ;senão, desvia para loop
final:
oti ;mostra ACC na saída
hlt ;interrompe o processamento
A instrução ife limpa a flag E para que novos testes de comparação possam ocorrer.
44
Outro método de realizar a soma de dois valores é apresentado no Box 28. A vantagem
em relação à instrução add é que poderemos ter o valor utilizado como segundo operando da
soma previamente armazenado no processador. Em códigos mais complexos isso pode ser
especialmente útil.
Se ACC resultar em 0, a flag Z será setada com esta instrução. Se o resultado da soma
ultrapassar o range de 8 bits (maior que 255), a flag C será setada.
46
sba funciona de forma semelhante à ada, porém realiza a subtração entre ACC e o
conteúdo do endereço usado como argumento, que deve ser na faixa entre 50h e 59h para
acessar os registradores do usuário UR0 a UR9. Confira os ciclos de operação de sba na Figura
41, bem como um exemplo em Assembly no Box 29.
A instrução ana realiza a operação AND bit a bit entre o acumulador e o conteúdo do
endereço usado como argumento. Portanto, também é uma instrução de endereçamento
estendido. O resultado é armazenado no próprio ACC. Poderemos com isso ter o conteúdo do
operando salvo previamente em um dos registradores do usuário, UR0 a UR9, localizados entre
50h e 59h. Os ciclos de operação da instrução ana podem ser verificados na Figura 42 e um
código Assembly exemplo no Box 30.
No código do Box 30 trabalhamos com uma máscara de bits que foi carregada
inicialmente no ACC, para preservar o nibble menos significativo (0Fh). Salvamos esta máscara
em UR2 para utilizar em mais operações. Sempre que quisermos utilizar 0Fh poderemos recorrer
à instrução ana com o endereço 52h como argumento. O código exibe dois resultados de
exemplo e depois interrompe o processamento.
Lógica OU bit a bit entre ACC e o conteúdo do endereço usado como argumento para a
instrução ora. O resultado da operação é armazenado em ACC. Esta instrução também opera
com endereçamento estendido e poderemos fazer a lógica OU entre o acumulador e o conteúdo
de um dos registradores UR0 a UR9, localizados nos endereços 50h a 59h. Confira os ciclos de
operação de ora na Figura 43 e também um código Assembly no Box 31.
No Box 31 concatenamos os bytes 70h com 0Ch. Primeiro salvamos 70h no registrador
do usuário UR8. Após carregamos 0Ch no acumulador e realizamos a OU lógica bit a bit entre
ACC e o conteúdo de UR8 (endereço 58h). O resultado será 7Ch.
Da mesma forma que as duas instruções anteriores (ana e ora), a instrução xra realiza a
operação bit a bit só que da lógica XOR entre o acumulador e o conteúdo do endereço utilizado
como argumento. Também é uma instrução de endereçamento estendido. O usuário poderá
salvar previamente um valor com sta e utilizar xra para inverter bits específicos de ACC. Os ciclos
de operação de xra estão explícitos na Figura 44 e no Box 32 há um exemplo em Assembly. A
faixa de endereços possíveis no WRP1 para xra é 50h a 59h, assim como as demais instruções
de endereçamento estendido, que trabalham com os registradores do usuário.
A instrução rip é bastante semelhante à ret, porém deve ser utilizada para o processador
retornar de uma chamada de interrupção. A principal diferença, é que rip armazena o contexto
do registrador de FLAGS, pois seu conteúdo é necessário para desvios condicionais e uma
alteração em rotina de interrupção poderá causar um funcionamento errático quando estiver
de volta para o programa principal. Os ciclos de operação da instrução rip podem ser conferidos
na Figura 45 e um código Assembly de exemplo está no Box 33.
O código inicia com o desvio do vetor de interrupção 02h (vetor da interrupção externa
0). No programa principal, ACC é carregado com CCh e habilitamos as interrupções com ite. No
loop infinito, enviamos ACC para OTR e aguardamos uma borda de subida em int0. Quando
ocorrer, o processador desvia para o vetor de interrupção, complementa ACC, executa uma nop
para completar 3 bytes no vetor e em seguida retorna da interrupção com rip.
Em resumo, sempre que houver uma borda de subida no pino int0, inverteremos o
conteúdo de ACC bit a bit.
Organização de Memória
O processador WRP1 foi desenvolvido para trabalhar principalmente com uma memória
ROM externa (pode-se utilizar EPROM ou EEPROM). Como seu barramento de endereços é de 8
bits, com uma organização simples é possível trabalhar com até 256 bytes de memória de
programa. O usuário poderá expandir esta memória, dividindo entre mais ROMs externas, além
de mapear uma memória RAM para expansão. No entanto a maioria das aplicações para o qual
o WRP1 foi projetado são atendidas com uma ROM de 256 bytes. Confira na Figura 46 a
organização de memória do dispositivo.
Interrupções
princ:
ldi H’76’ ;carrega 76h no ACC
sta H’57’ ;armazena em UR7
loop:
oti ;mostra informação na saída
not ;complementa ACC
gta (loop) ;loop infinito
trata0:
add D’015’ ;soma 15
sub D’008’ ;subtrai 8
xor H’80’ ;complementa bit mais significativo
ret ;retorna
Conclusão