0

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 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
2
Contributors
1
Reply
3
Views
7 Years
Discussion Span
Last Post by wildgoose
0

This should be the last edit line of your ASM file.
(Leave atleast one blank line below it!)

END

Believe it or not, assemblers still require the END keyword.

Does this help?

One question though. Why do you have this DOS code at the bottom of your file? There's no label thus no way to get there!

mov ah,4ch
int 21h
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.