31
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

Rel3-81715-81731-81138

Embed Size (px)

Citation preview

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 a

1

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 a

2

2. FLUXOGRAMA Na figura 1 encontra-se representado um fluxograma simplificado do programa

desenvolvido:

A.COMPUTADORES 2014-2015, MEEC

| P á g i n a

3

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 a

4

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 a

5

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 a

6

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 a

7

; 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 a

8

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 a

9

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 a

10

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 a

11

;======================================================================

; 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 a

12

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 a

13

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 a

14

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 a

15

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 a

16

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 a

17

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 a

18

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 a

19

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 a

20

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 a

21

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 a

22

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 a

23

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 a

24

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 a

25

;===================================================================================

; 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 a

26

;===================================================================================

; 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 a

27

;===================================================================================

; 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 a

28

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 a

29

; 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 a

30

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