mirror of
https://github.com/osmarks/random-stuff
synced 2024-12-26 18:10:34 +00:00
127 lines
2.6 KiB
ArmAsm
127 lines
2.6 KiB
ArmAsm
setup:
|
|
mov r1, #0x00FF00 // snake color
|
|
mov r2, #0xFFFFFF // background color
|
|
mov r3, #271 // tail pos
|
|
mov r4, #272 // head pos
|
|
mov r5, #0xFF0000 // apple color
|
|
mov r6, #520 // apple position
|
|
mov r7, #767 // wrap location/size of screen
|
|
mov r8, #snake_body // front of queue - tail location location
|
|
add r9, r8, #1 // back of queue - head location location
|
|
mov r10, #68 // movement direction
|
|
str r3, [r8]
|
|
str r4, [r9]
|
|
initial_draw:
|
|
str r1, [r3+256]
|
|
str r1, [r4+256]
|
|
move:
|
|
str r5, [r6+256] // draw apple
|
|
inp r0, 4
|
|
handle_keypresses:
|
|
cmp r0, #83 // S key
|
|
beq go_down
|
|
cmp r0, #65 // A key
|
|
beq go_left
|
|
cmp r0, #68 // D key
|
|
beq go_right
|
|
cmp r0, #87 // W key
|
|
beq go_up
|
|
mov r0, r10
|
|
b handle_keypresses
|
|
go_right:
|
|
cmp r10, #65 // if was left
|
|
beq reset_key
|
|
mov r10, r0
|
|
add r4, r4, #1
|
|
and r0, r4, #31
|
|
cmp r0, #0 // note; change back if wrong
|
|
beq rwrap
|
|
b draw
|
|
rwrap:
|
|
sub r4, r4, #31
|
|
b draw
|
|
go_left:
|
|
cmp r10, #68 // if was right
|
|
beq reset_key
|
|
mov r10, r0
|
|
sub r4, r4, #1
|
|
and r0, r4, #31
|
|
cmp r0, #31
|
|
beq lwrap
|
|
b draw
|
|
lwrap:
|
|
add r4, r4, #32
|
|
b draw
|
|
go_up:
|
|
cmp r10, #83 // if was down
|
|
beq reset_key
|
|
mov r10, r0
|
|
sub r4, r4, #32
|
|
cmp r4, #0
|
|
blt uwrap
|
|
b draw
|
|
uwrap:
|
|
add r4, r4, #736
|
|
b draw
|
|
go_down:
|
|
cmp r10, #87 // if was up
|
|
beq reset_key
|
|
mov r10, r0
|
|
add r4, r4, #32
|
|
cmp r4, r7
|
|
bgt dwrap
|
|
b draw
|
|
dwrap:
|
|
sub r4, r4, #736
|
|
draw:
|
|
cmp r4, r6 // check if in apple location
|
|
beq create_apple // do not move tail - apple attained
|
|
move_tail:
|
|
ldr r0, [r8]
|
|
str r2, [r0+256] // clear tail
|
|
add r8, r8, #1 // inc tail pointer
|
|
cmp r8, #200
|
|
blt move_head
|
|
mov r8, #snake_body
|
|
move_head:
|
|
add r9, r9, #1 // inc head pointer
|
|
cmp r9, #200
|
|
blt actually_move_head
|
|
mov r9, #snake_body
|
|
actually_move_head:
|
|
str r4, [r9]
|
|
ldr r0, [r4+256] // check if snake is self-intersecting via reading screen memory
|
|
cmp r0, r1
|
|
beq game_over
|
|
cmp r8, r9 // check for win condition - head and tail in same spot means it's very long, so you win
|
|
beq game_win
|
|
str r1, [r4+256] // draw head
|
|
b move // loop infinitely
|
|
create_apple:
|
|
inp r6, 8
|
|
mov r0, #1023 // too big for immediate parameter
|
|
and r6, r6, r0
|
|
cmp r6, r7
|
|
bgt create_apple // loop again if out of range
|
|
cmp r6, r4
|
|
beq create_apple
|
|
b move_head
|
|
reset_key:
|
|
mov r0, r10
|
|
b handle_keypresses
|
|
game_over:
|
|
mov r0, #loss_message
|
|
out r0, 8
|
|
halt
|
|
game_win:
|
|
mov r0, #win_message
|
|
out r0, 8
|
|
halt
|
|
loss_message:
|
|
dat 0x20756f59 // "You "
|
|
dat 0x65736f4c // "Lose"
|
|
dat 0 // ␀
|
|
win_message:
|
|
dat 0x20756f59 // "You"
|
|
dat 0x006e6957 // "Win␀"
|
|
snake_body: dat 0 |