Rabu, 22 Juni 2011

Pembuatan snake living DOS

name "pepenk snake"

org     100h

jmp     start

;bagian data

s_size  equ     8

snake dw s_size dup(29)

tail    dw      ?

;bagian kode pengarahan bios
left    equ     4bh
right   equ     4dh
up      equ     48h
down    equ     50h

; arah ular
cur_dir db      left

wait_time dw    1

; pesan latar
msg db "ÌÌÌÌ DOS living snakes ¹¹¹¹", 0dh,0ah,0ah

db "code ini dicontoh dari emu8086 examples.", 0dh,0ah
db "saya hanya sedikit mengganti karakter ular dengan kode ascii.", 0dh,0ah
db "begitu pula dengan jejak yang ditinggalkan oleh ular tersebut," , 0dh,0ah
db "karena dalam keyboard biasa tidak ada karakter seperti itu", 0dh,0ah                                                                          
db "serta mengedit kode kode simpel lainya",0dh,0ah
db "karena pengetahuan saya tentang bahasa assembly masih sangat rendah.", 0dh,0ah, 0ah

db "jadi terimalah project saya apa adanya", 0dh,0ah
db "karena hanya ini yang mampu saya lakukan pada kode yang sudah ada.", 0dh,0ah, 0ah

db "saya tidak mampu untuk membuat kode sendiri dari 0", 0dh,0ah
db "jadi tolong maafkan saya.", 0dh,0ah, 0ah

db "tekan esc untuk keluar.", 0dh,0ah
db "ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ", 0dh,0ah, 0ah
db "tekan tombol apa saja untuk memulai", 0dh,0ah,0ah

db "tekan tombol arah untuk mengarahkan ular saya" ,0dh,0ah,0ah

db "þedited by I NYOMAN HERMAWANþ$"

; bagian kode

start:

; prin pesan latar:
mov dx, offset msg
mov ah, 9
int 21h


; tunggu untuk penekanan key:
mov ah, 00h
int 16h


; sembunyikan text cursor:
mov     ah, 1
mov     ch, 2bh
mov     cl, 0bh
int     10h          


game_loop:

; === select first video page
mov     al, 0  ; page number.
mov     ah, 05h
int     10h

; === show new head:
mov     dx, snake[0]

; set cursor at dl,dh
mov     ah, 02h
int     10h

; prin kode 'ascii 216' sebagai karakter ular:
mov     al, 'H'
mov     ah, 09h
mov     bl, 0ah
mov     cx, 1  
int     10h    


mov     al, 'E'
mov     ah, 09h
mov     bl, 0ch
mov     cx, 1  
int     10h                  


mov     al, 'R'
mov     ah, 09h
mov     bl, 0dh
mov     cx, 1  
int     10h
         

mov     al, 'M'
mov     ah, 09h
mov     bl, 06h
mov     cx, 1  
int     10h


mov     al, 'A'
mov     ah, 09h
mov     bl, 0bh
mov     cx, 1  
int     10h
 

mov     al, 'W'
mov     ah, 09h
mov     bl, 04h
mov     cx, 1  
int     10h
 

mov     al, 'A'
mov     ah, 09h
mov     bl, 05h
mov     cx, 1  
int     10h

             
mov     al, 'N'
mov     ah, 09h
mov     bl, 09h
mov     cx, 1  
int     10h
   

mov     al, 'Ï'
mov     ah, 0ah
mov     bl, 0fh
mov     cx, 1  
int     10h            

; tetapkan ekor:
mov     ax, snake[s_size * 2 - 2]
mov     tail, ax

call    move_snake


; sembunyikan karakter lama:
mov     dx, tail

; set cursor at dl,dh
mov     ah, 02h
int     10h

; prin kode 'ascii 234 ' sebagai jejak ular:
mov     al, 'Û'
mov     ah, 09h
mov     bl, 09h
mov     cx, 1  
int     10h



check_for_key:

; periksa perintah users:
mov     ah, 01h
int     16h
jz      no_key

mov     ah, 00h
int     16h

cmp     al, 1bh    ; esc - key?
je      stop_game  ;

mov     cur_dir, ah

no_key:



mov     ah, 00h
int     1ah
cmp     dx, wait_time
jb      check_for_key
add     dx, 4
mov     wait_time, dx



; === eternal game loop:
jmp     game_loop


stop_game:

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

ret

; bagian fungsi


move_snake proc near

; set es to bios info segment:
mov     ax, 40h
mov     es, ax

  ; point di to tail
  mov   di, s_size * 2 - 2
  ; move all body parts
  ; (last one simply goes away)
  mov   cx, s_size-1
move_array:
  mov   ax, snake[di-2]
  mov   snake[di], ax
  sub   di, 2
  loop  move_array


cmp     cur_dir, left
  je    move_left
cmp     cur_dir, right
  je    move_right
cmp     cur_dir, up
  je    move_up
cmp     cur_dir, down
  je    move_down

jmp     stop_move       ; no direction.


move_left:
  mov   al, b.snake[0]
  dec   al
  mov   b.snake[0], al
  cmp   al, -1
  jne   stop_move      
  mov   al, es:[4ah]    ; col number.
  dec   al
  mov   b.snake[0], al  ; return to right.
  jmp   stop_move

move_right:
  mov   al, b.snake[0]
  inc   al
  mov   b.snake[0], al
  cmp   al, es:[4ah]    ; col number.  
  jb    stop_move
  mov   b.snake[0], 0   ; return to left.
  jmp   stop_move

move_up:
  mov   al, b.snake[1]
  dec   al
  mov   b.snake[1], al
  cmp   al, -1
  jne   stop_move
  mov   al, es:[84h]    ; row number -1.
  mov   b.snake[1], al  ; return to bottom.
  jmp   stop_move

move_down:
  mov   al, b.snake[1]
  inc   al
  mov   b.snake[1], al
  cmp   al, es:[84h]    ; row number -1.
  jbe   stop_move
  mov   b.snake[1], 0   ; return to top.
  jmp   stop_move

stop_move:
  ret
move_snake endp

Tidak ada komentar:

Posting Komentar