Este documento descreve um trabalho laboratorial sobre o jogo Pong desenvolvido em Assembly para o processador P3. Contém fluxograma do jogo, código Assembly comentado e conclusões sobre o que foi aprendido com o projeto, como programação em Assembly e uso de periféricos do P3.
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
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