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'