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