Pequeno problema em assembly!

stefanopt

Suspenso
Boas pessoal, estou aqui numa encrencada. Basicamente estou a programar um teclado de 16 teclas num Assembley de 16bits.
Com isto, eu acho que o teclado já faz o que o professor quer para o projeto, tirando mostrar a tecla que eu pressionei no display de 7 segmentos.
; ****************************************************************************************
; * *
; * C O N S T A N T E S *
; * *
; ****************************************************************************************
BUFFER EQU 100H ; endereco de memoria onde se guarda a tecla premida
LINHA EQU 8 ; posicao do bit correspondente a linha a testar
PIN EQU 8000H ; endereco do porto de E/S do teclado
POUT1 EQU 0A000H

; ****************************************************************************************
; * *
; * C O D I G O D O P R O J E T O *
; * *
; ****************************************************************************************
PLACE 0

iniciar:
MOV SP, 2200H
MOV R4, BUFFER ; R4 com o endereco de memoria do buffer
MOV R2, PIN ; R2 com o endereco do periferico (teclado)
MOV R7, POUT1

ciclo:
CALL teclado
JMP ciclo


; ****************************************************************************************
; * O codigo associado a etiqueta "repor_teclado" e responsavel por guardar os valores *
; * que devem ser tomados sempre que ha uma nova tentativa de encontrar tecla premida. *
; ****************************************************************************************

teclado:
PUSH R1
PUSH R2
PUSH R3
PUSH R4
PUSH R5
PUSH R6
PUSH R7

MOV R1, LINHA ; R1 - com a linha a testar (comeca pela quarta)
MOV R5, 3 ; R5 - responsavel por registar a linha (comeca c/ ultima)
MOV R6, 0 ; R6 - responsavel por registar a coluna

varrer_teclado:
MOVB [R2], R1 ; linha a testar no periferico de saida
MOVB R3, [R2] ; ler do periferico de entrada
AND R3, R3 ; afetar as flags (acendem se a comparacao falhar) <<<<<<<<<<<<<
JZ controlo ; se o AND deu 0 (False), entao vai continuar a varrer
JMP identificar_coluna ; se nao, vai tentar identificar a coluna da tecla premida

controlo:
SUB R5, 1 ; mudar de linha (ha desde a linha 0 a linha 3)
SHR R1, 1 ; avancar para a linha seguinte (1 p/ direita ate 0001)
JZ terminar_teclado ; se tiver percorrido todas as linhas volta a varrer tudo
JMP varrer_teclado ; se nao for zero, pode continuar a varrer ate acabar

identificar_coluna:
SHR R3, 1 ; tenta avancar para a coluna seguinte (1 p/ direita) <<<<<<<<<<
JC converter ; se a flag acendeu, entao encontrou e pode converter
ADD R6,1 ; se nao, pode continuar ir para a proxima coluna
JMP identificar_coluna ; volta ao mesmo ciclo, ate a ultima coluna

converter:
SHL R5, 2 ; R5 * 4
ADD R5, R6 ; R5 (atualizado) + R6
JMP escrever ; ja convertido, pode ser escrito

escrever:
MOVB [R4], R5 ; guardar tecla premida em memoria

display:
ADD R5, R7
MOV [R2], R5
MOV [R7], R2

terminar_teclado:
POP R7
POP R6
POP R5
POP R4
POP R3
POP R2
POP R1
RET


Isto não me atualiza o display..
Se quiserem o processador que sou obrigado a usar, apitem.
Neste caso eu tenho que varrer o teclado, encontrar a tecla pressionada e colocá-la no display. Funções como int não existem neste processador. Obrigado
 
Isso tem ar de ser o assembly do ist certo?

Se for é algo custom usado só pa ensino, não deves encontrar grandes respostas por aqui.
 
Back
Topo