SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
ARQUITETURA DE COMPUTADORES
LABORATÓRIO IV
JOGO PONG
André Cristóvão Neves Ferreira Nº 81715
Catarina Figueiredo Aleixo Nº 81731
João Ramiro Nº 81138
31/05/2015
Segunda-feira Sala LSD1
Professor: Paulo Lopes
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a1
1. INTRODUÇÃO
Este trabalho tem como objetivo principal aprofundar os conhecimentos
adquiridos relativos à programação em Assembly, e à utilização do processador P3,
em particular dos seus periféricos (janela de texto, leds, LCD, botões de pressão).
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a2
2. FLUXOGRAMA
Na figura 1 encontra-se representado um fluxograma simplificado do programa
desenvolvido:
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a3
Figura 1: Fluxograma do PONG
3. ASSEMBLER
O código assembly pedido na segunda semana de laboratório encontra-se em
anexo, devidamente comentado e identificado.
4. CONCLUSÃO
Com este trabalho laboratorial foram desenvolvidas competências relativas à
programação em Assembly, nomeadamente o encadeamento de rotinas, uso de
interrupções, como temporizador, botão pausa(IA), botão de Início(I0), bem como a
interação com os periféricos do P3.
Desta forma, concluímos que foi deveras importante a realização deste projeto, pois
permitiu aplicar todos os conhecimentos adquiridos relativos ao Assembly.
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a4
ANEXOS
;PONG
; Programa desenvolvido por:
; - André Cristóvão Neves Ferreira N° 81715
; - Catarina Figueiredo Aleixo Nº 81731
; - João Ramiro Nº 81138
;===============================================================================
; ZONA I: Definicao de constantes
; Pseudo-instrucao : EQU
;===============================================================================
; TEMPORIZACAO
DELAYVALUE EQU 0100h
; STACK POINTER
SP_INICIAL EQU FDFFh
CharAbaixo EQU 0100h
;Teclado
IO_TEST EQU FFFDh
IO_READ EQU FFFFh
; INTERRUPCOES
TAB_INT0 EQU FE00h
TAB_INTa EQU FE0ah
TAB_INTTemp EQU FE0Fh
MASCARA_INT EQU FFFAh
; TEMPORIZADOR
TempValor EQU FFF6h
TempControlo EQU FFF7h
; I/O a partir de FF00H
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a5
DISP7S1 EQU FFF0h
DISP7S2 EQU FFF1h
DISP7S3 EQU FFF2h
LCD_WRITE EQU FFF5h
LCD_CURSOR EQU FFF4h
LEDS EQU FFF8h
INTERRUPTORES EQU FFF9h
IO_CURSOR EQU FFFCh
IO_WRITE EQU FFFEh
LIMPAR_JANELA EQU FFFFh
XY_INICIAL EQU 0614h
FIM_TEXTO EQU '@'
RANDOM EQU 9C16h
;===============================================================================
; ZONA II: Definicao de variaveis
; Pseudo-instrucoes : WORD - palavra (16 bits)
; STR - sequencia de caracteres.
; Cada caracter ocupa 1 palavra
;===============================================================================
ORIG 8000h
VarTexto2 STR 'O jogo foi iniciado!',FIM_TEXTO
VarTexto1 STR 'Prima I0 para iniciar o jogo',FIM_TEXTO
LinhadeMenos STR '-',FIM_TEXTO
ColunasSimbolo STR '|',FIM_TEXTO
VarJ1 STR 'J1: ',FIM_TEXTO
VarJ2 STR 'J2: ',FIM_TEXTO
VarVel STR 'Delay: ',FIM_TEXTO
Raq STR '#',FIM_TEXTO
Espaco STR ' ',FIM_TEXTO
Bola STR 'O',FIM_TEXTO
Ganha1 STR 'Ganhou o Jogador 1',FIM_TEXTO
Ganha2 STR 'Ganhou o Jogador 2',FIM_TEXTO
PosRaq1 WORD 0B05h
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a6
PosRaq2 WORD 0B4Ah
PosBola WORD 0813h
MovBola WORD 0001h
Golo1 WORD 0000h
Golo2 WORD 0000h
Pausa WORD 0d ;quando 0 -> corre o jogo, quando 1 -> pausa o jogo
TmpJg WORD 0000h ;2 bytes mais significativos representam os minutos e
os 2 bytes menos significativos representam os
segundos
Tmp1 WORD 15 ;temporizador para 1 segundo
Speed WORD 0005h
EndCount WORD 0000h
;===============================================================================
; ZONA III: Codigo
; conjunto de instrucoes Assembly, ordenadas de forma a realizar
; as funcoes pretendidas
;===============================================================================
ORIG 0000h
JMP inicio
;===============================================================================
; LimpaJanela: Rotina que limpa a janela de texto.
; Entradas: --
; Saidas: ---
; Efeitos: ---
;===============================================================================
LimpaJanela: PUSH R2
MOV R2, LIMPAR_JANELA
MOV M[IO_CURSOR], R2
POP R2
RET
;===============================================================================
; EscString: Rotina que efectua a escrita de uma cadeia de caracter, terminada
; pelo caracter FIM_TEXTO, na janela de texto numa posicao
; especificada. Pode-se definir como terminador qualquer caracter
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a7
; ASCII.
; Entradas: pilha - posicao para escrita do primeiro carater
; pilha - apontador para o inicio da "string"
;===============================================================================
EscString: PUSH R1
PUSH R2
PUSH R3
MOV R2, M[SP+6] ; Apontador para inicio da "string"
MOV R3, M[SP+5] ; Localizacao do primeiro carater
Ciclo: MOV M[IO_CURSOR], R3
MOV R1, M[R2]
CMP R1, FIM_TEXTO
BR.Z FimEsc
CALL EscCar
INC R2
INC R3
BR Ciclo
FimEsc: POP R3
POP R2
POP R1
RETN 2 ; Actualiza STACK
;===============================================================================
; ESCLCD: Rotina para escrita no LCD
; Efeitos: Escrita de um caracter no LCD
;===============================================================================
EscLCD: PUSH R1
PUSH R2
MOV R1, M[SP+4]
MOV R2, M[SP+5]
MOV M[LCD_CURSOR], R1
ADD R2, 0030h ;Converte valor para ASCII
MOV M[LCD_WRITE], R2
POP R2
POP R1
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a8
RETN 2
;===============================================================================
; ESCLCDstr: Rotina para escrita no LCD
; Efeitos: Escrita de uma frase no LCD
;===============================================================================
EscLCDstr: PUSH R1
PUSH R2
PUSH R3
MOV R2, M[SP+6] ;Apontador para inicio da "string"
MOV R3, M[SP+5] ;Localizacao do primeiro carater
CicloLCD: MOV M[LCD_CURSOR], R3
MOV R1, M[R2]
CMP R1, FIM_TEXTO
BR.Z FimLCD
MOV M[LCD_WRITE], R1
INC R2
INC R3
BR CicloLCD
FimLCD: POP R3
POP R2
POP R1
RETN 2 ;Actualiza STACK
;===================================================================================
; tmpjogo: Rotina que permite actualizar a contagem do tempo de jogo
; Efeitos: Avança 1 segundo no tempo decorrido
; Inicializa M[Tmp1] conforme M[Speed], sempre de forma a contar
; aproximadamente 1 segundo
;===================================================================================
tmpjogo: MOV R6, M[TmpJg]
AND R6, 00FFh
CMP R6, 0059h ;verifica se e para incrementar os minutos
JMP.NZ incsec2
MOV R6, FF00h ;colocação dos segundos a 00
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a9
AND M[TmpJg], R6
MOV R6, 0100h
ADD M[TmpJg], R6
JMP rettmpjg
incsec2: MOV R6, M[TmpJg]
AND R6, 000Fh
CMP R6, 0009h ;verifica se e para incrementar as dezenas de segundos
JMP.NZ incsec1
MOV R6, M[TmpJg]
AND R6, FFF0h
ADD R6, 0010h
MOV M[TmpJg], R6
JMP rettmpjg
incsec1: INC M[TmpJg]
rettmpjg: CALL EscDisp
MOV R6, M[Speed]
CMP R6, 9 ;10 nao e divisivel por 9 e 9 e perto de 10
JMP.NZ is8
MOV R6, 18 ;9*2 = 18
JMP getTmp1
is8: CMP R6, 8 ;10 nao e divisivel por 8 e 8 e perto de 10
JMP.NZ is7
MOV R6, 16 ;8*2 = 16
JMP getTmp1
is7: CMP R6, 7 ;10 nao e divisivel por 7 e 7 e perto de 10
JMP.NZ is6
MOV R6, 14 ;7*2 = 14
JMP getTmp1
is6: CMP R6, 6 ;10 nao e divisivel por 6 e 6*2 = 12 e perto de 10
JMP.NZ is5
MOV R6, 18 ;6*3 = 18
JMP getTmp1
is5: CMP R6, 5 ;10/5 = 2 e 5*(2+1) = 15
JMP.NZ is4
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a10
MOV R6, 15 ;5*3 = 15
JMP getTmp1
is4: CMP R6, 4 ;10 nao e divisivel por 4 e 4*2 e o multiplo de 4 mais perto de 10
JMP.NZ is3
MOV R6, 12 ;4*3 = 12
JMP getTmp1
is3: CMP R6, 3 ;10 nao e divisivel por 3 e 3*3 e o multiplo de 3 mais perto de 10
JMP.NZ is2
MOV R6, 12 ;3*4 = 12
JMP getTmp1
is2: CMP R6, 2 ;10/2 = 5 e 2*(5+1) = 12
JMP.NZ is1
MOV R6, 12 ;2*6 = 12
JMP getTmp1
is1: MOV R6, 11 ;10/1 = 10 e 1*(10+1) = 11
getTmp1: MOV M[Tmp1], R6 ;Nota: quer-se sempre ter uma contagem a mais pois no final desta
inicialização é logo subtraido o valor de M[Speed]
RET
;==================================================================================
; EscDisp: Rotina que escreve nos displays de 7 segmentos o tempo decorrido de jogo
; Efeitos: Escrita do tempo nos displays de 7 segmentos
;==================================================================================
EscDisp: MOV R6, M[TmpJg]
AND R6, 000Fh
MOV M[DISP7S1], R6
MOV R6, M[TmpJg]
AND R6, 00F0h
SHR R6, 4
MOV M[DISP7S2], R6
MOV R6, M[TmpJg]
AND R6, 0F00h
SHR R6, 8
MOV M[DISP7S3], R6
RET
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a11
;======================================================================
; LimpDisp: Rotina que permite inicializar o display de 7 segmentos a 0
; Efeitos: Inicio da contagem do tempo de jogo a 0
;======================================================================
LimpDisp: PUSH R7
MOV M[TmpJg], R0
MOV M[DISP7S1], R0
MOV M[DISP7S2], R0
MOV M[DISP7S3], R0
POP R7
RET
;===================================================================================
; tempo: Rotina que permite actualizar o movimento da bola consoante as reflexões nos limites do
; ecrã de jogo e nas raquetes
; Efeitos: Movimentação da bola durante o jogo
;===================================================================================
tempo: PUSH R1
PUSH R5
PUSH R6
MOV R6, M[Speed]
MOV M[TempValor], R6
MOV R6,0001h
MOV M[TempControlo], R6
CMP M[Tmp1], R0
CALL.Z tmpjogo
MOV R6, M[Speed]
SUB M[Tmp1], R6
PUSH Espaco ;Passagem de parametros pelo STACK
PUSH M[PosBola] ;Passagem de parametros pelo STACK
CALL EscString
MOV R1, M[PosBola]
MOV R5, M[MovBola]
JMP Mov0
At0: MOV R5, 0000h
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a12
MOV M[MovBola], R5
MOV R1, M[PosBola]
Mov0: CMP R5, 0000h ;movimento diagonal direita-baixo
JMP.NZ Mov1
ADD R1, 0101h
CMP R1, M[PosRaq2] ;Canto superior da raquete 2
JMP.Z At3
MOV R7, M[PosRaq2]
ADD R7, 0100h ;1 bloco raquete 2
CMP R1, R7
JMP.Z At3
ADD R7, 0100h ;2 bloco raquete 2
CMP R1, R7
JMP.Z At3
ADD R7, 0100h ;3 bloco raquete 2
CMP R1, R7
JMP.Z At4
ADD R7, 0100h ;4 bloco raquete 2
CMP R1, R7
JMP.Z At2
ADD R7, 0100h ;5 bloco raquete 2
CMP R1, R7
JMP.Z At2
AND R1, FF00h
CMP R1, 1700h
JMP.Z At1
MOV R1, M[PosBola]
ADD R1, 0101h
MOV M[PosBola], R1
JMP IMP
At1: MOV R5, 0001h
MOV M[MovBola], R5
MOV R1, M[PosBola]
Mov1: CMP R5, 0001h ;movimento diagonal direita-cima
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a13
JMP.NZ Mov2
ADD R1, 0001h
SUB R1, 0100h
MOV R7, M[PosRaq2]
SUB R7, 0100h ;1 bloco raquete 2
CMP R1, R7
JMP.Z At3
ADD R7, 0100h ;2 bloco raquete 2
CMP R1, R7
JMP.Z At3
ADD R7, 0100h ;3 bloco raquete 2
CMP R1, R7
JMP.Z At4
ADD R7, 0100h ;4 bloco raquete 2
CMP R1, R7
JMP.Z At3
ADD R7, 0100h ;5 bloco raquete 2
CMP R1, R7
JMP.Z At2
ADD R7, 0100h ;Canto inferior da raquete 2
CMP R1, R7
JMP.Z At2
AND R1, FF00h
CMP R1, 0000h
JMP.Z At0
MOV R1, M[PosBola]
ADD R1, 0001h
SUB R1, 0100h
MOV M[PosBola],R1
JMP IMP
At2: MOV R5, 0002h
MOV M[MovBola], R5
MOV R1, M[PosBola]
Mov2: CMP R5, 0002h ;movimento diagonal esquerda-baixo
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a14
JMP.NZ Mov3
SUB R1, 0001h
ADD R1, 0100h
CMP R1, M[PosRaq1] ;Canto superior da raquete 1
JMP.Z At1
MOV R7, M[PosRaq1]
ADD R7, 0100h ;1 bloco raquete 1
CMP R1, R7
JMP.Z At1
ADD R7, 0100h ;2 bloco raquete 1
CMP R1, R7
JMP.Z At5
ADD R7, 0100h ;3 bloco raquete 1
CMP R1, R7
JMP.Z At0
ADD R7, 0100h ;4 bloco raquete 1
CMP R1, R7
JMP.Z At0
ADD R7, 0100h ;5 bloco raquete 1
CMP R1, R7
JMP.Z At0
AND R1, FF00h
CMP R1,1700h
BR.Z At3
MOV R1, M[PosBola]
SUB R1, 0001h
ADD R1, 0100h
MOV M[PosBola],R1
JMP IMP
At3: MOV R5, 0003h
MOV M[MovBola], R5
MOV R1, M[PosBola]
Mov3: CMP R5, 0003h ;movimento diagonal esquerda-cima
JMP.NZ Mov4
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a15
SUB R1, 0101h
MOV R7, M[PosRaq1]
SUB R7, 0100h ;1 bloco raquete 1
CMP R1, R7
JMP.Z At1
ADD R7, 0100h ;2 bloco raquete 1
CMP R1, R7
JMP.Z At1
ADD R7, 0100h ;3 bloco raquete 1
CMP R1, R7
JMP.Z At5
ADD R7, 0100h ;4 bloco raquete 1
CMP R1, R7
JMP.Z At0
ADD R7, 0100h ;5 bloco raquete 1
CMP R1, R7
JMP.Z At0
ADD R7, 0100h ;Canto inferior da raquete 1
CMP R1, R7
JMP.Z At0
AND R1, FF00h
CMP R1,0000h
JMP.Z At2
MOV R1, M[PosBola]
SUB R1, 0101h
MOV M[PosBola],R1
JMP IMP
At4: MOV R5, 0004h
MOV M[MovBola], R5
MOV R1, M[PosBola]
Mov4: CMP R5, 0004h ;movimento esquerda
JMP.NZ Mov5
SUB R1, 0001h
CMP R1, M[PosRaq1] ;1 bloco raquete 1
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a16
JMP.Z At1
MOV R7, M[PosRaq1]
ADD R7, 0100h ;2 bloco raquete 1
CMP R1, R7
JMP.Z At1
ADD R7, 0100h ;3 bloco raquete 1
CMP R1, R7
JMP.Z At5
ADD R7, 0100h ;4 bloco raquete 1
CMP R1, R7
JMP.Z At0
ADD R7, 0100h ;5 bloco raquete 1
CMP R1, R7
JMP.Z At0
MOV R1, M[PosBola]
SUB R1, 0001h
MOV M[PosBola],R1
JMP IMP
At5: MOV R5, 0005h
MOV M[MovBola], R5
MOV R1, M[PosBola]
Mov5: CMP R5, 0005h ;movimento direita
JMP.NZ IMP
ADD R1, 0001h
CMP R1, M[PosRaq2] ;1 bloco raquete 2
JMP.Z At3
MOV R7, M[PosRaq2]
ADD R7, 0100h ;2 bloco raquete 2
CMP R1, R7
JMP.Z At3
ADD R7, 0100h ;3 bloco raquete 2
CMP R1, R7
JMP.Z At4
ADD R7, 0100h ;4 bloco raquete 2
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a17
CMP R1, R7
JMP.Z At2
ADD R7, 0100h ;5 bloco raquete 2
CMP R1, R7
JMP.Z At2
MOV R1, M[PosBola]
ADD R1, 0001h
MOV M[PosBola],R1
IMP: MOV M[LEDS], R0
MOV M[EndCount], R0
AND R1, 00FFh
CMP R1, 0001h
JMP.Z geraposg1
CMP R1, 004Fh
JMP.Z geraposg2
PUSH Bola ;Passagem de parametros pelo STACK
PUSH M[PosBola] ;Passagem de parametros pelo STACK
CALL EscString
POP R6
POP R5
POP R1
RET
;===================================================================================
; geraposg1/geraposg2/geraposg: Rotinas geraposg1/geraposg2 actualizam as pontuações dos
; jogadores sempre que for golo (Golo do J1 - gerapos2 ou
; Golo do J2 - gerapos1)
; Rotina gerapos permite que todos os leds se acendam sempre que
; for golo e verifica se algum dos jogadores ganhou o jogo (ou seja, se
; alguma das pontuações é igual a 5)
; Efeitos: Actualização das pontuações e verificação se algum jogador ganhou
;===================================================================================
geraposg1: PUSH R7
INC M[Golo2] ;Atualização da pontuação do jogador 2
PUSH M[Golo2]
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a18
PUSH 800eh
CALL EscLCD
JMP geraposg
geraposg2: PUSH R7
INC M[Golo1] ;Atualização da pontuação do jogador 1
PUSH M[Golo1]
PUSH 8004h
CALL EscLCD
geraposg: POP R6 ;3 POP's necessarios da rotina tempo
POP R5
POP R1
MOV R7, FFFFh
MOV M[LEDS], R7 ;Todos os leds acendem quando é golo
MOV R7, 5
CMP M[Golo2], R7 ;Verificação se o J2 ganhou
JMP.Z inicioJ2
CMP M[Golo1], R7 ;Verificação se o J1 ganhou
JMP.Z inicioJ1
POP R7
JMP gerapos
;===================================================================================
; iniciaJogo: Rotina de inicio do jogo (após ter sido preesionado o botão IO)
; Efeitos: Escrita da pontuação de ambos os jogadores
; Escrita do limites do ecrã de jogo (superior e inferior)
; Escrita das raquetes
; Gera posição incial da bola (gerapos) e verifica se é válida essa posição no ecrã de jogo
; (jata)
; Loop principal do programa - WaitTecla - a partir do qual é permitida, caso não se
; encontre em pausa, a atualização do movimento das raquetes e da velocidade da bola
; (consoanteas teclas premidas) e ainda da posição da bola. O LCD também é
; actualizado sempre que for marcado algum golo ou que a velocidade tenha sido
; alterada pelo utilizador
;===================================================================================
iniciaJogo: PUSH R0
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a19
PUSH 8020h
CALL EscLCD
PUSH VarJ1
PUSH 8000h
CALL EscLCDstr
PUSH R0
PUSH 8004h
CALL EscLCD ;Escrita no LCD da pontuação (0) inicial do J1
PUSH VarJ2
PUSH 800ah
CALL EscLCDstr
PUSH R0
PUSH 800eh
CALL EscLCD ;Escrita no LCD da pontuação (0) inicial do J2
PUSH VarVel
PUSH 8010h
CALL EscLCDstr
PUSH M[Speed]
PUSH 801dh
CALL EscLCD ;Escrita no LCD da velocidade inicial da bola
MOV R7,2323H
MOV R4, 80
MOV R3, 0000h
CALL ContinuaEsc ;Limite superior do ecrã de jogo
MOV R4, 80
MOV R3, 1700h
CALL ContinuaEsc ;Limite inferior do ecrã de jogo
MOV R4, 22
MOV R3, 0100h
PUSH ColunasSimbolo
CALL contvert ;Limite vertical esquerdo do ecrã de jogo
MOV R4, 22
R3, 014Fh
PUSH ColunasSimbolo
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a20
CALL contvert ;Limite vertical direito do ecrã de jogo
MOV R4, 5
MOV R3, M[PosRaq1]
PUSH Raq
CALL contvert ;Desenha raquete 1
MOV R4, 5
MOV R3, M[PosRaq2]
PUSH Raq
CALL contvert ;Desenha raquete 2
MOV R6, M[Speed]
MOV M[TempValor], R6
MOV R6, 0001h
MOV M[TempControlo], R6
CMP M[Tmp1], R0
CALL.Z tmpjogo
MOV R6, M[Speed]
SUB M[Tmp1], R6
MOV R1, 2383h ;Seed
gerapos: TEST R1, 0001h ;Gera posição da bola aleatoriamente
BR.NZ fazxor ;Guardar valor gerado na memoria e usa-o em vez de R1
ROR R1, 1
BR jata
fazxor: XOR R1, RANDOM
ROR R1,1
jata: MOV M[PosBola],R1
MOV R2,R1
AND R2, 00FFh
CMP R2, 30
BR.N gerapos
CMP R2, 49
BR.P gerapos
MOV R2,R1
AND R2, FF00h
ROR R2,8
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a21
CMP R2, 6
BR.N gerapos
CMP R2, 17
BR.P gerapos
PUSH Bola
PUSH M[PosBola]
CALL EscString
WaitTecla: CMP M[Pausa], R0 ;Verifica se o jogo está em pausa
JMP.NZ WaitTecla
CALL Tecla
MOV R7, M[EndCount]
CMP R7, 2323H
CALL.Z tempo
PUSH VarVel
PUSH 8010h
CALL EscLCDstr
PUSH M[Speed]
PUSH 801dh
CALL EscLCD
JMP WaitTecla
;==================================================================================
; Tecla: Rotina que permite verificar se alguma tecla foi premida e, nesse caso, qual a tecla
; Efeitos: Tecla a - move raquete 1 para baixo
; Tecla q - move raquete 1 para cima
; Tecla l - move raquete 2 para baixo
; Tecla o - move raquete 2 para cima
; Tecla t - aumenta velocidade da bola
; Tecla g - diminui velocidade da bola
;===================================================================================
Tecla: PUSH R1
CMP M[IO_TEST], R0
BR.Z SairTecla
MOV R1,M[IO_READ]
CMP R1, 'a' ;Movimento descendente Raquete 1
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a22
CALL.Z moveDown1 ;Atualização da posicao da raquete
CMP R1, 'q' ;Movimento ascendente Raquete 1
CALL.Z moveUp1 ;Atualização da posicao da raquete
CMP R1, 'l' ;Movimento descendente Raquete 2
CALL.Z moveDown2 ;Atualização da posicao da raquete
CMP R1, 'o' ;Movimento ascendente Raquete 2
CALL.Z moveUp2 ;Atualização da posicao da raquete
CMP R1, 't' ;Incremento da velocidade
CALL.Z incspeed ;Atualização da velocidade da bola
CMP R1, 'g' ;Decremento da velocidade
CALL.Z decspeed ;Atualização da velocidade da bola
SairTecla: POP R1
RET
;===================================================================================
; incspeed: Rotina que permite aumentar a velocidade da bola
; Efeitos: Aumento da velociade da bola
;===================================================================================
incspeed: PUSH R7
MOV R7, 0001h
CMP M[Speed], R7
JMP.Z retincspeed
DEC M[Speed]
DEC M[TmpJg]
CALL tmpjogo ;recomeca o segundo para nao estragar contagem
retincspeed: POP R7
RET
;===================================================================================
;decspeed: Rotina que permite diminuir a velocidade da bola
; Efeitos: Diminuição da velociade da bola
;===================================================================================
decspeed: PUSH R7
MOV R7, 0009h
CMP M[Speed], R7
JMP.Z retdecspeed
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a23
INC M[Speed]
DEC M[TmpJg]
CALL tmpjogo ;recomeca o segundo para nao estragar contagem
Retdecspeed: POP R7
RET
;===================================================================================
; moveDown1: Rotina que permite o movimento descendente da raquete 1
; Efeitos: Sempre que o utilizador premir a tecla a, a raquete 1 efetua o movimento descendente
; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete)
;===================================================================================
moveUp1: PUSH R7 ;Passagem de parametros pelo STACK
MOV R5, M[PosRaq1] ;Verificação do limite superior do ecrã de jogo (inibindo o
movimento, nesse sentido, sempre que chegar ao limite)
CMP R5, 0105h
JMP.Z SaiUp1
ADD R5, 0400h
PUSH Espaco ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
SUB R5, 0500h ;R5 guarda nova posicao da raquete
CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado
JMP.NZ WU1
DEC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque
de lado da raquete
MOV R7, 0004h
MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com sentido
para a linha de golo mais próxima
PUSH Bola ;Passagem de parametros pelo STACK
PUSH M[PosBola] ;Passagem de parametros pelo STACK
CALL EscString
WU1: PUSH Raq ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
MOV M[PosRaq1], R5 ;Atualização da posição do primeiro caracter da raquete 1
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a24
SaiUp1: POP R7
RET
;===================================================================================
; moveUp2: Rotina que permite o movimento ascendente da raquete 2
; Efeitos: Sempre que o utilizador premir a tecla o, a raquete 2 efetua o movimento ascendente
; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete)
;===================================================================================
moveUp2: PUSH R7 ;Passagem de parametros pelo STACK
MOV R5, M[PosRaq2]
CMP R5, 014Ah ;Verificação do limite superior do ecrã de jogo (inibindo o
movimento, nesse sentido, sempre que chegar ao limite)
JMP.Z SaiUp2
ADD R5, 0400h
PUSH Espaco ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
SUB R5, 0500h ;R5 guarda nova posicao da raquete
CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado
JMP.NZ WU2
INC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque
de lado da raquete
MOV R7, 0005h
MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com sentido
para a linha de golo mais próxima
PUSH Bola ;Passagem de parametros pelo STACK
PUSH M[PosBola] ;Passagem de parametros pelo STACK
CALL EscString
WU2: PUSH Raq ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
MOV M[PosRaq2], R5 ;Atualização da posição do primeiro caracter da raquete 2
SaiUp2: POP R7
RET
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a25
;===================================================================================
; moveDown1: Rotina que permite o movimento descendente da raquete 1
; Efeitos: Sempre que o utilizador premir a tecla a, a raquete 1 efetua o movimento descendente
; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete)
;===================================================================================
moveDown1: PUSH R7
MOV R5, M[PosRaq1]
CMP R5, 1205h ;Verificação do limite inferior do ecrã de jogo (inibindo o
movimento, nesse sentido, sempre que chegar ao limite)
JMP.Z SaiDown1
PUSH Espaco ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
ADD R5, 0500h
CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado
JMP.NZ WD1
DEC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque
de lado da raquete
MOV R7, 0004h
MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com
sentido para a linha de golo mais próxima
PUSH Bola ;Passagem de parametros pelo STACK
PUSH M[PosBola] ;Passagem de parametros pelo STACK
CALL EscString
WD1: PUSH Raq ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
SUB R5, 0400h
MOV M[PosRaq1], R5 ;Atualização da posição do primeiro caracter da raquete 1
SaiDown1: POP R7
RET
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a26
;===================================================================================
; moveDown2: Rotina que permite o movimento descendente da raquete 2
; Efeitos: Sempre que o utilizador premir a tecla l, a raquete 2 efetua o movimento descendente
; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete)
;===================================================================================
moveDown2: PUSH R7
MOV R5, M[PosRaq2]
CMP R5, 124Ah ;Verificação do limite inferior do ecrã de jogo (inibindo o
movimento, nesse sentido, sempre que chegar ao limite)
JMP.Z SaiDown2
PUSH Espaco ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
ADD R5, 0500h
CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado
JMP.NZ WD2
INC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque
de lado da raquete
MOV R7, 0005h
MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com
sentido para a linha de golo mais próxima
PUSH Bola ;Passagem de parametros pelo STACK
PUSH M[PosBola] ;Passagem de parametros pelo STACK
CALL EscString
WD2: PUSH Raq ;Passagem de parametros pelo STACK
PUSH R5 ;Passagem de parametros pelo STACK
CALL EscString
SUB R5, 0400h
MOV M[PosRaq2], R5 ;Atualização da posição do primeiro caracter da raquete 2
SaiDown2: POP R7
RET
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a27
;===================================================================================
; ContinuaEsc: Rotina que efectua a escrita (na horizontal) de um caracter para o ecrã um determinado
; número de vezes
; Efeitos: Define os limites horizontais do ecrã de jogo
;===================================================================================
ContinuaEsc: PUSH LinhadeMenos ;Passagem de parametros pelo STACK
PUSH R3 ;Passagem de parametros pelo STACK
CALL EscString
INC R3
DEC R4
BR.NZ ContinuaEsc
RET
;===================================================================================
; contvert: Rotina que efectua a escrita (na vertical) de um caracter para o ecrã um determinado
; número de vezes
; Efeitos: Define os limites verticais do ecrã de jogo, bem como as duas raquetes
;===================================================================================
contvert: PUSH R7 ;Passagem de parametros pelo STACK
MOV R7, M[SP+3]
PUSH R7 ;Passagem de parametros pelo STACK
PUSH R3 ;Passagem de parametros pelo STACK
CALL EscString
ADD R3, CharAbaixo
DEC R4
POP R7
BR.NZ contvert
RETN 1
;===============================================================================
; EscCar: Rotina que efectua a escrita de um caracter para o ecran.
; O caracter pode ser visualizado na janela de texto.
; Entradas: R1 - Caracter a escrever
; Efeitos: alteracao da posicao de memoria M[IO]
;===============================================================================
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a28
EscCar: MOV M[IO_WRITE], R1
RET
;===================================================================================
; RotinaInt0: Rotina para iniciar o jogo
; Efeitos: Após o utilizador premir o botão de pressão IO, é iniciado o jogo
;===================================================================================
RotinaInt0: MOV R7, 1 ;Iniciar o jogo
RTI
;===================================================================================
; RotinaInta: Rotina para pausar/continuar o jogo
; Efeitos: Permite pausar/continuar o jogo após ter sido pressionado o botão IA
;===================================================================================
RotinaInta: PUSH R7 ;Passagem de parametros pelo STACK
MOV R7, 1
CMP M[Pausa], R0 ;Verifica se pausa = 0 ou pausa = 1
JMP.NZ nopaus
MOV M[Pausa], R7
POP R7
JMP returni1
nopaus: MOV M[Pausa], R0
POP R7
returni1: RTI
;===============================================================================
; RotinaIntTemp: Rotina de interrupção - contagem do tempo
;===============================================================================
RotinaIntTemp: PUSH R7
MOV R7, 2323H
MOV M[EndCount], R7
POP R7
RTI
;===================================================================================
; inicio: Inicialização da TVI e da máscara de interrupções
; Interrupção incial (RotinaInt0) ativa até que seja pressionado o botão de pressão I0 que
; permite inicializar o jogo
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a29
; Inicialização do ecrã de jogo (incluindo os limites do ecrã, as duas raquetes, bola, golos do J1 e
; J2, ambos com 0 pontos, e a velocidade da bola)
; Inicio do jogo
; Efeitos: Escreve a string de quem foi o vencedor na janela de texto
;===================================================================================
inicioJ1: POP R7
CALL LimpaJanela
PUSH Ganha1 ;Passagem de parametros pelo STACK
PUSH 0a0dh ;Passagem de parametros pelo STACK
CALL EscString
JMP inicio
inicioJ2: POP R7
CALL LimpaJanela
PUSH Ganha2 ;Passagem de parametros pelo STACK
PUSH 0a0dh ;Passagem de parametros pelo STACK
CALL EscString
inicio: MOV R1, SP_INICIAL
MOV SP, R1
MOV M[TempControlo], R0
DSI
MOV R1, RotinaInt0 ;Inicialização da TVI
MOV M[TAB_INT0], R1
MOV R1, RotinaInta
MOV M[TAB_INTa], R1
MOV R1, RotinaIntTemp
MOV M[TAB_INTTemp], R1
MOV R1,8401h
MOV M[MASCARA_INT], R1 ;Inicialização da máscara de interrupções
ENI
PUSH VarTexto1 ;Passagem de parametros pelo STACK
PUSH 0202h ;Passagem de parametros pelo STACK
CALL EscString
MOV M[Pausa], R0 ;Inicialmente pausa = 0
MOV M[Golo1], R0 ;Inicialização golos J1
A.COMPUTADORES
2014-2015, MEEC
| P á g i n a30
MOV M[Golo2], R0 ;Inicialização golos J2
MOV R1, 0B05h
MOV M[PosRaq1], R1 ;Posição inicial Raquete 1
MOV R1, 0B4ah
MOV M[PosRaq2], R1 ;Posição inicial Raquete 2
MOV R1, M[Speed] ;Velocidade inicial da bola
ADD R1, ah
MOV M[Tmp1], R1
MOV R7, 0
WAIT: CMP R7, 0
BR.Z WAIT
CALL LimpaJanela
CALL LimpDisp
JMP iniciaJogo ;Inicio do jogo

Mais conteúdo relacionado

Semelhante a Rel3-81715-81731-81138

Pbl assembly avr como atmega328 p - rev.1
Pbl   assembly avr como atmega328 p - rev.1Pbl   assembly avr como atmega328 p - rev.1
Pbl assembly avr como atmega328 p - rev.1andrademanoel
 
Cartilha Micro-Controlador 80c51 - Assembly
Cartilha Micro-Controlador 80c51 - AssemblyCartilha Micro-Controlador 80c51 - Assembly
Cartilha Micro-Controlador 80c51 - AssemblyPedro Raphael
 
Microprocessadores - exemplos
Microprocessadores - exemplosMicroprocessadores - exemplos
Microprocessadores - exemplosAlexandre Lomeu
 
AulaProgramacao6LingC_MatrizesExemplosERE.pptx
AulaProgramacao6LingC_MatrizesExemplosERE.pptxAulaProgramacao6LingC_MatrizesExemplosERE.pptx
AulaProgramacao6LingC_MatrizesExemplosERE.pptxElisangelaPereiraCal1
 
Desafio de Robótica - Católica de Santa Catarina - Joinville
Desafio de Robótica - Católica de Santa Catarina - JoinvilleDesafio de Robótica - Católica de Santa Catarina - Joinville
Desafio de Robótica - Católica de Santa Catarina - JoinvilleNatã Barbosa
 
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02Cláudio Alves
 
Microcontroladores pic ling c unicamp
Microcontroladores pic ling c unicampMicrocontroladores pic ling c unicamp
Microcontroladores pic ling c unicampFrancisco Fambrini
 
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoLidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoRafael Ponte
 
Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04André Phillip Bertoletti
 
Lógica de Programação - Unimep/Pronatec - Aula03
Lógica de Programação - Unimep/Pronatec - Aula03Lógica de Programação - Unimep/Pronatec - Aula03
Lógica de Programação - Unimep/Pronatec - Aula03André Phillip Bertoletti
 
Calculadora Cientifica no visualg
Calculadora Cientifica no visualgCalculadora Cientifica no visualg
Calculadora Cientifica no visualgDenise Marinho
 
Lógica de Programação - Unimep/Pronatec - Aula06
Lógica de Programação - Unimep/Pronatec - Aula06Lógica de Programação - Unimep/Pronatec - Aula06
Lógica de Programação - Unimep/Pronatec - Aula06André Phillip Bertoletti
 

Semelhante a Rel3-81715-81731-81138 (20)

Pbl assembly avr como atmega328 p - rev.1
Pbl   assembly avr como atmega328 p - rev.1Pbl   assembly avr como atmega328 p - rev.1
Pbl assembly avr como atmega328 p - rev.1
 
Cartilha Micro-Controlador 80c51 - Assembly
Cartilha Micro-Controlador 80c51 - AssemblyCartilha Micro-Controlador 80c51 - Assembly
Cartilha Micro-Controlador 80c51 - Assembly
 
Microprocessadores - exemplos
Microprocessadores - exemplosMicroprocessadores - exemplos
Microprocessadores - exemplos
 
AulaProgramacao6LingC_MatrizesExemplosERE.pptx
AulaProgramacao6LingC_MatrizesExemplosERE.pptxAulaProgramacao6LingC_MatrizesExemplosERE.pptx
AulaProgramacao6LingC_MatrizesExemplosERE.pptx
 
Desafio de Robótica - Católica de Santa Catarina - Joinville
Desafio de Robótica - Católica de Santa Catarina - JoinvilleDesafio de Robótica - Católica de Santa Catarina - Joinville
Desafio de Robótica - Católica de Santa Catarina - Joinville
 
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
 
Microcontroladores pic ling c unicamp
Microcontroladores pic ling c unicampMicrocontroladores pic ling c unicamp
Microcontroladores pic ling c unicamp
 
portugol
portugolportugol
portugol
 
Hp 12 c
Hp 12 cHp 12 c
Hp 12 c
 
Falando "Postgrês"
Falando "Postgrês"Falando "Postgrês"
Falando "Postgrês"
 
Cheat sheet Mips 32 bits
Cheat sheet Mips 32 bitsCheat sheet Mips 32 bits
Cheat sheet Mips 32 bits
 
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoLidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
 
Relatório final
Relatório finalRelatório final
Relatório final
 
Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04Lógica de Programação - Unimep/Pronatec - Aula04
Lógica de Programação - Unimep/Pronatec - Aula04
 
Lógica de Programação - Unimep/Pronatec - Aula03
Lógica de Programação - Unimep/Pronatec - Aula03Lógica de Programação - Unimep/Pronatec - Aula03
Lógica de Programação - Unimep/Pronatec - Aula03
 
Aula1
Aula1Aula1
Aula1
 
Calculadora Cientifica no visualg
Calculadora Cientifica no visualgCalculadora Cientifica no visualg
Calculadora Cientifica no visualg
 
Clp ab avancado
Clp ab avancadoClp ab avancado
Clp ab avancado
 
Lógica de Programação - Unimep/Pronatec - Aula06
Lógica de Programação - Unimep/Pronatec - Aula06Lógica de Programação - Unimep/Pronatec - Aula06
Lógica de Programação - Unimep/Pronatec - Aula06
 
Quantas Instruções por Ciclo?
Quantas Instruções por Ciclo?Quantas Instruções por Ciclo?
Quantas Instruções por Ciclo?
 

Rel3-81715-81731-81138

  • 1. ARQUITETURA DE COMPUTADORES LABORATÓRIO IV JOGO PONG André Cristóvão Neves Ferreira Nº 81715 Catarina Figueiredo Aleixo Nº 81731 João Ramiro Nº 81138 31/05/2015 Segunda-feira Sala LSD1 Professor: Paulo Lopes
  • 2. A.COMPUTADORES 2014-2015, MEEC | P á g i n a1 1. INTRODUÇÃO Este trabalho tem como objetivo principal aprofundar os conhecimentos adquiridos relativos à programação em Assembly, e à utilização do processador P3, em particular dos seus periféricos (janela de texto, leds, LCD, botões de pressão).
  • 3. A.COMPUTADORES 2014-2015, MEEC | P á g i n a2 2. FLUXOGRAMA Na figura 1 encontra-se representado um fluxograma simplificado do programa desenvolvido:
  • 4. A.COMPUTADORES 2014-2015, MEEC | P á g i n a3 Figura 1: Fluxograma do PONG 3. ASSEMBLER O código assembly pedido na segunda semana de laboratório encontra-se em anexo, devidamente comentado e identificado. 4. CONCLUSÃO Com este trabalho laboratorial foram desenvolvidas competências relativas à programação em Assembly, nomeadamente o encadeamento de rotinas, uso de interrupções, como temporizador, botão pausa(IA), botão de Início(I0), bem como a interação com os periféricos do P3. Desta forma, concluímos que foi deveras importante a realização deste projeto, pois permitiu aplicar todos os conhecimentos adquiridos relativos ao Assembly.
  • 5. A.COMPUTADORES 2014-2015, MEEC | P á g i n a4 ANEXOS ;PONG ; Programa desenvolvido por: ; - André Cristóvão Neves Ferreira N° 81715 ; - Catarina Figueiredo Aleixo Nº 81731 ; - João Ramiro Nº 81138 ;=============================================================================== ; ZONA I: Definicao de constantes ; Pseudo-instrucao : EQU ;=============================================================================== ; TEMPORIZACAO DELAYVALUE EQU 0100h ; STACK POINTER SP_INICIAL EQU FDFFh CharAbaixo EQU 0100h ;Teclado IO_TEST EQU FFFDh IO_READ EQU FFFFh ; INTERRUPCOES TAB_INT0 EQU FE00h TAB_INTa EQU FE0ah TAB_INTTemp EQU FE0Fh MASCARA_INT EQU FFFAh ; TEMPORIZADOR TempValor EQU FFF6h TempControlo EQU FFF7h ; I/O a partir de FF00H
  • 6. A.COMPUTADORES 2014-2015, MEEC | P á g i n a5 DISP7S1 EQU FFF0h DISP7S2 EQU FFF1h DISP7S3 EQU FFF2h LCD_WRITE EQU FFF5h LCD_CURSOR EQU FFF4h LEDS EQU FFF8h INTERRUPTORES EQU FFF9h IO_CURSOR EQU FFFCh IO_WRITE EQU FFFEh LIMPAR_JANELA EQU FFFFh XY_INICIAL EQU 0614h FIM_TEXTO EQU '@' RANDOM EQU 9C16h ;=============================================================================== ; ZONA II: Definicao de variaveis ; Pseudo-instrucoes : WORD - palavra (16 bits) ; STR - sequencia de caracteres. ; Cada caracter ocupa 1 palavra ;=============================================================================== ORIG 8000h VarTexto2 STR 'O jogo foi iniciado!',FIM_TEXTO VarTexto1 STR 'Prima I0 para iniciar o jogo',FIM_TEXTO LinhadeMenos STR '-',FIM_TEXTO ColunasSimbolo STR '|',FIM_TEXTO VarJ1 STR 'J1: ',FIM_TEXTO VarJ2 STR 'J2: ',FIM_TEXTO VarVel STR 'Delay: ',FIM_TEXTO Raq STR '#',FIM_TEXTO Espaco STR ' ',FIM_TEXTO Bola STR 'O',FIM_TEXTO Ganha1 STR 'Ganhou o Jogador 1',FIM_TEXTO Ganha2 STR 'Ganhou o Jogador 2',FIM_TEXTO PosRaq1 WORD 0B05h
  • 7. A.COMPUTADORES 2014-2015, MEEC | P á g i n a6 PosRaq2 WORD 0B4Ah PosBola WORD 0813h MovBola WORD 0001h Golo1 WORD 0000h Golo2 WORD 0000h Pausa WORD 0d ;quando 0 -> corre o jogo, quando 1 -> pausa o jogo TmpJg WORD 0000h ;2 bytes mais significativos representam os minutos e os 2 bytes menos significativos representam os segundos Tmp1 WORD 15 ;temporizador para 1 segundo Speed WORD 0005h EndCount WORD 0000h ;=============================================================================== ; ZONA III: Codigo ; conjunto de instrucoes Assembly, ordenadas de forma a realizar ; as funcoes pretendidas ;=============================================================================== ORIG 0000h JMP inicio ;=============================================================================== ; LimpaJanela: Rotina que limpa a janela de texto. ; Entradas: -- ; Saidas: --- ; Efeitos: --- ;=============================================================================== LimpaJanela: PUSH R2 MOV R2, LIMPAR_JANELA MOV M[IO_CURSOR], R2 POP R2 RET ;=============================================================================== ; EscString: Rotina que efectua a escrita de uma cadeia de caracter, terminada ; pelo caracter FIM_TEXTO, na janela de texto numa posicao ; especificada. Pode-se definir como terminador qualquer caracter
  • 8. A.COMPUTADORES 2014-2015, MEEC | P á g i n a7 ; ASCII. ; Entradas: pilha - posicao para escrita do primeiro carater ; pilha - apontador para o inicio da "string" ;=============================================================================== EscString: PUSH R1 PUSH R2 PUSH R3 MOV R2, M[SP+6] ; Apontador para inicio da "string" MOV R3, M[SP+5] ; Localizacao do primeiro carater Ciclo: MOV M[IO_CURSOR], R3 MOV R1, M[R2] CMP R1, FIM_TEXTO BR.Z FimEsc CALL EscCar INC R2 INC R3 BR Ciclo FimEsc: POP R3 POP R2 POP R1 RETN 2 ; Actualiza STACK ;=============================================================================== ; ESCLCD: Rotina para escrita no LCD ; Efeitos: Escrita de um caracter no LCD ;=============================================================================== EscLCD: PUSH R1 PUSH R2 MOV R1, M[SP+4] MOV R2, M[SP+5] MOV M[LCD_CURSOR], R1 ADD R2, 0030h ;Converte valor para ASCII MOV M[LCD_WRITE], R2 POP R2 POP R1
  • 9. A.COMPUTADORES 2014-2015, MEEC | P á g i n a8 RETN 2 ;=============================================================================== ; ESCLCDstr: Rotina para escrita no LCD ; Efeitos: Escrita de uma frase no LCD ;=============================================================================== EscLCDstr: PUSH R1 PUSH R2 PUSH R3 MOV R2, M[SP+6] ;Apontador para inicio da "string" MOV R3, M[SP+5] ;Localizacao do primeiro carater CicloLCD: MOV M[LCD_CURSOR], R3 MOV R1, M[R2] CMP R1, FIM_TEXTO BR.Z FimLCD MOV M[LCD_WRITE], R1 INC R2 INC R3 BR CicloLCD FimLCD: POP R3 POP R2 POP R1 RETN 2 ;Actualiza STACK ;=================================================================================== ; tmpjogo: Rotina que permite actualizar a contagem do tempo de jogo ; Efeitos: Avança 1 segundo no tempo decorrido ; Inicializa M[Tmp1] conforme M[Speed], sempre de forma a contar ; aproximadamente 1 segundo ;=================================================================================== tmpjogo: MOV R6, M[TmpJg] AND R6, 00FFh CMP R6, 0059h ;verifica se e para incrementar os minutos JMP.NZ incsec2 MOV R6, FF00h ;colocação dos segundos a 00
  • 10. A.COMPUTADORES 2014-2015, MEEC | P á g i n a9 AND M[TmpJg], R6 MOV R6, 0100h ADD M[TmpJg], R6 JMP rettmpjg incsec2: MOV R6, M[TmpJg] AND R6, 000Fh CMP R6, 0009h ;verifica se e para incrementar as dezenas de segundos JMP.NZ incsec1 MOV R6, M[TmpJg] AND R6, FFF0h ADD R6, 0010h MOV M[TmpJg], R6 JMP rettmpjg incsec1: INC M[TmpJg] rettmpjg: CALL EscDisp MOV R6, M[Speed] CMP R6, 9 ;10 nao e divisivel por 9 e 9 e perto de 10 JMP.NZ is8 MOV R6, 18 ;9*2 = 18 JMP getTmp1 is8: CMP R6, 8 ;10 nao e divisivel por 8 e 8 e perto de 10 JMP.NZ is7 MOV R6, 16 ;8*2 = 16 JMP getTmp1 is7: CMP R6, 7 ;10 nao e divisivel por 7 e 7 e perto de 10 JMP.NZ is6 MOV R6, 14 ;7*2 = 14 JMP getTmp1 is6: CMP R6, 6 ;10 nao e divisivel por 6 e 6*2 = 12 e perto de 10 JMP.NZ is5 MOV R6, 18 ;6*3 = 18 JMP getTmp1 is5: CMP R6, 5 ;10/5 = 2 e 5*(2+1) = 15 JMP.NZ is4
  • 11. A.COMPUTADORES 2014-2015, MEEC | P á g i n a10 MOV R6, 15 ;5*3 = 15 JMP getTmp1 is4: CMP R6, 4 ;10 nao e divisivel por 4 e 4*2 e o multiplo de 4 mais perto de 10 JMP.NZ is3 MOV R6, 12 ;4*3 = 12 JMP getTmp1 is3: CMP R6, 3 ;10 nao e divisivel por 3 e 3*3 e o multiplo de 3 mais perto de 10 JMP.NZ is2 MOV R6, 12 ;3*4 = 12 JMP getTmp1 is2: CMP R6, 2 ;10/2 = 5 e 2*(5+1) = 12 JMP.NZ is1 MOV R6, 12 ;2*6 = 12 JMP getTmp1 is1: MOV R6, 11 ;10/1 = 10 e 1*(10+1) = 11 getTmp1: MOV M[Tmp1], R6 ;Nota: quer-se sempre ter uma contagem a mais pois no final desta inicialização é logo subtraido o valor de M[Speed] RET ;================================================================================== ; EscDisp: Rotina que escreve nos displays de 7 segmentos o tempo decorrido de jogo ; Efeitos: Escrita do tempo nos displays de 7 segmentos ;================================================================================== EscDisp: MOV R6, M[TmpJg] AND R6, 000Fh MOV M[DISP7S1], R6 MOV R6, M[TmpJg] AND R6, 00F0h SHR R6, 4 MOV M[DISP7S2], R6 MOV R6, M[TmpJg] AND R6, 0F00h SHR R6, 8 MOV M[DISP7S3], R6 RET
  • 12. A.COMPUTADORES 2014-2015, MEEC | P á g i n a11 ;====================================================================== ; LimpDisp: Rotina que permite inicializar o display de 7 segmentos a 0 ; Efeitos: Inicio da contagem do tempo de jogo a 0 ;====================================================================== LimpDisp: PUSH R7 MOV M[TmpJg], R0 MOV M[DISP7S1], R0 MOV M[DISP7S2], R0 MOV M[DISP7S3], R0 POP R7 RET ;=================================================================================== ; tempo: Rotina que permite actualizar o movimento da bola consoante as reflexões nos limites do ; ecrã de jogo e nas raquetes ; Efeitos: Movimentação da bola durante o jogo ;=================================================================================== tempo: PUSH R1 PUSH R5 PUSH R6 MOV R6, M[Speed] MOV M[TempValor], R6 MOV R6,0001h MOV M[TempControlo], R6 CMP M[Tmp1], R0 CALL.Z tmpjogo MOV R6, M[Speed] SUB M[Tmp1], R6 PUSH Espaco ;Passagem de parametros pelo STACK PUSH M[PosBola] ;Passagem de parametros pelo STACK CALL EscString MOV R1, M[PosBola] MOV R5, M[MovBola] JMP Mov0 At0: MOV R5, 0000h
  • 13. A.COMPUTADORES 2014-2015, MEEC | P á g i n a12 MOV M[MovBola], R5 MOV R1, M[PosBola] Mov0: CMP R5, 0000h ;movimento diagonal direita-baixo JMP.NZ Mov1 ADD R1, 0101h CMP R1, M[PosRaq2] ;Canto superior da raquete 2 JMP.Z At3 MOV R7, M[PosRaq2] ADD R7, 0100h ;1 bloco raquete 2 CMP R1, R7 JMP.Z At3 ADD R7, 0100h ;2 bloco raquete 2 CMP R1, R7 JMP.Z At3 ADD R7, 0100h ;3 bloco raquete 2 CMP R1, R7 JMP.Z At4 ADD R7, 0100h ;4 bloco raquete 2 CMP R1, R7 JMP.Z At2 ADD R7, 0100h ;5 bloco raquete 2 CMP R1, R7 JMP.Z At2 AND R1, FF00h CMP R1, 1700h JMP.Z At1 MOV R1, M[PosBola] ADD R1, 0101h MOV M[PosBola], R1 JMP IMP At1: MOV R5, 0001h MOV M[MovBola], R5 MOV R1, M[PosBola] Mov1: CMP R5, 0001h ;movimento diagonal direita-cima
  • 14. A.COMPUTADORES 2014-2015, MEEC | P á g i n a13 JMP.NZ Mov2 ADD R1, 0001h SUB R1, 0100h MOV R7, M[PosRaq2] SUB R7, 0100h ;1 bloco raquete 2 CMP R1, R7 JMP.Z At3 ADD R7, 0100h ;2 bloco raquete 2 CMP R1, R7 JMP.Z At3 ADD R7, 0100h ;3 bloco raquete 2 CMP R1, R7 JMP.Z At4 ADD R7, 0100h ;4 bloco raquete 2 CMP R1, R7 JMP.Z At3 ADD R7, 0100h ;5 bloco raquete 2 CMP R1, R7 JMP.Z At2 ADD R7, 0100h ;Canto inferior da raquete 2 CMP R1, R7 JMP.Z At2 AND R1, FF00h CMP R1, 0000h JMP.Z At0 MOV R1, M[PosBola] ADD R1, 0001h SUB R1, 0100h MOV M[PosBola],R1 JMP IMP At2: MOV R5, 0002h MOV M[MovBola], R5 MOV R1, M[PosBola] Mov2: CMP R5, 0002h ;movimento diagonal esquerda-baixo
  • 15. A.COMPUTADORES 2014-2015, MEEC | P á g i n a14 JMP.NZ Mov3 SUB R1, 0001h ADD R1, 0100h CMP R1, M[PosRaq1] ;Canto superior da raquete 1 JMP.Z At1 MOV R7, M[PosRaq1] ADD R7, 0100h ;1 bloco raquete 1 CMP R1, R7 JMP.Z At1 ADD R7, 0100h ;2 bloco raquete 1 CMP R1, R7 JMP.Z At5 ADD R7, 0100h ;3 bloco raquete 1 CMP R1, R7 JMP.Z At0 ADD R7, 0100h ;4 bloco raquete 1 CMP R1, R7 JMP.Z At0 ADD R7, 0100h ;5 bloco raquete 1 CMP R1, R7 JMP.Z At0 AND R1, FF00h CMP R1,1700h BR.Z At3 MOV R1, M[PosBola] SUB R1, 0001h ADD R1, 0100h MOV M[PosBola],R1 JMP IMP At3: MOV R5, 0003h MOV M[MovBola], R5 MOV R1, M[PosBola] Mov3: CMP R5, 0003h ;movimento diagonal esquerda-cima JMP.NZ Mov4
  • 16. A.COMPUTADORES 2014-2015, MEEC | P á g i n a15 SUB R1, 0101h MOV R7, M[PosRaq1] SUB R7, 0100h ;1 bloco raquete 1 CMP R1, R7 JMP.Z At1 ADD R7, 0100h ;2 bloco raquete 1 CMP R1, R7 JMP.Z At1 ADD R7, 0100h ;3 bloco raquete 1 CMP R1, R7 JMP.Z At5 ADD R7, 0100h ;4 bloco raquete 1 CMP R1, R7 JMP.Z At0 ADD R7, 0100h ;5 bloco raquete 1 CMP R1, R7 JMP.Z At0 ADD R7, 0100h ;Canto inferior da raquete 1 CMP R1, R7 JMP.Z At0 AND R1, FF00h CMP R1,0000h JMP.Z At2 MOV R1, M[PosBola] SUB R1, 0101h MOV M[PosBola],R1 JMP IMP At4: MOV R5, 0004h MOV M[MovBola], R5 MOV R1, M[PosBola] Mov4: CMP R5, 0004h ;movimento esquerda JMP.NZ Mov5 SUB R1, 0001h CMP R1, M[PosRaq1] ;1 bloco raquete 1
  • 17. A.COMPUTADORES 2014-2015, MEEC | P á g i n a16 JMP.Z At1 MOV R7, M[PosRaq1] ADD R7, 0100h ;2 bloco raquete 1 CMP R1, R7 JMP.Z At1 ADD R7, 0100h ;3 bloco raquete 1 CMP R1, R7 JMP.Z At5 ADD R7, 0100h ;4 bloco raquete 1 CMP R1, R7 JMP.Z At0 ADD R7, 0100h ;5 bloco raquete 1 CMP R1, R7 JMP.Z At0 MOV R1, M[PosBola] SUB R1, 0001h MOV M[PosBola],R1 JMP IMP At5: MOV R5, 0005h MOV M[MovBola], R5 MOV R1, M[PosBola] Mov5: CMP R5, 0005h ;movimento direita JMP.NZ IMP ADD R1, 0001h CMP R1, M[PosRaq2] ;1 bloco raquete 2 JMP.Z At3 MOV R7, M[PosRaq2] ADD R7, 0100h ;2 bloco raquete 2 CMP R1, R7 JMP.Z At3 ADD R7, 0100h ;3 bloco raquete 2 CMP R1, R7 JMP.Z At4 ADD R7, 0100h ;4 bloco raquete 2
  • 18. A.COMPUTADORES 2014-2015, MEEC | P á g i n a17 CMP R1, R7 JMP.Z At2 ADD R7, 0100h ;5 bloco raquete 2 CMP R1, R7 JMP.Z At2 MOV R1, M[PosBola] ADD R1, 0001h MOV M[PosBola],R1 IMP: MOV M[LEDS], R0 MOV M[EndCount], R0 AND R1, 00FFh CMP R1, 0001h JMP.Z geraposg1 CMP R1, 004Fh JMP.Z geraposg2 PUSH Bola ;Passagem de parametros pelo STACK PUSH M[PosBola] ;Passagem de parametros pelo STACK CALL EscString POP R6 POP R5 POP R1 RET ;=================================================================================== ; geraposg1/geraposg2/geraposg: Rotinas geraposg1/geraposg2 actualizam as pontuações dos ; jogadores sempre que for golo (Golo do J1 - gerapos2 ou ; Golo do J2 - gerapos1) ; Rotina gerapos permite que todos os leds se acendam sempre que ; for golo e verifica se algum dos jogadores ganhou o jogo (ou seja, se ; alguma das pontuações é igual a 5) ; Efeitos: Actualização das pontuações e verificação se algum jogador ganhou ;=================================================================================== geraposg1: PUSH R7 INC M[Golo2] ;Atualização da pontuação do jogador 2 PUSH M[Golo2]
  • 19. A.COMPUTADORES 2014-2015, MEEC | P á g i n a18 PUSH 800eh CALL EscLCD JMP geraposg geraposg2: PUSH R7 INC M[Golo1] ;Atualização da pontuação do jogador 1 PUSH M[Golo1] PUSH 8004h CALL EscLCD geraposg: POP R6 ;3 POP's necessarios da rotina tempo POP R5 POP R1 MOV R7, FFFFh MOV M[LEDS], R7 ;Todos os leds acendem quando é golo MOV R7, 5 CMP M[Golo2], R7 ;Verificação se o J2 ganhou JMP.Z inicioJ2 CMP M[Golo1], R7 ;Verificação se o J1 ganhou JMP.Z inicioJ1 POP R7 JMP gerapos ;=================================================================================== ; iniciaJogo: Rotina de inicio do jogo (após ter sido preesionado o botão IO) ; Efeitos: Escrita da pontuação de ambos os jogadores ; Escrita do limites do ecrã de jogo (superior e inferior) ; Escrita das raquetes ; Gera posição incial da bola (gerapos) e verifica se é válida essa posição no ecrã de jogo ; (jata) ; Loop principal do programa - WaitTecla - a partir do qual é permitida, caso não se ; encontre em pausa, a atualização do movimento das raquetes e da velocidade da bola ; (consoanteas teclas premidas) e ainda da posição da bola. O LCD também é ; actualizado sempre que for marcado algum golo ou que a velocidade tenha sido ; alterada pelo utilizador ;=================================================================================== iniciaJogo: PUSH R0
  • 20. A.COMPUTADORES 2014-2015, MEEC | P á g i n a19 PUSH 8020h CALL EscLCD PUSH VarJ1 PUSH 8000h CALL EscLCDstr PUSH R0 PUSH 8004h CALL EscLCD ;Escrita no LCD da pontuação (0) inicial do J1 PUSH VarJ2 PUSH 800ah CALL EscLCDstr PUSH R0 PUSH 800eh CALL EscLCD ;Escrita no LCD da pontuação (0) inicial do J2 PUSH VarVel PUSH 8010h CALL EscLCDstr PUSH M[Speed] PUSH 801dh CALL EscLCD ;Escrita no LCD da velocidade inicial da bola MOV R7,2323H MOV R4, 80 MOV R3, 0000h CALL ContinuaEsc ;Limite superior do ecrã de jogo MOV R4, 80 MOV R3, 1700h CALL ContinuaEsc ;Limite inferior do ecrã de jogo MOV R4, 22 MOV R3, 0100h PUSH ColunasSimbolo CALL contvert ;Limite vertical esquerdo do ecrã de jogo MOV R4, 22 R3, 014Fh PUSH ColunasSimbolo
  • 21. A.COMPUTADORES 2014-2015, MEEC | P á g i n a20 CALL contvert ;Limite vertical direito do ecrã de jogo MOV R4, 5 MOV R3, M[PosRaq1] PUSH Raq CALL contvert ;Desenha raquete 1 MOV R4, 5 MOV R3, M[PosRaq2] PUSH Raq CALL contvert ;Desenha raquete 2 MOV R6, M[Speed] MOV M[TempValor], R6 MOV R6, 0001h MOV M[TempControlo], R6 CMP M[Tmp1], R0 CALL.Z tmpjogo MOV R6, M[Speed] SUB M[Tmp1], R6 MOV R1, 2383h ;Seed gerapos: TEST R1, 0001h ;Gera posição da bola aleatoriamente BR.NZ fazxor ;Guardar valor gerado na memoria e usa-o em vez de R1 ROR R1, 1 BR jata fazxor: XOR R1, RANDOM ROR R1,1 jata: MOV M[PosBola],R1 MOV R2,R1 AND R2, 00FFh CMP R2, 30 BR.N gerapos CMP R2, 49 BR.P gerapos MOV R2,R1 AND R2, FF00h ROR R2,8
  • 22. A.COMPUTADORES 2014-2015, MEEC | P á g i n a21 CMP R2, 6 BR.N gerapos CMP R2, 17 BR.P gerapos PUSH Bola PUSH M[PosBola] CALL EscString WaitTecla: CMP M[Pausa], R0 ;Verifica se o jogo está em pausa JMP.NZ WaitTecla CALL Tecla MOV R7, M[EndCount] CMP R7, 2323H CALL.Z tempo PUSH VarVel PUSH 8010h CALL EscLCDstr PUSH M[Speed] PUSH 801dh CALL EscLCD JMP WaitTecla ;================================================================================== ; Tecla: Rotina que permite verificar se alguma tecla foi premida e, nesse caso, qual a tecla ; Efeitos: Tecla a - move raquete 1 para baixo ; Tecla q - move raquete 1 para cima ; Tecla l - move raquete 2 para baixo ; Tecla o - move raquete 2 para cima ; Tecla t - aumenta velocidade da bola ; Tecla g - diminui velocidade da bola ;=================================================================================== Tecla: PUSH R1 CMP M[IO_TEST], R0 BR.Z SairTecla MOV R1,M[IO_READ] CMP R1, 'a' ;Movimento descendente Raquete 1
  • 23. A.COMPUTADORES 2014-2015, MEEC | P á g i n a22 CALL.Z moveDown1 ;Atualização da posicao da raquete CMP R1, 'q' ;Movimento ascendente Raquete 1 CALL.Z moveUp1 ;Atualização da posicao da raquete CMP R1, 'l' ;Movimento descendente Raquete 2 CALL.Z moveDown2 ;Atualização da posicao da raquete CMP R1, 'o' ;Movimento ascendente Raquete 2 CALL.Z moveUp2 ;Atualização da posicao da raquete CMP R1, 't' ;Incremento da velocidade CALL.Z incspeed ;Atualização da velocidade da bola CMP R1, 'g' ;Decremento da velocidade CALL.Z decspeed ;Atualização da velocidade da bola SairTecla: POP R1 RET ;=================================================================================== ; incspeed: Rotina que permite aumentar a velocidade da bola ; Efeitos: Aumento da velociade da bola ;=================================================================================== incspeed: PUSH R7 MOV R7, 0001h CMP M[Speed], R7 JMP.Z retincspeed DEC M[Speed] DEC M[TmpJg] CALL tmpjogo ;recomeca o segundo para nao estragar contagem retincspeed: POP R7 RET ;=================================================================================== ;decspeed: Rotina que permite diminuir a velocidade da bola ; Efeitos: Diminuição da velociade da bola ;=================================================================================== decspeed: PUSH R7 MOV R7, 0009h CMP M[Speed], R7 JMP.Z retdecspeed
  • 24. A.COMPUTADORES 2014-2015, MEEC | P á g i n a23 INC M[Speed] DEC M[TmpJg] CALL tmpjogo ;recomeca o segundo para nao estragar contagem Retdecspeed: POP R7 RET ;=================================================================================== ; moveDown1: Rotina que permite o movimento descendente da raquete 1 ; Efeitos: Sempre que o utilizador premir a tecla a, a raquete 1 efetua o movimento descendente ; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete) ;=================================================================================== moveUp1: PUSH R7 ;Passagem de parametros pelo STACK MOV R5, M[PosRaq1] ;Verificação do limite superior do ecrã de jogo (inibindo o movimento, nesse sentido, sempre que chegar ao limite) CMP R5, 0105h JMP.Z SaiUp1 ADD R5, 0400h PUSH Espaco ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString SUB R5, 0500h ;R5 guarda nova posicao da raquete CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado JMP.NZ WU1 DEC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque de lado da raquete MOV R7, 0004h MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com sentido para a linha de golo mais próxima PUSH Bola ;Passagem de parametros pelo STACK PUSH M[PosBola] ;Passagem de parametros pelo STACK CALL EscString WU1: PUSH Raq ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString MOV M[PosRaq1], R5 ;Atualização da posição do primeiro caracter da raquete 1
  • 25. A.COMPUTADORES 2014-2015, MEEC | P á g i n a24 SaiUp1: POP R7 RET ;=================================================================================== ; moveUp2: Rotina que permite o movimento ascendente da raquete 2 ; Efeitos: Sempre que o utilizador premir a tecla o, a raquete 2 efetua o movimento ascendente ; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete) ;=================================================================================== moveUp2: PUSH R7 ;Passagem de parametros pelo STACK MOV R5, M[PosRaq2] CMP R5, 014Ah ;Verificação do limite superior do ecrã de jogo (inibindo o movimento, nesse sentido, sempre que chegar ao limite) JMP.Z SaiUp2 ADD R5, 0400h PUSH Espaco ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString SUB R5, 0500h ;R5 guarda nova posicao da raquete CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado JMP.NZ WU2 INC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque de lado da raquete MOV R7, 0005h MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com sentido para a linha de golo mais próxima PUSH Bola ;Passagem de parametros pelo STACK PUSH M[PosBola] ;Passagem de parametros pelo STACK CALL EscString WU2: PUSH Raq ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString MOV M[PosRaq2], R5 ;Atualização da posição do primeiro caracter da raquete 2 SaiUp2: POP R7 RET
  • 26. A.COMPUTADORES 2014-2015, MEEC | P á g i n a25 ;=================================================================================== ; moveDown1: Rotina que permite o movimento descendente da raquete 1 ; Efeitos: Sempre que o utilizador premir a tecla a, a raquete 1 efetua o movimento descendente ; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete) ;=================================================================================== moveDown1: PUSH R7 MOV R5, M[PosRaq1] CMP R5, 1205h ;Verificação do limite inferior do ecrã de jogo (inibindo o movimento, nesse sentido, sempre que chegar ao limite) JMP.Z SaiDown1 PUSH Espaco ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString ADD R5, 0500h CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado JMP.NZ WD1 DEC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque de lado da raquete MOV R7, 0004h MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com sentido para a linha de golo mais próxima PUSH Bola ;Passagem de parametros pelo STACK PUSH M[PosBola] ;Passagem de parametros pelo STACK CALL EscString WD1: PUSH Raq ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString SUB R5, 0400h MOV M[PosRaq1], R5 ;Atualização da posição do primeiro caracter da raquete 1 SaiDown1: POP R7 RET
  • 27. A.COMPUTADORES 2014-2015, MEEC | P á g i n a26 ;=================================================================================== ; moveDown2: Rotina que permite o movimento descendente da raquete 2 ; Efeitos: Sempre que o utilizador premir a tecla l, a raquete 2 efetua o movimento descendente ; até ao limite máximo (que é comparado com a posição do primeiro caracter da raquete) ;=================================================================================== moveDown2: PUSH R7 MOV R5, M[PosRaq2] CMP R5, 124Ah ;Verificação do limite inferior do ecrã de jogo (inibindo o movimento, nesse sentido, sempre que chegar ao limite) JMP.Z SaiDown2 PUSH Espaco ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString ADD R5, 0500h CMP M[PosBola], R5 ;Verifica se a raquete bate contra a bola de lado JMP.NZ WD2 INC M[PosBola] ;Empurra a bola mais para a linha de golo devido ao toque de lado da raquete MOV R7, 0005h MOV M[MovBola], R7 ;Altera a movimentação da bola para uma horizontal com sentido para a linha de golo mais próxima PUSH Bola ;Passagem de parametros pelo STACK PUSH M[PosBola] ;Passagem de parametros pelo STACK CALL EscString WD2: PUSH Raq ;Passagem de parametros pelo STACK PUSH R5 ;Passagem de parametros pelo STACK CALL EscString SUB R5, 0400h MOV M[PosRaq2], R5 ;Atualização da posição do primeiro caracter da raquete 2 SaiDown2: POP R7 RET
  • 28. A.COMPUTADORES 2014-2015, MEEC | P á g i n a27 ;=================================================================================== ; ContinuaEsc: Rotina que efectua a escrita (na horizontal) de um caracter para o ecrã um determinado ; número de vezes ; Efeitos: Define os limites horizontais do ecrã de jogo ;=================================================================================== ContinuaEsc: PUSH LinhadeMenos ;Passagem de parametros pelo STACK PUSH R3 ;Passagem de parametros pelo STACK CALL EscString INC R3 DEC R4 BR.NZ ContinuaEsc RET ;=================================================================================== ; contvert: Rotina que efectua a escrita (na vertical) de um caracter para o ecrã um determinado ; número de vezes ; Efeitos: Define os limites verticais do ecrã de jogo, bem como as duas raquetes ;=================================================================================== contvert: PUSH R7 ;Passagem de parametros pelo STACK MOV R7, M[SP+3] PUSH R7 ;Passagem de parametros pelo STACK PUSH R3 ;Passagem de parametros pelo STACK CALL EscString ADD R3, CharAbaixo DEC R4 POP R7 BR.NZ contvert RETN 1 ;=============================================================================== ; EscCar: Rotina que efectua a escrita de um caracter para o ecran. ; O caracter pode ser visualizado na janela de texto. ; Entradas: R1 - Caracter a escrever ; Efeitos: alteracao da posicao de memoria M[IO] ;===============================================================================
  • 29. A.COMPUTADORES 2014-2015, MEEC | P á g i n a28 EscCar: MOV M[IO_WRITE], R1 RET ;=================================================================================== ; RotinaInt0: Rotina para iniciar o jogo ; Efeitos: Após o utilizador premir o botão de pressão IO, é iniciado o jogo ;=================================================================================== RotinaInt0: MOV R7, 1 ;Iniciar o jogo RTI ;=================================================================================== ; RotinaInta: Rotina para pausar/continuar o jogo ; Efeitos: Permite pausar/continuar o jogo após ter sido pressionado o botão IA ;=================================================================================== RotinaInta: PUSH R7 ;Passagem de parametros pelo STACK MOV R7, 1 CMP M[Pausa], R0 ;Verifica se pausa = 0 ou pausa = 1 JMP.NZ nopaus MOV M[Pausa], R7 POP R7 JMP returni1 nopaus: MOV M[Pausa], R0 POP R7 returni1: RTI ;=============================================================================== ; RotinaIntTemp: Rotina de interrupção - contagem do tempo ;=============================================================================== RotinaIntTemp: PUSH R7 MOV R7, 2323H MOV M[EndCount], R7 POP R7 RTI ;=================================================================================== ; inicio: Inicialização da TVI e da máscara de interrupções ; Interrupção incial (RotinaInt0) ativa até que seja pressionado o botão de pressão I0 que ; permite inicializar o jogo
  • 30. A.COMPUTADORES 2014-2015, MEEC | P á g i n a29 ; Inicialização do ecrã de jogo (incluindo os limites do ecrã, as duas raquetes, bola, golos do J1 e ; J2, ambos com 0 pontos, e a velocidade da bola) ; Inicio do jogo ; Efeitos: Escreve a string de quem foi o vencedor na janela de texto ;=================================================================================== inicioJ1: POP R7 CALL LimpaJanela PUSH Ganha1 ;Passagem de parametros pelo STACK PUSH 0a0dh ;Passagem de parametros pelo STACK CALL EscString JMP inicio inicioJ2: POP R7 CALL LimpaJanela PUSH Ganha2 ;Passagem de parametros pelo STACK PUSH 0a0dh ;Passagem de parametros pelo STACK CALL EscString inicio: MOV R1, SP_INICIAL MOV SP, R1 MOV M[TempControlo], R0 DSI MOV R1, RotinaInt0 ;Inicialização da TVI MOV M[TAB_INT0], R1 MOV R1, RotinaInta MOV M[TAB_INTa], R1 MOV R1, RotinaIntTemp MOV M[TAB_INTTemp], R1 MOV R1,8401h MOV M[MASCARA_INT], R1 ;Inicialização da máscara de interrupções ENI PUSH VarTexto1 ;Passagem de parametros pelo STACK PUSH 0202h ;Passagem de parametros pelo STACK CALL EscString MOV M[Pausa], R0 ;Inicialmente pausa = 0 MOV M[Golo1], R0 ;Inicialização golos J1
  • 31. A.COMPUTADORES 2014-2015, MEEC | P á g i n a30 MOV M[Golo2], R0 ;Inicialização golos J2 MOV R1, 0B05h MOV M[PosRaq1], R1 ;Posição inicial Raquete 1 MOV R1, 0B4ah MOV M[PosRaq2], R1 ;Posição inicial Raquete 2 MOV R1, M[Speed] ;Velocidade inicial da bola ADD R1, ah MOV M[Tmp1], R1 MOV R7, 0 WAIT: CMP R7, 0 BR.Z WAIT CALL LimpaJanela CALL LimpDisp JMP iniciaJogo ;Inicio do jogo