OK LETS GIT HOLY SHIT
This commit is contained in:
@@ -0,0 +1,79 @@
|
|||||||
|
let SessionLoad = 1
|
||||||
|
if &cp | set nocp | endif
|
||||||
|
let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0
|
||||||
|
let v:this_session=expand("<sfile>:p")
|
||||||
|
silent only
|
||||||
|
cd ~/Skolarbete/Prestandaoptimering/Projekt\ 1\ -\ Nibbles
|
||||||
|
if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == ''
|
||||||
|
let s:wipebuf = bufnr('%')
|
||||||
|
endif
|
||||||
|
set shortmess=aoO
|
||||||
|
badd +1 cnibbles.c
|
||||||
|
badd +1 nibbles.S
|
||||||
|
argglobal
|
||||||
|
silent! argdel *
|
||||||
|
edit nibbles.S
|
||||||
|
set splitbelow splitright
|
||||||
|
wincmd _ | wincmd |
|
||||||
|
vsplit
|
||||||
|
1wincmd h
|
||||||
|
wincmd w
|
||||||
|
set nosplitbelow
|
||||||
|
set nosplitright
|
||||||
|
wincmd t
|
||||||
|
set winheight=1 winwidth=1
|
||||||
|
exe 'vert 1resize ' . ((&columns * 137 + 137) / 274)
|
||||||
|
exe '2resize ' . ((&lines * 60 + 31) / 62)
|
||||||
|
exe 'vert 2resize ' . ((&columns * 136 + 137) / 274)
|
||||||
|
argglobal
|
||||||
|
setlocal fdm=manual
|
||||||
|
setlocal fde=0
|
||||||
|
setlocal fmr={{{,}}}
|
||||||
|
setlocal fdi=#
|
||||||
|
setlocal fdl=0
|
||||||
|
setlocal fml=1
|
||||||
|
setlocal fdn=20
|
||||||
|
setlocal fen
|
||||||
|
silent! normal! zE
|
||||||
|
let s:l = 23 - ((22 * winheight(0) + 30) / 61)
|
||||||
|
if s:l < 1 | let s:l = 1 | endif
|
||||||
|
exe s:l
|
||||||
|
normal! zt
|
||||||
|
23
|
||||||
|
normal! 042|
|
||||||
|
wincmd w
|
||||||
|
argglobal
|
||||||
|
edit cnibbles.c
|
||||||
|
setlocal fdm=manual
|
||||||
|
setlocal fde=0
|
||||||
|
setlocal fmr={{{,}}}
|
||||||
|
setlocal fdi=#
|
||||||
|
setlocal fdl=0
|
||||||
|
setlocal fml=1
|
||||||
|
setlocal fdn=20
|
||||||
|
setlocal fen
|
||||||
|
silent! normal! zE
|
||||||
|
let s:l = 141 - ((41 * winheight(0) + 30) / 60)
|
||||||
|
if s:l < 1 | let s:l = 1 | endif
|
||||||
|
exe s:l
|
||||||
|
normal! zt
|
||||||
|
141
|
||||||
|
normal! 041|
|
||||||
|
wincmd w
|
||||||
|
exe 'vert 1resize ' . ((&columns * 137 + 137) / 274)
|
||||||
|
exe '2resize ' . ((&lines * 60 + 31) / 62)
|
||||||
|
exe 'vert 2resize ' . ((&columns * 136 + 137) / 274)
|
||||||
|
tabnext 1
|
||||||
|
if exists('s:wipebuf')
|
||||||
|
silent exe 'bwipe ' . s:wipebuf
|
||||||
|
endif
|
||||||
|
unlet! s:wipebuf
|
||||||
|
set winheight=1 winwidth=20 shortmess=filnxtToO
|
||||||
|
let s:sx = expand("<sfile>:p:r")."x.vim"
|
||||||
|
if file_readable(s:sx)
|
||||||
|
exe "source " . fnameescape(s:sx)
|
||||||
|
endif
|
||||||
|
let &so = s:so_save | let &siso = s:siso_save
|
||||||
|
doautoall SessionLoadPost
|
||||||
|
unlet SessionLoad
|
||||||
|
" vim: set ft=vim :
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# Makefile for the nibbles lab.
|
||||||
|
# ---> Compile with gamke on BSD systems! <---
|
||||||
|
|
||||||
|
all: nibbles_asm nibbles_asm_start
|
||||||
|
|
||||||
|
# Rule for compiling C source
|
||||||
|
.c.o:
|
||||||
|
gcc -Os -std=c11 -m32 -march=i686 -Wall -g -c $<
|
||||||
|
|
||||||
|
# Rule for compiling assembly source
|
||||||
|
.s.o:
|
||||||
|
#as -gstabs $^ -o $@
|
||||||
|
gcc -m32 -march=i686 -c $<
|
||||||
|
|
||||||
|
|
||||||
|
# C game
|
||||||
|
nibbles_c: main.o cnibbles.o
|
||||||
|
gcc -lcurses $^ -o $@
|
||||||
|
|
||||||
|
# ASM game
|
||||||
|
nibbles_asm: main.o nibbles.o helpers.o
|
||||||
|
gcc -m32 -lcurses $^ -o $@
|
||||||
|
|
||||||
|
# ASM game
|
||||||
|
nibbles_asm_start: start.o nibbles.o helpers.o
|
||||||
|
gcc -m32 -lcurses -lc -nostdlib $^ -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *~
|
||||||
|
rm -f *.o
|
||||||
|
rm -f nibbles_c nibbles_asm nibbles_asm_start
|
||||||
+744
@@ -0,0 +1,744 @@
|
|||||||
|
.file "cnibbles.c"
|
||||||
|
.local p_screen
|
||||||
|
.comm p_screen,8,8
|
||||||
|
.text
|
||||||
|
.globl nib_poll_kbd
|
||||||
|
.type nib_poll_kbd, @function
|
||||||
|
nib_poll_kbd:
|
||||||
|
.LFB0:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
subq $16, %rsp
|
||||||
|
movq stdscr@GOTPCREL(%rip), %rax
|
||||||
|
movq (%rax), %rax
|
||||||
|
movq %rax, %rdi
|
||||||
|
call wgetch@PLT
|
||||||
|
movl %eax, -4(%rbp)
|
||||||
|
movl -4(%rbp), %eax
|
||||||
|
leave
|
||||||
|
.cfi_def_cfa 7, 8
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE0:
|
||||||
|
.size nib_poll_kbd, .-nib_poll_kbd
|
||||||
|
.section .rodata
|
||||||
|
.LC0:
|
||||||
|
.string "%c"
|
||||||
|
.text
|
||||||
|
.globl nib_put_scr
|
||||||
|
.type nib_put_scr, @function
|
||||||
|
nib_put_scr:
|
||||||
|
.LFB1:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
subq $16, %rsp
|
||||||
|
movl %edi, -4(%rbp)
|
||||||
|
movl %esi, -8(%rbp)
|
||||||
|
movl %edx, -12(%rbp)
|
||||||
|
movl -12(%rbp), %edx
|
||||||
|
movl -4(%rbp), %esi
|
||||||
|
movl -8(%rbp), %eax
|
||||||
|
movl %edx, %ecx
|
||||||
|
leaq .LC0(%rip), %rdx
|
||||||
|
movl %eax, %edi
|
||||||
|
movl $0, %eax
|
||||||
|
call mvprintw@PLT
|
||||||
|
movq p_screen(%rip), %rax
|
||||||
|
movq %rax, %rdi
|
||||||
|
call wrefresh@PLT
|
||||||
|
leave
|
||||||
|
.cfi_def_cfa 7, 8
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE1:
|
||||||
|
.size nib_put_scr, .-nib_put_scr
|
||||||
|
.globl nib_init
|
||||||
|
.type nib_init, @function
|
||||||
|
nib_init:
|
||||||
|
.LFB2:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
movl $0, %edi
|
||||||
|
call time@PLT
|
||||||
|
movl %eax, %edi
|
||||||
|
call srand@PLT
|
||||||
|
call initscr@PLT
|
||||||
|
movq %rax, p_screen(%rip)
|
||||||
|
call start_color@PLT
|
||||||
|
movl $0, %edi
|
||||||
|
call curs_set@PLT
|
||||||
|
call noecho@PLT
|
||||||
|
movq p_screen(%rip), %rax
|
||||||
|
movl $1, %esi
|
||||||
|
movq %rax, %rdi
|
||||||
|
call keypad@PLT
|
||||||
|
movq p_screen(%rip), %rax
|
||||||
|
movl $1, %esi
|
||||||
|
movq %rax, %rdi
|
||||||
|
call nodelay@PLT
|
||||||
|
popq %rbp
|
||||||
|
.cfi_def_cfa 7, 8
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE2:
|
||||||
|
.size nib_init, .-nib_init
|
||||||
|
.globl nib_end
|
||||||
|
.type nib_end, @function
|
||||||
|
nib_end:
|
||||||
|
.LFB3:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
call endwin@PLT
|
||||||
|
movl $0, %edi
|
||||||
|
call exit@PLT
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE3:
|
||||||
|
.size nib_end, .-nib_end
|
||||||
|
.globl startLength
|
||||||
|
.bss
|
||||||
|
.align 4
|
||||||
|
.type startLength, @object
|
||||||
|
.size startLength, 4
|
||||||
|
startLength:
|
||||||
|
.zero 4
|
||||||
|
.globl startApples
|
||||||
|
.align 4
|
||||||
|
.type startApples, @object
|
||||||
|
.size startApples, 4
|
||||||
|
startApples:
|
||||||
|
.zero 4
|
||||||
|
.comm currentTick,4,4
|
||||||
|
.comm snake,9600,64
|
||||||
|
.comm snakeLength,4,4
|
||||||
|
.comm snakeX,4,4
|
||||||
|
.comm snakeY,4,4
|
||||||
|
.comm snakeDirX,4,4
|
||||||
|
.comm snakeDirY,4,4
|
||||||
|
.comm numApples,4,4
|
||||||
|
.text
|
||||||
|
.globl start_game
|
||||||
|
.type start_game, @function
|
||||||
|
start_game:
|
||||||
|
.LFB4:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
subq $48, %rsp
|
||||||
|
movl %edi, -36(%rbp)
|
||||||
|
movl %esi, -40(%rbp)
|
||||||
|
movl startLength(%rip), %eax
|
||||||
|
testl %eax, %eax
|
||||||
|
jne .L7
|
||||||
|
movl -36(%rbp), %eax
|
||||||
|
movl %eax, startLength(%rip)
|
||||||
|
.L7:
|
||||||
|
movl startApples(%rip), %eax
|
||||||
|
testl %eax, %eax
|
||||||
|
jne .L8
|
||||||
|
movl -40(%rbp), %eax
|
||||||
|
movl %eax, startApples(%rip)
|
||||||
|
.L8:
|
||||||
|
movq currentTick@GOTPCREL(%rip), %rax
|
||||||
|
movl $0, (%rax)
|
||||||
|
movl -36(%rbp), %edx
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, (%rax)
|
||||||
|
movl -40(%rbp), %edx
|
||||||
|
movq numApples@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, (%rax)
|
||||||
|
call nib_init
|
||||||
|
movl $0, -20(%rbp)
|
||||||
|
jmp .L9
|
||||||
|
.L10:
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
movl %eax, %ecx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl -20(%rbp), %edx
|
||||||
|
movl %ecx, (%rax,%rdx,4)
|
||||||
|
addl $1, -20(%rbp)
|
||||||
|
.L9:
|
||||||
|
cmpl $2399, -20(%rbp)
|
||||||
|
jbe .L10
|
||||||
|
movq snakeX@GOTPCREL(%rip), %rax
|
||||||
|
movl $30, (%rax)
|
||||||
|
movq snakeY@GOTPCREL(%rip), %rax
|
||||||
|
movl $20, (%rax)
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl $0, (%rax)
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl $-1, (%rax)
|
||||||
|
movl $0, -16(%rbp)
|
||||||
|
jmp .L11
|
||||||
|
.L12:
|
||||||
|
movq snakeX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %ecx
|
||||||
|
movl $-2004318071, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
mull %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
shrl $5, %eax
|
||||||
|
movl %eax, -8(%rbp)
|
||||||
|
movl -8(%rbp), %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
leal 0(,%rdx,4), %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $4, %eax
|
||||||
|
subl %edx, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %eax
|
||||||
|
movl %eax, -8(%rbp)
|
||||||
|
movq snakeY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %edx
|
||||||
|
movl -16(%rbp), %eax
|
||||||
|
leal (%rdx,%rax), %ecx
|
||||||
|
movl $-858993459, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
mull %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
shrl $5, %eax
|
||||||
|
movl %eax, -4(%rbp)
|
||||||
|
movl -4(%rbp), %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $2, %eax
|
||||||
|
addl %edx, %eax
|
||||||
|
sall $3, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %eax
|
||||||
|
movl %eax, -4(%rbp)
|
||||||
|
movl -4(%rbp), %eax
|
||||||
|
sall $2, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
sall $4, %edx
|
||||||
|
subl %eax, %edx
|
||||||
|
movl -8(%rbp), %eax
|
||||||
|
leal (%rdx,%rax), %ecx
|
||||||
|
movl -16(%rbp), %edx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl %ecx, %ecx
|
||||||
|
movl %edx, (%rax,%rcx,4)
|
||||||
|
addl $1, -16(%rbp)
|
||||||
|
.L11:
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, -16(%rbp)
|
||||||
|
jb .L12
|
||||||
|
movl $0, %edi
|
||||||
|
call time@PLT
|
||||||
|
movl %eax, %edi
|
||||||
|
call srand@PLT
|
||||||
|
movl $0, -12(%rbp)
|
||||||
|
jmp .L13
|
||||||
|
.L14:
|
||||||
|
movl $0, %eax
|
||||||
|
call spawnApple
|
||||||
|
addl $1, -12(%rbp)
|
||||||
|
.L13:
|
||||||
|
movq numApples@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, -12(%rbp)
|
||||||
|
jb .L14
|
||||||
|
.L15:
|
||||||
|
movl $0, %eax
|
||||||
|
call tick
|
||||||
|
movl $0, %eax
|
||||||
|
call draw
|
||||||
|
jmp .L15
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE4:
|
||||||
|
.size start_game, .-start_game
|
||||||
|
.globl spawnApple
|
||||||
|
.type spawnApple, @function
|
||||||
|
spawnApple:
|
||||||
|
.LFB5:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
subq $16, %rsp
|
||||||
|
call rand@PLT
|
||||||
|
movl %eax, %ecx
|
||||||
|
movl $-2004318071, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
imull %edx
|
||||||
|
leal (%rdx,%rcx), %eax
|
||||||
|
sarl $5, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
sarl $31, %eax
|
||||||
|
subl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
leal 0(,%rdx,4), %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $4, %eax
|
||||||
|
subl %edx, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %eax
|
||||||
|
movl %eax, -8(%rbp)
|
||||||
|
call rand@PLT
|
||||||
|
movl %eax, %ecx
|
||||||
|
movl $1717986919, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
imull %edx
|
||||||
|
sarl $4, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
sarl $31, %eax
|
||||||
|
subl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $2, %eax
|
||||||
|
addl %edx, %eax
|
||||||
|
sall $3, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %edx
|
||||||
|
movl %edx, -4(%rbp)
|
||||||
|
jmp .L17
|
||||||
|
.L18:
|
||||||
|
call rand@PLT
|
||||||
|
movl %eax, %ecx
|
||||||
|
movl $-2004318071, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
imull %edx
|
||||||
|
leal (%rdx,%rcx), %eax
|
||||||
|
sarl $5, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
sarl $31, %eax
|
||||||
|
subl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
leal 0(,%rdx,4), %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $4, %eax
|
||||||
|
subl %edx, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %eax
|
||||||
|
movl %eax, -8(%rbp)
|
||||||
|
call rand@PLT
|
||||||
|
movl %eax, %ecx
|
||||||
|
movl $1717986919, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
imull %edx
|
||||||
|
sarl $4, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
sarl $31, %eax
|
||||||
|
subl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $2, %eax
|
||||||
|
addl %edx, %eax
|
||||||
|
sall $3, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %edx
|
||||||
|
movl %edx, -4(%rbp)
|
||||||
|
.L17:
|
||||||
|
movl -4(%rbp), %eax
|
||||||
|
sall $2, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
sall $4, %edx
|
||||||
|
subl %eax, %edx
|
||||||
|
movl -8(%rbp), %eax
|
||||||
|
addl %eax, %edx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, %edx
|
||||||
|
movl (%rax,%rdx,4), %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, %edx
|
||||||
|
jb .L18
|
||||||
|
movl -4(%rbp), %eax
|
||||||
|
sall $2, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
sall $4, %edx
|
||||||
|
subl %eax, %edx
|
||||||
|
movl -8(%rbp), %eax
|
||||||
|
addl %eax, %edx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, %edx
|
||||||
|
movl $-1, (%rax,%rdx,4)
|
||||||
|
leave
|
||||||
|
.cfi_def_cfa 7, 8
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE5:
|
||||||
|
.size spawnApple, .-spawnApple
|
||||||
|
.globl tick
|
||||||
|
.type tick, @function
|
||||||
|
tick:
|
||||||
|
.LFB6:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
subq $16, %rsp
|
||||||
|
movq currentTick@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
leal 1(%rax), %edx
|
||||||
|
movq currentTick@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, (%rax)
|
||||||
|
movl $0, -16(%rbp)
|
||||||
|
jmp .L20
|
||||||
|
.L22:
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl -16(%rbp), %edx
|
||||||
|
movl (%rax,%rdx,4), %eax
|
||||||
|
movl %eax, -12(%rbp)
|
||||||
|
cmpl $0, -12(%rbp)
|
||||||
|
js .L21
|
||||||
|
cmpl $0, -12(%rbp)
|
||||||
|
js .L21
|
||||||
|
movl -12(%rbp), %edx
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, %edx
|
||||||
|
ja .L21
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl -16(%rbp), %edx
|
||||||
|
movl (%rax,%rdx,4), %eax
|
||||||
|
leal 1(%rax), %ecx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl -16(%rbp), %edx
|
||||||
|
movl %ecx, (%rax,%rdx,4)
|
||||||
|
.L21:
|
||||||
|
addl $1, -16(%rbp)
|
||||||
|
.L20:
|
||||||
|
cmpl $2399, -16(%rbp)
|
||||||
|
jbe .L22
|
||||||
|
call nib_poll_kbd
|
||||||
|
movl %eax, -8(%rbp)
|
||||||
|
cmpl $119, -8(%rbp)
|
||||||
|
jne .L23
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl $1, %eax
|
||||||
|
je .L23
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl $0, (%rax)
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl $-1, (%rax)
|
||||||
|
.L23:
|
||||||
|
cmpl $115, -8(%rbp)
|
||||||
|
jne .L24
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl $-1, %eax
|
||||||
|
je .L24
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl $0, (%rax)
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl $1, (%rax)
|
||||||
|
.L24:
|
||||||
|
cmpl $97, -8(%rbp)
|
||||||
|
jne .L25
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl $1, %eax
|
||||||
|
je .L25
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl $-1, (%rax)
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl $0, (%rax)
|
||||||
|
.L25:
|
||||||
|
cmpl $100, -8(%rbp)
|
||||||
|
jne .L26
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl $-1, %eax
|
||||||
|
je .L26
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl $1, (%rax)
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl $0, (%rax)
|
||||||
|
.L26:
|
||||||
|
movq snakeX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %edx
|
||||||
|
movq snakeDirX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
addl %edx, %eax
|
||||||
|
leal 60(%rax), %ecx
|
||||||
|
movl $-2004318071, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
mull %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
shrl $5, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
leal 0(,%rdx,4), %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $4, %eax
|
||||||
|
subl %edx, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %eax
|
||||||
|
movq snakeX@GOTPCREL(%rip), %rdx
|
||||||
|
movl %eax, (%rdx)
|
||||||
|
movq snakeY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %edx
|
||||||
|
movq snakeDirY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
addl %edx, %eax
|
||||||
|
leal 40(%rax), %ecx
|
||||||
|
movl $-858993459, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
mull %edx
|
||||||
|
shrl $5, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
sall $2, %eax
|
||||||
|
addl %edx, %eax
|
||||||
|
sall $3, %eax
|
||||||
|
subl %eax, %ecx
|
||||||
|
movl %ecx, %edx
|
||||||
|
movq snakeY@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, (%rax)
|
||||||
|
movq snakeY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
sall $2, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
sall $4, %edx
|
||||||
|
subl %eax, %edx
|
||||||
|
movq snakeX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
addl %eax, %edx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, %edx
|
||||||
|
movl (%rax,%rdx,4), %eax
|
||||||
|
movl %eax, -4(%rbp)
|
||||||
|
movl -4(%rbp), %edx
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, %edx
|
||||||
|
jae .L27
|
||||||
|
cmpl $0, -4(%rbp)
|
||||||
|
js .L27
|
||||||
|
movl startApples(%rip), %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl startLength(%rip), %eax
|
||||||
|
movl %edx, %esi
|
||||||
|
movl %eax, %edi
|
||||||
|
call start_game
|
||||||
|
.L27:
|
||||||
|
cmpl $0, -4(%rbp)
|
||||||
|
jns .L28
|
||||||
|
movl $0, %eax
|
||||||
|
call spawnApple
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
leal 1(%rax), %edx
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, (%rax)
|
||||||
|
.L28:
|
||||||
|
movq snakeY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
sall $2, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
sall $4, %edx
|
||||||
|
subl %eax, %edx
|
||||||
|
movq snakeX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
addl %eax, %edx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movl %edx, %edx
|
||||||
|
movl $0, (%rax,%rdx,4)
|
||||||
|
leave
|
||||||
|
.cfi_def_cfa 7, 8
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE6:
|
||||||
|
.size tick, .-tick
|
||||||
|
.globl draw
|
||||||
|
.type draw, @function
|
||||||
|
draw:
|
||||||
|
.LFB7:
|
||||||
|
.cfi_startproc
|
||||||
|
pushq %rbp
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
.cfi_offset 6, -16
|
||||||
|
movq %rsp, %rbp
|
||||||
|
.cfi_def_cfa_register 6
|
||||||
|
subq $64, %rsp
|
||||||
|
movq %fs:40, %rax
|
||||||
|
movq %rax, -8(%rbp)
|
||||||
|
xorl %eax, %eax
|
||||||
|
movabsq $23438616898455886, %rax
|
||||||
|
movq %rax, -16(%rbp)
|
||||||
|
movl $-1, -52(%rbp)
|
||||||
|
jmp .L30
|
||||||
|
.L43:
|
||||||
|
movl $-1, -48(%rbp)
|
||||||
|
jmp .L31
|
||||||
|
.L42:
|
||||||
|
cmpl $-1, -48(%rbp)
|
||||||
|
je .L32
|
||||||
|
cmpl $-1, -52(%rbp)
|
||||||
|
je .L32
|
||||||
|
cmpl $60, -48(%rbp)
|
||||||
|
je .L32
|
||||||
|
cmpl $40, -52(%rbp)
|
||||||
|
jne .L33
|
||||||
|
.L32:
|
||||||
|
cmpl $-1, -48(%rbp)
|
||||||
|
je .L34
|
||||||
|
cmpl $-1, -52(%rbp)
|
||||||
|
jne .L35
|
||||||
|
.L34:
|
||||||
|
movl -48(%rbp), %eax
|
||||||
|
addl $1, %eax
|
||||||
|
movl %eax, -24(%rbp)
|
||||||
|
movl -52(%rbp), %eax
|
||||||
|
addl $1, %eax
|
||||||
|
movl %eax, -20(%rbp)
|
||||||
|
movl -20(%rbp), %ecx
|
||||||
|
movl -24(%rbp), %eax
|
||||||
|
movl $35, %edx
|
||||||
|
movl %ecx, %esi
|
||||||
|
movl %eax, %edi
|
||||||
|
call nib_put_scr
|
||||||
|
nop
|
||||||
|
jmp .L37
|
||||||
|
.L35:
|
||||||
|
movl -48(%rbp), %eax
|
||||||
|
addl $1, %eax
|
||||||
|
movl %eax, -32(%rbp)
|
||||||
|
movl -52(%rbp), %eax
|
||||||
|
addl $1, %eax
|
||||||
|
movl %eax, -28(%rbp)
|
||||||
|
movl -28(%rbp), %ecx
|
||||||
|
movl -32(%rbp), %eax
|
||||||
|
movl $35, %edx
|
||||||
|
movl %ecx, %esi
|
||||||
|
movl %eax, %edi
|
||||||
|
call nib_put_scr
|
||||||
|
jmp .L37
|
||||||
|
.L33:
|
||||||
|
movl -52(%rbp), %eax
|
||||||
|
sall $2, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
sall $4, %edx
|
||||||
|
subl %eax, %edx
|
||||||
|
movl -48(%rbp), %eax
|
||||||
|
addl %eax, %edx
|
||||||
|
movq snake@GOTPCREL(%rip), %rax
|
||||||
|
movslq %edx, %rdx
|
||||||
|
movl (%rax,%rdx,4), %eax
|
||||||
|
movl %eax, -44(%rbp)
|
||||||
|
movl -48(%rbp), %eax
|
||||||
|
addl $1, %eax
|
||||||
|
movl %eax, -40(%rbp)
|
||||||
|
movl -52(%rbp), %eax
|
||||||
|
addl $1, %eax
|
||||||
|
movl %eax, -36(%rbp)
|
||||||
|
cmpl $0, -44(%rbp)
|
||||||
|
js .L38
|
||||||
|
movl -44(%rbp), %edx
|
||||||
|
movq snakeLength@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, %edx
|
||||||
|
jae .L38
|
||||||
|
movl -48(%rbp), %edx
|
||||||
|
movq snakeX@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, %edx
|
||||||
|
jne .L39
|
||||||
|
movl -52(%rbp), %edx
|
||||||
|
movq snakeY@GOTPCREL(%rip), %rax
|
||||||
|
movl (%rax), %eax
|
||||||
|
cmpl %eax, %edx
|
||||||
|
jne .L39
|
||||||
|
movl -36(%rbp), %ecx
|
||||||
|
movl -40(%rbp), %eax
|
||||||
|
movl $64, %edx
|
||||||
|
movl %ecx, %esi
|
||||||
|
movl %eax, %edi
|
||||||
|
call nib_put_scr
|
||||||
|
jmp .L37
|
||||||
|
.L39:
|
||||||
|
movl -44(%rbp), %eax
|
||||||
|
leal -1(%rax), %ecx
|
||||||
|
movl $-1840700269, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
imull %edx
|
||||||
|
leal (%rdx,%rcx), %eax
|
||||||
|
sarl $2, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
sarl $31, %eax
|
||||||
|
subl %eax, %edx
|
||||||
|
movl %edx, %eax
|
||||||
|
movl %eax, %edx
|
||||||
|
sall $3, %edx
|
||||||
|
subl %eax, %edx
|
||||||
|
movl %ecx, %eax
|
||||||
|
subl %edx, %eax
|
||||||
|
cltq
|
||||||
|
movzbl -16(%rbp,%rax), %eax
|
||||||
|
movsbl %al, %edx
|
||||||
|
movl -36(%rbp), %ecx
|
||||||
|
movl -40(%rbp), %eax
|
||||||
|
movl %ecx, %esi
|
||||||
|
movl %eax, %edi
|
||||||
|
call nib_put_scr
|
||||||
|
jmp .L37
|
||||||
|
.L38:
|
||||||
|
cmpl $0, -44(%rbp)
|
||||||
|
jns .L41
|
||||||
|
movl -36(%rbp), %ecx
|
||||||
|
movl -40(%rbp), %eax
|
||||||
|
movl $111, %edx
|
||||||
|
movl %ecx, %esi
|
||||||
|
movl %eax, %edi
|
||||||
|
call nib_put_scr
|
||||||
|
jmp .L37
|
||||||
|
.L41:
|
||||||
|
movl -36(%rbp), %ecx
|
||||||
|
movl -40(%rbp), %eax
|
||||||
|
movl $32, %edx
|
||||||
|
movl %ecx, %esi
|
||||||
|
movl %eax, %edi
|
||||||
|
call nib_put_scr
|
||||||
|
.L37:
|
||||||
|
addl $1, -48(%rbp)
|
||||||
|
.L31:
|
||||||
|
cmpl $60, -48(%rbp)
|
||||||
|
jle .L42
|
||||||
|
addl $1, -52(%rbp)
|
||||||
|
.L30:
|
||||||
|
cmpl $40, -52(%rbp)
|
||||||
|
jle .L43
|
||||||
|
movq -8(%rbp), %rax
|
||||||
|
xorq %fs:40, %rax
|
||||||
|
je .L44
|
||||||
|
call __stack_chk_fail@PLT
|
||||||
|
.L44:
|
||||||
|
leave
|
||||||
|
.cfi_def_cfa 7, 8
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE7:
|
||||||
|
.size draw, .-draw
|
||||||
|
.ident "GCC: (GNU) 4.9.2"
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
||||||
+178
@@ -0,0 +1,178 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "helpers.c"
|
||||||
|
|
||||||
|
#define WIDTH 60
|
||||||
|
#define HEIGHT 40
|
||||||
|
#define DEBUG false
|
||||||
|
|
||||||
|
unsigned int startLength = 0;
|
||||||
|
unsigned int startApples = 0;
|
||||||
|
|
||||||
|
unsigned int currentTick;
|
||||||
|
int snake[WIDTH*HEIGHT];
|
||||||
|
unsigned int snakeLength;
|
||||||
|
unsigned int snakeX;
|
||||||
|
unsigned int snakeY;
|
||||||
|
int snakeDirX;
|
||||||
|
int snakeDirY;
|
||||||
|
unsigned int numApples;
|
||||||
|
|
||||||
|
void spawnApple();
|
||||||
|
void tick();
|
||||||
|
void draw();
|
||||||
|
|
||||||
|
void start_game(int len, int n_apples)
|
||||||
|
{
|
||||||
|
if (startLength == 0)
|
||||||
|
startLength = len;
|
||||||
|
if (startApples == 0)
|
||||||
|
startApples = n_apples;
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
currentTick = 0;
|
||||||
|
snakeLength = len;
|
||||||
|
numApples = n_apples;
|
||||||
|
|
||||||
|
nib_init();
|
||||||
|
|
||||||
|
//printf("Started with worm length %i and %i apples!\n", snakeLength, numApples);
|
||||||
|
|
||||||
|
// Initialize the snake array
|
||||||
|
// Set every cell to a time value greater than the snake length
|
||||||
|
for (unsigned int i = 0; i < WIDTH*HEIGHT; ++i) {
|
||||||
|
snake[i] = snakeLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place the snake head in the middle
|
||||||
|
snakeX = WIDTH / 2;
|
||||||
|
snakeY = HEIGHT / 2;
|
||||||
|
snakeDirX = 0;
|
||||||
|
snakeDirY = -1;
|
||||||
|
|
||||||
|
// Place the initial snake segments, downwards or something
|
||||||
|
for (unsigned int i = 0; i < snakeLength; ++i) {
|
||||||
|
unsigned int x = snakeX % WIDTH;
|
||||||
|
unsigned int y = (snakeY + i) % HEIGHT;
|
||||||
|
snake[x + y*WIDTH] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place apples
|
||||||
|
srand(time(0));
|
||||||
|
for (unsigned int i = 0; i < numApples; ++i) {
|
||||||
|
spawnApple();
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
tick();
|
||||||
|
draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void spawnApple()
|
||||||
|
{
|
||||||
|
unsigned int x = rand() % WIDTH;
|
||||||
|
unsigned int y = rand() % HEIGHT;
|
||||||
|
while (snake[x + y*WIDTH] < snakeLength) {
|
||||||
|
x = rand() % WIDTH;
|
||||||
|
y = rand() % HEIGHT;
|
||||||
|
}
|
||||||
|
//printf("Placing apple at (%i,%i)\n", x, y);
|
||||||
|
snake[x + y*WIDTH] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tick()
|
||||||
|
{
|
||||||
|
currentTick++;
|
||||||
|
// Increment cell times
|
||||||
|
for (unsigned int i = 0; i < WIDTH*HEIGHT; ++i) {
|
||||||
|
int val = snake[i];
|
||||||
|
|
||||||
|
if (val < 0) {
|
||||||
|
// Apple lifetime
|
||||||
|
//snake[i]--;
|
||||||
|
} else if (val >= 0 && val <= snakeLength) {
|
||||||
|
// Other cells
|
||||||
|
snake[i]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int key = nib_poll_kbd();
|
||||||
|
if (key == 'w' && snakeDirY != 1) {
|
||||||
|
snakeDirX = 0;
|
||||||
|
snakeDirY = -1;
|
||||||
|
}
|
||||||
|
if (key == 's' && snakeDirY != -1) {
|
||||||
|
snakeDirX = 0;
|
||||||
|
snakeDirY = 1;
|
||||||
|
}
|
||||||
|
if (key == 'a' && snakeDirX != 1) {
|
||||||
|
snakeDirX = -1;
|
||||||
|
snakeDirY = 0;
|
||||||
|
}
|
||||||
|
if (key == 'd' && snakeDirX != -1) {
|
||||||
|
snakeDirX = 1;
|
||||||
|
snakeDirY = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move snake
|
||||||
|
snakeX = (snakeX + snakeDirX + WIDTH) % WIDTH;
|
||||||
|
snakeY = (snakeY + snakeDirY + HEIGHT) % HEIGHT;
|
||||||
|
// On collision with self
|
||||||
|
int val = snake[snakeX + snakeY*WIDTH];
|
||||||
|
if (val < snakeLength && val >= 0) {
|
||||||
|
//nib_end();
|
||||||
|
start_game(startLength, startApples);
|
||||||
|
}
|
||||||
|
// ON collision with apple
|
||||||
|
if (val < 0) {
|
||||||
|
// Spawn a new apple somewhere
|
||||||
|
spawnApple();
|
||||||
|
// Increase our length!
|
||||||
|
snakeLength++;
|
||||||
|
}
|
||||||
|
snake[snakeX + snakeY*WIDTH] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw()
|
||||||
|
{
|
||||||
|
char body[] = "NIBBLES";
|
||||||
|
|
||||||
|
for (int y = -1; y <= HEIGHT; ++y) {
|
||||||
|
for (int x = -1; x <= WIDTH; ++x) {
|
||||||
|
|
||||||
|
if (x == -1 || y == -1 || x == WIDTH || y == HEIGHT) {
|
||||||
|
if (x == -1 || y == -1) {
|
||||||
|
unsigned int screenX = x + 1;
|
||||||
|
unsigned int screenY = y + 1;
|
||||||
|
nib_put_scr(screenX, screenY, '#');
|
||||||
|
} else {
|
||||||
|
unsigned int screenX = x + 1;
|
||||||
|
unsigned int screenY = y + 1;
|
||||||
|
nib_put_scr(screenX, screenY, '#');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int snakeVal = snake[x + y*WIDTH];
|
||||||
|
unsigned int screenX = x + 1;
|
||||||
|
unsigned int screenY = y + 1;
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
nib_put_scr(screenX, screenY, '0' + snakeVal);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (snakeVal >= 0 && snakeVal < snakeLength) {
|
||||||
|
if (x == snakeX && y == snakeY) {
|
||||||
|
nib_put_scr(screenX, screenY, '@');
|
||||||
|
} else {
|
||||||
|
nib_put_scr(screenX, screenY, body[(snakeVal - 1) % 7]);
|
||||||
|
}
|
||||||
|
} else if (snakeVal < 0) {
|
||||||
|
nib_put_scr(screenX, screenY, 'o');
|
||||||
|
} else {
|
||||||
|
nib_put_scr(screenX, screenY, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2003, Blekinge Institute of Technology
|
||||||
|
*
|
||||||
|
* Filename: helpers.c
|
||||||
|
* Author: Simon Kagstrom <ska@bth.se>
|
||||||
|
* Description: Library with helpers for the nibbles game
|
||||||
|
*
|
||||||
|
* $Id: helpers.c 4937 2005-10-06 12:50:50Z ska $
|
||||||
|
*
|
||||||
|
********************************************************************/
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
|
static WINDOW *p_screen;
|
||||||
|
|
||||||
|
int nib_poll_kbd(void)
|
||||||
|
{
|
||||||
|
int key = getch();
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nib_put_scr(int x, int y, int ch)
|
||||||
|
{
|
||||||
|
mvprintw(y, x, "%c", ch);
|
||||||
|
wrefresh(p_screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nib_init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
srand(time(0)); /* Init randomiser */
|
||||||
|
p_screen = initscr(); /* Create the window */
|
||||||
|
start_color(); /* We use color (well...) */
|
||||||
|
curs_set(0); /* Make cursor invisible */
|
||||||
|
noecho(); /* Don't output chars on screen when written */
|
||||||
|
keypad(p_screen, TRUE); /* Give p_screen keyboard focus */
|
||||||
|
nodelay(p_screen, TRUE); /* Make getch nonblocking */
|
||||||
|
}
|
||||||
|
|
||||||
|
void nib_end(void)
|
||||||
|
{
|
||||||
|
endwin();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2003, Blekinge Institute of Technology
|
||||||
|
*
|
||||||
|
* Filename: main.c
|
||||||
|
* Author: Simon Kagstrom <ska@bth.se>
|
||||||
|
* Description: main function for nibbles game.
|
||||||
|
*
|
||||||
|
* $Id: main.c 1369 2005-01-20 20:57:54Z ska $
|
||||||
|
*
|
||||||
|
********************************************************************/
|
||||||
|
#include <stdio.h> /* printf */
|
||||||
|
#include <stdlib.h> /* atoi */
|
||||||
|
|
||||||
|
extern void start_game(int len, int n_apples);
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int len, apples;
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
{
|
||||||
|
printf("Usage: %s LEN APPLES\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = atoi(argv[1]);
|
||||||
|
apples = atoi(argv[2]);
|
||||||
|
|
||||||
|
start_game(len, apples);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,369 @@
|
|||||||
|
#define WIDTH 60
|
||||||
|
#define HEIGHT 40
|
||||||
|
|
||||||
|
.bss
|
||||||
|
# Array of longs representing the game field
|
||||||
|
.align 4
|
||||||
|
world: .space WIDTH*HEIGHT*4
|
||||||
|
|
||||||
|
.data
|
||||||
|
# Current length of the snake
|
||||||
|
snakeLength: .long 0
|
||||||
|
# Snake position
|
||||||
|
snakePosX: .long WIDTH / 2
|
||||||
|
snakePosY: .long HEIGHT / 2
|
||||||
|
# Snake direction
|
||||||
|
snakeDirX: .long 1
|
||||||
|
snakeDirY: .long 0
|
||||||
|
# Number of apples
|
||||||
|
numApples: .long 0
|
||||||
|
# Optional score-keeping
|
||||||
|
score: .long 0
|
||||||
|
# Utility strings
|
||||||
|
snibbles: .ascii "NIBBLES"
|
||||||
|
sgameover: .string " Game over! Score: %i "
|
||||||
|
sgameover_end:
|
||||||
|
string1: .string "Started with snake length %i and %i apples!\n"
|
||||||
|
string2: .string "Snake position: (%i, %i)\n"
|
||||||
|
stringi: .string "%i\n"
|
||||||
|
stringtest: .string "> %i %i %c\n"
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global start_game
|
||||||
|
start_game:
|
||||||
|
# snakeLength = len
|
||||||
|
movl 4(%esp), %eax
|
||||||
|
movl %eax, snakeLength
|
||||||
|
# numApples = n_apples
|
||||||
|
movl 8(%esp), %eax
|
||||||
|
movl %eax, numApples
|
||||||
|
|
||||||
|
pushl %ebx
|
||||||
|
pushl %edi
|
||||||
|
|
||||||
|
# Call nib_init
|
||||||
|
call nib_init
|
||||||
|
# Seed randomness
|
||||||
|
pushl $0
|
||||||
|
call time
|
||||||
|
addl $4, %esp
|
||||||
|
pushl %eax
|
||||||
|
call srand
|
||||||
|
addl $4, %esp
|
||||||
|
|
||||||
|
# Print our arguments
|
||||||
|
#pushl numApples
|
||||||
|
#pushl snakeLength
|
||||||
|
#pushl $string1
|
||||||
|
#call printf
|
||||||
|
#addl $4*3, %esp
|
||||||
|
|
||||||
|
# Print worm position
|
||||||
|
#pushl snakePosY
|
||||||
|
#pushl snakePosX
|
||||||
|
#pushl $string2
|
||||||
|
#call printf
|
||||||
|
#addl $4*3, %esp
|
||||||
|
|
||||||
|
# Initialize the snake array
|
||||||
|
# Set every cell to a time value greater than the snake length
|
||||||
|
movl $world, %edi
|
||||||
|
movl snakeLength, %eax
|
||||||
|
movl $WIDTH*HEIGHT, %ebx
|
||||||
|
xorl %ecx, %ecx
|
||||||
|
1:
|
||||||
|
movl %eax, (%edi, %ecx, 4)
|
||||||
|
incl %ecx
|
||||||
|
cmpl %ebx, %ecx
|
||||||
|
jl 1b
|
||||||
|
|
||||||
|
# Spawn initial apples
|
||||||
|
movl numApples, %ecx
|
||||||
|
1:
|
||||||
|
pushl %ecx
|
||||||
|
call spawnApple
|
||||||
|
popl %ecx
|
||||||
|
loop 1b
|
||||||
|
|
||||||
|
# Loop forever
|
||||||
|
loop:
|
||||||
|
# Sleep for 150 ms
|
||||||
|
pushl $500*1000
|
||||||
|
call usleep
|
||||||
|
addl $4, %esp
|
||||||
|
jmp tick
|
||||||
|
|
||||||
|
popl %edi
|
||||||
|
popl %ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
# Update stuff
|
||||||
|
tick:
|
||||||
|
movl $world, %edi
|
||||||
|
|
||||||
|
# Increment cell times
|
||||||
|
movl snakeLength, %ebx
|
||||||
|
xorl %ecx, %ecx
|
||||||
|
1:
|
||||||
|
movl (%edi, %ecx, 4), %eax
|
||||||
|
# If the value is negative it's an apple we don't want to disappear
|
||||||
|
test %eax, %eax
|
||||||
|
js 2f
|
||||||
|
# No need to increment if it's already greater than snakeLength
|
||||||
|
cmpl %ebx, %eax
|
||||||
|
jg 2f
|
||||||
|
# Increment the cell value
|
||||||
|
incl %eax
|
||||||
|
movl %eax, (%edi, %ecx, 4)
|
||||||
|
2: incl %ecx # Loop increment
|
||||||
|
cmpl $WIDTH*HEIGHT, %ecx
|
||||||
|
jne 1b
|
||||||
|
|
||||||
|
# Input
|
||||||
|
call nib_poll_kbd
|
||||||
|
# Down
|
||||||
|
movl $258, %ebx
|
||||||
|
cmpl %eax, %ebx
|
||||||
|
jne 1f
|
||||||
|
movl $0, snakeDirX
|
||||||
|
movl $1, snakeDirY
|
||||||
|
1: # Up
|
||||||
|
movl $259, %ebx
|
||||||
|
cmpl %eax, %ebx
|
||||||
|
jne 1f
|
||||||
|
movl $0, snakeDirX
|
||||||
|
movl $-1, snakeDirY
|
||||||
|
1: # Left
|
||||||
|
movl $260, %ebx
|
||||||
|
cmpl %eax, %ebx
|
||||||
|
jne 1f
|
||||||
|
movl $-1, snakeDirX
|
||||||
|
movl $0, snakeDirY
|
||||||
|
1: # Right
|
||||||
|
movl $261, %ebx
|
||||||
|
cmpl %eax, %ebx
|
||||||
|
jne 1f
|
||||||
|
movl $1, snakeDirX
|
||||||
|
movl $0, snakeDirY
|
||||||
|
1:
|
||||||
|
|
||||||
|
# Move snake
|
||||||
|
# snakePosX = (snakePosX + snakeDirY + WIDTH) % WIDTH
|
||||||
|
movl snakePosX, %eax
|
||||||
|
movl snakeDirX, %ebx
|
||||||
|
addl %ebx, %eax
|
||||||
|
addl $WIDTH, %eax # For modulo wrap-around
|
||||||
|
xorl %edx, %edx
|
||||||
|
movl $WIDTH, %ecx
|
||||||
|
divl %ecx
|
||||||
|
mov %edx, snakePosX
|
||||||
|
# snakePosY = (snakePosY + snakeDirY + HEIGHT) % HEIGHT
|
||||||
|
movl snakePosY, %eax
|
||||||
|
movl snakeDirY, %ebx
|
||||||
|
addl %ebx, %eax
|
||||||
|
addl $HEIGHT, %eax # For modulo wrap-around
|
||||||
|
xorl %edx, %edx
|
||||||
|
movl $HEIGHT, %ecx
|
||||||
|
divl %ecx
|
||||||
|
mov %edx, snakePosY
|
||||||
|
|
||||||
|
# Get value at head position
|
||||||
|
movl snakePosY, %eax
|
||||||
|
movl $WIDTH, %edx
|
||||||
|
mull %edx
|
||||||
|
addl snakePosX, %eax
|
||||||
|
movl (%edi, %eax, 4), %edx
|
||||||
|
|
||||||
|
# Collision with apple if negative
|
||||||
|
test %edx, %edx
|
||||||
|
js 1f
|
||||||
|
# No need to increment if it's already greater than snakeLength
|
||||||
|
movl snakeLength, %ebx
|
||||||
|
cmpl %ebx, %edx
|
||||||
|
jg 2f
|
||||||
|
# End the game when the snake collides with itself
|
||||||
|
jmp gameOver
|
||||||
|
1: # Spawn a new apple
|
||||||
|
pushl %edi
|
||||||
|
pushl %eax
|
||||||
|
call spawnApple
|
||||||
|
popl %eax
|
||||||
|
popl %edi
|
||||||
|
# Extend the snake!
|
||||||
|
incl snakeLength
|
||||||
|
2:
|
||||||
|
|
||||||
|
# Set time value to 0 at snake head position
|
||||||
|
# i = x + y * WIDTH
|
||||||
|
# %edi = %ebx + %ecx * $WIDTH
|
||||||
|
movl $0, (%edi, %eax, 4)
|
||||||
|
|
||||||
|
jmp draw
|
||||||
|
#jmp debug_draw
|
||||||
|
|
||||||
|
# Draw stuff
|
||||||
|
draw:
|
||||||
|
# Loop Y
|
||||||
|
movl $HEIGHT, %ecx
|
||||||
|
1:
|
||||||
|
# Loop X
|
||||||
|
movl $WIDTH, %ebx
|
||||||
|
2:
|
||||||
|
# Save loop registers
|
||||||
|
pushl %ecx
|
||||||
|
pushl %ebx
|
||||||
|
subl $1, %ecx
|
||||||
|
subl $1, %ebx
|
||||||
|
|
||||||
|
# Call nib_put_scr
|
||||||
|
|
||||||
|
# i = x + y * WIDTH
|
||||||
|
# %eax = %ebx + %ecx * $WIDTH
|
||||||
|
movl %ecx, %eax
|
||||||
|
movl $WIDTH, %edx
|
||||||
|
mull %edx
|
||||||
|
addl %ebx, %eax
|
||||||
|
# Fetch the value of the cell
|
||||||
|
movl $world, %edi
|
||||||
|
movl (%edi, %eax, 4), %eax
|
||||||
|
|
||||||
|
# Compare with the snake length
|
||||||
|
cmpl snakeLength, %eax
|
||||||
|
# If the value is negative, it's an apple
|
||||||
|
test %eax, %eax
|
||||||
|
js 4f
|
||||||
|
# If it's greater or equal to snakeLength, it's empty
|
||||||
|
cmpl snakeLength, %eax
|
||||||
|
jge 3f
|
||||||
|
# Else, it's part of the snake
|
||||||
|
pushl $'@'
|
||||||
|
jmp 5f
|
||||||
|
3: pushl $' '
|
||||||
|
jmp 5f
|
||||||
|
4: pushl $'o'
|
||||||
|
5:
|
||||||
|
|
||||||
|
movl %ecx, %eax # Y
|
||||||
|
pushl %eax
|
||||||
|
|
||||||
|
movl %ebx, %eax # X
|
||||||
|
pushl %eax
|
||||||
|
|
||||||
|
call nib_put_scr
|
||||||
|
addl $4*3, %esp
|
||||||
|
|
||||||
|
# Restore loop registers
|
||||||
|
popl %ebx
|
||||||
|
popl %ecx
|
||||||
|
|
||||||
|
decl %ebx # Decrement X
|
||||||
|
jnz 2b # End of X loop
|
||||||
|
loop 1b # End of Y loop
|
||||||
|
|
||||||
|
jmp loop
|
||||||
|
|
||||||
|
# Debug drawing
|
||||||
|
debug_draw:
|
||||||
|
# Loop Y
|
||||||
|
movl $HEIGHT, %ecx
|
||||||
|
1:
|
||||||
|
# Loop X
|
||||||
|
movl $WIDTH, %ebx
|
||||||
|
2:
|
||||||
|
# Save loop registers
|
||||||
|
pushl %ecx
|
||||||
|
pushl %ebx
|
||||||
|
subl $1, %ecx
|
||||||
|
subl $1, %ebx
|
||||||
|
|
||||||
|
# Call nib_put_scr
|
||||||
|
|
||||||
|
# i = x + y * WIDTH
|
||||||
|
# %edi = %ebx + %ecx * $WIDTH
|
||||||
|
movl %ecx, %eax
|
||||||
|
movl $WIDTH, %edx
|
||||||
|
mull %edx
|
||||||
|
addl %ebx, %eax
|
||||||
|
# Fetch the value of the cell
|
||||||
|
movl $world, %edi
|
||||||
|
movl (%edi, %eax, 4), %eax
|
||||||
|
pushl %eax
|
||||||
|
|
||||||
|
movl %ecx, %eax # Y
|
||||||
|
pushl %eax
|
||||||
|
|
||||||
|
movl %ebx, %eax # X
|
||||||
|
pushl %eax
|
||||||
|
|
||||||
|
call nib_put_scr
|
||||||
|
addl $4*3, %esp
|
||||||
|
|
||||||
|
# Restore loop registers
|
||||||
|
popl %ebx
|
||||||
|
popl %ecx
|
||||||
|
|
||||||
|
decl %ebx # Decrement X
|
||||||
|
jnz 2b # End of X loop
|
||||||
|
loop 1b # End of Y loop
|
||||||
|
|
||||||
|
jmp loop
|
||||||
|
|
||||||
|
gameOver:
|
||||||
|
# Calculate string length
|
||||||
|
movl $sgameover_end, %eax
|
||||||
|
subl $sgameover, %eax
|
||||||
|
subl $1, %eax # Discount null terminator
|
||||||
|
|
||||||
|
# Calculate X-pos
|
||||||
|
movl $2, %ebx
|
||||||
|
xorl %edx, %edx
|
||||||
|
divl %ebx
|
||||||
|
negl %eax
|
||||||
|
addl $WIDTH/2, %eax
|
||||||
|
|
||||||
|
# Print game over message
|
||||||
|
pushl snakeLength
|
||||||
|
pushl $sgameover
|
||||||
|
pushl %eax # X
|
||||||
|
pushl $HEIGHT/2 # Y
|
||||||
|
call mvprintw
|
||||||
|
add $4*3, %esp
|
||||||
|
call refresh
|
||||||
|
|
||||||
|
pushl $3000*1000
|
||||||
|
call usleep
|
||||||
|
addl $4, %esp
|
||||||
|
call nib_end
|
||||||
|
|
||||||
|
spawnApple:
|
||||||
|
pushl %ebx
|
||||||
|
|
||||||
|
# %ecx = rand() % HEIGHT
|
||||||
|
call rand
|
||||||
|
xorl %edx, %edx
|
||||||
|
movl $HEIGHT, %ebx
|
||||||
|
divl %ebx
|
||||||
|
movl %edx, %ecx
|
||||||
|
# %ebx = rand() % WIDTH
|
||||||
|
pushl %ecx
|
||||||
|
call rand
|
||||||
|
xorl %edx, %edx
|
||||||
|
movl $WIDTH, %ebx
|
||||||
|
divl %ebx
|
||||||
|
movl %edx, %ebx
|
||||||
|
popl %ecx
|
||||||
|
|
||||||
|
# i = x + y * WIDTH
|
||||||
|
# %eax = %ebx + %ecx * $WIDTH
|
||||||
|
movl %ecx, %eax
|
||||||
|
movl $WIDTH, %edx
|
||||||
|
mull %edx
|
||||||
|
addl %ebx, %eax
|
||||||
|
|
||||||
|
# Set the cell negative to represent an apple
|
||||||
|
movl $world, %ecx
|
||||||
|
movl $-1, %edx
|
||||||
|
movl %edx, (%ecx, %eax, 4)
|
||||||
|
|
||||||
|
popl %ebx
|
||||||
|
ret
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
.text
|
||||||
|
.global _start
|
||||||
|
_start:
|
||||||
|
# n_apples
|
||||||
|
pushl $10
|
||||||
|
# len
|
||||||
|
pushl $3
|
||||||
|
call start_game
|
||||||
|
addl $4*2, %esp
|
||||||
|
|
||||||
|
movl $0, %eax
|
||||||
|
ret
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 10; ++x) {
|
||||||
|
for (int y = 0; y < 20; ++y) {
|
||||||
|
nib_put_scr(x, y, '@');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
.file "test.c"
|
||||||
|
.section .text.unlikely,"ax",@progbits
|
||||||
|
.LCOLDB0:
|
||||||
|
.section .text.startup,"ax",@progbits
|
||||||
|
.LHOTB0:
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl main
|
||||||
|
.type main, @function
|
||||||
|
main:
|
||||||
|
.LFB0:
|
||||||
|
.cfi_startproc
|
||||||
|
leal 4(%esp), %ecx
|
||||||
|
.cfi_def_cfa 1, 0
|
||||||
|
andl $-16, %esp
|
||||||
|
pushl -4(%ecx)
|
||||||
|
pushl %ebp
|
||||||
|
.cfi_escape 0x10,0x5,0x2,0x75,0
|
||||||
|
movl %esp, %ebp
|
||||||
|
pushl %edi
|
||||||
|
pushl %esi
|
||||||
|
pushl %ebx
|
||||||
|
pushl %ecx
|
||||||
|
.cfi_escape 0xf,0x3,0x75,0x70,0x6
|
||||||
|
.cfi_escape 0x10,0x7,0x2,0x75,0x7c
|
||||||
|
.cfi_escape 0x10,0x6,0x2,0x75,0x78
|
||||||
|
.cfi_escape 0x10,0x3,0x2,0x75,0x74
|
||||||
|
xorl %edi, %edi
|
||||||
|
call __x86.get_pc_thunk.bx
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
|
subl $8, %esp
|
||||||
|
.p2align 4,,10
|
||||||
|
.p2align 3
|
||||||
|
.L2:
|
||||||
|
xorl %esi, %esi
|
||||||
|
.p2align 4,,10
|
||||||
|
.p2align 3
|
||||||
|
.L3:
|
||||||
|
subl $4, %esp
|
||||||
|
pushl $64
|
||||||
|
pushl %esi
|
||||||
|
addl $1, %esi
|
||||||
|
pushl %edi
|
||||||
|
call nib_put_scr@PLT
|
||||||
|
addl $16, %esp
|
||||||
|
cmpl $20, %esi
|
||||||
|
jne .L3
|
||||||
|
addl $1, %edi
|
||||||
|
cmpl $10, %edi
|
||||||
|
jne .L2
|
||||||
|
leal -16(%ebp), %esp
|
||||||
|
xorl %eax, %eax
|
||||||
|
popl %ecx
|
||||||
|
.cfi_restore 1
|
||||||
|
.cfi_def_cfa 1, 0
|
||||||
|
popl %ebx
|
||||||
|
.cfi_restore 3
|
||||||
|
popl %esi
|
||||||
|
.cfi_restore 6
|
||||||
|
popl %edi
|
||||||
|
.cfi_restore 7
|
||||||
|
popl %ebp
|
||||||
|
.cfi_restore 5
|
||||||
|
leal -4(%ecx), %esp
|
||||||
|
.cfi_def_cfa 4, 4
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE0:
|
||||||
|
.size main, .-main
|
||||||
|
.section .text.unlikely
|
||||||
|
.LCOLDE0:
|
||||||
|
.section .text.startup
|
||||||
|
.LHOTE0:
|
||||||
|
.section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
|
||||||
|
.globl __x86.get_pc_thunk.bx
|
||||||
|
.hidden __x86.get_pc_thunk.bx
|
||||||
|
.type __x86.get_pc_thunk.bx, @function
|
||||||
|
__x86.get_pc_thunk.bx:
|
||||||
|
.LFB1:
|
||||||
|
.cfi_startproc
|
||||||
|
movl (%esp), %ebx
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE1:
|
||||||
|
.ident "GCC: (GNU) 4.9.2"
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
.data
|
||||||
|
|
||||||
|
.globl __progname
|
||||||
|
__progname:
|
||||||
|
.int 0
|
||||||
|
|
||||||
|
.globl environ
|
||||||
|
environ:
|
||||||
|
.byte 0
|
||||||
Reference in New Issue
Block a user