Descrição
O sistema proposto que desenvolveremos apenas apresentará no visor três
mensagens sendo que na linha 2 será exibido o nome do desenvolvedor e na
linha 1 alternará entre as três frases pré determinadas num intervalo de
tempo prefixado aleatório.
Arquivamento do projeto. |
Estrutura do programa
- informações de gestão
- declaração dos rótulos fixos
- declaração das variáveis alocadas
- declaração dos vetores de interrupção
- códigos
Estrutura do código
- rotina principal
- aplicações
- rotinas de configuração
- rotinas de retardo
- rotinas do visor
- rotinas das mensagens
- mensagens
Codificação hierarquizada
Programar em assembly é muito prazeroso porém requer muita organização e
uso das diretrizes do compilador para rotular informações a fim de deixar
mais legível o programa. Logo, iniciaremos o programa com diretivas, definições
e rotulações. Outra fato importante a ser evidenciado foi o processo de
nomenclatura adotada de nomeação das rotinas e sub-rotinas. Perceberão que ao
longo do desenvolvimento do código foram criadas inúmeras sub-rotinas criando
uma estrutura hierarquizada com o intuito de deixá-las mais de alto nível. Uma
rotina dispara a chamada de uma sub-rotina que por sua vez chama outra e assim
sucessivamente até a de mais baixo nível que realiza a função esperada. Esta
estrutura hierarquizada facilita a criação de lógica porém gera códigos complexos
sendo necessário uma documentação adequada.
Formato das mensagens
As mensagens são formadas por grupos, cada grupo é formado por um número de
linhas. E cada linha é formada por (1) um rótulo da linha da tabela de mensagens
de inicialização, (2) um ID, (3) um valor de posição inicial de exibição da
linha, (4) tamanho da cadeia de caracteres da linha corrente, (5) a mensagem
propriamente dita e por último (6) um caractere indicador de final de linha. Ao
término da última linha temos dois caracteres indicadores de final da tabela.
Observação: Em função da tecnologia do hardware as tabelas são obrigadas a terem
número par de caracteres. Caso esta recomendação não seja seguida o compilador
avisará.
Sistema de busca
O sistema de busca baseá-se nos 6 campos compostos contidos no formato das
mensagens para avaliar os caracteres e realizar a exibição das mesmas.
O campo 1 é o que define a tabela que contém as linhas de um bloco de informação.
É este campo que devemos carregar nos registradores indexadores pelas instruções:
ldi Zh, high(TAB_xxx<<1) ; tabela
ldi Zl, low (TAB_xxx<<1)
O campo 2 é também denominado de ID e é utilizado pela rotina re_mensageiro
para encontrar a linha desejada para ser exibida no visor selecionado.
O campo 3 contém o endereço inicial da linha e coluna do visor onde serão
exibidos os caracteres da mensagem. A rotina re_mensageiro envia ao visor
como comando o qual desloca o cursor para tal posição.
O campo 4 contém a tamanho da cadeia de caracteres da linha corrente, que
servirá de contador para a rotina re_mensageiro não executar infinitamente.
Uma medida de segurança para não haver travamento por programa. A cada
caractere enviado como dado ao visor é decrementado este valor até atingir
o valor zero logo, encerra a sua função após retorna a rotina chamadora.
O campo 5 temos a informação propriamente dita no formato ASCII. É comparado
com o caractere de final de linha. Há duas possibilidades para tal fato: 1) se
for finaliza o envio ao visor e retorna ou 2) senão for envia-os ao visor como
dado e retorna para o próximo dado a ser analisado ou enviado.
O campo 6 temos o caractere indicador de final de linha.
;******************************************************************************* ;* MSG_opcao,L1C1,16,"OPCAO: ",f_SOH,f_EOT * ;* ^ ^ ^ ^ ^ ^ * ;* | | | | | | * ;* id ------+ | | | | | * ;* pos -------------+ | | | | * ;* tan -----------------+ | | | * ;* cadeia --------------------------+ | | * ;* final linha -------------------------------+ | * ;* final cadeia ----------------------------------+ * ;*******************************************************************************
Convenções
api estes prefixos são usados para denominar rotinas de alto nível isto é,
rotinas que chamam outras rotinas de nível mais baixos através da instrução
“call” outras rotinas de menor nível..re estes prefixos são usados para denominar
rotinas de nível médio isto é, rotinas que chamam outras rotinas de nível mais
baixos através da instrução “call” outras rotinas de menor nível.
ri estes prefixos são usados para denominar rotinas de nível baixo isto é,
rotinas que chamam outras rotinas de nível mais baixos através da instrução
“call” outras rotinas de menor nível.
hw estes prefixos são usados para denominar rotinas de nível do hardware isto é,
as rotinas que acessam o hardware diretamente.
v_ estes prefixos são usados para denominar posições de memórias em
byte – variáveis.
b_ estes prefixos são usados para denominar posições de memórias em
bit – bit.
f_ estes prefixos são usados para denominar dados imutáveis em
byte – fixos.
id_ estes prefixos são usados para denominar o caractere de identificação da
palavra.
MSG_ estes prefixos tem a mesmo função do id_, foi empregado outro para ficar
mais intuitivo.
macr estes prefixos são usados para denominar as macros.
Variáveis
Para satisfazer as funcionalidades propostas foram desenvolvidas as seguintes variáveis:
- v_PORTA_C
- v_DDR_C
- v_mcucr
- v_wd
- v_mcucsr
- v_gicr
- v_CURSOR
Rotinas
Para satisfazer as funcionalidades propostas foram desenvolvidas as seguintes rotinas e
subrotinas:
cefo
api_ucp_ini
api_msg_ini
re_ucp_cnfg
re_dormencia
re_caoguarda
re_portC_cnfg
re_cpu_lcdcnfg
re_retardo
re_esp_humana
re_lcd_cnfg
re_lcd_cmd
re_lcd_dado
r_lcd_rs_cmd
r_lcd_rs_dad
r_lcd_en_101
lcd_en_0
lcd_en_1
r_lcd_74164
lcd_dado_0
lcd_dado_1
r_lcd_74164_clk
lcd_74164_clk0
lcd_74164_clk1
re_mensageiro
varre_cad
re_msg_amb
re_msg_aut
re_msg_cur
re_msg_emp
re_pre_ini
.
Nenhum comentário:
Postar um comentário