OK LETS GIT HOLY SHIT

This commit is contained in:
2014-11-30 15:11:02 +01:00
commit 63445aa008
12 changed files with 1597 additions and 0 deletions
+79
View File
@@ -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 :
+31
View File
@@ -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
View File
@@ -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
View File
@@ -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, ' ');
}
}
}
}
}
+48
View File
@@ -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);
}
+33
View File
@@ -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;
}
BIN
View File
Binary file not shown.
+369
View File
@@ -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
+12
View File
@@ -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
+9
View File
@@ -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;
}
+85
View File
@@ -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
+9
View File
@@ -0,0 +1,9 @@
.data
.globl __progname
__progname:
.int 0
.globl environ
environ:
.byte 0