Você está na página 1de 14

UNIVERSIDADE DE CAXIAS DO SUL

CENTRO DE CINCIAS EXATAS E TECNOLOGIA

JONATHA MAGGIONI POLETTO


WILNER AVILA

RELATRIO
TRABALHO DE PROGRAMAO EM ASSEMBLY

CAXIAS DO SUL
2014

1 - O Problema
Desenvolver um programa em assembly que realize uma simulao do
funcionamento de um controlador de semforos de um entroncamento de quatro
vias, conforme a Figura 1. O programa dever ter suporte criao de carros e
animao dos mesmos. Cada direo possui um nome: Norte, Sul, Leste, e Oeste.
Na esquina de cada rua, um semforo com 4 LEDs (vermelho, amarelo, e 2 verdes
esquerda e em frente) so utilizados para controlar o trfego da respectiva
direo. Assim, existe um total de 16 LEDs (4 semforos de 4 LEDs). Os LEDS do
semforo Norte-Sul possuem as identificaes L1 (vermelho) a L4. Os LEDS do
semforo Sul-Norte possuem as identificaes L5 (vermelho) a L8. Os LEDS do
semforo Oeste-Leste possuem as identificaes L9 (vermelho) a L12. Os LEDS do
semforo Leste-Oeste possuem as identificaes L13 (vermelho) a L16.

Figura 1. Entroncamento de ruas

Os carros sero criados em cada pista e a sua animao dever respeitar as regras do
entroncamento.
As regras deste entroncamento so as seguintes:
1. O sinal de siga em frente deve permanecer pelo tempo de 5 segundos, antes de
trocar de estado. No caso de siga em frente o carro deve mover-se a cada duas
posies.
2. Converses direita precisam de 2 segundos para realizar a converso: um no
entroncamento e outro na nova pista.
3. Quando houver a interrupo do fluxo do siga em frente, o semforo deve ficar em
amarelo por 2 segundos e logo em seguida deve ir para vermelho.
4. As converses esquerda so consideradas seguras, pois no pode haver nenhum
outro sinal verde que contraponha a converso.
a. Quando existe um sinal de converso segura ligado (durante 3 segundos),
pode haver somente o de converso esquerda da pista contrria ligado ou
siga em frente quando no houver fluxo contrrio.
b. O sinal deve ficar em amarelo por 1 segundo para que os carros na
converso no bloqueiem o trfego.
c. Se houver um carro na converso segura de ambas as ruas (Norte-Sul e
Leste-Oeste), a preferncia ser a da Norte-Sul.
5. Nenhum carro deve avanar o sinal amarelo ou vermelho.
6. A preferencial Norte Sul, isto os semforos da rua norte e sul devem estar
ligados quando no houver um carro nos entroncamentos.
7. Todo o processo de troca de status do semforo deve ocorrer de forma que no
cause coliso entre os carros.
O programa deve apresentar uma tela para mostrar a posio dos carros, tempo,
estado dos semforos, das chaves, e do entroncamento. Os caracteres de moldura devem ser
utilizados para montar uma tela e as divises da tela (utilizando caracteres ASCII especficos). O
carro pode ser qualquer caractere. O programa deve mostrar a situao das portas e das
chaves na tela como mostrado na Figura 2. No necessrio mostrar as divisrias internas
das pistas (para que no ocupe muito espaos da tela).

Figura 2. Layout do painel lateral e o entroncamento


Os semforos devem ser representados por retngulos coloridos conforme as cores do
sinal (posicionados ao lado das pistas onde o semforo deve existir). Quando no esto
ligadas, devem ser da cor branca. Na simulao da bancada, deve-se utilizar somente um LED
para cada estado do semforo. Os semforos devem ser ligados nas portas A e B da PPA (o
vermelho deve ser o mais significativo). No se esquea de mostrar o mapeamento na
documentao.
O programa deve comear sem carro algum nas pistas e a via preferencial liberada.
A simulao deve ocorrer da seguinte maneira a cada segundo:
1. Verificar se existe carro a ser adicionado na pista. A ocupao dos carros nas pistas ser
realizada pista a pista atravs da porta C da PPA (pinos PC0 a PC5). A porta estar conectada s
chaves da bancada a fim de permitir o controle. As portas PC0 a PC3 (4 bits) indicaro a pista a
ser ocupada (conforme Tabela 1) e as portas PC4 e PC5 indicaro a quantidade de carros (0 at
3 carros). Cada pista no dever conter mais do que 5 carros antes do semforo. Cada carro
adicionado ser colocado a partir do comeo da pista. Caso a pista estiver cheia, o programa
dever colocar at o mximo da capacidade. A ltima entrada de carro (pista, quantidade de
carros, e o tempo) e o nmero de carros em cada pista (duas pistas, siga e converso, para
cada direo) devem ser mostrados em um painel lateral.

Tabela 1. Codificao dos bits PC0 a PC2.

2. Atualizar os Semforos. Conforme as regras do entroncamento, os semforos devem ser


atualizados (a tela tambm). Note que as converses seguras deve aguardar o carro no estar
mais no entroncamento para liberar a pista.
3. Movimentar os carros. A movimentao de cada carro 2 caracteres por segundo. As
converses necessitam de 3 segundos para realizar a travessia completa. A Figura 3 mostra
dois exemplos de converso esquerda com suas posies intermedirias e respectivos
tempos. Deve-se manter o status de cada posio dos carros.
4. Gravar simulao. A cada segundo, a situao do simulador deve ser gravada. As colunas
so as seguintes:
a. Tempo em segundos.
b. Para cada rua Norte, Sul, Leste e Oeste (nesta ordem): situao do semforo
(binrio), fila da pista de converso esquerda (binrio), fila da pista siga em frente
(binrio), fila da pista de converso direita (binrio), fila da pista da direita aps o
semforo (binrio), fila da pista da esquerda aps o semforo (binrio).
c. Valor das chaves PC0 a PC5 (cada bit).

Figura 3. Exemplos de converso esquerda em duas direes. O subscrito representa o


tempo em cada posio utilizada para a converso.
2. Soluo

O programa possui um lao principal que tem a funo de chamar as procs


responsveis pelos segmentos principais do sistema: controle dos carros, controle dos
semforos e controle da temporizao.
As posies dos carros so atualizadas a cada ciclo do programa, o carro anda de uma
em uma posio a cada 0,5 segundos,isso quando possvel (espao em pista e/ou
semforo aberto). O loop do programa executado por tempo indeterminado, s
saindo do lao quando o usurio pressiona a tecla Esc.
Cada semforo representado por uma varivel de 16 bits. O sentido principal (NS e
SN) comea com sinal verde. A parte alta da varivel (bits mais significativos) so
usados para fazer a contagem do tempo de transio, a cada ciclo do programa o
contador da sinaleira incrementado, quando chega em 5 segundos troca do verde
para o amarelo, fica dois segundos em amarelo e passa para o vermelho, e assim
sucessivamente. A parte baixa da varivel utilizada para representar as lmpadas do
semforo.

Para cada pista definimos um vetor de quinze posies, onde em cada posio ser
alocado um carro. Cada posio do vetor possui 16 bits, nos 8 bits mais significativos
fica a informao da linha da tela de onde est o carro, nos outros 8 bits a informao
referente a coluna da tela de onde est o carro.
Todas as pistas possuem um procedimento para atualizao das posies dos carros, a
funo essencial do mtodo incrementar as posies dos carros, mas sempre
levando em conta a pista e a converso, tambm cuidando se as sinaleiras esto
abertas ou fechadas e tratando o problema das colises entre os veculos.

Descrio de cada PROC do programa


o

FirstPrint proc:
Imprime os principais componentes da interface do programa.
Registradores usados: AL (modo da tela).

LastPrint proc:
Finalizao da tela.
Posiciona o cursor na ultima posio possvel,
assim a linha de comando (DOS) aparece abaixo do programa.

PositionCursor proc:
Posiciona o cursor e atualiza as variveis de posio.
Registradores usados: DH (linha), DL (coluna).

WriteCaract proc:
Escreve um caractere 'CX' vezes na posio do cursor.
Registradores usados: AL (caractere), BL (atributos de texto), CX (quantidade
de repeties).

WriteString proc:
Escreve uma string e avana o cursor.
Registradores usados: SI (endereo efetivo da string), CX (tamanho da string).

WriteBinary proc:
Escreve um numero binrio e avana o cursor.
Registradores usados: BX (numero para ser escrito), CX (quantidade de bits,
max 16)

AdvanceCursor proc:
Avana 'CX' posies o cursor.
Registradores usados: CX (numero de avanos).

WriteAdvance proc:
Escreve caractere 'CX' vezes na posio do cursor e avana.
Registradores usados: AL (caractere),BL (atributos de texto), CX (qtd de
avanos).

WriteNumber proc:
Escreve um numero inteiro e avana o cursor.
Registradores usados: AX (numero), BL (atributos de texto)

ReadCaract proc:
Le um caractere.
Atualiza registradores: AL (caractere lido).

OuterLines proc:
Proc para imprimir a borda da tela, conforme caracteres ASCII escolhidos.

BorderLine1 proc:
Imprime a borda de cima da tela, conforme caracteres ASCII escolhidos.
Registradores usados: DH (linha).

BorderLine2 proc:
Imprime a borda do meio da tela, conforme caracteres ASCII escolhidos.
Registradores usados: DH (linha).

BorderLine1 proc:
Imprime a borda de baixo da tela, conforme caracteres ASCII escolhidos.
Registradores usados: DH (linha).

InnerLines proc:
Imprime a pista, conforme caracteres ASCII escolhidos.

LaneLineUPandDown proc:
Imprime linha superior/inferior da pista, conforme caracteres ASCII escolhidos.
Registradores usados: DH (linha).

LaneLineInnerUP proc:
Imprime linha intermediaria superior, conforme caracteres ASCII escolhidos.
Registradores usados: DH (linha).

LaneLineInnerDown proc:
Imprime uma linha intermediaria inferior, conforme caracteres ASCII
escolhidos.
Registradores usados: DH (linha).

DisplayCounter proc:
Inicializa e desenha o texto do contador.

DisplayDoors proc:
Inicializa as portas na tela.

PrintTheDoors proc:
Proc para desenhar as portas na tela.

DisplaySemaphore proc:
Inicializa as sinaleiras na tela.

DisplaySemaphores proc:
Imprime os semforos.

PrintASemaphore proc:
Imprime uma sinaleira. Funo genrica que chamada pelas funo
especficas, alterando o valor recebido nos registradores
Registradores usados: AX (representao da sinaleira), DX (posio inicial da
sinaleira), CX (posio inicial dos bits da sinaleira).

PrintASemaphore_Bit proc:
Imprime um bit da sinaleira.
Registradores usados: DL (estado da sinaleira), BL (atributos de texto para
DL=1).

PrintTheCars proc:
Imprime carros na tela. Carrega o EA de cada uma das 12 pistas e chama uma
funo genrica de impresso de pistas.
Registradores usados: AL (caractere que representa os carros).

PrintTheCarsOnTheLane proc:
Imprime os carros de uma pista na tela.
Registradores usados: SI (endereco efetivo inicial do vetor pista), AL (caractere
que representa os carros).

RefreshSemaphores proc:
Proc para atualizao das sinaleiras, carrega o EA de todas as sinaleiras para
usar a proc genrica de atualizao de uma sinaleira.

RefreshASemaphore proc:
Verifica uma sinaleira.
Registradores utilizados: AX (representacao da sinaleira).
Registradores atualizados: AX atualizado.

SemaphoresCountInc proc:
Solicita incremento de contador para as sinaleiras.

SemaphoresRequests_NS proc:
Solicita conversao segura nas sinaleiras NS e SN.

SemaphoresRequests_OL proc:
Solicita conversao segura nas sinaleiras OL e LO.

SemaphoresRequest proc:
Solicita conversao segura em uma sinaleira.
Registradores usados: AX (representacao da sinaleira).

Keyboard proc:
Verifica o estado atual do teclado.
Registradores atualizados: AL (codigo ASCII da tecla pressionada, ou 00h se
nenhuma tecla foi pressionada).

CarsUpdate proc:
Proc para realizar a atualizao dos carros. Ela passa em todos os vetores que
representam as pistas, pega as posies dos carros e os faz andar ou no,
dependendo do local em que esto e das respectivas sinaleiras.
Registradores usados: BH (ultima tecla pressionada).

HaveCarInPosition proc:
Dado uma posio na tela, e um vetor pista qualquer, esta proc ira verificar se
algum carro daquele vetor pista se encontra na posio passada
Registradores usados: DX (posio da tela em que se deseja testar se tem carro
ou no), SI (EA inicial do vetor pista, que ira fornecer as posies dos carros)
Registradores atualizados: AL (ira retornar 0, caso no tenha carro, e 1 caso
tenha carro).

CarsAdd proc:
Proc para adicionar um carro em uma determinada pista. A pista em que ser
inserido o carro ser escolhida atravs do caractere recebido em BH.
Foi necessrio criar varias PROCS especificas que sero chamadas, uma para
cada pista, porque no conseguimos programar tudo dentro desta nica proc,
pois a mesma estava estourando o limite do JUMP.
Registradores usados: BH (recebe o caractere pressionado, para saber aonde
ser inserido o carro).

AddCars_NorthSouthFront proc:
Proc especifica para adicionar carros na pista NorthSouthFront. Carrega em SI
o EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_NorthSouthLeft proc:
Proc especifica para adicionar carros na pista NorthSouthLeft. Carrega em SI o
EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_NorthSouthRight proc:
Proc especifica para adicionar carros na pista NorthSouthRight. Carrega em SI
o EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_SouthNorthFront proc:
Proc especifica para adicionar carros na pista SouthNorthFront. Carrega em SI
o EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_SouthNorthLeft proc:
Proc especifica para adicionar carros na pista SouthNorthLeft. Carrega em SI o
EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_SouthNorthRight proc:
Proc especifica para adicionar carros na pista SouthNorthRight. Carrega em SI
o EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_WestEastFront proc:
Proc especifica para adicionar carros na pista WestEastFront. Carrega em SI o
EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_WestEastLeft proc:
Proc especifica para adicionar carros na pista WestEastLeft. Carrega em SI o EA
da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_WestEastRight proc:
Proc especifica para adicionar carros na pista WestEastRight. Carrega em SI o
EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_EastWestFront proc:
Proc especifica para adicionar carros na pista EastWestFront. Carrega em SI o
EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_EastWestLeft proc:
Proc especifica para adicionar carros na pista EastWestLeft. Carrega em SI o EA
da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

AddCars_EastWestRight proc:
Proc especifica para adicionar carros na pista EastWestRight. Carrega em SI o
EA da pista, e em AX o contador de carros daquela pista, para ento
chamar a proc genrica `AddCarsOnLane`.

CheckCarsBeforeLimitNorthSouth proc:
Proc especifica para retornar o numero de carros presentes nas pistas NORTESUL antes do semforo.
Esta proc utilizada para verificar se j no existem 05 carros antes da
sinaleira, antes de adicionar mais um
Registradores usados: SI (EA inicial do vetor da pista)
Registradores atualizados: AX (varivel que representa o numero de carros que
esta naquela pista- atualizado).

CheckCarsBeforeLimitSouthNorth proc:
Proc especifica para retornar o numero de carros presentes nas pistas SUL NORTE antes do semforo.
Esta proc utilizada para verificar se j no existem 05 carros antes da
sinaleira, antes de adicionar mais um
Registradores usados: SI (EA inicial do vetor da pista)
Registradores atualizados: AX (varivel que representa o numero de carros que
esta naquela pista- atualizado).

CheckCarsBeforeLimitEastWest proc:
Proc especifica para retornar o numero de carros presentes nas pistas LESTEOESTE antes do semforo.
Esta proc utilizada para verificar se j no existem 05 carros antes da
sinaleira, antes de adicionar mais um
Registradores usados: SI (EA inicial do vetor da pista)
Registradores atualizados: AX (varivel que representa o numero de carros que
esta naquela pista- atualizado)

CheckCarsBeforeLimitWestEast proc:
Proc especifica para retornar o numero de carros presentes nas pistas OESTELESTE antes do semforo.
Esta proc utilizada para verificar se j no existem 05 carros antes da
sinaleira, antes de adicionar mais um

Registradores usados: SI (EA inicial do vetor da pista)


Registradores atualizados: AX (varivel que representa o numero de carros que
esta naquela pista- atualizado).
o

AddCarsOnLane proc:
Proc genrica para adicionar carros na pista. Eh usado por varias outras
funes, apenas alterando o valor dos registradores de parmetro
;Registradores usados: SI (EA inicial do vetor da pista, DX (posio inicial na
qual ser inserido o carro), AX (varivel que representa o numero de carros)
Registradores atualizados: AX (varivel que representa o numero de carros atualizado).

CreateFile proc:
Proc para criao do arquivo de sada que ir gerar o status das pistas e das
sinaleiras.

WriteFile proc:
Proc para escrever os dados no arquivo gerado.

HexToAsc proc:
Funo para transformar um nmero hexadecimal em caracteres ASCII.

CloseFile proc:
Proc para fechar arquivo de sada.

LoopMain proc:
Proc que realiza o `loop` principal do programa.

LoopTiming proc:
Proc que realiza a paralizao do programa por meio segundo, para que fique
temporizado no loop.
Registradores atualizados: BH (cdigo da ultima tecla pressionada durante a
execuo do loop, ou 00h se nenhuma tecla foi pressionada).

ProcessEntry proc:
Proc para processor as informaes de entrada que foram recebidas pelo
teclado.
Registradores usados: AL(ultima tecla pressionada)
Registradores atualizados: tempb1 (ultima tecla pressionada exceto 00h).

IncCounter proc:
Proc que incrementa o contador e realiza um "count" de tempo para a
temporizao do programa.

Init proc:

Proc para dar o "start" do programa.

3. Concluses
A maior dificuldade encontrada em desenvolver com linguagem de baixo nvel a
falta de funes pr-definidas que estamos habituados a utilizar diariamente, como por
exemplo mostrar valores em tela e ler do teclado.
Durante o desenvolvimento do trabalho tivemos facilidade em encontrar uma grande
quantidade de material para pesquisa, livros (ebooks), exemplos e discusses em foruns. O
que com certeza ajudou no processo de aprofundamento do conhecimento da linguagem
assembly.
Depois de passar algumas semanas trabalhando com recursos mais limitados,
utilizando lgicas para trabalhar com bits e tendo que ter um certo cuidado com o tamanho de
cada procedimento. Certamente ao voltar a desenvolver em linguagens de mais alto nvel
iremos associar em como que o nosso cgido ser executado em nvel de mquina. E tambm
reduzir o tamanho de nossos programas, que hoje muitas vezes no chega a ser uma
preocupao.
4. Programa
A listagem gerada pelo tasm est disponvel no arquivo orgTs.LST, que est nessa mesma
pasta raz.