• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Francisco

Projecto em assembly (P3)

8 mensagens neste tópico

olá! Tenho de fazer um projecto para uma cadeira da faculdade, em que se pretende que façamos um jogo simples para o simulador p3. o jogo consiste num carro que se encontra no final de uma pista e que se pode mover para a esquerda e para a direita quando este programa le do teclado um t ou um y, para desviar de obstaculos que vêm aleatoriamente na pista. O meu problema é que não precebo muito desta linguagem, isto é dado um pouco à pressa no final da cadeira e depois mandam-nos fazer logo um programa destes para o 4º e ultimo laboratório. Bem o que eu tenho já feito, é só o desenho da pista e do carro e agora estava a pensar fazer o movimento do carro para a esquerda e para a direita, mas só tenho uma rotina que lê valores do teclado que tirei dum exemplo do prof, não sei como consiga que identifique as teclas para mover o carro. Será que me podiam ajudar como poderia fazer essa rotina?

Este é o codigo que tenho:

;===============================================================================
; Programa ACOM_RACER.as
;
; Descrição: 
;
; Autores: Francisco Correia e José Lourenço 
;===============================================================================


;===============================================================================
; Definicao de constantes
; Pseudo-instrucao: EQU
;===============================================================================


;TEMPORIZACAO
DELAYVALUE_NIVEL1      EQU     0100h
DELAYVALUE_NIVEL2      EQU     0101h
DELAYVALUE_NIVEL3      EQU     0102h
DELAYVALUE_NIVEL4      EQU     0103h


;STACK POINTER
SP_INICIAL      EQU     FDFFh


;INTERRUPCOES
TAB_INT0        EQU     FE00h
TAB_INT1        EQU     FE0Bh
MASCARA_INT	EQU	0000100000000001b



;I/O
DISP7S1		EQU	FFF0h
DISP7S2		EQU	FFF1h
DISP7S3		EQU	FFF2h
DISP7S4		EQU	FFF3h
LCD_WRITE	EQU	FFF5h
LEDS            EQU     FFF8h
INTERRUPTORES   EQU     FFF9h
IO_CURSOR       EQU     FFFCh
IO_WRITE        EQU     FFFEh
FIM_TEXTO       EQU     '@'
LIMPAR_JANELA	EQU	FFFFh
TEXTO_LEITURA	EQU	FFFFh
TEXTO_ESTADO	EQU	FFFDh
TEXTO_LEITURA	EQU	FFFFh

;===============================================================================
; STR  -  sequencia de caracteres. Cada caracter ocupa 1 palavra.
;===============================================================================

            ORIG    8000h

PAUSA       STR     '* PAUSA *',FIM_TEXTO 
JOGOEMCURSO  STR     'Jogo em curso...',FIM_TEXTO  
OBSTACULOS  STR     '===',FIM_TEXTO 
PISTA0   STR     '+|',FIM_TEXTO 
PISTA1   STR     '+|',FIM_TEXTO 
PISTA2   STR     '+|',FIM_TEXTO 
PISTA3   STR     '+|',FIM_TEXTO 
PISTA4   STR     '+|',FIM_TEXTO 
PISTA5   STR     '+|',FIM_TEXTO 
PISTA6   STR     '+|',FIM_TEXTO 
PISTA7   STR     '+|',FIM_TEXTO 
PISTA8   STR     '+|',FIM_TEXTO 
PISTA9   STR     '+|',FIM_TEXTO 
PISTA10  STR     '+|',FIM_TEXTO 
PISTA11  STR     '+|',FIM_TEXTO 
PISTA12  STR     '+|',FIM_TEXTO 
PISTA13  STR     '+|',FIM_TEXTO 
PISTA14  STR     '+|',FIM_TEXTO 
PISTA15  STR     '+|',FIM_TEXTO 
PISTA16  STR     '+|',FIM_TEXTO 
PISTA17  STR     '+|',FIM_TEXTO 
PISTA18  STR     '+|',FIM_TEXTO 
PISTA19  STR     '+|',FIM_TEXTO 
PISTA20  STR     '+|',FIM_TEXTO 
PISTA21  STR     '+|',FIM_TEXTO 
PISTA22  STR     '+|',FIM_TEXTO 
PISTA23  STR     '+|',FIM_TEXTO 

; margem direita
DPISTA0   STR     '|+',FIM_TEXTO 
DPISTA1   STR     '|+',FIM_TEXTO 
DPISTA2   STR     '|+',FIM_TEXTO 
DPISTA3   STR     '|+',FIM_TEXTO 
DPISTA4   STR     '|+',FIM_TEXTO 
DPISTA5   STR     '|+',FIM_TEXTO 
DPISTA6   STR     '|+',FIM_TEXTO 
DPISTA7   STR     '|+',FIM_TEXTO 
DPISTA8   STR     '|+',FIM_TEXTO 
DPISTA9   STR     '|+',FIM_TEXTO 
DPISTA10  STR     '|+',FIM_TEXTO 
DPISTA11  STR     '|+',FIM_TEXTO 
DPISTA12  STR     '|+',FIM_TEXTO 
DPISTA13  STR     '|+',FIM_TEXTO 
DPISTA14  STR     '|+',FIM_TEXTO 
DPISTA15  STR     '|+',FIM_TEXTO 
DPISTA16  STR     '|+',FIM_TEXTO 
DPISTA17  STR     '|+',FIM_TEXTO 
DPISTA18  STR     '|+',FIM_TEXTO 
DPISTA19  STR     '|+',FIM_TEXTO 
DPISTA20  STR     '|+',FIM_TEXTO 
DPISTA21  STR     '|+',FIM_TEXTO 
DPISTA22  STR     '|+',FIM_TEXTO 
DPISTA23  STR     '|+',FIM_TEXTO 
CARRO23  STR     '#--#',FIM_TEXTO  
CARRO22  STR     '|25|',FIM_TEXTO  
CARRO21  STR     '#||#',FIM_TEXTO  



;===============================================================================
; POSICAO STRING OUTPUT: Posições XY de linha/coluna onde vão Ser escritas 
;			as strings (1º caracter)
;===============================================================================            


POS_PISTA0   EQU    0020h
POS_PISTA1   EQU    0120h
POS_PISTA2   EQU    0220h
POS_PISTA3   EQU    0320h 
POS_PISTA4   EQU    0420h 
POS_PISTA5   EQU    0520h 
POS_PISTA6   EQU    0620h 
POS_PISTA7   EQU    0720h 
POS_PISTA8   EQU    0820h 
POS_PISTA9   EQU    0920h 
POS_PISTA10  EQU    0A20h  
POS_PISTA11  EQU    0B20h  
POS_PISTA12  EQU    0C20h  
POS_PISTA13  EQU    0D20h 
POS_PISTA14  EQU    0E20h  
POS_PISTA15  EQU    0F20h  
POS_PISTA16  EQU    1020h  
POS_PISTA17  EQU    1120h  
POS_PISTA18  EQU    1220h 
POS_PISTA19  EQU    1320h  
POS_PISTA20  EQU    1420h 
POS_PISTA21  EQU    1520h  
POS_PISTA22  EQU    1620h 
POS_PISTA23  EQU    1720h


; posição da margem direita

DPOS_PISTA0   EQU    0032h
DPOS_PISTA1   EQU    0132h
DPOS_PISTA2   EQU    0232h
DPOS_PISTA3   EQU    0332h 
DPOS_PISTA4   EQU    0432h 
DPOS_PISTA5   EQU    0532h 
DPOS_PISTA6   EQU    0632h 
DPOS_PISTA7   EQU    0732h 
DPOS_PISTA8   EQU    0832h 
DPOS_PISTA9   EQU    0932h 
DPOS_PISTA10  EQU    0A32h  
DPOS_PISTA11  EQU    0B32h  
DPOS_PISTA12  EQU    0C32h  
DPOS_PISTA13  EQU    0D32h 
DPOS_PISTA14  EQU    0E32h  
DPOS_PISTA15  EQU    0F32h  
DPOS_PISTA16  EQU    1032h  
DPOS_PISTA17  EQU    1132h  
DPOS_PISTA18  EQU    1232h 
DPOS_PISTA19  EQU    1332h  
DPOS_PISTA20  EQU    1432h 
DPOS_PISTA21  EQU    1532h  
DPOS_PISTA22  EQU    1632h 
DPOS_PISTA23  EQU    1732h

POS_CARRO23  EQU    1728h
POS_CARRO22  EQU    1628h 
POS_CARRO21  EQU    1528h 

   

  


                 ORIG    0000h
                 JMP     inicio



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

;===============================================================================
; rotinsa que escrevem os caracteres correspondentes à pista
;		  
;===============================================================================


MargemEsquerda:		PUSH	PISTA0
		PUSH    POS_PISTA0
		CALL	EscString
		PUSH	PISTA1
		PUSH    POS_PISTA1
		CALL	EscString
		PUSH	PISTA2
		PUSH    POS_PISTA2
		CALL	EscString
		PUSH	PISTA3
		PUSH    POS_PISTA3
		CALL	EscString
		PUSH	PISTA4
		PUSH    POS_PISTA4
		CALL	EscString
		PUSH	PISTA5
		PUSH    POS_PISTA5
		CALL	EscString
		PUSH	PISTA6
		PUSH    POS_PISTA6
		CALL	EscString
		PUSH	PISTA7
		PUSH    POS_PISTA7
		CALL	EscString
		PUSH	PISTA8
		PUSH    POS_PISTA8
		CALL	EscString
		PUSH	PISTA9
		PUSH    POS_PISTA9
		CALL	EscString
		PUSH	PISTA10
		PUSH    POS_PISTA10
		CALL	EscString
		PUSH	PISTA11
		PUSH    POS_PISTA11
		CALL	EscString
		PUSH	PISTA12
		PUSH    POS_PISTA12
		CALL	EscString
		PUSH	PISTA13
		PUSH    POS_PISTA13
		CALL	EscString
		PUSH	PISTA14
		PUSH    POS_PISTA14
		CALL	EscString
		PUSH	PISTA15
		PUSH    POS_PISTA15
		CALL	EscString
		PUSH	PISTA16
		PUSH    POS_PISTA16
		CALL	EscString
		PUSH	PISTA17
		PUSH    POS_PISTA17
		CALL	EscString
		PUSH	PISTA18
		PUSH    POS_PISTA18
		CALL	EscString
		PUSH	PISTA19
		PUSH    POS_PISTA19
		CALL	EscString
		PUSH	PISTA20
		PUSH    POS_PISTA20
		CALL	EscString
		PUSH	PISTA21
		PUSH    POS_PISTA21
		CALL	EscString
		PUSH	PISTA22
		PUSH    POS_PISTA22
		CALL	EscString
		PUSH	PISTA23
		PUSH    POS_PISTA23
		CALL	EscString


MargemDireita:		PUSH	DPISTA0
		PUSH    DPOS_PISTA0
		CALL	EscString
		PUSH	DPISTA1
		PUSH    DPOS_PISTA1
		CALL	EscString
		PUSH	DPISTA2
		PUSH    DPOS_PISTA2
		CALL	EscString
		PUSH	DPISTA3
		PUSH    DPOS_PISTA3
		CALL	EscString
		PUSH	DPISTA4
		PUSH    DPOS_PISTA4
		CALL	EscString
		PUSH	DPISTA5
		PUSH    DPOS_PISTA5
		CALL	EscString
		PUSH	DPISTA6
		PUSH    DPOS_PISTA6
		CALL	EscString
		PUSH	DPISTA7
		PUSH    DPOS_PISTA7
		CALL	EscString
		PUSH	DPISTA8
		PUSH    DPOS_PISTA8
		CALL	EscString
		PUSH	DPISTA9
		PUSH    DPOS_PISTA9
		CALL	EscString
		PUSH	DPISTA10
		PUSH    DPOS_PISTA10
		CALL	EscString
		PUSH	DPISTA11
		PUSH    DPOS_PISTA11
		CALL	EscString
		PUSH	DPISTA12
		PUSH    DPOS_PISTA12
		CALL	EscString
		PUSH	DPISTA13
		PUSH    DPOS_PISTA13
		CALL	EscString
		PUSH	DPISTA14
		PUSH    DPOS_PISTA14
		CALL	EscString
		PUSH	DPISTA15
		PUSH    DPOS_PISTA15
		CALL	EscString
		PUSH	DPISTA16
		PUSH    DPOS_PISTA16
		CALL	EscString
		PUSH	DPISTA17
		PUSH    DPOS_PISTA17
		CALL	EscString
		PUSH	DPISTA18
		PUSH    DPOS_PISTA18
		CALL	EscString
		PUSH	DPISTA19
		PUSH    DPOS_PISTA19
		CALL	EscString
		PUSH	DPISTA20
		PUSH    DPOS_PISTA20
		CALL	EscString
		PUSH	DPISTA21
		PUSH    DPOS_PISTA21
		CALL	EscString
		PUSH	DPISTA22
		PUSH    DPOS_PISTA22
		CALL	EscString
		PUSH	DPISTA23
		PUSH    DPOS_PISTA23
		CALL	EscString





; carro: rotina para desenhar o carro do lado direito da pista



Carro:			PUSH	CARRO21
		PUSH    POS_CARRO21
		CALL	EscString
		PUSH	CARRO22
		PUSH    POS_CARRO22
		CALL	EscString
		PUSH	CARRO23
		PUSH    POS_CARRO23
		CALL	EscString



;===============================================================================
;EscCar : Rotina que escreve no ecra 1 caracter
;	  Entradas: R1
;	  Saidas:-----
;	  Efeitos: Escreve no Ecra 1 caracter 
;===============================================================================


EscCar:         MOV     M[iO_WRITE], R1
                RET 


;===============================================================================
;leCar : Rotina que efectua a leitura de um caracter
;	proveniente do teclado (fica em ciclo enquanto nao for
;	primida nenhuma tecla.

;	Entradas:----
;	Saidas: R1
;	Efeitos: Altera R1 
;================================================================================


LeCar:			CMP	R0, M[TEXTO_ESTADO]
		BR.Z	LeCar
		MOV	R1,M[TEXTO_LEITURA]
		RET




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



;========================================================================
; 			*** PROGRAMA PRINCIPAL ***
;========================================================================


inicio:         MOV     R1, SP_INICIAL
                  MOV     SP, R1 
                  ENI
                  CALL    LimpaJanela
              	CALL    MargemEsquerda
     
	CALL    MargemDireita
	CALL    Carro

a pista é 16 linhas por 24 colunas, o carro ocupa 3 linhas e 3 colunas e encontra-se na ultima linha da pista.   

Se poderem ajudar agradecia ;)

cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

NOTA: a rotina que lê caracteres do teclado chama-se LeCar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Devias usar loops para escrever os caracteres do campo de jogo, em vez de como tens, que mandas escrever um a um.

Agora quanto à tuda duvida, tens de usar uma rotina de tratamento de interrupção para tratares as interrupções relativas ao input/output do teclado. Para "instalar" essa rotina, tens de ligar o bit correspondente na máscara de interrupções. Algo deste género:

; máscara de interrupções
INT_MASK_ADDR	EQU		FFFAh
INT_MASK   		EQU    	1000000001000110b

E depois adicionar os mapeamentos no vector de interrupções:

; tabela de interrupções
			ORIG    FE01h
INT1			WORD    throwBall	

			ORIG    FE02h
INT2			WORD	moveBatRight

			ORIG    FE06h	
INT6			WORD	moveBatLeft

			ORIG	FE0Fh
CLOCK			WORD	clockTick

Obviamente que no teu caso as posições e os nomes das rotinas serão diferentes (depende das teclas que queres usar, vê no manual de referência que teclas correspondem a qual interrupção).

Para criares a rotina de tratamento de interrupção depois fazes isto:

moveBatLeft:	PUSH 	R1
			;verificar se o bat já foi desenhado
			CMP		M[bAT_DRAWN], R0
			BR.Z	doneBatLeft
			MOV		R1, M[bAT_X]

			; verificar se o bat está junto à parede esquerda
			CMP		R1, 2
			BR.Z    doneBatLeft

			; actualizar a posição actual em relação à posição anterior
			MOV		R1, M[bAT_X_PREV]
			DEC		R1		
			MOV		M[bAT_X], R1

			; verifica se a bola está colada ao bat e se sim ajusta 
			; a velocidade horizontal da bola
			MOV		R1, 1
			CMP		M[bALL_ON_BAT], R1
			BR.NZ	doneBatLeft
			NEG		R1
			MOV  	M[bALL_J_SPEED], R1

doneBatLeft:	POP  	R1
			RTI

Esse código é do meu jogo, por isso não te será útil, tens de adaptar ao teu caso. Repara que essa rotina termina com RTI em vez do normal RET.

Não te esqueças também de ligar as interrupções, com a instrução ENI.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O endereço especificado por ORIG de moveBatRig refere-se a que?

Onde especifico a referencia das teclas?

o que é: BAT_DRAWN, BAT_X, BAT_X_PREV e ball on bat?

Obrigado pela ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As respostas ao que perguntas-te estão no post.

O endereço especificado por ORIG de moveBatRig refere-se a que?

Endereço da rotina de tratamento de interrupção.

Onde especifico a referencia das teclas?

Depende do número da interrupção. Não sei de cor que número de interrupção corresponde cada tecla. No meu caso, o moveLeft era a tecla 'o' e o moveRight a tecla 'p'.

o que é: BAT_DRAWN, BAT_X, BAT_X_PREV e ball on bat?

Esse código é do meu jogo, por isso não te será útil, tens de adaptar ao teu caso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deste-me umas ideias e então acrescentei umas coisas na rotina LeCar, que detecta se é premido um t ou um y, se for entra numa nova rotina, que move para a esquerda ou para a direita, a moveesq e a movedir, consoante a tecla premida. também escrevi uma rotina que ilemina o carro, para quando este se mover apagar a imagem anterior, a rotinaIleminacarro. o problema é q não está a funcionar correctamente, desenha o carro, apaga e não anda para os lados. sabes o porque do problema? alterei as contantes POS_CARRO para WORD. 

aqui esta o programa com as novas alterações:




;===============================================================================
; Programa ACOM_RACER.as
;
; Descrição: 
;
; Autores: Francisco Correia e José Lourenço 
;===============================================================================


;===============================================================================
; Definicao de constantes
; Pseudo-instrucao: EQU
;===============================================================================


;TEMPORIZACAO
DELAYVALUE_NIVEL1      EQU     0100h
DELAYVALUE_NIVEL2      EQU     0101h
DELAYVALUE_NIVEL3      EQU     0102h
DELAYVALUE_NIVEL4      EQU     0103h


;STACK POINTER
SP_INICIAL      EQU     FDFFh


;INTERRUPCOES
TAB_INT0        EQU     FE00h
TAB_INT1        EQU     FE0Bh
MASCARA_INT	EQU	0000100000000001b



;I/O
DISP7S1		EQU	FFF0h
DISP7S2		EQU	FFF1h
DISP7S3		EQU	FFF2h
DISP7S4		EQU	FFF3h
LCD_WRITE	EQU	FFF5h
LEDS            EQU     FFF8h
INTERRUPTORES   EQU     FFF9h
IO_CURSOR       EQU     FFFCh
IO_WRITE        EQU     FFFEh
FIM_TEXTO       EQU     '@'
LIMPAR_JANELA	EQU	FFFFh
TEXTO_ESTADO	EQU	FFFDh


;===============================================================================
; STR  -  sequencia de caracteres. Cada caracter ocupa 1 palavra.
;===============================================================================

	  ORIG    8000h

PAUSA       STR     '* PAUSA *',FIM_TEXTO 
JOGOEMCURSO  STR     'Jogo em curso...',FIM_TEXTO  
OBSTACULOS  STR     '===',FIM_TEXTO 
PISTA0   STR     '+|',FIM_TEXTO 
PISTA1   STR     '+|',FIM_TEXTO 
PISTA2   STR     '+|',FIM_TEXTO 
PISTA3   STR     '+|',FIM_TEXTO 
PISTA4   STR     '+|',FIM_TEXTO 
PISTA5   STR     '+|',FIM_TEXTO 
PISTA6   STR     '+|',FIM_TEXTO 
PISTA7   STR     '+|',FIM_TEXTO 
PISTA8   STR     '+|',FIM_TEXTO 
PISTA9   STR     '+|',FIM_TEXTO 
PISTA10  STR     '+|',FIM_TEXTO 
PISTA11  STR     '+|',FIM_TEXTO 
PISTA12  STR     '+|',FIM_TEXTO 
PISTA13  STR     '+|',FIM_TEXTO 
PISTA14  STR     '+|',FIM_TEXTO 
PISTA15  STR     '+|',FIM_TEXTO 
PISTA16  STR     '+|',FIM_TEXTO 
PISTA17  STR     '+|',FIM_TEXTO 
PISTA18  STR     '+|',FIM_TEXTO 
PISTA19  STR     '+|',FIM_TEXTO 
PISTA20  STR     '+|',FIM_TEXTO 
PISTA21  STR     '+|',FIM_TEXTO 
PISTA22  STR     '+|',FIM_TEXTO 
PISTA23  STR     '+|',FIM_TEXTO 

; margem direita
DPISTA0   STR     '|+',FIM_TEXTO 
DPISTA1   STR     '|+',FIM_TEXTO 
DPISTA2   STR     '|+',FIM_TEXTO 
DPISTA3   STR     '|+',FIM_TEXTO 
DPISTA4   STR     '|+',FIM_TEXTO 
DPISTA5   STR     '|+',FIM_TEXTO 
DPISTA6   STR     '|+',FIM_TEXTO 
DPISTA7   STR     '|+',FIM_TEXTO 
DPISTA8   STR     '|+',FIM_TEXTO 
DPISTA9   STR     '|+',FIM_TEXTO 
DPISTA10  STR     '|+',FIM_TEXTO 
DPISTA11  STR     '|+',FIM_TEXTO 
DPISTA12  STR     '|+',FIM_TEXTO 
DPISTA13  STR     '|+',FIM_TEXTO 
DPISTA14  STR     '|+',FIM_TEXTO 
DPISTA15  STR     '|+',FIM_TEXTO 
DPISTA16  STR     '|+',FIM_TEXTO 
DPISTA17  STR     '|+',FIM_TEXTO 
DPISTA18  STR     '|+',FIM_TEXTO 
DPISTA19  STR     '|+',FIM_TEXTO 
DPISTA20  STR     '|+',FIM_TEXTO 
DPISTA21  STR     '|+',FIM_TEXTO 
DPISTA22  STR     '|+',FIM_TEXTO 
DPISTA23  STR     '|+',FIM_TEXTO 
CARRO23  STR     '#--#',FIM_TEXTO  
CARRO22  STR     '|25|',FIM_TEXTO  
CARRO21  STR     '#||#',FIM_TEXTO  
ECARRO23  STR     '     ',FIM_TEXTO  
ECARRO22  STR     '     ',FIM_TEXTO  
ECARRO21  STR     '     ',FIM_TEXTO  



;===============================================================================
; POSICAO STRING OUTPUT: Posições XY de linha/coluna onde vão Ser escritas 
;			as strings (1º caracter)
;===============================================================================            



POS_PISTA0   EQU    0020h
POS_PISTA1   EQU    0120h
POS_PISTA2   EQU    0220h
POS_PISTA3   EQU    0320h 
POS_PISTA4   EQU    0420h 
POS_PISTA5   EQU    0520h 
POS_PISTA6   EQU    0620h 
POS_PISTA7   EQU    0720h 
POS_PISTA8   EQU    0820h 
POS_PISTA9   EQU    0920h 
POS_PISTA10  EQU    0A20h  
POS_PISTA11  EQU    0B20h  
POS_PISTA12  EQU    0C20h  
POS_PISTA13  EQU    0D20h 
POS_PISTA14  EQU    0E20h  
POS_PISTA15  EQU    0F20h  
POS_PISTA16  EQU    1020h  
POS_PISTA17  EQU    1120h  
POS_PISTA18  EQU    1220h 
POS_PISTA19  EQU    1320h  
POS_PISTA20  EQU    1420h 
POS_PISTA21  EQU    1520h  
POS_PISTA22  EQU    1620h 
POS_PISTA23  EQU    1720h


; posição da margem direita

DPOS_PISTA0   EQU    0032h
DPOS_PISTA1   EQU    0132h
DPOS_PISTA2   EQU    0232h
DPOS_PISTA3   EQU    0332h 
DPOS_PISTA4   EQU    0432h 
DPOS_PISTA5   EQU    0532h 
DPOS_PISTA6   EQU    0632h 
DPOS_PISTA7   EQU    0732h 
DPOS_PISTA8   EQU    0832h 
DPOS_PISTA9   EQU    0932h 
DPOS_PISTA10  EQU    0A32h  
DPOS_PISTA11  EQU    0B32h  
DPOS_PISTA12  EQU    0C32h  
DPOS_PISTA13  EQU    0D32h 
DPOS_PISTA14  EQU    0E32h  
DPOS_PISTA15  EQU    0F32h  
DPOS_PISTA16  EQU    1032h  
DPOS_PISTA17  EQU    1132h  
DPOS_PISTA18  EQU    1232h 
DPOS_PISTA19  EQU    1332h  
DPOS_PISTA20  EQU    1432h 
DPOS_PISTA21  EQU    1532h  
DPOS_PISTA22  EQU    1632h 
DPOS_PISTA23  EQU    1732h

POS_CARRO23  WORD   1728h
POS_CARRO22  WORD   1628h 
POS_CARRO21  WORD   1528h 


             ORIG    0000h
             JMP     inicio
  

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




;===============================================================================
; rotinsa que escrevem os caracteres correspondentes à pista
;		  
;===============================================================================


MargemEsquerda:		PUSH	PISTA0
		PUSH    POS_PISTA0
		CALL	EscString
		PUSH	PISTA1
		PUSH    POS_PISTA1
		CALL	EscString
		PUSH	PISTA2
		PUSH    POS_PISTA2
		CALL	EscString
		PUSH	PISTA3
		PUSH    POS_PISTA3
		CALL	EscString
		PUSH	PISTA4
		PUSH    POS_PISTA4
		CALL	EscString
		PUSH	PISTA5
		PUSH    POS_PISTA5
		CALL	EscString
		PUSH	PISTA6
		PUSH    POS_PISTA6
		CALL	EscString
		PUSH	PISTA7
		PUSH    POS_PISTA7
		CALL	EscString
		PUSH	PISTA8
		PUSH    POS_PISTA8
		CALL	EscString
		PUSH	PISTA9
		PUSH    POS_PISTA9
		CALL	EscString
		PUSH	PISTA10
		PUSH    POS_PISTA10
		CALL	EscString
		PUSH	PISTA11
		PUSH    POS_PISTA11
		CALL	EscString
		PUSH	PISTA12
		PUSH    POS_PISTA12
		CALL	EscString
		PUSH	PISTA13
		PUSH    POS_PISTA13
		CALL	EscString
		PUSH	PISTA14
		PUSH    POS_PISTA14
		CALL	EscString
		PUSH	PISTA15
		PUSH    POS_PISTA15
		CALL	EscString
		PUSH	PISTA16
		PUSH    POS_PISTA16
		CALL	EscString
		PUSH	PISTA17
		PUSH    POS_PISTA17
		CALL	EscString
		PUSH	PISTA18
		PUSH    POS_PISTA18
		CALL	EscString
		PUSH	PISTA19
		PUSH    POS_PISTA19
		CALL	EscString
		PUSH	PISTA20
		PUSH    POS_PISTA20
		CALL	EscString
		PUSH	PISTA21
		PUSH    POS_PISTA21
		CALL	EscString
		PUSH	PISTA22
		PUSH    POS_PISTA22
		CALL	EscString
		PUSH	PISTA23
		PUSH    POS_PISTA23
		CALL	EscString


MargemDireita:		PUSH	DPISTA0
		PUSH    DPOS_PISTA0
		CALL	EscString
		PUSH	DPISTA1
		PUSH    DPOS_PISTA1
		CALL	EscString
		PUSH	DPISTA2
		PUSH    DPOS_PISTA2
		CALL	EscString
		PUSH	DPISTA3
		PUSH    DPOS_PISTA3
		CALL	EscString
		PUSH	DPISTA4
		PUSH    DPOS_PISTA4
		CALL	EscString
		PUSH	DPISTA5
		PUSH    DPOS_PISTA5
		CALL	EscString
		PUSH	DPISTA6
		PUSH    DPOS_PISTA6
		CALL	EscString
		PUSH	DPISTA7
		PUSH    DPOS_PISTA7
		CALL	EscString
		PUSH	DPISTA8
		PUSH    DPOS_PISTA8
		CALL	EscString
		PUSH	DPISTA9
		PUSH    DPOS_PISTA9
		CALL	EscString
		PUSH	DPISTA10
		PUSH    DPOS_PISTA10
		CALL	EscString
		PUSH	DPISTA11
		PUSH    DPOS_PISTA11
		CALL	EscString
		PUSH	DPISTA12
		PUSH    DPOS_PISTA12
		CALL	EscString
		PUSH	DPISTA13
		PUSH    DPOS_PISTA13
		CALL	EscString
		PUSH	DPISTA14
		PUSH    DPOS_PISTA14
		CALL	EscString
		PUSH	DPISTA15
		PUSH    DPOS_PISTA15
		CALL	EscString
		PUSH	DPISTA16
		PUSH    DPOS_PISTA16
		CALL	EscString
		PUSH	DPISTA17
		PUSH    DPOS_PISTA17
		CALL	EscString
		PUSH	DPISTA18
		PUSH    DPOS_PISTA18
		CALL	EscString
		PUSH	DPISTA19
		PUSH    DPOS_PISTA19
		CALL	EscString
		PUSH	DPISTA20
		PUSH    DPOS_PISTA20
		CALL	EscString
		PUSH	DPISTA21
		PUSH    DPOS_PISTA21
		CALL	EscString
		PUSH	DPISTA22
		PUSH    DPOS_PISTA22
		CALL	EscString
		PUSH	DPISTA23
		PUSH    DPOS_PISTA23
		CALL	EscString





; carro: rotina para desenhar o carro do lado direito da pista



Carro:			PUSH	CARRO21
		PUSH    M[POS_CARRO21]
		CALL	EscString
		PUSH	CARRO22
		PUSH    M[POS_CARRO22]
		CALL	EscString
		PUSH	CARRO23
		PUSH    M[POS_CARRO23]
		CALL	EscString



IleminaCarro:		PUSH	ECARRO21
		PUSH    M[POS_CARRO21]
		CALL	EscString
		PUSH	ECARRO22
		PUSH    M[POS_CARRO22]
		CALL	EscString
		PUSH	ECARRO23
		PUSH    M[POS_CARRO23]
		CALL	EscString	



;===============================================================================
;EscCar : Rotina que escreve no ecra 1 caracter
;	  Entradas: R1
;	  Saidas:-----
;	  Efeitos: Escreve no Ecra 1 caracter 
;===============================================================================


EscCar:         MOV     M[iO_WRITE], R1
                RET 

; rotina que efectua o movimento do carro para a esquerda



MoveEsq:		PUSH R3
		PUSH R2
		PUSH R1
		CALL IleminaCarro
		MOV  R3, M[POS_CARRO23]
		MOV  R2, M[POS_CARRO22]
		MOV  R1, M[POS_CARRO21]
		DEC  R3
		DEC  R2
		DEC  R1
		MOV  M[POS_CARRO23], R3
		MOV  M[POS_CARRO22], R2
		MOV  M[POS_CARRO21], R1
		POP  R1
		POP  R2
		POP  R3
		CALL Carro
		RET


; rotina que efectua o movimento do carro para a direita



MoveDir:		PUSH 	R3
		PUSH 	R2
		PUSH 	R1
		CALL    IleminaCarro
		MOV 	R3, M[POS_CARRO23]
		MOV 	R2, M[POS_CARRO22]
		MOV 	R1, M[POS_CARRO21]
		INC	R3
		INC 	R2
		INC 	R1
		MOV  	M[POS_CARRO23], R3
		MOV 	M[POS_CARRO22], R2
		MOV  	M[POS_CARRO21], R1
		POP 	R1
		POP	R2
		POP 	R3
		CALL    Carro
		RET


;===============================================================================
;leCar : Rotina que efectua a leitura de um caracter
;	proveniente do teclado (fica em ciclo enquanto nao for
;	primida nenhuma tecla)

;	Entradas:----
;	Saidas: R1
;	Efeitos: Altera R1 
;================================================================================



LeCar:			CMP	R0, M[TEXTO_ESTADO]
		BR.Z	LeCar
		MOV	R1,M[LIMPAR_JANELA]
		CMP     R1, 0074h
		JMP.Z   MoveEsq
		CMP     R1, 0079h
		JMP.Z   MoveDir
		RET




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



;========================================================================
; 			*** PROGRAMA PRINCIPAL ***
;========================================================================


inicio:	  	MOV     R1, SP_INICIAL
                MOV     SP, R1 
                ENI
                CALL    LimpaJanela
              	CALL    MargemEsquerda
   	 	CALL    MargemDireita
	CALL    Carro
Fim:		CALL    LeCar	
	CALL    Fim

   

[/code]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

afinal já se move, apesar de continuar a desenhar varias vezes o carro e escreve a tecla premida no ecan sem eu o ter programado para isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

afinal já se move, apesar de continuar a desenhar varias vezes o carro e escreve a tecla premida no ecan sem eu o ter programado para isso.

Desculpa mas agora não tenho tempo para estar a ler o teu código todo. Tenta colocar dúvidas mais especificas. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora