gamejam

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

game.S (6684B)


      1 /*
      2 reg	| use			| can be overwritten
      3 ----------------------------------------------------
      4 normal	| syscalls, func args	| yes
      5 r8  	| player X		| no
      6 r9  	| player Y		| no
      7 r10	| game state		| no
      8 r11	| unused		| yes
      9 r12	| unused		| yes
     10 r13	| loop counter (i)	| yes
     11 r14	| misc			| yes
     12 r15	| misc			| yes
     13 */
     14 
     15 /* 
     16 draw width: 21
     17 draw height: 21
     18 */
     19 
     20 .macro save
     21 	push %r11
     22 	push %r12
     23 	push %r13
     24 	push %r14
     25 	push %r15
     26 .endm
     27 
     28 .macro restore
     29 	pop %r15
     30 	pop %r14
     31 	pop %r13
     32 	pop %r12
     33 	pop %r11
     34 .endm
     35 
     36 
     37 .globl _start
     38 .text
     39 
     40 /* void putline(char *map, int off) */
     41 putline:
     42 	save
     43 
     44 	mov %rsi, %r14			/* off arg */
     45 	mov %rdi, %r15 			/* map arg */
     46 
     47 	mov %r14, %r13			
     48 	add %r14, %r15
     49 .loop1:
     50 	mov $999, %r11			/* condition 1 */
     51 	cmp %r13, %r11
     52 	jl .eloop1
     53 
     54 	mov %r13, %r12			/* condition 2 */
     55 	sub %r14, %r12
     56 	mov $20, %r11
     57 	cmp %r12, %r11
     58 	jl .eloop1
     59 
     60 	mov $1, %rax			/* putc(map[i]); */
     61 	mov $1, %rdi
     62 	mov %r15, %rsi
     63 	inc %r15
     64 	mov $1, %rdx
     65 	syscall
     66 
     67 	inc %r13			/* i++ */
     68 	jmp .loop1
     69 .eloop1:
     70 
     71 	mov $1, %rax
     72 	mov $1, %rdi
     73 	mov $nl, %rsi
     74 	mov $2, %rdx
     75 	syscall
     76 
     77 	restore
     78 	ret
     79 
     80 /* void printscreen(char *map) */
     81 printscreen:
     82 	save
     83 
     84 	/* map arg in rsi */
     85 
     86 	mov %r8, %r10			/* decide where to draw the screen (centers the player) */
     87 	mov %r9, %r11	
     88 	sub $10, %r10
     89 	sub $10, %r11
     90 	mov %rsi, %r12			
     91 	mov $1000, %rax
     92 	mul %r11
     93 	lea (%rax,%r12), %r12
     94 
     95 	mov $0, %r13			/* draw the camera's view */
     96 	mov $21, %r14			
     97 	mov $0, %r15			
     98 .putlines:
     99 	lea (%r15,%r12), %rdi	
    100 	mov %r10, %rsi
    101 	call putline
    102 	add $1000, %r15
    103 	add $1, %r13
    104 	cmp %r13, %r14
    105 	jne .putlines
    106 
    107 	restore
    108 	ret
    109 
    110 clearscreen:
    111 	save
    112 
    113 	mov $1, %rax
    114 	mov $1, %rdi
    115 	mov $clear, %rsi
    116 	mov $2, %rdx
    117 	syscall
    118 	
    119 	restore
    120 	ret
    121 
    122 drawtextbuf:
    123 	save
    124 	mov $textbuf, %rsi
    125 .loop3:
    126 	mov $0, %rax
    127 	movb (%rsi), %bl
    128 	cmp %rax, %rbx
    129 	je .eloop3
    130 	
    131 	mov $1, %rax
    132 	mov $1, %rdi
    133 	mov $1, %rdx
    134 	syscall
    135 	inc %rsi
    136 
    137 	jmp .loop3
    138 .eloop3:
    139 	mov $1, %rax
    140 	mov $1, %rdi
    141 	mov $nl, %rsi
    142 	mov $2, %rdx
    143 	syscall
    144 	
    145 	restore
    146 	ret
    147 
    148 drawframe:
    149 	save
    150 	
    151 	movq $map, %r11			/* draw player sprite */
    152 	add %r8, %r11
    153 	mov %r9, %rax
    154 	mov $1000, %rcx
    155 	mul %rcx
    156 	add %rax, %r11
    157 
    158 	/* switch on the char to be replaced */
    159 	cmpb $'#', (%r11)
    160 	jne .switch22
    161 .switch21:
    162 	mov $outofbounds, %rdi
    163 	mov $textbuf, %rsi
    164 	call strcpy
    165 	jmp .eswitch2
    166 .switch22:
    167 	cmpb $'E', (%r11)
    168 	jne .switch23
    169 	mov $person1, %rdi
    170 	mov $textbuf, %rsi
    171 	call strcpy
    172 	jmp .eswitch2
    173 .switch23:
    174 	cmpb $'A', (%r11)
    175 	jne .switch24
    176 	mov $person2, %rdi
    177 	mov $textbuf, %rsi
    178 	call strcpy
    179 	jmp .eswitch2
    180 .switch24:
    181 	cmpb $'W', (%r11)
    182 	jne .switch25
    183 	mov $person3, %rdi
    184 	mov $textbuf, %rsi
    185 	call strcpy
    186 	jmp .eswitch2
    187 .switch25:
    188 	cmpb $'K', (%r11)
    189 	jne .switch26
    190 	mov $person4, %rdi
    191 	mov $textbuf, %rsi
    192 	call strcpy
    193 	jmp .eswitch2
    194 .switch26:
    195 	cmpb $'L', (%r11)
    196 	jne .switch27
    197 	mov $person5, %rdi
    198 	mov $textbuf, %rsi
    199 	call strcpy
    200 	jmp .eswitch2
    201 .switch27:
    202 	cmpb $'P', (%r11)
    203 	jne .switch28
    204 	mov $person6, %rdi
    205 	mov $textbuf, %rsi
    206 	call strcpy
    207 	jmp .eswitch2
    208 .switch28:
    209 	cmpb $'T', (%r11)
    210 	jne .switch29
    211 	mov $person7, %rdi
    212 	mov $textbuf, %rsi
    213 	call strcpy
    214 	mov $gamestate, %rdi
    215 	orl $1, (%rdi)
    216 	jmp .eswitch2
    217 .switch29:
    218 	cmpb $'C', (%r11)
    219 	jne .switch210
    220 	mov $person8, %rdi
    221 	mov $textbuf, %rsi
    222 	call strcpy
    223 	mov $gamestate, %rdi
    224 	orl $2, (%rdi)
    225 	jmp .eswitch2
    226 .switch210:
    227 	cmpb $'H', (%r11)
    228 	jne .switch211
    229 	mov $person9, %rdi
    230 	mov $textbuf, %rsi
    231 	call strcpy
    232 	mov $gamestate, %rdi
    233 	orl $4, (%rdi)
    234 	jmp .eswitch2
    235 
    236 .switch211:
    237 	cmpb $'D', (%r11)
    238 	jne .eswitch2
    239 	mov $60, %rax
    240 	mov $0, %rdi
    241 	syscall
    242 .eswitch2:
    243 
    244 	movb $'@', (%r11)		 
    245 
    246 	mov $map, %rsi
    247 	call printscreen
    248 
    249 	movb $' ', (%r11)		 
    250 
    251 	call drawtextbuf
    252 
    253 	mov $0x23, %rax			/* sleep for about 32ms, this should result in ~30fps */
    254 	mov $millisec, %rdi
    255 	xor %rsi, %rsi
    256 	syscall
    257 
    258 	call clearscreen		/* refresh the screen */
    259 
    260 	restore
    261 	ret
    262 
    263 moveplayer:
    264 	save
    265 	
    266 	mov $0, %rax
    267 	mov $0, %rdi
    268 	mov $input, %rsi
    269 	mov $1, %rdx
    270 	syscall
    271 
    272 	mov (%rsi), %rax
    273 	mov (up), %rbx
    274 	cmp %rax, %rbx
    275 	jne .switch12
    276 .switch11:
    277 	dec %r9
    278 
    279 	jmp .eswitch1
    280 .switch12:
    281 	mov (down), %rbx
    282 	cmp %rax, %rbx
    283 	jne .switch13
    284 
    285 	inc %r9
    286 
    287 	jmp .eswitch1
    288 .switch13:
    289 	mov (left), %rbx
    290 	cmp %rax, %rbx
    291 	jne .switch14
    292 
    293 	dec %r8
    294 
    295 	jmp .eswitch1
    296 .switch14:
    297 	mov (right), %rbx
    298 	cmp %rax, %rbx
    299 	jne .eswitch1
    300 
    301 	inc %r8
    302 
    303 .eswitch1:
    304 
    305 	movq $0, (input)
    306 
    307 	restore
    308 	ret
    309 
    310 zero:
    311 	save
    312 .loop4:
    313 	mov $0, %rax
    314 	cmp %rsi, %rax
    315 	je .eloop4
    316 	dec %rsi
    317 	movb $0, (%rdi)
    318 	inc %rdi
    319 	jmp .loop4
    320 .eloop4:
    321 	restore
    322 	ret
    323 
    324 strcpy:
    325 	save
    326 	
    327 	push %rdi
    328 	push %rsi
    329 
    330 	mov $textbuf, %rdi
    331 	mov $1024, %rsi
    332 	call zero
    333 
    334 	pop %rsi
    335 	pop %rdi
    336 
    337 	mov $0, %rbx
    338 .loop5:
    339 	xor %rax, %rax
    340 	movb (%rdi), %ah
    341 	cmp %rax, %rbx
    342 	je .eloop5
    343 
    344 	movb %ah, (%rsi)
    345 	inc %rdi
    346 	inc %rsi
    347 
    348 	jmp .loop5
    349 .eloop5:
    350 	restore
    351 	ret
    352 
    353 _start:
    354 	mov $0x48, %rax			/* set stdin to nonblock */
    355 	mov $0, %rdi
    356 	mov $4, %rsi
    357 	mov $2048, %rdx
    358 	syscall
    359 
    360 	mov $505, %r8			/* set player x and y */
    361 	mov $505, %r9
    362 
    363 .loop2:	
    364 	call drawframe
    365 	call moveplayer
    366 
    367 	save
    368 	mov $7, %rax
    369 	movl (gamestate), %ecx
    370 	cmp %rax, %rcx
    371 	je .docsgrave
    372 	
    373 	jmp .loop2
    374 
    375 .end:
    376 	mov $60, %rax
    377 	mov $0, %rdi
    378 	syscall
    379 
    380 .docsgrave:
    381 	mov $500500, %r11
    382 	add $map, %r11
    383 	movb $'D', (%r11)
    384 	jmp .loop2
    385 .data
    386 gamestate: .int 0
    387 textbuf: .fill 1024, 1, 0
    388 outofbounds: .ascii "System:\n\rStop walking through\n\rwalls!\0" 
    389 person1: .ascii "It's no use. We\n\rlost the cure\n\rwhen Doc passed.\0"
    390 person2: .ascii "*sigh* What do you\n\rwant? I don't know\n\ranything. Go find\n\rsomeone else.\0"
    391 person3: .ascii "I don't know  how\n\rwe're going to\n\rmanage without\n\rhim. Maybe if\n\rwe could find\n\rthe formula\0"
    392 person4: .ascii "I think we might\n\rhave buried the\n\rcure? No, that's\n\rnot right...\0"
    393 person5: .ascii "I think we\n\rengraved the\n\rformula for the\n\rcure on Doc's\n\rheadstone. It’s no\n\ruse though. The\n\rstone has long since \n\rfallen and is\n\rimpossible to find\n\rwithout help but\n\rnobody remembers\n\rexactly where it\n\ris.\0"
    394 person6: .ascii "I'm not in the\n\rmood to talk to\n\rstrangers. Go away.\0"
    395 person7: .ascii "We laid Doc to\n\rrest just South\n\rof here. I can't\n\rbelieve we're losing\n\ranother one… \0"
    396 person8: .ascii "I’m pretty sure\n\rhe was buried\n\rto the East. I’m\n\rprobably wrong\n\rthough. It's no\n\ruse.\0"
    397 person9: .ascii "Doc's grave? It's\n\rNorth of here… No\n\rwait West…. No,\n\rboth? I feel like\n\rI’m going crazy.\0"
    398 // person10: .ascii "*cough* Doc? Is that\n\ryou? No, of course\n\rnot.I fear I’m\n\ronly getting worse\n\rfrom the infection.\n\rDoc, we need your\n\rhelp from beyond\n\rthe grave! Please… \n\r*The grave is marked \n\ron the map*\0"
    399 
    400 nl: .byte '\n', '\r'
    401 hash: .byte '#'
    402 clear: .ascii "\033c"
    403 millisec:
    404 	.tv_sec: .quad 0
    405 	.tv_nsec: .quad 32000000 
    406 input: .quad 0
    407 up: .quad 'w'
    408 down: .quad 's'
    409 left: .quad 'a'
    410 right: .quad 'd'