views:

606

answers:

3

If this Question duplicates I'm sorry but I think I did it the wrong way the 1st time. Well I have sum assembly homework to do... its supposed to be the snake game. I managed to make a program using parts of others ones, since Im lazy.. anyhow I got the program almost ready but I get only 1 error when assembling:

**Fatal** C:\TASM\emu8086\M3\M3.asm(243) Unexpected end of file encountered****

The line 243 is the last one of the program but I cant figure out whats wrong, can sum1 please check out the code and see if you can find out? PLease... txs ; The comments are in portuguese but I dont think that'll bother..

.model small
.stack 100h

;org     100h

; pular seção de dados:
;jmp     inicio

; ------ data section ------
.data

s_tamanho  equ     7

; coordenadas da cobra
; (da cauda à cabeça)
; low byte à esquerda, high byte
; no top - [top, esquerda]
cobra dw s_tamanho dup(0)

cauda    dw      ?

; direcao
;          (codigos de tecla da bios):
esquerda    equ     4bh
direita   equ     4dh
up      equ     48h
baixo    equ     50h

; direçao atual da cobra:
cur_dir db      direita

espera_tempo dw    0

; mensagem inicial
msg     db "==== como jogar ====", 0dh,0ah 
    db "controle a cobra utilizando as setas direcionais", 0dh,0ah 
    db "qualquer outra tecla fará a cobra parar.", 0dh,0ah, 0ah

    db "aperte ESC para sair.", 0dh,0ah
    db "====================", 0dh,0ah, 0ah
    db "aperte qualquer tecla para iniciar...$"

; ------ seção de codigo ------

.code

inicio:

; imprime msg inicial:
mov dx, offset msg
mov ah, 9 
int 21h


; espera teclado:
mov ah, 00h
int 16h


; esconde o cursor:
mov     ah, 1
mov     ch, 2bh
mov     cl, 0bh
int     10h           


jogo_loop:

; escolhe primeira tela do video
mov     al, 0  ; numero da tela.
mov     ah, 05h
int     10h

; mostra nova cabeça:
mov     dx, cobra[0]

; posiciona cursor em dl,dh
mov     ah, 02h
int     10h

; imprime '*' no local:
mov     al, '*'
mov     ah, 09h
mov     bl, 0eh ; attribute.
mov     cx, 1   ; single char.
int     10h

; mantem a cauda:
mov     ax, cobra[s_tamanho * 2 - 2]
mov     cauda, ax

call    movimento_cobra


; esconde a cauda velha:
mov     dx, cauda

; posiciona o curso em dl,dh
mov     ah, 02h
int     10h

; imprime ' ' no local:
mov     al, ' '
mov     ah, 09h
mov     bl, 0eh ; atribuir.
mov     cx, 1   ; único char.
int     10h



aguarda_entrada_teclado:

; buscar comando:
mov     ah, 01h
int     16h
jz      no_key

mov     ah, 00h
int     16h

cmp     al, 1bh    ; tecla - ESC?
je      parar_jogo  ;

mov     cur_dir, ah

no_key:    

; aguardar:
; pegar intervalos do relogio
; (aprox 18 por segundo)
; desde 00:00 ateh cx:dx

mov     ah, 00h
int     1ah
cmp     dx, espera_tempo
jb      aguarda_entrada_teclado
add     dx, 4
mov     espera_tempo, dx    

; loop infinito:
jmp     jogo_loop

parar_jogo:

; mostrar cursor:
mov     ah, 1
mov     ch, 0bh
mov     cl, 0bh
int     10h

ret  

; ------ seção das funções ------    
; este procedimento cria a
; animação movimentando todas as
; partes ateh a cauda,
; a ultima parte da cauda some:
; [ultima parte (cauda)]-> some
; [parte i] -> [parte i+1]
;------------------------------------------------------------------

movimento_cobra proc near

; seta es para o segmento de informação da bios:

mov     ax, 40h
mov     es, ax

  ; aponta di para a cauda

  mov   di, s_tamanho * 2 - 2
  ; movimenta todo o corpo
  ; (ultima parte some)
  mov   cx, s_tamanho-1
movimento_array:
  mov   ax, cobra[di-2]
  mov   cobra[di], ax
  sub   di, 2
  loop  movimento_array


cmp     cur_dir, esquerda
  je    movimento_esquerda
cmp     cur_dir, direita
  je    movimento_direita
cmp     cur_dir, up
  je    movimento_up
cmp     cur_dir, baixo
  je    movimento_baixo

jmp     parar_movimento       ; sem direção.


movimento_esquerda:
  mov   al, b.cobra[0]
  dec   al
  mov   b.cobra[0], al
  cmp   al, -1
  jne   parar_movimento       
  mov   al, es:[4ah]    ; numero da coluna.
  dec   al
  mov   b.cobra[0], al  ; retornar a direita.
  jmp   parar_movimento

movimento_direita:
  mov   al, b.cobra[0]
  inc   al
  mov   b.cobra[0], al
  cmp   al, es:[4ah]    ; col number.   
  jb    parar_movimento
  mov   b.cobra[0], 0   ; return to esquerda.
  jmp   parar_movimento

movimento_up:
  mov   al, b.cobra[1]
  dec   al
  mov   b.cobra[1], al
  cmp   al, -1
  jne   parar_movimento
  mov   al, es:[84h]    ; numero da fileira -1.
  mov   b.cobra[1], al  ; voltar para baixo.
  jmp   parar_movimento

movimento_baixo:
  mov   al, b.cobra[1]
  inc   al
  mov   b.cobra[1], al
  cmp   al, es:[84h]    ; numero da fileira -1.
  jbe   parar_movimento
  mov   b.cobra[1], 0   ; voltar ao topo.
  jmp   parar_movimento

parar_movimento:
  ret
movimento_cobra endp
;------------------------------------------------------------------
mov ah,4ch
int 21h
+3  A: 

Maybe you're not saving it as plain text. Make sure it's not Word format or even Unicode.

JoelFan
+1 You have some non-ascii characters in the source code (googling for TASM + 'Unexpected end of file encountered' could show relevant info)
Eliseo Ocampos
+1  A: 

When you get an error message, you can usually find out how to resolve it by Googling for the exact message text, for example: http://www.google.ca/search?hl=en&q=tasm+%22Unexpected+end+of+file+encountered%22

Chance are that someone has had and asked about this problem before.

In your case, if it isn't a Unicode problem, it might be that you need some kind of end statement.

ChrisW
A: 

you need to add an extra line with the "end" statement to tell the assembler that it has read all of the source. This is much like many C compilers that throw an error if the last brace in a source file is not followed by a line feed.

Ian