ArmAsm · 17540 bytes Raw Blame History
1 .global _main
2
3 .text
4 .p2align 2
5
6 _main:
7 stp x29, x30, [sp, #-16]!
8 mov x29, sp
9
10 mov x0, #0
11 bl _isatty
12 cbnz x0, .Lhave_tty
13
14 adrp x0, _not_tty_msg@PAGE
15 add x0, x0, _not_tty_msg@PAGEOFF
16 bl _puts
17 mov x0, #1
18 bl _exit
19
20 .Lhave_tty:
21 bl setup_terminal
22 cbz x0, .Lsetup_ok
23
24 adrp x0, _setup_fail_msg@PAGE
25 add x0, x0, _setup_fail_msg@PAGEOFF
26 bl _puts
27 mov x0, #1
28 bl _exit
29
30 .Lsetup_ok:
31 bl init_game
32 bl draw_frame
33
34 .Lgame_loop:
35 movz x0, #61, lsl #12
36 add x0, x0, #144
37 bl _usleep
38
39 bl poll_input
40 adrp x9, _game_state@PAGE
41 add x9, x9, _game_state@PAGEOFF
42 ldr x10, [x9]
43 cbnz x10, .Lfinish
44
45 bl advance_game
46 bl draw_frame
47
48 adrp x9, _game_state@PAGE
49 add x9, x9, _game_state@PAGEOFF
50 ldr x10, [x9]
51 cbz x10, .Lgame_loop
52
53 .Lfinish:
54 adrp x9, _game_state@PAGE
55 add x9, x9, _game_state@PAGEOFF
56 ldr x19, [x9]
57
58 adrp x20, _score_value@PAGE
59 add x20, x20, _score_value@PAGEOFF
60 ldr x21, [x20]
61
62 cmp x19, #2
63 b.eq .Lprint_win
64 cmp x19, #3
65 b.eq .Lprint_quit
66
67 adrp x0, _lose_fmt@PAGE
68 add x0, x0, _lose_fmt@PAGEOFF
69 mov x1, #24
70 mov x2, x21
71 bl write_message_with_score
72 b .Lexit_clean
73
74 .Lprint_win:
75 adrp x0, _win_fmt@PAGE
76 add x0, x0, _win_fmt@PAGEOFF
77 mov x1, #44
78 mov x2, x21
79 bl write_message_with_score
80 b .Lexit_clean
81
82 .Lprint_quit:
83 adrp x0, _quit_fmt@PAGE
84 add x0, x0, _quit_fmt@PAGEOFF
85 mov x1, #19
86 mov x2, x21
87 bl write_message_with_score
88
89 .Lexit_clean:
90 mov x0, #0
91 bl _fflush
92 mov x0, #0
93 bl _exit
94
95 setup_terminal:
96 stp x29, x30, [sp, #-32]!
97 stp x19, x20, [sp, #16]
98 mov x29, sp
99
100 mov x0, #0
101 mov x1, #3
102 mov x2, #0
103 bl _fcntl
104 cmp x0, #0
105 b.lt .Lsetup_fail
106
107 adrp x19, _saved_flags@PAGE
108 add x19, x19, _saved_flags@PAGEOFF
109 str x0, [x19]
110
111 adrp x19, _flags_valid@PAGE
112 add x19, x19, _flags_valid@PAGEOFF
113 mov x0, #1
114 str x0, [x19]
115
116 adrp x19, _original_termios@PAGE
117 add x19, x19, _original_termios@PAGEOFF
118 mov x0, #0
119 mov x1, x19
120 bl _tcgetattr
121 cbnz x0, .Lsetup_fail
122
123 adrp x20, _raw_termios@PAGE
124 add x20, x20, _raw_termios@PAGEOFF
125
126 ldr x0, [x19, #0]
127 str x0, [x20, #0]
128 ldr x0, [x19, #8]
129 str x0, [x20, #8]
130 ldr x0, [x19, #16]
131 str x0, [x20, #16]
132 ldr x0, [x19, #24]
133 str x0, [x20, #24]
134 ldr x0, [x19, #32]
135 str x0, [x20, #32]
136 ldr x0, [x19, #40]
137 str x0, [x20, #40]
138 ldr x0, [x19, #48]
139 str x0, [x20, #48]
140 ldr x0, [x19, #56]
141 str x0, [x20, #56]
142 ldr x0, [x19, #64]
143 str x0, [x20, #64]
144
145 mov x0, x20
146 bl _cfmakeraw
147
148 ldr x0, [x20, #48]
149 movn x1, #0xffff
150 and x0, x0, x1
151 str x0, [x20, #48]
152
153 mov x0, #0
154 mov x1, #0
155 mov x2, x20
156 bl _tcsetattr
157 cbnz x0, .Lsetup_fail
158
159 adrp x19, _terminal_active@PAGE
160 add x19, x19, _terminal_active@PAGEOFF
161 mov x0, #1
162 str x0, [x19]
163
164 adrp x0, restore_terminal@PAGE
165 add x0, x0, restore_terminal@PAGEOFF
166 bl _atexit
167
168 adrp x19, _saved_flags@PAGE
169 add x19, x19, _saved_flags@PAGEOFF
170 ldr x2, [x19]
171 mov x3, #4
172 orr x2, x2, x3
173 mov x0, #0
174 mov x1, #4
175 bl _fcntl
176 cmp x0, #0
177 b.lt .Lsetup_fail
178
179 adrp x0, _clear_hide_seq@PAGE
180 add x0, x0, _clear_hide_seq@PAGEOFF
181 mov x1, #13
182 bl write_stdout
183
184 mov x0, #0
185 b .Lsetup_done
186
187 .Lsetup_fail:
188 mov x0, #1
189
190 .Lsetup_done:
191 ldp x19, x20, [sp, #16]
192 ldp x29, x30, [sp], #32
193 ret
194
195 restore_terminal:
196 stp x29, x30, [sp, #-32]!
197 stp x19, x20, [sp, #16]
198 mov x29, sp
199
200 adrp x19, _terminal_active@PAGE
201 add x19, x19, _terminal_active@PAGEOFF
202 ldr x0, [x19]
203 cbz x0, .Lskip_term_restore
204
205 adrp x20, _original_termios@PAGE
206 add x20, x20, _original_termios@PAGEOFF
207 mov x0, #0
208 mov x1, #0
209 mov x2, x20
210 bl _tcsetattr
211
212 mov x0, #0
213 str x0, [x19]
214
215 .Lskip_term_restore:
216 adrp x19, _flags_valid@PAGE
217 add x19, x19, _flags_valid@PAGEOFF
218 ldr x0, [x19]
219 cbz x0, .Lskip_flag_restore
220
221 adrp x20, _saved_flags@PAGE
222 add x20, x20, _saved_flags@PAGEOFF
223 ldr x2, [x20]
224 mov x0, #0
225 mov x1, #4
226 bl _fcntl
227
228 mov x0, #0
229 str x0, [x19]
230
231 .Lskip_flag_restore:
232 adrp x0, _restore_seq@PAGE
233 add x0, x0, _restore_seq@PAGEOFF
234 mov x1, #11
235 bl write_stdout
236
237 ldp x19, x20, [sp, #16]
238 ldp x29, x30, [sp], #32
239 ret
240
241 write_stdout:
242 stp x29, x30, [sp, #-16]!
243 mov x29, sp
244 mov x2, x1
245 mov x1, x0
246 mov x0, #1
247 bl _write
248 ldp x29, x30, [sp], #16
249 ret
250
251 write_char_stdout:
252 stp x29, x30, [sp, #-32]!
253 mov x29, sp
254
255 str x0, [sp, #16]
256 add x0, sp, #16
257 mov x1, #1
258 bl write_stdout
259
260 ldp x29, x30, [sp], #32
261 ret
262
263 write_u64_stdout:
264 stp x29, x30, [sp, #-208]!
265 stp x19, x20, [sp, #16]
266 stp x21, x22, [sp, #32]
267 mov x29, sp
268
269 mov x19, x0
270 cbnz x19, .Lwrite_u64_loop_setup
271
272 mov x0, #48
273 bl write_char_stdout
274 b .Lwrite_u64_done
275
276 .Lwrite_u64_loop_setup:
277 add x20, sp, #48
278 mov x21, #0
279
280 .Lwrite_u64_div_loop:
281 mov x22, #10
282 udiv x9, x19, x22
283 mul x10, x9, x22
284 sub x10, x19, x10
285 add x10, x10, #48
286 str x10, [x20, x21, lsl #3]
287 mov x19, x9
288 add x21, x21, #1
289 cbnz x19, .Lwrite_u64_div_loop
290
291 .Lwrite_u64_emit_loop:
292 sub x21, x21, #1
293 ldr x0, [x20, x21, lsl #3]
294 bl write_char_stdout
295 cbnz x21, .Lwrite_u64_emit_loop
296
297 .Lwrite_u64_done:
298 ldp x21, x22, [sp, #32]
299 ldp x19, x20, [sp, #16]
300 ldp x29, x30, [sp], #208
301 ret
302
303 write_message_with_score:
304 stp x29, x30, [sp, #-48]!
305 stp x19, x20, [sp, #16]
306 stp x21, x22, [sp, #32]
307 mov x29, sp
308
309 mov x19, x0
310 mov x20, x1
311 mov x21, x2
312
313 adrp x0, _crlf@PAGE
314 add x0, x0, _crlf@PAGEOFF
315 mov x1, #2
316 bl write_stdout
317
318 mov x0, x19
319 mov x1, x20
320 bl write_stdout
321
322 mov x0, x21
323 bl write_u64_stdout
324
325 adrp x0, _crlf@PAGE
326 add x0, x0, _crlf@PAGEOFF
327 mov x1, #2
328 bl write_stdout
329
330 ldp x21, x22, [sp, #32]
331 ldp x19, x20, [sp, #16]
332 ldp x29, x30, [sp], #48
333 ret
334
335 init_game:
336 stp x29, x30, [sp, #-16]!
337 mov x29, sp
338
339 adrp x9, _snake_length@PAGE
340 add x9, x9, _snake_length@PAGEOFF
341 mov x10, #4
342 str x10, [x9]
343
344 adrp x9, _snake_dir_x@PAGE
345 add x9, x9, _snake_dir_x@PAGEOFF
346 mov x10, #1
347 str x10, [x9]
348
349 adrp x9, _snake_dir_y@PAGE
350 add x9, x9, _snake_dir_y@PAGEOFF
351 mov x10, #0
352 str x10, [x9]
353
354 adrp x9, _score_value@PAGE
355 add x9, x9, _score_value@PAGEOFF
356 mov x10, #0
357 str x10, [x9]
358
359 adrp x9, _game_state@PAGE
360 add x9, x9, _game_state@PAGEOFF
361 mov x10, #0
362 str x10, [x9]
363
364 adrp x9, _food_index@PAGE
365 add x9, x9, _food_index@PAGEOFF
366 mov x10, #0
367 str x10, [x9]
368
369 adrp x11, _snake_x@PAGE
370 add x11, x11, _snake_x@PAGEOFF
371 mov x10, #20
372 str x10, [x11, #0]
373 mov x10, #19
374 str x10, [x11, #8]
375 mov x10, #18
376 str x10, [x11, #16]
377 mov x10, #17
378 str x10, [x11, #24]
379
380 adrp x12, _snake_y@PAGE
381 add x12, x12, _snake_y@PAGEOFF
382 mov x10, #8
383 str x10, [x12, #0]
384 str x10, [x12, #8]
385 str x10, [x12, #16]
386 str x10, [x12, #24]
387
388 bl spawn_food
389
390 ldp x29, x30, [sp], #16
391 ret
392
393 spawn_food:
394 stp x29, x30, [sp, #-16]!
395 mov x29, sp
396
397 adrp x9, _food_index@PAGE
398 add x9, x9, _food_index@PAGEOFF
399 ldr x10, [x9]
400 lsl x11, x10, #4
401
402 adrp x12, _food_table@PAGE
403 add x12, x12, _food_table@PAGEOFF
404
405 ldr x13, [x12, x11]
406 add x14, x11, #8
407 ldr x15, [x12, x14]
408
409 adrp x9, _food_x@PAGE
410 add x9, x9, _food_x@PAGEOFF
411 str x13, [x9]
412
413 adrp x9, _food_y@PAGE
414 add x9, x9, _food_y@PAGEOFF
415 str x15, [x9]
416
417 ldp x29, x30, [sp], #16
418 ret
419
420 poll_input:
421 stp x29, x30, [sp, #-32]!
422 stp x19, x20, [sp, #16]
423 mov x29, sp
424
425 adrp x19, _input_byte@PAGE
426 add x19, x19, _input_byte@PAGEOFF
427
428 .Lpoll_loop:
429 mov x0, #0
430 mov x1, x19
431 mov x2, #1
432 bl _read
433 cmp x0, #1
434 b.ne .Lpoll_done
435
436 ldrb w20, [x19]
437
438 cmp x20, #113
439 b.eq .Lset_quit
440 cmp x20, #81
441 b.eq .Lset_quit
442
443 cmp x20, #119
444 b.eq .Lgo_up
445 cmp x20, #87
446 b.eq .Lgo_up
447
448 cmp x20, #115
449 b.eq .Lgo_down
450 cmp x20, #83
451 b.eq .Lgo_down
452
453 cmp x20, #97
454 b.eq .Lgo_left
455 cmp x20, #65
456 b.eq .Lgo_left
457
458 cmp x20, #100
459 b.eq .Lgo_right
460 cmp x20, #68
461 b.eq .Lgo_right
462
463 b .Lpoll_done
464
465 .Lset_quit:
466 adrp x9, _game_state@PAGE
467 add x9, x9, _game_state@PAGEOFF
468 mov x10, #3
469 str x10, [x9]
470 b .Lpoll_done
471
472 .Lgo_up:
473 adrp x9, _snake_dir_y@PAGE
474 add x9, x9, _snake_dir_y@PAGEOFF
475 ldr x10, [x9]
476 cmp x10, #1
477 b.eq .Lpoll_done
478
479 adrp x9, _snake_dir_x@PAGE
480 add x9, x9, _snake_dir_x@PAGEOFF
481 mov x10, #0
482 str x10, [x9]
483
484 adrp x9, _snake_dir_y@PAGE
485 add x9, x9, _snake_dir_y@PAGEOFF
486 mov x10, #-1
487 str x10, [x9]
488 b .Lpoll_done
489
490 .Lgo_down:
491 adrp x9, _snake_dir_y@PAGE
492 add x9, x9, _snake_dir_y@PAGEOFF
493 ldr x10, [x9]
494 mov x11, #-1
495 cmp x10, x11
496 b.eq .Lpoll_done
497
498 adrp x9, _snake_dir_x@PAGE
499 add x9, x9, _snake_dir_x@PAGEOFF
500 mov x10, #0
501 str x10, [x9]
502
503 adrp x9, _snake_dir_y@PAGE
504 add x9, x9, _snake_dir_y@PAGEOFF
505 mov x10, #1
506 str x10, [x9]
507 b .Lpoll_done
508
509 .Lgo_left:
510 adrp x9, _snake_dir_x@PAGE
511 add x9, x9, _snake_dir_x@PAGEOFF
512 ldr x10, [x9]
513 cmp x10, #1
514 b.eq .Lpoll_done
515
516 adrp x9, _snake_dir_x@PAGE
517 add x9, x9, _snake_dir_x@PAGEOFF
518 mov x10, #-1
519 str x10, [x9]
520
521 adrp x9, _snake_dir_y@PAGE
522 add x9, x9, _snake_dir_y@PAGEOFF
523 mov x10, #0
524 str x10, [x9]
525 b .Lpoll_done
526
527 .Lgo_right:
528 adrp x9, _snake_dir_x@PAGE
529 add x9, x9, _snake_dir_x@PAGEOFF
530 ldr x10, [x9]
531 mov x11, #-1
532 cmp x10, x11
533 b.eq .Lpoll_done
534
535 adrp x9, _snake_dir_x@PAGE
536 add x9, x9, _snake_dir_x@PAGEOFF
537 mov x10, #1
538 str x10, [x9]
539
540 adrp x9, _snake_dir_y@PAGE
541 add x9, x9, _snake_dir_y@PAGEOFF
542 mov x10, #0
543 str x10, [x9]
544 b .Lpoll_done
545
546 .Lpoll_done:
547 ldp x19, x20, [sp, #16]
548 ldp x29, x30, [sp], #32
549 ret
550
551 advance_game:
552 stp x29, x30, [sp, #-96]!
553 stp x19, x20, [sp, #16]
554 stp x21, x22, [sp, #32]
555 stp x23, x24, [sp, #48]
556 stp x25, x26, [sp, #64]
557 stp x27, x28, [sp, #80]
558 mov x29, sp
559
560 adrp x19, _snake_x@PAGE
561 add x19, x19, _snake_x@PAGEOFF
562 adrp x20, _snake_y@PAGE
563 add x20, x20, _snake_y@PAGEOFF
564
565 ldr x21, [x19, #0]
566 ldr x22, [x20, #0]
567
568 adrp x9, _snake_dir_x@PAGE
569 add x9, x9, _snake_dir_x@PAGEOFF
570 ldr x23, [x9]
571
572 adrp x9, _snake_dir_y@PAGE
573 add x9, x9, _snake_dir_y@PAGEOFF
574 ldr x24, [x9]
575
576 orr x9, x23, x24
577 cbz x9, .Ladvance_done
578
579 add x25, x21, x23
580 add x26, x22, x24
581
582 cmp x25, #0
583 b.lt .Llose_now
584 cmp x25, #40
585 b.ge .Llose_now
586 cmp x26, #0
587 b.lt .Llose_now
588 cmp x26, #16
589 b.ge .Llose_now
590
591 mov x27, #0
592
593 adrp x9, _food_x@PAGE
594 add x9, x9, _food_x@PAGEOFF
595 ldr x10, [x9]
596 cmp x25, x10
597 b.ne .Lgrowth_checked
598
599 adrp x9, _food_y@PAGE
600 add x9, x9, _food_y@PAGEOFF
601 ldr x10, [x9]
602 cmp x26, x10
603 b.ne .Lgrowth_checked
604
605 mov x27, #1
606
607 .Lgrowth_checked:
608 adrp x9, _snake_length@PAGE
609 add x9, x9, _snake_length@PAGEOFF
610 ldr x21, [x9]
611
612 cbz x27, .Lnormal_shift_setup
613 add x22, x21, #1
614 mov x23, x21
615 b .Lshift_loop_start
616
617 .Lnormal_shift_setup:
618 mov x22, x21
619 sub x23, x21, #1
620
621 .Lshift_loop_start:
622 cmp x23, #1
623 b.lt .Lshift_done
624
625 .Lshift_loop:
626 sub x24, x23, #1
627 ldr x10, [x19, x24, lsl #3]
628 str x10, [x19, x23, lsl #3]
629 ldr x10, [x20, x24, lsl #3]
630 str x10, [x20, x23, lsl #3]
631 sub x23, x23, #1
632 cmp x23, #1
633 b.ge .Lshift_loop
634
635 .Lshift_done:
636 str x25, [x19, #0]
637 str x26, [x20, #0]
638
639 adrp x9, _snake_length@PAGE
640 add x9, x9, _snake_length@PAGEOFF
641 str x22, [x9]
642
643 mov x23, #1
644
645 .Lself_check:
646 cmp x23, x22
647 b.ge .Lafter_self_check
648 ldr x10, [x19, x23, lsl #3]
649 cmp x10, x25
650 b.ne .Lnext_segment
651 ldr x10, [x20, x23, lsl #3]
652 cmp x10, x26
653 b.eq .Llose_now
654
655 .Lnext_segment:
656 add x23, x23, #1
657 b .Lself_check
658
659 .Lafter_self_check:
660 cbz x27, .Ladvance_done
661
662 adrp x9, _score_value@PAGE
663 add x9, x9, _score_value@PAGEOFF
664 ldr x10, [x9]
665 add x10, x10, #1
666 str x10, [x9]
667
668 adrp x9, _food_index@PAGE
669 add x9, x9, _food_index@PAGEOFF
670 ldr x10, [x9]
671 add x10, x10, #1
672 str x10, [x9]
673 cmp x10, #8
674 b.ge .Lwin_now
675
676 bl spawn_food
677 b .Ladvance_done
678
679 .Llose_now:
680 adrp x9, _game_state@PAGE
681 add x9, x9, _game_state@PAGEOFF
682 mov x10, #1
683 str x10, [x9]
684 b .Ladvance_done
685
686 .Lwin_now:
687 adrp x9, _game_state@PAGE
688 add x9, x9, _game_state@PAGEOFF
689 mov x10, #2
690 str x10, [x9]
691
692 .Ladvance_done:
693 ldp x27, x28, [sp, #80]
694 ldp x25, x26, [sp, #64]
695 ldp x23, x24, [sp, #48]
696 ldp x21, x22, [sp, #32]
697 ldp x19, x20, [sp, #16]
698 ldp x29, x30, [sp], #96
699 ret
700
701 draw_frame:
702 stp x29, x30, [sp, #-80]!
703 stp x19, x20, [sp, #16]
704 stp x21, x22, [sp, #32]
705 stp x23, x24, [sp, #48]
706 stp x25, x26, [sp, #64]
707 mov x29, sp
708
709 adrp x0, _home_seq@PAGE
710 add x0, x0, _home_seq@PAGEOFF
711 mov x1, #3
712 bl write_stdout
713
714 adrp x0, _status_fmt@PAGE
715 add x0, x0, _status_fmt@PAGEOFF
716 mov x1, #20
717 bl write_stdout
718
719 adrp x9, _score_value@PAGE
720 add x9, x9, _score_value@PAGEOFF
721 ldr x0, [x9]
722 bl write_u64_stdout
723
724 adrp x0, _status_mid@PAGE
725 add x0, x0, _status_mid@PAGEOFF
726 mov x1, #11
727 bl write_stdout
728
729 adrp x9, _snake_length@PAGE
730 add x9, x9, _snake_length@PAGEOFF
731 ldr x0, [x9]
732 bl write_u64_stdout
733
734 adrp x0, _crlf@PAGE
735 add x0, x0, _crlf@PAGEOFF
736 mov x1, #2
737 bl write_stdout
738
739 adrp x0, _border_line@PAGE
740 add x0, x0, _border_line@PAGEOFF
741 mov x1, #42
742 bl write_stdout
743
744 adrp x0, _crlf@PAGE
745 add x0, x0, _crlf@PAGEOFF
746 mov x1, #2
747 bl write_stdout
748
749 mov x19, #0
750
751 .Lrow_loop:
752 cmp x19, #16
753 b.ge .Lrows_done
754
755 mov x0, #124
756 bl write_char_stdout
757
758 mov x20, #0
759
760 .Lcol_loop:
761 cmp x20, #40
762 b.ge .Lrow_end
763
764 mov x0, x20
765 mov x1, x19
766 bl cell_char
767 bl write_char_stdout
768
769 add x20, x20, #1
770 b .Lcol_loop
771
772 .Lrow_end:
773 mov x0, #124
774 bl write_char_stdout
775
776 adrp x0, _crlf@PAGE
777 add x0, x0, _crlf@PAGEOFF
778 mov x1, #2
779 bl write_stdout
780
781 add x19, x19, #1
782 b .Lrow_loop
783
784 .Lrows_done:
785 adrp x0, _border_line@PAGE
786 add x0, x0, _border_line@PAGEOFF
787 mov x1, #42
788 bl write_stdout
789
790 adrp x0, _crlf@PAGE
791 add x0, x0, _crlf@PAGEOFF
792 mov x1, #2
793 bl write_stdout
794
795 adrp x0, _controls_line@PAGE
796 add x0, x0, _controls_line@PAGEOFF
797 mov x1, #31
798 bl write_stdout
799
800 adrp x0, _crlf@PAGE
801 add x0, x0, _crlf@PAGEOFF
802 mov x1, #2
803 bl write_stdout
804
805 ldp x25, x26, [sp, #64]
806 ldp x23, x24, [sp, #48]
807 ldp x21, x22, [sp, #32]
808 ldp x19, x20, [sp, #16]
809 ldp x29, x30, [sp], #80
810 ret
811
812 cell_char:
813 adrp x9, _food_x@PAGE
814 add x9, x9, _food_x@PAGEOFF
815 ldr x10, [x9]
816 cmp x0, x10
817 b.ne .Lcheck_head
818
819 adrp x9, _food_y@PAGE
820 add x9, x9, _food_y@PAGEOFF
821 ldr x10, [x9]
822 cmp x1, x10
823 b.eq .Lreturn_food
824
825 .Lcheck_head:
826 adrp x9, _snake_x@PAGE
827 add x9, x9, _snake_x@PAGEOFF
828 ldr x10, [x9, #0]
829 cmp x0, x10
830 b.ne .Lcheck_body
831
832 adrp x9, _snake_y@PAGE
833 add x9, x9, _snake_y@PAGEOFF
834 ldr x10, [x9, #0]
835 cmp x1, x10
836 b.eq .Lreturn_head
837
838 .Lcheck_body:
839 adrp x9, _snake_length@PAGE
840 add x9, x9, _snake_length@PAGEOFF
841 ldr x10, [x9]
842 cmp x10, #1
843 b.le .Lreturn_space
844
845 adrp x11, _snake_x@PAGE
846 add x11, x11, _snake_x@PAGEOFF
847 adrp x12, _snake_y@PAGE
848 add x12, x12, _snake_y@PAGEOFF
849 mov x13, #1
850
851 .Lbody_loop:
852 cmp x13, x10
853 b.ge .Lreturn_space
854 ldr x14, [x11, x13, lsl #3]
855 cmp x0, x14
856 b.ne .Lbody_next
857 ldr x14, [x12, x13, lsl #3]
858 cmp x1, x14
859 b.eq .Lreturn_body
860
861 .Lbody_next:
862 add x13, x13, #1
863 b .Lbody_loop
864
865 .Lreturn_food:
866 mov x0, #42
867 ret
868
869 .Lreturn_head:
870 mov x0, #64
871 ret
872
873 .Lreturn_body:
874 mov x0, #111
875 ret
876
877 .Lreturn_space:
878 mov x0, #32
879 ret
880
881 .data
882
883 _status_fmt:
884 .asciz "Live Snake Score: "
885
886 _status_mid:
887 .asciz " Length: "
888
889 _lose_fmt:
890 .asciz "Game over. Final score: "
891
892 _win_fmt:
893 .asciz "You cleared every food pickup. Final score: "
894
895 _quit_fmt:
896 .asciz "Quit. Final score: "
897
898 _border_line:
899 .asciz "+----------------------------------------+"
900
901 _controls_line:
902 .asciz "Controls: W A S D move, q quits"
903
904 _not_tty_msg:
905 .asciz "16_snake_live.s needs a real terminal (TTY)."
906
907 _setup_fail_msg:
908 .asciz "Could not switch the terminal into live mode."
909
910 _clear_hide_seq:
911 .byte 27
912 .ascii "[2J"
913 .byte 27
914 .ascii "[H"
915 .byte 27
916 .ascii "[?25l"
917
918 _home_seq:
919 .byte 27
920 .ascii "[H"
921
922 _restore_seq:
923 .byte 27
924 .ascii "[?25h"
925 .byte 27
926 .ascii "[0m\n"
927
928 _crlf:
929 .byte 13
930 .byte 10
931
932 _food_table:
933 .quad 30, 8
934 .quad 30, 11
935 .quad 12, 11
936 .quad 12, 3
937 .quad 35, 3
938 .quad 35, 13
939 .quad 6, 13
940 .quad 6, 5
941
942 .section __DATA,__bss
943 .p2align 3
944
945 _saved_flags:
946 .space 8
947
948 _flags_valid:
949 .space 8
950
951 _terminal_active:
952 .space 8
953
954 _snake_length:
955 .space 8
956
957 _snake_dir_x:
958 .space 8
959
960 _snake_dir_y:
961 .space 8
962
963 _score_value:
964 .space 8
965
966 _game_state:
967 .space 8
968
969 _food_index:
970 .space 8
971
972 _food_x:
973 .space 8
974
975 _food_y:
976 .space 8
977
978 _input_byte:
979 .space 8
980
981 _original_termios:
982 .space 72
983
984 _raw_termios:
985 .space 72
986
987 _snake_x:
988 .space 512
989
990 _snake_y:
991 .space 512